mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Bug 862395 - Part 5: Tests for web notifications requireInteraction. r=baku
--HG-- extra : rebase_source : fe0c215a45ad1b158469cef3e43887cebb9d286f extra : histedit_source : edf21f7a85cfeae449e1744b033f75f9c0018ef1
This commit is contained in:
parent
9899d20949
commit
5461c1c1c7
@ -10,6 +10,7 @@ support-files =
|
||||
[test_alerts.html]
|
||||
skip-if = toolkit == 'android'
|
||||
[test_alerts_noobserve.html]
|
||||
[test_alerts_requireinteraction.html]
|
||||
[test_image.html]
|
||||
[test_multiple_alerts.html]
|
||||
[test_principal.html]
|
||||
|
@ -0,0 +1,169 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test for alerts with requireInteraction</title>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||
</head>
|
||||
<body>
|
||||
<pre id="test">
|
||||
<script class="testbody" type="text/javascript">
|
||||
|
||||
const Cc = SpecialPowers.Cc;
|
||||
const Ci = SpecialPowers.Ci;
|
||||
|
||||
const chromeScript = SpecialPowers.loadChromeScript(_ => {
|
||||
const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
|
||||
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/Timer.jsm");
|
||||
|
||||
addMessageListener("waitForXULAlert", function() {
|
||||
var timer = setTimeout(function() {
|
||||
Services.ww.unregisterNotification(windowObserver);
|
||||
sendAsyncMessage("waitForXULAlert", false);
|
||||
}, 2000);
|
||||
|
||||
var windowObserver = function(aSubject, aTopic, aData) {
|
||||
if (aTopic != "domwindowopened") {
|
||||
return;
|
||||
}
|
||||
|
||||
var win = aSubject.QueryInterface(Ci.nsIDOMWindow);
|
||||
win.addEventListener("load", function onLoad() {
|
||||
win.removeEventListener("load", onLoad);
|
||||
let windowType = win.document.documentElement.getAttribute("windowtype");
|
||||
if (windowType == "alert:alert") {
|
||||
clearTimeout(timer);
|
||||
Services.ww.unregisterNotification(windowObserver);
|
||||
|
||||
sendAsyncMessage("waitForXULAlert", true);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
Services.ww.registerNotification(windowObserver);
|
||||
});
|
||||
});
|
||||
|
||||
var cookie = 0;
|
||||
function promiseCreateXULAlert(alertService, listener, name) {
|
||||
return new Promise(resolve => {
|
||||
chromeScript.addMessageListener("waitForXULAlert", function waitedForAlert(result) {
|
||||
chromeScript.removeMessageListener("waitForXULAlert", waitedForAlert);
|
||||
resolve(result);
|
||||
});
|
||||
|
||||
chromeScript.sendAsyncMessage("waitForXULAlert");
|
||||
alertService.showAlertNotification(null, "title", "body",
|
||||
true, cookie++, listener, name, null, null, null,
|
||||
null, false, true);
|
||||
});
|
||||
}
|
||||
|
||||
add_task(function* test_require_interaction() {
|
||||
if (!("@mozilla.org/alerts-service;1" in Cc)) {
|
||||
todo(false, "Alerts service does not exist in this application.");
|
||||
return;
|
||||
}
|
||||
|
||||
ok(true, "Alerts service exists in this application.");
|
||||
|
||||
var alertService;
|
||||
try {
|
||||
alertService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
|
||||
ok(true, "Alerts service is available.");
|
||||
} catch (ex) {
|
||||
todo(false, "Alerts service is not available.");
|
||||
return;
|
||||
}
|
||||
|
||||
yield SpecialPowers.pushPrefEnv({"set": [
|
||||
[ "dom.webnotifications.requireinteraction.enabled", true ],
|
||||
[ "dom.webnotifications.requireinteraction.count", 2 ]
|
||||
]});
|
||||
|
||||
var expectedSequence = [
|
||||
"first show",
|
||||
"second show",
|
||||
"second finished",
|
||||
"second replacement show",
|
||||
"third finished",
|
||||
"first finished",
|
||||
"third replacement show",
|
||||
"second replacement finished",
|
||||
"third replacement finished"
|
||||
];
|
||||
|
||||
var actualSequence = [];
|
||||
|
||||
var sequenceIdx = 0;
|
||||
function createAlertListener(name, showCallback, finishCallback) {
|
||||
return (subject, topic, data) => {
|
||||
if (topic == "alertshow") {
|
||||
actualSequence.push(name + " show");
|
||||
if (showCallback) {
|
||||
showCallback();
|
||||
}
|
||||
} else if (topic == "alertfinished") {
|
||||
actualSequence.push(name + " finished");
|
||||
if (finishCallback) {
|
||||
finishCallback();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var xulAlertCreated = yield promiseCreateXULAlert(alertService,
|
||||
createAlertListener("first"), "first");
|
||||
if (!xulAlertCreated) {
|
||||
ok(true, "Platform does not use XUL alerts.");
|
||||
alertService.closeAlert("first");
|
||||
return;
|
||||
}
|
||||
|
||||
xulAlertCreated = yield promiseCreateXULAlert(alertService,
|
||||
createAlertListener("second"), "second");
|
||||
ok(xulAlertCreated, "Create XUL alert");
|
||||
|
||||
// Replace second alert
|
||||
xulAlertCreated = yield promiseCreateXULAlert(alertService,
|
||||
createAlertListener("second replacement"), "second");
|
||||
ok(xulAlertCreated, "Create XUL alert");
|
||||
|
||||
var testFinishResolve;
|
||||
var testFinishPromise = new Promise((resolve) => { testFinishResolve = resolve; });
|
||||
|
||||
xulAlertCreated = yield promiseCreateXULAlert(alertService,
|
||||
createAlertListener("third"), "third"),
|
||||
ok(!xulAlertCreated, "XUL alert should not be visible");
|
||||
|
||||
// Replace the not-yet-visible third alert.
|
||||
xulAlertCreated = yield promiseCreateXULAlert(alertService,
|
||||
createAlertListener("third replacement",
|
||||
function showCallback() {
|
||||
alertService.closeAlert("second");
|
||||
alertService.closeAlert("third");
|
||||
},
|
||||
function finishCallback() {
|
||||
// Check actual sequence of alert events compared to expected sequence.
|
||||
for (var i = 0; i < actualSequence.length; i++) {
|
||||
is(actualSequence[i], expectedSequence[i],
|
||||
"Alert callback at index " + i + " should be in expected order.");
|
||||
}
|
||||
|
||||
testFinishResolve();
|
||||
}), "third");
|
||||
|
||||
ok(!xulAlertCreated, "XUL alert should not be visible");
|
||||
|
||||
alertService.closeAlert("first");
|
||||
|
||||
yield testFinishPromise;
|
||||
});
|
||||
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user