Extension Pulse, week of November 2: last call before Chrome 157
Chrome 157 reaches full stable November 3 with four changes for existing extensions. Chrome 158 and Firefox 160 follow within a week. The last-call audit.

My signal feed went quiet this week. Between October 26 and today, the forecast pipeline — the thing that watches Chromium Gerrit, W3C WebExtensions issues, and vendor release data — recorded zero new signals. That almost wrote this issue for me.
Then I looked at the calendar, and then at the primary sources the feed is supposed to watch. Chrome 157 reaches full stable on November 3, the day after this issue is dated, with four changes that reach existing extensions without any code change on your side. Chrome 158 starts its early-stable rollout the next day. Firefox 160 follows on November 10 with a silent break of its own. An empty feed is not an empty week.
So this issue is a re-check: the last-call audit for what ships November 3, browser-tested results for the one new API riding along, what's queued right behind it, and what TPAC did and didn't settle. Every date and status below was re-fetched from its primary source on November 2.
Chrome 157 lands November 3: the last-call audit
Chrome 157 branched October 12 and has been rolling out to early-stable users since October 21; full stable is scheduled for November 3 per Chromium Dash. W42 wrote the full break list and W43 re-verified the dates. The short version — four changes that reach existing extensions without any code change on your side, and three of them are silent:
publicSuffixrejects leading-dot hostnames. CL 8464103, merged September 30 alongside the spec update:".example.com"-style input — the shape cookie domains arrive in — now counts as an invalid hostname and becomes an error. That's the convergence with Firefox 158, whereisKnownSuffix()has thrown on any invalid hostname since October 13 (MDN). One fix covers both browsers: normalize and validate before calling, or wrap everypublicSuffixcall in try/catch.alarms.clearAll()resolves toundefined. CL 8182627, merged October 2 with a compatibility kill-switch. Firefox 157 shipped the same on September 29 (WECG #1055), and WebKit merged it on October 13 (PR 76286). Everyif (await browser.alarms.clearAll())branch is dead code. Our alarms deep dive is the place to re-audit your scheduling logic.- webRequest and DNR miss navigations started from user-restricted sites. CL 8497010, merged October 2. If a user put a site under "block all extensions on this site", navigations initiated from it — including link clicks to allowed sites — go invisible to
webRequestlisteners and stop matchingdeclarativeNetRequestrules, even permission-less block rules. No error is raised; the events just never arrive. X-Chrome-Manage-Accountsdisappears on Gaia URLs. CL 8501321, merged October 6. Extensions can no longer read, modify or inject that response header on accounts.google.com — "so extensions cannot trigger Mirror account management UI or actions", per the commit message. No extension API replaces it.
If you ship a blocker, a parental control, a DLP tool or an annotator, bullet three is yours to test: your event stream now has a user-shaped hole by design, and "no event" no longer means "no navigation". For everyone else the audit is one grep per bullet.
And the rollout didn't wait for the release notes. Early stable started October 21, thirteen days before the official date — the same rhythm W42 described for 156 — and a contributor on WECG #1055 saw the new clearAll() behavior on Stable by October 22. Some of your users are already on 157.
onExtensionLoaded rides along — and I ran it in a real browser
The same release that breaks four things also completes the lifecycle story. Chrome 157 adds runtime.onExtensionLoaded (commit 4f1b414, landed September 30): one event, fired whenever your extension joins the active set, with a reason — install, update, browser_update, enable, startup, reload — plus previousVersion on updates. A request to rename it to onLoaded came up at the October 8 WECG meeting; Chrome preferred to keep the current name, so the name that ships is onExtensionLoaded.
I didn't just read the commits.
See it run. To check the lifecycle events in a real browser, I built a small extension, Wake Log, that logs every lifecycle event it receives. Load it, switch it off and on or reload it, and its popup shows what arrived. On October 21 I put it through seven lifecycle transitions on Chrome for Testing 156.0.8078.47 (stable), 157.0.8103.6 (beta) and 158.0.8114.0 (canary) — 21 runs, with 157 and 158 behaving identically.
Two findings matter if you're about to adopt:
onInstalledstill fires next toonExtensionLoadedin 157. Register both and your setup runs twice on every install. Feature-check the new event and keep the older trio as the fallback — that pattern ran its setup exactly once across all 21 runs.- Two things the commits don't tell you. Unpacked reloads report
update, neverreload— Chromium does that on purpose, with crbug.com/550447466 tracking a change;reloadis for store-installed builds. And an extension updated while switched off, then re-enabled, deliveredupdateonly — noenablereason, andonEnablednever fired in the run (an unpacked extension; a store update while disabled may behave differently). Anything you restart only fromonEnabledmisses that case. Keep the setup idempotent.
Full tables and the one-listener pattern are in the dedicated post.
Next up: Chrome 158 on November 4, Firefox 160 on November 10
Chrome 158 branched October 26. Its early-stable rollout starts November 4 and full stable is November 17 (Chromium Dash). Three extension changes merged before the branch point:
- Popups can't be
blob:orfilesystem:URLs. Commit 7811f3b, merged October 14: action popup URLs must use thechrome-extension:scheme, indefault_popupand inaction.setPopup()alike. The commit message calls the old behavior a remote-code-execution risk. If you build popup HTML at runtime and hand Chrome a blob URL, move it to a real extension page. - DNR response-header value matching needs host permissions. Commit 22a2af9, merged October 21. Without host access to a request, rules that match header values (
valuesorexcludedValuesinresponseHeadersorexcludedResponseHeaders) only work for CORS-safelisted response headers andContent-Encoding; other such rules are skipped for that request, so a lower-priority rule may match instead. Matching on whether a header is present still needs no host permission. A companion commit b878de3 (October 16) makes DNR treat hidden headers as absent while matching. The new check sits behind a feature flag that is on by default. web_accessible_resources: ["*"]stops exposing_favicon. Commits 5095ebe and fad4d6c, both October 14: blanket wildcards no longer match generated paths like_faviconand the generated background page. If a content script or a web page loads favicons through your extension, declare"_favicon/*"explicitly.
The chrome.crossOriginStorage CLs did not make the cut. CL 8605006 (the MV3-only API to inspect and delete the data sites share with each other) and CL 8605007 (DNR blocking of lookups by hash) are still unmerged as of November 2, last updated October 28, after the webRequest variant was abandoned on October 18. W43's "earliest possible ship: M158" is gone. If they merge before M159 branches on November 9, that's the next train.
Firefox 160 is scheduled for November 10 (Mozilla's release schedule) and brings two changes:
runtime.getPlatformInfo().archreturns"arm64"instead of"aarch64"on 64-bit ARM (bug 2080310, commit e775d5304b32, landed October 10; MDN).runtime.PlatformArch.AARCH64disappears andARM64takes its place, matching Chrome. Any check for"aarch64"— picking a native-helper download, a wasm build, a telemetry label — stops matching on ARM64 machines, and nothing throws. Accept both strings.runtime.MessageSender.windowId(commit f43deb1ab6b2, WECG #1077). Popups, side panels, devtools panels: know the sender's window withoutsender.tab. Firefox leaves the property absent when no window is determinable — noWINDOW_ID_NONEsentinel — so detect with"windowId" in senderand treatundefinedas "no determinable window". New since W43: WebKit merged the same property on October 28 with the same leave-it-out rule (PR 78537), not yet in a shipping Safari. Chrome is supportive, with a tracking bug and no implementation yet.
Firefox 159 shipped on October 27 (product-details), and its MDN release notes have no add-on section at all. A genuinely quiet release for extension developers.
TPAC ended Friday: what I can and can't tell you
- The agenda is public; the outcomes aren't yet. The WECG held eight meeting slots in Dublin, October 26–30 (event page). The final agenda covered deferred permissions (the
initial_permissionsproposal against two alternatives), a sidebar API, a feature-detection "supports" API, runtime-context proposals and Dashlane's feedback on MV3 background execution, among others. As of November 2 no TPAC minutes are published — the newest file in the WECG minutes folder is the October 22 call, posted today — so I won't guess what was decided. The one thing that visibly landed during the week is spec work: the alarms API IDL (PR 1110) merged on the opening day. - Private DOM classes are not coming back from Dublin. The rejected proposal isn't on the final agenda. Apple had floated raising it with the CSS WG at TPAC — an open question in the October 8 minutes, not a commitment.
- Safari's
arm64rename stayed off the table. WECG #1056 asked Safari to follow Chrome and Firefox to"arm64"; it was scheduled for TPAC, then removed from the agenda on October 25. Per that thread, Safari reports"arm"on 64-bit ARM, so an arch check that also runs on Safari needs a third case. - Nothing decided in Dublin can ride M158. It branched October 26, the day TPAC opened, so the earliest realistic ship for any TPAC output is M159, stable December 8.
The rest of the frame
- Chrome 159 branches November 9 and is the last full stable release of 2026 — stable December 8, with final beta and early stable both on November 18 (schedule); M160's stable date is January 5. Whatever is meant to reach users before the holidays has to merge by November 9.
What I'd do this week
- Finish the M157 audit today. Full stable lands November 3, and early-stable users have had it since October 21. Four greps: branches on
clearAll,publicSuffixcalls that take user- or URL-derived strings, webRequest/DNR code that promises full navigation coverage, and anything touchingX-Chrome-Manage-Accounts. W42 is the deep dive. - Run the M158 checks before November 4: popups served from
blob:URLs, DNR rules that match response-header values, and any"*"inweb_accessible_resourcesthat your favicon code relies on. - Get ready for Firefox 160 before November 10. Accept
"arm64"wherever you check for"aarch64". Write thewindowIddetection once:"windowId" in sender,undefined= no determinable window,sender.tab?.windowIdfallback for every other browser. - Move lifecycle setup behind one idempotent function, feature-checking
onExtensionLoaded(ships with 157): use it where it exists, fall back toonInstalled/onStartup/onEnabledwhere it doesn't. Don't register both paths — your setup will run twice. And don't lean ononEnabledalone: the browser run showed the updated-while-off case never fires it. The pattern is in the post. - Keep watching, don't build. The crossOriginStorage CLs and the TPAC minutes are the two things that can change this picture, and as of November 2 neither has landed.
- Check your code against this week's changes.
npx @extenshi/cli@latest advise .finds the four Chrome 157 changes and Firefox'saarch64check in your extension with the file and line — it runs locally and needs no account. It checks Chrome and Edge by default and adds Firefox when your manifest has Firefox settings;--browsers chrome,firefoxforces it. Every change we track, the Chrome 158 ones included, is listed at cli.extenshi.io/changes. And if you want the full second pair of eyes on the build,npx @extenshi/cli scangets you 3 scans + 10 reads free with a free account (one-time); prepaid packs past that.
Sources
- Chromium Dash — Chrome 157 milestone schedule — branch point 2026-10-12, final beta and early stable 2026-10-21, stable 2026-11-03
- Chromium CL 8464103 —
chrome.publicSuffixleading-dot rejection, merged 2026-09-30, ships M157; WECG PR #1097 spec update merged the same day; decision of record in WECG #231 (2026-09-24) - MDN — Firefox 158 for developers —
publicSuffix.isKnownSuffix()throws on invalid hostnames; Firefox 158 released 2026-10-13 - Chromium CL 8182627 —
alarms.clearAll()→Promise<undefined>, merged 2026-10-02, ships M157; WECG #1055 — Firefox 157 shipped 2026-09-29, Chrome 157 Stable behavior reported 2026-10-22; WebKit PR 76286 — merged 2026-10-13 - Chromium CL 8497010 — webRequest/DNR initiator checks against user-restricted sites, merged 2026-10-02, ships M157
- Chromium CL 8501321 —
X-Chrome-Manage-Accountshidden on Gaia URLs, merged 2026-10-06, ships M157 - Chromium commit 4f1b414 —
runtime.onExtensionLoaded, committed 2026-09-30, ships M157; rename toonLoadeddiscussed at the 2026-10-08 WECG meeting, current name kept - Wake Log sample and its test results — run on Chrome for Testing 156.0.8078.47 / 157.0.8103.6 / 158.0.8114.0, 2026-10-21; unpacked-reload behavior tracked at crbug.com/550447466; full analysis in the runtime.onEnabled post
- Chromium Dash — Chrome 158 milestone schedule — branch point 2026-10-26, final beta and early stable 2026-11-04, stable 2026-11-17
- Chromium commits 7811f3b (blob:/filesystem: popups rejected, 2026-10-14), 22a2af9 (DNR response-header value matching needs host permissions, 2026-10-21), b878de3 (hidden headers ignored in DNR matching, 2026-10-16), 5095ebe and fad4d6c (generated paths excluded from
web_accessible_resourceswildcards, 2026-10-14) — all before the M158 branch point - Chromium CLs 8605006 + 8605007 —
chrome.crossOriginStorageproposal, unmerged as of 2026-11-02 (last updated 2026-10-28); CL 8606266 — webRequest variant, abandoned 2026-10-18 - Firefox 160 release schedule — release 2026-11-10; bug 2080310 and commit e775d5304b32 —
PlatformArchaarch64→arm64, landed 2026-10-10, fixed in 160; MDN — Firefox 160 for developers - Firefox commit f43deb1ab6b2 —
MessageSender.windowId, committed 2026-10-16, fixed in 160; WECG #1077 — absent-property semantics, Apple's agreement 2026-10-27; WebKit PR 78537 —windowIdmerged into WebKit 2026-10-28 - Mozilla product-details — Firefox 159.0 released 2026-10-27; MDN — Firefox 159 for developers — no add-on changes listed
- W3C TPAC 2026 — October 26–30, Dublin; WECG's eight slots; WECG TPAC agenda; alarms API IDL, PR 1110, merged 2026-10-26
- WECG #1106 — private DOM classes/attributes proposal, closed 2026-10-08; WECG #1056 —
getPlatformInfo()inconsistencies, removed from the TPAC agenda 2026-10-25 - Chromium Dash — M159 (branch point 2026-11-09, final beta/early stable 2026-11-18, stable 2026-12-08) and M160 (stable 2027-01-05) schedules
- Extension Pulse 2026-W42 and 2026-W43 — the in-depth coverage this issue carries forward, including Chrome 156's early-stable rhythm
Methodology
The generator's 7-day window (2026-10-26 → 2026-11-02) returned zero forecast-pipeline signals. This issue started from the docs that backed W42 and W43, the Wake Log browser run of 2026-10-21, and those two issues; then every date, CL status and issue state in it was re-fetched from its primary source on 2026-11-02 — Chromium Dash, Gerrit and Gitiles, Bugzilla, Mozilla product-details and release schedules, MDN, and the WECG, WebKit and Firefox repositories on GitHub. The Chrome 158 and Firefox 160 items come from our platform-change catalog, each re-checked against its commits the same day. Scheduled dates move, so treat November 3, 4, 10 and 17 and December 8 as schedules, not promises. The crossOriginStorage CLs are unmerged as of the last check — watch, not build. Where an outcome could not be verified — what TPAC decided — the issue says so instead of guessing.
This issue of Extension Pulse is compiled from Chromium Gerrit, Gitiles and Chromium Dash, W3C WebExtensions Community Group issues and meeting minutes, Mozilla release data, Bugzilla and MDN, the WebKit repository, and from our own browser runs of the Wake Log sample. We don't independently verify every upstream claim, and references to specific projects or companies reflect the findings of the cited sources — not accusations of intentional wrongdoing. If something here is off, tell us at [email protected].
Related Articles
Extension Pulse, week of October 19: Chrome floats a brand-new API, Firefox starts throwing
Chrome proposes chrome.crossOriginStorage, a new MV3 API. Firefox 158 ships a breaking publicSuffix change, runtime.getVersion() parity, MessageSender.windowId.

runtime.onEnabled shipped in Chrome 155, onExtensionLoaded is next: how to wire both
Chrome 155 added runtime.onEnabled; runtime.onExtensionLoaded follows in 157. Which event fires when, one listener pattern for both, and the edge cases.

chrome.alarms in Manifest V3: background jobs that outlive the service worker
MV3 kills setInterval. Build a Chrome extension background job with chrome.alarms that survives service worker termination — full runnable code, ~20 min.