forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			80 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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* (contentEvt) {
 | |
|         return yield new Promise(resolve => {
 | |
|           let contentNotification = content.wrappedJSObject._notification;
 | |
|           contentNotification.addEventListener(contentEvt, function l(event) {
 | |
|             contentNotification.removeEventListener(contentEvt, 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");
 | |
| });
 | 
