Bug 1924993 - [devtools] Debugger tests wait before typing in conditional panel r...
[gecko.git] / devtools / client / netmonitor / test / browser_net_security-tab-visibility.js
blob8ffc8efd503f48eac4241d597eb2c510a1063cf7
1 /* Any copyright is dedicated to the Public Domain.
2 http://creativecommons.org/publicdomain/zero/1.0/ */
4 "use strict";
6 /**
7 * Test that security details tab is visible only when it should.
8 */
10 add_task(async function () {
11 // This test explicitly asserts some insecure domains.
12 await pushPref("dom.security.https_first", false);
14 const TEST_DATA = [
16 desc: "http request",
17 uri: "http://example.com" + CORS_SJS_PATH,
18 visibleOnNewEvent: false,
19 visibleOnSecurityInfo: false,
20 visibleOnceComplete: false,
21 securityState: "insecure",
24 desc: "working https request",
25 uri: "https://example.com" + CORS_SJS_PATH,
26 visibleOnNewEvent: true,
27 visibleOnSecurityInfo: true,
28 visibleOnceComplete: true,
29 securityState: "secure",
32 desc: "broken https request",
33 uri: "https://nocert.example.com",
34 isBroken: true,
35 visibleOnNewEvent: true,
36 visibleOnSecurityInfo: true,
37 visibleOnceComplete: true,
38 securityState: "broken",
42 const { tab, monitor } = await initNetMonitor(CUSTOM_GET_URL, {
43 requestCount: 1,
44 });
45 const { document, store, windowRequire } = monitor.panelWin;
46 const Actions = windowRequire("devtools/client/netmonitor/src/actions/index");
47 const { getSelectedRequest } = windowRequire(
48 "devtools/client/netmonitor/src/selectors/index"
51 store.dispatch(Actions.batchEnable(false));
53 for (const testcase of TEST_DATA) {
54 info("Testing Security tab visibility for " + testcase.desc);
55 const onNewItem = monitor.panelWin.api.once(TEST_EVENTS.NETWORK_EVENT);
56 const onComplete = testcase.isBroken
57 ? waitForSecurityBrokenNetworkEvent()
58 : waitForNetworkEvents(monitor, 1);
60 info("Performing a request to " + testcase.uri);
61 await SpecialPowers.spawn(
62 tab.linkedBrowser,
63 [testcase.uri],
64 async function (url) {
65 content.wrappedJSObject.performRequests(1, url);
69 info("Waiting for new network event.");
70 await onNewItem;
72 info("Waiting for request to complete.");
73 await onComplete;
75 info("Selecting the request.");
76 EventUtils.sendMouseEvent(
77 { type: "mousedown" },
78 document.querySelectorAll(".request-list-item")[0]
81 is(
82 getSelectedRequest(store.getState()).securityState,
83 testcase.securityState,
84 "Security state is immediately set"
86 is(
87 !!document.querySelector("#security-tab"),
88 testcase.visibleOnNewEvent,
89 "Security tab is " +
90 (testcase.visibleOnNewEvent ? "visible" : "hidden") +
91 " after new request was added to the menu."
94 if (testcase.visibleOnSecurityInfo) {
95 // click security panel to lazy load the securityState
96 await waitUntil(() => document.querySelector("#security-tab"));
97 clickOnSidebarTab(document, "security");
98 await waitUntil(() =>
99 document.querySelector("#security-panel .security-info-value")
101 info("Waiting for security information to arrive.");
103 await waitUntil(
104 () => !!getSelectedRequest(store.getState()).securityState
109 !!document.querySelector("#security-tab"),
110 testcase.visibleOnSecurityInfo,
111 "Security tab is " +
112 (testcase.visibleOnSecurityInfo ? "visible" : "hidden") +
113 " after security information arrived."
117 !!document.querySelector("#security-tab"),
118 testcase.visibleOnceComplete,
119 "Security tab is " +
120 (testcase.visibleOnceComplete ? "visible" : "hidden") +
121 " after request has been completed."
124 await clearNetworkEvents(monitor);
127 return teardown(monitor);
130 * Returns a promise that's resolved once a request with security issues is
131 * completed.
133 function waitForSecurityBrokenNetworkEvent() {
134 const awaitedEvents = ["UPDATING_EVENT_TIMINGS", "RECEIVED_EVENT_TIMINGS"];
136 const promises = awaitedEvents.map(event => {
137 return monitor.panelWin.api.once(EVENTS[event]);
140 return Promise.all(promises);