mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-20 00:35:44 +00:00
f9f5914039
# ignore-this-changeset Differential Revision: https://phabricator.services.mozilla.com/D36041 --HG-- extra : source : 96b3895a3b2aa2fcb064c85ec5857b7216884556
290 lines
8.4 KiB
JavaScript
290 lines
8.4 KiB
JavaScript
/* 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,
|
|
"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 == 0,
|
|
"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,
|
|
"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.mainAction.disableHighlight = true;
|
|
this.notifyObj.secondaryActions = undefined;
|
|
this.notification = showNotification(this.notifyObj);
|
|
},
|
|
onShown(popup) {
|
|
checkPopup(popup, this.notifyObj);
|
|
dismissNotification(popup);
|
|
},
|
|
onHidden() {},
|
|
},
|
|
];
|