Skip to content

Commit

Permalink
service worker: Upstream sandboxed iframe test to WPT.
Browse files Browse the repository at this point in the history
This test is a fine subject matter for WPT.

Bug: 486308, 688116
Change-Id: I91d8484286094c695fe2219f0c017e25e8bfd34c
Reviewed-on: https://chromium-review.googlesource.com/759168
Reviewed-by: Tsuyoshi Horo <[email protected]>
Commit-Queue: Matt Falkenhagen <[email protected]>
Cr-Commit-Position: refs/heads/master@{#515030}
  • Loading branch information
mfalken authored and foolip committed Nov 20, 2017
1 parent 1e4ab31 commit c9c121d
Show file tree
Hide file tree
Showing 4 changed files with 301 additions and 0 deletions.
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>

0 comments on commit c9c121d

Please sign in to comment.