summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/resource-timing/response-status-code.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/resource-timing/response-status-code.html')
-rw-r--r--testing/web-platform/tests/resource-timing/response-status-code.html165
1 files changed, 165 insertions, 0 deletions
diff --git a/testing/web-platform/tests/resource-timing/response-status-code.html b/testing/web-platform/tests/resource-timing/response-status-code.html
new file mode 100644
index 0000000000..3a184c6f01
--- /dev/null
+++ b/testing/web-platform/tests/resource-timing/response-status-code.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html>
+<head>
+<meta charset="utf-8" />
+<meta name="timeout" content="long">
+<title>This test validates the response status of resources.</title>
+<link rel="help" href="https://www.w3.org/TR/resource-timing-2/#sec-performanceresourcetiming"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/entry-invariants.js"></script>
+<script src="resources/resource-loaders.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+</head>
+<body>
+<script>
+const {ORIGIN, REMOTE_ORIGIN} = get_host_info();
+const SAME_ORIGIN = location.origin;
+const status_codes = [
+ 200, 203,
+ 400, 401, 403, 404,
+ 500, 501, 502, 503,
+];
+
+const load_image_object = async path => {
+ return load.object(path, "image/png");
+}
+
+const load_frame_object = async path => {
+ return load.object(path, "text/html");
+}
+
+const load_null_object = async path => {
+ return load.object(path, null);
+}
+
+// Response status for same origin resources is exposed.
+for(const loader of [
+ load.font,
+ load.image,
+ load.script,
+ load.stylesheet,
+ load.xhr_sync,
+ load.xhr_async,
+ load.iframe,
+ load_image_object,
+ load_frame_object,
+ load_null_object
+]) {
+ for(const status of status_codes) {
+ let path = (loader == load.font) ? '/fonts/pass.woff' :
+ '/resource-timing/resources/empty.js';
+ path += `?pipe=status(${status})`;
+ attribute_test(
+ loader, new URL(path, ORIGIN),
+ entry => {
+ assert_equals(entry.responseStatus, status,
+ `response status for ${entry.name} should be ${status}`);
+ }
+ );
+ }
+}
+
+// Response status is exposed for CORS requests for cross-origin resources.
+for(const loader of [
+ load.image_with_attrs,
+ load.script_with_attrs,
+ load.stylesheet_with_attrs
+]) {
+ for(const status of status_codes) {
+ const path = `/resource-timing/resources/empty.js?pipe=status(${status})`
+ + `|header(access-control-allow-origin, ${ORIGIN})`;
+ loader_with_crossOrigin_attr = async url => {
+ return loader(url, {"crossOrigin": "anonymous"});
+ }
+ attribute_test(
+ loader_with_crossOrigin_attr, new URL(path, REMOTE_ORIGIN),
+ entry => {
+ assert_equals(entry.responseStatus, status,
+ `response status for ${entry.name} should be ${status}`);
+ }
+ );
+ }
+}
+
+// Response status is 0 when a no-cors request is made for cross origin
+// fonts, images, scripts, stylesheets.
+// Response status is 0 when request's mode is "navigate" and response's
+// URL's origin is not same origin with request's origin. So response
+// status is not exposed for cross origin iframes.
+for(const loader of [
+ load.font,
+ load.image,
+ load.script,
+ load.stylesheet,
+ load.iframe,
+ load_image_object,
+ load_frame_object,
+ load_null_object
+]) {
+ for(const tao of [false, true]) {
+ for(const status of status_codes) {
+ let path = (loader == load.font) ? '/fonts/pass.woff' :
+ '/resource-timing/resources/empty.js';
+ path += `?pipe=status(${status})`;
+ if (tao) {
+ path += `|header(timing-allow-origin, *)`;
+ }
+ attribute_test(
+ loader, new URL(path, REMOTE_ORIGIN),
+ entry => {
+ assert_equals(entry.responseStatus, 0,
+ `response status for ${entry.name} should be 0`);
+ }
+ );
+ }
+ }
+}
+
+// Response status for iframes is 0 when cross origin redirects are present
+// Same-Origin => Cross-Origin => Same-Origin => Same-Origin redirect chain
+for(const loader of [
+ load.iframe,
+ load_frame_object,
+ load_null_object
+]) {
+ for(const status of status_codes) {
+ const destUrl =
+ `${SAME_ORIGIN}/resource-timing/resources/multi_redirect.py` +
+ `?page_origin=${SAME_ORIGIN}` +
+ `&cross_origin=${REMOTE_ORIGIN}` +
+ `&final_resource=` +
+ `/resource-timing/resources/empty.js?pipe=status(${status})`;
+ attribute_test(
+ loader, new URL(destUrl),
+ entry => {
+ assert_equals(entry.responseStatus, 0,
+ `response status should be 0 for iframes having cross origin`
+ + ` redirects`);
+ }
+ );
+ }
+}
+
+// Response status for iframes is exposed for same origin redirects
+for(const loader of [
+ load.iframe,
+ load_frame_object,
+ load_null_object
+]) {
+ for(const status of status_codes) {
+ const destUrl = `${SAME_ORIGIN}/resource-timing/resources/redirect-cors.py`
+ + `?location=${SAME_ORIGIN}/resource-timing/resources/empty.js`
+ + `?pipe=status(${status})`;
+ attribute_test(
+ loader, new URL(destUrl),
+ entry => {
+ assert_equals(entry.responseStatus, status,
+ `response status should be exposed for iframes having only same`
+ + ` origin redirects`);
+ }
+ );
+ }
+};
+</script>
+</body>
+</html>