Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

service worker: Upstream sandboxed iframe test to WPT. #8118

Merged
merged 1 commit into from
Nov 20, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<script>
function with_iframe(url) {
return new Promise(function(resolve) {
var frame = document.createElement('iframe');
frame.src = url;
frame.onload = function() { resolve(frame); };
document.body.appendChild(frame);
});
}

function with_sandboxed_iframe(url, sandbox) {
return new Promise(function(resolve) {
var frame = document.createElement('iframe');
frame.sandbox = sandbox;
frame.src = url;
frame.onload = function() { resolve(frame); };
document.body.appendChild(frame);
});
}

function fetch_in_worker() {
return new Promise((resolve) => {
var blob = new Blob([
"fetch('" + location.href + "_workerfetch', {mode: 'no-cors'})" +
" .then(() => { self.postMessage('OK'); });"]);
var url = URL.createObjectURL(blob);
var worker = new Worker(url);
worker.onmessage = resolve;
});
}

window.onmessage = function (e) {
var id = e.data['id'];
fetch(location.href + "_fetch", {mode: 'no-cors'})
.then(function() {
return fetch_in_worker();
})
.then(function() {
return with_iframe(location.href + "_iframe");
})
.then(function() {
return with_sandboxed_iframe(location.href + "_script",
"allow-scripts");
})
.then(function() {
return with_sandboxed_iframe(location.href + "_script-origin",
"allow-scripts allow-same-origin");
})
.then(function() {
window.top.postMessage({id: id, result: 'done'}, '*');
})
.catch(function(e) {
window.top.postMessage({id: id, result: 'error: ' + e.toString()}, '*');
});
};
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
var requests = [];

self.addEventListener('message', function(event) {
event.waitUntil(self.clients.matchAll()
.then(function(clients) {
var client_urls = [];
for(var client of clients){
client_urls.push(client.url);
}
client_urls = client_urls.sort();
event.data.port.postMessage(
{clients: client_urls, requests: requests});
}));
});

self.addEventListener('fetch', function(event) {
requests.push(event.request.url);
event.respondWith(fetch(event.request));
});
10 changes: 10 additions & 0 deletions service-workers/service-worker/resources/test-helpers.sub.js
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,13 @@ function register_using_link(script, options) {
})
.then(() => navigator.serviceWorker.getRegistration(scope));
}

function with_sandboxed_iframe(url, sandbox) {
return new Promise(function(resolve) {
var frame = document.createElement('iframe');
frame.sandbox = sandbox;
frame.src = url;
frame.onload = function() { resolve(frame); };
document.body.appendChild(frame);
});
}
216 changes: 216 additions & 0 deletions service-workers/service-worker/sandboxed-iframe-fetch-event.https.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
<!DOCTYPE html>
<title>ServiceWorker FetchEvent for sandboxed iframe.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<body>
<script>
var lastCallbackId = 0;
var callbacks = {};
function postMessageAndWaitResult(frame) {
return new Promise(function(resolve) {
var id = ++lastCallbackId;
callbacks[id] = resolve;
frame.contentWindow.postMessage({id:id}, '*');
});
}

window.onmessage = function (e) {
message = e.data;
var id = message['id'];
var calback = callbacks[id];
delete callbacks[id];
calback(message['result']);
};

promise_test(function(t) {
var SCOPE = 'resources/sandboxed-iframe-fetch-event-iframe.html';
var SCRIPT = 'resources/sandboxed-iframe-fetch-event-worker.js';
var frames = [];
var worker;
return service_worker_unregister_and_register(t, SCRIPT, SCOPE)
.then(function(registration) {
worker = registration.installing;
return wait_for_state(t, registration.installing, 'activated');
})
.then(function() {
return with_iframe(SCOPE + '?iframe');
})
.then(function(frame) {
frames.push(frame);
return postMessageAndWaitResult(frame);
})
.then(function(result) {
assert_equals(result, 'done');
return with_sandboxed_iframe(SCOPE + '?script', 'allow-scripts');
})
.then(function(frame) {
frames.push(frame);
return postMessageAndWaitResult(frame);
})
.then(function(result) {
assert_equals(result, 'done');
return with_sandboxed_iframe(SCOPE + '?script-origin',
'allow-scripts allow-same-origin');
})
.then(function(frame) {
frames.push(frame);
return postMessageAndWaitResult(frame);
})
.then(function(result) {
assert_equals(result, 'done');
return new Promise(function(resolve) {
var channel = new MessageChannel();
channel.port1.onmessage = function(msg) {
resolve(msg);
};
worker.postMessage({port: channel.port2}, [channel.port2]);
});
})
.then(function(msg) {
for (var frame of frames) {
frame.remove();
}
var expected_base_url = new URL(SCOPE, location.href).href;
var request_set = {};
for (var request of msg.data.requests) {
request_set[request] = true;
}
assert_true(
expected_base_url + '?iframe' in request_set,
'The request for normal iframe should be handled by SW.');
assert_true(
expected_base_url + '?iframe_fetch' in request_set,
'The fetch request from normal iframe should be handled by SW.');
assert_true(
expected_base_url + '?iframe_workerfetch' in request_set,
'The fetch request from worker in normal iframe should be ' +
'handled by SW.');
assert_true(
expected_base_url + '?iframe_iframe' in request_set,
'The request for normal iframe inside normal iframe should be ' +
'handled by SW.');
assert_false(
expected_base_url + '?iframe_script' in request_set,
'The request for sandboxed iframe with allow-scripts flag ' +
'inside normal iframe should not be handled by SW.');
assert_true(
expected_base_url + '?iframe_script-origin' in request_set,
'The request for sandboxed iframe with allow-scripts and ' +
'allow-same-origin flag inside normal iframe should be handled ' +
'by SW.');
assert_false(
expected_base_url + '?script' in request_set,
'The request for sandboxed iframe with allow-scripts flag ' +
'should not be handled by SW.');
assert_false(
expected_base_url + '?script_fetch' in request_set,
'The fetch request from sandboxed iframe with allow-scripts ' +
'flag should not be handled by SW.');
assert_false(
expected_base_url + '?script_workerfetch' in request_set,
'The fetch request from worker from sandboxed iframe with ' +
'allow-scripts flag should not be handled by SW.');
assert_false(
expected_base_url + '?script_iframe' in request_set,
'The request for normal iframe inside sandboxed iframe with ' +
'allow-scripts flag should not be handled by SW.');
assert_false(
expected_base_url + '?script_script' in request_set,
'The request for sandboxed iframe with allow-scripts flag ' +
'inside sandboxed iframe with allow-scripts flag should not be ' +
'handled by SW.');
assert_false(
expected_base_url + '?script_script-origin' in request_set,
'The request for sandboxed iframe with allow-scripts and ' +
'allow-same-origin flag inside sandboxed iframe with ' +
'allow-scripts flag should not be handled by SW.');
assert_true(
expected_base_url + '?script-origin' in request_set,
'The request for sandboxed iframe with allow-scripts and ' +
'allow-same-origin flag should be handled by SW.');
assert_true(
expected_base_url + '?script-origin_fetch' in request_set,
'The fetch request from sandboxed iframe with allow-scripts ' +
'and allow-same-origin flag should be handled by SW.');
assert_true(
expected_base_url + '?script-origin_workerfetch' in request_set,
'The fetch request from worker in sandboxed iframe with ' +
'allow-scripts and allow-same-origin flag should be handled ' +
'by SW.');
assert_true(
expected_base_url + '?script-origin_iframe' in request_set,
'The request for normal iframe inside sandboxed iframe with ' +
'allow-scripts and allow-same-origin flag should be handled by' +
'SW.');
assert_false(
expected_base_url + '?script-origin_script' in request_set,
'The request for sandboxed iframe with allow-scripts flag ' +
'inside sandboxed iframe with allow-scripts and ' +
'allow-same-origin flag should be handled by SW.');
assert_true(
expected_base_url + '?script-origin_script-origin' in request_set,
'The request for sandboxed iframe with allow-scripts and' +
'allow-same-origin flag inside sandboxed iframe with ' +
'allow-scripts and allow-same-origin flag should be handled by' +
'SW.');

var client_set = {};
for (var client of msg.data.clients) {
client_set[client] = true;
}
assert_true(
expected_base_url + '?iframe' in client_set,
'The normal iframe should be controlled by SW.');
assert_true(
expected_base_url + '?iframe_iframe' in client_set,
'The normal iframe inside normal iframe should be controlled ' +
'by SW.');
assert_false(
expected_base_url + '?iframe_script' in client_set,
'The sandboxed iframe with allow-scripts flag inside normal ' +
'iframe should not be controlled by SW.');
assert_true(
expected_base_url + '?iframe_script-origin' in client_set,
'The sandboxed iframe with allow-scripts and allow-same-origin' +
'flag inside normal iframe should be controlled by SW.');
assert_false(
expected_base_url + '?script' in client_set,
'The sandboxed iframe with allow-scripts flag should not be ' +
'controlled by SW.');
assert_false(
expected_base_url + '?script_iframe' in client_set,
'The normal iframe inside sandboxed iframe with allow-scripts' +
'flag should not be controlled by SW.');
assert_false(
expected_base_url + '?script_script' in client_set,
'The sandboxed iframe with allow-scripts flag inside sandboxed ' +
'iframe with allow-scripts flag should not be controlled by SW.');
assert_false(
expected_base_url + '?script_script-origin' in client_set,
'The sandboxed iframe with allow-scripts and allow-same-origin ' +
'flag inside sandboxed iframe with allow-scripts flag should ' +
'not be controlled by SW.');
assert_true(
expected_base_url + '?script-origin' in client_set,
'The sandboxed iframe with allow-scripts and allow-same-origin ' +
'flag should be controlled by SW.');
assert_true(
expected_base_url + '?script-origin_iframe' in client_set,
'The normal iframe inside sandboxed iframe with allow-scripts ' +
'and allow-same-origin flag should be controlled by SW.');
assert_false(
expected_base_url + '?script-origin_script' in client_set,
'The sandboxed iframe with allow-scripts flag inside sandboxed ' +
'iframe with allow-scripts and allow-same-origin flag should ' +
'be controlled by SW.');
assert_true(
expected_base_url + '?script-origin_script-origin' in client_set,
'The sandboxed iframe with allow-scripts and allow-same-origin ' +
'flag inside sandboxed iframe with allow-scripts and ' +
'allow-same-origin flag should be controlled by SW.');
return service_worker_unregister_and_done(t, SCOPE);
});
}, 'ServiceWorker FetchEvent for sandboxed iframe.');
</script>
</body>