commit da3530396238bed78b46aaf9a1951f17144c2b5b
parent 4948cc8c8100d9657a1d3388c04bb8f336cb0017
Author: Nicolas Chevobbe <nchevobbe@mozilla.com>
Date: Tue, 7 Oct 2025 05:35:36 +0000
Bug 1599082 - [devtools] Remove external usage of static EventEmitter methods. r=devtools-reviewers,jdescottes.
Replace those with inheritance/decorations, extends classes that needed it.
Next patch in stack will remove the static methods alltogether.
Differential Revision: https://phabricator.services.mozilla.com/D267589
Diffstat:
14 files changed, 39 insertions(+), 84 deletions(-)
diff --git a/devtools/client/fronts/accessibility.js b/devtools/client/fronts/accessibility.js
@@ -15,7 +15,6 @@ const {
parentAccessibilitySpec,
simulatorSpec,
} = require("resource://devtools/shared/specs/accessibility.js");
-const events = require("resource://devtools/shared/event-emitter.js");
class AccessibleFront extends FrontClassWithSpec(accessibleSpec) {
constructor(client, targetFront, parentFront) {
@@ -102,7 +101,7 @@ class AccessibleFront extends FrontClassWithSpec(accessibleSpec) {
// accessibility walker as the point of interaction for UI.
const accessibilityWalkerFront = this.getParent();
if (accessibilityWalkerFront) {
- events.emit(accessibilityWalkerFront, "name-change", this, parent);
+ accessibilityWalkerFront.emit("name-change", this, parent);
}
}
@@ -124,7 +123,7 @@ class AccessibleFront extends FrontClassWithSpec(accessibleSpec) {
// accessibility walker as the point of interaction for UI.
const accessibilityWalkerFront = this.getParent();
if (accessibilityWalkerFront) {
- events.emit(accessibilityWalkerFront, "reorder", this);
+ accessibilityWalkerFront.emit("reorder", this);
}
}
@@ -133,7 +132,7 @@ class AccessibleFront extends FrontClassWithSpec(accessibleSpec) {
// accessibility walker as the point of interaction for UI.
const accessibilityWalkerFront = this.getParent();
if (accessibilityWalkerFront) {
- events.emit(accessibilityWalkerFront, "text-change", this);
+ accessibilityWalkerFront.emit("text-change", this);
}
}
diff --git a/devtools/docs/contributor/backend/protocol.js.md b/devtools/docs/contributor/backend/protocol.js.md
@@ -464,11 +464,9 @@ Here's how you'd set it up in a spec:
Here's how the implementation would look:
- const EventEmitter = require("devtools/shared/event-emitter");
-
// In your Actor class:
giveGoodNews(news) {
- EventEmitter.emit(this, "good-news", news);
+ this.emit("good-news", news);
}
Now you can listen to events on a front:
diff --git a/devtools/server/actors/accessibility/accessible.js b/devtools/server/actors/accessibility/accessible.js
@@ -45,11 +45,6 @@ loader.lazyRequireGetter(
);
loader.lazyRequireGetter(
this,
- "events",
- "resource://devtools/shared/event-emitter.js"
-);
-loader.lazyRequireGetter(
- this,
"getBounds",
"resource://devtools/server/actors/highlighters/utils/accessibility.js",
true
@@ -627,7 +622,7 @@ class AccessibleActor extends Actor {
}, {});
this._lastAudit = this._lastAudit || {};
Object.assign(this._lastAudit, audit);
- events.emit(this, "audited", audit);
+ this.emit("audited", audit);
return audit;
})
diff --git a/devtools/server/actors/accessibility/walker.js b/devtools/server/actors/accessibility/walker.js
@@ -639,7 +639,7 @@ class AccessibleWalkerActor extends Actor {
this.clearRefs();
// If it's a top level document notify listeners about the document
// being ready.
- events.emit(this, "document-ready", rawAccessible);
+ this.emit("document-ready", rawAccessible);
}
}
@@ -658,15 +658,14 @@ class AccessibleWalkerActor extends Actor {
}
return;
}
- events.emit(accessible, "states-change", accessible.states);
+ accessible.emit("states-change", accessible.states);
}
break;
}
case EVENT_NAME_CHANGE:
if (accessible) {
- events.emit(
- accessible,
+ accessible.emit(
"name-change",
rawAccessible.name,
event.DOMNode == this.rootDoc
@@ -677,16 +676,12 @@ class AccessibleWalkerActor extends Actor {
break;
case EVENT_VALUE_CHANGE:
if (accessible) {
- events.emit(accessible, "value-change", rawAccessible.value);
+ accessible.emit("value-change", rawAccessible.value);
}
break;
case EVENT_DESCRIPTION_CHANGE:
if (accessible) {
- events.emit(
- accessible,
- "description-change",
- rawAccessible.description
- );
+ accessible.emit("description-change", rawAccessible.description);
}
break;
case EVENT_REORDER:
@@ -694,9 +689,9 @@ class AccessibleWalkerActor extends Actor {
accessible
.children()
.forEach(child =>
- events.emit(child, "index-in-parent-change", child.indexInParent)
+ child.emit("index-in-parent-change", child.indexInParent)
);
- events.emit(accessible, "reorder", rawAccessible.childCount);
+ accessible.emit("reorder", rawAccessible.childCount);
}
break;
case EVENT_HIDE:
@@ -709,17 +704,16 @@ class AccessibleWalkerActor extends Actor {
case EVENT_DEFACTION_CHANGE:
case EVENT_ACTION_CHANGE:
if (accessible) {
- events.emit(accessible, "actions-change", accessible.actions);
+ accessible.emit("actions-change", accessible.actions);
}
break;
case EVENT_TEXT_CHANGED:
case EVENT_TEXT_INSERTED:
case EVENT_TEXT_REMOVED:
if (accessible) {
- events.emit(accessible, "text-change");
+ accessible.emit("text-change");
if (NAME_FROM_SUBTREE_RULE_ROLES.has(rawAccessible.role)) {
- events.emit(
- accessible,
+ accessible.emit(
"name-change",
rawAccessible.name,
event.DOMNode == this.rootDoc
@@ -733,17 +727,13 @@ class AccessibleWalkerActor extends Actor {
case EVENT_OBJECT_ATTRIBUTE_CHANGED:
case EVENT_TEXT_ATTRIBUTE_CHANGED:
if (accessible) {
- events.emit(accessible, "attributes-change", accessible.attributes);
+ accessible.emit("attributes-change", accessible.attributes);
}
break;
// EVENT_ACCELERATOR_CHANGE is currently not fired by gecko accessibility.
case EVENT_ACCELERATOR_CHANGE:
if (accessible) {
- events.emit(
- accessible,
- "shortcut-change",
- accessible.keyboardShortcut
- );
+ accessible.emit("shortcut-change", accessible.keyboardShortcut);
}
break;
default:
@@ -961,7 +951,7 @@ class AccessibleWalkerActor extends Actor {
if (!this._currentAccessible) {
this._currentAccessible = this._findAndAttachAccessible(event);
}
- events.emit(this, "picker-accessible-previewed", this._currentAccessible);
+ this.emit("picker-accessible-previewed", this._currentAccessible);
return;
}
@@ -970,7 +960,7 @@ class AccessibleWalkerActor extends Actor {
if (!this._currentAccessible) {
this._currentAccessible = this._findAndAttachAccessible(event);
}
- events.emit(this, "picker-accessible-picked", this._currentAccessible);
+ this.emit("picker-accessible-picked", this._currentAccessible);
}
/**
@@ -1000,7 +990,7 @@ class AccessibleWalkerActor extends Actor {
// the most current accessible again.
const shown = await this.highlightAccessible(accessible);
if (this._isPicking && shown && accessible === this._currentAccessible) {
- events.emit(this, "picker-accessible-hovered", accessible);
+ this.emit("picker-accessible-hovered", accessible);
}
}
@@ -1033,7 +1023,7 @@ class AccessibleWalkerActor extends Actor {
// Cancel pick mode.
case event.DOM_VK_ESCAPE:
this.cancelPick();
- events.emit(this, "picker-accessible-canceled");
+ this.emit("picker-accessible-canceled");
break;
case event.DOM_VK_C:
if (
@@ -1041,7 +1031,7 @@ class AccessibleWalkerActor extends Actor {
(!IS_OSX && event.ctrlKey && event.shiftKey)
) {
this.cancelPick();
- events.emit(this, "picker-accessible-canceled");
+ this.emit("picker-accessible-canceled");
}
break;
default:
diff --git a/devtools/server/actors/highlighters/measuring-tool.js b/devtools/server/actors/highlighters/measuring-tool.js
@@ -4,7 +4,6 @@
"use strict";
-const EventEmitter = require("resource://devtools/shared/event-emitter.js");
const {
getCurrentZoom,
getWindowDimensions,
@@ -232,8 +231,6 @@ class MeasuringToolHighlighter {
}
this.markup.destroy();
-
- EventEmitter.emit(this, "destroy");
}
show() {
diff --git a/devtools/server/actors/highlighters/rulers.js b/devtools/server/actors/highlighters/rulers.js
@@ -4,7 +4,6 @@
"use strict";
-const EventEmitter = require("resource://devtools/shared/event-emitter.js");
const {
getCurrentZoom,
setIgnoreLayoutChanges,
@@ -277,8 +276,6 @@ class RulersHighlighter {
}
this.markup.destroy();
-
- EventEmitter.emit(this, "destroy");
}
show() {
diff --git a/devtools/server/actors/highlighters/viewport-size.js b/devtools/server/actors/highlighters/viewport-size.js
@@ -4,7 +4,6 @@
"use strict";
-const EventEmitter = require("resource://devtools/shared/event-emitter.js");
const {
setIgnoreLayoutChanges,
} = require("resource://devtools/shared/layout/utils.js");
@@ -139,8 +138,6 @@ class ViewportSizeHighlighter {
this.parent = null;
this.markup = null;
this.isReady = null;
-
- EventEmitter.emit(this, "destroy");
}
show() {
diff --git a/devtools/server/actors/webconsole.js b/devtools/server/actors/webconsole.js
@@ -154,8 +154,7 @@ class WebConsoleActor extends Actor {
this.onConsoleAPICall = this.onConsoleAPICall.bind(this);
this.onDocumentEvent = this.onDocumentEvent.bind(this);
- EventEmitter.on(
- this.targetActor,
+ this.targetActor.on(
"changed-toplevel-document",
this._onChangedToplevelDocument
);
@@ -278,7 +277,7 @@ class WebConsoleActor extends Actor {
this._evalGlobal = global;
if (!this._progressListenerActive) {
- EventEmitter.on(this.targetActor, "will-navigate", this._onWillNavigate);
+ this.targetActor.on("will-navigate", this._onWillNavigate);
this._progressListenerActive = true;
}
}
@@ -328,8 +327,7 @@ class WebConsoleActor extends Actor {
this.stopListeners();
super.destroy();
- EventEmitter.off(
- this.targetActor,
+ this.targetActor.off(
"changed-toplevel-document",
this._onChangedToplevelDocument
);
@@ -1654,7 +1652,7 @@ class WebConsoleActor extends Actor {
_onWillNavigate({ isTopLevel }) {
if (isTopLevel) {
this._evalGlobal = null;
- EventEmitter.off(this.targetActor, "will-navigate", this._onWillNavigate);
+ this.targetActor.off("will-navigate", this._onWillNavigate);
this._progressListenerActive = false;
}
}
diff --git a/devtools/server/connectors/content-process-connector.js b/devtools/server/connectors/content-process-connector.js
@@ -88,7 +88,7 @@ function connectToContentProcess(connection, mm, onDestroy) {
onMessageManagerClose,
"message-manager-close"
);
- EventEmitter.off(connection, "closed", onClose);
+ connection.off("closed", onClose);
if (childTransport) {
// If we have a child transport, the actor has already
// been created. We need to stop using this message manager.
@@ -116,7 +116,7 @@ function connectToContentProcess(connection, mm, onDestroy) {
});
Services.obs.addObserver(onMessageManagerClose, "message-manager-close");
- EventEmitter.on(connection, "closed", onClose);
+ connection.on("closed", onClose);
});
}
diff --git a/devtools/server/connectors/frame-connector.js b/devtools/server/connectors/frame-connector.js
@@ -88,7 +88,7 @@ function connectToFrame(connection, frame, onDestroy) {
});
const destroy = DevToolsUtils.makeInfallible(function () {
- EventEmitter.off(connection, "closed", destroy);
+ connection.off("closed", destroy);
Services.obs.removeObserver(
onMessageManagerClose,
"message-manager-close"
@@ -153,7 +153,7 @@ function connectToFrame(connection, frame, onDestroy) {
// Listen for connection close to cleanup things
// when user unplug the device or we lose the connection somehow.
- EventEmitter.on(connection, "closed", destroy);
+ connection.on("closed", destroy);
mm.sendAsyncMessage("debug:connect", {
prefix,
diff --git a/devtools/server/performance/memory.js b/devtools/server/performance/memory.js
@@ -66,12 +66,12 @@ function Memory(parent, frameCache = new StackFrameCache()) {
this._emitAllocations = this._emitAllocations.bind(this);
this._onWindowReady = this._onWindowReady.bind(this);
- EventEmitter.on(this.parent, "window-ready", this._onWindowReady);
+ this.parent.on("window-ready", this._onWindowReady);
}
Memory.prototype = {
destroy() {
- EventEmitter.off(this.parent, "window-ready", this._onWindowReady);
+ this.parent.off("window-ready", this._onWindowReady);
this._mgr = null;
if (this.state === "attached") {
diff --git a/devtools/server/tests/chrome/test_memory_gc_events.html b/devtools/server/tests/chrome/test_memory_gc_events.html
@@ -18,21 +18,15 @@ Bug 1137527 - Test receiving GC events from the memory actor.
window.onload = function() {
SimpleTest.waitForExplicitFinish();
- const EventEmitter = require("devtools/shared/event-emitter");
-
(async function() {
const { memory, target } = await startServerAndGetSelectedTabMemory();
await memory.attach();
- const gotGcEvent = new Promise(resolve => {
- EventEmitter.on(memory, "garbage-collection", gcData => {
- ok(gcData, "Got GC data");
- resolve();
- });
- });
+ const onGcEvent = memory.once("garbage-collection");
memory.forceGarbageCollection();
- await gotGcEvent;
+ const gcData = await onGcEvent;
+ ok(gcData, "Got GC data");
await memory.detach();
destroyServerAndFinish(target);
diff --git a/devtools/shared/protocol/tests/xpcshell/test_protocol_longstring.js b/devtools/shared/protocol/tests/xpcshell/test_protocol_longstring.js
@@ -9,7 +9,6 @@
*/
var protocol = require("resource://devtools/shared/protocol.js");
var { RetVal, Arg } = protocol;
-var EventEmitter = require("resource://devtools/shared/event-emitter.js");
var {
LongStringActor,
} = require("resource://devtools/server/actors/string.js");
@@ -79,19 +78,11 @@ class RootActor extends protocol.Actor {
}
emitShortString() {
- EventEmitter.emit(
- this,
- "string-event",
- new LongStringActor(this.conn, SHORT_STR)
- );
+ this.emit("string-event", new LongStringActor(this.conn, SHORT_STR));
}
emitLongString() {
- EventEmitter.emit(
- this,
- "string-event",
- new LongStringActor(this.conn, LONG_STR)
- );
+ this.emit("string-event", new LongStringActor(this.conn, LONG_STR));
}
}
diff --git a/devtools/shared/protocol/tests/xpcshell/test_protocol_simple.js b/devtools/shared/protocol/tests/xpcshell/test_protocol_simple.js
@@ -9,7 +9,6 @@
var protocol = require("resource://devtools/shared/protocol.js");
var { Arg, Option, RetVal } = protocol;
-var EventEmitter = require("resource://devtools/shared/event-emitter.js");
const rootSpec = protocol.generateActorSpec({
typeName: "root",
@@ -141,11 +140,11 @@ class RootActor extends protocol.Actor {
testOneWay(a) {
// Emit to show that we got this message, because there won't be a response.
- EventEmitter.emit(this, "oneway", a);
+ this.emit("oneway", a);
}
emitFalsyOptions() {
- EventEmitter.emit(this, "falsyOptions", { zero: 0, farce: false });
+ this.emit("falsyOptions", { zero: 0, farce: false });
}
}