Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!DOCTYPE html>
<meta charset="utf-8">
<title>Navigation Preload redirect response</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../resources/test-helpers.sub.js"></script>
<script>
function check_opaqueredirect(response_info, scope) {
assert_equals(response_info.type, 'opaqueredirect');
assert_equals(response_info.url, '' + new URL(scope, location));
assert_equals(response_info.status, 0);
assert_equals(response_info.ok, false);
assert_equals(response_info.statusText, '');
assert_equals(response_info.headers.length, 0);
}
function redirect_response_test(t, scope, expected_body, expected_urls) {
var script = 'resources/redirect-worker.js';
var registration;
var message_resolvers = [];
function wait_for_message(count) {
var promises = [];
message_resolvers = [];
for (var i = 0; i < count; ++i) {
promises.push(new Promise(resolve => message_resolvers.push(resolve)));
}
return promises;
}
function on_message(e) {
var resolve = message_resolvers.shift();
if (resolve)
resolve(e.data);
}
return service_worker_unregister_and_register(t, script, scope)
.then(reg => {
registration = reg;
add_completion_callback(_ => registration.unregister());
var worker = registration.installing;
return wait_for_state(t, worker, 'activated');
})
.then(_ => with_iframe(scope + '&base'))
.then(frame => {
assert_equals(frame.contentDocument.body.textContent, 'OK');
frame.contentWindow.navigator.serviceWorker.onmessage = on_message;
return Promise.all(wait_for_message(expected_urls.length)
.concat(with_iframe(scope)));
})
.then(results => {
var frame = results[expected_urls.length];
assert_equals(frame.contentDocument.body.textContent, expected_body);
for (var i = 0; i < expected_urls.length; ++i) {
check_opaqueredirect(results[i], expected_urls[i]);
}
frame.remove();
return registration.unregister();
});
}
promise_test(t => {
return redirect_response_test(
t,
'resources/redirect-scope.py?type=normal',
'redirected\n',
['resources/redirect-scope.py?type=normal']);
}, 'Navigation Preload redirect response.');
promise_test(t => {
return redirect_response_test(
t,
'resources/redirect-scope.py?type=no-location',
'',
['resources/redirect-scope.py?type=no-location']);
}, 'Navigation Preload no-location redirect response.');
promise_test(t => {
return redirect_response_test(
t,
'resources/redirect-scope.py?type=no-location-with-body',
'BODY',
['resources/redirect-scope.py?type=no-location-with-body']);
}, 'Navigation Preload no-location redirect response with body.');
promise_test(t => {
return redirect_response_test(
t,
'resources/redirect-scope.py?type=redirect-to-scope',
'redirected\n',
['resources/redirect-scope.py?type=redirect-to-scope',
'resources/redirect-scope.py?type=redirect-to-scope2',
'resources/redirect-scope.py?type=redirect-to-scope3',]);
}, 'Navigation Preload redirect to the same scope.');
</script>