blob: f1599952df99903646437989b38ec07dd2dbb8af [file] [log] [blame]
<!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>