commit abc121c612097d9da3262e9a85f8ace130555b9a
parent dd60d823ff4db73595d41392df8804b41788ccee
Author: Nicolas Chevobbe <nchevobbe@mozilla.com>
Date: Thu, 2 Oct 2025 13:50:53 +0000
Bug 1992060 - [devtools] Remove EventEmitter listener as object. r=devtools-reviewers,ochameau.
This wasn't used anywhere except in the test checking the feature.
Differential Revision: https://phabricator.services.mozilla.com/D267168
Diffstat:
2 files changed, 7 insertions(+), 126 deletions(-)
diff --git a/devtools/shared/event-emitter.js b/devtools/shared/event-emitter.js
@@ -4,13 +4,10 @@
"use strict";
-const BAD_LISTENER =
- "The event listener must be a function, or an object that has " +
- "`EventEmitter.handler` Symbol.";
+const BAD_LISTENER = "The event listener must be a function.";
const eventListeners = Symbol("EventEmitter/listeners");
const onceOriginalListener = Symbol("EventEmitter/once-original-listener");
-const handler = Symbol("EventEmitter/event-handler");
loader.lazyRequireGetter(this, "flags", "resource://devtools/shared/flags.js");
class EventEmitter {
@@ -22,7 +19,7 @@ class EventEmitter {
* Event target object.
* @param {String} type
* The type of event.
- * @param {Function|Object} listener
+ * @param {Function} listener
* The listener that processes the event.
* @param {Object} options
* @param {AbortSignal} options.signal
@@ -31,7 +28,7 @@ class EventEmitter {
* A function that removes the listener when called.
*/
static on(target, type, listener, { signal } = {}) {
- if (typeof listener !== "function" && !isEventHandler(listener)) {
+ if (typeof listener !== "function") {
throw new Error(BAD_LISTENER);
}
@@ -71,7 +68,7 @@ class EventEmitter {
* The event target object.
* @param {String} [type]
* The type of event.
- * @param {Function|Object} [listener]
+ * @param {Function} [listener]
* The listener that processes the event.
*/
static off(target, type, listener) {
@@ -140,7 +137,7 @@ class EventEmitter {
* Event target object.
* @param {String} type
* The type of the event.
- * @param {Function|Object} [listener]
+ * @param {Function} [listener]
* The listener that processes the event.
* @param {Object} options
* @param {AbortSignal} options.signal
@@ -158,16 +155,7 @@ class EventEmitter {
let rv;
if (listener) {
- if (isEventHandler(listener)) {
- // if the `listener` given is actually an object that handles the events
- // using `EventEmitter.handler`, we want to call that function, passing also
- // the event's type as first argument, and the `listener` (the object) as
- // contextual object.
- rv = listener[handler](type, first, ...rest);
- } else {
- // Otherwise we'll just call it
- rv = listener.call(target, first, ...rest);
- }
+ rv = listener.call(target, first, ...rest);
}
// We resolve the promise once the listener is called.
@@ -235,12 +223,7 @@ class EventEmitter {
// event handler we're going to fire wasn't removed.
if (listeners && listeners.has(listener)) {
try {
- let promise;
- if (isEventHandler(listener)) {
- promise = listener[handler](type, ...args);
- } else {
- promise = listener.apply(target, args);
- }
+ const promise = listener.apply(target, args);
if (async) {
// Assert the name instead of `constructor != Promise` in order
// to avoid cross compartment issues where Promise can be multiple.
@@ -306,10 +289,6 @@ class EventEmitter {
return Object.defineProperties(target, descriptors);
}
- static get handler() {
- return handler;
- }
-
on(...args) {
return EventEmitter.on(this, ...args);
}
@@ -347,9 +326,6 @@ class EventEmitter {
module.exports = EventEmitter;
-const isEventHandler = listener =>
- listener && handler in listener && typeof listener[handler] === "function";
-
const {
getNthPathExcluding,
} = require("resource://devtools/shared/platform/stack.js");
diff --git a/devtools/shared/tests/xpcshell/test_eventemitter_static.js b/devtools/shared/tests/xpcshell/test_eventemitter_static.js
@@ -12,7 +12,6 @@ const {
off,
emit,
count,
- handler,
} = require("resource://devtools/shared/event-emitter.js");
const pass = message => ok(true, message);
@@ -255,100 +254,6 @@ const TESTS = {
emit(target, "done", "");
},
- testAddListenerWithHandlerMethod() {
- const target = { name: "target" };
- const actual = [];
- const listener = function (...args) {
- equal(
- this,
- target,
- "the contextual object is correct for function listener"
- );
- deepEqual(args, [10, 20, 30], "arguments are properly passed");
- };
-
- const object = {
- name: "target",
- [handler](type, ...rest) {
- actual.push(type);
- equal(
- this,
- object,
- "the contextual object is correct for object listener"
- );
- deepEqual(rest, [10, 20, 30], "arguments are properly passed");
- },
- };
-
- on(target, "foo", listener);
- on(target, "bar", object);
- on(target, "baz", object);
-
- emit(target, "foo", 10, 20, 30);
- emit(target, "bar", 10, 20, 30);
- emit(target, "baz", 10, 20, 30);
-
- deepEqual(
- actual,
- ["bar", "baz"],
- "object's listener called in the expected order"
- );
- },
-
- testRemoveListenerWithHandlerMethod() {
- const target = {};
- const actual = [];
-
- const object = {
- [handler]() {
- actual.push(1);
- on(target, "message", () => {
- off(target, "message", object);
- actual.push(2);
- });
- },
- };
-
- on(target, "message", object);
-
- emit(target, "message");
- deepEqual([1], actual, "first listener called");
-
- emit(target, "message");
- deepEqual([1, 1, 2], actual, "second listener called");
-
- emit(target, "message");
- deepEqual([1, 1, 2, 2, 2], actual, "first listener removed");
- },
-
- async testOnceListenerWithHandlerMethod() {
- const target = { name: "target" };
- const called = false;
-
- const object = {
- [handler](type, value) {
- ok(!called, "listener called only once");
- equal(type, "foo", "event type is properly passed");
- equal(value, "bar", "correct argument was passed");
- equal(
- this,
- object,
- "the contextual object is correct for object listener"
- );
- },
- };
-
- const pFoo = once(target, "foo", object);
-
- const pDone = once(target, "done");
-
- emit(target, "foo", "bar");
- emit(target, "foo", "baz");
- emit(target, "done", "");
-
- await Promise.all([pFoo, pDone]);
- },
-
testCallingOffWithMoreThan3Args() {
const target = { name: "target" };
on(target, "data", fail);