fetch-request-resources.https.html (14682B)
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 let url_count = 0; 9 const expected_results = {}; 10 11 function add_promise_to_test(url) 12 { 13 const expected = expected_results[url]; 14 return new Promise((resolve) => { 15 expected.resolve = resolve; 16 }); 17 } 18 19 function image_test(frame, url, cross_origin, expected_mode, 20 expected_credentials) { 21 const actual_url = url + (++url_count); 22 expected_results[actual_url] = { 23 cross_origin: cross_origin, 24 mode: expected_mode, 25 credentials: expected_credentials, 26 redirect: 'follow', 27 integrity: '', 28 destination: 'image', 29 message: `Image load (url:${actual_url} cross_origin:${cross_origin})` 30 }; 31 frame.contentWindow.load_image(actual_url, cross_origin); 32 return add_promise_to_test(actual_url); 33 } 34 35 function script_test(frame, url, cross_origin, expected_mode, 36 expected_credentials) { 37 const actual_url = url + (++url_count); 38 expected_results[actual_url] = { 39 cross_origin: cross_origin, 40 mode: expected_mode, 41 credentials: expected_credentials, 42 redirect: 'follow', 43 integrity: '', 44 destination: 'script', 45 message: `Script load (url:${actual_url} cross_origin:${cross_origin})` 46 }; 47 frame.contentWindow.load_script(actual_url, cross_origin); 48 return add_promise_to_test(actual_url); 49 } 50 51 function css_test(frame, url, cross_origin, expected_mode, 52 expected_credentials) { 53 const actual_url = url + (++url_count); 54 expected_results[actual_url] = { 55 cross_origin: cross_origin, 56 mode: expected_mode, 57 credentials: expected_credentials, 58 redirect: 'follow', 59 integrity: '', 60 destination: 'style', 61 message: `CSS load (url:${actual_url} cross_origin:${cross_origin})` 62 }; 63 frame.contentWindow.load_css(actual_url, cross_origin); 64 return add_promise_to_test(actual_url); 65 } 66 67 function font_face_test(frame, url, expected_mode, expected_credentials) { 68 const actual_url = url + (++url_count); 69 expected_results[actual_url] = { 70 url: actual_url, 71 mode: expected_mode, 72 credentials: expected_credentials, 73 redirect: 'follow', 74 integrity: '', 75 destination: 'font', 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 const 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 destination: 'script', 91 message: `Script load (url:${actual_url})` 92 }; 93 frame.contentWindow.load_script_with_integrity(actual_url, integrity, /*type=*/null); 94 return add_promise_to_test(actual_url); 95 } 96 97 function module_script_integrity_test(frame, url, integrity, expected_integrity) { 98 const actual_url = url + "_module"; 99 expected_results[actual_url] = { 100 url: actual_url, 101 mode: 'cors', 102 credentials: 'same-origin', 103 redirect: 'follow', 104 integrity: expected_integrity, 105 destination: 'script', 106 message: `Module Script load (url:${actual_url})` 107 }; 108 frame.contentWindow.load_script_with_integrity(actual_url, integrity, "module"); 109 return add_promise_to_test(actual_url); 110 } 111 112 function modulepreload_integrity_test(frame, url, integrity, expected_integrity) { 113 const actual_url = url + "_modulepreload"; 114 expected_results[actual_url] = { 115 url: actual_url, 116 mode: 'cors', 117 credentials: 'same-origin', 118 redirect: 'follow', 119 integrity: expected_integrity, 120 destination: 'script', 121 message: `Module Script load (url:${actual_url})` 122 }; 123 frame.contentWindow.load_modulepreload_with_integrity(actual_url, integrity); 124 return add_promise_to_test(actual_url); 125 } 126 127 function import_module_integrity_test(frame, url, expected_integrity) { 128 const actual_url = url + "_moduleimport"; 129 expected_results[actual_url] = { 130 url: actual_url, 131 mode: 'cors', 132 credentials: 'same-origin', 133 redirect: 'follow', 134 integrity: expected_integrity, 135 destination: 'script', 136 message: `Module Script load (url:${actual_url})` 137 }; 138 frame.contentWindow.import_modulescript(actual_url); 139 return add_promise_to_test(actual_url); 140 } 141 142 function import_dynamic_module_integrity_test(frame, url, expected_integrity) { 143 const actual_url = url + "_moduleimportdynamic"; 144 expected_results[actual_url] = { 145 url: actual_url, 146 mode: 'cors', 147 credentials: 'same-origin', 148 redirect: 'follow', 149 integrity: expected_integrity, 150 destination: 'script', 151 message: `Module Script load (url:${actual_url})` 152 }; 153 frame.contentWindow.import_dynamic_modulescript(actual_url); 154 return add_promise_to_test(actual_url); 155 } 156 157 function css_integrity_test(frame, url, integrity, expected_integrity) { 158 const actual_url = url + (++url_count); 159 expected_results[actual_url] = { 160 url: actual_url, 161 mode: 'no-cors', 162 credentials: 'include', 163 redirect: 'follow', 164 integrity: expected_integrity, 165 destination: 'style', 166 message: `CSS load (url:${actual_url})` 167 }; 168 frame.contentWindow.load_css_with_integrity(actual_url, integrity); 169 return add_promise_to_test(actual_url); 170 } 171 172 function fetch_test(frame, url, mode, credentials, 173 expected_mode, expected_credentials) { 174 const actual_url = url + (++url_count); 175 expected_results[actual_url] = { 176 mode: expected_mode, 177 credentials: expected_credentials, 178 redirect: 'follow', 179 integrity: '', 180 destination: '', 181 message: `fetch (url:${actual_url} mode:${mode} ` + 182 `credentials:${credentials})` 183 }; 184 frame.contentWindow.fetch( 185 new Request(actual_url, {mode: mode, credentials: credentials})); 186 return add_promise_to_test(actual_url); 187 } 188 189 function audio_test(frame, url, cross_origin, 190 expected_mode, expected_credentials) { 191 const actual_url = url + (++url_count); 192 expected_results[actual_url] = { 193 mode: expected_mode, 194 credentials: expected_credentials, 195 redirect: 'follow', 196 integrity: '', 197 destination: 'audio', 198 message: `Audio load (url:${actual_url} cross_origin:${cross_origin})` 199 }; 200 frame.contentWindow.load_audio(actual_url, cross_origin); 201 return add_promise_to_test(actual_url); 202 } 203 204 205 function video_test(frame, url, cross_origin, 206 expected_mode, expected_credentials) { 207 const actual_url = url + (++url_count); 208 expected_results[actual_url] = { 209 mode: expected_mode, 210 credentials: expected_credentials, 211 redirect: 'follow', 212 integrity: '', 213 destination: 'video', 214 message: `Video load (url:${actual_url} cross_origin:${cross_origin})` 215 }; 216 frame.contentWindow.load_video(actual_url, cross_origin); 217 return add_promise_to_test(actual_url); 218 } 219 220 promise_test(async t => { 221 const SCOPE = 'resources/fetch-request-resources-iframe.https.html'; 222 const SCRIPT = 'resources/fetch-request-resources-worker.js'; 223 const host_info = get_host_info(); 224 const LOCAL_URL = 225 host_info['HTTPS_ORIGIN'] + base_path() + 'resources/sample?test'; 226 const REMOTE_URL = 227 host_info['HTTPS_REMOTE_ORIGIN'] + base_path() + 'resources/sample?test'; 228 229 const registration = 230 await service_worker_unregister_and_register(t, SCRIPT, SCOPE); 231 t.add_cleanup(() => registration.unregister()); 232 const worker = registration.installing; 233 await wait_for_state(t, worker, 'activated'); 234 235 await new Promise((resolve, reject) => { 236 const channel = new MessageChannel(); 237 channel.port1.onmessage = t.step_func(msg => { 238 if (msg.data.ready) { 239 resolve(); 240 return; 241 } 242 const result = msg.data; 243 const expected = expected_results[result.url]; 244 if (!expected) { 245 return; 246 } 247 test(() => { 248 assert_equals( 249 result.mode, expected.mode, 250 `mode of must be ${expected.mode}.`); 251 assert_equals( 252 result.credentials, expected.credentials, 253 `credentials of ${expected.message} must be ` + 254 `${expected.credentials}.`); 255 assert_equals( 256 result.redirect, expected.redirect, 257 `redirect mode of ${expected.message} must be ` + 258 `${expected.redirect}.`); 259 assert_equals( 260 result.integrity, expected.integrity, 261 `integrity of ${expected.message} must be ` + 262 `${expected.integrity}.`); 263 assert_equals( 264 result.destination, expected.destination, 265 `destination of ${expected.message} must be ` + 266 `${expected.destination}.`); 267 }, expected.message); 268 expected.resolve(); 269 delete expected_results[result.url]; 270 }); 271 worker.postMessage({port: channel.port2}, [channel.port2]); 272 }); 273 274 const f = await with_iframe(SCOPE); 275 t.add_cleanup(() => f.remove()); 276 277 await image_test(f, LOCAL_URL, '', 'no-cors', 'include'); 278 await image_test(f, REMOTE_URL, '', 'no-cors', 'include'); 279 await css_test(f, LOCAL_URL, '', 'no-cors', 'include'); 280 await css_test(f, REMOTE_URL, '', 'no-cors', 'include'); 281 282 await image_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); 283 await image_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); 284 await image_test(f, REMOTE_URL, '', 'no-cors', 'include'); 285 await image_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); 286 await image_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); 287 288 await script_test(f, LOCAL_URL, '', 'no-cors', 'include'); 289 await script_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); 290 await script_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); 291 await script_test(f, REMOTE_URL, '', 'no-cors', 'include'); 292 await script_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); 293 await script_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); 294 295 await css_test(f, LOCAL_URL, '', 'no-cors', 'include'); 296 await css_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); 297 await css_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); 298 await css_test(f, REMOTE_URL, '', 'no-cors', 'include'); 299 await css_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); 300 await css_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); 301 302 await font_face_test(f, LOCAL_URL, 'cors', 'same-origin'); 303 await font_face_test(f, REMOTE_URL, 'cors', 'same-origin'); 304 305 await script_integrity_test(f, LOCAL_URL, ' ', ' '); 306 await script_integrity_test( 307 f, LOCAL_URL, 308 'This is not a valid integrity because it has no dashes', 309 'This is not a valid integrity because it has no dashes'); 310 await script_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-'); 311 await script_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123'); 312 await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ', 313 'sha256-foo sha384-abc '); 314 await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc', 315 'sha256-foo sha256-abc'); 316 await module_script_integrity_test(f, LOCAL_URL, 317 null, 318 'sha384-foobar'); 319 320 await modulepreload_integrity_test(f, LOCAL_URL, 321 null, 322 'sha384-foobar'); 323 324 await import_module_integrity_test(f, LOCAL_URL, 325 'sha384-foobar'); 326 327 await import_dynamic_module_integrity_test(f, LOCAL_URL, 328 'sha384-foobar'); 329 330 await css_integrity_test(f, LOCAL_URL, ' ', ' '); 331 await css_integrity_test( 332 f, LOCAL_URL, 333 'This is not a valid integrity because it has no dashes', 334 'This is not a valid integrity because it has no dashes'); 335 await css_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-'); 336 await css_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123'); 337 await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ', 338 'sha256-foo sha384-abc '); 339 await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc', 340 'sha256-foo sha256-abc'); 341 342 await fetch_test(f, LOCAL_URL, 'same-origin', 'omit', 'same-origin', 'omit'); 343 await fetch_test(f, LOCAL_URL, 'same-origin', 'same-origin', 344 'same-origin', 'same-origin'); 345 await fetch_test(f, LOCAL_URL, 'same-origin', 'include', 346 'same-origin', 'include'); 347 await fetch_test(f, LOCAL_URL, 'no-cors', 'omit', 'no-cors', 'omit'); 348 await fetch_test(f, LOCAL_URL, 'no-cors', 'same-origin', 349 'no-cors', 'same-origin'); 350 await fetch_test(f, LOCAL_URL, 'no-cors', 'include', 'no-cors', 'include'); 351 await fetch_test(f, LOCAL_URL, 'cors', 'omit', 'cors', 'omit'); 352 await fetch_test(f, LOCAL_URL, 'cors', 'same-origin', 'cors', 'same-origin'); 353 await fetch_test(f, LOCAL_URL, 'cors', 'include', 'cors', 'include'); 354 await fetch_test(f, REMOTE_URL, 'no-cors', 'omit', 'no-cors', 'omit'); 355 await fetch_test(f, REMOTE_URL, 'no-cors', 'same-origin', 'no-cors', 'same-origin'); 356 await fetch_test(f, REMOTE_URL, 'no-cors', 'include', 'no-cors', 'include'); 357 await fetch_test(f, REMOTE_URL, 'cors', 'omit', 'cors', 'omit'); 358 await fetch_test(f, REMOTE_URL, 'cors', 'same-origin', 'cors', 'same-origin'); 359 await fetch_test(f, REMOTE_URL, 'cors', 'include', 'cors', 'include'); 360 361 await audio_test(f, LOCAL_URL, '', 'no-cors', 'include'); 362 await audio_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); 363 await audio_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); 364 await audio_test(f, REMOTE_URL, '', 'no-cors', 'include'); 365 await audio_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); 366 await audio_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); 367 368 await video_test(f, LOCAL_URL, '', 'no-cors', 'include'); 369 await video_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); 370 await video_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); 371 await video_test(f, REMOTE_URL, '', 'no-cors', 'include'); 372 await video_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); 373 await video_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); 374 }, 'Verify FetchEvent for resources.'); 375 </script>