85 lines
2.4 KiB
HTML
85 lines
2.4 KiB
HTML
<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>
|