Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* Any copyright is dedicated to the Public Domain.
// 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;
});