Files
sousa-gecko/testing/web-platform/tests/fetch/metadata/generated/window-history.https.sub.html
T
Blink WPT Bot 9a353d5abc Bug 1935010 [wpt PR 49502] - Add Initial Web Platform Tests for Storage Access Headers, a=testonly
Automatic update from web-platform-tests
Add Initial Web Platform Tests for Storage Access Headers (#49502)

This change adds web platform tests that confirm the inclusion of the
`Sec-Fetch-Storage-Access` header on cross-site navigations, and that confirm the browser properly handles responses which include the `Activate-Storage-Access` header.

Bug: 332335089
Change-Id: If453daea7b77292a6498f22b86a552a5a064b521
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5972601
Reviewed-by: Avi Drissman <avi@chromium.org>
Reviewed-by: Chris Fredrickson <cfredric@chromium.org>
Commit-Queue: Sam LeDoux <sledoux@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1391183}

Co-authored-by: Sam LeDoux <sledoux@chromium.org>
--

wpt-commits: 6a035397d6fc64d82db054c21cb531592748362e
wpt-pr: 49502
2024-12-13 09:07:22 +00:00

282 lines
9.8 KiB
HTML

<!DOCTYPE html>
<!--
This test was procedurally generated. Please do not modify it directly.
Sources:
- fetch/metadata/tools/fetch-metadata.conf.yml
- fetch/metadata/tools/templates/window-history.sub.html
-->
<html lang="en">
<meta charset="utf-8">
<title>HTTP headers on request for navigation via the HTML History API</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/fetch/metadata/resources/helper.sub.js"></script>
<body>
<script>
'use strict';
const whenDone = (win) => {
return new Promise((resolve) => {
addEventListener('message', function handle(event) {
if (event.source === win) {
resolve();
removeEventListener('message', handle);
}
});
})
};
/**
* Prime the UA's session history such that the location of the request is
* immediately behind the current entry. Because the location may not be
* same-origin with the current browsing context, this must be done via a
* true navigation and not, e.g. the `history.pushState` API. The initial
* navigation will alter the WPT server's internal state; in order to avoid
* false positives, clear that state prior to initiating the second
* navigation via `history.back`.
*/
function induceBackRequest(url, test, clear) {
const win = window.open(url);
test.add_cleanup(() => win.close());
return whenDone(win)
.then(clear)
.then(() => win.history.back())
.then(() => whenDone(win));
}
/**
* Prime the UA's session history such that the location of the request is
* immediately ahead of the current entry. Because the location may not be
* same-origin with the current browsing context, this must be done via a
* true navigation and not, e.g. the `history.pushState` API. The initial
* navigation will alter the WPT server's internal state; in order to avoid
* false positives, clear that state prior to initiating the second
* navigation via `history.forward`.
*/
function induceForwardRequest(url, test, clear) {
const win = window.open(messageOpenerUrl);
test.add_cleanup(() => win.close());
return whenDone(win)
.then(() => win.location = url)
.then(() => whenDone(win))
.then(clear)
.then(() => win.history.go(-2))
.then(() => whenDone(win))
.then(() => win.history.forward())
.then(() => whenDone(win));
}
const messageOpenerUrl = new URL(
'/fetch/metadata/resources/message-opener.html', location
);
// For these tests to function, replacement must *not* be enabled during
// navigation. Assignment must therefore take place after the document has
// completely loaded [1]. This event is not directly observable, but it is
// scheduled as a task immediately following the global object's `load`
// event [2]. By queuing a task during the dispatch of the `load` event,
// navigation can be consistently triggered without replacement.
//
// [1] https://html.spec.whatwg.org/multipage/history.html#location-object-setter-navigate
// [2] https://html.spec.whatwg.org/multipage/parsing.html#the-end
const responseParams = {
mime: 'text/html',
body: `<script>
window.addEventListener('load', () => {
set`+`Timeout(() => location.assign('${messageOpenerUrl}'));
});
<`+`/script>`
};
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, ['httpsOrigin'], responseParams);
return induceBackRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_own_property(headers, 'sec-fetch-site');
assert_array_equals(headers['sec-fetch-site'], ['same-origin']);
});
}, 'sec-fetch-site - Same origin - history.back');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, ['httpsOrigin'], responseParams);
return induceForwardRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_own_property(headers, 'sec-fetch-site');
assert_array_equals(headers['sec-fetch-site'], ['same-origin']);
});
}, 'sec-fetch-site - Same origin - history.forward');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, ['httpsCrossSite'], responseParams);
return induceBackRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_own_property(headers, 'sec-fetch-site');
assert_array_equals(headers['sec-fetch-site'], ['cross-site']);
});
}, 'sec-fetch-site - Cross-site - history.back');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, ['httpsCrossSite'], responseParams);
return induceForwardRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_own_property(headers, 'sec-fetch-site');
assert_array_equals(headers['sec-fetch-site'], ['cross-site']);
});
}, 'sec-fetch-site - Cross-site - history.forward');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, ['httpsSameSite'], responseParams);
return induceBackRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_own_property(headers, 'sec-fetch-site');
assert_array_equals(headers['sec-fetch-site'], ['same-site']);
});
}, 'sec-fetch-site - Same site - history.back');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, ['httpsSameSite'], responseParams);
return induceForwardRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_own_property(headers, 'sec-fetch-site');
assert_array_equals(headers['sec-fetch-site'], ['same-site']);
});
}, 'sec-fetch-site - Same site - history.forward');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, [], responseParams);
return induceBackRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_own_property(headers, 'sec-fetch-mode');
assert_array_equals(headers['sec-fetch-mode'], ['navigate']);
});
}, 'sec-fetch-mode - history.back');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, [], responseParams);
return induceForwardRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_own_property(headers, 'sec-fetch-mode');
assert_array_equals(headers['sec-fetch-mode'], ['navigate']);
});
}, 'sec-fetch-mode - history.forward');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, [], responseParams);
return induceBackRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_own_property(headers, 'sec-fetch-dest');
assert_array_equals(headers['sec-fetch-dest'], ['document']);
});
}, 'sec-fetch-dest - history.back');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, [], responseParams);
return induceForwardRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_own_property(headers, 'sec-fetch-dest');
assert_array_equals(headers['sec-fetch-dest'], ['document']);
});
}, 'sec-fetch-dest - history.forward');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, [], responseParams);
return induceBackRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_not_own_property(headers, 'sec-fetch-user');
});
}, 'sec-fetch-user - history.back');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, [], responseParams);
return induceForwardRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_not_own_property(headers, 'sec-fetch-user');
});
}, 'sec-fetch-user - history.forward');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, ['httpsCrossSite'], responseParams);
return induceBackRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_not_own_property(headers, 'sec-fetch-storage-access');
});
}, 'sec-fetch-storage-access - Cross-site - history.back');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, ['httpsCrossSite'], responseParams);
return induceForwardRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_not_own_property(headers, 'sec-fetch-storage-access');
});
}, 'sec-fetch-storage-access - Cross-site - history.forward');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, ['httpsSameSite'], responseParams);
return induceBackRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_not_own_property(headers, 'sec-fetch-storage-access');
});
}, 'sec-fetch-storage-access - Same site - history.back');
promise_test((t) => {
const key = '{{uuid()}}';
const url = makeRequestURL(key, ['httpsSameSite'], responseParams);
return induceForwardRequest(url, t, () => retrieve(key))
.then(() => retrieve(key))
.then((headers) => {
assert_not_own_property(headers, 'sec-fetch-storage-access');
});
}, 'sec-fetch-storage-access - Same site - history.forward');
</script>
</body>
</html>