summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/alerts/browser_notification_tab_switching.js
diff options
context:
space:
mode:
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.js80
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");
+});