browser_markup_display_node_02.js (5619B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 // Tests that markup display node are updated when their display changes. 7 8 const TEST_URI = ` 9 <style type="text/css"> 10 #grid { 11 display: grid; 12 } 13 #flex { 14 display: flex; 15 } 16 #flex[hidden] { 17 display: none; 18 } 19 #block { 20 display: block; 21 } 22 #flex 23 </style> 24 <div id="grid">Grid</div> 25 <div id="flex" hidden="">Flex</div> 26 <div id="block">Block</div> 27 `; 28 29 const TEST_DATA = [ 30 { 31 desc: "Hiding the #grid display node by changing its style property", 32 selector: "#grid", 33 before: { 34 textContent: "grid", 35 visible: true, 36 interactive: true, 37 }, 38 async changeStyle() { 39 await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { 40 const node = content.document.getElementById("grid"); 41 node.style.display = "block"; 42 }); 43 }, 44 after: { 45 visible: false, 46 }, 47 }, 48 { 49 desc: "Reusing the 'grid' node, updating the display to 'grid again", 50 selector: "#grid", 51 before: { 52 visible: false, 53 }, 54 async changeStyle() { 55 await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { 56 const node = content.document.getElementById("grid"); 57 node.style.display = "grid"; 58 }); 59 }, 60 after: { 61 textContent: "grid", 62 visible: true, 63 interactive: true, 64 }, 65 }, 66 { 67 desc: "Showing a 'contents' node by changing its style property", 68 selector: "#grid", 69 before: { 70 textContent: "grid", 71 visible: true, 72 interactive: true, 73 }, 74 async changeStyle() { 75 await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { 76 const node = content.document.getElementById("grid"); 77 node.style.display = "contents"; 78 }); 79 }, 80 after: { 81 textContent: "contents", 82 visible: true, 83 interactive: false, 84 }, 85 }, 86 { 87 desc: "Showing a 'grid' node by changing its style property", 88 selector: "#block", 89 before: { 90 visible: false, 91 }, 92 async changeStyle() { 93 await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { 94 const node = content.document.getElementById("block"); 95 node.style.display = "grid"; 96 }); 97 }, 98 after: { 99 textContent: "grid", 100 visible: true, 101 interactive: true, 102 }, 103 }, 104 { 105 desc: "Showing a 'flex' node by removing its hidden attribute", 106 selector: "#flex", 107 before: { 108 visible: false, 109 }, 110 async changeStyle() { 111 await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => 112 content.document.getElementById("flex").removeAttribute("hidden") 113 ); 114 }, 115 after: { 116 textContent: "flex", 117 visible: true, 118 interactive: true, 119 }, 120 }, 121 ]; 122 123 add_task(async function () { 124 const { inspector } = await openInspectorForURL( 125 "data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI) 126 ); 127 128 for (const data of TEST_DATA) { 129 info("Running test case: " + data.desc); 130 await runTestData(inspector, data); 131 } 132 }); 133 134 async function runTestData( 135 inspector, 136 { selector, before, changeStyle, after } 137 ) { 138 await selectNode(selector, inspector); 139 const container = await getContainerForSelector(selector, inspector); 140 141 const beforeBadge = container.elt.querySelector( 142 ".inspector-badge[data-display]" 143 ); 144 is( 145 !!beforeBadge, 146 before.visible, 147 `Display badge is visible as expected for ${selector}: ${before.visible}` 148 ); 149 if (before.visible) { 150 is( 151 beforeBadge.textContent, 152 before.textContent, 153 `Got the correct before display type for ${selector}: ${beforeBadge.textContent}` 154 ); 155 checkBadgeInteractiveState(beforeBadge, before.interactive, selector); 156 } 157 158 info("Listening for the display-change event"); 159 const onDisplayChanged = inspector.markup.walker.once("display-change"); 160 info("Making style changes"); 161 await changeStyle(); 162 const nodes = await onDisplayChanged; 163 164 info("Verifying that the list of changed nodes include our container"); 165 ok(nodes.length, "The display-change event was received with a nodes"); 166 let foundContainer = false; 167 for (const node of nodes) { 168 if (getContainerForNodeFront(node, inspector) === container) { 169 foundContainer = true; 170 break; 171 } 172 } 173 ok(foundContainer, "Container is part of the list of changed nodes"); 174 175 const afterBadge = container.elt.querySelector( 176 ".inspector-badge[data-display]" 177 ); 178 is( 179 !!afterBadge, 180 after.visible, 181 `Display badge is visible as expected for ${selector}: ${after.visible}` 182 ); 183 if (after.visible) { 184 is( 185 afterBadge.textContent, 186 after.textContent, 187 `Got the correct after display type for ${selector}: ${afterBadge.textContent}` 188 ); 189 190 checkBadgeInteractiveState(afterBadge, after.interactive, selector); 191 } 192 } 193 194 function checkBadgeInteractiveState(badgeEl, interactive, selector) { 195 if (interactive) { 196 ok( 197 !badgeEl.hasAttribute("role"), 198 `${badgeEl.textContent} badge for ${selector} does not override the default role` 199 ); 200 is( 201 badgeEl.getAttribute("aria-pressed"), 202 "false", 203 `${badgeEl.textContent} badge for ${selector} has the expected aria-pressed attribute` 204 ); 205 } else { 206 is( 207 badgeEl.getAttribute("role"), 208 "presentation", 209 `${badgeEl.textContent} badge for ${selector} is not interactive` 210 ); 211 ok( 212 !badgeEl.hasAttribute("aria-pressed"), 213 `${badgeEl.textContent} badge for ${selector} does not have an aria-pressed attribute` 214 ); 215 } 216 }