<script>

function runTest() {
    document.write(`<a><p><span tabindex="0">dummy</span><iframe onload="didLoadIframe()"></iframe><script> document.body.innerHTML = ''; <\/script>`);
}

let callCount = 0;
let span;
let range;
function didLoadIframe() {
    callCount++;
    if (callCount == 1)
        document.write('</a>');
    else if (callCount == 2) {
        // Test ContainerNode::takeAllChildrenFrom adjusts focused node and update ranges.
        span = document.querySelector('span');
        span.focus();
        range = new Range;
        range.selectNode(span.firstChild);
    } else if (callCount == 3) {
        setTimeout(() => {
            let activeElementResult = (document.activeElement == document.body) ? 'PASS' : `FAIL - it was set on ${document.activeElement}`;
            let rangeStartResult = (range.startContainer == document.querySelector('p')) ? 'PASS' : `FAIL - it was set on ${range.startContainer}`;

            document.documentElement.innerHTML = `<body>
            Active Element must be moved to body: ${activeElementResult}<br>
            range.startContainer must be moved to p: ${rangeStartResult}<br>`;

            if (window.testRunner)
                testRunner.notifyDone();
        }, 0);
    }
}

/*

 0. The outer document.write creates the following tree:
    body
      + a
        + p
          + span
          + iframe

 1. iframe's load event fires, and invokes the inner document.write,
    which forces <script> from the outer document.write to be parsed:
    body
      + a
        + p
          + span
          + iframe
          + script

   1.a. The script runs, and invokes document.body.innerHTML = '':
        body

   1.b. The adoption agency algorithm is involved, and p is removed from a
        while both of them are detached from body.

   1.c. The adoption agency algorithm inserts p back into body along with iframe.
        body
          + p
            + span
            + iframe
            + script

 2. iframe's load event fires for the second time per step 1.c.

    2.a. the focus is set on span and a range is created inside span.

    2.b. The adoption agency algorithm now takes all children of p
         and inserts them back under "a", and then inserts "p" under body.

3. iframe's load event fires for the third time per step 2.b.

*/

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

runTest();

</script>
