summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/test/browser_net_filter-autocomplete.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/netmonitor/test/browser_net_filter-autocomplete.js')
-rw-r--r--devtools/client/netmonitor/test/browser_net_filter-autocomplete.js207
1 files changed, 207 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/test/browser_net_filter-autocomplete.js b/devtools/client/netmonitor/test/browser_net_filter-autocomplete.js
new file mode 100644
index 0000000000..974c18a4f2
--- /dev/null
+++ b/devtools/client/netmonitor/test/browser_net_filter-autocomplete.js
@@ -0,0 +1,207 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Test autocomplete based on filtering flags and requests
+ */
+const REQUESTS = [
+ {
+ url: "sjs_content-type-test-server.sjs?fmt=html&res=undefined&text=Sample",
+ },
+ {
+ url:
+ "sjs_content-type-test-server.sjs?fmt=html&res=undefined&text=Sample" +
+ "&cookies=1",
+ },
+ { url: "sjs_content-type-test-server.sjs?fmt=css&text=sample" },
+ { url: "sjs_content-type-test-server.sjs?fmt=js&text=sample" },
+ { url: "sjs_content-type-test-server.sjs?fmt=font" },
+ { url: "sjs_content-type-test-server.sjs?fmt=image" },
+ { url: "sjs_content-type-test-server.sjs?fmt=audio" },
+ { url: "sjs_content-type-test-server.sjs?fmt=video" },
+ { url: "sjs_content-type-test-server.sjs?fmt=gzip" },
+ { url: "sjs_status-codes-test-server.sjs?sts=304" },
+];
+
+function testAutocompleteContents(expected, document) {
+ expected.forEach(function (item, i) {
+ is(
+ document.querySelector(
+ `.devtools-autocomplete-listbox .autocomplete-item:nth-child(${i + 1})`
+ ).textContent,
+ item,
+ `${expected[i]} found`
+ );
+ });
+}
+
+add_task(async function () {
+ const { monitor } = await initNetMonitor(FILTERING_URL, { requestCount: 1 });
+ const { document, store, windowRequire } = monitor.panelWin;
+ const Actions = windowRequire("devtools/client/netmonitor/src/actions/index");
+
+ store.dispatch(Actions.batchEnable(false));
+
+ info("Starting test... ");
+
+ // Let the requests load completely before the autocomplete tests begin
+ // as autocomplete values also rely on the network requests.
+ const waitNetwork = waitForNetworkEvents(monitor, REQUESTS.length);
+ await performRequestsInContent(REQUESTS);
+ await waitNetwork;
+
+ EventUtils.synthesizeMouseAtCenter(
+ document.querySelector(".devtools-filterinput"),
+ {},
+ document.defaultView
+ );
+ // Empty Mouse click should keep autocomplete hidden
+ ok(
+ !document.querySelector(".devtools-autocomplete-popup"),
+ "Autocomplete Popup still hidden"
+ );
+
+ document.querySelector(".devtools-filterinput").focus();
+
+ // Typing numbers that corresponds to status codes should invoke an autocomplete
+ EventUtils.sendString("2");
+ ok(
+ document.querySelector(".devtools-autocomplete-popup"),
+ "Autocomplete Popup Created"
+ );
+ testAutocompleteContents(
+ [
+ "status-code:200",
+ "status-code:201",
+ "status-code:202",
+ "status-code:203",
+ "status-code:204",
+ "status-code:205",
+ "status-code:206",
+ ],
+ document
+ );
+ EventUtils.synthesizeKey("KEY_Enter");
+ is(
+ document.querySelector(".devtools-filterinput").value,
+ "status-code:200",
+ "Value correctly set after Enter"
+ );
+ ok(
+ !document.querySelector(".devtools-autocomplete-popup"),
+ "Autocomplete Popup hidden after keyboard Enter key"
+ );
+
+ // Space separated tokens
+ // The last token where autocomplete is available shall generate the popup
+ EventUtils.sendString(" s");
+ ok(
+ document.querySelector(".devtools-autocomplete-popup"),
+ "Autocomplete Popup Created"
+ );
+ testAutocompleteContents(
+ [
+ "scheme:",
+ "set-cookie-domain:",
+ "set-cookie-name:",
+ "set-cookie-value:",
+ "size:",
+ "status-code:",
+ ],
+ document
+ );
+
+ EventUtils.sendString("c");
+ testAutocompleteContents(["scheme:"], document);
+ EventUtils.synthesizeKey("KEY_Tab");
+ // Tab selection should hide autocomplete
+ ok(
+ document.querySelector(".devtools-autocomplete-popup"),
+ "Autocomplete Popup alive with content values"
+ );
+ testAutocompleteContents(["scheme:http"], document);
+
+ EventUtils.synthesizeKey("KEY_Enter");
+ is(
+ document.querySelector(".devtools-filterinput").value,
+ "status-code:200 scheme:http",
+ "Value correctly set after Enter"
+ );
+ ok(
+ !document.querySelector(".devtools-autocomplete-popup"),
+ "Autocomplete Popup hidden after keyboard Enter key"
+ );
+
+ // Space separated tokens
+ // The last token where autocomplete is available shall generate the popup
+ EventUtils.sendString(" pro");
+ testAutocompleteContents(["protocol:"], document);
+
+ // The new value of the text box should be previousTokens + latest value selected
+ // First return selects "protocol:"
+ EventUtils.synthesizeKey("KEY_Enter");
+ // Second return selects "protocol:HTTP/1.1"
+ EventUtils.synthesizeKey("KEY_Enter");
+ is(
+ document.querySelector(".devtools-filterinput").value,
+ "status-code:200 scheme:http protocol:HTTP/1.1",
+ "Tokenized click generates correct value in input box"
+ );
+
+ // Explicitly type in `flag:` renders autocomplete with values
+ EventUtils.sendString(" status-code:");
+ testAutocompleteContents(["status-code:200", "status-code:304"], document);
+
+ // Typing the exact value closes autocomplete
+ EventUtils.sendString("304");
+ ok(
+ !document.querySelector(".devtools-autocomplete-popup"),
+ "Typing the exact value closes autocomplete"
+ );
+
+ // Check if mime-type has been correctly parsed out and values also get autocomplete
+ EventUtils.sendString(" mime-type:text");
+ testAutocompleteContents(
+ ["mime-type:text/css", "mime-type:text/html", "mime-type:text/plain"],
+ document
+ );
+
+ // The negative filter flags
+ EventUtils.sendString(" -");
+ testAutocompleteContents(
+ [
+ "-cause:",
+ "-domain:",
+ "-has-response-header:",
+ "-initiator:",
+ "-is:",
+ "-larger-than:",
+ "-method:",
+ "-mime-type:",
+ "-priority:",
+ "-protocol:",
+ "-regexp:",
+ "-remote-ip:",
+ "-scheme:",
+ "-set-cookie-domain:",
+ "-set-cookie-name:",
+ "-set-cookie-value:",
+ "-size:",
+ "-status-code:",
+ "-transferred-larger-than:",
+ "-transferred:",
+ ],
+ document
+ );
+
+ // Autocomplete for negative filtering
+ EventUtils.sendString("is:");
+ testAutocompleteContents(
+ ["-is:cached", "-is:from-cache", "-is:running"],
+ document
+ );
+
+ await teardown(monitor);
+});