/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at . */ // Test that properties with the same value objec be expanded. See Bug 1617210. "use strict"; const httpServer = createTestHTTPServer(); httpServer.registerContentType("html", "text/html"); httpServer.registerContentType("js", "application/javascript"); httpServer.registerPathHandler(`/`, function (request, response) { response.setStatusLine(request.httpVersion, 200, "OK"); response.write(` `); }); httpServer.registerPathHandler("/test.js", function (request, response) { response.setHeader("Content-Type", "application/javascript"); response.write(` document.addEventListener("click", function onClick(e) { var sharedValue = {hello: "world"}; var x = { a: sharedValue, b: sharedValue, c: sharedValue, d: { e: { g: sharedValue }, f: { h: sharedValue } } }; debugger; }); `); }); const port = httpServer.identity.primaryPort; const TEST_URL = `http://localhost:${port}/`; add_task(async function () { const dbg = await initDebuggerWithAbsoluteURL(TEST_URL); const ready = Promise.all([ waitForPaused(dbg), waitForLoadedSource(dbg, "test.js"), ]); SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { content.document.querySelector("button.pause").click(); }); await ready; checkScopesLabels( dbg, ` | e | sharedValue | x `, { startIndex: 3 } ); info("Expand `x` node"); await toggleScopeNode(dbg, 6); checkScopesLabels( dbg, ` | x | | a | | b | | c | | d `, { startIndex: 5 } ); info("Expand node `d`"); await toggleScopeNode(dbg, 10); checkScopesLabels( dbg, ` | | d | | | e | | | f `, { startIndex: 9 } ); info("Expand `f` and `e` nodes"); await toggleScopeNode(dbg, 12); await toggleScopeNode(dbg, 11); checkScopesLabels( dbg, ` | | d | | | e | | | | g | | | | | | | f | | | | h | | | | `, { startIndex: 9 } ); info("Expand `h`, `g`, `e`, `c`, `b` and `a` nodes"); await toggleScopeNode(dbg, 15); await toggleScopeNode(dbg, 12); await toggleScopeNode(dbg, 9); await toggleScopeNode(dbg, 8); await toggleScopeNode(dbg, 7); checkScopesLabels( dbg, ` | x | | a | | | hello | | | | | b | | | hello | | | | | c | | | hello | | | | | d | | | e | | | | g | | | | | hello | | | | | | | | | | | | f | | | | h | | | | | hello | | | | | | | | | `, { startIndex: 5 } ); info("Expand `e`"); await toggleScopeNode(dbg, 4); info("Expand the `target` node"); let nodes = getAllLabels(dbg); const originalNodesCount = nodes.length; const targetNodeIndex = nodes.indexOf("target"); Assert.greater(targetNodeIndex, -1, "Found the target node"); await toggleScopeNode(dbg, targetNodeIndex); nodes = getAllLabels(dbg); Assert.greater( nodes.length, originalNodesCount, "the target node was expanded" ); ok(nodes.includes("classList"), "classList is displayed"); await resume(dbg); }); function getAllLabels(dbg, withIndent = false) { return Array.from(findAllElements(dbg, "scopeNodes")).map(el => { let text = el.innerText; if (withIndent) { const node = el.closest(".tree-node"); const level = Number(node.getAttribute("aria-level")); if (!Number.isNaN(level)) { text = `${"| ".repeat(level - 1)}${text}`.trim(); } } return text; }); } function checkScopesLabels(dbg, expected, { startIndex = 0 } = {}) { const lines = expected .trim() .split("\n") .map(line => line.trim()); const labels = getAllLabels(dbg, true).slice( startIndex, startIndex + lines.length ); const format = arr => `\n${arr.join("\n")}\n`; is(format(labels), format(lines), "got expected scope labels"); }