Wren 0.4.0
Wren 0.4.0 reads text with its own engine, speaks to screen readers, keeps each window on its own, and presents a dragged splitter at the screen's top rate. WebAssembly is still the only execution engine.
This is still a beta, under development, and Windows-only. From this version Wren's own code is under the PolyForm Strict License 1.0.0 (the source stays public; see LICENSE).
Highlights
- Text without DirectWrite. Fonts, shaping and line breaking come from Fontations, HarfRust and ICU4X (Rust), the same on every machine;
WREN_TEXT=dwritebrings DirectWrite back for comparison. - Accessibility. The browser's chrome and the pages are exposed to screen readers through UI Automation (AccessKit): roles, names, states, text fields with their caret and selection, iframes, and updates node by node when a page changes. Nothing is built or sent while nothing changes. Not tried with NVDA or Narrator yet.
- A configuration page you can read.
about:confighas readable titles with the technical name beneath, categories with their counts, the value next to its name, a mark and a reset button on what you changed, a search over titles, names and descriptions, and a "modified only" filter. - Search engines. A list of engines (DuckDuckGo, Bing, Google, Qwant, Ecosia, Startpage, Wikipedia, and your own) with a default and keywords:
@g catssearches with Google, Ctrl+Down picks another engine for one search. An existing choice is kept. - Tab sidebar, second part. The sidebar opens and closes with a fade; pinned tabs; tab groups (name, colour, fold, drag in and out); a speaker on the tab that plays, with a mute button per tab; 1000 tabs cost about 1 ms a frame instead of 11 ms.
- Several windows, each on its own. Each window has its own developer tools (docked or detached), its own blinking caret, its own scale on a monitor of another DPI, and the drop mark of a tab dragged between windows is exactly where the tab lands.
- One decision per frame. The frame pacer is a model of its own (resizing, answering input, dragging, resting, continuous): a splitter dragged on a variable refresh screen is presented at once at the top rate (about 180 frames a second instead of 60 on a 180 Hz screen that Windows reads at 60 at rest).
- Crash reports with names. A crash report names the frames of a release build from its linker map;
tools\crash_symbolize.ps1reads a report or a minidump. - More of the web. Web Animations (
element.animate(), CSS animations ingetAnimations()), the Popover API with a real top layer, the Navigation API,DOMParserandXMLSerializerfor XML and XHTML pages,TransformStream,CompressionStreamandDecompressionStream, long tasks forPerformanceObserver, nested workers, storage partitioned by top-level site with the Storage Access API, Media Source Extensions in a worker, service workers answering frame navigations. - Sites that speak only TLS 1.3 open (speedtest.net's measurement servers failed with a security channel error).
- Steadier. The state of a window lives in the window instead of in globals shared between windows, one gate for the frames of a thread (a menu opened during a build no longer builds a frame inside a frame: the crash of 26 October), thread pools that allocate safely, and a build that takes about 50 seconds on the CI instead of 13 minutes.
Known limits
- Navigation API:
precommitHandlerandsourceElementof links are missing; the WPT suite passes about 30 % of it. getAnimations()promisesreadyandfinishedof CSS animations are never resolved.- Accessibility: the characters of static text in a page and a selection across elements are not exposed.
- A page that is white after a tab is dragged between windows and the sidebar is switched on was seen once in a test, not understood.