| <!DOCTYPE html> |
| <html lang="en"> |
| <meta charset="utf-8"> |
| <title>Cross-Origin-Opener-Policy forces browsing context switch in various popup document types</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/common/utils.js"></script> |
| |
| <p>These tests create a "parent" popup window which is an HTML document with a |
| specific Cross-Origin-Opener-Policy. The parent creates a "child" popup window |
| which is a non-HTML document with a Cross-Origin-Opener-Policy of its own. The |
| parent waits for the child's location to change from "<code>about:blank</code>" |
| and then inspects its <code>name</code> and <code>closed</code> properties |
| which it reports back to the test context.</p> |
| |
| <p>The HTTP `Refresh` header is used to ensure the child eventually closes |
| itself (since proper observance of COOP will prevent the parent from closing |
| the child in some cases).</p> |
| |
| <script> |
| 'use strict'; |
| |
| const coop_resource_test = ({parentCoop, resourceCoop, resource, resourceName, validate}) => { |
| async_test((t) => { |
| const bc = new BroadcastChannel(token()); |
| bc.onmessage = t.step_func_done(({data}) => validate(data)); |
| const childLocation = resource + |
| `?pipe=header(Refresh,2;url=/html/cross-origin-opener-policy/resources/resource-cleanup.html?channel=${bc.name})` + |
| (resourceCoop ? `|header(Cross-Origin-Opener-Policy,${resourceCoop})` : ''); |
| const parentLocation = 'resources/resource-popup.html' + |
| `?channel_name=${bc.name}` + |
| `&resource=${encodeURIComponent(childLocation)}` + |
| `&resource_name=${resourceName}` + |
| (parentCoop ? `&pipe=header(Cross-Origin-Opener-Policy,${parentCoop})` : ''); |
| |
| open(parentLocation); |
| |
| t.add_cleanup(() => { |
| // Close the "parent" popup and the "child" popup if it has already |
| // redirected to the HTML document. |
| bc.postMessage(null); |
| // Prepare to close the "child" popup in the case that it has not yet |
| // redirected to the the HTML document. |
| bc.onmessage = () => bc.postMessage(null); |
| }); |
| }, `${resource} - parent COOP: "${parentCoop}"; child COOP: "${resourceCoop}"`); |
| }; |
| |
| const resources = [ |
| '/common/dummy.xml', |
| '/images/red.png', |
| '/common/text-plain.txt', |
| '/media/2x2-green.mp4', |
| ]; |
| |
| for (const resource of resources) { |
| coop_resource_test({ |
| parentCoop: '', |
| resourceCoop: 'same-origin', |
| resource, |
| resourceName: 'foobar', |
| validate(data) { |
| assert_equals(data.name, null); |
| assert_equals(data.closed, true); |
| } |
| }); |
| |
| coop_resource_test({ |
| parentCoop: 'same-origin', |
| resourceCoop: '', |
| resource, |
| resourceName: 'foobar', |
| validate(data) { |
| assert_equals(data.name, null); |
| assert_equals(data.closed, true); |
| } |
| }); |
| |
| coop_resource_test({ |
| parentCoop: 'same-origin', |
| resourceCoop: 'same-origin', |
| resource, |
| resourceName: 'foobar', |
| validate(data) { |
| assert_equals(data.name, 'foobar'); |
| assert_equals(data.closed, false); |
| } |
| }); |
| } |
| </script> |
| </html> |