0.4.0
google/magika0.4.0Aug 31, 2026by github-actions[bot]
AI Summary
A major release introducing WebDriver BiDi support and new rendering capabilities like screenshots and PDFs, while changing default resource loading behaviors.
Key Highlights
- WebDriver BiDi protocol support
- New screenshot and PDF dumping tools
- EasyList ad blocker initial support
- Defaulting iframe and worker loading to off
Breaking Changes
- Iframes and workers no longer load by default
- Deprecated flags: --disable_subframes, --disable_workers, --enable_external_stylesheets, --log-filter-scopes
- Comma-separated list values are no longer supported; pass options multiple times
New Features
- WebDriver BiDi protocol support
- Screenshot and PDF generation tools
- EasyList ad blocker support
- HTTP header and version configuration options
- Geolocation and URLPattern API support
Full Release Notes
## Breaking changes Iframes and workers no longer load by default. This makes resource loading consistent: nothing loads unless you ask for it. - Restore the old behavior with `--load-resources iframe` and `--load-resources worker`. - External stylesheets stay off by default too: use `--load-resources stylesheet`. Deprecated flags (they still work, but now print a warning): - `--disable_subframes` → iframes are off by default; use `--load-resources iframe` to turn them on. - `--disable_workers` → workers are off by default; use `--load-resources worker` to turn them on. - `--enable_external_stylesheets` → use `--load-resources stylesheet`. - `--log-filter-scopes` → renamed to `--log-filter`. - Comma-separated list values (e.g. `--adblock-lists a,b`) → pass the option multiple times instead (`--adblock-lists a --adblock-lists b`). Affects `--strip-mode`, `--adblock-lists`, `--block-cidrs`, `--block-urls`. ## Protocols - WebDriver BiDi support (with a `[classic]` WebDriver start); protocol selection via CLI; both CDP and BiDi can be served on the same port - WebDriver: better keyboard and mouse handling ## New Web APIs - `URLPattern` - `navigator.geolocation` + `Emulation.setGeolocationOverride` - `WorkerNavigator` - `canvas.toDataURL` / `toBlob` (returns a 1x1 PNG) - `HTMLElement.draggable` IDL attribute - Many element getters/setters added and reworked; improved XPath support ## New features - Screenshot support (`--dump png`, `screenshot` tool): renders the page's markdown - PDF support (`--dump pdf`, `Page.printToPDF`): renders the page's markdown - Ad blocker: EasyList parsing (initial) - `--load-resources` with an `image` parameter (mimics image fetches) - `--http-header` to send headers on every HTTP request - `--http-version 1.1` / `auto` flag - Optional HTTP rate limit - `exa` search engine support; `Keenable` engine with a keyless option ## Web API behavior / fixes - `searchParams` keeps a linked `URL` in sync; `URLSearchParams` iterator and percent-escape fixes - `FormData` encoding - `FileReader` is now asynchronous with proper text decoding - Blob / File conformance; correct content-type for blobs; `application/octet-stream` MIME - XHR: sync requests, Blob response type - Edit-key support in `input`/`textarea`; improved hover events - Prevent `click()` from triggering `click()` - Re-parse `element.style` when the `style` attribute changes - Promise-returning operations reject (not throw) on a bad receiver - Reject XML documents that are not well-formed - `DOMParser` captures the owning frame for the correct URL - Handle immediate `meta refresh` navigation ## Rendering / CSS - `clientHeight`/`clientWidth` return the viewport for the body - `device-width` / `device-height` media features - Compare visibility and CSS keyword values case-insensitively - Reuse storage for updated property values - Markdown dump separates flex and grid items; skips hidden elements ## HTTP / Networking - Strip `Authorization` on cross-origin redirects - Send `Sec-Ch-Ua-Full-Version-List` header - Better `robots.txt` status handling - Fix WebSocket data send on a small buffer - Guarantee a single-outcome callback contract for `Transfer` ## CDP (Chrome DevTools Protocol) - Answer unknown methods with `-32601`, like Chrome - Enforce `Network.enable` limits - Accept the emulation and setup calls drivers send at context creation - Pass more `Runtime` methods through to the inspector; fill all `DOM.getBoxModel` quads - `obeyRobots` added to `LP.configureCDP` ## MCP / tools - Negotiate the protocol version on initialize; enforce HTTP conditions; close the connection after `keep_alive=false` - Add title and annotations to `tools/list`; logfmt is now a config default - Add `maxBytes` and `strip` to the `html` tool; `--selector` / `--max-bytes` for `fetch` - Interactive/links/markdown: skip hidden elements, take roles and names from the AXNode, dedup links by href ## Agent - List all agent providers and gateway examples in the README - Fix agent history in JS mode ## Stability / memory - Disconnect runaway mutation observers; drop async module completions after termination - Fix double-release and other edge-case memory issues - Fix UAF when a `PerformanceObserver` disconnects in its callback - Fix arena leak on page shutdown with live animations - Several crash fixes: null deref on cross-context `ReadableStream`, unsafe element cast, label click - `Node.flags` for lookup short-circuit (perf) ## Build - Simplify `build.zig`; pin `dev_fast` to the host glibc; use an orderfile on Linux CI builds - `-Ddev_fast` speeds up Linux debug builds: shared V8 + Zig's self-hosted backend (instead of LLVM)