/* Tests the focus behavior of the identity popup. */ // Focusing on the identity box is handled by the ToolbarKeyboardNavigator // component (see browser/base/content/browser-toolbarKeyNav.js). async function focusIdentityBox() { gURLBar.inputField.focus(); is(document.activeElement, gURLBar.inputField, "urlbar should be focused"); const focused = BrowserTestUtils.waitForEvent( gIdentityHandler._identityIconBox, "focus" ); EventUtils.synthesizeKey("VK_TAB", { shiftKey: true }); EventUtils.synthesizeKey("ArrowRight"); await focused; } // Access the identity popup via mouseclick. Focus should not be moved inside. add_task(async function testIdentityPopupFocusClick() { await SpecialPowers.pushPrefEnv({ set: [["accessibility.tabfocus", 7]] }); await BrowserTestUtils.withNewTab("https://example.com", async function () { let shown = BrowserTestUtils.waitForEvent( window, "popupshown", true, event => event.target == gIdentityHandler._identityPopup ); EventUtils.synthesizeMouseAtCenter(gIdentityHandler._identityIconBox, {}); await shown; isnot( Services.focus.focusedElement, document.getElementById("identity-popup-security-button") ); }); }); // Access the identity popup via keyboard. Focus should be moved inside. add_task(async function testIdentityPopupFocusKeyboard() { await SpecialPowers.pushPrefEnv({ set: [["accessibility.tabfocus", 7]] }); await BrowserTestUtils.withNewTab("https://example.com", async function () { await focusIdentityBox(); let shown = BrowserTestUtils.waitForEvent( window, "popupshown", true, event => event.target == gIdentityHandler._identityPopup ); EventUtils.sendString(" "); await shown; is( Services.focus.focusedElement, document.getElementById("identity-popup-security-button") ); }); }); // Access the Site Security panel, then move focus with the tab key. // Tabbing should be able to reach the More Information button. add_task(async function testSiteSecurityTabOrder() { await SpecialPowers.pushPrefEnv({ set: [["accessibility.tabfocus", 7]] }); await BrowserTestUtils.withNewTab("https://example.com", async function () { // 1. Access the identity popup. await focusIdentityBox(); let shown = BrowserTestUtils.waitForEvent( window, "popupshown", true, event => event.target == gIdentityHandler._identityPopup ); EventUtils.sendString(" "); await shown; is( Services.focus.focusedElement, document.getElementById("identity-popup-security-button") ); // 2. Access the Site Security section. let securityView = document.getElementById("identity-popup-securityView"); shown = BrowserTestUtils.waitForEvent(securityView, "ViewShown"); EventUtils.sendString(" "); await shown; // 3. Custom root learn more info should be focused by default // This is probably not present in real-world scenarios, but needs to be present in our test infrastructure. let customRootLearnMore = document.getElementById( "identity-popup-custom-root-learn-more" ); is( Services.focus.focusedElement, customRootLearnMore, "learn more option for custom roots is focused" ); // 4. First press of tab should move to the More Information button. let moreInfoButton = document.getElementById("identity-popup-more-info"); let focused = BrowserTestUtils.waitForEvent( gIdentityHandler._identityPopup, "focusin" ); EventUtils.sendKey("tab"); await focused; is( Services.focus.focusedElement, moreInfoButton, "more info button is focused" ); // 5. Second press of tab should focus the Back button. let backButton = gIdentityHandler._identityPopup.querySelector( ".subviewbutton-back" ); // Wait for focus to move somewhere. We use focusin because focus doesn't bubble. focused = BrowserTestUtils.waitForEvent( gIdentityHandler._identityPopup, "focusin" ); EventUtils.sendKey("tab"); await focused; is(Services.focus.focusedElement, backButton, "back button is focused"); }); });