browser_net_security-tab-visibility.js (4160B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 /** 7 * Test that security details tab is visible only when it should. 8 */ 9 10 add_task(async function () { 11 // This test explicitly asserts some insecure domains. 12 await pushPref("dom.security.https_first", false); 13 14 const TEST_DATA = [ 15 { 16 desc: "http request", 17 uri: "http://example.com" + CORS_SJS_PATH, 18 visibleOnNewEvent: false, 19 visibleOnSecurityInfo: false, 20 visibleOnceComplete: false, 21 securityState: "insecure", 22 }, 23 { 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", 30 }, 31 { 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", 39 }, 40 ]; 41 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" 49 ); 50 51 store.dispatch(Actions.batchEnable(false)); 52 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); 59 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); 66 } 67 ); 68 69 info("Waiting for new network event."); 70 await onNewItem; 71 72 info("Waiting for request to complete."); 73 await onComplete; 74 75 info("Selecting the request."); 76 EventUtils.sendMouseEvent( 77 { type: "mousedown" }, 78 document.querySelectorAll(".request-list-item")[0] 79 ); 80 81 await waitForAllNetworkUpdateEvents(); 82 83 is( 84 getSelectedRequest(store.getState()).securityState, 85 testcase.securityState, 86 "Security state is immediately set" 87 ); 88 is( 89 !!document.querySelector("#security-tab"), 90 testcase.visibleOnNewEvent, 91 "Security tab is " + 92 (testcase.visibleOnNewEvent ? "visible" : "hidden") + 93 " after new request was added to the menu." 94 ); 95 96 if (testcase.visibleOnSecurityInfo) { 97 // click security panel to lazy load the securityState 98 await waitUntil(() => document.querySelector("#security-tab")); 99 clickOnSidebarTab(document, "security"); 100 await waitUntil(() => 101 document.querySelector("#security-panel .security-info-value") 102 ); 103 info("Waiting for security information to arrive."); 104 105 await waitUntil( 106 () => !!getSelectedRequest(store.getState()).securityState 107 ); 108 } 109 110 is( 111 !!document.querySelector("#security-tab"), 112 testcase.visibleOnSecurityInfo, 113 "Security tab is " + 114 (testcase.visibleOnSecurityInfo ? "visible" : "hidden") + 115 " after security information arrived." 116 ); 117 118 is( 119 !!document.querySelector("#security-tab"), 120 testcase.visibleOnceComplete, 121 "Security tab is " + 122 (testcase.visibleOnceComplete ? "visible" : "hidden") + 123 " after request has been completed." 124 ); 125 126 await clearNetworkEvents(monitor); 127 } 128 129 return teardown(monitor); 130 131 /** 132 * Returns a promise that's resolved once a request with security issues is 133 * completed. 134 */ 135 function waitForSecurityBrokenNetworkEvent() { 136 const awaitedEvents = ["UPDATING_EVENT_TIMINGS", "RECEIVED_EVENT_TIMINGS"]; 137 138 const promises = awaitedEvents.map(event => { 139 return monitor.panelWin.api.once(EVENTS[event]); 140 }); 141 142 return Promise.all(promises); 143 } 144 });