/* 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_getBoxQuads1.html"; add_task(async function () { const tab = await addTab(TEST_URI); info("Running tests"); await SpecialPowers.spawn(tab.linkedBrowser, [], async function () { // This function allows the Content Task to easily call `FullZoom` API in // the parent process. function sendCommand(cmd) { return SpecialPowers.spawnChrome([cmd], async data => { const window = this.browsingContext.topChromeWindow; switch (data) { case "zoom-enlarge": window.FullZoom.enlarge(); break; case "zoom-reset": await window.FullZoom.reset(); break; case "zoom-reduce": window.FullZoom.reduce(); break; } }); } const doc = content.document; const { require } = ChromeUtils.importESModule( "resource://devtools/shared/loader/Loader.sys.mjs" ); const { getAdjustedQuads, } = require("resource://devtools/shared/layout/utils.js"); Assert.strictEqual( 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