diff options
Diffstat (limited to 'ext/web/02_event.js')
-rw-r--r-- | ext/web/02_event.js | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/ext/web/02_event.js b/ext/web/02_event.js index 9d5169b9e..f5b4bd7d3 100644 --- a/ext/web/02_event.js +++ b/ext/web/02_event.js @@ -917,6 +917,7 @@ class EventTarget { constructor() { this[eventTargetData] = getDefaultTargetData(); + this[webidl.brand] = webidl.brand; } addEventListener( @@ -924,6 +925,8 @@ callback, options, ) { + const self = this ?? globalThis; + webidl.assertBranded(self, EventTargetPrototype); const prefix = "Failed to execute 'addEventListener' on 'EventTarget'"; webidl.requiredArguments(arguments.length, 2, { @@ -939,7 +942,7 @@ return; } - const { listeners } = (this ?? globalThis)[eventTargetData]; + const { listeners } = self[eventTargetData]; if (!(ReflectHas(listeners, type))) { listeners[type] = []; @@ -965,7 +968,7 @@ // If listener’s signal is not null, then add the following abort // abort steps to it: Remove an event listener. signal.addEventListener("abort", () => { - this.removeEventListener(type, callback, options); + self.removeEventListener(type, callback, options); }); } } @@ -978,11 +981,13 @@ callback, options, ) { + const self = this ?? globalThis; + webidl.assertBranded(self, EventTargetPrototype); webidl.requiredArguments(arguments.length, 2, { prefix: "Failed to execute 'removeEventListener' on 'EventTarget'", }); - const { listeners } = (this ?? globalThis)[eventTargetData]; + const { listeners } = self[eventTargetData]; if (callback !== null && ReflectHas(listeners, type)) { listeners[type] = ArrayPrototypeFilter( listeners[type], @@ -1010,14 +1015,15 @@ } dispatchEvent(event) { - webidl.requiredArguments(arguments.length, 1, { - prefix: "Failed to execute 'dispatchEvent' on 'EventTarget'", - }); // If `this` is not present, then fallback to global scope. We don't use // `globalThis` directly here, because it could be deleted by user. // Instead use saved reference to global scope when the script was // executed. const self = this ?? window; + webidl.assertBranded(self, EventTargetPrototype); + webidl.requiredArguments(arguments.length, 1, { + prefix: "Failed to execute 'dispatchEvent' on 'EventTarget'", + }); const { listeners } = self[eventTargetData]; if (!ReflectHas(listeners, event.type)) { @@ -1042,6 +1048,7 @@ } webidl.configurePrototype(EventTarget); + const EventTargetPrototype = EventTarget.prototype; defineEnumerableProps(EventTarget, [ "addEventListener", @@ -1411,6 +1418,7 @@ reportException(error); } + window[webidl.brand] = webidl.brand; window.Event = Event; window.EventTarget = EventTarget; window.ErrorEvent = ErrorEvent; |