From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../content/test/perftest_browser_xhtml_dom.js | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 browser/base/content/test/perftest_browser_xhtml_dom.js (limited to 'browser/base/content/test/perftest_browser_xhtml_dom.js') diff --git a/browser/base/content/test/perftest_browser_xhtml_dom.js b/browser/base/content/test/perftest_browser_xhtml_dom.js new file mode 100644 index 0000000000..f3cc00ec49 --- /dev/null +++ b/browser/base/content/test/perftest_browser_xhtml_dom.js @@ -0,0 +1,85 @@ +/* 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"], +}; -- cgit v1.2.3