/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
/* import-globals-from inspector-helpers.js */
Services.scriptloader.loadSubScript("chrome://mochitests/content/browser/devtools/server/tests/browser/inspector-helpers.js", this);
add_task(async function testRemoveSubtree() {
const { target, walker } =
await initInspectorFront(MAIN_DOMAIN + "inspector-traversal-data.html");
await ContentTask.spawn(gBrowser.selectedBrowser, null, function() {
function ignoreNode(node) {
// Duplicate the walker logic to skip blank nodes...
return node.nodeType === Node.TEXT_NODE &&
!/[^\s]/.test(node.nodeValue);
}
let nextSibling = content.document.querySelector("#longlist").nextSibling;
while (nextSibling && ignoreNode(nextSibling)) {
nextSibling = nextSibling.nextSibling;
}
let previousSibling = content.document.querySelector("#longlist").previousSibling;
while (previousSibling && ignoreNode(previousSibling)) {
previousSibling = previousSibling.previousSibling;
}
content.nextSibling = nextSibling;
content.previousSibling = previousSibling;
});
let originalOwnershipSize = 0;
const longlist = await walker.querySelector(walker.rootNode, "#longlist");
const longlistID = longlist.actorID;
await walker.children(longlist);
originalOwnershipSize = await assertOwnershipTrees(walker);
// Here is how the ownership tree is summed up:
// #document 1
// 1
//
1
// 1
//
a
26*2 (each child plus it's singleTextChild)
// ...
//
z
// -----
// 56
is(originalOwnershipSize, 56, "Correct number of items in ownership tree");
const onMutation = waitForMutation(walker, isChildList);
const siblings = await walker.removeNode(longlist);
await ContentTask.spawn(gBrowser.selectedBrowser,
[siblings.previousSibling.actorID, siblings.nextSibling.actorID],
function([previousActorID, nextActorID]) {
const { require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm");
const { DebuggerServer } = require("devtools/server/main");
// Convert actorID to current compartment string otherwise
// searchAllConnectionsForActor is confused and won't find the actor.
previousActorID = String(previousActorID);
nextActorID = String(nextActorID);
const previous = DebuggerServer.searchAllConnectionsForActor(previousActorID);
const next = DebuggerServer.searchAllConnectionsForActor(nextActorID);
is(previous.rawNode, content.previousSibling,
"Should have returned the previous sibling.");
is(next.rawNode, content.nextSibling, "Should have returned the next sibling.");
});
await onMutation;
// Our ownership size should now be 51 fewer (we forgot about #longlist + 26
// children + 26 singleTextChild nodes, but learned about #longlist's
// prev/next sibling)
const newOwnershipSize = await assertOwnershipTrees(walker);
is(newOwnershipSize, originalOwnershipSize - 51,
"Ownership tree should be lower");
// Now verify that some nodes have gone away
return checkMissing(target, longlistID);
});