diff options
Diffstat (limited to 'browser/base/content/test/general/browser_documentnavigation.js')
-rw-r--r-- | browser/base/content/test/general/browser_documentnavigation.js | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/browser/base/content/test/general/browser_documentnavigation.js b/browser/base/content/test/general/browser_documentnavigation.js new file mode 100644 index 000000000..eb789d076 --- /dev/null +++ b/browser/base/content/test/general/browser_documentnavigation.js @@ -0,0 +1,266 @@ +/* + * This test checks that focus is adjusted properly in a browser when pressing F6 and Shift+F6. + * There are additional tests in dom/tests/mochitest/chrome/test_focus_docnav.xul which test + * non-browser cases. + */ + +var testPage1 = "data:text/html,<html id='html1'><body id='body1'><button id='button1'>Tab 1</button></body></html>"; +var testPage2 = "data:text/html,<html id='html2'><body id='body2'><button id='button2'>Tab 2</button></body></html>"; +var testPage3 = "data:text/html,<html id='html3'><body id='body3' contenteditable='true'><button id='button3'>Tab 3</button></body></html>"; + +var fm = Services.focus; + +function* expectFocusOnF6(backward, expectedDocument, expectedElement, onContent, desc) +{ + let focusChangedInChildResolver = null; + let focusPromise = onContent ? new Promise(resolve => focusChangedInChildResolver = resolve) : + BrowserTestUtils.waitForEvent(window, "focus", true); + + function focusChangedListener(msg) { + let expected = expectedDocument; + if (!expectedElement.startsWith("html")) { + expected += "," + expectedElement; + } + + is(msg.data.details, expected, desc + " child focus matches"); + focusChangedInChildResolver(); + } + + if (onContent) { + messageManager.addMessageListener("BrowserTest:FocusChanged", focusChangedListener); + + yield ContentTask.spawn(gBrowser.selectedBrowser, { expectedElementId: expectedElement }, function* (arg) { + let contentExpectedElement = content.document.getElementById(arg.expectedElementId); + if (!contentExpectedElement) { + // Element not found, so look in the child frames. + for (let f = 0; f < content.frames.length; f++) { + if (content.frames[f].document.getElementById(arg.expectedElementId)) { + contentExpectedElement = content.frames[f].document; + break; + } + } + } + else if (contentExpectedElement.localName == "html") { + contentExpectedElement = contentExpectedElement.ownerDocument; + } + + if (!contentExpectedElement) { + sendSyncMessage("BrowserTest:FocusChanged", + { details : "expected element " + arg.expectedElementId + " not found" }); + return; + } + + contentExpectedElement.addEventListener("focus", function focusReceived() { + contentExpectedElement.removeEventListener("focus", focusReceived, true); + + const contentFM = Components.classes["@mozilla.org/focus-manager;1"]. + getService(Components.interfaces.nsIFocusManager); + let details = contentFM.focusedWindow.document.documentElement.id; + if (contentFM.focusedElement) { + details += "," + contentFM.focusedElement.id; + } + + sendSyncMessage("BrowserTest:FocusChanged", { details : details }); + }, true); + }); + } + + EventUtils.synthesizeKey("VK_F6", { shiftKey: backward }); + yield focusPromise; + + if (typeof expectedElement == "string") { + expectedElement = fm.focusedWindow.document.getElementById(expectedElement); + } + + if (gMultiProcessBrowser && onContent) { + expectedDocument = "main-window"; + expectedElement = gBrowser.selectedBrowser; + } + + is(fm.focusedWindow.document.documentElement.id, expectedDocument, desc + " document matches"); + is(fm.focusedElement, expectedElement, desc + " element matches"); + + if (onContent) { + messageManager.removeMessageListener("BrowserTest:FocusChanged", focusChangedListener); + } +} + +// Load a page and navigate between it and the chrome window. +add_task(function* () +{ + let page1Promise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + gBrowser.selectedBrowser.loadURI(testPage1); + yield page1Promise; + + // When the urlbar is focused, pressing F6 should focus the root of the content page. + gURLBar.focus(); + yield* expectFocusOnF6(false, "html1", "html1", + true, "basic focus content page"); + + // When the content is focused, pressing F6 should focus the urlbar. + yield* expectFocusOnF6(false, "main-window", gURLBar.inputField, + false, "basic focus content page urlbar"); + + // When a button in content is focused, pressing F6 should focus the urlbar. + yield* expectFocusOnF6(false, "html1", "html1", + true, "basic focus content page with button focused"); + + yield ContentTask.spawn(gBrowser.selectedBrowser, { }, function* () { + return content.document.getElementById("button1").focus(); + }); + + yield* expectFocusOnF6(false, "main-window", gURLBar.inputField, + false, "basic focus content page with button focused urlbar"); + + // The document root should be focused, not the button + yield* expectFocusOnF6(false, "html1", "html1", + true, "basic focus again content page with button focused"); + + // Check to ensure that the root element is focused + yield ContentTask.spawn(gBrowser.selectedBrowser, { }, function* () { + Assert.ok(content.document.activeElement == content.document.documentElement, + "basic focus again content page with button focused child root is focused"); + }); +}); + +// Open a second tab. Document focus should skip the background tab. +add_task(function* () +{ + yield BrowserTestUtils.openNewForegroundTab(gBrowser, testPage2); + + yield* expectFocusOnF6(false, "main-window", gURLBar.inputField, + false, "basic focus content page and second tab urlbar"); + yield* expectFocusOnF6(false, "html2", "html2", + true, "basic focus content page with second tab"); + + yield BrowserTestUtils.removeTab(gBrowser.selectedTab); +}); + +// Shift+F6 should navigate backwards. There's only one document here so the effect +// is the same. +add_task(function* () +{ + gURLBar.focus(); + yield* expectFocusOnF6(true, "html1", "html1", + true, "back focus content page"); + yield* expectFocusOnF6(true, "main-window", gURLBar.inputField, + false, "back focus content page urlbar"); +}); + +// Open the sidebar and navigate between the sidebar, content and top-level window +add_task(function* () +{ + let sidebar = document.getElementById("sidebar"); + + let loadPromise = BrowserTestUtils.waitForEvent(sidebar, "load", true); + SidebarUI.toggle('viewBookmarksSidebar'); + yield loadPromise; + + + gURLBar.focus(); + yield* expectFocusOnF6(false, "bookmarksPanel", + sidebar.contentDocument.getElementById("search-box").inputField, + false, "focus with sidebar open sidebar"); + yield* expectFocusOnF6(false, "html1", "html1", + true, "focus with sidebar open content"); + yield* expectFocusOnF6(false, "main-window", gURLBar.inputField, + false, "focus with sidebar urlbar"); + + // Now go backwards + yield* expectFocusOnF6(true, "html1", "html1", + true, "back focus with sidebar open content"); + yield* expectFocusOnF6(true, "bookmarksPanel", + sidebar.contentDocument.getElementById("search-box").inputField, + false, "back focus with sidebar open sidebar"); + yield* expectFocusOnF6(true, "main-window", gURLBar.inputField, + false, "back focus with sidebar urlbar"); + + SidebarUI.toggle('viewBookmarksSidebar'); +}); + +// Navigate when the downloads panel is open +add_task(function* () +{ + yield pushPrefs(["accessibility.tabfocus", 7]); + + let popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown", true); + EventUtils.synthesizeMouseAtCenter(document.getElementById("downloads-button"), { }); + yield popupShownPromise; + + gURLBar.focus(); + yield* expectFocusOnF6(false, "main-window", document.getElementById("downloadsHistory"), + false, "focus with downloads panel open panel"); + yield* expectFocusOnF6(false, "html1", "html1", + true, "focus with downloads panel open"); + yield* expectFocusOnF6(false, "main-window", gURLBar.inputField, + false, "focus downloads panel open urlbar"); + + // Now go backwards + yield* expectFocusOnF6(true, "html1", "html1", + true, "back focus with downloads panel open"); + yield* expectFocusOnF6(true, "main-window", document.getElementById("downloadsHistory"), + false, "back focus with downloads panel open"); + yield* expectFocusOnF6(true, "main-window", gURLBar.inputField, + false, "back focus downloads panel open urlbar"); + + let downloadsPopup = document.getElementById("downloadsPanel"); + let popupHiddenPromise = BrowserTestUtils.waitForEvent(downloadsPopup, "popuphidden", true); + downloadsPopup.hidePopup(); + yield popupHiddenPromise; +}); + +// Navigation with a contenteditable body +add_task(function* () +{ + yield BrowserTestUtils.openNewForegroundTab(gBrowser, testPage3); + + // The body should be focused when it is editable, not the root. + gURLBar.focus(); + yield* expectFocusOnF6(false, "html3", "body3", + true, "focus with contenteditable body"); + yield* expectFocusOnF6(false, "main-window", gURLBar.inputField, + false, "focus with contenteditable body urlbar"); + + // Now go backwards + + yield* expectFocusOnF6(false, "html3", "body3", + true, "back focus with contenteditable body"); + yield* expectFocusOnF6(false, "main-window", gURLBar.inputField, + false, "back focus with contenteditable body urlbar"); + + yield BrowserTestUtils.removeTab(gBrowser.selectedTab); +}); + +// Navigation with a frameset loaded +add_task(function* () +{ + yield BrowserTestUtils.openNewForegroundTab(gBrowser, + "http://mochi.test:8888/browser/browser/base/content/test/general/file_documentnavigation_frameset.html"); + + gURLBar.focus(); + yield* expectFocusOnF6(false, "htmlframe1", "htmlframe1", + true, "focus on frameset frame 0"); + yield* expectFocusOnF6(false, "htmlframe2", "htmlframe2", + true, "focus on frameset frame 1"); + yield* expectFocusOnF6(false, "htmlframe3", "htmlframe3", + true, "focus on frameset frame 2"); + yield* expectFocusOnF6(false, "htmlframe4", "htmlframe4", + true, "focus on frameset frame 3"); + yield* expectFocusOnF6(false, "main-window", gURLBar.inputField, + false, "focus on frameset frame urlbar"); + + yield* expectFocusOnF6(true, "htmlframe4", "htmlframe4", + true, "back focus on frameset frame 3"); + yield* expectFocusOnF6(true, "htmlframe3", "htmlframe3", + true, "back focus on frameset frame 2"); + yield* expectFocusOnF6(true, "htmlframe2", "htmlframe2", + true, "back focus on frameset frame 1"); + yield* expectFocusOnF6(true, "htmlframe1", "htmlframe1", + true, "back focus on frameset frame 0"); + yield* expectFocusOnF6(true, "main-window", gURLBar.inputField, + false, "back focus on frameset frame urlbar"); + + yield BrowserTestUtils.removeTab(gBrowser.selectedTab); +}); + +// XXXndeakin add tests for browsers inside of panels |