/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ // Tests getAdjustedQuads works properly in a variety of use cases including // iframes, scroll and zoom "use strict"; const TEST_URI = TEST_URI_ROOT + "doc_layoutHelpers-getBoxQuads.html"; add_task(async function() { const tab = await addTab(TEST_URI); info("Running tests"); // `FullZoom` isn't available from the ContentTask. This code is defined by browser // frontend and runs in the parent process. Here, we use the message manager // to allow the Content Task to call this zoom helper whenever it needs to. const mm = tab.linkedBrowser.messageManager; mm.addMessageListener("devtools-test:command", async function({ data }) { switch (data) { case "zoom-enlarge": window.FullZoom.enlarge(); break; case "zoom-reset": await window.FullZoom.reset(); break; case "zoom-reduce": window.FullZoom.reduce(); break; } mm.sendAsyncMessage("devtools-test:done"); }); await ContentTask.spawn(tab.linkedBrowser, null, async function() { // This function allows the Content Task to easily call `FullZoom` API via // the message manager. function sendCommand(cmd) { const onDone = new Promise(done => { addMessageListener("devtools-test:done", function listener() { removeMessageListener("devtools-test:done", listener); done(); }); }); sendAsyncMessage("devtools-test:command", cmd); return onDone; } const doc = content.document; const { require } = ChromeUtils.import( "resource://devtools/shared/Loader.jsm" ); const { getAdjustedQuads } = require("devtools/shared/layout/utils"); ok(typeof getAdjustedQuads === "function", "getAdjustedQuads is defined"); returnsTheRightDataStructure(); isEmptyForMissingNode(); isEmptyForHiddenNodes(); defaultsToBorderBoxIfNoneProvided(); returnsLikeGetBoxQuadsInSimpleCase(); takesIframesOffsetsIntoAccount(); takesScrollingIntoAccount(); await takesZoomIntoAccount(); returnsMultipleItemsForWrappingInlineElements(); function returnsTheRightDataStructure() { info("Checks that the returned data contains bounds and 4 points"); const node = doc.querySelector("body"); const [res] = getAdjustedQuads(doc.defaultView, node, "content"); ok("bounds" in res, "The returned data has a bounds property"); ok("p1" in res, "The returned data has a p1 property"); ok("p2" in res, "The returned data has a p2 property"); ok("p3" in res, "The returned data has a p3 property"); ok("p4" in res, "The returned data has a p4 property"); for (const boundProp of [ "bottom", "top", "right", "left", "width", "height", "x", "y", ]) { ok( boundProp in res.bounds, "The bounds has a " + boundProp + " property" ); } for (const point of ["p1", "p2", "p3", "p4"]) { for (const pointProp of ["x", "y", "z", "w"]) { ok( pointProp in res[point], point + " has a " + pointProp + " property" ); } } } function isEmptyForMissingNode() { info("Checks that null is returned for invalid nodes"); for (const input of [null, undefined, "", 0]) { is( getAdjustedQuads(doc.defaultView, input).length, 0, "A 0-length array is returned for input " + input ); } } function isEmptyForHiddenNodes() { info("Checks that null is returned for nodes that aren't rendered"); const style = doc.querySelector("#styles"); is( getAdjustedQuads(doc.defaultView, style).length, 0, "null is returned for a