Commit 40748e1e authored by kdillon's avatar kdillon Committed by Commit Bot

Upstream fast/workers to external/wpt/workers: first batch.

Bug: 795636
Change-Id: Ifbeaf7eab76b992ac41a4dc7f23ec46f72ad8ca2
Reviewed-on: https://chromium-review.googlesource.com/c/1412827
Commit-Queue: Katie Dillon <kdillon@chromium.org>
Reviewed-by: default avatarHiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/master@{#625734}
parent b430338d
...@@ -47,7 +47,6 @@ crbug.com/882756 external/wpt/requestidlecallback/cancel-invoked.html [ Timeout ...@@ -47,7 +47,6 @@ crbug.com/882756 external/wpt/requestidlecallback/cancel-invoked.html [ Timeout
# Stack use-after-return detection # Stack use-after-return detection
crbug.com/438499 [ Linux ] crypto/worker-random-values-limits.html [ Timeout ] crbug.com/438499 [ Linux ] crypto/worker-random-values-limits.html [ Timeout ]
crbug.com/438499 [ Linux ] fast/workers/simultaneous-errors.html [ Timeout ]
crbug.com/438499 [ Linux ] fast/workers/worker-multi-startup.html [ Timeout ] crbug.com/438499 [ Linux ] fast/workers/worker-multi-startup.html [ Timeout ]
crbug.com/438499 [ Linux ] http/tests/websocket/workers/worker-simple.html [ Timeout ] crbug.com/438499 [ Linux ] http/tests/websocket/workers/worker-simple.html [ Timeout ]
crbug.com/438499 [ Linux ] http/tests/workers/text-encoding.html [ Timeout ] crbug.com/438499 [ Linux ] http/tests/workers/text-encoding.html [ Timeout ]
......
...@@ -9,7 +9,6 @@ crbug.com/420198 [ Linux ] fast/css/fontface-arraybuffer.html [ Skip ] ...@@ -9,7 +9,6 @@ crbug.com/420198 [ Linux ] fast/css/fontface-arraybuffer.html [ Skip ]
# Deliberate infinite recursion. A JS exception is expected, but may crash with # Deliberate infinite recursion. A JS exception is expected, but may crash with
# a stack overflow due to bloated stack frames under MSan. # a stack overflow due to bloated stack frames under MSan.
crbug.com/420606 [ Linux ] fast/workers/shared-worker-constructor.html [ Skip ]
crbug.com/420606 [ Linux ] fast/workers/worker-constructor.html [ Skip ] crbug.com/420606 [ Linux ] fast/workers/worker-constructor.html [ Skip ]
# Flaky under MSan (hang forever). # Flaky under MSan (hang forever).
......
...@@ -801,3 +801,5 @@ CSS-COLLIDING-REF-NAME: css/vendor-imports/mozilla/mozilla-central-reftests/cont ...@@ -801,3 +801,5 @@ CSS-COLLIDING-REF-NAME: css/vendor-imports/mozilla/mozilla-central-reftests/cont
# Signed Exchange files have hard-coded URLs in the certUrl field # Signed Exchange files have hard-coded URLs in the certUrl field
WEB-PLATFORM.TEST:signed-exchange/resources/*.sxg WEB-PLATFORM.TEST:signed-exchange/resources/*.sxg
WEB-PLATFORM.TEST:signed-exchange/resources/generate-test-sxgs.sh WEB-PLATFORM.TEST:signed-exchange/resources/generate-test-sxgs.sh
WEB-PLATFORM.TEST: workers/Worker-location.any.js
\ No newline at end of file
// META: global=!default,sharedworker
const t = async_test("Make sure that MessageEvent.source is properly set in connect event.");
onconnect = t.step_func_done((event) => {
assert_equals(event.__proto__, MessageEvent.prototype);
assert_equals(event.source, event.ports[0]);
});
<!DOCTYPE html>
<title>Test SharedWorker constructor functionality.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
test(() => {
assert_throws(new Error(),
function() {
new SharedWorker({toString:function(){throw new Error()}}, "name") },
"toString exception not propagagted");
}, "Test toString exception propagated correctly.");
test(() => {
assert_throws(new RangeError(),
function() {
var foo = {toString:function(){new Worker(foo)}}
new SharedWorker(foo, name); },
"Trying to create workers recursively did not result in an exception.");
}, "Test recursive worker creation results in exception.");
test(() => {
assert_throws(new TypeError(),
function() { new SharedWorker(); },
"Invoking SharedWorker constructor without arguments did not result in an exception.");
}, "Test SharedWorker creation without arguments results in exception.");
test(() => {
try {
var worker = new SharedWorker("support/SharedWorker-common.js");
} catch (ex) {
assert_unreached("Constructor failed when no name is passed: (" + ex + ")");
}
}, "Test SharedWorker constructor without a name does not result in an exception.");
test(() => {
try {
var worker = new SharedWorker("support/SharedWorker-common.js", null);
} catch (ex) {
assert_unreached("Constructor failed when null name is passed: (" + ex + ")");
}
}, "Test SharedWorker constructor with null name does not result in an exception.");
test(() => {
try {
var worker = new SharedWorker("support/SharedWorker-common.js", undefined);
} catch (ex) {
assert_unreached("Constructor failed when undefined name is passed: (" + ex + ")");
}
}, "Test SharedWorker constructor with undefined name does not result in an exception.");
test(() => {
try {
var worker = new SharedWorker("support/SharedWorker-common.js", "name");
} catch (ex) {
assert_unreached("Invoking SharedWorker constructor resulted in an exception: (" + ex + ")");
}
}, "Test SharedWorker constructor suceeds.");
</script>
<!DOCTYPE html>
<title>This test checks whether exceptions in SharedWorkers are logged to the parent document. An exception should be logged to the error console.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/SharedWorker-create-common.js"></script>
<script>
async_test(function(t) {
var worker = createWorker();
worker.postMessage("throw");
worker.postMessage("ping");
worker.onmessage = function(evt) {
// Wait for response from ping - that's how we know we have thrown the exception.
if (evt.data == "PASS: Received ping message") {
t.done();
}
};
});
</script>
// META: global=!default,sharedworker
// https://crbug.com/239669
const t = async_test("Tests that repeatedly setting 'onerror' within a shared worker doesnt crash.");
onconnect = t.step_func_done((event) => {
function update() {
onerror = undefined;
}
try {
for (var i = 0; i < 8; ++i) {
update();
}
} catch (ex) {
assert_unreached("FAIL: unexpected exception (" + ex + ") received while updating onerror event handler.");
}
});
<!DOCTYPE html>
<title>Test SharedWorker script error handling functionality.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(t => {
let worker;
return new Promise((resolve) => {
worker = new SharedWorker("support/SharedWorker-script-error.js");
// Shared workers should only invoke onerror for loading errors.
worker.onerror = function(evt) {
assert_unreached("FAIL: onerror invoked for a script error.");
};
worker.port.postMessage("unhandledError");
worker.port.onmessage = resolve;
}).then(e => {
assert_equals(e.data, "SUCCESS: unhandled error generated");
});
}, 'Test script error unhandled.')
promise_test(t => {
let worker;
return new Promise((resolve) => {
worker = new SharedWorker("support/SharedWorker-script-error.js");
// Shared workers should only invoke onerror for loading errors.
worker.onerror = function(evt) {
assert_unreached("FAIL: onerror invoked for a script error.");
};
worker.port.postMessage("handledError");
worker.port.onmessage = resolve;
}).then(e => {
assert_equals(e.data, "SUCCESS: error handled via onerror");
});
}, 'Test script error handled.')
</script>
<!DOCTYPE html>
<title>Test simple shared worker construction case.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(t => {
let worker;
return new Promise(resolve => {
worker = new SharedWorker('support/SharedWorker-common.js', 'name');
worker.port.postMessage("ping");
worker.port.onmessage = resolve;
}).then(e => {
assert_equals(e.data, "PASS: Received ping message");
});
});
</script>
// META: global=!default,worker
test(() => {
assert_true(typeof atob === 'function');
assert_true(typeof btoa === 'function');
}, 'Tests that atob() / btoa() functions are exposed to workers');
importScripts("/resources/testharness.js");
test(() => {
try {
postMessage("SUCCESS: postMessage() called directly");
postMessage.call(null, "SUCCESS: postMessage() invoked via postMessage.call()");
var saved = postMessage;
saved("SUCCESS: postMessage() called via intermediate variable");
} catch (ex) {
assert_unreached("FAIL: unexpected exception (" + ex + ") received while calling functions from the worker context.");
}
}, 'Test calling functions from WorkerContext.');
done();
//META: global=!default, worker
test(() => {
proto = new Number(42)
assert_equals(String(Object.getPrototypeOf(WorkerLocation)), "function () { [native code] }");
WorkerLocation.__proto__ = proto;
assert_object_equals(Object.getPrototypeOf(WorkerLocation), Object(42));
}, 'Tests that setting the proto of a built in constructor is not reset.');
// META: global=!default, dedicatedworker, sharedworker
test(() => {
assert_equals(String(WorkerLocation), "function WorkerLocation() { [native code] }");
assert_true(location instanceof Object);
assert_equals(location.href, "http://web-platform.test:8001/workers/Worker-location.any.worker.js")
assert_equals(location.origin, "http://web-platform.test:8001");
assert_equals(location.protocol, "http:");
assert_equals(location.host, "web-platform.test:8001");
assert_equals(location.hostname, "web-platform.test");
assert_equals(location.port, "8001");
assert_equals(location.pathname, "/workers/Worker-location.any.worker.js");
assert_equals(location.search, "");
assert_equals(location.hash, "");
}, 'Test WorkerLocation properties.');
// META: global=!default,worker
test(() => {
try {
self.MessageEvent = 'PASS';
assert_equals(self.MessageEvent, 'PASS');
} catch (ex) {
assert_unreached("FAIL: unexpected exception (" + ex + ") received while replacing global constructor MessageEvent.");
}
}, 'Test replacing global constructors in a worker context.');
// META: global=!default,worker
test(() => {
try {
self = 'PASS';
assert_true(self instanceof WorkerGlobalScope);
} catch (ex) {
assert_unreached("FAIL: unexpected exception (" + ex + ") received while replacing self.");
}
}, 'Test that self is not replaceable.');
<!DOCTYPE html>
<title>Test simultaneous errors on workers.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(t => {
var workers = 4;
var promises = [];
for (i = 0; i < workers; ++i) {
var worker = new Worker('support/throw-on-message-Worker.js');
promises.push(new Promise(function(resolve, reject) {
var error = 0;
worker.onmessage = function(event) {
if (event.data === 'second')
resolve(error);
else if (event.data === 'error')
++error;
}
}));
worker.postMessage('first');
worker.postMessage('second');
}
return Promise.all(promises).then(e => {
var sum = 0;
for (var key in e) {
sum += e[key]
}
assert_equals(sum, workers);
});
});
</script>
<!DOCTYPE html>
<title>This test terminates a worker when there are many undelivered MessagePort messages still waiting to be dispatched into the Worker Context. This causes termination of JS execution and test should not try to dispatch the remaining messages. Test succeeds if it does not hang or crash (if worker thread is running in the separate process, that process could hang or crash).</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script> <script>
function test() async_test(function(t) {
{ var worker = new Worker("support/Worker-termination-with-port-messages.js");
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
var worker = new Worker("resources/termination-with-port-messages.js");
var channel = new MessageChannel(); var channel = new MessageChannel();
channel.port2.onmessage = function(evt) channel.port2.onmessage = function(evt)
{ {
// On first message back from worker, terminate it. // On first message back from worker, terminate it.
worker.terminate(); worker.terminate();
if (window.testRunner) t.done();
setTimeout("testRunner.notifyDone();", 0);
} }
channel.port2.start(); channel.port2.start();
worker.postMessage("", [channel.port1]); worker.postMessage("", [channel.port1]);
for (i = 0; i < 1000; i++) for (i = 0; i < 1000; i++)
channel.port2.postMessage("message to worker"); channel.port2.postMessage("message to worker");
} });
</script> </script>
<body onload=test()>
<p>This test terminates a worker when there are many undelivered MessagePort messages still waiting to be dispatched into the Worker Context. This causes termination of JS execution and test should not try to dispatch the remaining messages. Test succeeds if it does not hang or crash (if worker thread is running in the separate process, that process could hang or crash).</p>
</body>
// META: global=!default, worker
test(() => {
assert_equals(typeof navigator, "object");
assert_true(navigator instanceof WorkerNavigator);
assert_equals(navigator.appName, "Netscape");
assert_true(navigator.appVersion.indexOf('WebKit') != 0);
assert_equals(typeof navigator.platform, "string");
assert_true(navigator.userAgent.indexOf('WebKit') != 0);
assert_equals(typeof navigator.onLine, "boolean");
assert_equals(navigator.appCodeName, 'Mozilla');
assert_equals(navigator.product, 'Gecko');
}, "Testing Navigator properties on workers.");
function generateError()
{
// Generate an exception by accessing an undefined variable.
foo.bar = 0;
}
onconnect = function(event) {
event.ports[0].onmessage = function(evt) { handleMessage(evt, event.ports[0]); };
};
function handleMessage(event, port) {
self.port = port;
if (event.data == "ping")
port.postMessage("PASS: Received ping message");
else if (event.data == "close")
close();
else if (event.data == "done")
port.postMessage("DONE");
else if (event.data == "throw")
generateError();
else if (event.data == "testingNameAttribute")
port.postMessage(self.name);
else if (/eval.+/.test(event.data)) {
try {
port.postMessage(event.data.substr(5) + ": " + eval(event.data.substr(5)));
} catch (ex) {
port.postMessage(event.data.substr(5) + ": " + ex);
}
}
else
port.postMessage("FAILURE: Received unknown message: " + event.data);
}
// Make a SharedWorker that has the same external interface as a DedicatedWorker, to use in shared test code.
function createWorker()
{
var worker = new SharedWorker('support/SharedWorker-common.js', 'name');
worker.port.onmessage = function(evt) { worker.onmessage(evt); };
worker.postMessage = function(msg, port) { worker.port.postMessage(msg, port); };
return worker;
}
onconnect = function(event) {
event.ports[0].onmessage = function(evt) { handleMessage(evt, event.ports[0]); };
};
function handleMessage(event, port) {
if (event.data == "unhandledError") {
// Generate an unhandled error.
onerror = null;
setTimeout(function() {
port.postMessage("SUCCESS: unhandled error generated");
}, 100);
generateError(); // Undefined function call
} else if (event.data == "handledError") {
onerror = function() {
port.postMessage("SUCCESS: error handled via onerror");
return true;
};
generateError(); // Undefined function call
} else {
port.postMessage("FAIL: Got unexpected message: " + event.data);
}
};
onmessage = function(evt)
{
if (evt.data == "ping")
postMessage("pong");
else if (evt.data == "freeze")
while (1) {}
else if (evt.data == "close")
close();
else if (/eval.+/.test(evt.data)) {
try {
postMessage(evt.data.substr(5) + ": " + eval(evt.data.substr(5)));
} catch (ex) {
postMessage(evt.data.substr(5) + ": " + ex);
}
}
}
function createWorker()
{
return new Worker('support/Worker-common.js');
}
function echo(evt)
{
evt.target.postMessage(evt.data);
}
onmessage = function(evt)
{
evt.ports[0].onmessage = echo;
evt.ports[0].start();
}
self.onerror = function(evt) {
postMessage('error');
return true;
}
self.onmessage = function(evt) {
if (evt.data === "first")
throw Error();
else
postMessage(evt.data);
}
This tests that setting the proto of a built in constructor is not reset
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
proto = new Number(42): 42
Object.getPrototypeOf(WorkerLocation): function () { [native code] }
WorkerLocation.__proto__ = proto: 42
Object.getPrototypeOf(WorkerLocation): 42
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE html>
<script src="../../resources/js-test.js"></script>
<script src="resources/worker-create-common.js"></script>
<script>
var jsTestIsAsync = true;
description('This tests that setting the proto of a built in constructor is not reset');
var worker = createWorker();
worker.postMessage("eval proto = new Number(42)");
worker.postMessage("eval Object.getPrototypeOf(WorkerLocation)");
worker.postMessage("eval WorkerLocation.__proto__ = proto");
worker.postMessage("eval Object.getPrototypeOf(WorkerLocation)");
worker.postMessage("eval DONE");
worker.onmessage = function(evt) {
if (!/DONE/.test(evt.data))
debug(evt.data.replace(new RegExp("/.*(LayoutTests|web_tests)"), "<...>"));
else
finishJSTest();
};
</script>
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
description("This test checks whether exceptions in SharedWorkers are logged to the parent document. An exception should be logged to the error console.");
var worker = createWorker();
worker.postMessage("throw");
worker.postMessage("ping");
// Wait for response from ping - that's how we know we have thrown the exception.
worker.onmessage = function(event)
{
debug(event.data);
// Give the console message a chance to be written out before ending the test (timers are processed after the task queue is empty).
setTimeout(done, 0);
};
function done()
{
debug('<br /><span class="pass">TEST COMPLETE</span>');
if (window.testRunner)
testRunner.notifyDone();
}
Test SharedWorker constructor functionality. Should print a series of PASS messages, followed with DONE.
PASS: toString exception propagated correctly.
PASS: trying to create workers recursively resulted in an exception (RangeError: Maximum call stack size exceeded)
PASS: invoking SharedWorker constructor without arguments resulted in an exception (TypeError: Failed to construct 'SharedWorker': 1 argument required, but only 0 present.)
PASS: invoking SharedWorker constructor without name did not result in an exception
PASS: invoking SharedWorker constructor with null name did not result in an exception
PASS: invoking SharedWorker constructor with undefined name did not result in an exception
PASS: SharedWorker constructor succeeded: [object SharedWorker]
DONE
<body>
<p>Test SharedWorker constructor functionality. Should print a series of PASS messages, followed with DONE.</p>
<div id=result></div>
<script>
function log(message)
{
document.getElementById("result").innerHTML += message + "<br>";
}
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
try {
new SharedWorker({toString:function(){throw "exception"}}, "name")
log("FAIL: toString exception not propagated.");
} catch (ex) {
if (ex == "exception")
log("PASS: toString exception propagated correctly.");
else
log("FAIL: unexpected exception (" + ex + ") received instead of one propagated from toString.");
}
try {
var foo = {toString:function(){new Worker(foo)}}
new SharedWorker(foo, name);
log("FAIL: no exception when trying to create workers recursively");
} catch (ex) {
log("PASS: trying to create workers recursively resulted in an exception (" + ex + ")");
}
try {
new SharedWorker();
log("FAIL: invoking SharedWorker constructor without arguments did not result in an exception");
} catch (ex) {
log("PASS: invoking SharedWorker constructor without arguments resulted in an exception (" + ex + ")");
}
try {
var worker = new SharedWorker("resources/shared-worker-common.js");
log("PASS: invoking SharedWorker constructor without name did not result in an exception");
} catch (ex) {
log("FAIL: Constructor failed when no name is passed: (" + ex + ")");
}
try {
new SharedWorker("resources/shared-worker-common.js", null);
log("PASS: invoking SharedWorker constructor with null name did not result in an exception");
} catch (ex) {
log("FAIL: invoking SharedWorker constructor with null name resulted in an exception (" + ex + ")");
}
try {
new SharedWorker("resources/shared-worker-common.js", undefined);
log("PASS: invoking SharedWorker constructor with undefined name did not result in an exception");
} catch (ex) {
log("FAIL: invoking SharedWorker constructor with undefined name resulted in an exception (" + ex + ")");
}
try {
var worker = new SharedWorker("resources/shared-worker-common.js", "name");
log ("PASS: SharedWorker constructor succeeded: " + worker);
} catch (ex) {
log("FAIL: invoking SharedWorker constructor resulted in an exception (" + ex + ")");
}
log("DONE");
if (window.testRunner)
testRunner.notifyDone();
</script>
</body>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<script src="resources/shared-worker-create-common.js"></script>
<script src="resources/shared-worker-exception.js"></script>
</body>
Test WorkerLocation properties.
WorkerLocation: function WorkerLocation() { [native code] }
typeof location: object
location: file:<...>/fast/workers/resources/shared-worker-common.js
location.href: file:<...>/fast/workers/resources/shared-worker-common.js
location.origin: file://
location.protocol: file:
location.host:
location.hostname:
location.port:
location.pathname: <...>/fast/workers/resources/shared-worker-common.js
location.search:
location.hash:
DONE
<body>
<p>Test WorkerLocation properties.</p>
<div id=result></div>
<script src="../../resources/gc.js"></script>
<script src="resources/shared-worker-create-common.js"></script>
<script src="resources/worker-location.js">
</script>
</body>
</html>
Make sure that MessageEvent.source is properly set in connect event.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Starting worker: resources/messageevent-source.js
PASS [Worker] event.__proto__ is MessageEvent.prototype
PASS [Worker] event.source is event.ports[0]
PASS successfullyParsed is true
TEST COMPLETE
<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<script>
description("Make sure that MessageEvent.source is properly set in connect event.");
startWorker("resources/messageevent-source.js", "shared");
</script>
</body>
</html>
Test Navigator properties.
typeof navigator: object
navigator: [object WorkerNavigator]
navigator.appName: Netscape
navigator.appVersion.indexOf('WebKit') != 0: true
typeof navigator.platform: string
navigator.userAgent.indexOf('WebKit') != 0: true
typeof navigator.onLine: boolean
navigator.appCodeName === 'Mozilla': true
navigator.product === 'Gecko': true
DONE
<body>
<p>Test Navigator properties.</p>
<div id=result></div>
<script src="resources/shared-worker-create-common.js"></script>
<script src="resources/worker-navigator.js"></script>
</body>
Tests that repeatedly setting 'onerror' within a shared worker doesn't crash.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Starting worker: resources/shared-worker-replace-event-handler.js
[Worker] 'onerror' repeatedly updated ok.
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE html>
<script src="../../resources/js-test.js"></script>
<script>
// http://crbug.com/239669
description("Tests that repeatedly setting 'onerror' within a shared worker doesn't crash.");
startWorker("resources/shared-worker-replace-event-handler.js", "shared");
</script>
Test replacing global constructors in a worker context.
self.MessageEvent = 'PASS'; MessageEvent;: PASS
DONE
<body>
<p>Test replacing global constructors in a worker context.</p>
<div id=result></div>
<script src="resources/shared-worker-create-common.js"></script>
<script src="resources/worker-replace-global-constructor.js">
</script>
</body>
Test that self is not replaceable.
self='PASS': PASS
self: [object SharedWorkerGlobalScope]
DONE
<body>
<p>Test that self is not replaceable.</p>
<div id=result></div>
<script src="resources/shared-worker-create-common.js"></script>
<script src="resources/worker-replace-self.js"></script>
</body>
Test SharedWorker script error handling functionality. Should print a series of PASS messages, followed with DONE.
SUCCESS: unhandled error generated
SUCCESS: error handled via onerror: Uncaught ReferenceError: generateError is not defined
DONE
<body>
<p>Test SharedWorker script error handling functionality. Should print a series of PASS messages, followed with DONE.</p>
<div id=result></div>
<script>
function log(message)
{
document.getElementById("result").innerHTML += message + "<br>";
}
var testCases = [
"testScriptErrorUnhandled",
"testScriptErrorHandled"
];
var testIndex = 0;
function runNextTest()
{
if (testIndex < testCases.length) {
testIndex++;
try {
window[testCases[testIndex - 1]]();
} catch (ex) {
log("FAIL: unexpected exception " + ex);
runNextTest();
}
} else {
log("DONE");
// Wait briefly to make sure that any pending console messages get written out so they don't spill over into subsequent tests and cause failures.
setTimeout(function() {
if (window.testRunner)
testRunner.notifyDone();
}, 10);
}
}
function testScriptErrorUnhandled()
{
var worker = new SharedWorker("resources/shared-worker-script-error.js", "name");
// SharedWorkers should only invoke onerror for loading errors.
worker.onerror = function(evt) {
log("FAIL: onerror invoked for a script error");
};
worker.port.postMessage("unhandledError");
worker.port.onmessage = function(evt) {
log(evt.data);
runNextTest();
}
}
function testScriptErrorHandled()
{
var worker = new SharedWorker("resources/shared-worker-script-error.js", "name2");
// SharedWorkers should only invoke onerror for loading errors.
worker.onerror = function(evt) {
log("FAIL: onerror invoked for a script error");
};
worker.port.postMessage("handledError");
worker.port.onmessage = function(evt) {
log(evt.data);
runNextTest();
}
}
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
runNextTest();
</script>
</body>
Test simple shared worker construction case.
PASS: Received ping message
DONE
<body>
<p>Test simple shared worker construction case.</p>
<div id=result></div>
<script>
function log(message)
{
document.getElementById("result").innerHTML += message + "<br>";
}
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
var worker = new SharedWorker('resources/shared-worker-common.js', 'name');
worker.port.postMessage("ping");
worker.port.postMessage("done");
worker.port.onmessage = function(event) {
log(event.data);
if (event.data == "DONE")
done();
};
function done()
{
if (window.testRunner)
testRunner.notifyDone();
}
</script>
</body>
PASS all worker errors were reported.
PASS successfullyParsed is true
TEST COMPLETE
<!doctype html>
<script src="../../resources/js-test.js"></script>
<script>
window.jsTestIsAsync = true;
var workers = 4;
var errorsInWorker = 0;
var promises = [];
for (i = 0; i < workers; ++i) {
var worker = new Worker('resources/throw-on-message-worker.js');
promises.push(new Promise(function(resolve, reject) {
worker.onmessage = function(event) {
if (event.data === 'second')
resolve();
else if (event.data === 'error')
++errorsInWorker;
}
}));
worker.postMessage('first');
worker.postMessage('second');
}
Promise.all(promises).then(function() {
if (errorsInWorker === workers)
testPassed('all worker errors were reported.');
else
testFailed('only ' + errorsInWorker + ' errors reported in ' + workers + ' workers');
finishJSTest();
});
</script>
This test terminates a worker when there are many undelivered MessagePort messages still waiting to be dispatched into the Worker Context. This causes termination of JS execution and test should not try to dispatch the remaining messages. Test succeeds if it does not hang or crash (if worker thread is running in the separate process, that process could hang or crash).
[Worker] Tests that atob() / btoa() functions are exposed to workers
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Starting worker: resources/worker-base64.js
PASS [Worker] typeof atob === 'function' is true
PASS [Worker] typeof btoa === 'function' is true
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test.js"></script>
<link rel="help" href="http://www.w3.org/TR/workers/#apis-available-to-workers">
</head>
<body>
<script>
worker = startWorker("resources/worker-base64.js");
</script>
</body>
</html>
Test calling functions from WorkerContext. Should print multiple SUCCESS lines, followed by DONE.
SUCCESS: postMessage() called directly
SUCCESS: postMessage() invoked via postMessage.call()
SUCCESS: postMessage() called via intermediate variable
DONE
<body>
<p>Test calling functions from WorkerContext. Should print multiple SUCCESS lines, followed by DONE.</p>
<div id=result></div>
<script>
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
function log(message)
{
document.getElementById("result").innerHTML += message + "<br>";
}
var worker = new Worker("resources/worker-call.js");
worker.onmessage = function(event) {
log(event.data);
if (event.data == "DONE") {
if (window.testRunner)
testRunner.notifyDone();
}
};
</script>
</body>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment