From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- ...r_jsterm_autocomplete_in_debugger_stackframe.js | 133 +++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 devtools/client/webconsole/test/browser/browser_jsterm_autocomplete_in_debugger_stackframe.js (limited to 'devtools/client/webconsole/test/browser/browser_jsterm_autocomplete_in_debugger_stackframe.js') diff --git a/devtools/client/webconsole/test/browser/browser_jsterm_autocomplete_in_debugger_stackframe.js b/devtools/client/webconsole/test/browser/browser_jsterm_autocomplete_in_debugger_stackframe.js new file mode 100644 index 0000000000..3ac24ba074 --- /dev/null +++ b/devtools/client/webconsole/test/browser/browser_jsterm_autocomplete_in_debugger_stackframe.js @@ -0,0 +1,133 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Test that makes sure web console autocomplete happens in the user-selected +// stackframe from the js debugger. + +"use strict"; + +const TEST_URI = + "http://example.com/browser/devtools/client/webconsole/" + + "test/browser/test-autocomplete-in-stackframe.html"; + +requestLongerTimeout(20); + +add_task(async function () { + const hud = await openNewTabAndConsole(TEST_URI); + const { jsterm } = hud; + const { autocompletePopup: popup } = jsterm; + + const toolbox = gDevTools.getToolboxForTab(gBrowser.selectedTab); + + const jstermComplete = value => setInputValueForAutocompletion(hud, value); + + // Test that document.title gives string methods. Native getters must execute. + await jstermComplete("document.title."); + + const newItemsLabels = getAutocompletePopupLabels(popup); + ok(!!newItemsLabels.length, "'document.title.' gave a list of suggestions"); + ok(newItemsLabels.includes("substr"), `results do contain "substr"`); + ok( + newItemsLabels.includes("toLowerCase"), + `results do contain "toLowerCase"` + ); + ok(newItemsLabels.includes("strike"), `results do contain "strike"`); + + // Test if 'foo' gives 'foo1' but not 'foo2' or 'foo3' + await jstermComplete("foo"); + ok( + hasExactPopupLabels(popup, ["foo1", "foo1Obj"]), + `"foo" gave the expected suggestions` + ); + + // Test if 'foo1Obj.' gives 'prop1' and 'prop2' + await jstermComplete("foo1Obj."); + checkInputCompletionValue(hud, "method", "foo1Obj completion"); + ok( + hasExactPopupLabels(popup, ["method", "prop1", "prop2"]), + `"foo1Obj." gave the expected suggestions` + ); + + // Test if 'foo1Obj.prop2.' gives 'prop21' + await jstermComplete("foo1Obj.prop2."); + ok( + hasPopupLabel(popup, "prop21"), + `"foo1Obj.prop2." gave the expected suggestions` + ); + await closeAutocompletePopup(hud); + + info("Opening Debugger"); + await openDebugger(); + const dbg = createDebuggerContext(toolbox); + + info("Waiting for pause"); + await pauseDebugger(dbg); + const stackFrames = dbg.selectors.getCurrentThreadFrames(); + + info("Opening Console again"); + await toolbox.selectTool("webconsole"); + + // Test if 'this.' gives 'method', 'prop1', and 'prop2', not global variables, since we are paused in + // `foo1Obj.method()` (called by `secondCall`) + await jstermComplete("this."); + ok( + hasExactPopupLabels(popup, ["method", "prop1", "prop2"]), + `"this." gave the expected suggestions` + ); + + await selectFrame(dbg, stackFrames[1]); + + // Test if 'foo' gives 'foo3' and 'foo1' but not 'foo2', since we are now in the `secondCall` + // frame (called by `firstCall`, which we call in `pauseDebugger`). + await jstermComplete("foo"); + ok( + hasExactPopupLabels(popup, ["foo1", "foo1Obj", "foo3", "foo3Obj"]), + `"foo." gave the expected suggestions` + ); + + // Test that 'shadowed.' autocompletes properties from the local variable named "shadowed". + await jstermComplete("shadowed."); + ok( + hasExactPopupLabels(popup, ["bar"]), + `"shadowed." gave the expected suggestions` + ); + + await openDebugger(); + + // Select the frame for the `firstCall` function. + await selectFrame(dbg, stackFrames[2]); + + info("openConsole"); + await toolbox.selectTool("webconsole"); + + // Test if 'foo' gives 'foo2' and 'foo1' but not 'foo3', since we are now in the + // `firstCall` frame. + await jstermComplete("foo"); + ok( + hasExactPopupLabels(popup, ["foo1", "foo1Obj", "foo2", "foo2Obj"]), + `"foo" gave the expected suggestions` + ); + + // Test that 'shadowed.' autocompletes properties from the global variable named "shadowed". + await jstermComplete("shadowed."); + ok( + hasExactPopupLabels(popup, ["foo"]), + `"shadowed." gave the expected suggestions` + ); + + // Test if 'foo2Obj.' gives 'prop1' + await jstermComplete("foo2Obj."); + ok(hasPopupLabel(popup, "prop1"), `"foo2Obj." returns "prop1"`); + + // Test if 'foo2Obj.prop1.' gives 'prop11' + await jstermComplete("foo2Obj.prop1."); + ok(hasPopupLabel(popup, "prop11"), `"foo2Obj.prop1" returns "prop11"`); + + // Test if 'foo2Obj.prop1.prop11.' gives suggestions for a string,i.e. 'length' + await jstermComplete("foo2Obj.prop1.prop11."); + ok(hasPopupLabel(popup, "length"), `results do contain "length"`); + + // Test if 'foo2Obj[0].' throws no errors. + await jstermComplete("foo2Obj[0]."); + is(getAutocompletePopupLabels(popup).length, 0, "no items for foo2Obj[0]"); +}); -- cgit v1.2.3