/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
// Test that the node picker works while reloading a page with
// an iframe going through an intermediate about:blank document
const FRAME_URL = "https://example.com/document-builder.sjs?html=iframe";
const TEST_URL =
`https://example.org/document-builder.sjs?html=` +
encodeURI(
`
Pick target
Other element
`
);
async function waitForIframeLoad() {
const iframeBC = await SpecialPowers.spawn(
gBrowser.selectedBrowser,
[],
function () {
return content.document.querySelector("iframe").browsingContext;
}
);
await SpecialPowers.spawn(iframeBC, [FRAME_URL], async function (url) {
if (
content.document.readyState == "complete" &&
content.location.href == url
) {
return null;
}
return new Promise(resolve => {
content.addEventListener("load", resolve, { once: true });
});
});
}
add_task(async () => {
let { inspector, toolbox, highlighterTestFront } =
await openInspectorForURL(TEST_URL);
await waitForIframeLoad();
info(
"Start the picker and hover an element to populate the picker hovered node reference"
);
await startPicker(toolbox);
await hoverElement(inspector, "iframe");
const HIGHLIGHTER_TYPE = inspector.highlighters.TYPES.BOXMODEL;
const { getActiveHighlighter } = getHighlighterTestHelpers(inspector);
ok(getActiveHighlighter(HIGHLIGHTER_TYPE), "Boxmodel highlighter is shown.");
ok(
await highlighterTestFront.assertHighlightedNode("iframe"),
"The highlighter is shown on the expected node"
);
// Do not wait for full reload as the faulty target for transient about:blank
// document may already be destroyed and not cause troubles anymore
const onReloaded = reloadSelectedTab();
// Bug 2003810: hovering during the navigation may throw error in the content process,
// but this exception wouldn't make the test fail anyway.
hoverElement(inspector, "h1");
await onReloaded;
// As the previous hover may not complete, we have to do another one once the page is loaded
await hoverElement(inspector, "h1");
ok(getActiveHighlighter(HIGHLIGHTER_TYPE), "Boxmodel highlighter is shown.");
highlighterTestFront = await getHighlighterTestFront(toolbox);
ok(
await highlighterTestFront.assertHighlightedNode("h1"),
"The highlighter is shown on the expected node"
);
await stopPickerWithEscapeKey(toolbox);
// Bug 2003810 highlighted that the toolbox couldn't be re-opened
// as the broken, not correctly unregistered/disabled node-picker was keeping
// its suppressedEventListener active and possibly disable all further key presses.
// But there is no way to reproduce the exact same keypress event.
// BrowserTestUtils.synthesizeKey/EventUtils.synthesizeNativeKey both seem to send the event only to the content.
// And EventUtils.synthesizeKey doesn't, but avoids reproducing the regression.
const onToolboxDestroyed = toolbox.once("destroyed");
info("Try to close the toolbox via a key shortcut");
if (Services.appinfo.OS == "Darwin") {
EventUtils.synthesizeKey("i", { accelKey: true, altKey: true });
} else {
EventUtils.synthesizeKey("i", { accelKey: true, shiftKey: true });
}
await onToolboxDestroyed;
});