// META: timeout=long async_test(t => { const run_result = 'test_frame_OK'; const blob_contents = '\n\n' + ''; const blob = new Blob([blob_contents], {type: 'text/html'}); const url = URL.createObjectURL(blob); const frame = document.createElement('iframe'); frame.setAttribute('src', url); frame.setAttribute('style', 'display:none;'); document.body.appendChild(frame); URL.revokeObjectURL(url); frame.onload = t.step_func_done(() => { assert_equals(frame.contentWindow.test_result, run_result); }); }, 'Fetching a blob URL immediately before revoking it works in an iframe.'); async_test(t => { const run_result = 'test_frame_OK'; const blob_contents = '\n\n' + ''; const blob = new Blob([blob_contents], {type: 'text/html'}); const url = URL.createObjectURL(blob); const frame = document.createElement('iframe'); frame.setAttribute('src', '/common/blank.html'); frame.setAttribute('style', 'display:none;'); document.body.appendChild(frame); frame.onload = t.step_func(() => { frame.contentWindow.location = url; URL.revokeObjectURL(url); frame.onload = t.step_func_done(() => { assert_equals(frame.contentWindow.test_result, run_result); }); }); }, 'Fetching a blob URL immediately before revoking it works in an iframe navigation.'); async_test(t => { const run_result = 'test_frame_OK'; const blob_contents = '\n\n' + ''; const blob = new Blob([blob_contents], {type: 'text/html'}); const url = URL.createObjectURL(blob); const win = window.open(url); URL.revokeObjectURL(url); add_completion_callback(() => { win.close(); }); win.onload = t.step_func_done(() => { assert_equals(win.test_result, run_result); }); }, 'Opening a blob URL in a new window immediately before revoking it works.'); function receive_message_on_channel(t, channel_name) { const channel = new BroadcastChannel(channel_name); return new Promise(resolve => { channel.addEventListener('message', t.step_func(e => { resolve(e.data); })); }); } function window_contents_for_channel(channel_name) { return '\n' + ''; } async_test(t => { const channel_name = 'noopener-window-test'; const blob = new Blob([window_contents_for_channel(channel_name)], {type: 'text/html'}); receive_message_on_channel(t, channel_name).then(t.step_func_done(t => { assert_equals(t, 'foobar'); })); const url = URL.createObjectURL(blob); const win = window.open(); win.opener = null; win.location = url; URL.revokeObjectURL(url); }, 'Opening a blob URL in a noopener about:blank window immediately before revoking it works.'); async_test(t => { const run_result = 'test_script_OK'; const blob_contents = 'window.script_test_result = "' + run_result + '";'; const blob = new Blob([blob_contents]); const url = URL.createObjectURL(blob); const e = document.createElement('script'); e.setAttribute('src', url); e.onload = t.step_func_done(() => { assert_equals(window.script_test_result, run_result); }); document.body.appendChild(e); URL.revokeObjectURL(url); }, 'Fetching a blob URL immediately before revoking it works in