summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/resource-timing/cors-preflight.any.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/resource-timing/cors-preflight.any.js')
-rw-r--r--testing/web-platform/tests/resource-timing/cors-preflight.any.js49
1 files changed, 49 insertions, 0 deletions
diff --git a/testing/web-platform/tests/resource-timing/cors-preflight.any.js b/testing/web-platform/tests/resource-timing/cors-preflight.any.js
new file mode 100644
index 0000000000..4b980e7d0a
--- /dev/null
+++ b/testing/web-platform/tests/resource-timing/cors-preflight.any.js
@@ -0,0 +1,49 @@
+// META: script=/common/utils.js
+// META: script=/common/get-host-info.sub.js
+
+// Because apache decrements the Keep-Alive max value on each request, the
+// transferSize will vary slightly between requests for the same resource.
+const fuzzFactor = 3; // bytes
+
+const {HTTP_REMOTE_ORIGIN} = get_host_info();
+const url = new URL('/resource-timing/resources/preflight.py',
+ HTTP_REMOTE_ORIGIN).href;
+
+// The header bytes are expected to be > |minHeaderSize| and
+// < |maxHeaderSize|. If they are outside this range the test will fail.
+const minHeaderSize = 100;
+const maxHeaderSize = 1024;
+
+promise_test(async () => {
+ const checkCorsAllowed = response => response.arrayBuffer();
+ const requirePreflight = {headers: {'X-Require-Preflight' : '1'}};
+ const collectEntries = new Promise(resolve => {
+ let entriesSeen = [];
+ new PerformanceObserver(entryList => {
+ entriesSeen = entriesSeen.concat(entryList.getEntries());
+ if (entriesSeen.length > 2) {
+ throw new Error(`Saw too many PerformanceResourceTiming entries ` +
+ `(${entriesSeen.length})`);
+ }
+ if (entriesSeen.length == 2) {
+ resolve(entriesSeen);
+ }
+ }).observe({"type": "resource"});
+ });
+
+ // Although this fetch doesn't send a pre-flight request, the server response
+ // will allow cross-origin requests explicitly with the
+ // Access-Control-Allow-Origin header.
+ await fetch(url).then(checkCorsAllowed);
+
+ // This fetch will send a pre-flight request to do the CORS handshake
+ // explicitly.
+ await fetch(url, requirePreflight).then(checkCorsAllowed);
+
+ const entries = await collectEntries;
+ assert_greater_than(entries[0].transferSize, 0, 'No-preflight transferSize');
+ const lowerBound = entries[0].transferSize - fuzzFactor;
+ const upperBound = entries[0].transferSize + fuzzFactor;
+ assert_between_exclusive(entries[1].transferSize, lowerBound, upperBound,
+ 'Preflighted transferSize');
+}, 'PerformanceResourceTiming sizes fetch with preflight test');