chromium/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain.html

<!--
@WAIT-FOR:Done
@BLINK-ALLOW:htmlTag*
-->
<html>
<body>
  <!-- This whole subtree is display:none, so all nodes will be
       ignored, and the default will be for all of them to be
       not included in the tree unless there's a good reason to
       include them.

       Adding lang="en" forces a node to be included in the tree
       without many other side effects, so when you see lang="en"
       on a node here, that ensures it will be included in the tree.
       The other nodes will not. -->
  <div hidden>
    <h2 lang="en">
      <div>
        <here>
        </here>
      </div>
    </h2>
  </div>

  <div role="group" id="test-status" aria-label="running"></div>

  <script>
    setTimeout(() => {
        // After the page finishes loading...
        //
        // Add a paragraph child to the node <here> and include it
        // in the tree (using lang=en). Because <here> and its
        // parent <div> are both not included in the tree, it
        // should be added as a child of the heading - but a bug
        // was preventing this from happening as it should.
        let here = document.querySelector('here');
        let child = document.createElement('p');
        child.setAttribute('lang', 'en');
        here.appendChild(child);

        // Now add a child of that paragraph and include it in the
        // tree too.
        let grandchild = document.createElement('li');
        grandchild.setAttribute('lang', 'en');
        child.appendChild(grandchild);

        // Finally, change the role on this grandchild. This is to
        // check for a totally separate regression where an event
        // that fires on a node that's not reachable can lead to
        // an endless loop in SendPendingAccessibilityEvents.
        grandchild.setAttribute('role', 'button');
    }, 100);

    // Make the test end after some time has passed, because one
    // possible regression this can cause is continuously sending
    // the same event over and over again. The test needs to run
    // long enough for it to either generate abnormal logspam or
    // run out of memory or something like that.
    setTimeout(() => {
        document.getElementById('test-status').setAttribute('aria-label', 'Done');
    }, 600);

  </script>
</body>
</html>