Skip to content

Commit cdbd55f

Browse files
authored
Type react-devtools-hook-installer and react-devtools-hook-settings-injector messages (facebook#35586)
1 parent b546603 commit cdbd55f

File tree

8 files changed

+106
-44
lines changed

8 files changed

+106
-44
lines changed

.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,7 @@ module.exports = {
593593
mixin$Animatable: 'readonly',
594594
MouseEventHandler: 'readonly',
595595
NavigateEvent: 'readonly',
596+
Partial: 'readonly',
596597
PerformanceMeasureOptions: 'readonly',
597598
PropagationPhases: 'readonly',
598599
PropertyDescriptor: 'readonly',

flow-typed/environments/bom.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,7 @@ declare class WebSocket extends EventTarget {
826826
bufferedAmount: number;
827827
extensions: string;
828828
onopen: (ev: any) => mixed;
829-
onmessage: (ev: MessageEvent) => mixed;
829+
onmessage: (ev: MessageEvent<>) => mixed;
830830
onclose: (ev: CloseEvent) => mixed;
831831
onerror: (ev: any) => mixed;
832832
binaryType: 'blob' | 'arraybuffer';
@@ -855,8 +855,8 @@ declare class Worker extends EventTarget {
855855
workerOptions?: WorkerOptions
856856
): void;
857857
onerror: null | ((ev: any) => mixed);
858-
onmessage: null | ((ev: MessageEvent) => mixed);
859-
onmessageerror: null | ((ev: MessageEvent) => mixed);
858+
onmessage: null | ((ev: MessageEvent<>) => mixed);
859+
onmessageerror: null | ((ev: MessageEvent<>) => mixed);
860860
postMessage(message: any, ports?: any): void;
861861
terminate(): void;
862862
}
@@ -888,14 +888,14 @@ declare class WorkerGlobalScope extends EventTarget {
888888
}
889889

890890
declare class DedicatedWorkerGlobalScope extends WorkerGlobalScope {
891-
onmessage: (ev: MessageEvent) => mixed;
892-
onmessageerror: (ev: MessageEvent) => mixed;
891+
onmessage: (ev: MessageEvent<>) => mixed;
892+
onmessageerror: (ev: MessageEvent<>) => mixed;
893893
postMessage(message: any, transfer?: Iterable<any>): void;
894894
}
895895

896896
declare class SharedWorkerGlobalScope extends WorkerGlobalScope {
897897
name: string;
898-
onconnect: (ev: MessageEvent) => mixed;
898+
onconnect: (ev: MessageEvent<>) => mixed;
899899
}
900900

901901
declare class WorkerLocation {
@@ -2056,8 +2056,8 @@ declare class MessagePort extends EventTarget {
20562056
start(): void;
20572057
close(): void;
20582058

2059-
onmessage: null | ((ev: MessageEvent) => mixed);
2060-
onmessageerror: null | ((ev: MessageEvent) => mixed);
2059+
onmessage: null | ((ev: MessageEvent<>) => mixed);
2060+
onmessageerror: null | ((ev: MessageEvent<>) => mixed);
20612061
}
20622062

20632063
declare class MessageChannel {

flow-typed/environments/dom.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ type TransitionEventHandler = (event: TransitionEvent) => mixed;
151151
type TransitionEventListener =
152152
| {handleEvent: TransitionEventHandler, ...}
153153
| TransitionEventHandler;
154-
type MessageEventHandler = (event: MessageEvent) => mixed;
154+
type MessageEventHandler = (event: MessageEvent<>) => mixed;
155155
type MessageEventListener =
156156
| {handleEvent: MessageEventHandler, ...}
157157
| MessageEventHandler;
@@ -845,8 +845,8 @@ declare class PageTransitionEvent extends Event {
845845
// https://www.w3.org/TR/2008/WD-html5-20080610/comms.html
846846
// and
847847
// https://html.spec.whatwg.org/multipage/comms.html#the-messageevent-interfaces
848-
declare class MessageEvent extends Event {
849-
data: mixed;
848+
declare class MessageEvent<Data = mixed> extends Event {
849+
data: Data;
850850
origin: string;
851851
lastEventId: string;
852852
source: WindowProxy;

flow-typed/environments/html.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ declare class ErrorEvent extends Event {
109109
// https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts
110110
declare class BroadcastChannel extends EventTarget {
111111
name: string;
112-
onmessage: ?(event: MessageEvent) => void;
113-
onmessageerror: ?(event: MessageEvent) => void;
112+
onmessage: ?(event: MessageEvent<>) => void;
113+
onmessageerror: ?(event: MessageEvent<>) => void;
114114

115115
constructor(name: string): void;
116116
postMessage(msg: mixed): void;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ export function connectToDevTools(options: ?ConnectOptions) {
293293
scheduleRetry();
294294
}
295295

296-
function handleMessage(event: MessageEvent) {
296+
function handleMessage(event: MessageEvent<>) {
297297
let data;
298298
try {
299299
if (typeof event.data === 'string') {
Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,50 @@
11
/* global chrome */
2+
/** @flow */
23

34
// We can't use chrome.storage domain from scripts which are injected in ExecutionWorld.MAIN
45
// This is the only purpose of this script - to send persisted settings to installHook.js content script
56

6-
async function messageListener(event: MessageEvent) {
7+
import type {UnknownMessageEvent} from './messages';
8+
import type {DevToolsHookSettings} from 'react-devtools-shared/src/backend/types';
9+
import {postMessage} from './messages';
10+
11+
async function messageListener(event: UnknownMessageEvent) {
712
if (event.source !== window) {
813
return;
914
}
1015

1116
if (event.data.source === 'react-devtools-hook-installer') {
1217
if (event.data.payload.handshake) {
13-
const settings = await chrome.storage.local.get();
18+
const settings: Partial<DevToolsHookSettings> =
19+
await chrome.storage.local.get();
1420
// If storage was empty (first installation), define default settings
15-
if (typeof settings.appendComponentStack !== 'boolean') {
16-
settings.appendComponentStack = true;
17-
}
18-
if (typeof settings.breakOnConsoleErrors !== 'boolean') {
19-
settings.breakOnConsoleErrors = false;
20-
}
21-
if (typeof settings.showInlineWarningsAndErrors !== 'boolean') {
22-
settings.showInlineWarningsAndErrors = true;
23-
}
24-
if (typeof settings.hideConsoleLogsInStrictMode !== 'boolean') {
25-
settings.hideConsoleLogsInStrictMode = false;
26-
}
27-
if (
28-
typeof settings.disableSecondConsoleLogDimmingInStrictMode !== 'boolean'
29-
) {
30-
settings.disableSecondConsoleLogDimmingInStrictMode = false;
31-
}
21+
const hookSettings: DevToolsHookSettings = {
22+
appendComponentStack:
23+
typeof settings.appendComponentStack === 'boolean'
24+
? settings.appendComponentStack
25+
: true,
26+
breakOnConsoleErrors:
27+
typeof settings.breakOnConsoleErrors === 'boolean'
28+
? settings.breakOnConsoleErrors
29+
: false,
30+
showInlineWarningsAndErrors:
31+
typeof settings.showInlineWarningsAndErrors === 'boolean'
32+
? settings.showInlineWarningsAndErrors
33+
: true,
34+
hideConsoleLogsInStrictMode:
35+
typeof settings.hideConsoleLogsInStrictMode === 'boolean'
36+
? settings.hideConsoleLogsInStrictMode
37+
: false,
38+
disableSecondConsoleLogDimmingInStrictMode:
39+
typeof settings.disableSecondConsoleLogDimmingInStrictMode ===
40+
'boolean'
41+
? settings.disableSecondConsoleLogDimmingInStrictMode
42+
: false,
43+
};
3244

33-
window.postMessage({
45+
postMessage({
3446
source: 'react-devtools-hook-settings-injector',
35-
payload: {settings},
47+
payload: {settings: hookSettings},
3648
});
3749

3850
window.removeEventListener('message', messageListener);
@@ -41,7 +53,7 @@ async function messageListener(event: MessageEvent) {
4153
}
4254

4355
window.addEventListener('message', messageListener);
44-
window.postMessage({
56+
postMessage({
4557
source: 'react-devtools-hook-settings-injector',
4658
payload: {handshake: true},
4759
});

packages/react-devtools-extensions/src/contentScripts/installHook.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,46 @@
1+
/** @flow */
2+
3+
import type {UnknownMessageEvent} from './messages';
4+
import type {DevToolsHookSettings} from 'react-devtools-shared/src/backend/types';
5+
16
import {installHook} from 'react-devtools-shared/src/hook';
27
import {
38
getIfReloadedAndProfiling,
49
getProfilingSettings,
510
} from 'react-devtools-shared/src/utils';
11+
import {postMessage} from './messages';
612

7-
let resolveHookSettingsInjection;
13+
let resolveHookSettingsInjection: (settings: DevToolsHookSettings) => void;
814

9-
function messageListener(event: MessageEvent) {
15+
function messageListener(event: UnknownMessageEvent) {
1016
if (event.source !== window) {
1117
return;
1218
}
1319

1420
if (event.data.source === 'react-devtools-hook-settings-injector') {
21+
const payload = event.data.payload;
1522
// In case handshake message was sent prior to hookSettingsInjector execution
1623
// We can't guarantee order
17-
if (event.data.payload.handshake) {
18-
window.postMessage({
24+
if (payload.handshake) {
25+
postMessage({
1926
source: 'react-devtools-hook-installer',
2027
payload: {handshake: true},
2128
});
22-
} else if (event.data.payload.settings) {
29+
} else if (payload.settings) {
2330
window.removeEventListener('message', messageListener);
24-
resolveHookSettingsInjection(event.data.payload.settings);
31+
resolveHookSettingsInjection(payload.settings);
2532
}
2633
}
2734
}
2835

2936
// Avoid double execution
3037
if (!window.hasOwnProperty('__REACT_DEVTOOLS_GLOBAL_HOOK__')) {
31-
const hookSettingsPromise = new Promise(resolve => {
38+
const hookSettingsPromise = new Promise<DevToolsHookSettings>(resolve => {
3239
resolveHookSettingsInjection = resolve;
3340
});
3441

3542
window.addEventListener('message', messageListener);
36-
window.postMessage({
43+
postMessage({
3744
source: 'react-devtools-hook-installer',
3845
payload: {handshake: true},
3946
});
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/** @flow */
2+
3+
import type {DevToolsHookSettings} from 'react-devtools-shared/src/backend/types';
4+
5+
export function postMessage(event: UnknownMessageEventData): void {
6+
window.postMessage(event);
7+
}
8+
9+
export interface UnknownMessageEvent
10+
extends MessageEvent<UnknownMessageEventData> {}
11+
12+
export type UnknownMessageEventData =
13+
| HookSettingsInjectorEventData
14+
| HookInstallerEventData;
15+
16+
export type HookInstallerEventData = {
17+
source: 'react-devtools-hook-installer',
18+
payload: HookInstallerEventPayload,
19+
};
20+
21+
export type HookInstallerEventPayload = HookInstallerEventPayloadHandshake;
22+
23+
export type HookInstallerEventPayloadHandshake = {
24+
handshake: true,
25+
};
26+
27+
export type HookSettingsInjectorEventData = {
28+
source: 'react-devtools-hook-settings-injector',
29+
payload: HookSettingsInjectorEventPayload,
30+
};
31+
32+
export type HookSettingsInjectorEventPayload =
33+
| HookSettingsInjectorEventPayloadHandshake
34+
| HookSettingsInjectorEventPayloadSettings;
35+
36+
export type HookSettingsInjectorEventPayloadHandshake = {
37+
handshake: true,
38+
};
39+
40+
export type HookSettingsInjectorEventPayloadSettings = {
41+
settings: DevToolsHookSettings,
42+
};

0 commit comments

Comments
 (0)