v0.2.6

lightpanda-io/browserv0.2.6Mar 14, 2026by github-actions[bot]

AI Summary

Introduces native semantic tree extraction for AI agents and the FontFace API. It also adds support for HTMLDetailsElement and TextEncoderStream.

Key Highlights

  • Native Semantic Tree extraction engine
  • FontFace API and FontFaceSet improvements
  • HTMLDetailsElement support
  • TextEncoderStream and TextDecoderStream

New Features

  • AI agent / semantic extraction tools
  • window.structuredClone support
  • Custom elements dynamic markup fixes
  • Navigation improvements and blob URL support

Full Release Notes

## AI agent / semantic extraction
- **Native Semantic Tree extraction engine for AI agents**
- MCP: `interactiveElements` and `structuredData` tools
- CDP: `LP.getStructuredData`, `LP.getInteractiveElements`
- Web Bot Auth

## New Web APIs
- `window.structuredClone`
- `TextEncoderStream` / `TextDecoderStream`
- `HTMLDetailsElement`
- `FontFace` constructor + `FontFaceSet.add()`; `FontFaceSet` is now an EventTarget; optimized FontFace
- `FileList` Web API stub; dummy `getImageData` on canvas
- `Form.action` getter/setter; `target` attribute on anchors and forms
- `URL.username` / `URL.password` setters
- `Range.getBoundingClientRect` / `getClientRects` + Range cleanup
- New `Response` and `Request` methods
- `body.onload` aliases to `window.onload`
- `Track`: implement `kind` and constants

## CSS / selectors
- CSS value normalization extended to cover more properties
- Empty `:is()` / `:where()` are valid (return nothing)
- Fix crash in `consumeName()` on UTF-8 multibyte sequences; handle commas inside quoted attributes
- Node matching via tag-name string comparison on non-HTML nodes

## Custom elements
- Throw on dynamic markup in custom-element callbacks during parsing
- Fix cloning custom element with constructor that attaches the element
- Execute dynamically inserted inline script elements

## Navigation / frames
- Target-aware(ish) navigation; improved frame sub-navigation
- Optimize about:blank loading (general + frames); iframe `src="about:blank"` handling
- Allow navigation from a blob URL; fix page re-navigate
- Force dynamic module instantiation/re-import when previous compilation failed

## CDP (Chrome DevTools Protocol)
- Dummy `Page.getLayoutMetrics`, `Page.captureScreenshot`; resize screenshot to 1920x1080
- Fix request id resolver (`REQ-` not `RID-`); don't dispatch `executionContextsCleared` on frame navigation
- Fix sending CDP raw command with Playwright

## Memory / runtime
- Context origins (use origin.arena for origin-tied values); `resetContextGroup` on page removal
- ArenaPool arenas for Blob/File; pool arena for ReadableStream (later reverted then re-applied)
- Use Zig allocator for libcurl; enable tsan for C libs
- Global/network connection poll runtime; run the message loop more
- Single HandleScope for event dispatch; terminate isolate on `Client.stop`

## Stability fixes
- Fix `TrackingAllocator` reallocation_count on failed/unsuccessful resizes
- Resolve memory leak in `Option.getText()`; leak in inner-navigation refactoring
- Ensure valid cookie isn't interpreted as null; parse cookies on redirection
- Halt tests (`@panic`) on ArenaLeak or double-free; initialize all App fields after create
- Handle auth challenge for non-proxy auth

## Build / CI / dev
- Add code formatting check; testing `LogFilter` utility for scoped log suppression
- WPT: browser pool, increased concurrency (`--concurrency=3`)
- Update zig-v8 (action.yml + Dockerfile); remove git submodule init from Dockerfile