summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/test/browser_net_security-tab-visibility.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/netmonitor/test/browser_net_security-tab-visibility.js')
-rw-r--r--devtools/client/netmonitor/test/browser_net_security-tab-visibility.js142
1 files changed, 142 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/test/browser_net_security-tab-visibility.js b/devtools/client/netmonitor/test/browser_net_security-tab-visibility.js
new file mode 100644
index 0000000000..8ffc8efd50
--- /dev/null
+++ b/devtools/client/netmonitor/test/browser_net_security-tab-visibility.js
@@ -0,0 +1,142 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Test that security details tab is visible only when it should.
+ */
+
+add_task(async function () {
+ // This test explicitly asserts some insecure domains.
+ await pushPref("dom.security.https_first", false);
+
+ const TEST_DATA = [
+ {
+ desc: "http request",
+ uri: "http://example.com" + CORS_SJS_PATH,
+ visibleOnNewEvent: false,
+ visibleOnSecurityInfo: false,
+ visibleOnceComplete: false,
+ securityState: "insecure",
+ },
+ {
+ desc: "working https request",
+ uri: "https://example.com" + CORS_SJS_PATH,
+ visibleOnNewEvent: true,
+ visibleOnSecurityInfo: true,
+ visibleOnceComplete: true,
+ securityState: "secure",
+ },
+ {
+ desc: "broken https request",
+ uri: "https://nocert.example.com",
+ isBroken: true,
+ visibleOnNewEvent: true,
+ visibleOnSecurityInfo: true,
+ visibleOnceComplete: true,
+ securityState: "broken",
+ },
+ ];
+
+ const { tab, monitor } = await initNetMonitor(CUSTOM_GET_URL, {
+ requestCount: 1,
+ });
+ const { document, store, windowRequire } = monitor.panelWin;
+ const Actions = windowRequire("devtools/client/netmonitor/src/actions/index");
+ const { getSelectedRequest } = windowRequire(
+ "devtools/client/netmonitor/src/selectors/index"
+ );
+
+ store.dispatch(Actions.batchEnable(false));
+
+ for (const testcase of TEST_DATA) {
+ info("Testing Security tab visibility for " + testcase.desc);
+ const onNewItem = monitor.panelWin.api.once(TEST_EVENTS.NETWORK_EVENT);
+ const onComplete = testcase.isBroken
+ ? waitForSecurityBrokenNetworkEvent()
+ : waitForNetworkEvents(monitor, 1);
+
+ info("Performing a request to " + testcase.uri);
+ await SpecialPowers.spawn(
+ tab.linkedBrowser,
+ [testcase.uri],
+ async function (url) {
+ content.wrappedJSObject.performRequests(1, url);
+ }
+ );
+
+ info("Waiting for new network event.");
+ await onNewItem;
+
+ info("Waiting for request to complete.");
+ await onComplete;
+
+ info("Selecting the request.");
+ EventUtils.sendMouseEvent(
+ { type: "mousedown" },
+ document.querySelectorAll(".request-list-item")[0]
+ );
+
+ is(
+ getSelectedRequest(store.getState()).securityState,
+ testcase.securityState,
+ "Security state is immediately set"
+ );
+ is(
+ !!document.querySelector("#security-tab"),
+ testcase.visibleOnNewEvent,
+ "Security tab is " +
+ (testcase.visibleOnNewEvent ? "visible" : "hidden") +
+ " after new request was added to the menu."
+ );
+
+ if (testcase.visibleOnSecurityInfo) {
+ // click security panel to lazy load the securityState
+ await waitUntil(() => document.querySelector("#security-tab"));
+ clickOnSidebarTab(document, "security");
+ await waitUntil(() =>
+ document.querySelector("#security-panel .security-info-value")
+ );
+ info("Waiting for security information to arrive.");
+
+ await waitUntil(
+ () => !!getSelectedRequest(store.getState()).securityState
+ );
+ }
+
+ is(
+ !!document.querySelector("#security-tab"),
+ testcase.visibleOnSecurityInfo,
+ "Security tab is " +
+ (testcase.visibleOnSecurityInfo ? "visible" : "hidden") +
+ " after security information arrived."
+ );
+
+ is(
+ !!document.querySelector("#security-tab"),
+ testcase.visibleOnceComplete,
+ "Security tab is " +
+ (testcase.visibleOnceComplete ? "visible" : "hidden") +
+ " after request has been completed."
+ );
+
+ await clearNetworkEvents(monitor);
+ }
+
+ return teardown(monitor);
+
+ /**
+ * Returns a promise that's resolved once a request with security issues is
+ * completed.
+ */
+ function waitForSecurityBrokenNetworkEvent() {
+ const awaitedEvents = ["UPDATING_EVENT_TIMINGS", "RECEIVED_EVENT_TIMINGS"];
+
+ const promises = awaitedEvents.map(event => {
+ return monitor.panelWin.api.once(EVENTS[event]);
+ });
+
+ return Promise.all(promises);
+ }
+});