-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
service worker: Upstream sandboxed iframe test to WPT.
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
Showing
4 changed files
with
301 additions
and
0 deletions.
There are no files selected for viewing
56 changes: 56 additions & 0 deletions
56
service-workers/service-worker/resources/sandboxed-iframe-fetch-event-iframe.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
19 changes: 19 additions & 0 deletions
19
service-workers/service-worker/resources/sandboxed-iframe-fetch-event-worker.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
216 changes: 216 additions & 0 deletions
216
service-workers/service-worker/sandboxed-iframe-fetch-event.https.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |