149 lines
5.4 KiB
JavaScript
149 lines
5.4 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
add_task(async function pageWithoutFrames({ client }) {
|
|
const { Page } = client;
|
|
|
|
info("Navigate to a page without a frame");
|
|
await loadURL(PAGE_URL);
|
|
|
|
const { frameTree } = await Page.getFrameTree();
|
|
ok(!!frameTree.frame, "Expected frame details found");
|
|
|
|
const expectedFrames = await getFlattenedFrameList();
|
|
|
|
// Check top-level frame
|
|
const expectedFrame = expectedFrames.get(frameTree.frame.id);
|
|
is(frameTree.frame.id, expectedFrame.id, "Expected frame id found");
|
|
is(frameTree.frame.parentId, undefined, "Parent frame doesn't exist");
|
|
is(frameTree.name, undefined, "Top frame doens't contain name property");
|
|
is(frameTree.frame.url, expectedFrame.url, "Expected url found");
|
|
is(frameTree.childFrames, undefined, "No sub frames found");
|
|
});
|
|
|
|
add_task(async function PageWithFrames({ client }) {
|
|
const { Page } = client;
|
|
|
|
info("Navigate to a page with frames");
|
|
await loadURL(FRAMESET_MULTI_URL);
|
|
|
|
const { frameTree } = await Page.getFrameTree();
|
|
ok(!!frameTree.frame, "Expected frame details found");
|
|
|
|
const expectedFrames = await getFlattenedFrameList();
|
|
|
|
let frame = frameTree.frame;
|
|
let expectedFrame = expectedFrames.get(frame.id);
|
|
|
|
info(`Check top frame with id: ${frame.id}`);
|
|
is(frame.id, expectedFrame.id, "Expected frame id found");
|
|
is(frame.parentId, undefined, "Parent frame doesn't exist");
|
|
is(frame.name, undefined, "Top frame doesn't contain name property");
|
|
is(frame.url, expectedFrame.url, "Expected URL found");
|
|
|
|
is(frameTree.childFrames.length, 2, "Expected two sub frames");
|
|
for (const childFrameTree of frameTree.childFrames) {
|
|
let frame = childFrameTree.frame;
|
|
let expectedFrame = expectedFrames.get(frame.id);
|
|
|
|
info(`Check sub frame with id: ${frame.id}`);
|
|
is(frame.id, expectedFrame.id, "Expected frame id found");
|
|
is(frame.parentId, expectedFrame.parentId, "Expected parent id found");
|
|
is(frame.name, expectedFrame.name, "Frame has expected name set");
|
|
is(frame.url, expectedFrame.url, "Expected URL found");
|
|
is(childFrameTree.childFrames, undefined, "No sub frames found");
|
|
}
|
|
});
|
|
|
|
add_task(async function pageWithNestedFrames({ client }) {
|
|
const { Page } = client;
|
|
|
|
info("Navigate to a page with nested frames");
|
|
await loadURL(FRAMESET_NESTED_URL);
|
|
|
|
const { frameTree } = await Page.getFrameTree();
|
|
ok(!!frameTree.frame, "Expected frame details found");
|
|
|
|
const expectedFrames = await getFlattenedFrameList();
|
|
|
|
let frame = frameTree.frame;
|
|
let expectedFrame = expectedFrames.get(frame.id);
|
|
|
|
info(`Check top frame with id: ${frame.id}`);
|
|
is(frame.id, expectedFrame.id, "Expected frame id found");
|
|
is(frame.parentId, undefined, "Parent frame doesn't exist");
|
|
is(frame.name, undefined, "Top frame doesn't contain name property");
|
|
is(frame.url, expectedFrame.url, "Expected URL found");
|
|
is(frameTree.childFrames.length, 1, "Expected a single sub frame");
|
|
|
|
const childFrameTree = frameTree.childFrames[0];
|
|
frame = childFrameTree.frame;
|
|
expectedFrame = expectedFrames.get(frame.id);
|
|
|
|
info(`Check sub frame with id: ${frame.id}`);
|
|
is(frame.id, expectedFrame.id, "Expected frame id found");
|
|
is(frame.parentId, expectedFrame.parentId, "Expected parent id found");
|
|
is(frame.name, expectedFrame.name, "Frame has expected name set");
|
|
is(frame.url, expectedFrame.url, "Expected URL found");
|
|
is(childFrameTree.childFrames.length, 2, "Expected two sub frames");
|
|
|
|
let nestedChildFrameTree = childFrameTree.childFrames[0];
|
|
frame = nestedChildFrameTree.frame;
|
|
expectedFrame = expectedFrames.get(frame.id);
|
|
|
|
info(`Check first nested frame with id: ${frame.id}`);
|
|
is(frame.id, expectedFrame.id, "Expected frame id found");
|
|
is(frame.parentId, expectedFrame.parentId, "Expected parent id found");
|
|
is(frame.name, expectedFrame.name, "Frame has expected name set");
|
|
is(frame.url, expectedFrame.url, "Expected URL found");
|
|
is(nestedChildFrameTree.childFrames, undefined, "No sub frames found");
|
|
|
|
nestedChildFrameTree = childFrameTree.childFrames[1];
|
|
frame = nestedChildFrameTree.frame;
|
|
expectedFrame = expectedFrames.get(frame.id);
|
|
|
|
info(`Check second nested frame with id: ${frame.id}`);
|
|
is(frame.id, expectedFrame.id, "Expected frame id found");
|
|
is(frame.parentId, expectedFrame.parentId, "Expected parent id found");
|
|
is(frame.name, expectedFrame.name, "Frame has expected name set");
|
|
is(frame.url, expectedFrame.url, "Expected URL found");
|
|
is(nestedChildFrameTree.childFrames, undefined, "No sub frames found");
|
|
});
|
|
|
|
/**
|
|
* Retrieve all frames for the current tab as flattened list.
|
|
*/
|
|
function getFlattenedFrameList() {
|
|
return SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
|
|
const frames = new Map();
|
|
|
|
function getFrameDetails(context) {
|
|
const frameElement = context.embedderElement;
|
|
|
|
const frame = {
|
|
id: context.id.toString(),
|
|
parentId: context.parent ? context.parent.id.toString() : null,
|
|
loaderId: null,
|
|
name: frameElement?.id || frameElement?.name,
|
|
url: context.docShell.domWindow.location.href,
|
|
securityOrigin: null,
|
|
mimeType: null,
|
|
};
|
|
|
|
if (context.parent) {
|
|
frame.parentId = context.parent.id.toString();
|
|
}
|
|
|
|
frames.set(context.id.toString(), frame);
|
|
|
|
for (const childContext of context.children) {
|
|
getFrameDetails(childContext);
|
|
}
|
|
}
|
|
|
|
getFrameDetails(content.docShell.browsingContext);
|
|
return frames;
|
|
});
|
|
}
|