browser_inspector-remove.js (3567B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 Services.scriptloader.loadSubScript( 7 "chrome://mochitests/content/browser/devtools/server/tests/browser/inspector-helpers.js", 8 this 9 ); 10 11 add_task(async function testRemoveSubtree() { 12 const { target, walker } = await initInspectorFront( 13 MAIN_DOMAIN + "inspector-traversal-data.html" 14 ); 15 16 await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { 17 function ignoreNode(node) { 18 // Duplicate the walker logic to skip blank nodes... 19 return ( 20 node.nodeType === content.Node.TEXT_NODE && 21 !/[^\s]/.test(node.nodeValue) 22 ); 23 } 24 25 let nextSibling = content.document.querySelector("#longlist").nextSibling; 26 while (nextSibling && ignoreNode(nextSibling)) { 27 nextSibling = nextSibling.nextSibling; 28 } 29 30 let previousSibling = 31 content.document.querySelector("#longlist").previousSibling; 32 while (previousSibling && ignoreNode(previousSibling)) { 33 previousSibling = previousSibling.previousSibling; 34 } 35 content.nextSibling = nextSibling; 36 content.previousSibling = previousSibling; 37 }); 38 39 let originalOwnershipSize = 0; 40 const longlist = await walker.querySelector(walker.rootNode, "#longlist"); 41 const longlistID = longlist.actorID; 42 await walker.children(longlist); 43 originalOwnershipSize = await assertOwnershipTrees(walker); 44 // Here is how the ownership tree is summed up: 45 // #document 1 46 // <html> 1 47 // <body> 1 48 // <div id=longlist> 1 49 // <div id=a>a</div> 26*2 (each child plus it's singleTextChild) 50 // ... 51 // <div id=z>z</div> 52 // ----- 53 // 56 54 is(originalOwnershipSize, 56, "Correct number of items in ownership tree"); 55 56 const onMutation = waitForMutation(walker, isChildList); 57 const siblings = await walker.removeNode(longlist); 58 59 await SpecialPowers.spawn( 60 gBrowser.selectedBrowser, 61 [[siblings.previousSibling.actorID, siblings.nextSibling.actorID]], 62 function ([previousActorID, nextActorID]) { 63 const { require } = ChromeUtils.importESModule( 64 "resource://devtools/shared/loader/Loader.sys.mjs" 65 ); 66 const { 67 DevToolsServer, 68 } = require("resource://devtools/server/devtools-server.js"); 69 70 // Convert actorID to current compartment string otherwise 71 // searchAllConnectionsForActor is confused and won't find the actor. 72 previousActorID = String(previousActorID); 73 nextActorID = String(nextActorID); 74 const previous = 75 DevToolsServer.searchAllConnectionsForActor(previousActorID); 76 const next = DevToolsServer.searchAllConnectionsForActor(nextActorID); 77 78 is( 79 previous.rawNode, 80 content.previousSibling, 81 "Should have returned the previous sibling." 82 ); 83 is( 84 next.rawNode, 85 content.nextSibling, 86 "Should have returned the next sibling." 87 ); 88 } 89 ); 90 await onMutation; 91 // Our ownership size should now be 51 fewer (we forgot about #longlist + 26 92 // children + 26 singleTextChild nodes, but learned about #longlist's 93 // prev/next sibling) 94 const newOwnershipSize = await assertOwnershipTrees(walker); 95 is( 96 newOwnershipSize, 97 originalOwnershipSize - 51, 98 "Ownership tree should be lower" 99 ); 100 // Now verify that some nodes have gone away 101 return checkMissing(target, longlistID); 102 });