diff options
Diffstat (limited to 'browser/base/content/test/popupNotifications/browser_popupNotification_4.js')
-rw-r--r-- | browser/base/content/test/popupNotifications/browser_popupNotification_4.js | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/browser/base/content/test/popupNotifications/browser_popupNotification_4.js b/browser/base/content/test/popupNotifications/browser_popupNotification_4.js new file mode 100644 index 0000000000..b0e8f016ef --- /dev/null +++ b/browser/base/content/test/popupNotifications/browser_popupNotification_4.js @@ -0,0 +1,290 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +function test() { + waitForExplicitFinish(); + + ok(PopupNotifications, "PopupNotifications object exists"); + ok(PopupNotifications.panel, "PopupNotifications panel exists"); + + setup(); +} + +var tests = [ + // Popup Notifications main actions should catch exceptions from callbacks + { + id: "Test#1", + run() { + this.testNotif = new ErrorNotification(this.id); + showNotification(this.testNotif); + }, + onShown(popup) { + checkPopup(popup, this.testNotif); + triggerMainCommand(popup); + }, + onHidden(popup) { + ok(this.testNotif.mainActionClicked, "main action has been triggered"); + }, + }, + // Popup Notifications secondary actions should catch exceptions from callbacks + { + id: "Test#2", + run() { + this.testNotif = new ErrorNotification(this.id); + showNotification(this.testNotif); + }, + onShown(popup) { + checkPopup(popup, this.testNotif); + triggerSecondaryCommand(popup, 0); + }, + onHidden(popup) { + ok( + this.testNotif.secondaryActionClicked, + "secondary action has been triggered" + ); + }, + }, + // Existing popup notification shouldn't disappear when adding a dismissed notification + { + id: "Test#3", + run() { + this.notifyObj1 = new BasicNotification(this.id); + this.notifyObj1.id += "_1"; + this.notifyObj1.anchorID = "default-notification-icon"; + this.notification1 = showNotification(this.notifyObj1); + }, + onShown(popup) { + // Now show a dismissed notification, and check that it doesn't clobber + // the showing one. + this.notifyObj2 = new BasicNotification(this.id); + this.notifyObj2.id += "_2"; + this.notifyObj2.anchorID = "geo-notification-icon"; + this.notifyObj2.options.dismissed = true; + this.notification2 = showNotification(this.notifyObj2); + + checkPopup(popup, this.notifyObj1); + + // check that both anchor icons are showing + is( + document + .getElementById("default-notification-icon") + .getAttribute("showing"), + "true", + "notification1 anchor should be visible" + ); + is( + document + .getElementById("geo-notification-icon") + .getAttribute("showing"), + "true", + "notification2 anchor should be visible" + ); + + dismissNotification(popup); + }, + onHidden(popup) { + this.notification1.remove(); + this.notification2.remove(); + }, + }, + // Showing should be able to modify the popup data + { + id: "Test#4", + run() { + this.notifyObj = new BasicNotification(this.id); + let normalCallback = this.notifyObj.options.eventCallback; + this.notifyObj.options.eventCallback = function (eventName) { + if (eventName == "showing") { + this.mainAction.label = "Alternate Label"; + } + normalCallback.call(this, eventName); + }; + showNotification(this.notifyObj); + }, + onShown(popup) { + // checkPopup checks for the matching label. Note that this assumes that + // this.notifyObj.mainAction is the same as notification.mainAction, + // which could be a problem if we ever decided to deep-copy. + checkPopup(popup, this.notifyObj); + triggerMainCommand(popup); + }, + onHidden() {}, + }, + // Moving a tab to a new window should remove non-swappable notifications. + { + id: "Test#5", + async run() { + await BrowserTestUtils.openNewForegroundTab( + gBrowser, + // eslint-disable-next-line @microsoft/sdl/no-insecure-url + "http://example.com/" + ); + + let notifyObj = new BasicNotification(this.id); + + let shown = waitForNotificationPanel(); + showNotification(notifyObj); + await shown; + + let promiseWin = BrowserTestUtils.waitForNewWindow(); + gBrowser.replaceTabWithWindow(gBrowser.selectedTab); + let win = await promiseWin; + + let anchor = win.document.getElementById("default-notification-icon"); + win.PopupNotifications._reshowNotifications(anchor); + ok( + !win.PopupNotifications.panel.children.length, + "no notification displayed in new window" + ); + ok( + notifyObj.swappingCallbackTriggered, + "the swapping callback was triggered" + ); + ok( + notifyObj.removedCallbackTriggered, + "the removed callback was triggered" + ); + + await BrowserTestUtils.closeWindow(win); + await waitForWindowReadyForPopupNotifications(window); + + goNext(); + }, + }, + // Moving a tab to a new window should preserve swappable notifications. + { + id: "Test#6", + async run() { + await BrowserTestUtils.openNewForegroundTab( + gBrowser, + // eslint-disable-next-line @microsoft/sdl/no-insecure-url + "http://example.com/" + ); + let notifyObj = new BasicNotification(this.id); + let originalCallback = notifyObj.options.eventCallback; + notifyObj.options.eventCallback = function (eventName) { + originalCallback(eventName); + return eventName == "swapping"; + }; + + let shown = waitForNotificationPanel(); + let notification = showNotification(notifyObj); + await shown; + + let promiseWin = BrowserTestUtils.waitForNewWindow(); + gBrowser.replaceTabWithWindow(gBrowser.selectedTab); + let win = await promiseWin; + await waitForWindowReadyForPopupNotifications(win); + + await new Promise(resolve => { + let callback = notification.options.eventCallback; + notification.options.eventCallback = function (eventName) { + callback(eventName); + if (eventName == "shown") { + resolve(); + } + }; + info("Showing the notification again"); + notification.reshow(); + }); + + checkPopup(win.PopupNotifications.panel, notifyObj); + ok( + notifyObj.swappingCallbackTriggered, + "the swapping callback was triggered" + ); + + await BrowserTestUtils.closeWindow(win); + await waitForWindowReadyForPopupNotifications(window); + + goNext(); + }, + }, + // the main action callback can keep the notification. + { + id: "Test#8", + run() { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.mainAction.dismiss = true; + this.notification = showNotification(this.notifyObj); + }, + onShown(popup) { + checkPopup(popup, this.notifyObj); + triggerMainCommand(popup); + }, + onHidden(popup) { + ok( + this.notifyObj.dismissalCallbackTriggered, + "dismissal callback was triggered" + ); + ok( + !this.notifyObj.removedCallbackTriggered, + "removed callback wasn't triggered" + ); + this.notification.remove(); + }, + }, + // a secondary action callback can keep the notification. + { + id: "Test#9", + run() { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.secondaryActions[0].dismiss = true; + this.notification = showNotification(this.notifyObj); + }, + onShown(popup) { + checkPopup(popup, this.notifyObj); + triggerSecondaryCommand(popup, 0); + }, + onHidden(popup) { + ok( + this.notifyObj.dismissalCallbackTriggered, + "dismissal callback was triggered" + ); + ok( + !this.notifyObj.removedCallbackTriggered, + "removed callback wasn't triggered" + ); + this.notification.remove(); + }, + }, + // returning true in the showing callback should dismiss the notification. + { + id: "Test#10", + run() { + let notifyObj = new BasicNotification(this.id); + let originalCallback = notifyObj.options.eventCallback; + notifyObj.options.eventCallback = function (eventName) { + originalCallback(eventName); + return eventName == "showing"; + }; + + let notification = showNotification(notifyObj); + ok( + notifyObj.showingCallbackTriggered, + "the showing callback was triggered" + ); + ok( + !notifyObj.shownCallbackTriggered, + "the shown callback wasn't triggered" + ); + notification.remove(); + goNext(); + }, + }, + // the main action button should apply non-default(no highlight) style. + { + id: "Test#11", + run() { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.secondaryActions = undefined; + this.notification = showNotification(this.notifyObj); + }, + onShown(popup) { + checkPopup(popup, this.notifyObj); + dismissNotification(popup); + }, + onHidden() {}, + }, +]; |