0.2.9

lightpanda-io/browser0.2.9Apr 24, 2026by github-actions[bot]

AI Summary

Introduces Page container architecture, WebSocket support, and HTTP caching.

Key Highlights

  • New `Page` container architecture
  • Finalizers moved to pure reference counting
  • WebSocket WebAPI support
  • HTTP Caching with Cache-Control

New Features

  • WebSocket basic protocol support
  • navigator.userAgentData
  • XMLHttpRequest.timeout with curl enforcement
  • EventCounts API
  • Cookies file support
  • IP filter support
  • Emulation.setUserAgentOverride
  • JSON endpoints in CDP

Full Release Notes

## Architecture
- **Introduce `Page` container** (Page → frame restructuring; capture next linked-list node before releasing on cleanup)
- **Finalizers moved to pure reference counting**; improved finalizer code; clear identity before forcing finalizers
- ArenaPool gains arena buckets; non-DOM event dispatch extracted

## New Web APIs
- **WebSocket WebAPI** (basic protocol support, fixes; `WS.close` returns DOMException)
- `navigator.userAgentData`
- `XMLHttpRequest.timeout` with curl enforcement
- `EventCounts` API; `PerformanceObserver` `getEntriesByType`/`getEntriesByName`
- `document.writeln`; `document.body` setter
- `media.play()` returns a promise
- Expanded `new Response(...)` and `new Blob(...)` body/type support
- TextDecoder streaming; non-UTF-8 querystring/HTML encoding via `encoding_rs`

## Workers
- Many more Worker APIs enabled across multiple PRs (timer string handler, etc.)

## Cookies
- Cookies file support; improved parsing rules
- Require label boundary when matching domain attribute; reject Set-Cookie domains that are public suffixes; better handling of empty domains
- `Fetch` cookie jar only included for `include` + same-origin

## CDP (Chrome DevTools Protocol)
- `Emulation.setUserAgentOverride` (with restrictions); fake `Page.printToPDF`
- JSON endpoints; emit `Page.javascriptDialogOpening` events for JS dialogs
- `console.group`; console functions defined directly on console instance
- Promote `<label>` to checkbox/radio for CSS-hidden inputs
- Audit enable/disable placeholder handlers; timing fields on several CDP messages
- Improved `loaderId`/`requestId` compatibility; accept `LID-` requestId prefix
- Update WebDriver to use Page; stricter `Page.isSameOrigin`

## HTTP / Networking
- **HTTP Caching** (Cache-Control public by default; cache safety checks)
- **IP filter** support (+ improvements)
- TCP keepalive timeout setup; handle HTTP response with closed socket
- Default write callback to prevent stdout pollution; relax httpclient abort assertion

## MCP
- Add `hover`, `press`, `selectOption`, `setChecked`; improved navigation reliability + CDP support

## Forms
- Encode form data based on form/document encoding

## Build / CI / dev
- Port sqlite3 to the Zig build system; track html5ever Rust sources as cargo step inputs
- V8 snapshot caching (CI cache, WPT use, init snapshot before network, aggressive GC after creation)
- Refactored release workflow + Arch Linux package build; WPT extensions; send WPT completion
- `@import("string.zig")` → `lp.String`, `log.zig` → `lp.log` cleanups
- Docs: glibc requirement, nightly verification, WSL notes, docker localhost exposure

## Stability fixes
- Various crash fixes; UAF on empty/invalid location; double-free on decoder error
- Map Zig `error.RangeError` to JS RangeError; guard against index-out-of-bounds on invalid datetime
- Don't release un-acquired reference on CDP input event; don't release pending MutationObserver records
- Better handling of v8 callbacks with no valid context; error-callback on shared buffer clone