blob: 7706614282eddf380beaaff347989926b6b8d603 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// |workerFactory| is given instead of workers, to create a worker after a
// test starts to avoid multiple workers are created at once.
function createWorker(workerFactory, onsuccess, onerror) {
var worker = workerFactory();
var onmessage = message => {
if (worker.constructor === Worker) {
worker.terminate();
}
// SharedWorker is terminated by close() in shared_worker.js.
onsuccess(message.data);
};
if (worker.constructor === Worker) {
worker.onmessage = onmessage;
} else {
worker.port.onmessage = onmessage;
}
worker.onerror = onerror;
}
function noRedirectTest(workerFactory, expectedUrl) {
createWorker(
workerFactory,
workerUrl => {
chrome.test.assertEq(expectedUrl, workerUrl);
chrome.test.succeed();
},
() => { chrome.test.fail(); }
);
}
function sameOriginRedirectTest(workerFactory, expectedUrl) {
createWorker(
workerFactory,
workerUrl => {
chrome.test.assertEq(expectedUrl, workerUrl);
chrome.test.succeed();
},
() => { chrome.test.fail(); }
);
}
function crossOriginRedirectTest(workerFactory) {
createWorker(
workerFactory,
workerUrl => {
chrome.test.fail('Cross-origin redirect of worker script should fail');
},
() => { chrome.test.succeed(); }
);
}
chrome.test.getConfig(function(config) {
const baseUrl = 'http://127.0.0.1:' + config.testServer.port;
const crossOriginBaseUrl = 'http://localhost:' + config.testServer.port;
const workerUrl = baseUrl + '/worker/worker.js';
const sharedWorkerUrl = baseUrl + '/worker/shared_worker.js';
const redirectedWorkerUrl = baseUrl + '/server-redirect?' + workerUrl;
const redirectedSharedWorkerUrl =
baseUrl + '/server-redirect?' + sharedWorkerUrl;
const crossOriginRedirectedWorkerUrl =
crossOriginBaseUrl + '/server-redirect?' + workerUrl;
const crossOriginRedirectedSharedWorkerUrl =
crossOriginBaseUrl + '/server-redirect?' + sharedWorkerUrl;
chrome.test.runTests([
noRedirectTest.bind(
undefined,
() => { return new Worker(workerUrl) },
workerUrl),
noRedirectTest.bind(
undefined,
() => { return new Worker(workerUrl, {type: 'module'}) },
workerUrl),
noRedirectTest.bind(
undefined,
() => { return new SharedWorker(sharedWorkerUrl) },
sharedWorkerUrl),
sameOriginRedirectTest.bind(
undefined,
() => { return new Worker(redirectedWorkerUrl) },
workerUrl),
// TODO(crbug.com/861564): expectedUrl should be the response URL.
sameOriginRedirectTest.bind(
undefined,
() => { return new Worker(redirectedWorkerUrl, {type: 'module'}) },
redirectedWorkerUrl),
sameOriginRedirectTest.bind(
undefined,
() => { return new SharedWorker(redirectedSharedWorkerUrl) },
sharedWorkerUrl),
crossOriginRedirectTest.bind(
undefined,
() => { return new Worker(crossOriginRedirectedWorkerUrl) }),
crossOriginRedirectTest.bind(
undefined,
() => {
return new Worker(crossOriginRedirectedWorkerUrl, {type: 'module'});
}),
crossOriginRedirectTest.bind(
undefined,
() => { return new SharedWorker(crossOriginRedirectedSharedWorkerUrl) }),
]);
});