зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1592776 - Make test_notification_tag work with Fission. r=dom-workers-and-storage-reviewers,asuth
Differential Revision: https://phabricator.services.mozilla.com/D76824
This commit is contained in:
Родитель
09a4657e9c
Коммит
684ee14686
|
@ -16,4 +16,3 @@ scheme = https
|
|||
[test_notification_storage.html]
|
||||
[test_bug931307.html]
|
||||
[test_notification_tag.html]
|
||||
fail-if = fission
|
||||
|
|
|
@ -20,104 +20,125 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=782211
|
|||
</pre>
|
||||
<script type="text/javascript">
|
||||
/* eslint-disable mozilla/use-chromeutils-generateqi */
|
||||
const MOCK_CID = SpecialPowers.wrap(SpecialPowers.Components).ID(
|
||||
"{dbe37e64-d9a3-402c-8d8a-0826c619f7ad}"
|
||||
);
|
||||
const ALERTS_SERVICE_CONTRACT_ID = "@mozilla.org/alerts-service;1";
|
||||
|
||||
var mockAlertsService = {
|
||||
showAlert(alert, alertListener) {
|
||||
notificationsCreated.push(alert.name);
|
||||
if (notificationsCreated.length == 3) {
|
||||
checkNotifications();
|
||||
}
|
||||
},
|
||||
// The mock is not a general purpose mock, but is specific for this test.
|
||||
// It is always registered in the parent process using LoadChromeScript by
|
||||
// the MockAlertsService below, to allow this to work regardless of whether
|
||||
// the frames from different origins live in the same process or in different
|
||||
// processes (with Fission), since the default content-process alerts service
|
||||
// relays messages to the parent process.
|
||||
function mockServicesChromeScript() {
|
||||
const MOCK_CID = Components.ID("{dbe37e64-d9a3-402c-8d8a-0826c619f7ad}");
|
||||
const ALERTS_SERVICE_CONTRACT_ID = "@mozilla.org/alerts-service;1";
|
||||
|
||||
showAlertNotification(
|
||||
imageUrl,
|
||||
title,
|
||||
text,
|
||||
textClickable,
|
||||
cookie,
|
||||
alertListener,
|
||||
name,
|
||||
dir,
|
||||
lang,
|
||||
data
|
||||
) {
|
||||
this.showAlert({ name });
|
||||
},
|
||||
var notificationsCreated = [];
|
||||
|
||||
QueryInterface(aIID) {
|
||||
if (
|
||||
SpecialPowers.wrap(aIID).equals(SpecialPowers.Ci.nsISupports) ||
|
||||
SpecialPowers.wrap(aIID).equals(SpecialPowers.Ci.nsIAlertsService)
|
||||
const mockAlertsService = {
|
||||
showAlert(alert, alertListener) {
|
||||
notificationsCreated.push(alert.name);
|
||||
if (notificationsCreated.length == 3) {
|
||||
// notifications created by the test1 origin
|
||||
var test1notifications = [];
|
||||
// notifications created by the test2 origin
|
||||
var test2notifications = [];
|
||||
for (var i = 0; i < notificationsCreated.length; i++) {
|
||||
var notificationName = notificationsCreated[i];
|
||||
if (notificationName.includes("test1")) {
|
||||
test1notifications.push(notificationsCreated[i]);
|
||||
} else if (notificationName.includes("test2")) {
|
||||
test2notifications.push(notificationsCreated[i]);
|
||||
}
|
||||
}
|
||||
|
||||
is(
|
||||
test1notifications.length,
|
||||
2,
|
||||
"2 notifications should be created by test1.example.org:80 origin."
|
||||
);
|
||||
is(
|
||||
test1notifications[0],
|
||||
test1notifications[1],
|
||||
"notification names should be identical."
|
||||
);
|
||||
is(
|
||||
test2notifications.length,
|
||||
1,
|
||||
"1 notification should be created by test2.example.org:80 origin."
|
||||
);
|
||||
|
||||
// Register original alerts service.
|
||||
registrar.unregisterFactory(MOCK_CID, this);
|
||||
|
||||
sendAsyncMessage("mock-alert-service:unregistered");
|
||||
}
|
||||
},
|
||||
|
||||
showAlertNotification(
|
||||
imageUrl,
|
||||
title,
|
||||
text,
|
||||
textClickable,
|
||||
cookie,
|
||||
alertListener,
|
||||
name,
|
||||
dir,
|
||||
lang,
|
||||
data
|
||||
) {
|
||||
return this;
|
||||
}
|
||||
throw SpecialPowers.Components.results.NS_ERROR_NO_INTERFACE;
|
||||
},
|
||||
this.showAlert({ name });
|
||||
},
|
||||
|
||||
createInstance(aOuter, aIID) {
|
||||
if (aOuter != null) {
|
||||
throw SpecialPowers.Components.results.NS_ERROR_NO_AGGREGATION;
|
||||
QueryInterface(aIID) {
|
||||
if (aIID.equals(Ci.nsISupports) || aIID.equals(Ci.nsIAlertsService)) {
|
||||
return this;
|
||||
}
|
||||
throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
|
||||
},
|
||||
|
||||
createInstance(aOuter, aIID) {
|
||||
if (aOuter != null) {
|
||||
throw Components.Exception("", Cr.NS_ERROR_NO_AGGREGATION);
|
||||
}
|
||||
return this.QueryInterface(aIID);
|
||||
},
|
||||
};
|
||||
|
||||
const registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
|
||||
|
||||
registrar.registerFactory(
|
||||
MOCK_CID,
|
||||
"alerts service",
|
||||
ALERTS_SERVICE_CONTRACT_ID,
|
||||
mockAlertsService
|
||||
);
|
||||
|
||||
const { sendAsyncMessage } = this;
|
||||
|
||||
sendAsyncMessage("mock-alert-service:registered");
|
||||
}
|
||||
|
||||
const MockAlertsService = {
|
||||
async register() {
|
||||
if (this._chromeScript) {
|
||||
throw new Error("MockAlertsService already registered");
|
||||
}
|
||||
return this.QueryInterface(aIID);
|
||||
this._chromeScript = SpecialPowers.loadChromeScript(
|
||||
mockServicesChromeScript
|
||||
);
|
||||
await this._chromeScript.promiseOneMessage("mock-alert-service:registered");
|
||||
},
|
||||
async unregistered() {
|
||||
await this._chromeScript.promiseOneMessage(
|
||||
"mock-alert-service:unregistered"
|
||||
);
|
||||
},
|
||||
};
|
||||
mockAlertsService = SpecialPowers.wrapCallbackObject(mockAlertsService);
|
||||
|
||||
var notificationsCreated = [];
|
||||
function checkNotifications() {
|
||||
// notifications created by the test1 origin
|
||||
var test1notifications = [];
|
||||
// notifications created by the test2 origin
|
||||
var test2notifications = [];
|
||||
for (var i = 0; i < notificationsCreated.length; i++) {
|
||||
var notificationName = notificationsCreated[i];
|
||||
if (notificationName.includes("test1")) {
|
||||
test1notifications.push(notificationsCreated[i]);
|
||||
} else if (notificationName.includes("test2")) {
|
||||
test2notifications.push(notificationsCreated[i]);
|
||||
}
|
||||
}
|
||||
|
||||
is(
|
||||
test1notifications.length,
|
||||
2,
|
||||
"2 notifications should be created by test1.example.org:80 origin."
|
||||
);
|
||||
is(
|
||||
test1notifications[0],
|
||||
test1notifications[1],
|
||||
"notification names should be identical."
|
||||
);
|
||||
is(
|
||||
test2notifications.length,
|
||||
1,
|
||||
"1 notification should be created by test2.example.org:80 origin."
|
||||
);
|
||||
|
||||
// Register original alerts service.
|
||||
SpecialPowers.wrap(SpecialPowers.Components)
|
||||
.manager.QueryInterface(SpecialPowers.Ci.nsIComponentRegistrar)
|
||||
.unregisterFactory(MOCK_CID, mockAlertsService);
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
if (window.Notification) {
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
function showNotifications() {
|
||||
SpecialPowers.wrap(SpecialPowers.Components)
|
||||
.manager.QueryInterface(SpecialPowers.Ci.nsIComponentRegistrar)
|
||||
.registerFactory(
|
||||
MOCK_CID,
|
||||
"alerts service",
|
||||
ALERTS_SERVICE_CONTRACT_ID,
|
||||
mockAlertsService
|
||||
);
|
||||
async function showNotifications() {
|
||||
await MockAlertsService.register();
|
||||
|
||||
// Load two frames with the same origin that create notification with the same tag.
|
||||
// Both pages should generate notifications with the same name, and thus the second
|
||||
|
@ -130,6 +151,10 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=782211
|
|||
// The notification name should be different and thus no notifications should be replaced.
|
||||
frames.crossDomain.location.href =
|
||||
"http://test2.example.org:80/tests/dom/notification/test/mochitest/create_notification.html";
|
||||
|
||||
await MockAlertsService.unregistered();
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
SpecialPowers.pushPrefEnv(
|
||||
|
|
Загрузка…
Ссылка в новой задаче