tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mdevtools/shared/event-emitter.js | 38+++++++-------------------------------
Mdevtools/shared/tests/xpcshell/test_eventemitter_static.js | 95-------------------------------------------------------------------------------
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);