diff options
Diffstat (limited to 'browser/base/content/test/tabPrompts/browser_openPromptInBackgroundTab.js')
-rw-r--r-- | browser/base/content/test/tabPrompts/browser_openPromptInBackgroundTab.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/browser/base/content/test/tabPrompts/browser_openPromptInBackgroundTab.js b/browser/base/content/test/tabPrompts/browser_openPromptInBackgroundTab.js new file mode 100644 index 000000000..d244d157a --- /dev/null +++ b/browser/base/content/test/tabPrompts/browser_openPromptInBackgroundTab.js @@ -0,0 +1,66 @@ +"use strict"; + +const ROOT = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://example.com/"); +let pageWithAlert = ROOT + "openPromptOffTimeout.html"; + +registerCleanupFunction(function() { + Services.perms.removeAll(makeURI(pageWithAlert)); +}); + +/* + * This test opens a tab that alerts when it is hidden. We then switch away + * from the tab, and check that by default the tab is not automatically + * re-selected. We also check that a checkbox appears in the alert that allows + * the user to enable this automatically re-selecting. We then check that + * checking the checkbox does actually enable that behaviour. + */ +add_task(function*() { + yield SpecialPowers.pushPrefEnv({"set": [["browser.tabs.dontfocusfordialogs", true]]}); + let firstTab = gBrowser.selectedTab; + // load page that opens prompt when page is hidden + let openedTab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, pageWithAlert, true); + let openedTabGotAttentionPromise = BrowserTestUtils.waitForAttribute("attention", openedTab, "true"); + // switch away from that tab again - this triggers the alert. + yield BrowserTestUtils.switchTab(gBrowser, firstTab); + // ... but that's async on e10s... + yield openedTabGotAttentionPromise; + // check for attention attribute + is(openedTab.getAttribute("attention"), "true", "Tab with alert should have 'attention' attribute."); + ok(!openedTab.selected, "Tab with alert should not be selected"); + + // switch tab back, and check the checkbox is displayed: + yield BrowserTestUtils.switchTab(gBrowser, openedTab); + // check the prompt is there, and the extra row is present + let prompts = openedTab.linkedBrowser.parentNode.querySelectorAll("tabmodalprompt"); + is(prompts.length, 1, "There should be 1 prompt"); + let ourPrompt = prompts[0]; + let row = ourPrompt.querySelector("row"); + ok(row, "Should have found the row with our checkbox"); + let checkbox = row.querySelector("checkbox[label*='example.com']"); + ok(checkbox, "The checkbox should be there"); + ok(!checkbox.checked, "Checkbox shouldn't be checked"); + // tick box and accept dialog + checkbox.checked = true; + ourPrompt.onButtonClick(0); + // Wait for that click to actually be handled completely. + yield new Promise(function(resolve) { + Services.tm.mainThread.dispatch(resolve, Ci.nsIThread.DISPATCH_NORMAL); + }); + // check permission is set + let ps = Services.perms; + is(ps.ALLOW_ACTION, ps.testPermission(makeURI(pageWithAlert), "focus-tab-by-prompt"), + "Tab switching should now be allowed"); + + let openedTabSelectedPromise = BrowserTestUtils.waitForAttribute("selected", openedTab, "true"); + // switch to other tab again + yield BrowserTestUtils.switchTab(gBrowser, firstTab); + + // This is sync in non-e10s, but in e10s we need to wait for this, so yield anyway. + // Note that the switchTab promise doesn't actually guarantee anything about *which* + // tab ends up as selected when its event fires, so using that here wouldn't work. + yield openedTabSelectedPromise; + // should be switched back + ok(openedTab.selected, "Ta-dah, the other tab should now be selected again!"); + + yield BrowserTestUtils.removeTab(openedTab); +}); |