diff options
Diffstat (limited to 'testing/web-platform/tests/worklets/resources/referrer-window.html')
-rw-r--r-- | testing/web-platform/tests/worklets/resources/referrer-window.html | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/testing/web-platform/tests/worklets/resources/referrer-window.html b/testing/web-platform/tests/worklets/resources/referrer-window.html new file mode 100644 index 0000000000..1d8d38b719 --- /dev/null +++ b/testing/web-platform/tests/worklets/resources/referrer-window.html @@ -0,0 +1,113 @@ +<!DOCTYPE html> +<html> +<head> + <title>Worklet: Referrer</title> + <script src="/common/get-host-info.sub.js"></script> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="worklet-test-utils.js"></script> +</head> +<body> +<script> +function createScriptURLForTopLevel(scriptOrigin) { + if (scriptOrigin === 'same') + return new URL('referrer-checker.py', location.href); + if (scriptOrigin === 'remote') { + return new URL(get_host_info().HTTPS_REMOTE_ORIGIN + + '/worklets/resources/referrer-checker.py'); + } + assert_unreached('scriptOrigin should be \'same\' or \'remote\''); +} + +function createScriptURLForDecendant(scriptOrigins) { + if (scriptOrigins.topLevel === 'same' && + scriptOrigins.descendant === 'same') { + return new URL('import-referrer-checker-worklet-script.sub.js', + location.href); + } + if (scriptOrigins.topLevel === 'same' && + scriptOrigins.descendant === 'remote') { + return new URL( + 'import-remote-origin-referrer-checker-worklet-script.sub.js', + location.href); + } + if (scriptOrigins.topLevel === 'remote' && + scriptOrigins.descendant === 'same') { + url = new URL( + get_host_info().HTTPS_REMOTE_ORIGIN + + '/worklets/resources/' + + 'import-same-origin-referrer-checker-worklet-script-from-remote-origin.sub.js'); + return url; + } + if (scriptOrigins.topLevel === 'remote' && + scriptOrigins.descendant === 'remote') { + return new URL( + get_host_info().HTTPS_REMOTE_ORIGIN + + '/worklets/resources/import-referrer-checker-worklet-script.sub.js'); + } + assert_unreached('scriptOrigins have an invalid origin combination.'); +} + +function isDestinationCrossOrigin(fetchType, scriptOrigins) { + if (fetchType === 'top-level') + return scriptOrigins.topLevel === 'remote'; + + // Compute a descendant's cross-origin-ness relative to the top-level script. + if (fetchType === 'descendant') + return scriptOrigins.descendant !== scriptOrigins.topLevel; + assert_unreached('fetchType has an invalid value.'); +} + +function createExpectedReferrer( + importerURL, fetchType, referrerPolicy, scriptOrigins) { + if (referrerPolicy === 'no-referrer') + return ""; + if (referrerPolicy === 'same-origin') { + if (isDestinationCrossOrigin(fetchType, scriptOrigins)) + return ""; + // Delete query params to make it easier to match with an actual referrer in + // the referrer-checker.py. + const expectedReferrer = new URL(importerURL); + for (var key of expectedReferrer.searchParams.keys()) + expectedReferrer.searchParams.delete(key); + return expectedReferrer; + } + if (referrerPolicy === 'origin') + return (new URL(importerURL)).origin + '/'; + assert_unreached('referrerPolicy has an invalid value.'); +} + +window.onmessage = e => { + const workletType = e.data.workletType; + const fetchType = e.data.fetchType; + const referrerPolicy = e.data.referrerPolicy; + const scriptOrigins = e.data.scriptOrigins; + + let scriptURL; + let expectedReferrer; + if (fetchType === 'top-level') { + scriptURL = createScriptURLForTopLevel(scriptOrigins.topLevel); + expectedReferrer = createExpectedReferrer( + location.href, fetchType, referrerPolicy, scriptOrigins); + } else if (fetchType === 'descendant') { + scriptURL = createScriptURLForDecendant(scriptOrigins); + expectedReferrer = createExpectedReferrer( + scriptURL, fetchType, referrerPolicy, scriptOrigins); + } else { + assert_unreached('fetchType should be \'top-level\' or \'descendant\''); + } + + const params = new URLSearchParams; + params.append('requestor_origin', document.location.origin); + params.append('referrer_policy', referrerPolicy); + params.append('expected_referrer', expectedReferrer); + + get_worklet(workletType).addModule(scriptURL + '?' + params) + .then(() => window.opener.postMessage('RESOLVED', '*')) + .catch(e => window.opener.postMessage(e.message, '*')); +}; + +window.opener.postMessage('LOADED', '*'); +</script> +</body> +</html> |