summaryrefslogtreecommitdiff
path: root/ext/web/02_event.js
diff options
context:
space:
mode:
authorColin Ihrig <cjihrig@gmail.com>2022-06-17 11:05:02 -0400
committerGitHub <noreply@github.com>2022-06-17 11:05:02 -0400
commit367e006e06b0275ac1ac06669ce19f6192735c34 (patch)
tree4edd702b991d654d4ecf6c1d639b4086f47aafb3 /ext/web/02_event.js
parent870d2007163f687b1014db4e5cb43f95aff6d77f (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.js20
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;