tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 };