/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function checkWarningState(aWarningElement, aExpectedState, aMsg) {
["hidden", "ontop", "onscreen"].forEach(state => {
is(
aWarningElement.hasAttribute(state),
state == aExpectedState,
`${aMsg} - check ${state} attribute.`
);
});
}
async function waitForWarningState(aWarningElement, aExpectedState) {
await BrowserTestUtils.waitForAttribute(aExpectedState, aWarningElement, "");
checkWarningState(
aWarningElement,
aExpectedState,
`Wait for ${aExpectedState} state`
);
}
add_setup(async function init() {
await SpecialPowers.pushPrefEnv({
set: [
["full-screen-api.enabled", true],
["full-screen-api.allow-trusted-requests-only", false],
],
});
});
add_task(async function test_fullscreen_display_none() {
await BrowserTestUtils.withNewTab(
{
gBrowser,
url: `data:text/html,
Fullscreen Test
`,
},
async function (browser) {
let warning = document.getElementById("fullscreen-warning");
checkWarningState(
warning,
"hidden",
"Should not show full screen warning initially"
);
let warningShownPromise = waitForWarningState(warning, "onscreen");
// Enter fullscreen
await SpecialPowers.spawn(browser, [], async () => {
let frame = content.document.querySelector("iframe");
frame.focus();
await SpecialPowers.spawn(frame, [], () => {
content.document.getElementById("request").click();
});
});
await warningShownPromise;
ok(true, "Fullscreen warning shown");
// Exit fullscreen
let exitFullscreenPromise = BrowserTestUtils.waitForEvent(
document,
"fullscreenchange",
false,
() => !document.fullscreenElement
);
document.getElementById("fullscreen-exit-button").click();
await exitFullscreenPromise;
checkWarningState(
warning,
"hidden",
"Should hide fullscreen warning after exiting fullscreen"
);
}
);
});
add_task(async function test_fullscreen_pointerlock_conflict() {
await BrowserTestUtils.withNewTab("https://example.com", async browser => {
let fsWarning = document.getElementById("fullscreen-warning");
let plWarning = document.getElementById("pointerlock-warning");
checkWarningState(
fsWarning,
"hidden",
"Should not show full screen warning initially"
);
checkWarningState(
plWarning,
"hidden",
"Should not show pointer lock warning initially"
);
let fsWarningShownPromise = waitForWarningState(fsWarning, "onscreen");
info("Entering full screen and pointer lock.");
await SpecialPowers.spawn(browser, [], async () => {
await content.document.body.requestFullscreen();
await content.document.body.requestPointerLock();
});
await fsWarningShownPromise;
checkWarningState(
plWarning,
"hidden",
"Should not show pointer lock warning"
);
info("Exiting pointerlock");
await SpecialPowers.spawn(browser, [], async () => {
await content.document.exitPointerLock();
});
checkWarningState(
fsWarning,
"onscreen",
"Should still show full screen warning"
);
checkWarningState(
plWarning,
"hidden",
"Should not show pointer lock warning"
);
// Cleanup
info("Exiting fullscreen");
await document.exitFullscreen();
});
});
// https://bugzilla.mozilla.org/show_bug.cgi?id=1821884
add_task(async function test_reshow_fullscreen_notification() {
await BrowserTestUtils.withNewTab("https://example.com", async browser => {
let newWin = await BrowserTestUtils.openNewBrowserWindow();
let fsWarning = document.getElementById("fullscreen-warning");
info("Entering full screen and wait for the fullscreen warning to appear.");
await SimpleTest.promiseFocus(window);
await Promise.all([
waitForWarningState(fsWarning, "onscreen"),
BrowserTestUtils.waitForEvent(fsWarning, "transitionend"),
SpecialPowers.spawn(browser, [], async () => {
content.document.body.requestFullscreen();
}),
]);
info(
"Switch focus away from the fullscreen window, the fullscreen warning should still hide automatically."
);
await Promise.all([
waitForWarningState(fsWarning, "hidden"),
SimpleTest.promiseFocus(newWin),
]);
info(
"Switch focus back to the fullscreen window, the fullscreen warning should show again."
);
await Promise.all([
waitForWarningState(fsWarning, "onscreen"),
SimpleTest.promiseFocus(window),
]);
info("Wait for fullscreen warning timed out.");
await waitForWarningState(fsWarning, "hidden");
info("The fullscreen warning should not show again.");
await SimpleTest.promiseFocus(newWin);
await SimpleTest.promiseFocus(window);
await new Promise(resolve => {
requestAnimationFrame(() => {
requestAnimationFrame(resolve);
});
});
checkWarningState(
fsWarning,
"hidden",
"The fullscreen warning should not show."
);
info("Close new browser window.");
await BrowserTestUtils.closeWindow(newWin);
info("Exit fullscreen.");
await document.exitFullscreen();
});
});
add_task(async function test_fullscreen_reappear() {
await BrowserTestUtils.withNewTab("https://example.com", async browser => {
let fsWarning = document.getElementById("fullscreen-warning");
info("Entering full screen and wait for the fullscreen warning to appear.");
await Promise.all([
waitForWarningState(fsWarning, "onscreen"),
SpecialPowers.spawn(browser, [], async () => {
content.document.body.requestFullscreen();
}),
]);
info("Wait for fullscreen warning timed out.");
await waitForWarningState(fsWarning, "hidden");
info("Move mouse to the top of screen.");
await Promise.all([
waitForWarningState(fsWarning, "ontop"),
EventUtils.synthesizeMouse(document.documentElement, 100, 0, {
type: "mousemove",
}),
]);
info("Wait for fullscreen warning timed out again.");
await waitForWarningState(fsWarning, "hidden");
info("Exit fullscreen.");
await document.exitFullscreen();
});
});
// https://bugzilla.mozilla.org/show_bug.cgi?id=1847901
add_task(async function test_fullscreen_warning_disabled() {
// Disable fullscreen warning
await SpecialPowers.pushPrefEnv({
set: [["full-screen-api.warning.timeout", 0]],
});
await BrowserTestUtils.withNewTab("https://example.com", async browser => {
let newWin = await BrowserTestUtils.openNewBrowserWindow();
let fsWarning = document.getElementById("fullscreen-warning");
let mut = new MutationObserver(mutations => {
ok(false, `${mutations[0].attributeName} attribute should not change`);
});
mut.observe(fsWarning, {
attributeFilter: ["hidden", "onscreen", "ontop"],
});
info("Entering full screen.");
await SimpleTest.promiseFocus(window);
await SpecialPowers.spawn(browser, [], async () => {
return content.document.body.requestFullscreen();
});
// Wait a bit to ensure no state change.
await new Promise(resolve => {
requestAnimationFrame(() => {
requestAnimationFrame(resolve);
});
});
info("The fullscreen warning should still not show after switching focus.");
await SimpleTest.promiseFocus(newWin);
await SimpleTest.promiseFocus(window);
// Wait a bit to ensure no state change.
await new Promise(resolve => {
requestAnimationFrame(() => {
requestAnimationFrame(resolve);
});
});
mut.disconnect();
info("Close new browser window.");
await BrowserTestUtils.closeWindow(newWin);
info("Exit fullscreen.");
await document.exitFullscreen();
});
// Revert the setting to avoid affecting subsequent tests.
await SpecialPowers.popPrefEnv();
});