113 lines
4 KiB
HTML
113 lines
4 KiB
HTML
<!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>
|