Merge origin/next into issue-167-prune-branches
Brings in #490; the TODO.md Completed Steps conflict keeps both entries, this branch's on top. Model: opus-5-5
This commit is contained in:
@@ -603,14 +603,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
|
||||
|
||||
@@ -56,6 +56,14 @@ but the review is broader than any of them.
|
||||
`feature/show-private-key`, whose README clipboard policy section is not in
|
||||
`next`.
|
||||
|
||||
- 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 toolbar icons in `icons/` can be redrawn in the tree
|
||||
([#378](https://git.eeqj.de/sneak/AutistMask/issues/378)): `make icons` runs
|
||||
`script/lib/icons.js`, which draws the mark and writes each PNG with node's
|
||||
|
||||
@@ -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) +
|
||||
|
||||
Reference in New Issue
Block a user