diff options
author | Colin Ihrig <cjihrig@gmail.com> | 2022-06-17 11:05:02 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-17 11:05:02 -0400 |
commit | 367e006e06b0275ac1ac06669ce19f6192735c34 (patch) | |
tree | 4edd702b991d654d4ecf6c1d639b4086f47aafb3 /ext/web/02_event.js | |
parent | 870d2007163f687b1014db4e5cb43f95aff6d77f (diff) |
fix(ext/web): add EventTarget brand checking (#14637)
This commit adds brand checking to EventTarget. It also fixes a
bug where deno would crash if an abort signal was aborted on the
global addEventListener().
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; |