blob: e4f6001eda3e295b69b6989680e04bd67412f7a6 [file] [log] [blame]
<!doctype html>
<title>Test AudioContext construction when document is not fully active</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/common/get-host-info.sub.js"></script>
<body></body>
<script>
const dir = location.pathname.replace(/\/[^\/]*$/, '/');
const helper = dir + 'resources/not-fully-active-helper.sub.html?childsrc=';
const remote_helper = get_host_info().HTTP_NOTSAMESITE_ORIGIN + helper;
const blank_url = get_host_info().ORIGIN + '/common/blank.html';
const load_content = (frame, src) => {
if (src == undefined) {
frame.srcdoc = '<html></html>';
} else {
frame.src = src;
}
return new Promise(resolve => frame.onload = () => resolve(frame));
};
const append_iframe = (src) => {
const frame = document.createElement('iframe');
document.body.appendChild(frame);
return load_content(frame, src);
};
const remote_op = (win, op) => {
win.postMessage(op, '*');
return new Promise(resolve => window.onmessage = e => {
if (e.data == 'DONE ' + op) resolve();
});
};
const test_constructor_throws = async (win, deactivate) => {
const {AudioContext, DOMException} = win;
await deactivate();
assert_throws_dom("InvalidStateError", DOMException,
() => new AudioContext());
};
promise_test(async () => {
const frame = await append_iframe();
return test_constructor_throws(frame.contentWindow, () => frame.remove());
}, "removed frame");
promise_test(async () => {
const frame = await append_iframe();
return test_constructor_throws(frame.contentWindow,
() => load_content(frame));
}, "navigated frame");
promise_test(async () => {
const frame = await append_iframe(helper + blank_url);
const inner = frame.contentWindow.frames[0];
return test_constructor_throws(inner, () => frame.remove());
}, "frame in removed frame");
promise_test(async () => {
const frame = await append_iframe(helper + blank_url);
const inner = frame.contentWindow.frames[0];
return test_constructor_throws(inner, () => load_content(frame));
}, "frame in navigated frame");
promise_test(async () => {
const frame = await append_iframe(remote_helper + blank_url);
const inner = frame.contentWindow.frames[0];
return test_constructor_throws(inner, () => frame.remove());
}, "frame in removed remote-site frame");
promise_test(async () => {
const frame = await append_iframe(remote_helper + blank_url);
const inner = frame.contentWindow.frames[0];
return test_constructor_throws(inner, () => load_content(frame));
}, "frame in navigated remote-site frame");
promise_test(async () => {
const outer = (await append_iframe(remote_helper + blank_url)).contentWindow;
const inner = outer.frames[0];
return test_constructor_throws(inner,
() => remote_op(outer, 'REMOVE FRAME'));
}, "removed frame in remote-site frame");
promise_test(async () => {
const outer = (await append_iframe(remote_helper + blank_url)).contentWindow;
const inner = outer.frames[0];
return test_constructor_throws(inner,
() => remote_op(outer, 'NAVIGATE FRAME'));
}, "navigated frame in remote-site frame");
promise_test(async () => {
const url = remote_helper + helper + blank_url;
const outer = (await append_iframe(url)).contentWindow;
const inner = outer.frames[0].frames[0];
return test_constructor_throws(inner,
() => remote_op(outer, 'REMOVE FRAME'));
}, "frame in removed remote-site frame in remote-site frame");
promise_test(async () => {
const url = remote_helper + helper + blank_url;
const outer = (await append_iframe(url)).contentWindow;
const inner = outer.frames[0].frames[0];
return test_constructor_throws(inner,
() => remote_op(outer, 'NAVIGATE FRAME'));
}, "frame in navigated remote-site frame in remote-site frame");
</script>