summaryrefslogtreecommitdiff
path: root/runtime/js
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/js')
-rw-r--r--runtime/js/01_web_util.js33
-rw-r--r--runtime/js/99_main.js36
2 files changed, 37 insertions, 32 deletions
diff --git a/runtime/js/01_web_util.js b/runtime/js/01_web_util.js
index 4a9825fa1..9b51021f9 100644
--- a/runtime/js/01_web_util.js
+++ b/runtime/js/01_web_util.js
@@ -27,17 +27,41 @@
}
const handlerSymbol = Symbol("eventHandlers");
- function makeWrappedHandler(handler) {
+ function makeWrappedHandler(handler, isSpecialErrorEventHandler) {
function wrappedHandler(...args) {
if (typeof wrappedHandler.handler !== "function") {
return;
}
+ if (isSpecialErrorEventHandler) {
+ const evt = args[0];
+ if (evt instanceof ErrorEvent && evt.type === "error") {
+ const ret = FunctionPrototypeCall(
+ wrappedHandler.handler,
+ this,
+ evt.message,
+ evt.filename,
+ evt.lineno,
+ evt.colno,
+ evt.error,
+ );
+ if (ret === true) {
+ evt.preventDefault();
+ }
+ return;
+ }
+ }
+
return FunctionPrototypeCall(wrappedHandler.handler, this, ...args);
}
wrappedHandler.handler = handler;
return wrappedHandler;
}
- function defineEventHandler(emitter, name, defaultValue = undefined) {
+ function defineEventHandler(
+ emitter,
+ name,
+ defaultValue = undefined,
+ isSpecialErrorEventHandler = false,
+ ) {
// HTML specification section 8.1.5.1
ObjectDefineProperty(emitter, `on${name}`, {
get() {
@@ -56,7 +80,10 @@
if (handlerWrapper) {
handlerWrapper.handler = value;
} else {
- handlerWrapper = makeWrappedHandler(value);
+ handlerWrapper = makeWrappedHandler(
+ value,
+ isSpecialErrorEventHandler,
+ );
this.addEventListener(name, handlerWrapper);
}
MapPrototypeSet(this[handlerSymbol], name, handlerWrapper);
diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js
index b473acdef..71480e5a0 100644
--- a/runtime/js/99_main.js
+++ b/runtime/js/99_main.js
@@ -88,11 +88,6 @@ delete Object.prototype.__proto__;
core.opSync("op_worker_close");
}
- // TODO(bartlomieju): remove these functions
- // Stuff for workers
- const onmessage = () => {};
- const onerror = () => {};
-
function postMessage(message, transferOrOptions = {}) {
const prefix =
"Failed to execute 'postMessage' on 'DedicatedWorkerGlobalScope'";
@@ -144,39 +139,19 @@ delete Object.prototype.__proto__;
});
try {
- if (globalThis.onmessage) {
- await globalThis.onmessage(msgEvent);
- }
globalDispatchEvent(msgEvent);
} catch (e) {
- let handled = false;
-
const errorEvent = new ErrorEvent("error", {
cancelable: true,
message: e.message,
lineno: e.lineNumber ? e.lineNumber + 1 : undefined,
colno: e.columnNumber ? e.columnNumber + 1 : undefined,
filename: e.fileName,
- error: null,
+ error: e,
});
- if (globalThis["onerror"]) {
- const ret = globalThis.onerror(
- e.message,
- e.fileName,
- e.lineNumber,
- e.columnNumber,
- e,
- );
- handled = ret === true;
- }
-
globalDispatchEvent(errorEvent);
- if (errorEvent.defaultPrevented) {
- handled = true;
- }
-
- if (!handled) {
+ if (!errorEvent.defaultPrevented) {
core.opSync(
"op_worker_unhandled_error",
e.message,
@@ -465,8 +440,8 @@ delete Object.prototype.__proto__;
get: () => workerNavigator,
},
self: util.readOnly(globalThis),
- onmessage: util.writable(onmessage),
- onerror: util.writable(onerror),
+ onmessage: util.writable(null),
+ onerror: util.writable(null),
// TODO(bartlomieju): should be readonly?
close: util.nonEnumerable(workerClose),
postMessage: util.writable(postMessage),
@@ -585,6 +560,9 @@ delete Object.prototype.__proto__;
eventTarget.setEventTargetData(globalThis);
+ defineEventHandler(self, "message", null);
+ defineEventHandler(self, "error", null, true);
+
runtimeStart(
runtimeOptions,
internalName ?? name,