diff options
Diffstat (limited to 'browser/base/content/test/alerts/browser_notification_tab_switching.js')
-rw-r--r-- | browser/base/content/test/alerts/browser_notification_tab_switching.js | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/browser/base/content/test/alerts/browser_notification_tab_switching.js b/browser/base/content/test/alerts/browser_notification_tab_switching.js new file mode 100644 index 000000000..7e46c0722 --- /dev/null +++ b/browser/base/content/test/alerts/browser_notification_tab_switching.js @@ -0,0 +1,80 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +"use strict"; + +var tab; +var notification; +var notificationURL = "http://example.org/browser/browser/base/content/test/alerts/file_dom_notifications.html"; +var newWindowOpenedFromTab; + +add_task(function* test_notificationPreventDefaultAndSwitchTabs() { + let pm = Services.perms; + pm.add(makeURI(notificationURL), "desktop-notification", pm.ALLOW_ACTION); + + let originalTab = gBrowser.selectedTab; + yield BrowserTestUtils.withNewTab({ + gBrowser, + url: notificationURL + }, function* dummyTabTask(aBrowser) { + // Put new tab in background so it is obvious when it is re-focused. + yield BrowserTestUtils.switchTab(gBrowser, originalTab); + isnot(gBrowser.selectedBrowser, aBrowser, "Notification page loaded as a background tab"); + + // First, show a notification that will be have the tab-switching prevented. + function promiseNotificationEvent(evt) { + return ContentTask.spawn(aBrowser, evt, function* (evt) { + return yield new Promise(resolve => { + let notification = content.wrappedJSObject._notification; + notification.addEventListener(evt, function l(event) { + notification.removeEventListener(evt, l); + resolve({ defaultPrevented: event.defaultPrevented }); + }); + }); + }); + } + yield openNotification(aBrowser, "showNotification1"); + info("Notification alert showing"); + let alertWindow = Services.wm.getMostRecentWindow("alert:alert"); + if (!alertWindow) { + ok(true, "Notifications don't use XUL windows on all platforms."); + yield closeNotification(aBrowser); + return; + } + info("Clicking on notification"); + let promiseClickEvent = promiseNotificationEvent("click"); + + // NB: This executeSoon is needed to allow the non-e10s runs of this test + // a chance to set the event listener on the page. Otherwise, we + // synchronously fire the click event before we listen for the event. + executeSoon(() => { + EventUtils.synthesizeMouseAtCenter(alertWindow.document.getElementById("alertTitleLabel"), + {}, alertWindow); + }); + let clickEvent = yield promiseClickEvent; + ok(clickEvent.defaultPrevented, "The event handler for the first notification cancels the event"); + isnot(gBrowser.selectedBrowser, aBrowser, "Notification page still a background tab"); + let notificationClosed = promiseNotificationEvent("close"); + yield closeNotification(aBrowser); + yield notificationClosed; + + // Second, show a notification that will cause the tab to get switched. + yield openNotification(aBrowser, "showNotification2"); + alertWindow = Services.wm.getMostRecentWindow("alert:alert"); + let promiseTabSelect = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, "TabSelect"); + EventUtils.synthesizeMouseAtCenter(alertWindow.document.getElementById("alertTitleLabel"), + {}, + alertWindow); + yield promiseTabSelect; + is(gBrowser.selectedBrowser.currentURI.spec, notificationURL, + "Clicking on the second notification should select its originating tab"); + notificationClosed = promiseNotificationEvent("close"); + yield closeNotification(aBrowser); + yield notificationClosed; + }); +}); + +add_task(function* cleanup() { + Services.perms.remove(makeURI(notificationURL), "desktop-notification"); +}); |