Source code

Revision control

Other Tools

Test Info:

<!doctype html>
<meta charset=utf-8>
<title></title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
const setupIframe = (t, attrs) => {
const iframe = document.createElement('iframe');
for (const [key, value] of Object.entries(attrs))
iframe[key] = value;
const watcher = new EventWatcher(t, iframe, ['load']);
document.body.appendChild(iframe);
return {iframe, watcher};
};
promise_test(async t => {
const {iframe, watcher} = setupIframe(t, {});
// the task to perform the "iframe load event steps" should still be queued.
// If a browser already fired a load event, the test will fail here since
// EventWatcher will have received an unexpected load event.
iframe.contentWindow.persistedString = 'Hello world!';
iframe.src = 'support/same-origin-iframe.html';
await watcher.wait_for(['load']);
assert_true(iframe.contentWindow.didLoadFrame);
// The <iframe>'s session history has only one Document, and that Document is
// the initial:blank Document. The Window object should be reused per
assert_equals(iframe.contentWindow.persistedString, 'Hello world!');
}, 'synchronously navigate iframe with no initial src.');
promise_test(async t => {
const {iframe, watcher} = setupIframe(t, {});
// the task to perform the "iframe load event steps" should still be queued.
await watcher.wait_for(['load']);
iframe.contentWindow.persistedString = 'Hello world!';
iframe.src = 'support/same-origin-iframe.html';
await watcher.wait_for(['load']);
assert_true(iframe.contentWindow.didLoadFrame);
// The <iframe>'s session history has only one Document, and that Document is
// the initial:blank Document. The Window object should be reused per
assert_equals(iframe.contentWindow.persistedString, 'Hello world!');
}, 'after the first iframe load event, navigate iframe with no initial src.');
// setting the <iframe> src to an empty string before inserting the <iframe>
// into the document should begin an attempt to navigate to a resource with
// url == "about:blank".
promise_test(async t => {
const {iframe, watcher} = setupIframe(t, {src: ''});
// resource should be obtained "in parallel". If a browser performs this step
// synchronously, the test will fail here since EventWatcher will have
// received an unexpected load event.
iframe.contentWindow.persistedString = 'Hello world!';
// An attempt to navigate to "about:blank" already exists but should not have
// matured yet since the resource should be obtained "in parallel". The new
// navigation attempt will cancel the preexisting attempt.
iframe.src = 'support/same-origin-iframe.html';
await watcher.wait_for(['load']);
assert_true(iframe.contentWindow.didLoadFrame);
// The navigation attempt to "about:blank" was cancelled, so the <iframe>'s
// session history has only one Document, and that Document is the
// initial:blank Document. The Window object should be reused per
assert_equals(iframe.contentWindow.persistedString, 'Hello world!');
}, 'synchronously navigate iframe with initial src == "".');
promise_test(async t => {
const {iframe, watcher} = setupIframe(t, {src: ''});
// resource should be obtained "in parallel".
await watcher.wait_for(['load']);
iframe.contentWindow.persistedString = 'Hello world!';
iframe.src = 'support/same-origin-iframe.html';
await watcher.wait_for(['load']);
assert_true(iframe.contentWindow.didLoadFrame);
// A non-initial navigation to about:blank was committed, so the <iframe>
// element is no longer displaying the initial about:blank Document. Per
// the Window object must not be reused.
assert_equals(iframe.contentWindow.persistedString, undefined);
}, 'after the first iframe load event, navigate iframe with initial src == "".');
promise_test(async t => {
const {iframe, watcher} = setupIframe(t, {src: 'about:blank'});
// resource should be obtained "in parallel". If a browser performs this step
// synchronously, the test will fail here since EventWatcher will have
// received an unexpected load event.
iframe.contentWindow.persistedString = 'Hello world!';
// An attempt to navigate to "about:blank" already exists but should not have
// matured yet since the resource should be obtained "in parallel". The new
// navigation attempt will cancel the preexisting attempt.
iframe.src = 'support/same-origin-iframe.html';
await watcher.wait_for(['load']);
assert_true(iframe.contentWindow.didLoadFrame);
// The navigation attempt to "about:blank" was cancelled, so the <iframe>'s
// session history has only one Document, and that Document is the
// initial:blank Document. The Window object should be reused per
assert_equals(iframe.contentWindow.persistedString, 'Hello world!');
}, 'synchronously navigate iframe with initial src == "about:blank".');
promise_test(async t => {
const {iframe, watcher} = setupIframe(t, {src: 'about:blank'});
// resource should be obtained "in parallel".
await watcher.wait_for(['load']);
iframe.contentWindow.persistedString = 'Hello world!';
iframe.src = 'support/same-origin-iframe.html';
await watcher.wait_for(['load']);
assert_true(iframe.contentWindow.didLoadFrame);
// A non-initial navigation to about:blank was committed, so the <iframe>
// element is no longer displaying the initial about:blank Document. Per
// the Window object must not be reused.
assert_equals(iframe.contentWindow.persistedString, undefined);
}, 'after the first iframe load event, navigate iframe with initial src == "about:blank".');
// setting <iframe> src before inserting the <iframe> into the document should
// begin an attempt to navigate to the value of the src attribute.
promise_test(async t => {
const {iframe, watcher} = setupIframe(t, {src: 'support/same-origin-iframe.html'});
iframe.contentWindow.persistedString = 'Hello world!';
// Completion of the attempt to navigate happens "in parallel".
await watcher.wait_for(['load']);
assert_true(iframe.contentWindow.didLoadFrame);
// The <iframe>'s session history has only one Document, and that Document is
// the initial:blank Document. The Window object should be reused per
assert_equals(iframe.contentWindow.persistedString, 'Hello world!');
}, 'iframe with initial src == same-origin resource.');
</script>