summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger/test/mochitest/browser_dbg-search-file.js')
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-search-file.js146
1 files changed, 146 insertions, 0 deletions
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js b/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js
new file mode 100644
index 0000000000..0bf438fba4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js
@@ -0,0 +1,146 @@
+/* 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 <http://mozilla.org/MPL/2.0/>. */
+
+// Tests the search bar correctly responds to queries, enter, shift enter
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js");
+ await selectSource(dbg, "simple1.js");
+
+ pressKey(dbg, "fileSearch");
+ is(dbg.selectors.getActiveSearch(), "file", "The search UI was opened");
+
+ info("Test closing and re-opening the search UI");
+ pressKey(dbg, "Escape");
+ is(
+ dbg.selectors.getActiveSearch(),
+ null,
+ "The search UI was closed when hitting Escape"
+ );
+
+ pressKey(dbg, "fileSearch");
+ is(dbg.selectors.getActiveSearch(), "file", "The search UI was opened again");
+
+ info("Search for `con` in the script");
+ type(dbg, "con");
+ await waitForSearchState(dbg);
+
+ // All the lines in the script that include `con`
+ const linesWithResults = [
+ // const func
+ 4,
+ // const result
+ 5,
+ // constructor (in MyClass)
+ 42,
+ // constructor (in Klass)
+ 55,
+ // console.log
+ 62,
+ ];
+
+ await waitFor(
+ () => getCursorPositionLine(dbg) === linesWithResults[0],
+ `typing in the search input did not set the search state in expected state`
+ );
+
+ is(
+ getCursorPositionLine(dbg),
+ linesWithResults[0],
+ "typing in the search input initialize the search"
+ );
+
+ info("Check that pressing Enter navigates forward through the results");
+ await navigateWithKey(
+ dbg,
+ "Enter",
+ linesWithResults[1],
+ "Enter moves forward in the search results"
+ );
+
+ await navigateWithKey(
+ dbg,
+ "Enter",
+ linesWithResults[2],
+ "Enter moves forward in the search results"
+ );
+
+ info(
+ "Check that pressing Shift+Enter navigates backward through the results"
+ );
+ await navigateWithKey(
+ dbg,
+ "ShiftEnter",
+ linesWithResults[1],
+ "Shift+Enter moves backward in the search results"
+ );
+
+ await navigateWithKey(
+ dbg,
+ "ShiftEnter",
+ linesWithResults[0],
+ "Shift+Enter moves backward in the search results"
+ );
+
+ info(
+ "Check that navigating backward goes to the last result when we were at the first one"
+ );
+ await navigateWithKey(
+ dbg,
+ "ShiftEnter",
+ linesWithResults.at(-1),
+ "Shift+Enter cycles back through the results"
+ );
+
+ info(
+ "Check that navigating forward goes to the first result when we were at the last one"
+ );
+ await navigateWithKey(
+ dbg,
+ "Enter",
+ linesWithResults[0],
+ "Enter cycles forward through the results"
+ );
+
+ info("Check that changing the search term works");
+ pressKey(dbg, "fileSearch");
+ type(dbg, "doEval");
+
+ await waitFor(
+ () => getCursorPositionLine(dbg) === 9,
+ "The UI navigates to the new search results"
+ );
+
+ // selecting another source keeps search open
+ await selectSource(dbg, "simple2.js");
+ ok(findElement(dbg, "searchField"), "Search field is still visible");
+
+ // search is always focused regardless of when or how it was opened
+ pressKey(dbg, "fileSearch");
+ await clickElement(dbg, "codeMirror");
+ pressKey(dbg, "fileSearch");
+ is(dbg.win.document.activeElement.tagName, "INPUT", "Search field focused");
+});
+
+async function navigateWithKey(dbg, key, expectedLine, assertionMessage) {
+ const currentLine = getCursorPositionLine(dbg);
+ pressKey(dbg, key);
+ await waitFor(
+ () => currentLine !== getCursorPositionLine(dbg),
+ `Pressing "${key}" did not change the position`
+ );
+
+ is(getCursorPositionLine(dbg), expectedLine, assertionMessage);
+}
+
+function getCursorPositionLine(dbg) {
+ const cursorPosition = findElementWithSelector(dbg, ".cursor-position");
+ const { innerText } = cursorPosition;
+ // Cursor position text has the following shape: (L, C)
+ // where N is the line number, and C the column number
+ const line = innerText.substring(1, innerText.indexOf(","));
+ return parseInt(line, 10);
+}