Skip to content

Commit d78948c

Browse files
authored
Unsubscribe React DevTools events (#129)
* Add reload-to-profile for Fusebox * Unsubscribe events in React DevTools models
1 parent 7769586 commit d78948c

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

front_end/models/react_native/ReactDevToolsBindingsModel.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ export class ReactDevToolsBindingsModel extends SDK.SDKModel.SDKModel {
4040
private fuseboxDispatcherIsInitialized = false;
4141
private readonly domainToMessageQueue: Map<DomainName, Array<JSONValue>> = new Map();
4242

43+
override dispose(): void {
44+
this.domainToListeners.clear();
45+
this.domainToMessageQueue.clear();
46+
47+
const runtimeModel = this.target().model(SDK.RuntimeModel.RuntimeModel);
48+
runtimeModel?.removeEventListener(SDK.RuntimeModel.Events.BindingCalled, this.bindingCalled, this);
49+
runtimeModel?.removeEventListener(
50+
SDK.RuntimeModel.Events.ExecutionContextCreated, this.onExecutionContextCreated, this);
51+
runtimeModel?.removeEventListener(
52+
SDK.RuntimeModel.Events.ExecutionContextDestroyed, this.onExecutionContextDestroyed, this);
53+
}
54+
4355
private bindingCalled(event: BindingCalledEventTargetEvent): void {
4456
// If binding name is not initialized, then we failed to get its name
4557
if (this.messagingBindingName === null || event.data.name !== this.messagingBindingName) {

front_end/panels/react_devtools/ReactDevToolsModel.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,34 @@ export class ReactDevToolsModel extends SDK.SDKModel.SDKModel<EventTypes> {
7777
);
7878

7979
// Notify backend if Chrome DevTools was closed, marking frontend as disconnected
80-
window.addEventListener('beforeunload', () => this.#bridge?.shutdown());
80+
window.addEventListener('beforeunload', this.#handleBeforeUnload);
81+
}
82+
83+
override dispose(): void {
84+
this.#bridge?.removeListener('reloadAppForProfiling', this.#handleReloadAppForProfiling);
85+
this.#bridge?.shutdown();
86+
87+
this.#bindingsModel.removeEventListener(
88+
ReactNativeModels.ReactDevToolsBindingsModel.Events.BackendExecutionContextCreated,
89+
this.#handleBackendExecutionContextCreated,
90+
this,
91+
);
92+
this.#bindingsModel.removeEventListener(
93+
ReactNativeModels.ReactDevToolsBindingsModel.Events.BackendExecutionContextUnavailable,
94+
this.#handleBackendExecutionContextUnavailable,
95+
this,
96+
);
97+
this.#bindingsModel.removeEventListener(
98+
ReactNativeModels.ReactDevToolsBindingsModel.Events.BackendExecutionContextDestroyed,
99+
this.#handleBackendExecutionContextDestroyed,
100+
this,
101+
);
102+
103+
window.removeEventListener('beforeunload', this.#handleBeforeUnload);
104+
105+
this.#bridge = null;
106+
this.#store = null;
107+
this.#listeners.clear();
81108
}
82109

83110
override dispose(): void {
@@ -151,6 +178,10 @@ export class ReactDevToolsModel extends SDK.SDKModel.SDKModel<EventTypes> {
151178
return rdtBindingsModel.sendMessage(ReactDevToolsModel.FUSEBOX_BINDING_NAMESPACE, message);
152179
}
153180

181+
#handleBeforeUnload = (): void => {
182+
this.#bridge?.shutdown();
183+
};
184+
154185
#handleBackendExecutionContextCreated(): void {
155186
const rdtBindingsModel = this.#bindingsModel;
156187
if (!rdtBindingsModel) {

0 commit comments

Comments
 (0)