browser_inspector_pseudoclass-menu.js (3173B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 "use strict"; 4 5 // Test that the inspector has the correct pseudo-class locking menu items and 6 // that these items actually work 7 8 const { 9 PSEUDO_CLASSES, 10 } = require("resource://devtools/shared/css/constants.js"); 11 const nodeConstants = require("resource://devtools/shared/dom-node-constants.js"); 12 13 const TEST_URI = `data:text/html;charset=UTF-8, 14 <style> 15 div::after { 16 content: "-"; 17 } 18 </style> 19 <h1>pseudo-class lock node menu tests</h1> 20 <div>test div</div>`; 21 // Strip the colon prefix from pseudo-classes (:before => before) 22 const PSEUDOS = PSEUDO_CLASSES.map(pseudo => pseudo.substr(1)); 23 24 add_task(async function () { 25 const { inspector } = await openInspectorForURL(TEST_URI); 26 const divNodeFront = await getNodeFront("div", inspector); 27 const divChildren = await inspector.walker.children(divNodeFront); 28 29 info("Check pseudo element context menu on regular node"); 30 await selectNode(divNodeFront, inspector); 31 let allMenuItems = openContextMenuAndGetAllItems(inspector); 32 await testMenuItems(allMenuItems, inspector, true); 33 34 const [textNodeFront, afterNodeFront] = divChildren.nodes; 35 36 info("Check pseudo element context menu on text node"); 37 await selectNode(textNodeFront, inspector); 38 // sanity check 39 is( 40 inspector.selection.nodeFront.nodeType, 41 nodeConstants.TEXT_NODE, 42 "We selected the text node" 43 ); 44 allMenuItems = openContextMenuAndGetAllItems(inspector); 45 await testMenuItems(allMenuItems, inspector, false); 46 47 info("Check pseudo element context menu on pseudo element node"); 48 await selectNode(afterNodeFront, inspector); 49 is( 50 inspector.selection.nodeFront.displayName, 51 "::after", 52 "We selected the ::after pseudo element" 53 ); 54 allMenuItems = openContextMenuAndGetAllItems(inspector); 55 await testMenuItems(allMenuItems, inspector, false); 56 }); 57 58 async function testMenuItems(allMenuItems, inspector, enabled) { 59 for (const pseudo of PSEUDOS) { 60 const menuItem = allMenuItems.find( 61 item => item.id === "node-menu-pseudo-" + pseudo 62 ); 63 ok(menuItem, ":" + pseudo + " menuitem exists"); 64 is( 65 menuItem.disabled, 66 !enabled, 67 `:${pseudo} menuitem is ${enabled ? "enabled" : "disabled"} for "${inspector.selection.nodeFront.displayName}"` 68 ); 69 70 if (!enabled) { 71 continue; 72 } 73 74 // Give the inspector panels a chance to update when the pseudoclass changes 75 const onPseudo = inspector.selection.once("pseudoclass"); 76 const onRefresh = inspector.once("rule-view-refreshed"); 77 78 // Walker uses SDK-events so calling walker.once does not return a promise. 79 const onMutations = once(inspector.walker, "mutations"); 80 81 menuItem.click(); 82 83 await onPseudo; 84 await onRefresh; 85 await onMutations; 86 87 const hasLock = await SpecialPowers.spawn( 88 gBrowser.selectedBrowser, 89 [`:${pseudo}`], 90 pseudoClass => { 91 const element = content.document.querySelector("div"); 92 return InspectorUtils.hasPseudoClassLock(element, pseudoClass); 93 } 94 ); 95 ok(hasLock, "pseudo-class lock has been applied"); 96 } 97 }