diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/js/01_web_util.js | 33 | ||||
-rw-r--r-- | runtime/js/99_main.js | 36 |
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, |