/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
add_task(async () => {
// Build a simple test page with a remote iframe, using two distinct origins .com and .org
const iframeOrgHtml = encodeURIComponent(
`
in org - same origin
`
);
const iframeComHtml = encodeURIComponent(`
in com - remote
`);
const html = encodeURIComponent(
`
`
);
const tab = await addTab(
"https://example.org/document-builder.sjs?html=" + html,
{ waitForLoad: false }
);
const commands = await CommandsFactory.forTab(tab);
await commands.targetCommand.startListening();
info("Check that it returns null when no params are passed");
let nodeFront = await commands.inspectorCommand.findNodeFrontFromSelectors();
is(
nodeFront,
null,
`findNodeFrontFromSelectors returns null when no param is passed`
);
info("Check that it returns null when a string is passed");
nodeFront = await commands.inspectorCommand.findNodeFrontFromSelectors(
"body main"
);
is(
nodeFront,
null,
`findNodeFrontFromSelectors returns null when passed a string`
);
info("Check it returns null when an empty array is passed");
nodeFront = await commands.inspectorCommand.findNodeFrontFromSelectors([]);
is(
nodeFront,
null,
`findNodeFrontFromSelectors returns null when passed an empty array`
);
info("Check that passing a selector for a non-matching element returns null");
nodeFront = await commands.inspectorCommand.findNodeFrontFromSelectors([
"h1",
]);
is(
nodeFront,
null,
"findNodeFrontFromSelectors returns null as there's no
element in the page"
);
info("Check passing a selector for an element in the top document");
nodeFront = await commands.inspectorCommand.findNodeFrontFromSelectors([
"button",
]);
is(
nodeFront.typeName,
"domnode",
"findNodeFrontFromSelectors returns a nodeFront"
);
is(
nodeFront.displayName,
"button",
"findNodeFrontFromSelectors returned the appropriate nodeFront"
);
info("Check passing a selector for an element in a same origin iframe");
nodeFront = await commands.inspectorCommand.findNodeFrontFromSelectors([
"#iframe-org",
"#in-iframe",
]);
is(
nodeFront.displayName,
"h2",
"findNodeFrontFromSelectors returned the appropriate nodeFront"
);
info("Check passing a selector for an element in a cross origin iframe");
nodeFront = await commands.inspectorCommand.findNodeFrontFromSelectors([
"#iframe-com",
"h3",
]);
is(
nodeFront.displayName,
"h3",
"findNodeFrontFromSelectors returned the appropriate nodeFront"
);
info(
"Check passing a selector for an non-existing element in an existing iframe"
);
nodeFront = await commands.inspectorCommand.findNodeFrontFromSelectors([
"iframe",
"#non-existant-id",
]);
is(
nodeFront.displayName,
"#document",
"findNodeFrontFromSelectors returned the last matching iframe document if the children selector isn't found"
);
is(
nodeFront.parentNode().displayName,
"iframe",
"findNodeFrontFromSelectors returned the last matching iframe document if the children selector isn't found"
);
info("Check that timeout does work");
// Reload the page so we'll have the iframe loading (for 3s) and we can check that
// putting a smaller timeout will result in the function returning null.
// we need to wait until it's fully processed to avoid pending promises.
const onNewTargetProcessed = commands.targetCommand.once(
"processed-available-target"
);
await reloadBrowser({ waitForLoad: false });
await onNewTargetProcessed;
nodeFront = await commands.inspectorCommand.findNodeFrontFromSelectors(
["#iframe-org", "#in-iframe"],
// timeout in ms (smaller than 3s)
100
);
is(
nodeFront,
null,
"findNodeFrontFromSelectors timed out and returned null, as expected"
);
await commands.destroy();
});