diff --git a/README.md b/README.md index 0254a3c..664ec2a 100644 --- a/README.md +++ b/README.md @@ -598,14 +598,6 @@ without an `await`. Demonstrated, not assumed: a `throw` placed past the first and on Chrome (`pageerror`), with the rest of the run unaffected because the approval view had already rendered. -One error is still tolerated rather than fatal, listed in `ALLOWED_ERRORS` in -`tests/e2e/firefox/run.js` and printed on every occurrence so the concession -stays visible in the run output: Firefox reporting an extension promise that -settled after its page unloaded, from anywhere in the popup. Its cause was the -site-approval popup's unawaited `sendMessage` before `window.close()`, which -[#275](https://git.eeqj.de/sneak/AutistMask/issues/275) removed; Firefox runs -since have not printed it, and -[#487](https://git.eeqj.de/sneak/AutistMask/issues/487) removes the entry. Errors are read from the privileged `nsIConsoleService` in Marionette's chrome context and filtered to non-warning entries whose `sourceName` is the extension origin. That mechanism is not a stylistic choice. WebDriver BiDi's diff --git a/TODO.md b/TODO.md index 3871d10..5839216 100644 --- a/TODO.md +++ b/TODO.md @@ -45,6 +45,14 @@ but the review is broader than any of them. # Completed Steps +- 2026-10-07: The Firefox end-to-end suite no longer tolerates any uncaught + extension error ([#487](https://git.eeqj.de/sneak/AutistMask/issues/487)). Its + one entry, Firefox reporting a popup promise that settled after the page + unloaded, had lost its cause with + [#275](https://git.eeqj.de/sneak/AutistMask/issues/275); the entry and the + code that printed tolerated errors are gone from `tests/e2e/firefox/run.js`, + and so is the README paragraph that described it. + - 2026-10-07: The README's end-to-end limits now match what the two browser suites do to the extension ([#293](https://git.eeqj.de/sneak/AutistMask/issues/293)). The `window.close` diff --git a/tests/e2e/firefox/run.js b/tests/e2e/firefox/run.js index 67d6b3c..55679ee 100644 --- a/tests/e2e/firefox/run.js +++ b/tests/e2e/firefox/run.js @@ -854,37 +854,6 @@ step( // ------------------------------------------------------------- runner -// Uncaught extension errors that are known, tracked and deliberately -// tolerated, in the same spirit as ALLOWED_ERRORS in tests/e2e/harness.js: -// every entry names the issue that will delete it, and every occurrence is -// still printed, so tolerating one is visible in the log rather than silent. -// This is the only concession in an otherwise zero-tolerance policy. -const ALLOWED_ERRORS = [ - { - // The site-connection buttons in src/popup/views/approval.js send - // their decision and call window.close() on the next line. Firefox's - // BaseContext.wrapPromise reports, through Cu.reportError, any - // extension-API promise that settles after its context unloaded — - // whether or not the caller attached a handler, so notify()'s catch - // cannot suppress it. - // - // Pre-existing, and not introduced by the promise shim: the send was - // already unawaited, and this suite is merely the first thing to - // drive that window on Firefox. It is the same teardown ordering as - // the issue below, whose fix — making the outcome independent of when - // the popup closes — removes this entry with it. - pattern: /Promise (?:resolved|rejected) after context unloaded/, - source: /\/src\/popup\/index\.js$/, - issue: "https://git.eeqj.de/sneak/AutistMask/issues/275", - }, -]; - -function allowedFor(e) { - return ALLOWED_ERRORS.find( - (a) => a.pattern.test(e.msg) && a.source.test(e.src), - ); -} - function formatError(e) { return ( e.msg + " (" + e.src + ":" + e.line + (e.cat ? ", " + e.cat : "") + ")" @@ -1001,20 +970,6 @@ async function main() { installFailure = null; } - // Tolerated errors are set aside, never dropped: each one is - // printed with the issue that keeps it on the list, so the - // concession stays in the run output. - const tolerated = found.filter((e) => allowedFor(e)); - found = found.filter((e) => !allowedFor(e)); - for (const e of tolerated) { - console.log( - "# tolerated (" + - allowedFor(e).issue + - "): " + - formatError(e), - ); - } - // Any uncaught error from an extension source fails the step // that provoked it, whether or not its assertions passed. if (!failure && found.length > 0) { @@ -1039,13 +994,7 @@ async function main() { // blamed on any one step, but they are still reported and they // still fail the run. await sleep(1000); - const trailingAll = await errors.take(); - for (const e of trailingAll.filter((x) => allowedFor(x))) { - console.log( - "# tolerated (" + allowedFor(e).issue + "): " + formatError(e), - ); - } - const trailing = trailingAll.filter((e) => !allowedFor(e)); + const trailing = await errors.take(); console.log( "# " + (steps.length - failed) +