summaryrefslogtreecommitdiff
path: root/runtime/js/01_web_util.js
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/js/01_web_util.js')
-rw-r--r--runtime/js/01_web_util.js33
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);