summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/test/browser_net_search-results.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/netmonitor/test/browser_net_search-results.js')
-rw-r--r--devtools/client/netmonitor/test/browser_net_search-results.js233
1 files changed, 233 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/test/browser_net_search-results.js b/devtools/client/netmonitor/test/browser_net_search-results.js
new file mode 100644
index 0000000000..b3fd21ec98
--- /dev/null
+++ b/devtools/client/netmonitor/test/browser_net_search-results.js
@@ -0,0 +1,233 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Test search match functionality.
+ * Search panel is visible and clicking matches shows them in the request details.
+ */
+
+add_task(async function () {
+ await pushPref("devtools.netmonitor.features.search", true);
+
+ const { tab, monitor } = await initNetMonitor(HTTPS_CUSTOM_GET_URL, {
+ requestCount: 1,
+ });
+ info("Starting test... ");
+
+ const { document, store, windowRequire } = monitor.panelWin;
+
+ // Action should be processed synchronously in tests.
+ const Actions = windowRequire("devtools/client/netmonitor/src/actions/index");
+ store.dispatch(Actions.batchEnable(false));
+
+ const SEARCH_STRING = "test";
+ // Execute two XHRs and wait until they are finished.
+ const URLS = [
+ HTTPS_SEARCH_SJS + "?value=test1",
+ HTTPS_SEARCH_SJS + "?value=test2",
+ ];
+
+ const wait = waitForNetworkEvents(monitor, 2);
+ await SpecialPowers.spawn(tab.linkedBrowser, [URLS], makeRequests);
+ await wait;
+
+ // Open the Search panel
+ await store.dispatch(Actions.openSearch());
+
+ // Fill Filter input with text and check displayed messages.
+ // The filter should be focused automatically.
+ typeInNetmonitor(SEARCH_STRING, monitor);
+ EventUtils.synthesizeKey("KEY_Enter");
+
+ // Wait until there are two resources rendered in the results
+ await waitForDOMIfNeeded(
+ document,
+ ".search-panel-content .treeRow.resourceRow",
+ 2
+ );
+
+ const searchMatchContents = document.querySelectorAll(
+ ".search-panel-content .treeRow .treeIcon"
+ );
+
+ for (let i = searchMatchContents.length - 1; i >= 0; i--) {
+ clickElement(searchMatchContents[i], monitor);
+ }
+
+ // Wait until there are two resources rendered in the results
+ await waitForDOMIfNeeded(
+ document,
+ ".search-panel-content .treeRow.resultRow",
+ 12
+ );
+
+ // Check the matches
+ const matches = document.querySelectorAll(
+ ".search-panel-content .treeRow.resultRow"
+ );
+
+ await checkSearchResult(
+ monitor,
+ matches[0],
+ "#headers-panel",
+ ".url-preview .properties-view",
+ ".treeRow",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[1],
+ "#headers-panel",
+ "#responseHeaders .properties-view",
+ ".treeRow.selected",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[2],
+ "#headers-panel",
+ "#requestHeaders .properties-view",
+ ".treeRow.selected",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[3],
+ "#cookies-panel",
+ "#responseCookies .properties-view",
+ ".treeRow.selected",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[4],
+ "#response-panel",
+ ".CodeMirror-code",
+ ".CodeMirror-activeline",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[5],
+ "#headers-panel",
+ ".url-preview .properties-view",
+ ".treeRow",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[6],
+ "#headers-panel",
+ "#responseHeaders .properties-view",
+ ".treeRow.selected",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[7],
+ "#headers-panel",
+ "#requestHeaders .properties-view",
+ ".treeRow.selected",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[8],
+ "#headers-panel",
+ "#requestHeaders .properties-view",
+ ".treeRow.selected",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[9],
+ "#cookies-panel",
+ "#responseCookies .properties-view",
+ ".treeRow.selected",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[10],
+ "#cookies-panel",
+ "#requestCookies .properties-view",
+ ".treeRow.selected",
+ [SEARCH_STRING]
+ );
+ await checkSearchResult(
+ monitor,
+ matches[11],
+ "#response-panel",
+ ".CodeMirror-code",
+ ".CodeMirror-activeline",
+ [SEARCH_STRING]
+ );
+
+ await teardown(monitor);
+});
+
+async function makeRequests(urls) {
+ await content.wrappedJSObject.get(urls[0]);
+ await content.wrappedJSObject.get(urls[1]);
+ info("XHR Requests executed");
+}
+
+/**
+ * Check whether the search result is correctly linked with the related information
+ */
+async function checkSearchResult(
+ monitor,
+ match,
+ panelSelector,
+ panelContentSelector,
+ panelDetailSelector,
+ expected
+) {
+ const { document } = monitor.panelWin;
+
+ // Scroll the match into view so that it's clickable
+ match.scrollIntoView();
+
+ // Click on the match to show it
+ clickElement(match, monitor);
+
+ console.log(`${panelSelector} ${panelContentSelector}`);
+ await waitFor(() =>
+ document.querySelector(`${panelSelector} ${panelContentSelector}`)
+ );
+
+ const tabpanel = document.querySelector(panelSelector);
+ const content = tabpanel.querySelectorAll(
+ `${panelContentSelector} ${panelDetailSelector}`
+ );
+
+ is(
+ content.length,
+ expected.length,
+ `There should be ${expected.length} item${
+ expected.length === 1 ? "" : "s"
+ } displayed in this tabpanel`
+ );
+
+ // Make sure only 1 item is selected
+ if (panelDetailSelector === ".treeRow.selected") {
+ const selectedElements = tabpanel.querySelectorAll(panelDetailSelector);
+ is(
+ selectedElements.length,
+ 1,
+ `There should be only 1 item selected, found ${selectedElements.length} items selected`
+ );
+ }
+
+ if (content.length === expected.length) {
+ for (let i = 0; i < expected.length; i++) {
+ is(
+ content[i].textContent.includes(expected[i]),
+ true,
+ `Content must include ${expected[i]}`
+ );
+ }
+ }
+}