OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <script src="/resources/testharness.js"></script> | 2 <script src="/resources/testharness.js"></script> |
3 <script src="/resources/testharnessreport.js"></script> | 3 <script src="/resources/testharnessreport.js"></script> |
4 <script src="/resources/get-host-info.js?pipe=sub"></script> | 4 <script src="/resources/get-host-info.js?pipe=sub"></script> |
5 <script src="/misc/resources/run-async-tasks-promise.js"></script> | 5 <script src="/misc/resources/run-async-tasks-promise.js"></script> |
6 <script> | 6 <script src="/misc/resources/resource-timing-sizes-redirect.js"></script> |
7 const baseUrl = | |
8 new URL('/security/resources/cors-hello.php', location.href).href; | |
9 const expectedSize = 73; | |
10 | |
11 // Because apache decrements the Keep-Alive max value on each request, the | |
12 // transferSize will vary slightly between requests for the same resource. | |
13 const fuzzFactor = 3; // bytes | |
14 | |
15 const minHeaderSize = 100; | |
16 | |
17 const hostInfo = get_host_info(); | |
18 | |
19 var directUrl, sameOriginRedirect, crossOriginRedirect, mixedRedirect; | |
20 var complexRedirect; | |
21 | |
22 function checkBodySizeFields(entry) { | |
23 assert_equals(entry.decodedBodySize, expectedSize, 'decodedBodySize'); | |
24 assert_equals(entry.encodedBodySize, expectedSize, 'encodedBodySize'); | |
25 } | |
26 | |
27 function checkResourceSizes() { | |
28 var entries = performance.getEntriesByType('resource'); | |
29 var lowerBound, upperBound, withRedirectLowerBound; | |
30 var seenCount = 0; | |
31 for (var entry of entries) { | |
32 switch (entry.name) { | |
33 case directUrl: | |
34 checkBodySizeFields(entry); | |
35 assert_greater_than(entry.transferSize, expectedSize, | |
36 'transferSize'); | |
37 lowerBound = entry.transferSize - fuzzFactor; | |
38 upperBound = entry.transferSize + fuzzFactor; | |
39 withRedirectLowerBound = entry.transferSize + minHeaderSize; | |
40 ++seenCount; | |
41 break; | |
42 | |
43 case sameOriginRedirect: | |
44 checkBodySizeFields(entry); | |
45 assert_greater_than(entry.transferSize, withRedirectLowerBound, | |
46 'transferSize'); | |
47 ++seenCount; | |
48 break; | |
49 | |
50 case crossOriginRedirect: | |
51 case mixedRedirect: | |
52 case complexRedirect: | |
53 checkBodySizeFields(entry); | |
54 assert_between_exclusive(entry.transferSize, lowerBound, upperBound, | |
55 'transferSize'); | |
56 ++seenCount; | |
57 break; | |
58 | |
59 default: | |
60 break; | |
61 } | |
62 } | |
63 assert_equals(seenCount, 5, 'seenCount'); | |
64 } | |
65 | |
66 function redirectUrl(redirectSourceOrigin, allowOrigin, targetUrl) { | |
67 return redirectSourceOrigin + | |
68 '/resources/redirect.php?cors_allow_origin=' + | |
69 encodeURIComponent(allowOrigin) + | |
70 '&url=' + encodeURIComponent(targetUrl); | |
71 } | |
72 | |
73 promise_test(() => { | |
74 // Use a different URL every time so that the cache behaviour does not | |
75 // depend on execution order. | |
76 directUrl = baseUrl + '?unique=' + Math.random().toString().substring(2) + | |
77 '&cors=*'; | |
78 sameOriginRedirect = redirectUrl(hostInfo.HTTP_ORIGIN, '*', directUrl); | |
79 crossOriginRedirect = redirectUrl(hostInfo.HTTP_REMOTE_ORIGIN, | |
80 hostInfo.HTTP_ORIGIN, directUrl); | |
81 mixedRedirect = redirectUrl(hostInfo.HTTP_REMOTE_ORIGIN, | |
82 hostInfo.HTTP_ORIGIN, sameOriginRedirect); | |
83 complexRedirect = redirectUrl(hostInfo.HTTP_ORIGIN, | |
84 hostInfo.HTTP_REMOTE_ORIGIN, mixedRedirect); | |
85 var eatBody = response => response.arrayBuffer(); | |
86 return fetch(directUrl) | |
87 .then(eatBody) | |
88 .then(() => fetch(sameOriginRedirect)) | |
89 .then(eatBody) | |
90 .then(() => fetch(crossOriginRedirect)) | |
91 .then(eatBody) | |
92 .then(() => fetch(mixedRedirect)) | |
93 .then(eatBody) | |
94 .then(() => fetch(complexRedirect)) | |
95 .then(eatBody) | |
96 .then(runAsyncTasks) | |
97 .then(checkResourceSizes); | |
98 }, 'PerformanceResourceTiming sizes Fetch with redirect test'); | |
99 </script> | |
OLD | NEW |