Bug 1948752 - Part 1: Throw TypeError when failing to create notification r=asuth
Currently we expose nsresult there. Differential Revision: https://phabricator.services.mozilla.com/D248924
This commit is contained in:
committed by
krosylight@mozilla.com
parent
8f81cf5c44
commit
a4ab12c86b
@@ -183,9 +183,14 @@ nsresult NotificationParent::HandleAlertTopic(AlertTopic aTopic) {
|
||||
// alertshow happens first before alertfinished, and it should have
|
||||
// nullified mResolver. If not it means it failed to show and is bailing
|
||||
// out.
|
||||
// XXX: Apparently XUL manual do not disturb mode does this without firing
|
||||
// alertshow at all.
|
||||
mResolver.take().value()(CopyableErrorResult(NS_ERROR_FAILURE));
|
||||
// NOTE(krosylight): The spec does not define what to do when a
|
||||
// permission-granted notification fails to open, we throw TypeError here
|
||||
// as that's the error for when permission is denied.
|
||||
CopyableErrorResult rv;
|
||||
rv.ThrowTypeError(
|
||||
"Failed to show notification, potentially because the browser did "
|
||||
"not have the corresponding OS-level permission."_ns);
|
||||
mResolver.take().value()(rv);
|
||||
}
|
||||
|
||||
// Unpersisted already and being unregistered already by nsIAlertsService
|
||||
|
||||
@@ -29,6 +29,11 @@ function mockServicesChromeScript() {
|
||||
// fake async alert show event
|
||||
if (listener) {
|
||||
setTimeout(() => {
|
||||
if (this.mockFailure) {
|
||||
listener.observe(null, "alertfinished", alert.cookie);
|
||||
return;
|
||||
}
|
||||
|
||||
listener.observe(null, "alertshow", alert.cookie);
|
||||
if (this.autoClick) {
|
||||
let subject;
|
||||
@@ -142,6 +147,10 @@ function mockServicesChromeScript() {
|
||||
mockAlertsService.autoClick = action || true;
|
||||
});
|
||||
|
||||
addMessageListener("mock-alert-service:mock-failure", action => {
|
||||
mockAlertsService.mockFailure = action || true;
|
||||
});
|
||||
|
||||
addMessageListener("mock-alert-service:get-notification-ids", () =>
|
||||
Object.keys(activeNotifications)
|
||||
);
|
||||
@@ -206,6 +215,12 @@ const MockAlertsService = {
|
||||
action
|
||||
);
|
||||
},
|
||||
async mockFailure(action) {
|
||||
await this._chromeScript.sendQuery(
|
||||
"mock-alert-service:mock-failure",
|
||||
action
|
||||
);
|
||||
},
|
||||
async getNotificationIds() {
|
||||
return await this._chromeScript.sendQuery(
|
||||
"mock-alert-service:get-notification-ids"
|
||||
|
||||
@@ -101,6 +101,7 @@ async function setupServiceWorker(src, scope) {
|
||||
SimpleTest.registerCleanupFunction(async () => {
|
||||
await registration.unregister();
|
||||
});
|
||||
return registration;
|
||||
}
|
||||
|
||||
async function testFrame(src, args) {
|
||||
|
||||
@@ -11,7 +11,14 @@ prefs = [
|
||||
["test_notification_basics.html"]
|
||||
skip-if = [
|
||||
"xorigin", # Bug 1792790
|
||||
"os == 'android'", # Bug 1816427, Notification.onshow/close are broken on Android
|
||||
"os == 'android'", # Bug 1948752, Notification.onshow/close are broken on Android
|
||||
]
|
||||
|
||||
["test_notification_browser_failure.html"]
|
||||
support-files = ["notification_empty_sw.js"]
|
||||
skip-if = [
|
||||
"xorigin", # Bug 1792790
|
||||
"os == 'android'", # Bug 1948752, Notification.onshow/close are broken on Android
|
||||
]
|
||||
|
||||
["test_notification_crossorigin_iframe.html"]
|
||||
@@ -93,13 +100,13 @@ support-files = ["create_notification.html"]
|
||||
|
||||
["test_notification_worker.html"]
|
||||
skip-if = [
|
||||
"os == 'android'", # Bug 1816427, Notification.onshow/close are broken on Android
|
||||
"os == 'android'", # Bug 1948752, Notification.onshow/close are broken on Android
|
||||
]
|
||||
support-files = ["notification_worker.js"]
|
||||
|
||||
["test_notification_worker_child.html"]
|
||||
skip-if = [
|
||||
"os == 'android'", # Bug 1816427, Notification.onshow/close are broken on Android
|
||||
"os == 'android'", # Bug 1948752, Notification.onshow/close are broken on Android
|
||||
]
|
||||
support-files = [
|
||||
"notification_worker_child-child.js",
|
||||
@@ -108,7 +115,7 @@ support-files = [
|
||||
|
||||
["test_notification_worker_click.html"]
|
||||
skip-if = [
|
||||
"os == 'android'", # Bug 1816427, Notification.onshow/close are broken on Android
|
||||
"os == 'android'", # Bug 1948752, Notification.onshow/close are broken on Android
|
||||
]
|
||||
|
||||
["test_notification_worker_permission.html"]
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script src="/tests/dom/serviceworkers/test/utils.js"></script>
|
||||
<script src="MockAlertsService.js"></script>
|
||||
<script src="NotificationTest.js"></script>
|
||||
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
|
||||
<script class="testbody">
|
||||
add_task(async function test_notification_browser_failure() {
|
||||
/** @type {ServiceWorkerRegistration} */
|
||||
const registration = await setupServiceWorker("notification_empty_sw.js", ".")
|
||||
await MockAlertsService.mockFailure();
|
||||
|
||||
try {
|
||||
await registration.showNotification("This must not succeed");
|
||||
ok(false, "showNotification after mockFailure unexpectedly succeeded");
|
||||
} catch (err) {
|
||||
is(err.constructor, TypeError, "It should throw TypeError");
|
||||
ok(
|
||||
err.message.includes("Failed to show notification"),
|
||||
`Failing with the proper error message, got: ${err.message}`
|
||||
);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user