Behavior changes
- Requests to the Fetch "bad ports" (ssh, smtp, pop3, imap, …) are now refused for every request, not only WebSocket.
window.postMessagenow honorstargetOrigin.- A cross-site response can no longer set a
SameSitecookie other thanNone. - Proxy and server credentials are tracked separately, so proxy credentials are no longer sent to the server after a redirect.
- An
about:blank(or src-less) iframe now gets itscontentWindowandcontentDocumenteven without--load-resources iframe. Its HTTP and WebSocket requests are blocked while iframe loading is off. - An HTTP status from 600 to 999 (e.g. LinkedIn's
999) is now reported as-is instead of0. - Trusted
mousedown,mouseup,clickanddblclicknow stop at the first disabled form control, as in Chrome. - Element clicks and hovers from tools now hit the element's center instead of
(0, 0). document.readyStateis nowinteractivewhen deferred scripts run.Network.setUserAgentOverridenow logs a warning when a restricted user agent is ignored.- The HTTP server parses requests more strictly and its routes are guarded against DNS rebinding.
CDP
- Several page targets in one browser context. Console, exception and network events are routed to the right target, and a frame id from another target is rejected
- Accessibility:
ignoredReasonsnow match Chrome (ariaHiddenElement,ariaHiddenSubtree,inertElement,notRendered,notVisible) - Lone surrogate escapes in JSON (
"\udc00") are accepted instead of closing the connection LP.waitUntiland asettledlifecycle eventbeaconadded toLP.configureLoading- A closed browser context no longer leaves its viewport override for the next one
LPcommands described in/json/protocol
Serve / CLI
--wait-until settled(experimental): waits for load, then for the work that can still change the page. Interval timers, long timers and intersection observers don't hold it--v8-gc-hint-floor-mbreplaces the fixed 1 MiB GC hint floor. Off infetch--experimental-features animation: fireanimationstart,animationendandanimationcancelfor CSS animations- Bash 3.2 (macOS) filename completion
New Web APIs
AnimationEventand CSS animation events (behind--experimental-features animation)ClipboardEventInputEvent.getTargetRanges()execCommand('insertParagraph')getComputedStyle().contentresolved from the cascade
Web API behavior / fixes
- Text editors: CKEditor works, and clicks, focus and Tab place the caret in a
contenteditable(Slate, Draft.js) contenteditable: Backspace and Delete merge blocks (nested ones too), side-by-side lists merge, Enter in an empty list item outdents itexecCommand: runs of spaces and spaces at line edges become , so they stay visibleinnerTextkeeps spaces when CSSwhite-spacepreserves them, and puts a newline between rows ofthead,tbodyandtfoot:definedfollows the custom element state; customized built-ins (<button is=...>) now upgrade[CEReactions]forcreateElement/createElementNS; the reactions queue is no longer drained when a constructor returnsa.hashanda.search(and<area>) return""for a lone#or?history.pushState(undefined)no longer breakshistory.state; state that JSON can't encode throwsDataCloneErrorimport()of an already available module settles in a later task, as in Chromewindow.<id>on an iframe's window looks up the iframe's document- Functions called from a realm whose frame is gone no longer crash (
import(),import.meta,postMessage,location) - WebSocket: fragmented messages are reassembled; the server's
Sec-WebSocket-Protocolis checked against the offered list - CORS responses filter their headers
Response.clone()on a stream;pipeTo/pipeThroughfixes- Input
stepUp/stepDownwith fractional steps (0.1 + 0.2gives0.3) matchMedia("")always matches- SVG
getCTM()/getScreenCTM()return an identity matrix on a detached element frameandbasefontare serialized as void elementsdocument.createEvent('inputevent')is rejected;PromiseRejectionEventrequires its optionsnew CSSStyleSheet()sheets are the only onesreplace()acceptsIntersectionObserver: the first check runs on the next tick
Tools / MCP
treedelta: true: returns only the lines that changed since the last call- The page's WebMCP tools are reported in a tool result whenever they change
- Actions that open a window late (after a fetch or a timer) now follow it; new
popupstool lists and switches windows clicksays when the element is disabled or not rendered- Tool arguments are type-checked, and every error names the argument and the problem
treeandmarkdownkeep content that is rendered despitehiddenoraria-hidden- Markdown:
<ol start>, multi-paragraph blockquotes, a blank line before--- - MCP over HTTP: tool output streamed over SSE (the
runtool streams console lines),logging/setLevel, andnotifications/cancellednow stops the call in flight - The
runtool description explains how to load pages in parallel
Performance / stability
- Style caches are invalidated per property group, and a geometry change no longer resets the whole geometry cache
- Smaller CSS declarations (~500 KB saved on a style-heavy site); property names are ids, and style matching compares ids (7%+ faster rebuilds on most frameworks)
- XHR takes the response body instead of copying it
- XPath parsing allocates less
- Crash fixes: abort during a gated transfer, a UAF in custom element upgrade
- The crash reporter exits non-zero when it can't start
curl
Release
- macOS builds run on macOS 15; the Intel build targets baseline x86_64, fixing "Illegal instruction" on older CPUs
- Release candidates (
1.0.4-rc1) are now published