summaryrefslogtreecommitdiffstats
path: root/browser/base
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base')
-rw-r--r--browser/base/content/browser-fullScreenAndPointerLock.js3
-rw-r--r--browser/base/content/test/fullscreen/browser_fullscreen_permissions_prompt.js130
2 files changed, 133 insertions, 0 deletions
diff --git a/browser/base/content/browser-fullScreenAndPointerLock.js b/browser/base/content/browser-fullScreenAndPointerLock.js
index 29183138c7..82d5727f14 100644
--- a/browser/base/content/browser-fullScreenAndPointerLock.js
+++ b/browser/base/content/browser-fullScreenAndPointerLock.js
@@ -255,6 +255,9 @@ var PointerlockFsWarning = {
if (this._state == "hiding") {
this._element.hidden = true;
}
+ if (this._state == "onscreen") {
+ window.dispatchEvent(new CustomEvent("FullscreenWarningOnScreen"));
+ }
break;
}
case "activate": {
diff --git a/browser/base/content/test/fullscreen/browser_fullscreen_permissions_prompt.js b/browser/base/content/test/fullscreen/browser_fullscreen_permissions_prompt.js
index 82f0c97631..70dab99276 100644
--- a/browser/base/content/test/fullscreen/browser_fullscreen_permissions_prompt.js
+++ b/browser/base/content/test/fullscreen/browser_fullscreen_permissions_prompt.js
@@ -158,3 +158,133 @@ add_task(async function test_permission_prompt_closes_fullscreen() {
BrowserTestUtils.removeTab(tab);
await SpecialPowers.popPrefEnv();
});
+
+function triggerMainCommand(popup) {
+ let notifications = popup.childNodes;
+ ok(!!notifications.length, "at least one notification displayed");
+ let notification = notifications[0];
+ info("Triggering main command for notification " + notification.id);
+ EventUtils.synthesizeMouseAtCenter(notification.button, {});
+}
+
+add_task(
+ async function test_permission_prompt_closes_fullscreen_and_extends_security_delay() {
+ const TEST_SECURITY_DELAY = 500;
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.webnotifications.requireuserinteraction", false],
+ ["permissions.fullscreen.allowed", false],
+ ["security.notification_enable_delay", TEST_SECURITY_DELAY],
+ // macOS is not affected by the sec delay bug because it uses the native
+ // macOS full screen API. Revert back to legacy behavior so we can also
+ // test on macOS. If this pref is removed in the future we can consider
+ // skipping the testcase for macOS altogether.
+ ["full-screen-api.macos-native-full-screen", false],
+ ],
+ });
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "https://example.com"
+ );
+ let browser = tab.linkedBrowser;
+ info("Entering DOM full-screen");
+ await changeFullscreen(browser, true);
+
+ let popupShown = BrowserTestUtils.waitForPopupEvent(
+ window.PopupNotifications.panel,
+ "shown"
+ );
+ let fullScreenExit = waitForFullScreenState(browser, false);
+
+ info("Requesting notification permission");
+ requestNotificationPermission(browser).catch(() => {});
+ await popupShown;
+
+ let notificationHiddenPromise = BrowserTestUtils.waitForPopupEvent(
+ window.PopupNotifications.panel,
+ "hidden"
+ );
+
+ info("Waiting for full-screen exit");
+ await fullScreenExit;
+
+ info("Wait for original security delay to expire.");
+ SimpleTest.requestFlakyTimeout(
+ "Wait for original security delay to expire."
+ );
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, TEST_SECURITY_DELAY));
+
+ info(
+ "Trigger main action via button click during the extended security delay"
+ );
+ triggerMainCommand(PopupNotifications.panel);
+
+ let notification = PopupNotifications.getNotification(
+ "web-notifications",
+ gBrowser.selectedBrowser
+ );
+
+ // Linux in CI seems to skip the full screen animation, which means its not
+ // affected by the bug and we can't test extension of the sec delay here.
+ if (Services.appinfo.OS == "Linux") {
+ todo(
+ notification &&
+ !notification.dismissed &&
+ BrowserTestUtils.is_visible(PopupNotifications.panel.firstChild),
+ "Notification should still be open because we clicked during the security delay."
+ );
+ } else {
+ ok(
+ notification &&
+ !notification.dismissed &&
+ BrowserTestUtils.is_visible(PopupNotifications.panel.firstChild),
+ "Notification should still be open because we clicked during the security delay."
+ );
+ }
+
+ // If the notification is no longer shown (test failure) skip the remaining
+ // checks.
+ if (!notification) {
+ // Cleanup
+ BrowserTestUtils.removeTab(tab);
+ await SpecialPowers.popPrefEnv();
+ // Remove the granted notification permission.
+ Services.perms.removeAll();
+ return;
+ }
+
+ Assert.greater(
+ notification.timeShown,
+ performance.now(),
+ "Notification timeShown property should be in the future, because the security delay was extended."
+ );
+
+ // Ensure that once the security delay has passed the notification can be
+ // closed again.
+ let fakeTimeShown = TEST_SECURITY_DELAY + 500;
+ info(`Manually set timeShown to ${fakeTimeShown}ms in the past.`);
+ notification.timeShown = performance.now() - fakeTimeShown;
+
+ info("Trigger main action via button click outside security delay");
+ triggerMainCommand(PopupNotifications.panel);
+
+ info("Wait for panel to be hidden.");
+ await notificationHiddenPromise;
+
+ ok(
+ !PopupNotifications.getNotification(
+ "web-notifications",
+ gBrowser.selectedBrowser
+ ),
+ "Should not longer see the notification."
+ );
+
+ // Cleanup
+ BrowserTestUtils.removeTab(tab);
+ await SpecialPowers.popPrefEnv();
+ // Remove the granted notification permission.
+ Services.perms.removeAll();
+ }
+);