185 lines
6.3 KiB
JavaScript
185 lines
6.3 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
// Tests that getBoxQuadsFromWindowOrigin works across process
|
|
// boundaries.
|
|
//
|
|
// The test forces a fission window, because there is some
|
|
// imprecision in the APZ transforms for non-fission windows,
|
|
// and the getBoxQuadsFromWindowOrigin is designed specifically
|
|
// to be used by a fission browser.
|
|
//
|
|
// This test embeds a number of documents within iframes,
|
|
// with a variety of borders and padding. Each iframe hosts
|
|
// a document in different domain than its container.
|
|
//
|
|
// The innermost documents have a 50px x 50px div with a
|
|
// 50px margin. So relative to its own iframe, the offset
|
|
// for the div should be 50, 50.
|
|
//
|
|
// Here's the embedding diagram:
|
|
// +-- A -----------------------------------------------------+
|
|
// | |
|
|
// | +- div -----+ |
|
|
// | | 100 x 100 | |
|
|
// | +-----------+ |
|
|
// | |
|
|
// | +- div 20px margin ------------------------------------+ |
|
|
// | | | |
|
|
// | | +- B: iframe 10px border -+ +- D: iframe 40px pad -+ | |
|
|
// | | | 250 x 250 | | 250 x 250 | | |
|
|
// | | | 50px margin | | 50px margin | | |
|
|
// | | | | | | | |
|
|
// | | | +- C: iframe ---+ | | +- E: iframe ---+ | | |
|
|
// | | | | 150 x 150 | | | | 150 x 150 | | | |
|
|
// | | | +---------------+ | | +---------------+ | | |
|
|
// | | +-------------------------+ +----------------------+ | |
|
|
// | +------------------------------------------------------+ |
|
|
// +----------------------------------------------------------+
|
|
//
|
|
// The following checks are made:
|
|
// C-div relative to A should have offset 130, 230.
|
|
// E-div relative to A should have offset 430, 260.
|
|
//
|
|
// This tests the most likely cases for the code that handles
|
|
// relativeToTopLevelBrowsingContextId. It does not check these
|
|
// cases:
|
|
// 1) A css-transform'ed iframe.
|
|
// 2) An abspos iframe.
|
|
// 3) An iframe embedded in an SVG.
|
|
|
|
"use strict";
|
|
/* import-globals-from ../../../../gfx/layers/apz/test/mochitest/apz_test_utils.js */
|
|
|
|
const TEST_URI = TEST_URI_ROOT_SSL + "doc_layoutHelpers_getBoxQuads2-a.html";
|
|
|
|
add_task(async function () {
|
|
info("Opening a fission window.");
|
|
const fissionWin = await BrowserTestUtils.openNewBrowserWindow({
|
|
remote: true,
|
|
fission: true,
|
|
});
|
|
|
|
info("Load APZ test utils.");
|
|
loadHelperScript(
|
|
"../../../../gfx/layers/apz/test/mochitest/apz_test_utils.js"
|
|
);
|
|
info("Load paint_listener.");
|
|
loadHelperScript("../../../../../tests/SimpleTest/paint_listener.js");
|
|
|
|
info("Open a new tab.");
|
|
const tab = await BrowserTestUtils.openNewForegroundTab(
|
|
fissionWin.gBrowser,
|
|
TEST_URI
|
|
);
|
|
|
|
info("Running tests");
|
|
|
|
ok(waitUntilApzStable, "waitUntilApzStable is defined.");
|
|
await waitUntilApzStable();
|
|
|
|
await ContentTask.spawn(tab.linkedBrowser, null, async function () {
|
|
const win = content.window;
|
|
const doc = content.document;
|
|
const refNode = doc.documentElement;
|
|
const iframeB = doc.getElementById("b");
|
|
const iframeD = doc.getElementById("d");
|
|
|
|
// Get the offset of the reference node to the window origin. We'll use
|
|
// this offset later to adjust the quads we get from the iframes.
|
|
const refQuad = refNode.getBoxQuadsFromWindowOrigin()[0];
|
|
const offsetX = refQuad.p1.x;
|
|
const offsetY = refQuad.p1.y;
|
|
info(`Reference node is offset (${offsetX}, ${offsetY}) from window.`);
|
|
|
|
function postAndReceiveMessage(iframe) {
|
|
return new Promise(resolve => {
|
|
const onmessage = event => {
|
|
if (event.data.quad) {
|
|
win.removeEventListener("message", onmessage);
|
|
resolve(event.data.quad);
|
|
}
|
|
};
|
|
win.addEventListener("message", onmessage, { capture: false });
|
|
iframe.contentWindow.postMessage({ callGetBoxQuads: true }, "*");
|
|
});
|
|
}
|
|
|
|
// Bug 1624659: Our checks are not always precise, though for these test
|
|
// cases they should align precisely to css pixels. For now we use an
|
|
// epsilon and a locally-defined isfuzzy to compensate. We can't use
|
|
// SimpleTest.isfuzzy, because it's not bridged to the ContentTask.
|
|
// If that is ever bridged, we can remove the isfuzzy definition here and
|
|
// everything should "just work".
|
|
function isfuzzy(actual, expected, epsilon, msg) {
|
|
if (actual >= expected - epsilon && actual <= expected + epsilon) {
|
|
ok(true, msg);
|
|
} else {
|
|
// This will trigger the usual failure message for is.
|
|
is(actual, expected, msg);
|
|
}
|
|
}
|
|
|
|
const ADDITIVE_EPSILON = 1;
|
|
const checksToMake = [
|
|
{
|
|
msg: "C-div",
|
|
iframe: iframeB,
|
|
left: 130,
|
|
top: 230,
|
|
right: 180,
|
|
bottom: 280,
|
|
},
|
|
{
|
|
msg: "E-div",
|
|
iframe: iframeD,
|
|
left: 430,
|
|
top: 260,
|
|
right: 480,
|
|
bottom: 310,
|
|
},
|
|
];
|
|
|
|
for (const { msg, iframe, left, top, right, bottom } of checksToMake) {
|
|
info("Checking " + msg + ".");
|
|
const quad = await postAndReceiveMessage(iframe);
|
|
const bounds = quad.getBounds();
|
|
info(
|
|
`Quad bounds is (${bounds.left}, ${bounds.top}) to (${bounds.right}, ${bounds.bottom}).`
|
|
);
|
|
isfuzzy(
|
|
bounds.left - offsetX,
|
|
left,
|
|
ADDITIVE_EPSILON,
|
|
msg + " quad left position is as expected."
|
|
);
|
|
isfuzzy(
|
|
bounds.top - offsetY,
|
|
top,
|
|
ADDITIVE_EPSILON,
|
|
msg + " quad top position is as expected."
|
|
);
|
|
isfuzzy(
|
|
bounds.right - offsetX,
|
|
right,
|
|
ADDITIVE_EPSILON,
|
|
msg + " quad right position is as expected."
|
|
);
|
|
isfuzzy(
|
|
bounds.bottom - offsetY,
|
|
bottom,
|
|
ADDITIVE_EPSILON,
|
|
msg + " quad bottom position is as expected."
|
|
);
|
|
}
|
|
});
|
|
|
|
fissionWin.gBrowser.removeCurrentTab();
|
|
|
|
await BrowserTestUtils.closeWindow(fissionWin);
|
|
|
|
// Clean up the properties added to window by paint_listener.js.
|
|
delete window.waitForAllPaintsFlushed;
|
|
delete window.waitForAllPaints;
|
|
delete window.promiseAllPaintsDone;
|
|
});
|