OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 <title>Service Worker: the fallback behavior of FetchEvent</title> | |
3 <script src="../resources/testharness.js"></script> | |
4 <script src="../resources/testharnessreport.js"></script> | |
5 <script src="../resources/get-host-info.js?pipe=sub"></script> | |
6 <script src="resources/test-helpers.js"></script> | |
7 <script> | |
8 | |
9 function assert_resolves(promise, description) { | |
10 return new Promise(function(resolve, reject) { | |
11 promise | |
12 .then( | |
13 function() { resolve(); }, | |
14 function() { reject(description); }); | |
15 }); | |
16 } | |
17 | |
18 function assert_rejects(promise, description) { | |
19 return new Promise(function(resolve, reject) { | |
20 promise | |
21 .then( | |
22 function() { reject(description); }, | |
23 function() { resolve(); }); | |
24 }); | |
25 } | |
26 | |
27 function get_fetched_urls(worker) { | |
28 return new Promise(function(resolve) { | |
29 var channel = new MessageChannel(); | |
30 channel.port1.onmessage = function(msg) { resolve(msg); }; | |
31 worker.postMessage({port: channel.port2}, [channel.port2]); | |
32 }); | |
33 } | |
34 | |
35 function check_urls(worker, expected_requests, description) { | |
36 return get_fetched_urls(worker) | |
37 .then(function(msg) { | |
38 var requests = msg.data.requests; | |
39 assert_object_equals(requests, expected_requests, description); | |
40 }); | |
41 } | |
42 | |
43 async_test(function(t) { | |
44 var SCOPE = 'resources/fetch-request-fallback-iframe.html'; | |
45 var SCRIPT = 'resources/fetch-request-fallback-worker.js'; | |
46 var host_info = get_host_info(); | |
47 var BASE_URL = host_info['HTTP_ORIGIN'] + | |
48 '/serviceworker/resources/fetch-access-control.php?'; | |
49 var BASE_PNG_URL = BASE_URL + 'PNGIMAGE&'; | |
50 var OTHER_BASE_URL = host_info['HTTP_REMOTE_ORIGIN'] + | |
51 '/serviceworker/resources/fetch-access-control.php?'; | |
52 var OTHER_BASE_PNG_URL = OTHER_BASE_URL + 'PNGIMAGE&'; | |
53 var REDIRECT_URL = host_info['HTTP_ORIGIN'] + | |
54 '/serviceworker/resources/redirect.php?Redirect='; | |
55 var frame; | |
56 var worker; | |
57 service_worker_unregister_and_register(t, SCRIPT, SCOPE) | |
58 .then(function(registration) { | |
59 worker = registration.installing; | |
60 return wait_for_state(t, worker, 'activated'); | |
61 }) | |
62 .then(function() { return with_iframe(SCOPE); }) | |
63 .then(function(f) { | |
64 frame = f; | |
65 return check_urls( | |
66 worker, | |
67 [{ | |
68 url: host_info['HTTP_ORIGIN'] + '/serviceworker/' + SCOPE, | |
69 mode: 'navigate' | |
70 }], | |
71 'The SW must intercept the request for a main resourc.'); | |
72 }) | |
73 .then(function() { | |
74 return assert_resolves( | |
75 frame.contentWindow.xhr(BASE_URL), | |
76 'SW fallbacked same origin XHR should succeed.'); | |
77 }) | |
78 .then(function() { | |
79 return check_urls( | |
80 worker, | |
81 [{ url: BASE_URL, mode: 'cors' }], | |
82 'The SW must intercept the request of same origin XHR.'); | |
83 }) | |
84 .then(function() { | |
85 return assert_rejects( | |
86 frame.contentWindow.xhr(OTHER_BASE_URL), | |
87 'SW fallbacked CORS-unsupported other origin XHR should fail.'); | |
88 }) | |
89 .then(function() { | |
90 return check_urls( | |
91 worker, | |
92 [{ url: OTHER_BASE_URL, mode: 'cors' }], | |
93 'The SW must intercept the request of CORS-unsupported other ' + | |
94 'origin XHR.'); | |
95 }) | |
96 .then(function() { | |
97 return assert_resolves( | |
98 frame.contentWindow.xhr(OTHER_BASE_URL + 'ACAOrigin=*'), | |
99 'SW fallbacked CORS-supported other origin XHR should succeed.'); | |
100 }) | |
101 .then(function() { | |
102 return check_urls( | |
103 worker, | |
104 [{ url: OTHER_BASE_URL + 'ACAOrigin=*', mode: 'cors' }], | |
105 'The SW must intercept the request of CORS-supported other ' + | |
106 'origin XHR.'); | |
107 }) | |
108 .then(function() { | |
109 return assert_resolves( | |
110 frame.contentWindow.xhr( | |
111 REDIRECT_URL + encodeURIComponent(BASE_URL)), | |
112 'SW fallbacked redirected XHR should succeed.'); | |
113 }) | |
114 .then(function() { | |
115 return check_urls( | |
116 worker, | |
117 [{ | |
118 url: REDIRECT_URL + encodeURIComponent(BASE_URL), | |
119 mode: 'cors' | |
120 }], | |
121 'The SW must intercept only the first request of redirected ' + | |
122 'XHR.'); | |
123 }) | |
124 .then(function() { | |
125 return assert_rejects( | |
126 frame.contentWindow.xhr( | |
127 REDIRECT_URL + encodeURIComponent(OTHER_BASE_URL)), | |
128 'SW fallbacked XHR which is redirected to CORS-unsupported ' + | |
129 'other origin should fail.'); | |
130 }) | |
131 .then(function() { | |
132 return check_urls( | |
133 worker, | |
134 [{ | |
135 url: REDIRECT_URL + encodeURIComponent(OTHER_BASE_URL), | |
136 mode: 'cors' | |
137 }], | |
138 'The SW must intercept only the first request for XHR which is' + | |
139 ' redirected to CORS-unsupported other origin.'); | |
140 }) | |
141 .then(function() { | |
142 return assert_resolves( | |
143 frame.contentWindow.xhr( | |
144 REDIRECT_URL + | |
145 encodeURIComponent(OTHER_BASE_URL + 'ACAOrigin=*')), | |
146 'SW fallbacked XHR which is redirected to CORS-supported other ' + | |
147 'origin should succeed.'); | |
148 }) | |
149 .then(function() { | |
150 return check_urls( | |
151 worker, | |
152 [{ | |
153 url: REDIRECT_URL + | |
154 encodeURIComponent(OTHER_BASE_URL + 'ACAOrigin=*'), | |
155 mode: 'cors' | |
156 }], | |
157 'The SW must intercept only the first request for XHR which is ' + | |
158 'redirected to CORS-supported other origin.'); | |
159 }) | |
160 .then(function() { | |
161 return assert_resolves( | |
162 frame.contentWindow.load_image(BASE_PNG_URL, ''), | |
163 'SW fallbacked image request should succeed.'); | |
164 }) | |
165 .then(function() { | |
166 return check_urls( | |
167 worker, | |
168 [{ url: BASE_PNG_URL, mode: 'no-cors' }], | |
169 'The SW must intercept the request for image.'); | |
170 }) | |
171 .then(function() { | |
172 return assert_resolves( | |
173 frame.contentWindow.load_image(OTHER_BASE_PNG_URL, ''), | |
174 'SW fallbacked other origin image request should succeed.'); | |
175 }) | |
176 .then(function() { | |
177 return check_urls( | |
178 worker, | |
179 [{ url: OTHER_BASE_PNG_URL, mode: 'no-cors' }], | |
180 'The SW must intercept the request for other origin image.') | |
181 }) | |
182 .then(function() { | |
183 return assert_rejects( | |
184 frame.contentWindow.load_image(OTHER_BASE_PNG_URL, 'anonymous'), | |
185 'SW fallbacked CORS-unsupported other origin image request ' + | |
186 'should fail.'); | |
187 }) | |
188 .then(function() { | |
189 return check_urls( | |
190 worker, | |
191 [{ url: OTHER_BASE_PNG_URL, mode: 'cors' }], | |
192 'The SW must intercept the request for CORS-unsupported other ' + | |
193 'origin image.') | |
194 }) | |
195 .then(function() { | |
196 return assert_resolves( | |
197 frame.contentWindow.load_image( | |
198 OTHER_BASE_PNG_URL + 'ACAOrigin=*', 'anonymous'), | |
199 'SW fallbacked CORS-supported other origin image request should' + | |
200 ' succeed.'); | |
201 }) | |
202 .then(function() { | |
203 return check_urls( | |
204 worker, | |
205 [{ url: OTHER_BASE_PNG_URL + 'ACAOrigin=*', mode: 'cors' }], | |
206 'The SW must intercept the request for CORS-supported other ' + | |
207 'origin image.') | |
208 }) | |
209 .then(function() { | |
210 return assert_resolves( | |
211 frame.contentWindow.load_image( | |
212 REDIRECT_URL + encodeURIComponent(BASE_PNG_URL), ''), | |
213 'SW fallbacked redirected image request should succeed.'); | |
214 }) | |
215 .then(function() { | |
216 return check_urls( | |
217 worker, | |
218 [{ | |
219 url: REDIRECT_URL + encodeURIComponent(BASE_PNG_URL), | |
220 mode: 'no-cors' | |
221 }], | |
222 'The SW must intercept only the first request for redirected ' + | |
223 'image resource.'); | |
224 }) | |
225 .then(function() { | |
226 return assert_resolves( | |
227 frame.contentWindow.load_image( | |
228 REDIRECT_URL + encodeURIComponent(OTHER_BASE_PNG_URL), ''), | |
229 'SW fallbacked image request which is redirected to other ' + | |
230 'origin should succeed.'); | |
231 }) | |
232 .then(function() { | |
233 return check_urls( | |
234 worker, | |
235 [{ | |
236 url: REDIRECT_URL + encodeURIComponent(OTHER_BASE_PNG_URL), | |
237 mode: 'no-cors' | |
238 }], | |
239 'The SW must intercept only the first request for image ' + | |
240 'resource which is redirected to other origin.'); | |
241 }) | |
242 .then(function() { | |
243 return assert_rejects( | |
244 frame.contentWindow.load_image( | |
245 REDIRECT_URL + encodeURIComponent(OTHER_BASE_PNG_URL), | |
246 'anonymous'), | |
247 'SW fallbacked image request which is redirected to ' + | |
248 'CORS-unsupported other origin should fail.'); | |
249 }) | |
250 .then(function() { | |
251 return check_urls( | |
252 worker, | |
253 [{ | |
254 url: REDIRECT_URL + encodeURIComponent(OTHER_BASE_PNG_URL), | |
255 mode: 'cors' | |
256 }], | |
257 'The SW must intercept only the first request for image ' + | |
258 'resource which is redirected to CORS-unsupported other origin.'); | |
259 }) | |
260 .then(function() { | |
261 return assert_resolves( | |
262 frame.contentWindow.load_image( | |
263 REDIRECT_URL + | |
264 encodeURIComponent(OTHER_BASE_PNG_URL + 'ACAOrigin=*'), | |
265 'anonymous'), | |
266 'SW fallbacked image request which is redirected to ' + | |
267 'CORS-supported other origin should succeed.'); | |
268 }) | |
269 .then(function() { | |
270 return check_urls( | |
271 worker, | |
272 [{ | |
273 url: REDIRECT_URL + | |
274 encodeURIComponent(OTHER_BASE_PNG_URL + 'ACAOrigin=*'), | |
275 mode: 'cors' | |
276 }], | |
277 'The SW must intercept only the first request for image ' + | |
278 'resource which is redirected to CORS-supported other origin.'); | |
279 }) | |
280 .then(function() { | |
281 frame.remove(); | |
282 service_worker_unregister_and_done(t, SCOPE); | |
283 }) | |
284 .catch(unreached_rejection(t)); | |
285 }, 'Verify the fallback behavior of FetchEvent'); | |
286 </script> | |
OLD | NEW |