mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-12 06:08:24 +02:00
Since JSWindowActors don't have direct access to synchronous messaging, ChromeScript callers are going to need to migrate to asynchronous messaging and queries instead. Since there's no comparable API to sendQuery for frame message managers, this patch adds a stub that uses synchronous messaging, but makes the API appear asynchronous, and migrates callers to use it instead of direct synchronous messaging. This will be replaced with a true synchronous API in the actor migration. Fortunately, most of the time, this actually leads to simpler code. The `sendQuery` API doesn't have the odd return value semantics of `sendSyncMessage`, and can usually just be used as a drop-in replacement. Many of the `sendSyncMessage` callers don't actually use the result, and can just be changed to `sendAsyncMessage`. And many of the existing async messaging users can be changed to just use `sendQuery` rather than sending messages and adding response listeners. However, the APZ code is an exception. It relies on intricate properties of the event loop, and doesn't have an easy way to slot in promise handlers, so I migrated it to using sync messaging via process message managers instead. Differential Revision: https://phabricator.services.mozilla.com/D35055 --HG-- extra : rebase_source : d5707e87f293a831a5cf2e0b0a7e977090267f78 extra : source : 75ebd6fce136ab3bd0e591c2b8b2d06d3b5bf923
93 lines
2.7 KiB
HTML
93 lines
2.7 KiB
HTML
<!DOCTYPE HTML>
|
|
<!-- Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ -->
|
|
<html>
|
|
<head>
|
|
<title>Test for Alerts Service</title>
|
|
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
|
</head>
|
|
|
|
<body>
|
|
<p id="display"></p>
|
|
|
|
<br>Alerts service, without observer "asynchronous" case.
|
|
<br>
|
|
<br>A notification should soon appear somewhere.
|
|
<br>If there has been no crash when the notification (later) disappears, assume all is good.
|
|
|
|
<pre id="test">
|
|
<script class="testbody" type="text/javascript">
|
|
/* eslint-env mozilla/frame-script */
|
|
|
|
const Cc = SpecialPowers.Cc;
|
|
const Ci = SpecialPowers.Ci;
|
|
|
|
const chromeScript = SpecialPowers.loadChromeScript(_ => {
|
|
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
|
const {setTimeout} = ChromeUtils.import("resource://gre/modules/Timer.jsm");
|
|
|
|
function anyXULAlertsVisible() {
|
|
var windows = Services.wm.getEnumerator("alert:alert");
|
|
return windows.hasMoreElements();
|
|
}
|
|
|
|
addMessageListener("anyXULAlertsVisible", anyXULAlertsVisible);
|
|
|
|
addMessageListener("waitForAlerts", function waitForAlerts() {
|
|
if (anyXULAlertsVisible()) {
|
|
setTimeout(waitForAlerts, 1000);
|
|
} else {
|
|
sendAsyncMessage("waitedForAlerts");
|
|
}
|
|
});
|
|
});
|
|
|
|
function waitForAlertsThenFinish() {
|
|
chromeScript.addMessageListener("waitedForAlerts", function waitedForAlerts() {
|
|
chromeScript.removeMessageListener("waitedForAlerts", waitedForAlerts);
|
|
ok(true, "Alert disappeared.");
|
|
SimpleTest.finish();
|
|
});
|
|
chromeScript.sendAsyncMessage("waitForAlerts");
|
|
}
|
|
|
|
async function runTest() {
|
|
var alertsVisible = await chromeScript.sendQuery("anyXULAlertsVisible");
|
|
ok(!alertsVisible, "Alerts should not be present at the start of the test.");
|
|
|
|
if (!("@mozilla.org/alerts-service;1" in Cc)) {
|
|
todo(false, "Alerts service does not exist in this application");
|
|
} else {
|
|
ok(true, "Alerts service exists in this application");
|
|
|
|
var notifier;
|
|
try {
|
|
notifier = Cc["@mozilla.org/alerts-service;1"].
|
|
getService(Ci.nsIAlertsService);
|
|
ok(true, "Alerts service is available");
|
|
} catch (ex) {
|
|
todo(false, "Alerts service is not available.", ex);
|
|
}
|
|
|
|
if (notifier) {
|
|
try {
|
|
notifier.showAlertNotification(null, "Notification test",
|
|
"This notification has no observer");
|
|
ok(true, "showAlertNotification() succeeded");
|
|
} catch (ex) {
|
|
todo(false, "showAlertNotification() failed.", ex);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
SimpleTest.requestFlakyTimeout("untriaged");
|
|
|
|
runTest();
|
|
setTimeout(waitForAlertsThenFinish, 1000);
|
|
</script>
|
|
</pre>
|
|
</body>
|
|
</html>
|