2 <title>Service Worker: fetch()</title>
3 <script src="../resources/testharness.js"></script>
4 <script src="../resources/testharnessreport.js"></script>
5 <script src="resources/test-helpers.js"></script>
8 var SCOPE = 'resources/fetch-access-control-iframe.html';
9 var BASE_URL = 'http://127.0.0.1:8000/serviceworker/resources/fetch-access-control.php?';
10 var OTHER_BASE_URL = 'http://localhost:8000/serviceworker/resources/fetch-access-control.php?';
11 var REDIRECT_URL = 'http://127.0.0.1:8000/serviceworker/resources/redirect.php?Redirect=';
12 var IFRAME_URL = 'http://127.0.0.1:8000/serviceworker/resources/fetch-access-control-iframe.html';
13 var WORKER_URL = 'http://127.0.0.1:8000/serviceworker/resources/fetch-access-control-worker.js';
14 var IFRAME_ORIGIN = 'http://127.0.0.1:8000';
16 // Functions to check the result from the ServiceWorker.
17 var checkFetchResult = function (expected, url, data) {
18 assert_equals(data.fetchResult, expected, url + ' should be ' + expected);
20 var checkFetchResponseBody = function (hasBody, url, data) {
21 assert_equals(data.fetchResult,
23 'fetchResult must be resolved. url: ' + url);
24 assert_equals(data.hasBody,
26 'hasBody must match. url: ' + url);
28 var checkFetchResponseHeader = function (name, expected, url, data) {
29 assert_equals(data.fetchResult,
31 'fetchResult must be resolved. url: ' + url);
33 for (var i = 0; i < data.headers.length; ++i) {
34 if (data.headers[i][0] === name) {
40 'header check failed url: ' + url + ' name: ' + name);
42 var checkFetchResponseType = function (type, url, data) {
43 assert_equals(data.fetchResult,
45 'fetchResult must be resolved. url = ' + url);
46 assert_equals(data.type,
48 'type must match. url: ' + url);
50 var fetchIgnored = checkFetchResult.bind(this, 'ignored');
51 var fetchResolved = checkFetchResult.bind(this, 'resolved');
52 var fetchRejected = checkFetchResult.bind(this, 'rejected');
53 var fetchError = checkFetchResult.bind(this, 'error');
54 var hasBody = checkFetchResponseBody.bind(this, true);
55 var noBody = checkFetchResponseBody.bind(this, false);
56 var hasContentLength =
57 checkFetchResponseHeader.bind(this, 'content-length', true);
59 checkFetchResponseHeader.bind(this, 'content-length', false);
61 checkFetchResponseHeader.bind(this, 'x-serviceworker-serverheader', true);
63 checkFetchResponseHeader.bind(this, 'x-serviceworker-serverheader', false);
64 var typeBasic = checkFetchResponseType.bind(this, 'basic');
65 var typeCors = checkFetchResponseType.bind(this, 'cors');
66 var typeOpaque = checkFetchResponseType.bind(this, 'opaque');
68 // Functions to check the result of JSONP which is evaluated in
69 // fetch-access-control-iframe.html by appending <script> element.
70 var checkJsonpResult = function (expected, url, data) {
71 assert_equals(data.jsonpResult,
73 url + ' jsonpResult should match');
75 var checkJsonpHeader = function (name, value, url, data) {
76 assert_equals(data.jsonpResult,
78 url + ' jsonpResult must be success');
79 assert_equals(data.headers[name],
81 'Request header check failed url:' + url + ' name:' + name);
83 var checkJsonpMethod = function (method, url, data) {
84 assert_equals(data.jsonpResult,
86 url + ' jsonpResult must be success');
87 assert_equals(data.method,
89 'Method must match url:' + url);
91 var checkJsonpAuth = function (username, password, url, data) {
92 assert_equals(data.jsonpResult,
94 url + ' jsonpResult must be success');
95 assert_equals(data.username,
97 'Username must match. url: ' + url);
98 assert_equals(data.password,
100 'Password must match. url: ' + url);
101 assert_equals(data.cookie,
103 'Cookie must match. url: ' + url);
105 var checkJsonpError = checkJsonpResult.bind(this, 'error');
106 var checkJsonpSuccess = checkJsonpResult.bind(this, 'success');
107 var hasCustomHeader =
108 checkJsonpHeader.bind(this, 'x-serviceworker-test', 'test');
110 checkJsonpHeader.bind(this, 'x-serviceworker-test', undefined);
111 var methodIsGET = checkJsonpMethod.bind(this, 'GET');
112 var methodIsPOST = checkJsonpMethod.bind(this, 'POST');
113 var methodIsPUT = checkJsonpMethod.bind(this, 'PUT');
114 var methodIsXXX = checkJsonpMethod.bind(this, 'XXX');
115 var authCheckNone = checkJsonpAuth.bind(this, 'undefined', 'undefined');
116 var authCheck1 = checkJsonpAuth.bind(this, 'username1', 'password1');
117 var authCheck2 = checkJsonpAuth.bind(this, 'username2', 'password2');
120 [BASE_URL + 'method=GET',
121 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
122 [methodIsGET, authCheckNone]],
123 [BASE_URL + 'method=GET&headers={}',
124 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
126 [BASE_URL + 'method=GET&headers=CUSTOM',
127 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
128 [methodIsGET, noCustomHeader]],
129 [BASE_URL + 'method=POST&headers=CUSTOM',
130 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
131 [methodIsPOST, noCustomHeader]],
132 [BASE_URL + 'method=PUT',
134 [BASE_URL + 'method=XXX',
137 [BASE_URL + 'mode=same-origin&method=GET',
138 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
139 [methodIsGET, authCheckNone]],
140 [BASE_URL + 'mode=same-origin&method=GET&headers={}',
141 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
143 [BASE_URL + 'mode=same-origin&method=GET&headers=CUSTOM',
144 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
145 [methodIsGET, hasCustomHeader]],
146 [BASE_URL + 'mode=same-origin&method=POST&headers=CUSTOM',
147 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
148 [methodIsPOST, hasCustomHeader]],
149 [BASE_URL + 'mode=same-origin&method=PUT&headers=CUSTOM',
150 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
151 [methodIsPUT, hasCustomHeader]],
152 [BASE_URL + 'mode=same-origin&method=XXX&headers=CUSTOM',
153 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
154 [methodIsXXX, hasCustomHeader]],
156 [BASE_URL + 'mode=no-cors&method=GET',
157 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
158 [methodIsGET, authCheckNone]],
159 [BASE_URL + 'mode=no-cors&method=GET&headers={}',
160 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
162 [BASE_URL + 'mode=no-cors&method=GET&headers=CUSTOM',
163 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
164 [methodIsGET, noCustomHeader]],
165 [BASE_URL + 'mode=no-cors&method=POST&headers=CUSTOM',
166 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
167 [methodIsPOST, noCustomHeader]],
168 [BASE_URL + 'mode=no-cors&method=PUT',
170 [BASE_URL + 'mode=no-cors&method=XXX',
173 [BASE_URL + 'mode=cors&method=GET',
174 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
175 [methodIsGET, authCheckNone]],
176 [BASE_URL + 'mode=cors&method=GET&headers={}',
177 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
179 [BASE_URL + 'mode=cors&method=GET&headers=CUSTOM',
180 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
181 [methodIsGET, hasCustomHeader]],
182 [BASE_URL + 'mode=cors&method=POST&headers=CUSTOM',
183 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
184 [methodIsPOST, hasCustomHeader]],
185 [BASE_URL + 'mode=cors&method=PUT&headers=CUSTOM',
186 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
187 [methodIsPUT, hasCustomHeader]],
188 [BASE_URL + 'mode=cors&method=XXX&headers=CUSTOM',
189 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic],
190 [methodIsXXX, hasCustomHeader]],
193 [OTHER_BASE_URL + 'method=GET&headers=CUSTOM',
194 [fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque],
195 [methodIsGET, noCustomHeader, authCheckNone]],
196 [OTHER_BASE_URL + 'method=POST&headers=CUSTOM',
197 [fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque],
198 [methodIsPOST, noCustomHeader]],
199 [OTHER_BASE_URL + 'method=PUT&headers=CUSTOM',
201 [OTHER_BASE_URL + 'method=XXX&headers=CUSTOM',
204 [OTHER_BASE_URL + 'mode=same-origin&method=GET', [fetchRejected]],
205 [OTHER_BASE_URL + 'mode=same-origin&method=POST', [fetchRejected]],
206 [OTHER_BASE_URL + 'mode=same-origin&method=PUT', [fetchRejected]],
207 [OTHER_BASE_URL + 'mode=same-origin&method=XXX', [fetchRejected]],
209 [OTHER_BASE_URL + 'mode=no-cors&method=GET&headers=CUSTOM',
210 [fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque],
211 [methodIsGET, noCustomHeader, authCheckNone]],
212 [OTHER_BASE_URL + 'mode=no-cors&method=POST&headers=CUSTOM',
213 [fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque],
214 [methodIsPOST, noCustomHeader]],
215 [OTHER_BASE_URL + 'mode=no-cors&method=PUT&headers=CUSTOM',
217 [OTHER_BASE_URL + 'mode=no-cors&method=XXX&headers=CUSTOM',
220 [OTHER_BASE_URL + 'mode=cors&method=GET',
222 [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=*',
223 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
224 [methodIsGET, authCheckNone]],
225 [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=http://127.0.0.1:8000',
226 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
228 [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=http://127.0.0.1:8000,http://www.example.com',
230 [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=http://www.example.com',
232 [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=*&ACEHeaders=X-ServiceWorker-ServerHeader',
233 [fetchResolved, noContentLength, hasServerHeader, hasBody, typeCors],
235 [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=http://127.0.0.1:8000&ACEHeaders=X-ServiceWorker-ServerHeader',
236 [fetchResolved, noContentLength, hasServerHeader, hasBody, typeCors],
238 [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=*&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
239 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
241 [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=http://127.0.0.1:8000&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
242 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
244 [OTHER_BASE_URL + 'mode=cors&method=GET&headers=CUSTOM',
246 [OTHER_BASE_URL + 'mode=cors&method=GET&headers=CUSTOM&ACAOrigin=*',
248 [OTHER_BASE_URL + 'mode=cors&method=GET&headers=CUSTOM&ACAOrigin=http://127.0.0.1:8000',
250 [OTHER_BASE_URL + 'mode=cors&method=GET&headers=CUSTOM&ACAOrigin=*&ACAHeaders=x-serviceworker-test',
251 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
252 [methodIsGET, hasCustomHeader]],
253 [OTHER_BASE_URL + 'mode=cors&method=GET&headers=CUSTOM&ACAOrigin=http://127.0.0.1:8000&ACAHeaders=x-serviceworker-test',
254 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
255 [methodIsGET, hasCustomHeader]],
256 [OTHER_BASE_URL + 'mode=cors&method=GET&headers=CUSTOM&ACAOrigin=*&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
257 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
258 [methodIsGET, hasCustomHeader]],
259 [OTHER_BASE_URL + 'mode=cors&method=GET&headers=CUSTOM&ACAOrigin=http://127.0.0.1:8000&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
260 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
261 [methodIsGET, hasCustomHeader]],
263 [OTHER_BASE_URL + 'mode=cors&method=POST',
265 [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=*',
266 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
268 [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=http://127.0.0.1:8000',
269 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
271 [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=http://127.0.0.1:8000,http://www.example.com',
273 [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=http://www.example.com',
275 [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=*&ACEHeaders=X-ServiceWorker-ServerHeader',
276 [fetchResolved, noContentLength, hasServerHeader, hasBody, typeCors],
278 [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=http://127.0.0.1:8000&ACEHeaders=X-ServiceWorker-ServerHeader',
279 [fetchResolved, noContentLength, hasServerHeader, hasBody, typeCors],
281 [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=*&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
282 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
284 [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=http://127.0.0.1:8000&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
285 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
287 [OTHER_BASE_URL + 'mode=cors&method=POST&headers=CUSTOM',
289 [OTHER_BASE_URL + 'mode=cors&method=POST&headers=CUSTOM&ACAOrigin=*',
291 [OTHER_BASE_URL + 'mode=cors&method=POST&headers=CUSTOM&ACAOrigin=*&ACAHeaders=x-serviceworker-test',
292 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
293 [methodIsPOST, hasCustomHeader]],
294 [OTHER_BASE_URL + 'mode=cors&method=POST&headers=CUSTOM&ACAOrigin=*&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
295 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
296 [methodIsPOST, hasCustomHeader]],
297 [OTHER_BASE_URL + 'mode=cors&method=POST&headers=CUSTOM&ACAOrigin=http://127.0.0.1:8000',
299 [OTHER_BASE_URL + 'mode=cors&method=POST&headers=CUSTOM&ACAOrigin=http://127.0.0.1:8000&ACAHeaders=x-serviceworker-test',
300 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
301 [methodIsPOST, hasCustomHeader]],
302 [OTHER_BASE_URL + 'mode=cors&method=POST&headers=CUSTOM&ACAOrigin=http://127.0.0.1:8000&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
303 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
304 [methodIsPOST, hasCustomHeader]],
306 [OTHER_BASE_URL + 'mode=cors&method=PUT',
308 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAMethods=PUT',
310 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*',
312 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*&ACAMethods=PUT',
313 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
315 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*&headers=CUSTOM&ACAMethods=PUT',
317 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*&headers=CUSTOM&ACAMethods=PUT&ACAHeaders=x-serviceworker-test',
318 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
319 [methodIsPUT, hasCustomHeader]],
320 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*&headers=CUSTOM&ACAMethods=PUT&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
321 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
322 [methodIsPUT, hasCustomHeader]],
323 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*&headers=CUSTOM&ACAMethods=PUT, XXX',
325 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*&headers=CUSTOM&ACAMethods=PUT, XXX&ACAHeaders=x-serviceworker-test',
326 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
327 [methodIsPUT, hasCustomHeader]],
328 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*&headers=CUSTOM&ACAMethods=PUT, XXX&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
329 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
330 [methodIsPUT, hasCustomHeader]],
331 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=http://127.0.0.1:8000',
333 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=http://127.0.0.1:8000&ACAMethods=PUT',
334 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
336 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=PUT',
338 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=PUT&ACAHeaders=x-serviceworker-test',
339 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
340 [methodIsPUT, hasCustomHeader]],
341 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=PUT&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
342 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
343 [methodIsPUT, hasCustomHeader]],
344 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=PUT, XXX',
346 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=PUT, XXX&ACAHeaders=x-serviceworker-test',
347 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
348 [methodIsPUT, hasCustomHeader]],
349 [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=PUT, XXX&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
350 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
351 [methodIsPUT, hasCustomHeader]],
353 [OTHER_BASE_URL + 'mode=cors&method=XXX',
355 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAMethods=XXX',
357 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*',
359 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*&ACAMethods=XXX',
360 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
362 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*&headers=CUSTOM&ACAMethods=XXX',
364 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*&headers=CUSTOM&ACAMethods=XXX&ACAHeaders=x-serviceworker-test',
365 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
366 [methodIsXXX, hasCustomHeader]],
367 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*&headers=CUSTOM&ACAMethods=XXX&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
368 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
369 [methodIsXXX, hasCustomHeader]],
370 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*&headers=CUSTOM&ACAMethods=PUT, XXX',
372 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*&headers=CUSTOM&ACAMethods=PUT, XXX&ACAHeaders=x-serviceworker-test',
373 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
374 [methodIsXXX, hasCustomHeader]],
375 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*&headers=CUSTOM&ACAMethods=PUT, XXX&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
376 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
377 [methodIsXXX, hasCustomHeader]],
378 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=http://127.0.0.1:8000',
380 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=http://127.0.0.1:8000&ACAMethods=XXX',
381 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
383 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=XXX',
385 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=XXX&ACAHeaders=x-serviceworker-test',
386 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
387 [methodIsXXX, hasCustomHeader]],
388 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=XXX&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
389 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
390 [methodIsXXX, hasCustomHeader]],
391 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=PUT, XXX',
393 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=PUT, XXX&ACAHeaders=x-serviceworker-test',
394 [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
395 [methodIsXXX, hasCustomHeader]],
396 [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=PUT, XXX&ACAHeaders=x-serviceworker-test&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
397 [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
398 [methodIsXXX, hasCustomHeader]],
401 [BASE_URL + 'ignore=true',
403 [checkJsonpHeader.bind(this, 'Referer', IFRAME_URL)]],
404 [BASE_URL + 'noChange=true',
406 [checkJsonpHeader.bind(this, 'Referer', WORKER_URL)]],
409 [checkJsonpHeader.bind(this, 'Referer', WORKER_URL)]],
413 [fetchResolved, hasBody], [checkJsonpError]],
414 [BASE_URL + 'Auth&credentials=omit',
415 [fetchResolved, hasBody], [checkJsonpError]],
416 [BASE_URL + 'Auth&credentials=include',
417 [fetchResolved, hasBody], [authCheck1]],
418 [BASE_URL + 'Auth&credentials=same-origin',
419 [fetchResolved, hasBody], [authCheck1]],
421 [BASE_URL + 'Auth&mode=no-cors&credentials=omit',
422 [fetchResolved, hasBody], [checkJsonpError]],
423 [BASE_URL + 'Auth&mode=no-cors&credentials=include',
424 [fetchResolved, hasBody], [authCheck1]],
425 [BASE_URL + 'Auth&mode=no-cors&credentials=same-origin',
426 [fetchResolved, hasBody], [authCheck1]],
428 [BASE_URL + 'Auth&mode=same-origin&credentials=omit',
429 [fetchResolved, hasBody], [checkJsonpError]],
430 [BASE_URL + 'Auth&mode=same-origin&credentials=include',
431 [fetchResolved, hasBody], [authCheck1]],
432 [BASE_URL + 'Auth&mode=same-origin&credentials=same-origin',
433 [fetchResolved, hasBody], [authCheck1]],
435 [BASE_URL + 'Auth&mode=cors&credentials=omit',
436 [fetchResolved, hasBody], [checkJsonpError]],
437 [BASE_URL + 'Auth&mode=cors&credentials=include',
438 [fetchResolved, hasBody], [authCheck1]],
439 [BASE_URL + 'Auth&mode=cors&credentials=same-origin',
440 [fetchResolved, hasBody], [authCheck1]],
442 [OTHER_BASE_URL + 'Auth',
443 [fetchResolved, noBody], [checkJsonpError]],
444 [OTHER_BASE_URL + 'Auth&credentials=omit',
445 [fetchResolved, noBody], [checkJsonpError]],
446 [OTHER_BASE_URL + 'Auth&credentials=include',
447 [fetchResolved, noBody], [authCheck2]],
448 [OTHER_BASE_URL + 'Auth&credentials=same-origin',
449 [fetchResolved, noBody], [authCheck2]],
451 [OTHER_BASE_URL + 'Auth&mode=no-cors&credentials=omit',
452 [fetchResolved, noBody], [checkJsonpError]],
453 [OTHER_BASE_URL + 'Auth&mode=no-cors&credentials=include',
454 [fetchResolved, noBody], [authCheck2]],
455 [OTHER_BASE_URL + 'Auth&mode=no-cors&credentials=same-origin',
456 [fetchResolved, noBody], [authCheck2]],
458 [OTHER_BASE_URL + 'Auth&mode=same-origin&credentials=omit',
460 [OTHER_BASE_URL + 'Auth&mode=same-origin&credentials=include',
462 [OTHER_BASE_URL + 'Auth&mode=same-origin&credentials=same-origin',
465 [OTHER_BASE_URL + 'Auth&mode=cors&credentials=omit',
467 [OTHER_BASE_URL + 'Auth&mode=cors&credentials=include',
469 [OTHER_BASE_URL + 'Auth&mode=cors&credentials=same-origin',
471 [OTHER_BASE_URL + 'Auth&mode=cors&credentials=include&ACAOrigin=*',
473 [OTHER_BASE_URL + 'Auth&mode=cors&credentials=include&ACAOrigin=http://127.0.0.1:8000',
475 [OTHER_BASE_URL + 'Auth&mode=cors&credentials=include&ACAOrigin=*&ACACredentials=true',
477 [OTHER_BASE_URL + 'Auth&mode=cors&credentials=include&ACAOrigin=http://127.0.0.1:8000&ACACredentials=true',
478 [fetchResolved, hasBody], [authCheck2]],
481 // FIXME: Currently we don't support redirect in Fech() API.
482 [REDIRECT_URL + encodeURIComponent(BASE_URL),
484 [REDIRECT_URL + encodeURIComponent(OTHER_BASE_URL),
488 function login(test, origin, username, password) {
489 return new Promise(function(resolve, reject) {
492 '/serviceworker/resources/fetch-access-control-login.html')
493 .then(test.step_func(function(frame) {
494 var channel = new MessageChannel();
495 channel.port1.onmessage = test.step_func(function() {
498 frame.contentWindow.postMessage(
499 {username: username, password: password},
500 [channel.port2], origin);
505 var test = async_test('Verify access control of fetch() in a Service Worker');
506 test.step(function() {
507 var login1 = login(test, 'http://127.0.0.1:8000', 'username1', 'password1');
508 var login2 = login(test, 'http://localhost:8000', 'username2', 'password2');
509 var workerScript = 'resources/fetch-access-control-worker.js';
510 var worker = undefined;
511 var frameWindow = {};
513 window.addEventListener('message', test.step_func(onMessage), false);
515 Promise.all([login1, login2])
517 return service_worker_unregister_and_register(test,
521 .then(function(registration) {
522 return wait_for_update(test, registration);
526 var messageChannel = new MessageChannel();
527 messageChannel.port1.onmessage = test.step_func(onWorkerMessage);
529 {port: messageChannel.port2}, [messageChannel.port2]);
530 return wait_for_state(test, sw, 'activated');
532 .then(function() { return with_iframe(SCOPE); })
533 .then(function(frame) {
534 frameWindow = frame.contentWindow;
538 .catch(unreached_rejection(test));
540 var readyFromWorkerReceived = undefined;
541 var resultFromWorkerReceived = undefined;
542 var resultFromIframeReceived = undefined;
544 function onMessage(e) {
545 // The message is sent from fetch-access-control-iframe.html in report()
546 // which is called by appending <script> element which source code is
547 // generated by fetch-access-control.php.
548 if (TEST_TARGETS[counter][2]) {
549 TEST_TARGETS[counter][2].forEach(function(checkFunc) {
551 TEST_TARGETS[counter][0],
555 resultFromIframeReceived();
558 function onWorkerMessage(e) {
559 // The message is sent from the ServiceWorker.
560 var message = e.data;
561 if (message.msg === 'READY') {
562 readyFromWorkerReceived();
565 TEST_TARGETS[counter][1].forEach(function(checkFunc) {
567 TEST_TARGETS[counter][0],
570 resultFromWorkerReceived();
573 function loadNext() {
574 var workerPromise = new Promise(function(resolve, reject) {
575 resultFromWorkerReceived = resolve;
577 var iframePromise = new Promise(function(resolve, reject) {
578 resultFromIframeReceived = resolve;
580 Promise.all([workerPromise, iframePromise])
581 .then(test.step_func(function() {
583 if (counter === TEST_TARGETS.length) {
584 service_worker_unregister_and_done(test, SCOPE);
589 (new Promise(function(resolve, reject) {
590 readyFromWorkerReceived = resolve;
591 worker.postMessage({msg: 'START TEST CASE'});
593 .then(test.step_func(function() {
594 frameWindow.postMessage(
595 {url: TEST_TARGETS[counter][0]},