, each replayed against a live Firefox
Nightly before and after the fix where the shape allowed it, plus four more
that followed them the same week, and the engine release that carries the
root-cause fix for the first of them.
- `extension-create`, `extension-develop` and `extension-install` move from
4.1.29 to 4.1.30. That engine settles a promise before a surface relay
replies to an eval (the root cause behind the first entry below, filed
from this repo as extension.js 512), names a missing tab, a refused url,
a closed surface and a browser exit on every act verb instead of a
generic refusal, and lets `reload` resolve a surface's tab. The relay
wrapper below stays: a project that pins an older engine in its own
node_modules still drives that engine.
- `extension_eval` on a surface that answers through the in-bundle relay
(every Gecko session, and Chromium MV2) never hands the relay a promise.
The relay evaluates synchronously and passes the raw value to
`sendResponse`; a promise is not cloneable, Firefox reports that to the
sender as no reply, and the bridge then called the surface "not open"
while the page was still running the expression. The wrapper now settles
a thenable inside the page under a token, and the tool polls until it is
done: an async expression returns its value, a rejection answers `E_EVAL`
with the page's own message, and one that never settles answers
`E_WAIT_TIMEOUT` naming where the result will land. The engine's "open it
first: extension open newtab" hint is now spoken as the tool call it means.
- `extension_inspect` on Gecko reads a page inside the extension through
its surface relay: a url that matches a declared surface document (the
full `moz-extension://` address, the document path, or its file name)
routes to that context instead of the tab injection, which Firefox
refuses into extension pages with "Missing host permission for the tab".
An extension url that matches no declared surface says so and names the
ones the manifest declares.
- `extension_stop` reaps the browser the launcher recorded in `ready.json`
(`browserPid`, `launcherPid`, and any process holding `profilePath`), so
a Firefox started on a custom profile, or one whose argv never names the
project, no longer survives a `stopped` answer with `reaped: []`.
- `extension_doctor` no longer calls a Gecko session unhealthy over a
browser exit that the executor outlived: Firefox hands a fresh profile to
a relaunched process and the first one exits 0, which the engine's browser
leg reports as a failure while storage probes and evals keep answering.
That leg becomes a warning that says so, and any other failure still
counts.
- `extension_browsers` detect finds a managed binary as deep as the cache
writes it (a Firefox Nightly sits six levels down inside its app bundle),
so it no longer reports the system Firefox as available while
`extension_dev` launches the cached Nightly. When both exist, the entry
carries `systemBinaryPath` and a `devLaunches` line saying which one dev
starts and how to choose the other. `extension_wait` reports `browserPid`
and `profilePath` from the contract.
- `extension_open` with surface `sidebar` on Gecko no longer stops at the
engine's "sidePanel not available", a Chromium API named on a Firefox
engine. It asks the sidebar relay whether the `sidebar_action` panel is
open and reports `status: "already-open"` when it is (Firefox opens the
panel at install, so it usually is); when it is not, the document is
rendered as a tab with the gesture rule stated (Firefox opens the panel
only from the toolbar button or View > Sidebar, Bugzilla 1392624).
- `extension_eval` with context `page` and a `moz-extension://` url on
Gecko evaluates through the surface relay of the document that url names,
with a warning naming the context to pass next time, instead of "chrome.
scripting is not available ... use context background". An extension url
that matches no declared surface says which surfaces the manifest
declares. The url-to-surface mapping now lives in one place for inspect
and eval.
- `extension_dev` with `port: 0` no longer warns "Requested port 0 was not
available": 0 asks the engine for any free port, so the note now says
which port it picked, and the collision wording stays for a numbered port
the server could not bind.