Safari 27 fixes top-level await, after WebKit rewrote the module loader in C++
WebKit published the fix on September 2, 2026. Dynamic imports of a module that uses top-level await could complete out of order in Safari, and an importer that ran early hit an error about accessing a value before initialization. The cause was a module loader built on the abandoned WHATWG Loader proposal rather than on the algorithms in the ECMAScript standard. WebKit rewrote the loader from self-hosted JavaScript into native C++, and the result ships in Safari 27 and in Safari Technology Preview 251.
If a module of yours worked in Chrome and Firefox and failed in Safari with an error about accessing a value before initialization, WebKit has now named the cause and removed it. Kai Tamkun wrote on September 2, 2026 that WebKit for Safari 27 adds full spec compliance for top-level await. The fix can be tested in the Safari 27 beta and in Safari Technology Preview 251.
What went wrong
Top-level await lets a module pause its own evaluation until an asynchronous job finishes, and every module that imports it has to wait. Safari's loader did not wait. It treated the import as settled before evaluation of the awaited module had finished, so an importer could start running while the exports it needed were still uninitialized.
The post works through three sequential dynamic imports of the same module. They should finish in the order they were requested, first, second, third. In Safari they finished second, third, first, and the second and third could not read the exports at all; they ended with an error about accessing a value before initialization.
Why a rewrite rather than another patch
The loader had been written against the WHATWG Loader proposal, which was later abandoned, instead of against the ECMAScript standard's own algorithms for asynchronous module execution. That mismatch is why the bugs kept returning: each patch removed a symptom of a structure that did not match the specification it was meant to implement.
In January 2026 the team started over. The loader moved from self-hosted JavaScript to native C++, with the specification's pseudocode translated directly into code, and a draft pull request followed a few weeks later. No new feature rides along with a change like this, and the work ran from January 2026 to the Safari 27 beta announced on September 2, 2026.
How they checked it
Two checks support the claim of spec compliance, and both are described in the post.
- A fuzzer generated module graphs and compared Safari's output byte for byte against the output of other engines.
- Every module-related test in test262, the official ECMAScript conformance suite, passed before the change was merged.
- WebKit reports that the rewrite introduced no regressions.
„WebKit for Safari 27 adds full spec compliance for top-level await“
Related

Safari 27.0 ships an MCP server, so a coding agent can drive the browser itself
WebKit published the feature list on September 17, 2026, and it is the longest the team has written: 83 features, up from 58 at the first beta in June, and 844 quality fixes against the 525 announced at WWDC. The headline for anyone who builds with a coding agent is the Safari MCP server, which hands the agent the DOM, network requests, screenshots and console output from a real Safari window. Customizable Select turns the real select element into something you can fully restyle, and scroll anchoring stops the page from jumping when content loads in above what you are reading.
WebKit Blogverified
Safari Technology Preview 252 adds named-feature() and lets SVG reach a filter in another file
The preview build came out on September 11, 2026 and covers WebKit changes between 319252@main and 320112@main. Eleven features are new, and two of them extend the same job: how a stylesheet, and then a script, finds out what the engine underneath can do. The named-feature() function asks about a behavior that has no syntax of its own, and the registry behind it holds exactly two entries today. SVG also gained external resources, so the url() reference can finally point at a filter, mask or gradient stored in another document.
WebKitverified
Interop 2027 proposals close on September 23, and untested ideas do not qualify
The call for Interop 2027 Focus Area proposals opened on September 3, 2026 and closes on September 23, 2026. Proposals are filed as issues on the web-platform-tests/interop repository, and two conditions decide almost everything: the technology must already have a mature standard, and it must be testable, because the test results are what the dashboard scores. Anything that fails the second condition is steered toward an Interop Investigation instead. Twenty days is the whole window, and the evidence a good proposal needs takes longer than an evening to assemble.
WebKitverified
