forked from mirrors/gecko-dev
# ignore-this-changeset Differential Revision: https://phabricator.services.mozilla.com/D35900 --HG-- extra : source : b08f475f1140b9e650b316ee2813c13ec9947678
173 lines
5.9 KiB
JavaScript
173 lines
5.9 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
add_task(async function() {
|
|
await BrowserTestUtils.withNewTab(
|
|
{ gBrowser, url: "about:blank" },
|
|
async function(browser) {
|
|
const BASE1 = getRootDirectory(gTestPath).replace(
|
|
"chrome://mochitests/content",
|
|
"http://example.com"
|
|
);
|
|
const BASE2 = getRootDirectory(gTestPath).replace(
|
|
"chrome://mochitests/content",
|
|
"http://test1.example.com"
|
|
);
|
|
const URL = BASE1 + "onload_message.html";
|
|
let sixth = BrowserTestUtils.waitForNewTab(
|
|
gBrowser,
|
|
URL + "#sixth",
|
|
true,
|
|
true
|
|
);
|
|
await ContentTask.spawn(
|
|
browser,
|
|
{ base1: BASE1, base2: BASE2 },
|
|
async function({ base1, base2 }) {
|
|
let top = content.window;
|
|
top.name = "top";
|
|
top.location.href += "#top";
|
|
|
|
let contexts = {
|
|
top: top.location.href,
|
|
first: base1 + "dummy_page.html#first",
|
|
third: base2 + "dummy_page.html#third",
|
|
second: base1 + "dummy_page.html#second",
|
|
fourth: base2 + "dummy_page.html#fourth",
|
|
fifth: base1 + "dummy_page.html#fifth",
|
|
sixth: base1 + "onload_message.html#sixth",
|
|
};
|
|
|
|
function addFrame(target, name) {
|
|
let doc = (target.contentWindow || target).document;
|
|
let frame = doc.createElement("iframe");
|
|
let p = new Promise(
|
|
resolve => (frame.onload = () => resolve(frame))
|
|
);
|
|
doc.body.appendChild(frame);
|
|
frame.name = name;
|
|
frame.src = contexts[name];
|
|
return p;
|
|
}
|
|
|
|
function addWindow(target, name) {
|
|
var win = target.contentWindow.open(contexts[name], name);
|
|
|
|
return new Promise(resolve =>
|
|
target.contentWindow.addEventListener("message", () =>
|
|
resolve(win)
|
|
)
|
|
);
|
|
}
|
|
|
|
// Generate all lists of length length with every combination of
|
|
// values in input
|
|
function* generate(input, length) {
|
|
let list = new Array(length);
|
|
|
|
function* values(pos) {
|
|
if (pos >= list.length) {
|
|
yield list;
|
|
} else {
|
|
for (let v of input) {
|
|
list[pos] = v;
|
|
yield* values(pos + 1);
|
|
}
|
|
}
|
|
}
|
|
yield* values(0);
|
|
}
|
|
|
|
// We're going to create a tree that looks like the
|
|
// follwing.
|
|
//
|
|
// top sixth
|
|
// / \
|
|
// / \ /
|
|
// first second
|
|
// / \ /
|
|
// / \
|
|
// third fourth - - -
|
|
// /
|
|
// /
|
|
// fifth
|
|
//
|
|
// The idea is to have one top level non-auxiliary browsing
|
|
// context, five nested, one top level auxiliary with an
|
|
// opener. Given that set of related browsing contexts we
|
|
// wish to confirm that targeting is semantically equivalent
|
|
// with how nsIDocShellTreeItem.findItemWithName works. The
|
|
// trick to ensure that is to give all frames the same name!
|
|
// and ensure that the find algorithms return the same nodes
|
|
// in the same order.
|
|
|
|
function bc(frame) {
|
|
return (frame.contentWindow || frame).docShell.browsingContext;
|
|
}
|
|
|
|
let first = await addFrame(top, "first");
|
|
let second = await addFrame(top, "second");
|
|
let third = await addFrame(first, "third");
|
|
let fourth = await addFrame(first, "fourth");
|
|
let fifth = await addFrame(fourth, "fifth");
|
|
let sixth = await addWindow(fourth, "sixth");
|
|
|
|
let frames = [top, first, second, third, fourth, fifth, sixth];
|
|
let browsingContexts = frames.map(bc);
|
|
let docShells = browsingContexts.map(context => context.docShell);
|
|
|
|
ok(
|
|
top.docShell instanceof Ci.nsIDocShellTreeItem,
|
|
"When we remove nsIDocShellTreeItem this test should be removed"
|
|
);
|
|
|
|
// For every browsing context we generate all possible
|
|
// combinations of names for these browsing contexts using
|
|
// "dummy" and "target" as possible name.
|
|
for (let names of generate(["dummy", "target"], docShells.length)) {
|
|
for (let i = names.length - 1; i >= 0; --i) {
|
|
docShells[i].name = names[i];
|
|
}
|
|
|
|
for (let i = 0; i < docShells.length; ++i) {
|
|
let docShell = docShells[i].findItemWithName(
|
|
"target",
|
|
null,
|
|
null,
|
|
false
|
|
);
|
|
let browsingContext = browsingContexts[i].findWithName("target");
|
|
is(
|
|
docShell ? docShell.browsingContext : null,
|
|
browsingContext,
|
|
"findItemWithName should find same browsing context as findWithName"
|
|
);
|
|
}
|
|
}
|
|
|
|
for (let target of ["_self", "_top", "_parent", "_blank"]) {
|
|
for (let i = 0; i < docShells.length; ++i) {
|
|
let docShell = docShells[i].findItemWithName(
|
|
target,
|
|
null,
|
|
null,
|
|
false
|
|
);
|
|
let browsingContext = browsingContexts[i].findWithName(target);
|
|
is(
|
|
docShell ? docShell.browsingContext : null,
|
|
browsingContext,
|
|
"findItemWithName should find same browsing context as findWithName for " +
|
|
target
|
|
);
|
|
}
|
|
}
|
|
}
|
|
);
|
|
|
|
BrowserTestUtils.removeTab(await sixth);
|
|
}
|
|
);
|
|
});
|