89 lines
3.2 KiB
HTML
89 lines
3.2 KiB
HTML
<!DOCTYPE html>
|
|
<meta charset=utf-8>
|
|
<title>Node.appendChild: inserting script and iframe</title>
|
|
<script src=/resources/testharness.js></script>
|
|
<script src=/resources/testharnessreport.js></script>
|
|
<body>
|
|
<script>
|
|
|
|
const kScriptContent = `
|
|
state = iframe.contentWindow ? "iframe with content window" : "contentWindow is null";
|
|
`;
|
|
|
|
// This test ensures that a later-inserted script can observe an
|
|
// earlier-inserted iframe's contentWindow.
|
|
test(t => {
|
|
window.state = "script not run yet";
|
|
window.iframe = document.createElement("iframe");
|
|
t.add_cleanup(() => window.iframe.remove());
|
|
|
|
const script = document.createElement("script");
|
|
script.textContent = kScriptContent;
|
|
|
|
const div = document.createElement("div");
|
|
div.appendChild(iframe);
|
|
div.appendChild(script);
|
|
|
|
assert_equals(state, "script not run yet");
|
|
document.body.appendChild(div);
|
|
assert_equals(state, "iframe with content window");
|
|
}, "Script inserted after an iframe in the same appendChild() call can " +
|
|
"observe the iframe's non-null contentWindow");
|
|
|
|
// The below tests assert that an earlier-inserted script does not observe a
|
|
// later-inserted iframe's contentWindow.
|
|
test(t => {
|
|
window.state = "script not run yet";
|
|
window.iframe = document.createElement("iframe");
|
|
t.add_cleanup(() => window.iframe.remove());
|
|
|
|
const script = document.createElement("script");
|
|
script.textContent = kScriptContent;
|
|
|
|
const div = document.createElement("div");
|
|
div.appendChild(script);
|
|
div.appendChild(iframe);
|
|
|
|
assert_equals(state, "script not run yet");
|
|
document.body.appendChild(div);
|
|
assert_equals(state, "contentWindow is null");
|
|
}, "A script inserted atomically before an iframe (using a div) does not " +
|
|
"observe the iframe's contentWindow, since the 'script running' and " +
|
|
"'iframe setup' both happen in order, after DOM insertion completes");
|
|
|
|
test(t => {
|
|
window.state = "script not run yet";
|
|
window.iframe = document.createElement("iframe");
|
|
t.add_cleanup(() => window.iframe.remove());
|
|
|
|
const script = document.createElement("script");
|
|
script.textContent = kScriptContent;
|
|
|
|
const df = document.createDocumentFragment();
|
|
df.appendChild(script);
|
|
df.appendChild(iframe);
|
|
|
|
assert_equals(state, "script not run yet");
|
|
document.body.appendChild(df);
|
|
assert_equals(state, "contentWindow is null");
|
|
}, "A script inserted atomically before an iframe (using a DocumentFragment) " +
|
|
"does not observe the iframe's contentWindow, since the 'script running' " +
|
|
"and 'iframe setup' both happen in order, after DOM insertion completes");
|
|
|
|
test(t => {
|
|
window.state = "script not run yet";
|
|
window.iframe = document.createElement("iframe");
|
|
t.add_cleanup(() => window.iframe.remove());
|
|
|
|
const script = document.createElement("script");
|
|
script.textContent = kScriptContent;
|
|
|
|
assert_equals(state, "script not run yet");
|
|
document.body.append(script, iframe);
|
|
|
|
assert_equals(state, "contentWindow is null");
|
|
}, "A script inserted atomically before an iframe (using a append() with " +
|
|
"multiple arguments) does not observe the iframe's contentWindow, since " +
|
|
"the 'script running' and 'iframe setup' both happen in order, after DOM " +
|
|
"insertion completes");
|
|
</script>
|