Commit Graph

6512 Commits

Author SHA1 Message Date
Karl Seguin
644cea4ea9 An about:blank iframe/popup inherits its parent's base_url 2026-06-01 12:00:31 +08:00
Karl Seguin
b17ff37f8d Merge pull request #2587 from lightpanda-io/websocket_cookies
Websocket cookies
2026-06-01 11:06:19 +08:00
Karl Seguin
14f1ef35f1 URL.isHTTPs -> URL.isSecure and consider wss://
Use conn.setCookie in websocket
2026-06-01 08:35:19 +08:00
Karl Seguin
760ac00580 Merge pull request #2579 from lightpanda-io/custom_element_define_reentrancy
Fix potential segfault in CustomElement definition
2026-05-31 07:28:18 +08:00
Tom Clarke
2ecf9ced5d Send cookies on WebSocket upgrade requests
The WebSocket upgrade handshake is an HTTP/1.1 request (RFC 6455 §4.1)
and follows ordinary cookie semantics — RFC 6265 §5.4 attaches matching
cookies to "any HTTP request" by domain/path. Without this, cookie-
authenticated WebSocket endpoints (anything session-gated, e.g. Phoenix
LiveView) reject the upgrade because their auth cookie never arrives.

Read matching cookies from the session jar with the same opts shape
HTTPDocument uses (`is_http: true, is_navigation: false`), and add a
`Cookie:` request header on the upgrade if any apply.

The TestWSServer captures the upgrade's Cookie header and exposes it
to fixtures via a new `get-cookie` command. A `cookies_on_upgrade`
fixture in websocket.html sets `document.cookie` then asserts the
server received it on the upgrade.
2026-05-30 16:37:05 -04:00
Karl Seguin
490b48ecd0 zig fmt 2026-05-30 20:11:07 +08:00
Karl Seguin
eb5d46bb11 Fix potential segfault in CustomElement definition
Fixes crash in WPT /custom-elements/CustomElementRegistry.html

define has to get `observedAttributes` which itself could call define,
invalidating any GetOrPutEntry pointers. Need to do it as two distinct lookup.
2026-05-30 20:05:44 +08:00
Karl Seguin
b91b3ecd16 Merge pull request #2578 from lightpanda-io/cookie_store_crash_fix
Close session before freeing notification
2026-05-30 10:12:49 +08:00
Karl Seguin
732234c453 Merge pull request #2573 from lightpanda-io/notifiation_webapi
Add Notification WebAPI
2026-05-30 08:47:32 +08:00
Karl Seguin
a40c35ab5f Merge pull request #2574 from lightpanda-io/synthentic_transfer_double_free
Prevent double-free on Synthetic URL
2026-05-30 08:46:51 +08:00
Karl Seguin
a7d3a5968c Merge pull request #2572 from lightpanda-io/cookie_jar_ownership
Cleaner cookie ownership
2026-05-30 08:46:29 +08:00
Karl Seguin
e6332ac121 Close session before freeing notification
With the new CookieStore, the session must be freed before the notification is.
This is how it works in CDP, but in fetch, we were pretty lazy about it. This
caused the notification to be freed first, and then the cookiestore to try to
unregister: UAF.
2026-05-30 08:44:35 +08:00
Karl Seguin
7370eb2c25 Merge pull request #2571 from lightpanda-io/storage-origin-isolation
storage: persist localStorage/sessionStorage across navigations, fix quota
2026-05-29 17:30:34 +08:00
Adrià Arrufat
f3c8595b39 storage: rename allocator to _allocator in Lookup 2026-05-29 11:04:19 +02:00
Adrià Arrufat
fc882c8238 Merge branch 'main' into storage-origin-isolation 2026-05-29 08:02:37 +02:00
Adrià Arrufat
f62f9b42ce storage: store allocator in Lookup 2026-05-29 08:00:15 +02:00
Adrià Arrufat
78312768ce storage: use getOrPut in Shed.getOrPut 2026-05-29 07:55:54 +02:00
Adrià Arrufat
ca9911c641 storage: key bucket by JS Origin key so opaque origins don't collide 2026-05-29 07:51:51 +02:00
Karl Seguin
a0c86df767 Prevent double-free on Synthetic URL
If a synthetic url (blob URL) causes a navigation event, the frame abort will
deinit the transfer, causing the `defer transfer.deinit()` atop Synthetic.run
from firing. Flag the transfer as .completing to prevent this from happening.
This mimics what non-synthetic urls do.
2026-05-29 12:21:52 +08:00
Karl Seguin
23e58b005e Add Notification WebAPI
Adds a pretty simplistic Notification WebAPI. Also adds a dummy drawImage to
CanvasRenderingContext2D.

Trying to improve how we're seen by https://bot.sannysoft.com/
2026-05-29 11:35:32 +08:00
Karl Seguin
87c6d52abc Cleaner cookie ownership
Previously, Cookie.Jar.add would only conditionally take over the cookie. The
caller had no way to know whether or not to deinit it. This could result in
a double-free on certain error paths.

Cookie.Jar.add now unconditionally takes ownership of the cookie.
2026-05-29 09:32:03 +08:00
Karl Seguin
f07eb3e264 Merge pull request #2562 from lightpanda-io/cookie-storage
Implement CookieStore web API
2026-05-29 08:20:50 +08:00
Karl Seguin
75993123b3 Merge pull request #2568 from lightpanda-io/navigate_schemaless_url
Improve navigate to schema-less URL
2026-05-29 08:03:47 +08:00
Karl Seguin
91ef1ff925 Merge pull request #2567 from lightpanda-io/rust_drop_warning
Heed Rust warning and replace copy with ignore
2026-05-29 08:02:49 +08:00
Adrià Arrufat
dab82fa29a storage: persist localStorage/sessionStorage across navigations, fix quota
Move the per-Window storage bucket to an origin-keyed Shed on the Session
so localStorage and sessionStorage survive navigation within an origin,
matching the Web Storage spec.

Also fixes two pre-existing bugs surfaced by this work:
  - setItem's quota counter was incremented on every call, never
    decremented on overwrite — five same-key overwrites tripped the cap
    spuriously. Now subtracts the old value's length first.
  - Shed.getOrPut used allocator.free on a single-pointer allocation
    where allocator.destroy was required, and inserted into _origins
    before its dependent allocations could fail. Reordered so the entry
    is only put once both key dupe and bucket creation have succeeded.

Adds an MCP test that round-trips localStorage between two origins via
the eval tool to lock in the persistence + isolation contract.
2026-05-28 20:32:39 +02:00
Pierre Tachoire
ef3faf8329 use String to return CookieListItem 2026-05-28 18:22:20 +02:00
Pierre Tachoire
b57798e4a3 Merge pull request #2569 from lightpanda-io/e2e-enable-cache
ci: always enable HTTP cache with e2e test
2026-05-28 17:58:55 +02:00
Pierre Tachoire
2c2561da50 avoid string build + parse on CookieStore.setCookie 2026-05-28 17:50:21 +02:00
Pierre Tachoire
4f2a7ba2c8 implement url option for getting cookies from CookieStore 2026-05-28 15:13:31 +02:00
Pierre Tachoire
2a47432c20 fix comments 2026-05-28 14:49:27 +02:00
Pierre Tachoire
8c9d693fd7 set max-age to 0 when cookie is expired in CookieStore 2026-05-28 14:33:30 +02:00
Pierre Tachoire
c7b9f02765 reject invalid cookie into into CookieStore 2026-05-28 14:30:36 +02:00
Pierre Tachoire
d35eaea1aa testing: deinit browser before notifications 2026-05-28 14:17:52 +02:00
Pierre Tachoire
efde428cd4 Notify the deleted cookie on change 2026-05-28 12:37:17 +02:00
Pierre Tachoire
d68f1a48ad ci: always enable cache with e2e test 2026-05-28 11:25:47 +02:00
Karl Seguin
06f279c6be Improve navigate to schema-less URL
I noticed that `fetch www.openmymind.net` worked but, `fetch www.example.com`
didn't. www.openmymind.net redirects to `https://www.openmymind.net/` so
in `frameHeaderDoneCallback` we get the updated response.url(). www.example.com
doesn't redirect, so self.url remains `www.example.com` which just doesn't work
at various parts of the code (Location.init, RobotsLayer...).

Added a quick check in Navigate, if the URL isn't a "complete" URL, stick
"http://" infront. There are probably cases where this is wrong, e.g.
'javascript:...' but these don't work anyways.

(Curl works with www.example.com of course).
2026-05-28 17:16:20 +08:00
Pierre Tachoire
6179c7dde5 replace Frame with Execution into CookieStore 2026-05-28 11:14:52 +02:00
Karl Seguin
0b4ba17236 Heed Rust warning and replace copy with ignore 2026-05-28 16:48:27 +08:00
Karl Seguin
a2b3626495 Merge pull request #2563 from lightpanda-io/message_port_and_doNotTrack
postMessage / MessageEvent now allow / track MessagePost
2026-05-28 16:39:13 +08:00
Karl Seguin
b37e5288d5 Merge pull request #2565 from lightpanda-io/null_function_guard
Guard against null function
2026-05-28 16:38:42 +08:00
Karl Seguin
79afadeb42 Merge pull request #2561 from lightpanda-io/replaceable
Make various Window/Worker accessors settable
2026-05-28 16:37:43 +08:00
Karl Seguin
e40912f4b5 Merge pull request #2559 from lightpanda-io/module_evaluation_stack
In debug, try to capture a module evaluation stack
2026-05-28 16:37:14 +08:00
Karl Seguin
26a701bb32 Merge pull request #2557 from lightpanda-io/node_insert_notification_frame
Use Node's own frame when executing on nodeIsReady
2026-05-28 16:36:43 +08:00
Karl Seguin
3348eb83b2 Merge pull request #2556 from lightpanda-io/declarative_shadow_dom
Add declarative shadow dom (DSD)
2026-05-28 16:36:11 +08:00
Pierre Tachoire
27fe1d46d8 add missing .{ .dom_exception = true } into CookieStore bridge 2026-05-28 10:08:47 +02:00
Pierre Tachoire
ad0e0445a8 avoid extra allocation for 1 value slice in CookieChangeEvent 2026-05-28 10:08:46 +02:00
Pierre Tachoire
3029f8eae2 adjust CookieStore.attachToFrame comment 2026-05-28 10:08:46 +02:00
Pierre Tachoire
9c74fed309 Implement CookieChangeEvent with CookieStore 2026-05-28 10:08:45 +02:00
Pierre Tachoire
06cc808728 first draft for CookieStore API implementation 2026-05-28 10:08:41 +02:00
Pierre Tachoire
4280e28975 Merge pull request #2564 from lightpanda-io/execution_ux_improvement
This is a very small / mechanical change.
2026-05-28 10:08:24 +02:00