perftest_browser_xhtml_dom.js (2767B)
1 /* Any copyright is dedicated to the Public Domain. 2 * https://creativecommons.org/publicdomain/zero/1.0/ */ 3 /* eslint-env node */ 4 "use strict"; 5 6 /* global module */ 7 async function test(context, commands) { 8 await context.selenium.driver.setContext("chrome"); 9 let elementData = await context.selenium.driver.executeAsyncScript( 10 function () { 11 let callback = arguments[arguments.length - 1]; 12 (async function () { 13 let lightDOM = document.querySelectorAll("*"); 14 let elementsWithoutIDs = {}; 15 let idElements = []; 16 let lightDOMDetails = { idElements, elementsWithoutIDs }; 17 lightDOM.forEach(n => { 18 if (n.id) { 19 idElements.push(n.id); 20 } else { 21 if (!elementsWithoutIDs.hasOwnProperty(n.localName)) { 22 elementsWithoutIDs[n.localName] = 0; 23 } 24 elementsWithoutIDs[n.localName]++; 25 } 26 }); 27 let lightDOMCount = lightDOM.length; 28 29 // Recursively explore shadow DOM: 30 function getShadowElements(root) { 31 let allElems = Array.from(root.querySelectorAll("*")); 32 let shadowRoots = allElems.map(n => n.openOrClosedShadowRoot); 33 for (let innerRoot of shadowRoots) { 34 if (innerRoot) { 35 allElems.push(getShadowElements(innerRoot)); 36 } 37 } 38 return allElems; 39 } 40 let totalDOMCount = Array.from(lightDOM, node => { 41 if (node.openOrClosedShadowRoot) { 42 return [node].concat( 43 getShadowElements(node.openOrClosedShadowRoot) 44 ); 45 } 46 return node; 47 }).flat().length; 48 let panelMenuCount = document.querySelectorAll( 49 "panel,menupopup,popup,popupnotification" 50 ).length; 51 return { 52 panelMenuCount, 53 lightDOMCount, 54 totalDOMCount, 55 lightDOMDetails, 56 }; 57 })().then(callback); 58 } 59 ); 60 let { lightDOMDetails } = elementData; 61 delete elementData.lightDOMDetails; 62 lightDOMDetails.idElements.sort(); 63 for (let id of lightDOMDetails.idElements) { 64 console.log(id); 65 } 66 console.log("Elements without ids:"); 67 for (let [localName, count] of Object.entries( 68 lightDOMDetails.elementsWithoutIDs 69 )) { 70 console.log(count.toString().padStart(4) + " " + localName); 71 } 72 console.log(elementData); 73 await context.selenium.driver.setContext("content"); 74 await commands.measure.start("data:text/html,BrowserDOM"); 75 commands.measure.addObject(elementData); 76 } 77 78 module.exports = { 79 test, 80 owner: "Browser Front-end team", 81 name: "Dom-size", 82 description: "Measures the size of the DOM", 83 supportedBrowsers: ["Desktop"], 84 supportedPlatforms: ["Windows", "Linux", "macOS"], 85 };