blob: 1f4de8b7d83c902975b9980f53558a6e5bc7e0ed [file] [log] [blame]
<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>