Skip to content

Commit fb7003d

Browse files
committed
feat: add ReactDevToolsModel
1 parent 864bc72 commit fb7003d

File tree

6 files changed

+89
-3
lines changed

6 files changed

+89
-3
lines changed

config/gni/devtools_grd_files.gni

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,8 @@ grd_files_release_sources = [
439439
"front_end/models/persistence/persistence-legacy.js",
440440
"front_end/models/persistence/persistence-meta.js",
441441
"front_end/models/persistence/persistence.js",
442+
"front_end/models/react_native/ReactDevToolsBindingsModel.js",
443+
"front_end/models/react_native/react_native.js",
442444
"front_end/models/source_map_scopes/source_map_scopes.js",
443445
"front_end/models/text_utils/text_utils-legacy.js",
444446
"front_end/models/text_utils/text_utils.js",
@@ -1394,6 +1396,7 @@ grd_files_debug_sources = [
13941396
"front_end/panels/protocol_monitor/components/JSONEditor.css.js",
13951397
"front_end/panels/protocol_monitor/components/JSONEditor.js",
13961398
"front_end/panels/protocol_monitor/protocolMonitor.css.js",
1399+
"front_end/panels/react_devtools/ReactDevToolsModel.js",
13971400
"front_end/panels/react_devtools/reactDevToolsPlaceholder.css.js",
13981401
"front_end/panels/react_devtools/ReactDevToolsPlaceholder.js",
13991402
"front_end/panels/react_devtools/ReactDevToolsView.js",

front_end/models/react_native/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ devtools_entrypoint("bundle") {
2727

2828
visibility = [
2929
":*",
30+
"../../panels/react_devtools/*"
3031
]
3132

3233
visibility += devtools_models_visibility

front_end/models/react_native/ReactDevToolsBindingsModel.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ type BindingCalledEventTargetEvent = Common.EventTarget.EventTargetEvent<SDK.Run
1313

1414
const RUNTIME_GLOBAL = '__FUSEBOX_REACT_DEVTOOLS_DISPATCHER__';
1515

16+
export const enum Events {
17+
Initialized = 'Initialized',
18+
}
19+
20+
export type EventTypes = {
21+
[Events.Initialized]: void,
22+
};
23+
1624
export class ReactDevToolsBindingsModel extends SDK.SDKModel.SDKModel {
1725
private readonly domainToListeners: Map<DomainName, Set<DomainMessageListener>> = new Map();
1826

@@ -29,7 +37,11 @@ export class ReactDevToolsBindingsModel extends SDK.SDKModel.SDKModel {
2937
}
3038

3139
runtimeModel.addEventListener(SDK.RuntimeModel.Events.BindingCalled, this.bindingCalled, this);
32-
void this.enable(target);
40+
void this.enable(target).then(() => this.onInitialization());
41+
}
42+
43+
private onInitialization(): void {
44+
this.dispatchEventToListeners(Events.Initialized);
3345
}
3446

3547
private bindingCalled(event: BindingCalledEventTargetEvent): void {

front_end/panels/react_devtools/BUILD.gn

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ devtools_module("react_devtools_placeholder") {
2424
}
2525

2626
devtools_module("react_devtools") {
27-
sources = [ "ReactDevToolsView.ts" ]
27+
sources = [ "ReactDevToolsView.ts", "ReactDevToolsModel.ts" ]
2828

2929
deps = [
30+
"../../models/react_native:bundle",
3031
"../../ui/legacy:bundle",
3132
]
3233
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Copyright (c) Meta Platforms, Inc. and affiliates.
2+
// Copyright 2024 The Chromium Authors. All rights reserved.
3+
// Use of this source code is governed by a BSD-style license that can be
4+
// found in the LICENSE file.
5+
6+
import * as SDK from '../../core/sdk/sdk.js';
7+
import * as ReactNativeModels from '../../models/react_native/react_native.js';
8+
9+
type JSONValue = null | string | number | boolean | {[key: string]: JSONValue} | JSONValue[];
10+
11+
export const enum Events {
12+
Initialized = 'Initialized',
13+
MessageReceived = 'MessageReceived',
14+
}
15+
16+
export type EventTypes = {
17+
[Events.Initialized]: void,
18+
[Events.MessageReceived]: JSONValue,
19+
};
20+
21+
export class ReactDevToolsModel extends SDK.SDKModel.SDKModel<EventTypes> {
22+
private static readonly FUSEBOX_BINDING_NAMESPACE = 'react-devtools';
23+
private readonly rdtModel: ReactNativeModels.ReactDevToolsBindingsModel.ReactDevToolsBindingsModel | null;
24+
25+
constructor(target: SDK.Target.Target) {
26+
super(target);
27+
28+
const model = target.model(ReactNativeModels.ReactDevToolsBindingsModel.ReactDevToolsBindingsModel);
29+
if (!model) {
30+
throw new Error('Failed to construct ReactDevToolsModel: ReactDevToolsBindingsModel was null');
31+
}
32+
33+
this.rdtModel = model;
34+
model.addEventListener(ReactNativeModels.ReactDevToolsBindingsModel.Events.Initialized, this.initialize, this);
35+
}
36+
37+
private initialize(): void {
38+
const rdtModel = this.rdtModel;
39+
if (!rdtModel) {
40+
throw new Error('Failed to initialize ReactDevToolsModel: ReactDevToolsBindingsModel was null');
41+
}
42+
43+
rdtModel.subscribeToDomainMessages(
44+
ReactDevToolsModel.FUSEBOX_BINDING_NAMESPACE,
45+
message => this.onMessage(message),
46+
);
47+
void rdtModel.initializeDomain(ReactDevToolsModel.FUSEBOX_BINDING_NAMESPACE).then(() => this.onInitialization());
48+
}
49+
50+
private onInitialization(): void {
51+
this.dispatchEventToListeners(Events.Initialized);
52+
}
53+
54+
async sendMessage(message: JSONValue): Promise<void> {
55+
const rdtModel = this.rdtModel;
56+
if (!rdtModel) {
57+
throw new Error('Failed to send message from ReactDevToolsModel: ReactDevToolsBindingsModel was null');
58+
}
59+
60+
await rdtModel.sendMessage(ReactDevToolsModel.FUSEBOX_BINDING_NAMESPACE, message);
61+
}
62+
63+
onMessage(message: JSONValue): void {
64+
this.dispatchEventToListeners(Events.MessageReceived, message);
65+
}
66+
}
67+
68+
SDK.SDKModel.SDKModel.register(ReactDevToolsModel, {capabilities: SDK.Target.Capability.JS, autostart: false});

front_end/panels/react_devtools/react_devtools.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55

66
import * as ReactDevToolsView from './ReactDevToolsView.js';
77
import * as ReactDevToolsPlaceholder from './ReactDevToolsPlaceholder.js';
8+
import * as ReactDevToolsModel from './ReactDevToolsModel.js';
89

9-
export {ReactDevToolsView, ReactDevToolsPlaceholder};
10+
export {ReactDevToolsView, ReactDevToolsPlaceholder, ReactDevToolsModel};

0 commit comments

Comments
 (0)