Commit Graph

8347 Commits

Author SHA1 Message Date
Adrià Arrufat
05b6eaf82c perf(css): cache parsed selectors per frame
querySelector/querySelectorAll/matches/closest re-parsed the selector
string on every call. nodeDetails' SelectorPath fires dozens of these per
element while synthesizing a unique selector (often the same string twice
back-to-back), and page JS that queries in loops paid the same repeated parse.

Add a frame-lifetime cache (frame._selector_cache) keyed by the selector
string. The parsed AST borrows slices of its input, so on a miss the key is
duped into frame.arena and parsed against that owned copy; both share the
frame's lifetime and are bulk-freed on navigation. A 1024-entry cap bounds
growth from SelectorPath's one-off synthetic selectors, falling back to a
per-call arena parse beyond it. StyleManager rule parsing is left untouched
(parsed once per rebuild into its own arena).
2026-06-30 16:14:02 +02:00
Pierre Tachoire
c843025380 Merge pull request #2836 from mvanhorn/fix/2733-fix-getcomputedstyle-resolves-inline-sty
fix: getComputedStyle resolves inline style= declarations
2026-06-30 15:30:40 +02:00
Adrià Arrufat
41cb1bc176 perf(css): skip inline-style allocation for elements without inline styles
The visibility predicate called getInlineStyleProperty -> getOrCreateStyle,
which always allocated a CSSStyleProperties + CSSStyleDeclaration and inserted
into frame._element_styles, even for elements with no style= attribute. Every
semantic-tree / interactiveElements walk checks visibility on every element, so
this was one wasted allocation per element per walk on the agent's hot path.

Only materialize the inline-style object when one already exists (JS-set styles)
or the element actually carries a style= attribute; otherwise return null
without allocating.
2026-06-30 15:29:43 +02:00
Pierre Tachoire
afca6c4fec Merge pull request #2847 from lightpanda-io/test_ignore_http_error_write
minor: ignore test server error when writing internal server error
2026-06-30 15:07:10 +02:00
Pierre Tachoire
fbc0176457 Merge pull request #2844 from lightpanda-io/inline_style_optimization
perf: Skip CSSStyleProperty creation if there is no style attribute
2026-06-30 15:02:46 +02:00
Pierre Tachoire
056cd3261f Update src/browser/webapi/css/CSSStyleDeclaration.zig
Co-authored-by: Adrià Arrufat <1671644+arrufat@users.noreply.github.com>
2026-06-30 15:01:27 +02:00
Karl Seguin
87b93faf91 minor: ignore test server error when writing internal server error 2026-06-30 20:40:36 +08:00
Adrià Arrufat
1dd5f6548d agent: update script instructions for parallel pages
Updates the `script_skill` prompt to recommend and demonstrate parallel
page navigation using `Promise.all` and multiple `Page` instances,
rather than serial navigation on a single page.
2026-06-30 13:27:54 +02:00
Adrià Arrufat
3a01114745 CDP: evict only replaced page nodes on re-goto
Introduce `Registry.resetFrame` to selectively evict nodes owned by
the replaced page's frame. This prevents invalidating node IDs of
sibling pages during concurrent navigations.
2026-06-30 09:39:46 +02:00
Adrià Arrufat
8a2bf904c2 Merge branch 'main' into agent-async-goto-parallel-navigation 2026-06-30 09:29:15 +02:00
Pierre Tachoire
6f453e0949 Merge pull request #2846 from lightpanda-io/ci-read-pkg
ci: add read permission to release for docker
2026-06-30 08:53:45 +02:00
Pierre Tachoire
7aa8bac4ba ci: add read permission to release for docker 2026-06-30 08:31:15 +02:00
Karl Seguin
1f8076b8be Merge pull request #2834 from lightpanda-io/update-v8
Update v8
2026-06-30 13:58:58 +08:00
Karl Seguin
d2f72dfd4b update v8 version 2026-06-30 13:39:13 +08:00
Karl Seguin
98157e18ab update zig-v8-fork dep 2026-06-30 13:36:02 +08:00
Karl Seguin
fc4932508c Merge pull request #2845 from lightpanda-io/slience_test_log
minor: silence log in test that intentionally generates an error
2026-06-30 13:15:05 +08:00
Karl Seguin
459daecbea zig fmt 2026-06-30 13:05:51 +08:00
Karl Seguin
c754c999a4 minor: silence log in test that intentionally generates an error 2026-06-30 13:04:24 +08:00
Karl Seguin
96e23f78e8 perf: Skip CSSStyleProperty creation if there is no style attribute
Was reviewing https://github.com/lightpanda-io/browser/pull/2836 and realized
the StyleManager's getInlineStyleProperty could be optimized  to avoid creating
the CSSStyleProperties in the case where there's no style attribute.
2026-06-30 12:50:50 +08:00
Navid EMAD
66fb6748bf page: flush deferred transfers after a synchronous stylesheet fetch
Frame.loadExternalStylesheet fetches an external <link rel=stylesheet>
synchronously, which registers a blocking request for the frame. While that
blocking request is active the DeferringLayer holds back the completion
callbacks of every other in-flight transfer for the frame, so they don't run
JS on the parser stack. The blocking-<script> path and the worker path flush
those deferred completions once their synchronous fetch returns, but the
external-stylesheet path did not. As a result a <script defer> that finished
loading during the stylesheet's blocking window stayed at complete == false:
the deferred-script queue never drained, so the deferred scripts never ran and
DOMContentLoaded / the load event / readyState -> "complete" never fired —
the document was stuck at readyState "loading" even though every request
completed with HTTP 200.

Flush the frame's deferring layer after the synchronous stylesheet fetch,
mirroring the other two synchronous-request call sites.

Closes #2842
2026-06-29 21:46:35 +02:00
Pierre Tachoire
0614795fc5 css: resolve computed inline styles via StyleManager
getComputedStyle now reads inline values from the element's parsed
el.style through StyleManager.inlineStyleValue instead of re-parsing the
style= attribute, so computed and inline values share one source of
truth. Move the !important cascade precedence to the shared parse path
(applyParsedDeclaration) so el.style resolves duplicate declarations
correctly too.
2026-06-29 14:37:54 +02:00
Karl Seguin
fe3e53c34a Merge pull request #2839 from lightpanda-io/request_interception_redirect
cdp: follow redirects on request interception fulfillment
2026-06-29 16:16:30 +08:00
Karl Seguin
5a65fdbbec Merge pull request #2838 from lightpanda-io/document-cookie
webapi: Fix move cookie accessor from HTMLDocument to Document
2026-06-29 16:16:13 +08:00
Pierre Tachoire
ac0a854830 Merge pull request #2840 from lightpanda-io/ci-release-again
ci: login on GH registry during release
2026-06-29 08:12:08 +00:00
Pierre Tachoire
cf99ec2fbd Merge pull request #2826 from bebsworthy/fix/cdp-frameattached-double-params
cdp: Fix Page.frameAttached params double-wrapping that broke sub-frame interception
2026-06-29 07:50:25 +00:00
Pierre Tachoire
30eb23e0c5 ci: login on GH registry during release 2026-06-29 09:41:58 +02:00
Pierre Tachoire
e396cbb90c ci: login on GH registry during release 2026-06-29 09:38:10 +02:00
Adrià Arrufat
c6e4715032 script-runtime: use ArrayList
Co-authored-by: Karl Seguin <karlseguin@users.noreply.github.com>
2026-06-29 08:05:05 +02:00
Karl Seguin
c40e6c5b94 cdp: follow redirects on request interception fulfillment
Fixes https://github.com/lightpanda-io/browser/issues/2828
2026-06-29 10:48:37 +08:00
Karl Seguin
f2dd10a5ae Merge pull request #2827 from bebsworthy/fix/cross-origin-messageevent-source
webapi: Fix cross-origin MessageEvent.source WindowProxy identity
2026-06-29 08:38:44 +08:00
Karl Seguin
3a3ef67ab0 webapi: Fix move cookie accessor from HTMLDocument to Document
Per spec, this should be accessible on the Document, not the HTMLDocument. I
ran into a site that was doing:

Object.getOwnPropertyDescriptor(Document.prototype, "cookie")

and that was failing
2026-06-29 07:31:19 +08:00
Muki Kiboigo
f75b6f966b add simple 1 day heuristic cache 2026-06-28 14:09:52 -07:00
Karl Seguin
9faf8c1e75 Merge pull request #2832 from lightpanda-io/update_libcurl_and_nghttp2
dep: update libcurl and nghttp2
2026-06-28 16:40:53 +08:00
Matt Van Horn
16b16564d5 css: honor !important for duplicate inline declarations in computed style 2026-06-27 23:30:46 -07:00
Karl Seguin
d9c76d0b0e update zig-v8-fork dep hash 2026-06-28 14:25:13 +08:00
Adrià Arrufat
023c3c25a7 script-runtime: support concurrent page navigations
Changes `page.goto` to return a pending Promise instead of blocking
synchronously. Introduces a driver loop in `Runtime` to tick the
browser and settle pending navigations. This allows parallel gotos
and routes tool calls to their respective frames.
2026-06-28 08:25:03 +02:00
Karl Seguin
8350076972 update intercepted type from u8 to u32 2026-06-28 14:18:12 +08:00
Matt Van Horn
1c044b089b fix: resolve inline style= declarations in getComputedStyle 2026-06-27 23:13:36 -07:00
Karl Seguin
d550a89330 v8, dep: Update v8
This update of zig-v8-fork is an update of v8 itself.
2026-06-28 08:03:02 +08:00
Karl Seguin
01ad869dff Merge pull request #2831 from lightpanda-io/unused_imports
minor: remove unused imports
2026-06-28 07:46:43 +08:00
Karl Seguin
a362a4e461 Merge pull request #2830 from lightpanda-io/xhr_multi_transfer_guard
fix: Reject xhr send() when send already active
2026-06-28 07:46:32 +08:00
Halil Durak
a457ddf8a7 Merge pull request #2703 from lightpanda-io/nikneym/rework-url-resolve
`URL`: Rework `resolve` with new URL implementation
2026-06-27 23:56:47 +03:00
Halil Durak
0373b9ce3d Update src/browser/webapi/Node.zig
Co-authored-by: Karl Seguin <karlseguin@users.noreply.github.com>
2026-06-27 23:56:33 +03:00
Karl Seguin
b054b26e56 dep: update libcurl and nghttp2
Nothing major, but the feature that caught my eye was the addition of a
threadpool for DNS resolution, rather than a thread-per-resolution (1). I've
enabled it.

(1) 39036c9021
2026-06-27 19:06:47 +08:00
Karl Seguin
0aaa77c7e6 minor: remove unused imports 2026-06-27 18:16:31 +08:00
Karl Seguin
fb13ffc373 Merge pull request #2825 from lightpanda-io/replaceWith-DocumentFragment
webapi: replaceWith called with DocumentFragment should append its ch…
2026-06-27 12:08:24 +08:00
Karl Seguin
57b676459d Merge pull request #2824 from lightpanda-io/script_innerHTML
fix: Fix innerHTML parsing based on the target
2026-06-27 12:08:04 +08:00
Karl Seguin
d18cb3ad79 Merge pull request #2823 from lightpanda-io/css_normalize_leading_zero
css: normalize fractions without leading 0
2026-06-27 12:07:50 +08:00
Karl Seguin
f0e82f4d57 Merge pull request #2821 from lightpanda-io/sendBeacon
webapi, fake: Navigator.sendBeacon
2026-06-27 12:07:26 +08:00
Karl Seguin
7a59f24ee1 Merge pull request #2820 from lightpanda-io/select-add
webapi: Add Select.add
2026-06-27 12:06:53 +08:00