/* * This test checks that keyboard navigation for tabs isn't blocked by content */ add_task(async function test() { let testPage1 = "data:text/html,"; let testPage2 = "data:text/html,"; let testPage3 = "data:text/html,"; let tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, testPage1); let browser1 = gBrowser.getBrowserForTab(tab1); let tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser, testPage2); let tab3 = await BrowserTestUtils.openNewForegroundTab(gBrowser, testPage3); await SpecialPowers.pushPrefEnv({ set: [["browser.ctrlTab.sortByRecentlyUsed", false]], }); // Disable tab animations gReduceMotionOverride = true; gBrowser.selectedTab = tab1; browser1.focus(); is(gBrowser.selectedTab, tab1, "Tab1 should be activated"); EventUtils.synthesizeKey("VK_TAB", { ctrlKey: true }); is( gBrowser.selectedTab, tab2, "Tab2 should be activated by pressing Ctrl+Tab on Tab1" ); EventUtils.synthesizeKey("VK_TAB", { ctrlKey: true }); is( gBrowser.selectedTab, tab3, "Tab3 should be activated by pressing Ctrl+Tab on Tab2" ); EventUtils.synthesizeKey("VK_TAB", { ctrlKey: true, shiftKey: true }); is( gBrowser.selectedTab, tab2, "Tab2 should be activated by pressing Ctrl+Shift+Tab on Tab3" ); EventUtils.synthesizeKey("VK_TAB", { ctrlKey: true, shiftKey: true }); is( gBrowser.selectedTab, tab1, "Tab1 should be activated by pressing Ctrl+Shift+Tab on Tab2" ); gBrowser.selectedTab = tab1; browser1.focus(); is(gBrowser.selectedTab, tab1, "Tab1 should be activated"); EventUtils.synthesizeKey("VK_PAGE_DOWN", { ctrlKey: true }); is( gBrowser.selectedTab, tab2, "Tab2 should be activated by pressing Ctrl+PageDown on Tab1" ); EventUtils.synthesizeKey("VK_PAGE_DOWN", { ctrlKey: true }); is( gBrowser.selectedTab, tab3, "Tab3 should be activated by pressing Ctrl+PageDown on Tab2" ); EventUtils.synthesizeKey("VK_PAGE_UP", { ctrlKey: true }); is( gBrowser.selectedTab, tab2, "Tab2 should be activated by pressing Ctrl+PageUp on Tab3" ); EventUtils.synthesizeKey("VK_PAGE_UP", { ctrlKey: true }); is( gBrowser.selectedTab, tab1, "Tab1 should be activated by pressing Ctrl+PageUp on Tab2" ); if (gBrowser.tabbox._handleMetaAltArrows) { gBrowser.selectedTab = tab1; browser1.focus(); let ltr = window.getComputedStyle(gBrowser.tabbox).direction == "ltr"; let advanceKey = ltr ? "VK_RIGHT" : "VK_LEFT"; let reverseKey = ltr ? "VK_LEFT" : "VK_RIGHT"; is(gBrowser.selectedTab, tab1, "Tab1 should be activated"); EventUtils.synthesizeKey(advanceKey, { altKey: true, metaKey: true }); is( gBrowser.selectedTab, tab2, "Tab2 should be activated by pressing Ctrl+" + advanceKey + " on Tab1" ); EventUtils.synthesizeKey(advanceKey, { altKey: true, metaKey: true }); is( gBrowser.selectedTab, tab3, "Tab3 should be activated by pressing Ctrl+" + advanceKey + " on Tab2" ); EventUtils.synthesizeKey(reverseKey, { altKey: true, metaKey: true }); is( gBrowser.selectedTab, tab2, "Tab2 should be activated by pressing Ctrl+" + reverseKey + " on Tab3" ); EventUtils.synthesizeKey(reverseKey, { altKey: true, metaKey: true }); is( gBrowser.selectedTab, tab1, "Tab1 should be activated by pressing Ctrl+" + reverseKey + " on Tab2" ); } gBrowser.selectedTab = tab2; is(gBrowser.selectedTab, tab2, "Tab2 should be activated"); is(gBrowser.tabContainer.selectedIndex, 2, "Tab2 index should be 2"); EventUtils.synthesizeKey("VK_PAGE_DOWN", { ctrlKey: true, shiftKey: true }); is( gBrowser.selectedTab, tab2, "Tab2 should be activated after Ctrl+Shift+PageDown" ); is( gBrowser.tabContainer.selectedIndex, 3, "Tab2 index should be 1 after Ctrl+Shift+PageDown" ); EventUtils.synthesizeKey("VK_PAGE_UP", { ctrlKey: true, shiftKey: true }); is( gBrowser.selectedTab, tab2, "Tab2 should be activated after Ctrl+Shift+PageUp" ); is( gBrowser.tabContainer.selectedIndex, 2, "Tab2 index should be 2 after Ctrl+Shift+PageUp" ); if (navigator.platform.indexOf("Mac") == 0) { gBrowser.selectedTab = tab1; browser1.focus(); // XXX Currently, Command + "{" and "}" don't work if keydown event is // consumed because following keypress event isn't fired. let ltr = window.getComputedStyle(gBrowser.tabbox).direction == "ltr"; let advanceKey = ltr ? "}" : "{"; let reverseKey = ltr ? "{" : "}"; is(gBrowser.selectedTab, tab1, "Tab1 should be activated"); EventUtils.synthesizeKey(advanceKey, { metaKey: true }); is( gBrowser.selectedTab, tab2, "Tab2 should be activated by pressing Ctrl+" + advanceKey + " on Tab1" ); EventUtils.synthesizeKey(advanceKey, { metaKey: true }); is( gBrowser.selectedTab, tab3, "Tab3 should be activated by pressing Ctrl+" + advanceKey + " on Tab2" ); EventUtils.synthesizeKey(reverseKey, { metaKey: true }); is( gBrowser.selectedTab, tab2, "Tab2 should be activated by pressing Ctrl+" + reverseKey + " on Tab3" ); EventUtils.synthesizeKey(reverseKey, { metaKey: true }); is( gBrowser.selectedTab, tab1, "Tab1 should be activated by pressing Ctrl+" + reverseKey + " on Tab2" ); } else { gBrowser.selectedTab = tab2; EventUtils.synthesizeKey("VK_F4", { type: "keydown", ctrlKey: true }); isnot( gBrowser.selectedTab, tab2, "Tab2 should be closed by pressing Ctrl+F4 on Tab2" ); is( gBrowser.tabs.length, 3, "The count of tabs should be 3 since tab2 should be closed" ); // NOTE: keypress event shouldn't be fired since the keydown event should // be consumed by tab2. EventUtils.synthesizeKey("VK_F4", { type: "keyup", ctrlKey: true }); is( gBrowser.tabs.length, 3, "The count of tabs should be 3 since renaming key events shouldn't close other tabs" ); } gBrowser.selectedTab = tab3; while (gBrowser.tabs.length > 1) { gBrowser.removeCurrentTab(); } });