Set integrity fetch options for loading scripts and CSS
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / service-workers / service-worker / fetch-request-resources.https.html
1 <!DOCTYPE html>
2 <title>Service Worker: FetchEvent for resources</title>
3 <script src="/resources/testharness.js"></script>
4 <script src="/resources/testharnessreport.js"></script>
5 <script src="/common/get-host-info.sub.js"></script>
6 <script src="resources/test-helpers.sub.js"></script>
7 <script>
8 var url_count = 0;
9 var expected_results = {};
10
11 function add_promise_to_test(url)
12 {
13   var expected = expected_results[url];
14   return new Promise((resolve, reject) => {
15     expected.resolve = resolve;
16     setTimeout(() => reject("test time out"), 5000);
17   });
18 }
19
20 function image_test(frame, url, cross_origin, expected_mode,
21                     expected_credentials) {
22   var actual_url = url + (++url_count);
23   expected_results[actual_url] = {
24       cross_origin: cross_origin,
25       mode: expected_mode,
26       credentials: expected_credentials,
27       redirect: 'follow',
28       integrity: '',
29       message: 'Image load (url:' +
30                actual_url + ' cross_origin:' + cross_origin + ')'
31     };
32   frame.contentWindow.load_image(actual_url, cross_origin);
33   return add_promise_to_test(actual_url);
34 }
35
36 function script_test(frame, url, cross_origin, expected_mode,
37                      expected_credentials) {
38   var actual_url = url + (++url_count);
39   expected_results[actual_url] = {
40       cross_origin: cross_origin,
41       mode: expected_mode,
42       credentials: expected_credentials,
43       redirect: 'follow',
44       integrity: '',
45       message: 'Script load (url:' +
46                actual_url + ' cross_origin:' + cross_origin + ')'
47     };
48   frame.contentWindow.load_script(actual_url, cross_origin);
49   return add_promise_to_test(actual_url);
50 }
51
52 function css_test(frame, url, cross_origin, expected_mode,
53                   expected_credentials) {
54   var actual_url = url + (++url_count);
55   expected_results[actual_url] = {
56       cross_origin: cross_origin,
57       mode: expected_mode,
58       credentials: expected_credentials,
59       redirect: 'follow',
60       integrity: '',
61       message: 'CSS load (url:' +
62                actual_url + ' cross_origin:' + cross_origin + ')'
63     };
64   frame.contentWindow.load_css(actual_url, cross_origin);
65   return add_promise_to_test(actual_url);
66 }
67
68 function font_face_test(frame, url, expected_mode, expected_credentials) {
69   var actual_url = url + (++url_count);
70   expected_results[actual_url] = {
71       url: actual_url,
72       mode: expected_mode,
73       credentials: expected_credentials,
74       redirect: 'follow',
75       integrity: '',
76       message: 'FontFace load (url:' + actual_url + ')'
77     };
78   frame.contentWindow.load_font(actual_url);
79   return add_promise_to_test(actual_url);
80 }
81
82 function script_integrity_test(frame, url, integrity, expected_integrity) {
83   var actual_url = url + (++url_count);
84   expected_results[actual_url] = {
85       url: actual_url,
86       mode: 'no-cors',
87       credentials: 'include',
88       redirect: 'follow',
89       integrity: expected_integrity,
90       message: 'Script load (url:' + actual_url + ')'
91     };
92   frame.contentWindow.load_script_with_integrity(actual_url, integrity);
93   return add_promise_to_test(actual_url);
94 }
95
96 function css_integrity_test(frame, url, integrity, expected_integrity) {
97   var actual_url = url + (++url_count);
98   expected_results[actual_url] = {
99       url: actual_url,
100       mode: 'no-cors',
101       credentials: 'include',
102       redirect: 'follow',
103       integrity: expected_integrity,
104       message: 'CSS load (url:' + actual_url + ')'
105     };
106   frame.contentWindow.load_css_with_integrity(actual_url, integrity);
107   return add_promise_to_test(actual_url);
108 }
109
110 function fetch_test(frame, url, mode, credentials,
111                     expected_mode, expected_credentials) {
112   var actual_url = url + (++url_count);
113   expected_results[actual_url] = {
114       mode: expected_mode,
115       credentials: expected_credentials,
116       redirect: 'follow',
117       integrity: '',
118       message: 'fetch (url:' + actual_url + ' mode:' + mode + ' credentials:' +
119                credentials + ')'
120     };
121   frame.contentWindow.fetch(
122       new Request(actual_url, {mode: mode, credentials: credentials})).then(() => {
123       }, () => { });
124   return add_promise_to_test(actual_url);
125 }
126
127 function audio_test(frame, url, cross_origin,
128                     expected_mode, expected_credentials) {
129   var actual_url = url + (++url_count);
130   expected_results[actual_url] = {
131       mode: expected_mode,
132       credentials: expected_credentials,
133       redirect: 'follow',
134       integrity: '',
135       message: 'Audio load (url:' + actual_url + ' cross_origin:' +
136                cross_origin + ')'
137     };
138   frame.contentWindow.load_audio(actual_url, cross_origin);
139   return add_promise_to_test(actual_url);
140 }
141
142 promise_test(function(t) {
143     var SCOPE = 'resources/fetch-request-resources-iframe.https.html';
144     var SCRIPT = 'resources/fetch-request-resources-worker.js';
145     var host_info = get_host_info();
146     var LOCAL_URL =
147       host_info['HTTPS_ORIGIN'] + base_path() + 'resources/dummy?test';
148     var REMOTE_URL =
149       host_info['HTTPS_REMOTE_ORIGIN'] + base_path() + 'resources/dummy?test';
150     var worker;
151     var frame;
152     return service_worker_unregister_and_register(t, SCRIPT, SCOPE)
153       .then(function(registration) {
154           worker = registration.installing;
155           return wait_for_state(t, worker, 'activated');
156         })
157       .then(function() {
158           return new Promise(function(resolve, reject) {
159               var channel = new MessageChannel();
160               channel.port1.onmessage = t.step_func(function(msg) {
161                 if (msg.data.ready) {
162                   resolve();
163                   return;
164                 }
165                 var result = msg.data;
166                 var expected = expected_results[result.url];
167                 if (!expected) {
168                   return;
169                 }
170                 test(() => {
171                   assert_equals(
172                     result.mode, expected.mode,
173                     'mode of ' + expected.message +  ' must be ' +
174                     expected.mode + '.');
175                   assert_equals(
176                     result.credentials, expected.credentials,
177                     'credentials of ' + expected.message +  ' must be ' +
178                     expected.credentials + '.');
179                    assert_equals(
180                     result.redirect, expected.redirect,
181                     'redirect mode of ' + expected.message +  ' must be ' +
182                     expected.redirect + '.');
183                   assert_equals(
184                     result.integrity, expected.integrity,
185                     'integrity of ' + expected.message +  ' must be ' +
186                     expected.integrity + '.');
187                 }, expected.message);
188                 expected.resolve();
189                 delete expected_results[result.url];
190               });
191               worker.postMessage(
192                 {port: channel.port2}, [channel.port2]);
193             });
194         })
195       .then(function() { return with_iframe(SCOPE); })
196       .then(async function(f) {
197         frame = f;
198
199         await image_test(f, LOCAL_URL, '', 'no-cors', 'include');
200         await image_test(f, REMOTE_URL, '', 'no-cors', 'include');
201         await css_test(f, LOCAL_URL, '', 'no-cors', 'include');
202         await css_test(f, REMOTE_URL, '', 'no-cors', 'include');
203
204         await image_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
205         await image_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
206         await image_test(f, REMOTE_URL, '', 'no-cors', 'include');
207         await image_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
208         await image_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
209
210         await script_test(f, LOCAL_URL, '', 'no-cors', 'include');
211         await script_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
212         await script_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
213         await script_test(f, REMOTE_URL, '', 'no-cors', 'include');
214         await script_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
215         await script_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
216
217         await css_test(f, LOCAL_URL, '', 'no-cors', 'include');
218         await css_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
219         await css_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
220         await css_test(f, REMOTE_URL, '', 'no-cors', 'include');
221         await css_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
222         await css_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
223
224         await font_face_test(f, LOCAL_URL, 'cors', 'same-origin');
225         await font_face_test(f, REMOTE_URL, 'cors', 'same-origin');
226
227         await script_integrity_test(f, LOCAL_URL, '     ', '     ');
228         await script_integrity_test(f, LOCAL_URL,
229                                'This is not a valid integrity because it has no dashes',
230                                'This is not a valid integrity because it has no dashes');
231         await script_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-');
232         await script_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123');
233         await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ', 'sha256-foo sha384-abc ');
234         await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc', 'sha256-foo sha256-abc');
235
236         await css_integrity_test(f, LOCAL_URL, '     ', '     ');
237         await css_integrity_test(f, LOCAL_URL,
238                             'This is not a valid integrity because it has no dashes',
239                             'This is not a valid integrity because it has no dashes');
240         await css_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-');
241         await css_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123');
242         await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ', 'sha256-foo sha384-abc ');
243         await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc', 'sha256-foo sha256-abc');
244
245         await fetch_test(f, LOCAL_URL, 'same-origin', 'omit', 'same-origin', 'omit');
246         await fetch_test(f, LOCAL_URL, 'same-origin', 'same-origin',
247                     'same-origin', 'same-origin');
248         await fetch_test(f, LOCAL_URL, 'same-origin', 'include',
249                     'same-origin', 'include');
250         await fetch_test(f, LOCAL_URL, 'no-cors', 'omit', 'no-cors', 'omit');
251         await fetch_test(f, LOCAL_URL, 'no-cors', 'same-origin',
252                     'no-cors', 'same-origin');
253         await fetch_test(f, LOCAL_URL, 'no-cors', 'include', 'no-cors', 'include');
254         await fetch_test(f, LOCAL_URL, 'cors', 'omit', 'cors', 'omit');
255         await fetch_test(f, LOCAL_URL, 'cors', 'same-origin', 'cors', 'same-origin');
256         await fetch_test(f, LOCAL_URL, 'cors', 'include', 'cors', 'include');
257         await fetch_test(f, REMOTE_URL, 'no-cors', 'omit', 'no-cors', 'omit');
258         await fetch_test(f, REMOTE_URL, 'no-cors', 'same-origin',
259                     'no-cors', 'same-origin');
260         await fetch_test(f, REMOTE_URL, 'no-cors', 'include', 'no-cors', 'include');
261         await fetch_test(f, REMOTE_URL, 'cors', 'omit', 'cors', 'omit');
262         await fetch_test(f, REMOTE_URL, 'cors', 'same-origin', 'cors', 'same-origin');
263         await fetch_test(f, REMOTE_URL, 'cors', 'include', 'cors', 'include');
264
265         await audio_test(f, LOCAL_URL, '', 'no-cors', 'include');
266         await audio_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
267         await audio_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
268         await audio_test(f, REMOTE_URL, '', 'no-cors', 'include');
269         await audio_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
270         await audio_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
271
272         frame.remove();
273         service_worker_unregister(t, SCOPE);
274       }).catch(unreached_rejection(t));
275   }, 'Verify FetchEvent for resources.');
276 </script>