diff options
Diffstat (limited to 'runtime/js/01_web_util.js')
-rw-r--r-- | runtime/js/01_web_util.js | 33 |
1 files changed, 30 insertions, 3 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); |