/* 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 hovering on an object, which will show a popup and on a // simple value, which will show a tooltip. "use strict"; add_task(async function () { const dbg = await initDebugger("doc-preview.html", "preview.js"); await testPreviews(dbg, "testInline", [ { line: 17, column: 16, expression: "obj?.prop", result: 2 }, ]); await selectSource(dbg, "preview.js"); await testBucketedArray(dbg); await testPreviews(dbg, "empties", [ { line: 6, column: 9, expression: "a", result: '""' }, { line: 7, column: 9, expression: "b", result: "false" }, { line: 8, column: 9, expression: "c", result: "undefined" }, { line: 9, column: 9, expression: "d", result: "null" }, ]); await testPreviews(dbg, "objects", [ { line: 27, column: 10, expression: "empty", result: "No properties" }, { line: 28, column: 22, expression: "obj?.foo", result: 1 }, ]); await testPreviews(dbg, "smalls", [ { line: 14, column: 9, expression: "a", result: '"..."' }, { line: 15, column: 9, expression: "b", result: "true" }, { line: 16, column: 9, expression: "c", result: "1" }, { line: 17, column: 9, expression: "d", fields: [["length", "0"]], }, ]); await testPreviews(dbg, "classPreview", [ { line: 50, column: 20, expression: "this.x", result: 1 }, { line: 50, column: 29, expression: "this.#privateVar", result: 2 }, { line: 50, column: 47, expression: "Foo.#privateStatic", fields: [ ["first", `"a"`], ["second", `"b"`], ], }, { line: 51, column: 26, expression: "this", fields: [ ["x", "1"], ["#privateVar", "2"], ], }, { line: 51, column: 39, expression: "this.#privateVar", result: 2 }, ]); info( "Check that closing the preview tooltip doesn't release the underlying object actor" ); invokeInTab("classPreview"); await waitForPaused(dbg); info("Display popup a first time and hide it"); await assertPreviews(dbg, [ { line: 60, column: 7, expression: "y", fields: [["hello", "{…}"]], }, ]); await closePreviewAtPos(dbg, 60, 7); info("Display the popup again and try to expand a property"); const popupEl = await tryHovering(dbg, 60, 7, "popup"); const nodes = popupEl.querySelectorAll(".preview-popup .node"); const initialNodesLength = nodes.length; nodes[0].querySelector(".arrow").click(); await waitFor( () => popupEl.querySelectorAll(".preview-popup .node").length > initialNodesLength ); ok(true, `"hello" was expanded`); await resume(dbg); }); async function testPreviews(dbg, fnName, previews) { invokeInTab(fnName); await waitForPaused(dbg); await assertPreviews(dbg, previews); await resume(dbg); info(`Ran tests for ${fnName}`); } async function testBucketedArray(dbg) { invokeInTab("largeArray"); await waitForPaused(dbg); await tryHovering(dbg, 34, 10, "popup"); const preview = dbg.selectors.getPreview(); is( preview.properties.map(p => p.name).join(" "), "[0…99] [100…100] length ", "Popup properties are bucketed" ); is(preview.properties[0].meta.endIndex, 99, "first bucket ends at 99"); is(preview.properties[2].contents.value, 101, "length is 101"); await resume(dbg); }