Skip to content

Commit 59b4efa

Browse files
committed
refactor[react-devtools]: propagate settings from global hook object to frontend
1 parent 4ba5e78 commit 59b4efa

File tree

11 files changed

+145
-99
lines changed

11 files changed

+145
-99
lines changed

packages/react-devtools-core/src/backend.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ export function connectToDevTools(options: ?ConnectOptions) {
162162
);
163163

164164
if (devToolsSettingsManager != null && bridge != null) {
165-
bridge.addListener('updateConsolePatchSettings', consolePatchSettings =>
165+
bridge.addListener('updateHookSettings', consolePatchSettings =>
166166
cacheConsolePatchSettings(
167167
devToolsSettingsManager,
168168
consolePatchSettings,
@@ -368,7 +368,7 @@ export function connectWithCustomMessagingProtocol({
368368
);
369369

370370
if (settingsManager != null) {
371-
bridge.addListener('updateConsolePatchSettings', consolePatchSettings =>
371+
bridge.addListener('updateHookSettings', consolePatchSettings =>
372372
cacheConsolePatchSettings(settingsManager, consolePatchSettings),
373373
);
374374
}

packages/react-devtools-core/src/cachedSettings.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ function parseConsolePatchSettings(
6666

6767
export function cacheConsolePatchSettings(
6868
devToolsSettingsManager: DevToolsSettingsManager,
69-
value: ConsolePatchSettings,
69+
value: $ReadOnly<ConsolePatchSettings>,
7070
): void {
7171
if (devToolsSettingsManager.setConsolePatchSettings == null) {
7272
return;

packages/react-devtools-shared/src/backend/agent.js

+23-14
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ export default class Agent extends EventEmitter<{
150150
disableTraceUpdates: [],
151151
getIfHasUnsupportedRendererVersion: [],
152152
updateHookSettings: [DevToolsHookSettings],
153+
getHookSettings: [],
153154
}> {
154155
_bridge: BackendBridge;
155156
_isProfiling: boolean = false;
@@ -213,10 +214,10 @@ export default class Agent extends EventEmitter<{
213214
this.syncSelectionFromBuiltinElementsPanel,
214215
);
215216
bridge.addListener('shutdown', this.shutdown);
216-
bridge.addListener(
217-
'updateConsolePatchSettings',
218-
this.updateConsolePatchSettings,
219-
);
217+
218+
bridge.addListener('updateHookSettings', this.updateHookSettings);
219+
bridge.addListener('getHookSettings', this.getHookSettings);
220+
220221
bridge.addListener('updateComponentFilters', this.updateComponentFilters);
221222
bridge.addListener('getEnvironmentNames', this.getEnvironmentNames);
222223
bridge.addListener(
@@ -802,18 +803,26 @@ export default class Agent extends EventEmitter<{
802803
}
803804
};
804805

805-
updateConsolePatchSettings: (
806-
settings: $ReadOnly<DevToolsHookSettings>,
807-
) => void = settings => {
808-
// Propagate the settings, so Backend can subscribe to it and modify hook
809-
this.emit('updateHookSettings', {
810-
appendComponentStack: settings.appendComponentStack,
811-
breakOnConsoleErrors: settings.breakOnConsoleErrors,
812-
showInlineWarningsAndErrors: settings.showInlineWarningsAndErrors,
813-
hideConsoleLogsInStrictMode: settings.hideConsoleLogsInStrictMode,
814-
});
806+
updateHookSettings: (settings: $ReadOnly<DevToolsHookSettings>) => void =
807+
settings => {
808+
// Propagate the settings, so Backend can subscribe to it and modify hook
809+
this.emit('updateHookSettings', {
810+
appendComponentStack: settings.appendComponentStack,
811+
breakOnConsoleErrors: settings.breakOnConsoleErrors,
812+
showInlineWarningsAndErrors: settings.showInlineWarningsAndErrors,
813+
hideConsoleLogsInStrictMode: settings.hideConsoleLogsInStrictMode,
814+
});
815+
};
816+
817+
getHookSettings: () => void = () => {
818+
this.emit('getHookSettings');
815819
};
816820

821+
onHookSettings: (settings: $ReadOnly<DevToolsHookSettings>) => void =
822+
settings => {
823+
this._bridge.send('hookSettings', settings);
824+
};
825+
817826
updateComponentFilters: (componentFilters: Array<ComponentFilter>) => void =
818827
componentFilters => {
819828
for (const rendererIDString in this._rendererInterfaces) {

packages/react-devtools-shared/src/backend/index.js

+7
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export function initBackend(
5454
hook.sub('fastRefreshScheduled', agent.onFastRefreshScheduled),
5555
hook.sub('operations', agent.onHookOperations),
5656
hook.sub('traceUpdates', agent.onTraceUpdates),
57+
hook.sub('settingsInitialized', agent.onHookSettings),
5758

5859
// TODO Add additional subscriptions required for profiling mode
5960
];
@@ -87,6 +88,12 @@ export function initBackend(
8788
hook.settings = settings;
8889
});
8990

91+
agent.addListener('getHookSettings', () => {
92+
if (hook.settings != null) {
93+
agent.onHookSettings(hook.settings);
94+
}
95+
});
96+
9097
return () => {
9198
subs.forEach(fn => fn());
9299
};

packages/react-devtools-shared/src/bridge.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,8 @@ export type BackendEvents = {
207207
{isSupported: boolean, validAttributes: ?$ReadOnlyArray<string>},
208208
],
209209
NativeStyleEditor_styleAndLayout: [StyleAndLayoutPayload],
210+
211+
hookSettings: [$ReadOnly<DevToolsHookSettings>],
210212
};
211213

212214
type FrontendEvents = {
@@ -241,7 +243,7 @@ type FrontendEvents = {
241243
storeAsGlobal: [StoreAsGlobalParams],
242244
updateComponentFilters: [Array<ComponentFilter>],
243245
getEnvironmentNames: [],
244-
updateConsolePatchSettings: [DevToolsHookSettings],
246+
updateHookSettings: [$ReadOnly<DevToolsHookSettings>],
245247
viewAttributeSource: [ViewAttributeSourceParams],
246248
viewElementSource: [ElementAndRendererID],
247249

@@ -267,6 +269,8 @@ type FrontendEvents = {
267269

268270
resumeElementPolling: [],
269271
pauseElementPolling: [],
272+
273+
getHookSettings: [],
270274
};
271275

272276
class Bridge<

packages/react-devtools-shared/src/devtools/store.js

+25
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import type {
4949
BridgeProtocol,
5050
} from 'react-devtools-shared/src/bridge';
5151
import UnsupportedBridgeOperationError from 'react-devtools-shared/src/UnsupportedBridgeOperationError';
52+
import type {DevToolsHookSettings} from '../backend/types';
5253

5354
const debug = (methodName: string, ...args: Array<string>) => {
5455
if (__DEBUG__) {
@@ -94,6 +95,7 @@ export default class Store extends EventEmitter<{
9495
collapseNodesByDefault: [],
9596
componentFilters: [],
9697
error: [Error],
98+
hookSettings: [$ReadOnly<DevToolsHookSettings>],
9799
mutated: [[Array<number>, Map<number, number>]],
98100
recordChangeDescriptions: [],
99101
roots: [],
@@ -192,6 +194,7 @@ export default class Store extends EventEmitter<{
192194
_weightAcrossRoots: number = 0;
193195

194196
_shouldCheckBridgeProtocolCompatibility: boolean = false;
197+
_hookSettings: $ReadOnly<DevToolsHookSettings> | null = null;
195198

196199
constructor(bridge: FrontendBridge, config?: Config) {
197200
super();
@@ -270,6 +273,7 @@ export default class Store extends EventEmitter<{
270273

271274
bridge.addListener('backendVersion', this.onBridgeBackendVersion);
272275
bridge.addListener('saveToClipboard', this.onSaveToClipboard);
276+
bridge.addListener('hookSettings', this.onHookSettings);
273277
bridge.addListener('backendInitialized', this.onBackendInitialized);
274278
}
275279

@@ -1501,8 +1505,29 @@ export default class Store extends EventEmitter<{
15011505

15021506
this._bridge.send('getBackendVersion');
15031507
this._bridge.send('getIfHasUnsupportedRendererVersion');
1508+
this._bridge.send('getHookSettings'); // Warm up cached hook settings
15041509
};
15051510

1511+
getHookSettings: () => void = () => {
1512+
if (this._hookSettings != null) {
1513+
this.emit('hookSettings', this._hookSettings);
1514+
} else {
1515+
this._bridge.send('getHookSettings');
1516+
}
1517+
};
1518+
1519+
updateHookSettings: (settings: $ReadOnly<DevToolsHookSettings>) => void =
1520+
settings => {
1521+
this._hookSettings = settings;
1522+
this._bridge.send('updateHookSettings', settings);
1523+
};
1524+
1525+
onHookSettings: (settings: $ReadOnly<DevToolsHookSettings>) => void =
1526+
settings => {
1527+
this._hookSettings = settings;
1528+
this.emit('hookSettings', settings);
1529+
};
1530+
15061531
// The Store should never throw an Error without also emitting an event.
15071532
// Otherwise Store errors will be invisible to users,
15081533
// but the downstream errors they cause will be reported as bugs.

packages/react-devtools-shared/src/devtools/views/Settings/DebuggingSettings.js

+37-10
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,49 @@
88
*/
99

1010
import * as React from 'react';
11-
import {useContext} from 'react';
12-
import {SettingsContext} from './SettingsContext';
11+
import {use, useState, useEffect} from 'react';
12+
13+
import type {DevToolsHookSettings} from 'react-devtools-shared/src/backend/types';
14+
import type Store from 'react-devtools-shared/src/devtools/store';
1315

1416
import styles from './SettingsShared.css';
1517

16-
export default function DebuggingSettings(_: {}): React.Node {
17-
const {
18+
type Props = {
19+
hookSettings: Promise<$ReadOnly<DevToolsHookSettings>>,
20+
store: Store,
21+
};
22+
23+
export default function DebuggingSettings({
24+
hookSettings,
25+
store,
26+
}: Props): React.Node {
27+
const usedHookSettings = use(hookSettings);
28+
29+
const [appendComponentStack, setAppendComponentStack] = useState(
30+
usedHookSettings.appendComponentStack,
31+
);
32+
const [breakOnConsoleErrors, setBreakOnConsoleErrors] = useState(
33+
usedHookSettings.breakOnConsoleErrors,
34+
);
35+
const [hideConsoleLogsInStrictMode, setHideConsoleLogsInStrictMode] =
36+
useState(usedHookSettings.hideConsoleLogsInStrictMode);
37+
const [showInlineWarningsAndErrors, setShowInlineWarningsAndErrors] =
38+
useState(usedHookSettings.showInlineWarningsAndErrors);
39+
40+
useEffect(() => {
41+
store.updateHookSettings({
42+
appendComponentStack,
43+
breakOnConsoleErrors,
44+
showInlineWarningsAndErrors,
45+
hideConsoleLogsInStrictMode,
46+
});
47+
}, [
48+
store,
1849
appendComponentStack,
1950
breakOnConsoleErrors,
20-
hideConsoleLogsInStrictMode,
21-
setAppendComponentStack,
22-
setBreakOnConsoleErrors,
23-
setShowInlineWarningsAndErrors,
2451
showInlineWarningsAndErrors,
25-
setHideConsoleLogsInStrictMode,
26-
} = useContext(SettingsContext);
52+
hideConsoleLogsInStrictMode,
53+
]);
2754

2855
return (
2956
<div className={styles.Settings}>

packages/react-devtools-shared/src/devtools/views/Settings/SettingsContext.js

-55
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@ import {
2020
import {
2121
LOCAL_STORAGE_BROWSER_THEME,
2222
LOCAL_STORAGE_PARSE_HOOK_NAMES_KEY,
23-
LOCAL_STORAGE_SHOULD_BREAK_ON_CONSOLE_ERRORS,
24-
LOCAL_STORAGE_SHOULD_APPEND_COMPONENT_STACK_KEY,
2523
LOCAL_STORAGE_TRACE_UPDATES_ENABLED_KEY,
26-
LOCAL_STORAGE_SHOW_INLINE_WARNINGS_AND_ERRORS_KEY,
27-
LOCAL_STORAGE_HIDE_CONSOLE_LOGS_IN_STRICT_MODE,
2824
} from 'react-devtools-shared/src/constants';
2925
import {
3026
COMFORTABLE_LINE_HEIGHT,
@@ -118,30 +114,10 @@ function SettingsContextController({
118114
LOCAL_STORAGE_BROWSER_THEME,
119115
'auto',
120116
);
121-
const [appendComponentStack, setAppendComponentStack] =
122-
useLocalStorageWithLog<boolean>(
123-
LOCAL_STORAGE_SHOULD_APPEND_COMPONENT_STACK_KEY,
124-
true,
125-
);
126-
const [breakOnConsoleErrors, setBreakOnConsoleErrors] =
127-
useLocalStorageWithLog<boolean>(
128-
LOCAL_STORAGE_SHOULD_BREAK_ON_CONSOLE_ERRORS,
129-
false,
130-
);
131117
const [parseHookNames, setParseHookNames] = useLocalStorageWithLog<boolean>(
132118
LOCAL_STORAGE_PARSE_HOOK_NAMES_KEY,
133119
false,
134120
);
135-
const [hideConsoleLogsInStrictMode, setHideConsoleLogsInStrictMode] =
136-
useLocalStorageWithLog<boolean>(
137-
LOCAL_STORAGE_HIDE_CONSOLE_LOGS_IN_STRICT_MODE,
138-
false,
139-
);
140-
const [showInlineWarningsAndErrors, setShowInlineWarningsAndErrors] =
141-
useLocalStorageWithLog<boolean>(
142-
LOCAL_STORAGE_SHOW_INLINE_WARNINGS_AND_ERRORS_KEY,
143-
true,
144-
);
145121
const [traceUpdatesEnabled, setTraceUpdatesEnabled] =
146122
useLocalStorageWithLog<boolean>(
147123
LOCAL_STORAGE_TRACE_UPDATES_ENABLED_KEY,
@@ -196,64 +172,33 @@ function SettingsContextController({
196172
}
197173
}, [browserTheme, theme, documentElements]);
198174

199-
useEffect(() => {
200-
bridge.send('updateConsolePatchSettings', {
201-
appendComponentStack,
202-
breakOnConsoleErrors,
203-
showInlineWarningsAndErrors,
204-
hideConsoleLogsInStrictMode,
205-
});
206-
}, [
207-
bridge,
208-
appendComponentStack,
209-
breakOnConsoleErrors,
210-
showInlineWarningsAndErrors,
211-
hideConsoleLogsInStrictMode,
212-
]);
213-
214175
useEffect(() => {
215176
bridge.send('setTraceUpdatesEnabled', traceUpdatesEnabled);
216177
}, [bridge, traceUpdatesEnabled]);
217178

218179
const value = useMemo(
219180
() => ({
220-
appendComponentStack,
221-
breakOnConsoleErrors,
222181
displayDensity,
223182
lineHeight:
224183
displayDensity === 'compact'
225184
? COMPACT_LINE_HEIGHT
226185
: COMFORTABLE_LINE_HEIGHT,
227186
parseHookNames,
228-
setAppendComponentStack,
229-
setBreakOnConsoleErrors,
230187
setDisplayDensity,
231188
setParseHookNames,
232189
setTheme,
233190
setTraceUpdatesEnabled,
234-
setShowInlineWarningsAndErrors,
235-
showInlineWarningsAndErrors,
236-
setHideConsoleLogsInStrictMode,
237-
hideConsoleLogsInStrictMode,
238191
theme,
239192
browserTheme,
240193
traceUpdatesEnabled,
241194
}),
242195
[
243-
appendComponentStack,
244-
breakOnConsoleErrors,
245196
displayDensity,
246197
parseHookNames,
247-
setAppendComponentStack,
248-
setBreakOnConsoleErrors,
249198
setDisplayDensity,
250199
setParseHookNames,
251200
setTheme,
252201
setTraceUpdatesEnabled,
253-
setShowInlineWarningsAndErrors,
254-
showInlineWarningsAndErrors,
255-
setHideConsoleLogsInStrictMode,
256-
hideConsoleLogsInStrictMode,
257202
theme,
258203
browserTheme,
259204
traceUpdatesEnabled,

0 commit comments

Comments
 (0)