Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / http / tests / serviceworker / fetch-access-control.html
1 <!DOCTYPE html>
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>
6 <body>
7 <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';
15
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);
19 };
20 var checkFetchResponseBody = function (hasBody, url, data) {
21   assert_equals(data.fetchResult,
22                 'resolved',
23                 'fetchResult must be resolved. url: ' + url);
24   assert_equals(data.hasBody,
25                 hasBody,
26                 'hasBody must match. url: ' + url);
27 };
28 var checkFetchResponseHeader = function (name, expected, url, data) {
29   assert_equals(data.fetchResult,
30                 'resolved',
31                 'fetchResult must be resolved. url: ' + url);
32   var exist = false;
33   for (var i = 0; i < data.headers.length; ++i) {
34     if (data.headers[i][0] === name) {
35       exist = true;
36     }
37   }
38   assert_equals(exist,
39                 expected,
40                 'header check failed url: ' + url + ' name: ' + name);
41 };
42 var checkFetchResponseType = function (type, url, data) {
43   assert_equals(data.fetchResult,
44                 'resolved',
45                 'fetchResult must be resolved. url = ' + url);
46   assert_equals(data.type,
47                 type,
48                 'type must match. url: ' + url);
49 };
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);
58 var noContentLength =
59     checkFetchResponseHeader.bind(this, 'content-length', false);
60 var hasServerHeader =
61     checkFetchResponseHeader.bind(this, 'x-serviceworker-serverheader', true);
62 var noServerHeader =
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');
67
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,
72                 expected,
73                 url + ' jsonpResult should match');
74 };
75 var checkJsonpHeader = function (name, value, url, data) {
76   assert_equals(data.jsonpResult,
77                 'success',
78                 url + ' jsonpResult must be success');
79   assert_equals(data.headers[name],
80                 value,
81                 'Request header check failed url:' + url + ' name:' + name);
82 };
83 var checkJsonpMethod = function (method, url, data) {
84   assert_equals(data.jsonpResult,
85                 'success',
86                 url + ' jsonpResult must be success');
87   assert_equals(data.method,
88                 method,
89                 'Method must match url:' + url);
90 };
91 var checkJsonpAuth = function (username, password, url, data) {
92   assert_equals(data.jsonpResult,
93                 'success',
94                 url + ' jsonpResult must be success');
95   assert_equals(data.username,
96                 username,
97                 'Username must match. url: ' + url);
98   assert_equals(data.password,
99                 password,
100                 'Password must match. url: ' + url);
101   assert_equals(data.cookie,
102                 username,
103                 'Cookie must match. url: ' + url);
104 };
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');
109 var noCustomHeader =
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');
118
119 var TEST_TARGETS = [
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],
125    [methodIsGET]],
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',
133    [fetchError]],
134   [BASE_URL + 'method=XXX',
135    [fetchError]],
136
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],
142    [methodIsGET]],
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]],
155
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],
161    [methodIsGET]],
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',
169    [fetchError]],
170   [BASE_URL + 'mode=no-cors&method=XXX',
171    [fetchError]],
172
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],
178    [methodIsGET]],
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]],
191
192   // CORS test
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',
200    [fetchError]],
201   [OTHER_BASE_URL + 'method=XXX&headers=CUSTOM',
202    [fetchError]],
203
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]],
208
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',
216    [fetchError]],
217   [OTHER_BASE_URL + 'mode=no-cors&method=XXX&headers=CUSTOM',
218    [fetchError]],
219
220   [OTHER_BASE_URL + 'mode=cors&method=GET',
221    [fetchRejected]],
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],
227    [methodIsGET]],
228   [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=http://127.0.0.1:8000,http://www.example.com',
229    [fetchRejected]],
230   [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=http://www.example.com',
231    [fetchRejected]],
232   [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=*&ACEHeaders=X-ServiceWorker-ServerHeader',
233    [fetchResolved, noContentLength, hasServerHeader, hasBody, typeCors],
234    [methodIsGET]],
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],
237    [methodIsGET]],
238   [OTHER_BASE_URL + 'mode=cors&method=GET&ACAOrigin=*&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
239    [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
240    [methodIsGET]],
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],
243    [methodIsGET]],
244   [OTHER_BASE_URL + 'mode=cors&method=GET&headers=CUSTOM',
245    [fetchRejected]],
246   [OTHER_BASE_URL + 'mode=cors&method=GET&headers=CUSTOM&ACAOrigin=*',
247    [fetchRejected]],
248   [OTHER_BASE_URL + 'mode=cors&method=GET&headers=CUSTOM&ACAOrigin=http://127.0.0.1:8000',
249    [fetchRejected]],
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]],
262
263   [OTHER_BASE_URL + 'mode=cors&method=POST',
264    [fetchRejected]],
265   [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=*',
266    [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
267    [methodIsPOST]],
268   [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=http://127.0.0.1:8000',
269    [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
270    [methodIsPOST]],
271   [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=http://127.0.0.1:8000,http://www.example.com',
272    [fetchRejected]],
273   [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=http://www.example.com',
274    [fetchRejected]],
275   [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=*&ACEHeaders=X-ServiceWorker-ServerHeader',
276    [fetchResolved, noContentLength, hasServerHeader, hasBody, typeCors],
277    [methodIsPOST]],
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],
280    [methodIsPOST]],
281   [OTHER_BASE_URL + 'mode=cors&method=POST&ACAOrigin=*&ACEHeaders=Content-Length, X-ServiceWorker-ServerHeader',
282    [fetchResolved, hasContentLength, hasServerHeader, hasBody, typeCors],
283    [methodIsPOST]],
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],
286    [methodIsPOST]],
287   [OTHER_BASE_URL + 'mode=cors&method=POST&headers=CUSTOM',
288    [fetchRejected]],
289   [OTHER_BASE_URL + 'mode=cors&method=POST&headers=CUSTOM&ACAOrigin=*',
290    [fetchRejected]],
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',
298    [fetchRejected]],
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]],
305
306   [OTHER_BASE_URL + 'mode=cors&method=PUT',
307    [fetchRejected]],
308   [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAMethods=PUT',
309    [fetchRejected]],
310   [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*',
311    [fetchRejected]],
312   [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*&ACAMethods=PUT',
313    [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
314    [methodIsPUT]],
315   [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=*&headers=CUSTOM&ACAMethods=PUT',
316    [fetchRejected]],
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',
324    [fetchRejected]],
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',
332    [fetchRejected]],
333   [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=http://127.0.0.1:8000&ACAMethods=PUT',
334    [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
335    [methodIsPUT]],
336   [OTHER_BASE_URL + 'mode=cors&method=PUT&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=PUT',
337    [fetchRejected]],
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',
345    [fetchRejected]],
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]],
352
353   [OTHER_BASE_URL + 'mode=cors&method=XXX',
354    [fetchRejected]],
355   [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAMethods=XXX',
356    [fetchRejected]],
357   [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*',
358    [fetchRejected]],
359   [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*&ACAMethods=XXX',
360    [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
361    [methodIsXXX]],
362   [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=*&headers=CUSTOM&ACAMethods=XXX',
363    [fetchRejected]],
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',
371    [fetchRejected]],
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',
379    [fetchRejected]],
380   [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=http://127.0.0.1:8000&ACAMethods=XXX',
381    [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors],
382    [methodIsXXX]],
383   [OTHER_BASE_URL + 'mode=cors&method=XXX&ACAOrigin=http://127.0.0.1:8000&headers=CUSTOM&ACAMethods=XXX',
384    [fetchRejected]],
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',
392    [fetchRejected]],
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]],
399
400   // Referer check
401   [BASE_URL + 'ignore=true',
402    [fetchIgnored],
403    [checkJsonpHeader.bind(this, 'Referer', IFRAME_URL)]],
404   [BASE_URL + 'noChange=true',
405    [fetchResolved],
406    [checkJsonpHeader.bind(this, 'Referer', WORKER_URL)]],
407   [BASE_URL ,
408    [fetchResolved],
409    [checkJsonpHeader.bind(this, 'Referer', WORKER_URL)]],
410
411   // Auth check
412   [BASE_URL + 'Auth',
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]],
420
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]],
427
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]],
434
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]],
441
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]],
450
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]],
457
458   [OTHER_BASE_URL + 'Auth&mode=same-origin&credentials=omit',
459    [fetchRejected]],
460   [OTHER_BASE_URL + 'Auth&mode=same-origin&credentials=include',
461    [fetchRejected]],
462   [OTHER_BASE_URL + 'Auth&mode=same-origin&credentials=same-origin',
463    [fetchRejected]],
464
465   [OTHER_BASE_URL + 'Auth&mode=cors&credentials=omit',
466    [fetchRejected]],
467   [OTHER_BASE_URL + 'Auth&mode=cors&credentials=include',
468    [fetchRejected]],
469   [OTHER_BASE_URL + 'Auth&mode=cors&credentials=same-origin',
470    [fetchRejected]],
471   [OTHER_BASE_URL + 'Auth&mode=cors&credentials=include&ACAOrigin=*',
472    [fetchRejected]],
473   [OTHER_BASE_URL + 'Auth&mode=cors&credentials=include&ACAOrigin=http://127.0.0.1:8000',
474    [fetchRejected]],
475   [OTHER_BASE_URL + 'Auth&mode=cors&credentials=include&ACAOrigin=*&ACACredentials=true',
476    [fetchRejected]],
477   [OTHER_BASE_URL + 'Auth&mode=cors&credentials=include&ACAOrigin=http://127.0.0.1:8000&ACACredentials=true',
478    [fetchResolved, hasBody], [authCheck2]],
479
480   // Redirect
481   // FIXME: Currently we don't support redirect in Fech() API.
482   [REDIRECT_URL + encodeURIComponent(BASE_URL),
483    [fetchRejected]],
484   [REDIRECT_URL + encodeURIComponent(OTHER_BASE_URL),
485    [fetchRejected]]
486 ];
487
488 function login(test, origin, username, password) {
489   return new Promise(function(resolve, reject) {
490       with_iframe(
491         origin +
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() {
496                 resolve();
497               });
498             frame.contentWindow.postMessage(
499               {username: username, password: password},
500               [channel.port2], origin);
501           }));
502     });
503 }
504   
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 = {};
512     var counter = 0;
513     window.addEventListener('message', test.step_func(onMessage), false);
514
515     Promise.all([login1, login2])
516       .then(function() {
517           return service_worker_unregister_and_register(test,
518                                                         workerScript,
519                                                         SCOPE);
520         })
521       .then(function(registration) {
522           return wait_for_update(test, registration);
523         })
524       .then(function(sw) {
525           worker = sw;
526           var messageChannel = new MessageChannel();
527           messageChannel.port1.onmessage = test.step_func(onWorkerMessage);
528           sw.postMessage(
529             {port: messageChannel.port2}, [messageChannel.port2]);
530           return wait_for_state(test, sw, 'activated');
531         })
532       .then(function() { return with_iframe(SCOPE); })
533       .then(function(frame) {
534           frameWindow = frame.contentWindow;
535           // Start tests.
536           loadNext();
537         })
538       .catch(unreached_rejection(test));
539
540     var readyFromWorkerReceived = undefined;
541     var resultFromWorkerReceived = undefined;
542     var resultFromIframeReceived = undefined;
543
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) {
550             checkFunc.call(this,
551                            TEST_TARGETS[counter][0],
552                            e.data);
553           });
554       }
555       resultFromIframeReceived();
556     }
557
558     function onWorkerMessage(e) {
559       // The message is sent from the ServiceWorker.
560       var message = e.data;
561       if (message.msg === 'READY') {
562         readyFromWorkerReceived();
563         return;
564       }
565       TEST_TARGETS[counter][1].forEach(function(checkFunc) {
566           checkFunc.call(this,
567                          TEST_TARGETS[counter][0],
568                          message);
569         });
570       resultFromWorkerReceived();
571     }
572
573     function loadNext() {
574       var workerPromise = new Promise(function(resolve, reject) {
575           resultFromWorkerReceived = resolve;
576         });
577       var iframePromise = new Promise(function(resolve, reject) {
578           resultFromIframeReceived = resolve;
579         });
580       Promise.all([workerPromise, iframePromise])
581         .then(test.step_func(function() {
582             ++counter;
583             if (counter === TEST_TARGETS.length) {
584               service_worker_unregister_and_done(test, SCOPE);
585             } else {
586               loadNext();
587             }
588           }));
589       (new Promise(function(resolve, reject) {
590           readyFromWorkerReceived = resolve;
591           worker.postMessage({msg: 'START TEST CASE'});
592         }))
593         .then(test.step_func(function() {
594           frameWindow.postMessage(
595             {url: TEST_TARGETS[counter][0]},
596             IFRAME_ORIGIN);
597           }));
598     }
599 });
600 </script>
601 </body>