Bug 1433044 P2 Update local-url-inherit-controller.https.html to test fetch() interception in local URL windows and workers. r=asuth

This commit is contained in:
Ben Kelly 2018-01-25 12:52:51 -08:00
Родитель 4a88dfb69d
Коммит e9b911badc
4 изменённых файлов: 117 добавлений и 15 удалений

Просмотреть файл

@ -287941,6 +287941,11 @@
{}
]
],
"service-workers/service-worker/resources/local-url-inherit-controller-worker.js": [
[
{}
]
],
"service-workers/service-worker/resources/malformed-worker.py": [
[
{}
@ -580167,7 +580172,7 @@
"testharness"
],
"service-workers/service-worker/local-url-inherit-controller.https.html": [
"e29f2ffef20a9436cc721293ddcf932ca1b26bda",
"e2e8258f24860cb93b71b4bb27f618b7740756bd",
"testharness"
],
"service-workers/service-worker/mime-sniffing.https.html": [
@ -580979,7 +580984,11 @@
"support"
],
"service-workers/service-worker/resources/local-url-inherit-controller-frame.html": [
"bf2722799132cf551a9d32e5593c0734b85a3c0f",
"12822899ad84cef80d4f67cb33475a93ca1d56ed",
"support"
],
"service-workers/service-worker/resources/local-url-inherit-controller-worker.js": [
"7a74ae709c072750cf0639f78bf9a0ac4f16f50b",
"support"
],
"service-workers/service-worker/resources/malformed-worker.py": [

Просмотреть файл

@ -8,11 +8,11 @@
<body>
<script>
const SCRIPT = 'resources/empty.js';
const SCRIPT = 'resources/local-url-inherit-controller-worker.js';
const SCOPE = 'resources/local-url-inherit-controller-frame.html';
async function doAsyncTest(t, opts) {
let name = opts.scheme + '-' + opts.child;
let name = `${opts.scheme}-${opts.child}-${opts.check}`;
let scope = SCOPE + '?name=' + name;
let reg = await service_worker_unregister_and_register(t, SCRIPT, scope);
add_completion_callback(_ => reg.unregister());
@ -23,32 +23,62 @@ async function doAsyncTest(t, opts) {
assert_not_equals(frame.contentWindow.navigator.serviceWorker.controller, null,
'frame should be controlled');
let blobController = await frame.contentWindow.checkChildController(opts);
let result = await frame.contentWindow.checkChildController(opts);
result = result.data;
let expect = opts.expect === 'inherit'
? frame.contentWindow.navigator.serviceWorker.controller.scriptURL
: null;
let expect = 'unexpected';
if (opts.check === 'controller') {
expect = opts.expect === 'inherit'
? frame.contentWindow.navigator.serviceWorker.controller.scriptURL
: null;
} else if (opts.check === 'fetch') {
// The service worker FetchEvent handler will provide an "intercepted"
// body. If the local URL ends up with an opaque origin and is not
// intercepted then it will get an opaque Response. In that case it
// should see an empty string body.
expect = opts.expect === 'intercept' ? 'intercepted' : '';
}
assert_equals(blobController, expect,
`${opts.scheme} URL ${opts.child} should ${opts.expect} controller`);
assert_equals(result, expect,
`${opts.scheme} URL ${opts.child} should ${opts.expect} ${opts.check}`);
}
promise_test(function(t) {
return doAsyncTest(t, {
scheme: 'blob',
child: 'iframe',
check: 'controller',
expect: 'inherit',
});
}, 'Same-origin blob URL iframe should inherit service worker controller.');
promise_test(function(t) {
return doAsyncTest(t, {
scheme: 'blob',
child: 'iframe',
check: 'fetch',
expect: 'intercept',
});
}, 'Same-origin blob URL iframe should intercept fetch().');
promise_test(function(t) {
return doAsyncTest(t, {
scheme: 'blob',
child: 'worker',
check: 'controller',
expect: 'inherit',
});
}, 'Same-origin blob URL worker should inherit service worker controller.');
promise_test(function(t) {
return doAsyncTest(t, {
scheme: 'blob',
child: 'worker',
check: 'fetch',
expect: 'intercept',
});
}, 'Same-origin blob URL worker should intercept fetch().');
promise_test(function(t) {
// Data URLs should result in an opaque origin and should probably not
// have access to a cross-origin service worker. See:
@ -58,10 +88,20 @@ promise_test(function(t) {
return doAsyncTest(t, {
scheme: 'data',
child: 'iframe',
check: 'controller',
expect: 'not inherit',
});
}, 'Data URL iframe should not inherit service worker controller.');
promise_test(function(t) {
return doAsyncTest(t, {
scheme: 'data',
child: 'iframe',
check: 'fetch',
expect: 'not intercept',
});
}, 'Data URL iframe should not intercept fetch().');
promise_test(function(t) {
// Data URLs should result in an opaque origin and should probably not
// have access to a cross-origin service worker. See:
@ -71,9 +111,19 @@ promise_test(function(t) {
return doAsyncTest(t, {
scheme: 'data',
child: 'worker',
check: 'controller',
expect: 'not inherit',
});
}, 'Data URL worker should not inherit service worker controller.');
promise_test(function(t) {
return doAsyncTest(t, {
scheme: 'data',
child: 'worker',
check: 'fetch',
expect: 'not intercept',
});
}, 'Data URL worker should not intercept fetch().');
</script>
</body>

Просмотреть файл

@ -2,27 +2,65 @@
<html>
<script>
const frameText =
const fetchURL = new URL('dummy.txt', window.location).href;
const frameControllerText =
`<script>
let t = navigator.serviceWorker.controller
? navigator.serviceWorker.controller.scriptURL
: null;
parent.postMessage(t, "*");
parent.postMessage({ data: t }, '*');
</` + `script>`;
const workerText =
const frameFetchText =
`<script>
fetch('${fetchURL}', { mode: 'no-cors' }).then(response => {
return response.text();
}).then(text => {
parent.postMessage({ data: text }, '*');
}).catch(e => {
parent.postMessage({ data: e.message }, '*');
});
</` + `script>`;
const workerControllerText =
`let t = navigator.serviceWorker.controller
? navigator.serviceWorker.controller.scriptURL
: null;
self.postMessage(t);`;
const workerFetchText =
`fetch('${fetchURL}', { mode: 'no-cors' }).then(response => {
return response.text();
}).then(text => {
self.postMessage(text);
}).catch(e => {
self.postMessage(e.message);
});`
function getChildText(opts) {
if (opts.child === 'iframe') {
return frameText;
if (opts.check === 'controller') {
return frameControllerText;
}
if (opts.check === 'fetch') {
return frameFetchText;
}
throw('unexpected feature to check: ' + opts.check);
}
if (opts.child === 'worker') {
return workerText;
if (opts.check === 'controller') {
return workerControllerText;
}
if (opts.check === 'fetch') {
return workerFetchText;
}
throw('unexpected feature to check: ' + opts.check);
}
throw('unexpected child type ' + opts.child);

Просмотреть файл

@ -0,0 +1,5 @@
addEventListener('fetch', evt => {
if (evt.request.url.includes('dummy')) {
evt.respondWith(new Response('intercepted'));
}
});