1 /* Any copyright is dedicated to the Public Domain.
2 http://creativecommons.org/publicdomain/zero/1.0/ */
7 * Test that security details tab is visible only when it should.
10 add_task(async
function () {
11 // This test explicitly asserts some insecure domains.
12 await
pushPref("dom.security.https_first", false);
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",
35 visibleOnNewEvent
: true,
36 visibleOnSecurityInfo
: true,
37 visibleOnceComplete
: true,
38 securityState
: "broken",
42 const { tab
, monitor
} = await
initNetMonitor(CUSTOM_GET_URL
, {
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(
64 async
function (url
) {
65 content
.wrappedJSObject
.performRequests(1, url
);
69 info("Waiting for new network event.");
72 info("Waiting for request to complete.");
75 info("Selecting the request.");
76 EventUtils
.sendMouseEvent(
77 { type
: "mousedown" },
78 document
.querySelectorAll(".request-list-item")[0]
82 getSelectedRequest(store
.getState()).securityState
,
83 testcase
.securityState
,
84 "Security state is immediately set"
87 !!document
.querySelector("#security-tab"),
88 testcase
.visibleOnNewEvent
,
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");
99 document
.querySelector("#security-panel .security-info-value")
101 info("Waiting for security information to arrive.");
104 () => !!getSelectedRequest(store
.getState()).securityState
109 !!document
.querySelector("#security-tab"),
110 testcase
.visibleOnSecurityInfo
,
112 (testcase
.visibleOnSecurityInfo
? "visible" : "hidden") +
113 " after security information arrived."
117 !!document
.querySelector("#security-tab"),
118 testcase
.visibleOnceComplete
,
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
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
);