From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- dom/notification/test/browser/browser.toml | 4 + .../test/browser/browser_permission_dismiss.js | 231 +++++++++++++++++++++ dom/notification/test/browser/notification.html | 11 + 3 files changed, 246 insertions(+) create mode 100644 dom/notification/test/browser/browser.toml create mode 100644 dom/notification/test/browser/browser_permission_dismiss.js create mode 100644 dom/notification/test/browser/notification.html (limited to 'dom/notification/test/browser') diff --git a/dom/notification/test/browser/browser.toml b/dom/notification/test/browser/browser.toml new file mode 100644 index 0000000000..426a79b940 --- /dev/null +++ b/dom/notification/test/browser/browser.toml @@ -0,0 +1,4 @@ +[DEFAULT] + +["browser_permission_dismiss.js"] +support-files = ["notification.html"] diff --git a/dom/notification/test/browser/browser_permission_dismiss.js b/dom/notification/test/browser/browser_permission_dismiss.js new file mode 100644 index 0000000000..72b2db2827 --- /dev/null +++ b/dom/notification/test/browser/browser_permission_dismiss.js @@ -0,0 +1,231 @@ +"use strict"; + +const { PermissionTestUtils } = ChromeUtils.importESModule( + "resource://testing-common/PermissionTestUtils.sys.mjs" +); + +const ORIGIN_URI = Services.io.newURI("https://example.com"); +const PERMISSION_NAME = "desktop-notification"; +const PROMPT_ALLOW_BUTTON = -1; +const PROMPT_NOT_NOW_BUTTON = 0; +const PROMPT_NEVER_BUTTON = 1; +const TEST_URL = + "https://example.com/browser/dom/notification/test/browser/notification.html"; + +/** + * Clicks the specified web-notifications prompt button. + * + * @param {Number} aButtonIndex Number indicating which button to click. + * See the constants in this file. + * @note modified from toolkit/components/passwordmgr/test/browser/head.js + */ +function clickDoorhangerButton(aButtonIndex, browser) { + let popup = PopupNotifications.getNotification("web-notifications", browser); + let notifications = popup.owner.panel.childNodes; + ok(notifications.length, "at least one notification displayed"); + ok(true, notifications.length + " notification(s)"); + let notification = notifications[0]; + + if (aButtonIndex == PROMPT_ALLOW_BUTTON) { + ok(true, "Triggering main action (allow the permission)"); + notification.button.doCommand(); + } else if (aButtonIndex == PROMPT_NEVER_BUTTON) { + ok(true, "Triggering secondary action (deny the permission permanently)"); + notification.menupopup.querySelector("menuitem").doCommand(); + } else { + ok(true, "Triggering secondary action (deny the permission temporarily)"); + notification.secondaryButton.doCommand(); + } +} + +/** + * Opens a tab which calls `Notification.requestPermission()` with a callback + * argument, calls the `task` function while the permission prompt is open, + * and verifies that the expected permission is set. + * + * @param {Function} task Task function to run to interact with the prompt. + * @param {String} permission Expected permission value. + * @return {Promise} resolving when the task function is done and the tab + * closes. + */ +function tabWithRequest( + task, + permission, + browser = window.gBrowser, + privateWindow = false +) { + clearPermission(ORIGIN_URI, PERMISSION_NAME, privateWindow); + + return BrowserTestUtils.withNewTab( + { + gBrowser: browser, + url: TEST_URL, + }, + async function (linkedBrowser) { + let requestPromise = SpecialPowers.spawn( + linkedBrowser, + [ + { + permission, + }, + ], + async function ({ permission }) { + function requestCallback(perm) { + is( + perm, + permission, + "Should call the legacy callback with the permission state" + ); + } + let perm = await content.window.Notification.requestPermission( + requestCallback + ); + is( + perm, + permission, + "Should resolve the promise with the permission state" + ); + } + ); + + await task(linkedBrowser); + await requestPromise; + } + ); +} + +function clearPermission(origin, permissionName, isPrivate) { + let principal = Services.scriptSecurityManager.createContentPrincipal( + origin, + isPrivate ? { privateBrowsingId: 1 } : {} /* attrs */ + ); + PermissionTestUtils.remove(principal, permissionName); +} + +add_setup(async function () { + Services.prefs.setBoolPref( + "dom.webnotifications.requireuserinteraction", + false + ); + Services.prefs.setBoolPref( + "permissions.desktop-notification.notNow.enabled", + true + ); + SimpleTest.registerCleanupFunction(() => { + Services.prefs.clearUserPref("dom.webnotifications.requireuserinteraction"); + Services.prefs.clearUserPref( + "permissions.desktop-notification.notNow.enabled" + ); + + clearPermission(ORIGIN_URI, PERMISSION_NAME, false /* private origin */); + clearPermission(ORIGIN_URI, PERMISSION_NAME, true /* private origin */); + }); +}); + +add_task(async function test_requestPermission_granted() { + await tabWithRequest(async function (linkedBrowser) { + await BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown"); + clickDoorhangerButton(PROMPT_ALLOW_BUTTON, linkedBrowser); + }, "granted"); + + ok( + !PopupNotifications.getNotification("web-notifications"), + "Should remove the doorhanger notification icon if granted" + ); + + is( + PermissionTestUtils.testPermission(ORIGIN_URI, PERMISSION_NAME), + Services.perms.ALLOW_ACTION, + "Check permission in perm. manager" + ); +}); + +add_task(async function test_requestPermission_denied_temporarily() { + await tabWithRequest(async function (linkedBrowser) { + await BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown"); + clickDoorhangerButton(PROMPT_NOT_NOW_BUTTON, linkedBrowser); + }, "default"); + + ok( + !PopupNotifications.getNotification("web-notifications"), + "Should remove the doorhanger notification icon if denied" + ); + + is( + PermissionTestUtils.testPermission(ORIGIN_URI, PERMISSION_NAME), + Services.perms.UNKNOWN_ACTION, + "Check permission in perm. manager" + ); +}); + +add_task(async function test_requestPermission_denied_permanently() { + await tabWithRequest(async function (linkedBrowser) { + await BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown"); + clickDoorhangerButton(PROMPT_NEVER_BUTTON, linkedBrowser); + }, "denied"); + + ok( + !PopupNotifications.getNotification("web-notifications"), + "Should remove the doorhanger notification icon if denied" + ); + + is( + PermissionTestUtils.testPermission(ORIGIN_URI, PERMISSION_NAME), + Services.perms.DENY_ACTION, + "Check permission in perm. manager" + ); +}); + +add_task( + async function test_requestPermission_defaultPrivateNotificationsPref() { + ok( + !SpecialPowers.getBoolPref( + "dom.webnotifications.privateBrowsing.enableDespiteLimitations" + ), + "Pref should be default disabled" + ); + } +); + +add_task(async function test_requestPermission_privateNotifications() { + async function run(perm) { + let privateWindow = await BrowserTestUtils.openNewBrowserWindow({ + private: true, + }); + + await tabWithRequest( + async linkedBrowser => { + if (perm != Services.perms.UNKNOWN_ACTION) { + await BrowserTestUtils.waitForEvent( + privateWindow.PopupNotifications.panel, + "popupshown" + ); + + clickDoorhangerButton(PROMPT_ALLOW_BUTTON, linkedBrowser); + } + }, + perm == Services.perms.ALLOW_ACTION ? "granted" : "denied", + privateWindow.gBrowser, + true /* privateWindow */ + ); + + ok( + !PopupNotifications.getNotification( + "web-notifications", + privateWindow.gBrowser + ), + "doorhanger should have been removed in all cases by now" + ); + + await BrowserTestUtils.closeWindow(privateWindow); + } + + await run(Services.perms.UNKNOWN_ACTION); + + await SpecialPowers.pushPrefEnv({ + set: [ + ["dom.webnotifications.privateBrowsing.enableDespiteLimitations", true], + ], + }); + await run(Services.perms.ALLOW_ACTION); +}); diff --git a/dom/notification/test/browser/notification.html b/dom/notification/test/browser/notification.html new file mode 100644 index 0000000000..0ceeb8ea46 --- /dev/null +++ b/dom/notification/test/browser/notification.html @@ -0,0 +1,11 @@ + + + + + Notifications test + + + + + + -- cgit v1.2.3