forked from mirrors/gecko-dev
Depends on D126179 Differential Revision: https://phabricator.services.mozilla.com/D124063
244 lines
6.7 KiB
JavaScript
244 lines
6.7 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
// Test that the "orientationchange" event is fired when the "rotate button" is clicked.
|
|
|
|
// TODO: This test should also check that the orientation is set properly on the iframe.
|
|
// This is currently not working and should be worked on in Bug 1704830.
|
|
|
|
const TEST_DOCUMENT = `doc_with_remote_iframe_and_isolated_cross_origin_capabilities.sjs`;
|
|
const TEST_COM_URL = URL_ROOT_COM_SSL + TEST_DOCUMENT;
|
|
|
|
const testDevice = {
|
|
name: "Fake Phone RDM Test",
|
|
width: 320,
|
|
height: 570,
|
|
pixelRatio: 5.5,
|
|
userAgent: "Mozilla/5.0 (Mobile; rv:39.0) Gecko/39.0 Firefox/39.0",
|
|
touch: true,
|
|
firefoxOS: true,
|
|
os: "custom",
|
|
featured: true,
|
|
};
|
|
|
|
// Add the new device to the list
|
|
addDeviceForTest(testDevice);
|
|
|
|
addRDMTask(TEST_COM_URL, async function({ ui }) {
|
|
await pushPref("devtools.responsive.viewport.angle", 0);
|
|
|
|
info("Check the original orientation values before the orientationchange");
|
|
is(
|
|
await getScreenOrientationType(ui.getViewportBrowser()),
|
|
"portrait-primary",
|
|
"Primary orientation type is portrait-primary"
|
|
);
|
|
|
|
is(
|
|
await getScreenOrientationAngle(ui.getViewportBrowser()),
|
|
0,
|
|
"Original angle is set at 0 degrees"
|
|
);
|
|
|
|
info(
|
|
"Check that rotating the viewport does trigger an orientationchange event"
|
|
);
|
|
let waitForOrientationChangeEvent = isOrientationChangeEventEmitted(
|
|
ui.getViewportBrowser()
|
|
);
|
|
rotateViewport(ui);
|
|
is(
|
|
await waitForOrientationChangeEvent,
|
|
true,
|
|
"'orientationchange' event fired"
|
|
);
|
|
|
|
is(
|
|
await getScreenOrientationType(ui.getViewportBrowser()),
|
|
"landscape-primary",
|
|
"Orientation state was updated to landscape-primary"
|
|
);
|
|
|
|
is(
|
|
await getScreenOrientationAngle(ui.getViewportBrowser()),
|
|
90,
|
|
"Orientation angle was updated to 90 degrees"
|
|
);
|
|
|
|
info("Check that the viewport orientation values persist after reload");
|
|
await reloadBrowser();
|
|
|
|
is(
|
|
await getScreenOrientationType(ui.getViewportBrowser()),
|
|
"landscape-primary",
|
|
"Orientation is still landscape-primary"
|
|
);
|
|
is(
|
|
await getInitialScreenOrientationType(ui.getViewportBrowser()),
|
|
"landscape-primary",
|
|
"orientation type was set on the page very early in its lifecycle"
|
|
);
|
|
is(
|
|
await getScreenOrientationAngle(ui.getViewportBrowser()),
|
|
90,
|
|
"Orientation angle is still 90"
|
|
);
|
|
is(
|
|
await getInitialScreenOrientationAngle(ui.getViewportBrowser()),
|
|
90,
|
|
"orientation angle was set on the page early in its lifecycle"
|
|
);
|
|
|
|
info(
|
|
"Check that the viewport orientation values persist after navigating to a page that forces the creation of a new browsing context"
|
|
);
|
|
const browser = ui.getViewportBrowser();
|
|
const previousBrowsingContextId = browser.browsingContext.id;
|
|
const waitForReload = await watchForDevToolsReload(browser);
|
|
|
|
BrowserTestUtils.loadURI(
|
|
browser,
|
|
URL_ROOT_ORG_SSL + TEST_DOCUMENT + "?crossOriginIsolated=true"
|
|
);
|
|
await waitForReload();
|
|
|
|
isnot(
|
|
browser.browsingContext.id,
|
|
previousBrowsingContextId,
|
|
"A new browsing context was created"
|
|
);
|
|
|
|
is(
|
|
await getScreenOrientationType(ui.getViewportBrowser()),
|
|
"landscape-primary",
|
|
"Orientation is still landscape-primary after navigating to a new browsing context"
|
|
);
|
|
is(
|
|
await getInitialScreenOrientationType(ui.getViewportBrowser()),
|
|
"landscape-primary",
|
|
"orientation type was set on the page very early in its lifecycle"
|
|
);
|
|
is(
|
|
await getScreenOrientationAngle(ui.getViewportBrowser()),
|
|
90,
|
|
"Orientation angle is still 90 after navigating to a new browsing context"
|
|
);
|
|
is(
|
|
await getInitialScreenOrientationAngle(ui.getViewportBrowser()),
|
|
90,
|
|
"orientation angle was set on the page early in its lifecycle"
|
|
);
|
|
|
|
info(
|
|
"Check the orientationchange event is not dispatched when changing devices."
|
|
);
|
|
waitForOrientationChangeEvent = isOrientationChangeEventEmitted(
|
|
ui.getViewportBrowser()
|
|
);
|
|
|
|
await selectDevice(ui, testDevice.name);
|
|
is(
|
|
await waitForOrientationChangeEvent,
|
|
false,
|
|
"orientationchange event was not dispatched when changing devices"
|
|
);
|
|
|
|
info("Check the new orientation values after selecting device.");
|
|
is(
|
|
await getScreenOrientationType(ui.getViewportBrowser()),
|
|
"portrait-primary",
|
|
"New orientation type is portrait-primary"
|
|
);
|
|
|
|
is(
|
|
await getScreenOrientationAngle(ui.getViewportBrowser()),
|
|
0,
|
|
"Orientation angle is 0"
|
|
);
|
|
|
|
info(
|
|
"Check the orientationchange event is not dispatched when calling the command with the same orientation."
|
|
);
|
|
waitForOrientationChangeEvent = isOrientationChangeEventEmitted(
|
|
ui.getViewportBrowser()
|
|
);
|
|
|
|
// We're directly calling the command here as there's no way to do such action from the UI.
|
|
await ui.commands.targetConfigurationCommand.updateConfiguration({
|
|
rdmPaneOrientation: {
|
|
type: "portrait-primary",
|
|
angle: 0,
|
|
isViewportRotated: true,
|
|
},
|
|
});
|
|
is(
|
|
await waitForOrientationChangeEvent,
|
|
false,
|
|
"orientationchange event was not dispatched after trying to set the same orientation again"
|
|
);
|
|
});
|
|
|
|
function getScreenOrientationType(browserOrBrowsingContext) {
|
|
return SpecialPowers.spawn(browserOrBrowsingContext, [], () => {
|
|
return content.screen.orientation.type;
|
|
});
|
|
}
|
|
|
|
function getScreenOrientationAngle(browserOrBrowsingContext) {
|
|
return SpecialPowers.spawn(
|
|
browserOrBrowsingContext,
|
|
[],
|
|
() => content.screen.orientation.angle
|
|
);
|
|
}
|
|
|
|
function getInitialScreenOrientationType(browserOrBrowsingContext) {
|
|
return SpecialPowers.spawn(
|
|
browserOrBrowsingContext,
|
|
[],
|
|
() => content.wrappedJSObject.initialOrientationType
|
|
);
|
|
}
|
|
|
|
function getInitialScreenOrientationAngle(browserOrBrowsingContext) {
|
|
return SpecialPowers.spawn(
|
|
browserOrBrowsingContext,
|
|
[],
|
|
() => content.wrappedJSObject.initialOrientationAngle
|
|
);
|
|
}
|
|
|
|
async function isOrientationChangeEventEmitted(browserOrBrowsingContext) {
|
|
const onTimeout = wait(1000).then(() => "TIMEOUT");
|
|
const onOrientationChangeEvent = SpecialPowers.spawn(
|
|
browserOrBrowsingContext,
|
|
[],
|
|
() => {
|
|
content.eventController = new content.AbortController();
|
|
return new Promise(resolve => {
|
|
content.window.addEventListener(
|
|
"orientationchange",
|
|
() => {
|
|
resolve();
|
|
},
|
|
{
|
|
signal: content.eventController.signal,
|
|
once: true,
|
|
}
|
|
);
|
|
});
|
|
}
|
|
);
|
|
|
|
const result = await Promise.race([onTimeout, onOrientationChangeEvent]);
|
|
|
|
// Remove the event listener
|
|
await SpecialPowers.spawn(browserOrBrowsingContext, [], () => {
|
|
content.eventController.abort();
|
|
delete content.eventController;
|
|
});
|
|
|
|
return result !== "TIMEOUT";
|
|
}
|