[Curl] Fix r222147
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / resource-timing / rt-revalidate-requests.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="utf-8">
5 <title>Resource Timing - ResourceTiming for revalidation requests</title>
6 <meta name="author" title="JosephPecoraro" href="mailto:joepeck@webkit.org">
7 <script src="/resources/testharness.js"></script>
8 <script src="/resources/testharnessreport.js"></script>
9 <script src="resources/rt-utilities.sub.js"></script>
10 </head>
11 <body>
12 <h1>Resource Timing: ResourceTiming for revalidation requests</h1>
13 <div id="log"></div>
14 <script>
15 const IncludeTimingOriginAllowHeaders = { Yes: true, No: false };
16 function createRevalidationURL({tao, crossOrigin}) {
17     let token = Math.random();
18     let content = encodeURIComponent("var revalidationTest = 1;");
19     let mimeType = encodeURIComponent("text/javascript");
20     let date = encodeURIComponent(new Date(2000, 1, 1).toGMTString());
21     let params = `content=${content}&mimeType=${mimeType}&date=${date}&tao=${tao ? true : false}`;
22
23     const path = "resource-timing/resources/rt-revalidation-response.py";
24     if (crossOrigin)
25         return crossOriginURL(`${token}&${params}`, path);
26     return location.origin + `/${path}?${token}&${params}`;
27 }
28
29 function makeRequest(url, revalidation = false) {
30     let xhr = new XMLHttpRequest;
31     xhr.open("GET", url, true);
32     if (revalidation)
33         xhr.setRequestHeader("If-Modified-Since", new Date().toGMTString());
34     xhr.send();
35 }
36
37 function assertAlways(entry) {
38     assert_equals(entry.workerStart, 0, "entry should not have a workerStart time");
39     assert_equals(entry.secureConnectionStart, 0, "entry should not have a secureConnectionStart time");
40
41     assert_not_equals(entry.startTime, 0, "entry should have a non-0 fetchStart time");
42     assert_not_equals(entry.fetchStart, 0, "entry should have a non-0 startTime time");
43     assert_not_equals(entry.responseEnd, 0, "entry should have a non-0 responseEnd time");
44
45     assert_greater_than_equal(entry.fetchStart, entry.startTime, "fetchStart after startTime");
46     assert_greater_than_equal(entry.responseEnd, entry.fetchStart, "responseEnd after fetchStart");
47 }
48
49 function assertAllowedTimingData(entry) {
50     assert_greater_than_equal(entry.domainLookupStart || entry.fetchStart, entry.fetchStart, "domainLookupStart after fetchStart");
51     assert_greater_than_equal(entry.domainLookupEnd || entry.fetchStart, entry.domainLookupStart, "domainLookupEnd after domainLookupStart");
52     assert_greater_than_equal(entry.connectStart || entry.fetchStart, entry.domainLookupEnd, "connectStart after domainLookupEnd");
53     assert_greater_than_equal(entry.connectEnd || entry.fetchStart, entry.connectStart, "connectEnd after connectStart");
54     assert_greater_than_equal(entry.requestStart || entry.fetchStart, entry.connectEnd, "requestStart after connectEnd");
55     assert_greater_than_equal(entry.responseStart || entry.fetchStart, entry.requestStart, "responseStart after requestStart");
56     assert_greater_than_equal(entry.responseEnd || entry.fetchStart, entry.responseStart, "responseEnd after responseStart");
57 }
58
59 function assertDisallowedTimingData(entry) {
60     // These attributes must be zero:
61     // https://w3c.github.io/resource-timing/#cross-origin-resources
62     const keys = [
63         "redirectStart",
64         "redirectEnd",
65         "domainLookupStart",
66         "domainLookupEnd",
67         "connectStart",
68         "connectEnd",
69         "requestStart",
70         "responseStart",
71         "secureConnectionStart",
72     ];
73     for (let key of keys)
74         assert_equals(entry[key], 0, `entry ${key} must be zero for Cross Origin resource without passing Timing-Allow-Origin check`);
75 }
76
77 // Same Origin (revalidation request).
78
79 let sameOriginURL = createRevalidationURL({tao: true, crossOrigin: false});
80
81 promise_test(function(t) {
82     let promise = observeResources(1).then(([entry]) => {
83         assertAlways(entry);
84         assertAllowedTimingData(entry);
85     });
86     makeRequest(sameOriginURL);
87     return promise;
88 }, "Same Origin network load");
89
90 promise_test(function(t) {
91     let promise = observeResources(1).then(([entry]) => {
92         assertAlways(entry);
93         assertAllowedTimingData(entry);
94     });
95     makeRequest(sameOriginURL, true);
96     return promise;
97 }, "Same Origin revalidation load");
98
99 // Cross Origin (revalidation request) without Timing Allow.
100
101 let crossOriginURLNoTao = createRevalidationURL({tao: false, crossOrigin: true});
102
103 promise_test(function(t) {
104     let promise = observeResources(1).then(([entry]) => {
105         assertAlways(entry);
106         assertDisallowedTimingData(entry);
107     });
108     makeRequest(crossOriginURLNoTao);
109     return promise;
110 }, "Cross Origin network load (no TimingAllow)");
111
112 promise_test(function(t) {
113     let promise = observeResources(1).then(([entry]) => {
114         assertAlways(entry);
115         assertDisallowedTimingData(entry);
116     });
117     makeRequest(crossOriginURLNoTao, true);
118     return promise;
119 }, "Cross Origin revalidation load (no TimingAllow)");
120
121 // Cross Origin (revalidation request) with Timing Allow.
122
123 let crossOriginURLWithTao = createRevalidationURL({tao: true, crossOrigin: true});
124
125 promise_test(function(t) {
126     let promise = observeResources(1).then(([entry]) => {
127         assertAlways(entry);
128         assertAllowedTimingData(entry);
129     });
130     makeRequest(crossOriginURLWithTao);
131     return promise;
132 }, "Cross Origin network load (with TimingAllow)");
133
134 promise_test(function(t) {
135     let promise = observeResources(1).then(([entry]) => {
136         assertAlways(entry);
137         assertAllowedTimingData(entry);
138     });
139     makeRequest(crossOriginURLWithTao, true);
140     return promise;
141 }, "Cross Origin revalidation load (with TimingAllow)");
142 </script>
143 </body>
144 </html>