Closed Bug 1974953 Opened 1 year ago Closed 24 days ago

Intermittent browser/components/extensions/test/browser/browser_unified_extensions_doorhangers_install.js | single tracking bug

Categories

(WebExtensions :: Untriaged, defect, P5)

defect

Tracking

(firefox156 fixed)

RESOLVED FIXED
156 Branch
Tracking Status
firefox156 --- fixed

People

(Reporter: intermittent-bug-filer, Assigned: florian)

References

(Blocks 1 open bug)

Details

(Keywords: intermittent-failure, intermittent-testcase)

Attachments

(2 files)

Filed by: smolnar [at] mozilla.com
Parsed log: https://treeherder.mozilla.org/logviewer?job_id=515659230&repo=autoland
Full log: https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/UJLwES-oTHSL8oGXEs8MMg/runs/0/artifacts/public/logs/live_backing.log


TEST-PASS | browser/components/extensions/test/browser/browser_unified_extensions_doorhangers_install.js | extensions_button.temporarily_unhidden has expected counters on its labels - {"addon_install_doorhanger":1,"extension_permission_prompt":1} deepEqual {"addon_install_doorhanger":1,"extension_permission_prompt":1} - 
[task 2025-07-01T06:25:58.160+00:00] 06:25:58     INFO - Buffered messages finished
[task 2025-07-01T06:25:58.161+00:00] 06:25:58     INFO - TEST-UNEXPECTED-FAIL | browser/components/extensions/test/browser/browser_unified_extensions_doorhangers_install.js | Node is not focusable via the accessibility API: id: , tagName: button, className: popup-notification-primary-button primary footer-button - 
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - Stack trace:
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/browser-test.js:test_ok:1661
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/tests/SimpleTest/AccessibilityUtils.js:a11yFail:760
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/tests/SimpleTest/AccessibilityUtils.js:assertFocusable:807
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/tests/SimpleTest/AccessibilityUtils.js:assertCanBeClicked:1178
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/tests/SimpleTest/AccessibilityUtils.js:runIfA11YChecks/this.AccessibilityUtils:1145
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/tests/SimpleTest/AccessibilityUtils.js:handleEvent:1264
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochitests/content/browser/browser/components/extensions/test/browser/browser_unified_extensions_doorhangers_install.js:do_test_addon_install_with_hidden_extensions_button:63
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochitests/content/browser/browser/components/extensions/test/browser/browser_unified_extensions_doorhangers_install.js:test_addon_download_install_when_button_is_hidden:85
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/browser-test.js:handleTask:1205
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/browser-test.js:_runTaskBasedTest:1277
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/browser-test.js:Tester_execTest:1418
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/browser-test.js:nextTest/<:1194
[task 2025-07-01T06:25:58.162+00:00] 06:25:58     INFO - chrome://mochikit/content/tests/SimpleTest/SimpleTest.js:SimpleTest.waitForFocus/<:1058
[task 2025-07-01T06:25:58.163+00:00] 06:25:58     INFO - TEST-PASS | browser/components/extensions/test/browser/browser_unified_extensions_doorhangers_install.js | Extensions button should be hidden - 

This passed when run in confirm failure mode (rerun the test 4x in the same session).

This indicates that the test is probably a lower frequency intermittent and harder to reproduce/debug.

Whiteboard: [collect_confirm_failure]

promisePopupNotificationShown resolves from a popupshown listener and
checks only PopupNotifications.isPanelOpen, which is also true while the
panel is in the "showing" state
(toolkit/modules/PopupNotifications.sys.mjs:737). In that state
nsMenuPopupFrame::IsOpen() is false, so everything inside the panel is
states::INVISIBLE (accessible/generic/LocalAccessible.cpp:298-301) and not
focusable (nsIFrame::IsVisibleConsideringAncestors,
layout/generic/nsIFrame.cpp:359-363). A popupshown queued for one showing
can be delivered while the frame is back in ePopupShowing, so a test that
waits for popupshown and then clicks a button in the panel trips the a11y
check with the misleading "Node is not focusable via the accessibility
API".

Gate these four copies on panel.state == "open" instead: the same guard in
each, against the window the helper was given where it takes one, as bug
2056652 did for the update doorhanger tests, which moved them to
BrowserTestUtils.waitForPopupEvent(); that helper checks the state up
front but not again on the event. AccessibilityUtils.js is untouched, so
no a11y signal is lost.

BrowserTestUtils.waitForPopupEvent() itself is deliberately left alone:
looping there until the state matches would hang if a popup never reaches
ePopupShown.

Measured locally on two cores with --enable-a11y-checks and software
WebRender, browser_unified_extensions_doorhangers_install.js failed at
iteration 66 of 150 before this change and passed 400/400 after.

Assignee: nobody → florian
Status: NEW → ASSIGNED

browser/base/content/test/webrtc/head.js has its own copy of
promisePopupNotificationShown, which resolves from a popupshown listener
that checks only PopupNotifications.isPanelOpen. That is also true while
the panel is in the "showing" state
(toolkit/modules/PopupNotifications.sys.mjs:737), where
nsMenuPopupFrame::IsOpen() is false, so everything inside the panel is
states::INVISIBLE (accessible/generic/LocalAccessible.cpp:298-301) and not
focusable, and a test that clicks a button in the panel trips the a11y
check with the misleading "Node is not focusable via the accessibility
API".

Gate it on panel.state == "open", as the other copies now are. Here that
means the listener can be called for a popupshown it must not resolve on,
so it is restructured from a once-only anonymous listener into a
re-armable named one: a popupshown for a panel that is not open yet
re-arms the wait instead of consuming it. Its three assertions are
unchanged.

This changes when the 123 promisePopupNotificationShown call sites in this
directory resolve. A popupshown that arrives while the panel is not open
no longer resolves the helper; it keeps waiting for the next one, and a
test whose panel never reaches ePopupShown would now time out instead of
clicking an invisible node.

Blocks: 2062142
Pushed by fqueze@mozilla.com: https://github.com/mozilla-firefox/firefox/commit/fcb868bd2f42 https://hg.mozilla.org/integration/autoland/rev/0b3c3144e4fc Gate promisePopupNotificationShown on the notification panel being open, r=extension-reviewers,rpl. https://github.com/mozilla-firefox/firefox/commit/66314471ff8c https://hg.mozilla.org/integration/autoland/rev/4818200ae077 Re-arm the webrtc promisePopupNotificationShown listener when the panel is not open yet, r=extension-reviewers,rpl.
Status: ASSIGNED → RESOLVED
Closed: 24 days ago
Resolution: --- → FIXED
Target Milestone: --- → 156 Branch
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: