Commit Graph
9492 Commits
Author SHA1 Message Date
Adrià Arrufat 1541b3357c Merge branch 'main' into wasm-streaming
# Conflicts:
#	build.zig.zon
2026-09-16 09:22:34 +02:00
Karl Seguin d52957b2e2 Merge pull request #3533 from staylor/fix/fatal-signal-backtrace
Record Linux fatal signals without blocking on stderr
2026-09-16 13:59:29 +08:00
Karl Seguin b3b663ce43 fix ci 2026-09-16 13:10:52 +08:00
katie-lpd ec0c69a1ad Merge pull request #3537 from lightpanda-io/katie-lpd-patch-1
Update README.md
2026-09-16 06:47:33 +02:00
katie-lpd 6d5afb0c51 Update README.md 2026-09-16 06:47:08 +02:00
katie-lpd b492ffb684 Update README.md 2026-09-16 06:46:40 +02:00
Karl Seguin 7b7c7d7b0b Expand to destination to all stderr destination
Attempt to add backtrace information

If there's no PATH, look for curl in known locations. (this is unrelated, but
there's overlap with this work and the special `segv-crash-report` that we're
using in debugging, and i wanted to bring this specific part over).
2026-09-16 11:47:40 +08:00
Karl Seguin f141b458cd Merge pull request #3521 from lightpanda-io/js-value-serialization
internal: simplify v8.Value serialization
2026-09-16 11:35:52 +08:00
Karl Seguin 3eb1fcbc12 update v8 dep 2026-09-16 10:12:27 +08:00
Karl Seguin ea0443cec9 internal: simplify v8.Value serialization
Requires: https://github.com/lightpanda-io/zig-v8-fork/pull/207

Inspired by https://github.com/lightpanda-io/browser/pull/3504 this simplifies
v8::Value serialization (e.g. as used in console.log(...)).

1 - It doesn't executes JS and thus can't have a side effect, which is otherwise
    possible if we invoke a getter or through a proxy

2 - It removes the debugValue debug-only path

(2) is potentially a loss in debug builds, but I think the usefulness of that
was always, at best. The upside is code elimination and consistency in how
values are reported in debug/release
2026-09-16 10:12:27 +08:00
Karl Seguin 9cc702f4a4 Merge pull request #3535 from lightpanda-io/orderfile-regen
orderfile: regenerate the hot-code profile
2026-09-16 09:19:01 +08:00
Karl Seguin 6d87fbf0e9 Merge pull request #3526 from staylor/investigate/localization-400
Drop body headers when redirects switch to GET
2026-09-16 09:06:40 +08:00
github-actions[bot] 38a6fdca39 orderfile: regenerate the hot-code profile
hot set 14900KB resident at 4KB fault-around: 21224 text, 21827 rodata symbols
2026-09-16 01:04:53 +00:00
Karl Seguin 3864c1be3e Merge pull request #3518 from staylor/investigate/drops-watchdog-stall
Avoid spurious mutations for unchanged CSS declarations
2026-09-16 08:13:43 +08:00
Scott Taylor 45eb267f5c cssom: only sync the style attribute when a declaration changes
setProperty, removeProperty and cssFloat rewrote the style attribute
unconditionally, so assigning a property its current value, or removing
one that was never set, produced an attribute mutation record. Chromium
emits none in those cases.

A storefront extension reacts to attribute mutations by rerendering and
reapplying styles. These spurious records keep that cycle running until
the watchdog terminates the page.

Compare the normalized value and priority before rewriting, and treat
removing an absent property as a no-op. Explicit cssText and
setAttribute assignments still notify.

Test mutation counts, priority-only changes, raw attribute preservation,
observer convergence, and healthy batches exceeding 1600 callbacks.
2026-09-16 07:02:54 +08:00
Karl Seguin 7571d6e7a0 Merge pull request #3527 from lightpanda-io/nikneym/stdin-js-exec
`Agent`: add `lightpanda run -`
2026-09-16 06:40:41 +08:00
Karl Seguin f5c1772edb Merge pull request #3516 from lightpanda-io/readonly-computedStyles
webapi: computedStyle are now readonly
2026-09-16 06:38:49 +08:00
Karl Seguin 7910646185 Merge pull request #3532 from lightpanda-io/help-drift
Help drift
2026-09-16 06:38:29 +08:00
Adrià Arrufat ab8e9622e2 Implement WebAssembly.compileStreaming and instantiateStreaming
V8 installs the two functions only when the isolate has a
WasmStreamingCallback, and installs them at context genesis, so the
callback is registered on the snapshot isolate as well as the runtime
one. Pages loading wasm through fetch() previously failed on a missing
function (https://www.nicbarker.com/clay, https://arrufat.github.io/zignal/).

WasmStreaming.zig is the embedder half: it resolves the
Response | Promise<Response> argument, checks the application/wasm
MIME essence, the status and the body usability, sets the source URL,
drains the body through Response.bytes and feeds V8. Failures abort the
stream with a TypeError, or with the source promise's own rejection.
In-flight streams are tracked on the Context and cancelled on teardown.

Depends on lightpanda-io/zig-v8-fork#208 for the v8__WasmStreaming__*
bindings.
2026-09-15 23:38:00 +02:00
Scott Taylor 02a0a33498 Record Linux fatal signals without blocking on stderr
ReleaseFast faults otherwise leave only an exit status. Record the signal,
original fault registers and build identity without entering panic reporting,
the IO backend, an allocator-backed unwinder or telemetry.

For pipe stderr, prepare an independent nonblocking procfs descriptor before
threads start; never change the inherited descriptor's shared flags. For
sockets, use per-call nonblocking send flags. Drop output for unsupported
sinks or backpressure, then re-raise the original signal. Other platforms
retain their existing signal handling.

Core limits still apply, but cores capture the re-raise context rather than
the original fault; document that distinction. Subprocess tests cover full
pipes and sockets with undrained readers, unavailable/read-only/file stderr,
unchanged flags, repeated attachment, held panic locks and hardware faults.
2026-09-15 15:30:11 -04:00
Adrià Arrufat c8873a951c Merge pull request #3528 from lightpanda-io/ci-dispatch-python-release
ci: dispatch the lightpanda-python wheels build instead of creating a release
2026-09-15 21:26:05 +02:00
Pierre Tachoire 9bf65fac5a add missing LLM providers in help 2026-09-15 18:34:24 +02:00
Pierre Tachoire c1ddf920ec document --dump pdf in help 2026-09-15 18:13:33 +02:00
Pierre Tachoire 580658676e remove the removed --storage-* from help 2026-09-15 18:11:30 +02:00
Adrià Arrufat ab7c471b68 ci: dispatch the lightpanda-python wheels build instead of creating a release
Creating the matching release on lightpanda-python fails with HTTP 403:
the distribution app's token can start workflows there but cannot write
repository contents, and granting contents:write would widen the app on
every repo it is installed on. Dispatch that repo's wheels workflow
instead — the same permission the homebrew and docker jobs use — and let
it record its own release after the PyPI publish is approved.
2026-09-15 16:22:41 +02:00
Halil Durak acc84da4d9 update README 2026-09-15 16:21:19 +03:00
Halil Durak 901e5eaf4d Agent: add lightpanda run -
Arbitrary JS code can be passed directly through stdin thanks to this.
2026-09-15 16:21:01 +03:00
Pierre Tachoire 614c1640af Merge pull request #3524 from lightpanda-io/orderfile-ci
ci: regenerate the orderfile nightly and open a PR
0.4.1
2026-09-15 14:51:17 +02:00
Pierre Tachoire 4bef9e95d2 Merge pull request #3525 from lightpanda-io/orderfile-regen
orderfile: regenerate the hot-code profile
2026-09-15 14:28:52 +02:00
Pierre Tachoire ac84bdf764 ci: revert orderfil generation on release 2026-09-15 14:25:28 +02:00
github-actions[bot] 4569fa6e59 orderfile: regenerate the hot-code profile
hot set 14876KB resident at 4KB fault-around: 21417 text, 21799 rodata symbols
2026-09-15 14:21:44 +02:00
Pierre Tachoire 2a17635332 ci: allow orderfile to push on branch 2026-09-15 14:15:46 +02:00
Pierre Tachoire f9ef67d283 ci: Use GH app to publish PR 2026-09-15 14:15:45 +02:00
Pierre Tachoire 8fc4598ff9 ci: generate orderfile before release 2026-09-15 14:15:45 +02:00
Pierre Tachoire 4b1f22ba23 ci: regenerate the orderfile nightly and open a PR 2026-09-15 14:15:45 +02:00
Scott Taylor 8339361043 http: drop request-body headers when redirects rewrite the method
A multipart form POST followed by a 302 changed to GET and lost its body,
but retained Content-Type: multipart/form-data. Servers could then try to
parse an absent multipart body and return 400. This was reproduced on a
local redirect server and a storefront localization flow.

Delete Fetch's request-body header names when rewriting to GET. Preserve
method and body on 307/308, rewrite only POST on 301/302, and preserve GET
and HEAD on 303 rather than rewriting every request indiscriminately.

Test method/header transitions and header handling through the existing
CDP fulfilled-redirect path.
2026-09-15 07:48:18 -04:00
Karl Seguin 5f73e07cd6 Merge pull request #3520 from lightpanda-io/page-lookups
webapi: better frame integrity
2026-09-15 17:21:43 +08:00
Karl Seguin 143c395a28 Merge pull request #3519 from staylor/fix/custom-element-clone-identity
Upgrade autonomous custom-element clones in place
2026-09-15 14:13:27 +08:00
Karl Seguin ad7f644e5b Merge pull request #3517 from staylor/investigate/yj-close-timeout
Snapshot child lists during deep cloning
2026-09-15 14:13:17 +08:00
Karl Seguin 1163096946 handle constructor that disconnect itself 2026-09-15 13:43:16 +08:00
Karl Seguin 48dc72cd49 webapi: better frame integrity
Follow up to  https://github.com/lightpanda-io/browser/pull/3510

Moves the element/node lookups, e.g. `element_class_lists` from Frame to Page.
Elements and nodes can outlive a Frame (it's the reason the identity map lives
on the Page, not the frame). These maps are merely properties on Node/Elements
optimized for a specific usage-pattern (i.e. most Node/Elements don't have these
or they are never materialized from JS). So if a Node/Element can outlive the
Frame, than so too can all of their properties. And, even when an frame is alive
the properties belong to the *Node* or *Element*, NOT the Frame...accessing
those properties across frames should yield the same value / identity.

More mechanically, frame._page => frame.page and all of these lookups lose their
_ prefix. Short summary of _ prefix is:

1 - It's used to deal with Zig not allowing shadowing. This is particularly true
    in the WebApis were it happens a bit more often

2 - Early prototype was built as a stand-alone library, and the _ was used to
    signal "private" (again, working around Zig). Frame.page shouldn't be
    "private" and neither should these lookups (if we aren't going to provide
    getter/setters for them).
2026-09-15 11:26:04 +08:00
Scott Taylor c0ae2ea137 dom: upgrade autonomous custom-element clones in place
Cloning reused the synchronous createElement construction path, which
rejects a result with a parent, attributes, or children. A reparenting
constructor left its instance in the source tree while the clone received
an HTMLUnknownElement fallback with different identity.

Queue an upgrade reaction for autonomous clones instead. Their copied
attributes and descendants are present when construction runs, and super()
returns the copied node. A failed upgrade retains that node rather than
substituting a second element. Keep synchronous createElement validation.

Capture initial upgrade reactions before construction and distinguish the
precustomized state so constructor-time DOM mutations do not enqueue
custom-element lifecycle reactions prematurely.

Add Chromium-checked regressions for identity, reparenting, copied state,
attribute reaction order, importNode and failed upgrades.
2026-09-14 22:30:25 -04:00
Scott Taylor 5ab9f69b44 dom: clone a snapshot of children, not the live list
A custom element constructor can append itself to the source parent
while that parent's children are being cloned. With two trailing
self-appending elements, the live iterator reaches those new instances
and keeps cloning indefinitely, until the watchdog terminates execution.

Snapshot each child list before traversing it. Apply the same handling
to element, shadow root, fragment and document clone paths, retaining
the document path's existing appendChild behavior.

Add a bounded two-sibling regression so a broken traversal fails
without hanging the test process.
2026-09-14 22:13:56 -04:00
Karl Seguin ee015da56c webapi: computedStyle are now readonly
getComputedStyle returns a CSSStyleDeclaration that should be readonly. We now
return a NoModificationAllowed on write.

Fixes exactly 1 WPT case =)
2026-09-15 09:56:25 +08:00
Karl Seguin baf45f03e9 Merge pull request #3515 from lightpanda-io/scroll-tool-container
Scroll the nearest scroll container from the scroll tool
2026-09-15 08:58:15 +08:00
Karl Seguin 8bc4cf6877 Merge pull request #3514 from lightpanda-io/loopback-secure-cookies
cookies: accept Secure and __Host- cookies on loopback origins
2026-09-15 07:54:53 +08:00
Pierre Tachoire b3c327970f Merge pull request #3335 from lightpanda-io/nikneym/lax-exception-RFC6265bis
Apply `SameSite=Lax` exception only on safe methods
2026-09-14 18:09:01 +02:00
Adrià Arrufat 1e67c6fc91 Scroll the nearest scroll container from the scroll tool
The scroll tool (MCP, agent, LP.scrollNode) wrote scrollTop on the exact
node it was given, so a leaf inside an overflow:auto panel stored an
offset on a non-scroller, the panel's own scroll listener never ran, and
the tool reported the requested coordinates as if it had worked. It also
fired a synchronous bubbling scroll on top of the async non-bubbling
scroll/scrollend the setters already schedule.

actions.scroll now resolves the nearest ancestor-or-self scroll
container, falls back to the node itself, and returns the node that
moved plus the read-back position. The tool and LP.scrollNode report
that instead of the request.

The container query moves from user_input.zig onto Element as
scrollContainer(axes), so the wheel path, the tool and WebDriver share
one resolver. WebDriver's wheel scrolled the hit-test element directly
and fired its own bubbling scroll; it now goes through
user_input.wheelScroll like CDP and BiDi wheel.

Window and Element share one ScrollToOpts. Its offsets() helper
normalizes the positional and dictionary forms once, and an omitted axis
in the dictionary form leaves that axis untouched for the window too,
matching browsers, so scrolling the window on one axis no longer resets
the other.
2026-09-14 17:48:25 +02:00
Adrià Arrufat 7f451a5c34 Merge pull request #3513 from lightpanda-io/docker-orderfile
mem: apply the orderfile to the Docker image build
2026-09-14 17:33:31 +02:00
Adrià Arrufat 1ede559ff9 cookies: accept Secure and __Host- cookies on loopback origins
Browsers treat http://localhost, *.localhost, 127.0.0.0/8 and [::1] as
potentially trustworthy, so Secure and prefixed cookies work there over
plain http. We required an https scheme, which broke cookie-auth logins
under Playwright in local development.

Add URL.isPotentiallyTrustworthy (Chromium's net::IsLocalhost rule) and
use it for the cookie prefix gates, the send-path check and cookieStore.

Closes #3477
2026-09-14 16:02:26 +02:00