browser_net_columns_showhide.js (5138B)
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 showing/hiding columns. 8 */ 9 add_task(async function () { 10 const { monitor } = await initNetMonitor(HTTPS_SIMPLE_URL, { 11 requestCount: 1, 12 }); 13 info("Starting test... "); 14 15 const { document, store, connector, windowRequire } = monitor.panelWin; 16 const { requestData } = connector; 17 const { getSortedRequests } = windowRequire( 18 "devtools/client/netmonitor/src/selectors/index" 19 ); 20 21 const wait = waitForNetworkEvents(monitor, 1); 22 await navigateTo(HTTPS_SIMPLE_URL); 23 await wait; 24 25 const item = getSortedRequests(store.getState())[0]; 26 ok( 27 item.responseHeadersAvailable, 28 "headers are available for lazily fetching" 29 ); 30 31 if (item.responseHeadersAvailable && !item.responseHeaders) { 32 await requestData(item.id, "responseHeaders"); 33 } 34 35 const requestsContainer = document.querySelector(".requests-list-row-group"); 36 ok(requestsContainer, "Container element exists as expected."); 37 const headers = document.querySelector(".requests-list-headers"); 38 39 let columns = store.getState().ui.columns; 40 for (const column in columns) { 41 if (columns[column]) { 42 await testVisibleColumnContextMenuItem(column, document, monitor); 43 testColumnsAlignment(headers, requestsContainer); 44 await testHiddenColumnContextMenuItem(column, document, monitor); 45 } else { 46 await testHiddenColumnContextMenuItem(column, document, monitor); 47 testColumnsAlignment(headers, requestsContainer); 48 await testVisibleColumnContextMenuItem(column, document, monitor); 49 } 50 } 51 52 columns = store.getState().ui.columns; 53 for (const column in columns) { 54 if (columns[column]) { 55 await testVisibleColumnContextMenuItem(column, document, monitor); 56 // Right click on the white-space for the context menu to appear 57 // and toggle column visibility 58 await testWhiteSpaceContextMenuItem(column, document, monitor); 59 } 60 } 61 }); 62 63 async function testWhiteSpaceContextMenuItem(column, document, monitor) { 64 ok( 65 !document.querySelector(`#requests-list-${column}-button`), 66 `Column ${column} should be hidden` 67 ); 68 69 info(`Right clicking on white-space in the header to get the context menu`); 70 EventUtils.sendMouseEvent( 71 { type: "contextmenu" }, 72 document.querySelector(".requests-list-headers") 73 ); 74 75 // Wait for next tick to do stuff async and force repaint. 76 await waitForTick(); 77 await toggleAndCheckColumnVisibility(column, document, monitor); 78 } 79 80 async function testVisibleColumnContextMenuItem(column, document, monitor) { 81 ok( 82 document.querySelector(`#requests-list-${column}-button`), 83 `Column ${column} should be visible` 84 ); 85 86 info(`Clicking context-menu item for ${column}`); 87 88 EventUtils.sendMouseEvent( 89 { type: "contextmenu" }, 90 document.querySelector("#requests-list-status-button") || 91 document.querySelector("#requests-list-waterfall-button") 92 ); 93 94 await waitForTick(); 95 96 const id = `request-list-header-${column}-toggle`; 97 const menuItem = getContextMenuItem(monitor, id); 98 99 is( 100 menuItem.getAttribute("type"), 101 "checkbox", 102 `${column} menu item should have type="checkbox" attribute` 103 ); 104 is( 105 menuItem.getAttribute("checked"), 106 "true", 107 `checked state of ${column} menu item should be correct` 108 ); 109 ok( 110 !menuItem.disabled, 111 `disabled state of ${column} menu item should be correct` 112 ); 113 114 const onHeaderRemoved = waitForDOM( 115 document, 116 `#requests-list-${column}-button`, 117 0 118 ); 119 120 await selectContextMenuItem(monitor, id); 121 122 await onHeaderRemoved; 123 await waitForTick(); 124 125 ok( 126 !document.querySelector(`#requests-list-${column}-button`), 127 `Column ${column} should be hidden` 128 ); 129 } 130 131 async function testHiddenColumnContextMenuItem(column, document, monitor) { 132 ok( 133 !document.querySelector(`#requests-list-${column}-button`), 134 `Column ${column} should be hidden` 135 ); 136 137 info(`Clicking context-menu item for ${column}`); 138 EventUtils.sendMouseEvent( 139 { type: "contextmenu" }, 140 document.querySelector("#requests-list-status-button") || 141 document.querySelector("#requests-list-waterfall-button") 142 ); 143 144 await waitForTick(); 145 await toggleAndCheckColumnVisibility(column, document, monitor); 146 } 147 148 async function toggleAndCheckColumnVisibility(column, document, monitor) { 149 const id = `request-list-header-${column}-toggle`; 150 const menuItem = getContextMenuItem(monitor, id); 151 152 is( 153 menuItem.getAttribute("type"), 154 "checkbox", 155 `${column} menu item should have type="checkbox" attribute` 156 ); 157 ok( 158 !menuItem.getAttribute("checked"), 159 `checked state of ${column} menu item should be correct` 160 ); 161 ok( 162 !menuItem.disabled, 163 `disabled state of ${column} menu item should be correct` 164 ); 165 166 const onHeaderAdded = waitForDOM( 167 document, 168 `#requests-list-${column}-button`, 169 1 170 ); 171 172 await selectContextMenuItem(monitor, id); 173 174 await onHeaderAdded; 175 await waitForTick(); 176 177 ok( 178 document.querySelector(`#requests-list-${column}-button`), 179 `Column ${column} should be visible` 180 ); 181 }