diff --git a/blink/web_tests/external/wpt/resource-timing/connection-reuse.html b/blink/web_tests/external/wpt/resource-timing/connection-reuse.html index e82b7bc4ea9b..a1bc927cfd3f 100644 --- a/blink/web_tests/external/wpt/resource-timing/connection-reuse.html +++ b/blink/web_tests/external/wpt/resource-timing/connection-reuse.html @@ -7,8 +7,46 @@ + +

Description

diff --git a/blink/web_tests/external/wpt/resource-timing/connection-reuse.https.html b/blink/web_tests/external/wpt/resource-timing/connection-reuse.https.html index e82b7bc4ea9b..3461eed47249 100644 --- a/blink/web_tests/external/wpt/resource-timing/connection-reuse.https.html +++ b/blink/web_tests/external/wpt/resource-timing/connection-reuse.https.html @@ -9,6 +9,13 @@ +

Description

diff --git a/blink/web_tests/external/wpt/resource-timing/resources/connection-reuse-test.js b/blink/web_tests/external/wpt/resource-timing/resources/connection-reuse-test.js index 4def16c0b0ec..453fbd340510 100644 --- a/blink/web_tests/external/wpt/resource-timing/resources/connection-reuse-test.js +++ b/blink/web_tests/external/wpt/resource-timing/resources/connection-reuse-test.js @@ -1,70 +1,63 @@ // This script is loaded in HTTP and HTTPS contexts to validate // PerformanceResourceTiming entries' attributes when reusing connections. - -// Make the first request before calling 'attribute_test' so that only the -// second request's PerformanceResourceTiming entry will be interrogated. -// We don't check the first request's PerformanceResourceTiming entry because -// that's not what this test is trying to validate. // -// Note: to ensure that we reuse the connection to fetch multiple resources, -// we use the same XMLHttpRequest object for each request. Although it doesn't -// seem to be specified, each browser tested by WPT will reuse the underlying -// TCP connection with this approach. Pre-establishing the XHR's connection -// helps us to test connection reuse also in browsers that may key their -// connections on the related request's credentials mode. -const client = new XMLHttpRequest(); -const identifier = Math.random(); -const path = `resources/fake_responses.py?tag=${identifier}`; -client.open("GET", path, false); -client.send(); +// Note: to ensure that we reuse the connection to fetch multiple resources, we +// use the same XMLHttpRequest object throughout an individual test. Although +// it doesn't seem to be specified, each browser tested by WPT will reuse the +// underlying TCP connection with this approach. Pre-establishing the XHR's +// connection helps us to test connection reuse also in browsers that may key +// their connections on the related request's credentials mode. -attribute_test( - async () => { - client.open("GET", path + "&same_resource=false", false); - client.send(); +const connection_reuse_test = (path, follow_on_assertions, test_label) => { + const {on_200, on_304} = follow_on_assertions; - // We expect to get a 200 Ok response because we've requested a different - // resource than previous requests. - if (client.status != 200) { - throw new Error(`Got something other than a 200 response. ` + - `client.status: ${client.status}`); - } - }, path, entry => { - invariants.assert_connection_reused(entry); + // Make the first request before calling 'attribute_test' so that only the + // second request's PerformanceResourceTiming entry will be interrogated. We + // don't check the first request's PerformanceResourceTiming entry because + // that's not what this test is trying to validate. + const client = new XMLHttpRequest(); + const identifier = Math.random(); + path = `${path}?tag=${identifier}`; + client.open("GET", path, false); + client.send(); - // The entry must also follow the specification for any entry corresponding - // to a 'typical' 200 Ok response. - if (self.location.protocol == 'https:') { - invariants.assert_tao_pass_no_redirect_https(entry); - } else { - invariants.assert_tao_pass_no_redirect_http(entry); - } - }, - "PerformanceResrouceTiming entries need to conform to the spec when a " + - "distinct resource is fetched over a persistent connection"); + attribute_test( + async () => { + client.open("GET", path + "&same_resource=false", false); + client.send(); -attribute_test( - async () => { - client.open("GET", path, false); - client.setRequestHeader("If-None-Match", identifier); - client.send(); + // We expect to get a 200 Ok response because we've requested a different + // resource than previous requests. + if (client.status != 200) { + throw new Error(`Got something other than a 200 response. ` + + `client.status: ${client.status}`); + } + }, path, entry => { + invariants.assert_connection_reused(entry); + on_200(entry); + }, + `PerformanceResrouceTiming entries need to conform to the spec when a ` + + `distinct resource is fetched over a persistent connection ` + + `(${test_label})`); - // We expect to get a 304 Not Modified response because we've used a - // matching 'identifier' for the If-None-Match header. - if (client.status != 304) { - throw new Error(`Got something other than a 304 response. ` + - `client.status: ${client.status}`); - } - }, path, entry => { - invariants.assert_connection_reused(entry); + attribute_test( + async () => { + client.open("GET", path, false); + client.setRequestHeader("If-None-Match", identifier); + client.send(); - // The entry must also follow the specification for any entry corresponding - // to a 'typical' 304 Not Modified response. - if (self.location.protocol == 'https:') { - invariants.assert_tao_pass_304_not_modified_https(entry); - } else { - invariants.assert_tao_pass_304_not_modified_http(entry); - } - }, - "PerformanceResrouceTiming entries need to conform to the spec when the " + - "resource is cache-revalidated over a persistent connection"); + // We expect to get a 304 Not Modified response because we've used a + // matching 'identifier' for the If-None-Match header. + if (client.status != 304) { + throw new Error(`Got something other than a 304 response. ` + + `client.status: ${client.status}, response: ` + + `'${client.responseText}'`); + } + }, path, entry => { + invariants.assert_connection_reused(entry); + on_304(entry); + }, + `PerformanceResrouceTiming entries need to conform to the spec when the ` + + `resource is cache-revalidated over a persistent connection ` + + `(${test_label})`); +} diff --git a/blink/web_tests/external/wpt/resource-timing/resources/fake_responses.py b/blink/web_tests/external/wpt/resource-timing/resources/fake_responses.py index 828748acdd8e..e33adbfe44ef 100644 --- a/blink/web_tests/external/wpt/resource-timing/resources/fake_responses.py +++ b/blink/web_tests/external/wpt/resource-timing/resources/fake_responses.py @@ -1,6 +1,12 @@ # /xhr/resources/conditional.py -- to fake a 304 response def main(request, response): + if request.method == "OPTIONS": + # Assume this is a CORS preflight + response.headers.set(b"Access-Control-Allow-Headers", "*") + response.headers.set(b"Access-Control-Allow-Origin", "*") + response.status = (204, "No Content") + return b"" tag = request.GET.first(b"tag", None) redirect = request.GET.first(b"redirect", None) match = request.headers.get(b"If-None-Match", None)