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

Set SkipServiceWorker flag for synchronous loads from the main thread. #10265

Merged
merged 1 commit into from Apr 2, 2018
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,41 @@
<!DOCTYPE html>
<title>Service Worker: Synchronous XHR on Worker is intercepted</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
'use strict';

promise_test((t) => {
const url = 'resources/fetch-request-xhr-sync-on-worker-worker.js';
const scope = 'resources/fetch-request-xhr-sync-on-worker-scope/';
const non_existent_file = 'non-existent-file.txt';

// In Chromium, the service worker scope matching for workers is based on
// the URL of the parent HTML. So this test creates an iframe which is
// controlled by the service worker first, and creates a worker from the
// iframe.
return service_worker_unregister_and_register(t, url, scope)
.then((registration) => {
t.add_cleanup(() => registration.unregister());
return wait_for_state(t, registration.installing, 'activated');
})
.then(() => { return with_iframe(scope + 'iframe_page'); })
.then((frame) => {
t.add_cleanup(() => frame.remove());
return frame.contentWindow.performSyncXHROnWorker(non_existent_file);
})
.then((result) => {
assert_equals(
result.status,
200,
'HTTP response status code for intercepted request'
);
assert_equals(
result.responseText,
'Response from service worker',
'HTTP response text for intercepted request'
);
});
}, 'Verify SyncXHR on Worker is intercepted');
</script>
@@ -0,0 +1,41 @@
'use strict';

self.onfetch = function(event) {
if (event.request.url.indexOf('non-existent-file.txt') !== -1) {
event.respondWith(new Response('Response from service worker'));
} else if (event.request.url.indexOf('/iframe_page') !== -1) {
event.respondWith(new Response(
'<!DOCTYPE html>\n' +
'<script>\n' +
'function performSyncXHROnWorker(url) {\n' +
' return new Promise((resolve) => {\n' +
' var worker =\n' +
' new Worker(\'./worker_script\');\n' +
' worker.addEventListener(\'message\', (msg) => {\n' +
' resolve(msg.data);\n' +
' });\n' +
' worker.postMessage({\n' +
' url: url\n' +
' });\n' +
' });\n' +
'}\n' +
'</script>',
{
headers: [['content-type', 'text/html']]
}));
} else if (event.request.url.indexOf('/worker_script') !== -1) {
event.respondWith(new Response(
'self.onmessage = (msg) => {' +
' const syncXhr = new XMLHttpRequest();' +
' syncXhr.open(\'GET\', msg.data.url, false);' +
' syncXhr.send();' +
' self.postMessage({' +
' status: syncXhr.status,' +
' responseText: syncXhr.responseText' +
' });' +
'}',
{
headers: [['content-type', 'application/javascript']]
}));
}
};