Wren

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=dwrite brings 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:config has 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 cats searches 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.ps1 reads a report or a minidump.
  • More of the web. Web Animations (element.animate(), CSS animations in getAnimations()), the Popover API with a real top layer, the Navigation API, DOMParser and XMLSerializer for XML and XHTML pages, TransformStream, CompressionStream and DecompressionStream, long tasks for PerformanceObserver, 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: precommitHandler and sourceElement of links are missing; the WPT suite passes about 30 % of it.
  • getAnimations() promises ready and finished of 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.

Edit this page on GitHub