| <!DOCTYPE html> |
| <title>Service Worker: FetchEvent for resources</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/common/get-host-info.sub.js"></script> |
| <script src="resources/test-helpers.sub.js"></script> |
| <script> |
| let url_count = 0; |
| const expected_results = {}; |
| |
| function add_promise_to_test(url) |
| { |
| const expected = expected_results[url]; |
| return new Promise((resolve) => { |
| expected.resolve = resolve; |
| }); |
| } |
| |
| function image_test(frame, url, cross_origin, expected_mode, |
| expected_credentials) { |
| const actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| cross_origin: cross_origin, |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| integrity: '', |
| destination: 'image', |
| message: `Image load (url:${actual_url} cross_origin:${cross_origin})` |
| }; |
| frame.contentWindow.load_image(actual_url, cross_origin); |
| return add_promise_to_test(actual_url); |
| } |
| |
| function script_test(frame, url, cross_origin, expected_mode, |
| expected_credentials) { |
| const actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| cross_origin: cross_origin, |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| integrity: '', |
| destination: 'script', |
| message: `Script load (url:${actual_url} cross_origin:${cross_origin})` |
| }; |
| frame.contentWindow.load_script(actual_url, cross_origin); |
| return add_promise_to_test(actual_url); |
| } |
| |
| function css_test(frame, url, cross_origin, expected_mode, |
| expected_credentials) { |
| const actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| cross_origin: cross_origin, |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| integrity: '', |
| destination: 'style', |
| message: `CSS load (url:${actual_url} cross_origin:${cross_origin})` |
| }; |
| frame.contentWindow.load_css(actual_url, cross_origin); |
| return add_promise_to_test(actual_url); |
| } |
| |
| function font_face_test(frame, url, expected_mode, expected_credentials) { |
| const actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| url: actual_url, |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| integrity: '', |
| destination: 'font', |
| message: `FontFace load (url: ${actual_url})` |
| }; |
| frame.contentWindow.load_font(actual_url); |
| return add_promise_to_test(actual_url); |
| } |
| |
| function script_integrity_test(frame, url, integrity, expected_integrity) { |
| const actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| url: actual_url, |
| mode: 'no-cors', |
| credentials: 'include', |
| redirect: 'follow', |
| integrity: expected_integrity, |
| destination: 'script', |
| message: `Script load (url:${actual_url})` |
| }; |
| frame.contentWindow.load_script_with_integrity(actual_url, integrity); |
| return add_promise_to_test(actual_url); |
| } |
| |
| function css_integrity_test(frame, url, integrity, expected_integrity) { |
| const actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| url: actual_url, |
| mode: 'no-cors', |
| credentials: 'include', |
| redirect: 'follow', |
| integrity: expected_integrity, |
| destination: 'style', |
| message: `CSS load (url:${actual_url})` |
| }; |
| frame.contentWindow.load_css_with_integrity(actual_url, integrity); |
| return add_promise_to_test(actual_url); |
| } |
| |
| function fetch_test(frame, url, mode, credentials, |
| expected_mode, expected_credentials) { |
| const actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| integrity: '', |
| destination: '', |
| message: `fetch (url:${actual_url} mode:${mode} ` + |
| `credentials:${credentials})` |
| }; |
| frame.contentWindow.fetch( |
| new Request(actual_url, {mode: mode, credentials: credentials})); |
| return add_promise_to_test(actual_url); |
| } |
| |
| function audio_test(frame, url, cross_origin, |
| expected_mode, expected_credentials) { |
| const actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| integrity: '', |
| destination: 'audio', |
| message: `Audio load (url:${actual_url} cross_origin:${cross_origin})` |
| }; |
| frame.contentWindow.load_audio(actual_url, cross_origin); |
| return add_promise_to_test(actual_url); |
| } |
| |
| |
| function video_test(frame, url, cross_origin, |
| expected_mode, expected_credentials) { |
| const actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| integrity: '', |
| destination: 'video', |
| message: `Video load (url:${actual_url} cross_origin:${cross_origin})` |
| }; |
| frame.contentWindow.load_video(actual_url, cross_origin); |
| return add_promise_to_test(actual_url); |
| } |
| |
| promise_test(async t => { |
| const SCOPE = 'resources/fetch-request-resources-iframe.https.html'; |
| const SCRIPT = 'resources/fetch-request-resources-worker.js'; |
| const host_info = get_host_info(); |
| const LOCAL_URL = |
| host_info['HTTPS_ORIGIN'] + base_path() + 'resources/sample?test'; |
| const REMOTE_URL = |
| host_info['HTTPS_REMOTE_ORIGIN'] + base_path() + 'resources/sample?test'; |
| |
| const registration = |
| await service_worker_unregister_and_register(t, SCRIPT, SCOPE); |
| t.add_cleanup(() => registration.unregister()); |
| const worker = registration.installing; |
| await wait_for_state(t, worker, 'activated'); |
| |
| await new Promise((resolve, reject) => { |
| const channel = new MessageChannel(); |
| channel.port1.onmessage = t.step_func(msg => { |
| if (msg.data.ready) { |
| resolve(); |
| return; |
| } |
| const result = msg.data; |
| const expected = expected_results[result.url]; |
| if (!expected) { |
| return; |
| } |
| test(() => { |
| assert_equals( |
| result.mode, expected.mode, |
| `mode of must be ${expected.mode}.`); |
| assert_equals( |
| result.credentials, expected.credentials, |
| `credentials of ${expected.message} must be ` + |
| `${expected.credentials}.`); |
| assert_equals( |
| result.redirect, expected.redirect, |
| `redirect mode of ${expected.message} must be ` + |
| `${expected.redirect}.`); |
| assert_equals( |
| result.integrity, expected.integrity, |
| `integrity of ${expected.message} must be ` + |
| `${expected.integrity}.`); |
| assert_equals( |
| result.destination, expected.destination, |
| `destination of ${expected.message} must be ` + |
| `${expected.destination}.`); |
| }, expected.message); |
| expected.resolve(); |
| delete expected_results[result.url]; |
| }); |
| worker.postMessage({port: channel.port2}, [channel.port2]); |
| }); |
| |
| const f = await with_iframe(SCOPE); |
| t.add_cleanup(() => f.remove()); |
| |
| await image_test(f, LOCAL_URL, '', 'no-cors', 'include'); |
| await image_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| await css_test(f, LOCAL_URL, '', 'no-cors', 'include'); |
| await css_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| |
| await image_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); |
| await image_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); |
| await image_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| await image_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); |
| await image_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); |
| |
| await script_test(f, LOCAL_URL, '', 'no-cors', 'include'); |
| await script_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); |
| await script_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); |
| await script_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| await script_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); |
| await script_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); |
| |
| await css_test(f, LOCAL_URL, '', 'no-cors', 'include'); |
| await css_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); |
| await css_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); |
| await css_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| await css_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); |
| await css_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); |
| |
| await font_face_test(f, LOCAL_URL, 'cors', 'same-origin'); |
| await font_face_test(f, REMOTE_URL, 'cors', 'same-origin'); |
| |
| await script_integrity_test(f, LOCAL_URL, ' ', ' '); |
| await script_integrity_test( |
| f, LOCAL_URL, |
| 'This is not a valid integrity because it has no dashes', |
| 'This is not a valid integrity because it has no dashes'); |
| await script_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-'); |
| await script_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123'); |
| await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ', |
| 'sha256-foo sha384-abc '); |
| await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc', |
| 'sha256-foo sha256-abc'); |
| |
| await css_integrity_test(f, LOCAL_URL, ' ', ' '); |
| await css_integrity_test( |
| f, LOCAL_URL, |
| 'This is not a valid integrity because it has no dashes', |
| 'This is not a valid integrity because it has no dashes'); |
| await css_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-'); |
| await css_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123'); |
| await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ', |
| 'sha256-foo sha384-abc '); |
| await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc', |
| 'sha256-foo sha256-abc'); |
| |
| await fetch_test(f, LOCAL_URL, 'same-origin', 'omit', 'same-origin', 'omit'); |
| await fetch_test(f, LOCAL_URL, 'same-origin', 'same-origin', |
| 'same-origin', 'same-origin'); |
| await fetch_test(f, LOCAL_URL, 'same-origin', 'include', |
| 'same-origin', 'include'); |
| await fetch_test(f, LOCAL_URL, 'no-cors', 'omit', 'no-cors', 'omit'); |
| await fetch_test(f, LOCAL_URL, 'no-cors', 'same-origin', |
| 'no-cors', 'same-origin'); |
| await fetch_test(f, LOCAL_URL, 'no-cors', 'include', 'no-cors', 'include'); |
| await fetch_test(f, LOCAL_URL, 'cors', 'omit', 'cors', 'omit'); |
| await fetch_test(f, LOCAL_URL, 'cors', 'same-origin', 'cors', 'same-origin'); |
| await fetch_test(f, LOCAL_URL, 'cors', 'include', 'cors', 'include'); |
| await fetch_test(f, REMOTE_URL, 'no-cors', 'omit', 'no-cors', 'omit'); |
| await fetch_test(f, REMOTE_URL, 'no-cors', 'same-origin', 'no-cors', 'same-origin'); |
| await fetch_test(f, REMOTE_URL, 'no-cors', 'include', 'no-cors', 'include'); |
| await fetch_test(f, REMOTE_URL, 'cors', 'omit', 'cors', 'omit'); |
| await fetch_test(f, REMOTE_URL, 'cors', 'same-origin', 'cors', 'same-origin'); |
| await fetch_test(f, REMOTE_URL, 'cors', 'include', 'cors', 'include'); |
| |
| await audio_test(f, LOCAL_URL, '', 'no-cors', 'include'); |
| await audio_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); |
| await audio_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); |
| await audio_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| await audio_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); |
| await audio_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); |
| |
| await video_test(f, LOCAL_URL, '', 'no-cors', 'include'); |
| await video_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); |
| await video_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); |
| await video_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| await video_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); |
| await video_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); |
| }, 'Verify FetchEvent for resources.'); |
| </script> |