chromium/third_party/blink/perf_tests/accessibility/many-text-changes-deep-hidden-subtree.html

<!DOCTYPE html>
<html>
<head>
  <style>
    container, leaf {display: block; visibility: hidden;}
  </style>
  <script src="../resources/runner.js"></script>
</head>
<body>
</body>

<script>

var isDone = false;
var startTime;

function runTest() {
  if (startTime) {
    PerfTestRunner.measureValueAsync(PerfTestRunner.now() - startTime);
    PerfTestRunner.addRunTestEndMarker();
  }
  if (!isDone) {
    PerfTestRunner.addRunTestStartMarker();
    startTime = PerfTestRunner.now();

    document.documentElement.className = 'ax-trace-off';  // Pause a11y tracing.
    document.body.innerHTML = '';
    appendManyElements(document.body, 6);  // Create tree 6 levels deep.
    document.documentElement.className = '';  // Begin tracing after next a11y update.

    changeLeafText();

    // Re-run the same test.
    // Wait to allow the asynchronous accessibility code that's
    // covered by traceEventsToMeasure to have a chance to run.
    setTimeout(runTest, 2500);
  }
}

// Recursively add layers of descendants.
function appendManyElements(start, depth) {
  if (depth == 0) {
    start.innerHTML = '<leaf>A</leaf>';
  }
  else {
    // Each element receives 3 new children.
    for (let count = 0; count < 3; count++) {
      let newContainer = document.createElement('container');
      appendManyElements(start.appendChild(newContainer), depth - 1);
    }
  }
}

function changeLeafText(text) {
  let elements = document.querySelectorAll('leaf');
  for (let count = 0; count < elements.length; count ++)
    elements[count].textContent = elements[count].textContent == 'A' ? 'B' : 'A';
}


PerfTestRunner.startMeasureValuesAsync({
  description: 'Test accessibility performance when changing text inside a hidden subtree.',
  unit: 'ms',
  done: function () {
    isDone = true;
  },
  run: function() {
    runTest();
  },
  iterationCount: 6,
  tracingCategories: 'accessibility',
  traceEventsToMeasure: [
    'TotalAccessibilityCleanLayoutLifecycleStages',
    'ProcessDeferredUpdatesLifecycleStage',
    'FinalizingTreeLifecycleStage',
    'SerializeLifecycleStage',
    'RenderAccessibilityImpl::SendPendingAccessibilityEvents',
    'BrowserAccessibilityManager::OnAccessibilityEvents',
    'SerializeLocationChanges',
    "BrowserAccessibilityManager::OnLocationChanges"
  ]
});
</script>

</html>