| <!DOCTYPE html> |
| <!-- This test is prefixed with `chromium.` because the equivalent version |
| available in Web Platform Tests contains additional assertions which Chromium |
| currently fails. This test should be persisted only to preserve test coverage |
| until such time as the upstream version can be made to pass. See |
| https://crbug.com/718935 --> |
| <title>Service Worker: FetchEvent for resources</title> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| <script src="../resources/get-host-info.js?pipe=sub"></script> |
| <script src="resources/test-helpers.js"></script> |
| <script> |
| var url_count = 0; |
| var expected_results = {}; |
| |
| function image_test(frame, url, cross_origin, |
| expected_mode, expected_credentials) { |
| var actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| message: 'Image load (url:' + |
| actual_url + ' cross_origin:' + cross_origin + ')' |
| }; |
| return frame.contentWindow.load_image(actual_url, cross_origin); |
| } |
| |
| function script_test(frame, url, cross_origin, |
| expected_mode, expected_credentials) { |
| var actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| message: 'Script load (url:' + |
| actual_url + ' cross_origin:' + cross_origin + ')' |
| }; |
| return frame.contentWindow.load_script(actual_url, cross_origin); |
| } |
| |
| function css_test(frame, url, cross_origin, |
| expected_mode, expected_credentials) { |
| var actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| message: 'CSS load (url:' + |
| actual_url + ' cross_origin:' + cross_origin + ')' |
| }; |
| return frame.contentWindow.load_css(actual_url, cross_origin); |
| } |
| |
| function font_face_test(frame, url, expected_mode, |
| expected_credentials) { |
| var actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| url: actual_url, |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| message: 'FontFace load (url:' + actual_url + ')' |
| }; |
| return frame.contentWindow.load_font(actual_url); |
| } |
| |
| function css_image_test(frame, url, type, |
| expected_mode, expected_credentials) { |
| var actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| url: actual_url, |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| message: 'CSSImage load (url:' + actual_url + ' type:' + type + ')' |
| }; |
| return frame.contentWindow.load_css_image(actual_url, type); |
| } |
| |
| function css_image_set_test(frame, url, type, |
| expected_mode, expected_credentials) { |
| var actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| url: actual_url, |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| message: 'CSSImageSet load (url:' + actual_url + ' type:' + type + ')' |
| }; |
| return frame.contentWindow.load_css_image_set(actual_url, type); |
| } |
| |
| function fetch_test(frame, url, mode, credentials, |
| expected_mode, expected_credentials) { |
| var actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| message: 'fetch (url:' + actual_url + ' mode:' + mode + ' credentials:' + |
| credentials + ')' |
| }; |
| return frame.contentWindow.fetch( |
| new Request(actual_url, {mode: mode, credentials: credentials})); |
| } |
| |
| function audio_test(frame, url, cross_origin, |
| expected_mode, expected_credentials) { |
| var actual_url = url + (++url_count); |
| expected_results[actual_url] = { |
| mode: expected_mode, |
| credentials: expected_credentials, |
| redirect: 'follow', |
| message: 'Audio load (url:' + actual_url + ' cross_origin:' + |
| cross_origin + ')' |
| }; |
| return frame.contentWindow.load_audio(actual_url, cross_origin); |
| } |
| |
| async_test(function(t) { |
| var SCOPE = 'resources/fetch-request-resources-iframe.html'; |
| var SCRIPT = 'resources/fetch-request-resources-worker.js'; |
| var host_info = get_host_info(); |
| var LOCAL_URL = |
| host_info['HTTP_ORIGIN'] + base_path() + 'resources/dummy?test'; |
| var REMOTE_URL = |
| host_info['HTTP_REMOTE_ORIGIN'] + base_path() + 'resources/dummy?test'; |
| var worker; |
| var frame; |
| service_worker_unregister_and_register(t, SCRIPT, SCOPE) |
| .then(function(registration) { |
| worker = registration.installing; |
| return wait_for_state(t, worker, 'activated'); |
| }) |
| .then(function() { |
| return new Promise(function(resolve) { |
| var channel = new MessageChannel(); |
| channel.port1.onmessage = t.step_func(function(msg) { |
| if (msg.data.ready) { |
| resolve(); |
| return; |
| } |
| var result = msg.data; |
| var expected = expected_results[result.url]; |
| if (!expected) { |
| return; |
| } |
| assert_equals( |
| result.mode, expected.mode, |
| 'mode of ' + expected.message + ' 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 + '.'); |
| --url_count; |
| delete expected_results[result.url]; |
| if (url_count == 0) { |
| frame.remove(); |
| service_worker_unregister_and_done(t, SCOPE); |
| } |
| }); |
| worker.postMessage( |
| {port: channel.port2}, [channel.port2]); |
| }); |
| }) |
| .then(function() { return with_iframe(SCOPE); }) |
| .then(function(f) { |
| frame = f; |
| image_test(f, LOCAL_URL, '', 'no-cors', 'include'); |
| image_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); |
| image_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); |
| image_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| image_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); |
| image_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); |
| |
| script_test(f, LOCAL_URL, '', 'no-cors', 'include'); |
| script_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); |
| script_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); |
| script_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| script_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); |
| script_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); |
| |
| css_test(f, LOCAL_URL, '', 'no-cors', 'include'); |
| css_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); |
| css_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); |
| css_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| css_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); |
| css_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); |
| |
| font_face_test(f, LOCAL_URL, 'cors', 'same-origin'); |
| font_face_test(f, REMOTE_URL, 'cors', 'same-origin'); |
| |
| css_image_test(f, LOCAL_URL, 'backgroundImage', 'no-cors', 'include'); |
| css_image_test(f, REMOTE_URL, 'backgroundImage', 'no-cors', 'include'); |
| css_image_test(f, LOCAL_URL, 'shapeOutside', 'cors', 'same-origin'); |
| css_image_test(f, REMOTE_URL, 'shapeOutside', 'cors', 'same-origin'); |
| |
| css_image_set_test(f, LOCAL_URL, 'backgroundImage', |
| 'no-cors', 'include'); |
| css_image_set_test(f, REMOTE_URL, 'backgroundImage', |
| 'no-cors', 'include'); |
| css_image_set_test(f, LOCAL_URL, 'shapeOutside', 'cors', 'same-origin'); |
| css_image_set_test(f, REMOTE_URL, 'shapeOutside', |
| 'cors', 'same-origin'); |
| |
| fetch_test(f, LOCAL_URL, 'same-origin', 'omit', 'same-origin', 'omit'); |
| fetch_test(f, LOCAL_URL, 'same-origin', 'same-origin', |
| 'same-origin', 'same-origin'); |
| fetch_test(f, LOCAL_URL, 'same-origin', 'include', |
| 'same-origin', 'include'); |
| fetch_test(f, LOCAL_URL, 'no-cors', 'omit', 'no-cors', 'omit'); |
| fetch_test(f, LOCAL_URL, 'no-cors', 'same-origin', |
| 'no-cors', 'same-origin'); |
| fetch_test(f, LOCAL_URL, 'no-cors', 'include', 'no-cors', 'include'); |
| fetch_test(f, LOCAL_URL, 'cors', 'omit', 'cors', 'omit'); |
| fetch_test(f, LOCAL_URL, 'cors', 'same-origin', 'cors', 'same-origin'); |
| fetch_test(f, LOCAL_URL, 'cors', 'include', 'cors', 'include'); |
| fetch_test(f, REMOTE_URL, 'no-cors', 'omit', 'no-cors', 'omit'); |
| fetch_test(f, REMOTE_URL, 'no-cors', 'same-origin', |
| 'no-cors', 'same-origin'); |
| fetch_test(f, REMOTE_URL, 'no-cors', 'include', 'no-cors', 'include'); |
| fetch_test(f, REMOTE_URL, 'cors', 'omit', 'cors', 'omit'); |
| fetch_test(f, REMOTE_URL, 'cors', 'same-origin', 'cors', 'same-origin'); |
| fetch_test(f, REMOTE_URL, 'cors', 'include', 'cors', 'include'); |
| |
| audio_test(f, LOCAL_URL, '', 'no-cors', 'include'); |
| audio_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin'); |
| audio_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include'); |
| audio_test(f, REMOTE_URL, '', 'no-cors', 'include'); |
| audio_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin'); |
| audio_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include'); |
| }) |
| .catch(unreached_rejection(t)); |
| }, 'Verify FetchEvent for resources.'); |
| </script> |