Commit Graph

6602 Commits

Author SHA1 Message Date
Karl Seguin
0971f74a4c fix XMLHttpRequestUpload release 2026-06-05 07:01:01 +08:00
Pierre Tachoire
cb73e43926 couple XMLHttpRequestUpload lifecycle w/ parent's XMLHttpRequest 2026-06-04 18:20:38 +02:00
Pierre Tachoire
691a32ff6e Implement XMLHttpRequest.upload
Return an XMLHttpRequestUpload (inheriting XMLHttpRequestEventTarget) from
the lazily-cached `upload` attribute. Fixes htmx login flows that called
`xhr.upload.addEventListener(...)`.
2026-06-04 11:47:57 +02:00
Karl Seguin
5b6064309e Merge pull request #2632 from lightpanda-io/remove_children
Remove the fancy Children
2026-06-04 14:56:45 +08:00
Karl Seguin
7b25a61b33 Merge pull request #2626 from lightpanda-io/rc_canary
Add canary to RC
2026-06-04 14:55:36 +08:00
Karl Seguin
ccd201a085 Merge pull request #2602 from lightpanda-io/wait_script_cache
Add Script cache to Runner.waitForScript
2026-06-04 13:21:05 +08:00
Karl Seguin
80bf294e1c update v8 dep 2026-06-04 12:49:51 +08:00
Karl Seguin
6a0855bb41 Add Script cache to Runner.waitForScript
This adds script compilation to the Runner.waitForScript loop. The goal here
isn't really to improve waitForScript - we generally expect these scripts to
be very simple. The goal is to introduce script caching so that it could be
used in more important places (e.g. ScriptManager).

Depends on https://github.com/lightpanda-io/zig-v8-fork/pull/181
2026-06-04 12:49:51 +08:00
Karl Seguin
4426b91588 Merge pull request #2630 from rohitsux/feat/node-lookup-prefix
feat(webapi): implement Node.lookupPrefix
2026-06-04 08:26:37 +08:00
Karl Seguin
cfc3fe1443 Merge pull request #2629 from lightpanda-io/cdp-cookie-path
Cookie.PreparedUri: Use only URL.getPathname for target url
2026-06-04 07:01:18 +08:00
Karl Seguin
a13ed53511 Remove the fancy Children
The point of children.Children was to save 8 bytes. But it doesn't. I don't
know if it ever did. It's @sizeOf(Children) is 16 bytes, exactly what
@sizeOf(DoublyLinkedList) is.

Maybe this came from when DoublyLinkedList held the length, in which case it
would have been different.

Either way, storing ?*DoublyLinkedList in Node:
1 - Takes the same amount of memory
2 - Simplifies the code
3 - Removes 1 indirection and 1 extra allocation in the case of having more than
    1 child (compared to how it was before).
2026-06-04 06:53:40 +08:00
Rohit
e830d1da4e feat(webapi): implement Node.lookupPrefix
Implement the Node.lookupPrefix(namespace) method per the WHATWG DOM
"locate a namespace prefix" algorithm: match the element's own
namespace and prefix, then scan its xmlns: attribute declarations for
one whose value is the namespace, then recurse to the parent element.

This is the inverse of the existing lookupNamespaceURI and completes
the namespace-introspection trio alongside isDefaultNamespace.
2026-06-03 21:03:27 +05:30
Pierre Tachoire
a0ecf9cb7c cookies: use an init for Cookie.PreparedUri 2026-06-03 16:48:55 +02:00
Pierre Tachoire
00a91c7dac cdp: fix network.getCookies url build
When getting cookies from CDP, we musn't apply specific cookies's
path/host extraction for the target URL, but use the simple URL rules.
2026-06-03 16:37:03 +02:00
Karl Seguin
720e610542 Merge pull request #2625 from lightpanda-io/deferring_layer_error_handling
DeferringLayer correctly handle header stop/errors
2026-06-03 20:57:36 +08:00
Karl Seguin
1e2e283c0c Add canary to RC
We still occasionally see release overflow errors. I think this is a UAF, since
I cannot find any mismatched acquire/releases. So this adds a canary value to
every RC and includes it in the crash dump.

If the canary value is different than what we set it at, then we have a UAF.
If the canary value is set to the poison we set on release, then we have a
double free.
If the canary value is unchanged, then it's inconclusive.
2026-06-03 18:42:24 +08:00
Karl Seguin
96548fd8e5 Merge pull request #2624 from lightpanda-io/deferring_layer_fixes
Fix two issues with DeferringLayer
2026-06-03 18:41:44 +08:00
Karl Seguin
205865f96c DeferringLayer correctly handle header stop/errors
When forwardHeader signals not to proceed, fire() should stop.

This is the direct fix to https://github.com/lightpanda-io/browser/issues/2622
2026-06-03 18:13:32 +08:00
Karl Seguin
20555150dd Fix two issues with DeferringLayer
The first is that it can outlive the Transfer and thus has to dupe anything
it'll use (e.g. the frame_id off the request).

The second is that flushFrame is reentrant (flushFrame -> fire -> flushFrame)
and that results in the active list and list pointers becoming invalid.
2026-06-03 17:31:40 +08:00
Karl Seguin
85d5e47ffc Merge pull request #2620 from lightpanda-io/better_css_name_parser
Better CSS name selector parser
2026-06-03 15:58:40 +08:00
Karl Seguin
5977242429 Merge pull request #2619 from lightpanda-io/redirect_url_lifetime
On redirect, ensure transfer owns the new url
2026-06-03 15:58:28 +08:00
Karl Seguin
bfad022452 Merge pull request #2618 from lightpanda-io/wait_until_networkalmostidle
Add "networkalmostidle" to --wait-until parameter
2026-06-03 15:58:15 +08:00
Karl Seguin
144e4b1191 Merge pull request #2616 from lightpanda-io/worker_module
Support for "module" type workers.
2026-06-03 15:58:01 +08:00
Karl Seguin
7a54da3c1c Merge pull request #2615 from lightpanda-io/ClientDisconnected_nolog
Don't overlog ClientDisconnected
2026-06-03 15:57:46 +08:00
Karl Seguin
0715bb067c Merge pull request #2614 from lightpanda-io/find_frame_popups
page.findFrame searches popups too
2026-06-03 15:57:29 +08:00
Karl Seguin
3b3ec6c1b0 Merge pull request #2612 from lightpanda-io/intercept_count
Improve / fix InterceptLayer.intercepted count tracking
2026-06-03 15:57:15 +08:00
Karl Seguin
841543bab0 Merge pull request #2613 from rohitsux/feat/html-embed-reflection
feat(webapi): reflect src, type, width and height on HTMLEmbedElement
2026-06-03 14:57:27 +08:00
Karl Seguin
50186cb328 Merge pull request #2617 from lightpanda-io/http_proxy_liftime
HttpClient dupes CDP-supplied proxy to ensure lifetime
2026-06-03 14:41:04 +08:00
Karl Seguin
7bb83ed823 Better CSS name selector parser
Applies the same/similar escaping logic as is already applied to identifiers
and values. Importantly, this allows matching for attribute names with a colon,
e.g. "ng:jq" which can be selected with "ng\:jq".

This fixes real issues with rendering Angular 1.x.
2026-06-03 13:10:34 +08:00
Karl Seguin
97b1dae12a On redirect, ensure transfer owns the new url 2026-06-03 12:05:09 +08:00
Karl Seguin
3ff503bb8b Add "networkalmostidle" to --wait-until parameter
Just config hookup, as the `Frame._notified_network_almost_idle` already exists
(and is used by CDP).
2026-06-03 11:50:48 +08:00
Karl Seguin
244bfbdd27 HttpClient dupes CDP-supplied proxy to ensure lifetime
I'm hoping this is the cause of our flaky CI runs. The existing code kept
a reference to the CDD command-owned proxy address. This commit has HttpClient
dupe/own the proxy to ensure the correct lifetime.
2026-06-03 11:37:52 +08:00
Karl Seguin
2fc9d61070 Support for "module" type workers.
Pretty basic, worker started with the {type: 'module'} option has 2 practical
differences:
1 - importScript isn't allowed (TypeError)
2 - the initial script is loaded as a module

Seen in various WPT tests, but also saw this usage on mastodon.
2026-06-03 11:06:24 +08:00
Karl Seguin
24e379f29a Don't overlog ClientDisconnected
Since the CDP rework, error.ClientDisconnected surfaces to the Runner. There's
no reason to log this (especially as at an error level). It's perfectly normal
and has already been logged at the CDP level.
2026-06-03 10:40:29 +08:00
Karl Seguin
1c70fcb8c5 page.findFrame searches popups too
If you run WPT tests, you'll see a fair number of `FrameNotFound`. This
comes from the cdp frameNavigated notification handler and it happens because
our frame lookup only considers iframes, not popups.

This commit includes popup in the search. I don't expect this to change WPT
results.
2026-06-03 10:10:26 +08:00
Rohit
5487174e2b feat(webapi): reflect src, type, width and height on HTMLEmbedElement
Add the reflected attributes src, type, width and height to
HTMLEmbedElement per HTML 4.8.6
(https://html.spec.whatwg.org/multipage/iframe-embed-object.html#htmlembedelement).
src is a URL-reflecting attribute (resolved against the document base,
mirroring HTMLImageElement.src); type, width and height are plain
DOMString reflections. Mirrors the reflection idiom used by
HTMLMarqueeElement / HTMLImageElement.
2026-06-03 06:12:55 +05:30
Karl Seguin
f7a32c05a8 Improve / fix InterceptLayer.intercepted count tracking
The intercept state is currently split and hard to keep consistent and even
just reason about. InterceptLayer keeps the `intercepted` count, but CDP's
`BrowserContext` has its intercepted lookup. This isn't a problem per se, but
you BrowserContext.deinit tries to decrement `InterceptLayer.intercepted` which
is only safe if we can guarantee that the two are in sync. Which we can't.

This commit simplifies the upkeep of `InterceptLayer.intercepted` and uses the
Transfer's state on unpark/deinit to decrement it. The CDP layer no longer
cares about / has to maintain the count.

Driven by this crash report:

BrowserContext.deinit.intercepted
---
value: 0
/home/runner/work/browser/browser/src/lightpanda.zig:279:25: 0x2871842 in deinit (lightpanda)
/home/runner/work/browser/browser/src/cdp/CDP.zig:127:18: 0x28c3f45 in deinit (lightpanda)
/home/runner/work/browser/browser/src/Server.zig:186:21: 0x2827997 in handleConnection (lightpanda)
/home/runner/work/_temp/6dc322a8-c74f-4990-9660-4cc6dcfb9352/zig-x86_64-linux-0.15.2/lib/std/Thread.zig:509:13: 0x269c233 in entryFn (lightpanda)
???:?:?: 0x7fce7ccabd57 in ??? (libc.so.6)
Unwind information for `libc.so.6:0x7fce7ccabd57` was not available, trace may be incomplete

on 1.0.0-nightly.6542+94ba0791
2026-06-03 08:24:47 +08:00
Karl Seguin
3c06e98008 Merge pull request #2611 from rohitsux/feat/html-param-reflection
feat(webapi): reflect name and value on HTMLParamElement
2026-06-03 07:30:28 +08:00
Karl Seguin
f61b110b1c Merge pull request #2608 from lightpanda-io/curl_debug_allocator
Extract ZigToCurlAllocator into it's own file, only use in debug
2026-06-03 06:27:57 +08:00
Karl Seguin
9d4259f2b9 Merge pull request #2607 from lightpanda-io/max_contexts
Switch env.contexts to ArrayList to support having more
2026-06-03 06:27:40 +08:00
Karl Seguin
f4403c93e5 Merge pull request #2606 from lightpanda-io/better_html_attributes_v2
More HTML attributes
2026-06-03 06:27:21 +08:00
Karl Seguin
744ac6729b Merge pull request #2605 from lightpanda-io/uaf_identity
Fix UAF on FinalizerCallback.Identity memory
2026-06-03 06:26:38 +08:00
Karl Seguin
55b2b11999 Merge pull request #2604 from lightpanda-io/better_html_attributes
Various HTML attribute tweaks
2026-06-03 06:26:15 +08:00
Rohit
8116214a42 feat(webapi): reflect name and value on HTMLParamElement
Add the reflected DOMString attributes name and value to the
existing HTMLParamElement, per HTML 15.3
(https://html.spec.whatwg.org/multipage/obsolete.html#htmlparamelement).
Mirrors the reflection idiom used by HTMLTimeElement / HTMLDataElement.

Advances the html/dom/reflection-obsolete.html WPT row.
2026-06-03 00:49:03 +05:30
Karl Seguin
9ba7dbd9b7 Extract ZigToCurlAllocator into it's own file, only use in debug
Extract ZigToCurlAllocator to its own file and rename it to CurlDebugAllocator
to indicate that it is only used in debug. Also, only use it in debug.

In release mode, this just adds 16 bytes of overhead per allocation that curl
makes. In debug mode, it's the same overhead, but it at least hooks into the
std's DebugAllocator which can detect misuse.
2026-06-02 20:17:30 +08:00
Karl Seguin
2451b41af5 Switch env.contexts to ArrayList to support having more
A lot of WPT tests do something like:

```js
    const frame = document.createElement("iframe");
    t.add_cleanup(() => {
      frame.remove();
    });
    ... run a test
```

But our frame.remove (Element.remove) doesn't destroy the frame/context. It
can't. We don't know what is referencing it. So these WPT tests that create
_thousands_ of these quickly run into TooManyContexts errors.

As a quick solution, we now allow up to 8K contexts to be created when running
WPT tests (`-Dwpt_extensions`). Env.contexts becomes an arraylist rather than
an arary (so avoid having to pay that 8192 * 64 byte penalty for tests that
don't need 8K contexts).

An example of such a test is: /encoding/unsupported-labels.window.html
2026-06-02 19:55:20 +08:00
Karl Seguin
8c8bcac053 More HTML attributes
Stacked on https://github.com/lightpanda-io/browser/pull/2604 and driven by
a different WPT test: /html/dom/reflection-metadata.html

Goes from 1527 to 3074 passing cases. Largely just adding more attributes and
adding validation to attributes where necessary.
2026-06-02 18:43:31 +08:00
Karl Seguin
3d00061287 Fix UAF on FinalizerCallback.Identity memory
From a real case involving a modified version of our bing integration. Our
`releaseRef` (release from v8) destroys the FinalizerCallback.Identity but kept
it in the identities list. `releaseRef` now removes it from the list, so that
when FC.deinit is called, it doesn't try to access the freed identity.
2026-06-02 18:05:37 +08:00
Karl Seguin
e3e3fc25fe Various HTML attribute tweaks
Aimed at improving WPT /html/dom/reflection-obsolete.html Goes from 923 to 2305
passing cases (the remaining failing cases are all for <frame> which we don't
currently support)

Add accessors to Directory, Font and FrameSet. Add HTMLMarqueeElement.

Font setColor null -> ""

Add new properties to Html (accessKey and autofocus) and improve tabIndex
parsing.
2026-06-02 17:33:37 +08:00
Karl Seguin
ccba74bae3 Merge pull request #2600 from lightpanda-io/document_close_during_write
Don't allow document.close during document.write
2026-06-02 15:27:37 +08:00