Commit Graph
7912 Commits
Author SHA1 Message Date
Karl Seguin 1151eaebf3 mem: SemanticTree and AXNode recursive walk -> iterative
Following https://github.com/lightpanda-io/browser/pull/3573 and
https://github.com/lightpanda-io/browser/pull/3602 this makes the two recursive
walks iterative, preventing a SO on deep trees.
2026-09-24 07:24:15 +08:00
Karl Seguin 578acc9040 Merge pull request #3587 from lightpanda-io/nikneym/polymer-changes
Changes for `<template>` content
2026-09-24 06:24:14 +08:00
Karl Seguin 6debc4dd71 Merge pull request #3608 from lightpanda-io/webdriver-input
WebDriver: add input (click, clear and sendKeys)
2026-09-24 06:17:35 +08:00
Karl Seguin 5112323b58 Merge pull request #3615 from lightpanda-io/reduce-v8-background-execution-delay
perf: reduce delay in running v8 background jobs
2026-09-24 06:12:41 +08:00
Karl Seguin 2b2bb317dd Merge pull request #3611 from lightpanda-io/inert
webapi: add support for the inert property
2026-09-24 06:12:02 +08:00
Karl Seguin 5cbaf2acb4 Merge pull request #3609 from lightpanda-io/xml-declaration-validation
xml: validate xml declaration
2026-09-24 06:11:44 +08:00
Halil Durak 7690a33c7c update tests 2026-09-23 17:04:16 +03:00
Halil Durak 9454b7d23e CustomElementRegistry: move frame check to upgrade 2026-09-23 17:04:15 +03:00
Halil Durak d4d5fc38eb update tests 2026-09-23 17:04:15 +03:00
Halil Durak 7a4d2fec71 changes for <template> content
Template content belongs to an inert "template contents owner document" with no browsing context, related changes for #3328.
2026-09-23 17:04:15 +03:00
Karl Seguin 1dd33ee7ec Merge pull request #3604 from lightpanda-io/sanitizer
webapi: Start of Sanitizer WebAPI
2026-09-23 21:23:20 +08:00
Karl Seguin d157157721 perf: reduce delay in running v8 background jobs
In Runner, when we're `in_cdp` we reduce the HttpClient poll time to 10ms when
a v8 tells us it has a background task. This is to help ensure we don't linger
too long in HttpClient's poll when v8 has work.

But, 10ms can still be long, especially in a WPT test that's running thousands
of WASM compilation in serial. So rather than having a flat 10ms wait, Runner
will now wait 0-10ms, based on (a) whether the last pump had any tasks and (b)
the number of _ticks since there was task.

This is potentially a temporary solution to having v8 wake the HttpClient when
a task is ready.
2026-09-23 20:02:47 +08:00
Karl Seguin d070a0d34e Merge pull request #3605 from lightpanda-io/x-frame-options
http: add support for x-frame-options
2026-09-23 19:04:08 +08:00
Karl Seguin d5ba648b7e webapi: add support for the inert property
Improves the /inert/ WPT category
2026-09-23 18:21:31 +08:00
Karl Seguin 79376d00fa xml: validate xml declaration
And now, because we do this, we no longer have to have the parser skip anything
that looks like a ProcessingInstruction.
2026-09-23 17:34:10 +08:00
Karl Seguin 1bc6bcc3d1 dedupe close path 2026-09-23 17:08:03 +08:00
Scott Taylor 1296861350 cdp: notify target closure when disposing browser contexts 2026-09-23 16:33:17 +08:00
Karl Seguin 369059e48d WebDriver: add input (click, clear and sendKeys) 2026-09-23 16:19:35 +08:00
Karl Seguin 414167bfcd Merge pull request #3602 from lightpanda-io/iterative-rendertree
mem: make markdown/screenshot iterative
2026-09-23 15:15:37 +08:00
Karl Seguin 80640f7204 http: add support for x-frame-options
Brings /x-frame-options/ from 43/157 to  157/157.
2026-09-23 12:54:19 +08:00
Karl Seguin 628248a51c webapi: Start of Sanitizer WebAPI
This is the configuration-half of the Sanitizer API. In a follow up, we'll add
the missing element.setHtml and sanitizer option to the existing setHTMLUnsafe
(as well as the ShadowRoot and Document sanitizer-aware methods).
2026-09-23 12:38:43 +08:00
Karl Seguin 31198445dd Merge pull request #3598 from cdebled/cdp-blank-lifecycle
cdp: report the initial about:blank as loaded to lifecycle events
2026-09-23 11:56:18 +08:00
Karl Seguin 36f2a6cb96 more rebase + regenerate 2026-09-23 11:20:42 +08:00
Karl Seguin 71cc6f93e5 fix robots log message length 2026-09-23 11:20:42 +08:00
Adrià Arrufat 728f61a80d log: check the message rules at comptime
logToErased asserts that a log message is at most 30 characters of
plain text, but only in a debug build and only once the line actually
runs. A message on a rare path therefore ships fine and then panics on
whoever first reaches it: `serve --host 0.0.0.0` without
--advertise-host crashed on startup in every debug build, because
"advertising loopback for wildcard bind" is 38 characters.

Every message is a literal, so make the six wrappers take a comptime
msg and apply the same two rules through @compileError. The runtime
check stays as the backstop for the paths the compiler does not
analyse for the current target, and now reads the same constant.

Eleven messages were over the limit; shorten them. The detail already
lives in the kv pairs in each case. renderFailed takes its message as
comptime now, the only call site that passed a runtime one.

Note the check only covers code analysed for the target being built:
the two in Certificates.zig sit in an OS switch prong that Linux never
compiles, and were found by scanning the source rather than by the
compiler.
2026-09-23 11:20:42 +08:00
Karl Seguin 11e1505cd7 Merge pull request #3547 from lightpanda-io/navigation-reload
`Navigation.reload`
2026-09-23 08:02:29 +08:00
Karl Seguin 4a7590691d Merge pull request #3546 from lightpanda-io/robots-limit-entries
Robot Limit Entries
2026-09-23 07:31:30 +08:00
Karl Seguin e1aec431d4 Merge pull request #3588 from lightpanda-io/scroll-clamp-chain
Clamp scroll offsets, and latch a wheel to one scroll container
2026-09-23 06:47:17 +08:00
Karl Seguin 074965c046 mem: make markdown/screenshot iterative
Follow up to https://github.com/lightpanda-io/browser/pull/3573. Both markdown
and scerenshot stackoverflow sooner than dump due to their larger stack frames.
2026-09-23 06:41:15 +08:00
Karl Seguin e27270cde3 Merge pull request #3594 from lightpanda-io/webdriver-execute
webdriver: execute
2026-09-23 06:05:57 +08:00
Muki Kiboigo 8682cca571 remove inaccurate Robots comment 2026-09-22 12:55:27 -07:00
Muki Kiboigo be60d51990 add caching option for settle in RobotsGate 2026-09-22 12:55:27 -07:00
Muki Kiboigo d16091a403 0 for robot entry limit means no limit 2026-09-22 12:55:26 -07:00
Muki Kiboigo 7335c752ba pass errors up to Caller in navigation event dispatch 2026-09-22 12:49:42 -07:00
Celine Debled 431e41f865 cdp: report the initial about:blank as loaded to lifecycle events 2026-09-22 16:47:47 +02:00
Adrià Arrufat 93c551bed6 css: share the axis shorthand table with the CSSOM
The cascade expanded overscroll-behavior into longhands but
CSSStyleDeclaration didn't, so setting the shorthand left
overscrollBehaviorX reading empty and a style= block round-tripped
through the object lost it.

CssParser.axis_shorthands is now the one list, with axisShorthand and
axisLonghand as the lookups both sides use: the CSSOM's overflow-only
special cases (set, apply, remove, priority, serialize) became that
lookup, and OverflowPair became AxisPair. Verified against Chrome 153:
`overscroll-behavior: contain auto` reads back per axis, collapses to
`contain` when both match, and serializes as one declaration.
2026-09-22 16:39:13 +02:00
Adrià Arrufat fdee7d558c scroll: write first, then report whether it moved
writeScroll held the map entry across the clamp, which reads styles and
walks children, and it created an entry even for a write that changed
nothing. It now clamps both axes against a plain lookup and only takes
the entry when an offset actually moves.

That makes the write itself the answer to "can this container move?", so
the wheel walk asks by writing instead of recomputing the extent first,
and canScrollAxis is gone.
2026-09-22 16:39:13 +02:00
Karl Seguin d873e1bd7b Merge pull request #3595 from cdebled/cdp-reply-session-id
cdp: echo the sessionId in replies to browser-level commands
2026-09-22 20:11:07 +08:00
Celine Debled ce5f6195db cdp: test that replies echo the sessionId 2026-09-22 12:28:37 +02:00
Celine Debled c98afa4beb cdp: echo the sessionId in replies to browser-level commands 2026-09-22 12:28:37 +02:00
Karl Seguin bbd99f47e8 webdriver: execute
Adds the ability to execute JavaScript via WebDriver. The other webdriver
endpoints were able to re-use the existing BiDi code (e.g. navigating via
webdriver or bidi quickly ends up in the same function). But for execute, it's
completely different, from input parameters, to running the code, to the result
that's returned. So there's a dedicated handler for this: `execute.zig`. But
the rest of the infrastructure (the http waiting for a reply, the routing, the
parameter parsing, ... are all the same).
2026-09-22 16:31:52 +08:00
Karl Seguin b84e5b7397 Merge pull request #3591 from lightpanda-io/dont-reuse-bad-connections
http: dont' re-use connections which are likely in a bad state.
2026-09-22 15:43:30 +08:00
Karl Seguin 239a7937e0 Merge pull request #3592 from lightpanda-io/element-focus
webapi: element.focus() only on focusable elements
2026-09-22 15:04:28 +08:00
Karl Seguin 92c48a68a7 Merge pull request #3534 from lightpanda-io/wasm-streaming
Implement WebAssembly.compileStreaming and instantiateStreaming
2026-09-22 14:19:52 +08:00
Adrià Arrufat 6209893a5b wasm: don't re-enter V8 when an exception is already pending
TryCatchRethrow, JsException and ExecutionTerminated all mean V8 already
has something pending: creating an error value and aborting the stream
would replace the exception the script is meant to see, or hand a killed
script a catchable Error. Drop the streaming handle instead, matching the
early exit in Caller.handleError.
2026-09-22 07:53:44 +02:00
Karl Seguin 0ffca7fa0a webapi: element.focus() only on focusable elements
Element.focus() would "focus" the element even when it shouldn't. We already
have the logic to determine if an element is focusable in `user_input.zig`, so
this was moved to Element and is now used in el.focus().
2026-09-22 11:25:52 +08:00
Karl Seguin 0b66a5ed05 http: dont' re-use connections which are likely in a bad state.
Some status-codes should never have a body except for a single trailing blank
line. If we don't handle these, then we end up with a dirty connection in our
connection pool:

1 - read the header, but not the body
2 - put the connection back in the pool
3 - try to read the header, but actually get the body from #1

WPT /fetch/api/basic/response-null-body.any.html exercises this path and is
flaky (because it depends whether the request goes back out on a keep-alive
connection)..but for a given run,you'll almost always get 1-3 failures.

This commit processes the request, but tells libcurl not to re-use the
connection.
2026-09-22 10:08:41 +08:00
Karl Seguin e96c31f157 Merge pull request #3572 from lightpanda-io/nikneym/cdp-isolated-world-origin
`cdp`: move a kept isolated-world context onto the navigated origin
2026-09-22 07:47:46 +08:00
Karl Seguin 709567e2d8 Merge pull request #3585 from lightpanda-io/webdriver-element
webdriver: add element endpoints
2026-09-22 07:47:06 +08:00
Adrià Arrufat 689045d72a user_input: latch a wheel to one scroll container
wheelScroll handed the whole delta to the nearest scroll container on
each axis, whatever state it was in, so a saturated inner scroller
trapped the wheel and the page never moved.

scrollAxis walks outward per axis and gives the whole delta to the first
container that can still move along it. A delta is never split: a
container that can only take part of it keeps the rest, and the page
moves on the next wheel. That is Chrome's rule in FindNodeToLatch
(cc/input/input_handler.cc), confirmed against Chrome 153 - one wheel of
1000px over a container with 416px of travel leaves window.scrollY at 0.

A container whose overscroll-behavior doesn't propagate takes the latch
even when it can't move, which ends the walk.
2026-09-21 17:37:26 +02:00