forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			85 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Any copyright is dedicated to the Public Domain.
 | |
|  * https://creativecommons.org/publicdomain/zero/1.0/ */
 | |
| /* eslint-env node */
 | |
| "use strict";
 | |
| 
 | |
| /* global module */
 | |
| async function test(context, commands) {
 | |
|   await context.selenium.driver.setContext("chrome");
 | |
|   let elementData = await context.selenium.driver.executeAsyncScript(
 | |
|     function() {
 | |
|       let callback = arguments[arguments.length - 1];
 | |
|       (async function() {
 | |
|         let lightDOM = document.querySelectorAll("*");
 | |
|         let elementsWithoutIDs = {};
 | |
|         let idElements = [];
 | |
|         let lightDOMDetails = { idElements, elementsWithoutIDs };
 | |
|         lightDOM.forEach(n => {
 | |
|           if (n.id) {
 | |
|             idElements.push(n.id);
 | |
|           } else {
 | |
|             if (!elementsWithoutIDs.hasOwnProperty(n.localName)) {
 | |
|               elementsWithoutIDs[n.localName] = 0;
 | |
|             }
 | |
|             elementsWithoutIDs[n.localName]++;
 | |
|           }
 | |
|         });
 | |
|         let lightDOMCount = lightDOM.length;
 | |
| 
 | |
|         // Recursively explore shadow DOM:
 | |
|         function getShadowElements(root) {
 | |
|           let allElems = Array.from(root.querySelectorAll("*"));
 | |
|           let shadowRoots = allElems.map(n => n.openOrClosedShadowRoot);
 | |
|           for (let innerRoot of shadowRoots) {
 | |
|             if (innerRoot) {
 | |
|               allElems.push(getShadowElements(innerRoot));
 | |
|             }
 | |
|           }
 | |
|           return allElems;
 | |
|         }
 | |
|         let totalDOMCount = Array.from(lightDOM, node => {
 | |
|           if (node.openOrClosedShadowRoot) {
 | |
|             return [node].concat(
 | |
|               getShadowElements(node.openOrClosedShadowRoot)
 | |
|             );
 | |
|           }
 | |
|           return node;
 | |
|         }).flat().length;
 | |
|         let panelMenuCount = document.querySelectorAll(
 | |
|           "panel,menupopup,popup,popupnotification"
 | |
|         ).length;
 | |
|         return {
 | |
|           panelMenuCount,
 | |
|           lightDOMCount,
 | |
|           totalDOMCount,
 | |
|           lightDOMDetails,
 | |
|         };
 | |
|       })().then(callback);
 | |
|     }
 | |
|   );
 | |
|   let { lightDOMDetails } = elementData;
 | |
|   delete elementData.lightDOMDetails;
 | |
|   lightDOMDetails.idElements.sort();
 | |
|   for (let id of lightDOMDetails.idElements) {
 | |
|     console.log(id);
 | |
|   }
 | |
|   console.log("Elements without ids:");
 | |
|   for (let [localName, count] of Object.entries(
 | |
|     lightDOMDetails.elementsWithoutIDs
 | |
|   )) {
 | |
|     console.log(count.toString().padStart(4) + " " + localName);
 | |
|   }
 | |
|   console.log(elementData);
 | |
|   await context.selenium.driver.setContext("content");
 | |
|   await commands.measure.start("data:text/html,BrowserDOM");
 | |
|   commands.measure.addObject(elementData);
 | |
| }
 | |
| 
 | |
| module.exports = {
 | |
|   test,
 | |
|   owner: "Browser Front-end team",
 | |
|   name: "Dom-size",
 | |
|   description: "Measures the size of the DOM",
 | |
|   supportedBrowsers: ["Desktop"],
 | |
|   supportedPlatforms: ["Windows", "Linux", "macOS"],
 | |
| };
 | 
