summaryrefslogtreecommitdiff
path: root/cli/rt/01_web_util.js
diff options
context:
space:
mode:
Diffstat (limited to 'cli/rt/01_web_util.js')
-rw-r--r--cli/rt/01_web_util.js35
1 files changed, 35 insertions, 0 deletions
diff --git a/cli/rt/01_web_util.js b/cli/rt/01_web_util.js
index 4a3df65ce..c843ac086 100644
--- a/cli/rt/01_web_util.js
+++ b/cli/rt/01_web_util.js
@@ -113,9 +113,44 @@
}
}
+ const handlerSymbol = Symbol("eventHandlers");
+ function makeWrappedHandler(handler) {
+ function wrappedHandler(...args) {
+ if (typeof wrappedHandler.handler !== "function") {
+ return;
+ }
+ return wrappedHandler.handler.call(this, ...args);
+ }
+ wrappedHandler.handler = handler;
+ return wrappedHandler;
+ }
+ function defineEventHandler(emitter, name) {
+ // HTML specification section 8.1.5.1
+ Object.defineProperty(emitter, `on${name}`, {
+ get() {
+ return this[handlerSymbol]?.get(name)?.handler;
+ },
+ set(value) {
+ if (!this[handlerSymbol]) {
+ this[handlerSymbol] = new Map();
+ }
+ let handlerWrapper = this[handlerSymbol]?.get(name);
+ if (handlerWrapper) {
+ handlerWrapper.handler = value;
+ } else {
+ handlerWrapper = makeWrappedHandler(value);
+ this.addEventListener(name, handlerWrapper);
+ }
+ this[handlerSymbol].set(name, handlerWrapper);
+ },
+ configurable: true,
+ enumerable: true,
+ });
+ }
window.__bootstrap.webUtil = {
illegalConstructorKey,
requiredArguments,
+ defineEventHandler,
cloneValue,
};
})(this);