main
js 73 lines 2.26 KB
Raw
1 /** @flow */
2
3 import type {UnknownMessageEvent} from './messages';
4 import type {DevToolsHookSettings} from 'react-devtools-shared/src/backend/types';
5 import type {ComponentFilter} from 'react-devtools-shared/src/frontend/types';
6
7 import {installHook} from 'react-devtools-shared/src/hook';
8 import {
9 getIfReloadedAndProfiling,
10 getProfilingSettings,
11 } from 'react-devtools-shared/src/utils';
12 import {postMessage} from './messages';
13 import {createReactRendererListener} from './reactBuildType';
14
15 let resolveHookSettingsInjection: (settings: DevToolsHookSettings) => void;
16 let resolveComponentFiltersInjection: (filters: Array<ComponentFilter>) => void;
17
18 function messageListener(event: UnknownMessageEvent) {
19 if (event.source !== window) {
20 return;
21 }
22
23 if (event.data.source === 'react-devtools-settings-injector') {
24 const payload = event.data.payload;
25 // In case handshake message was sent prior to hookSettingsInjector execution
26 // We can't guarantee order
27 if (payload.handshake) {
28 postMessage({
29 source: 'react-devtools-hook-installer',
30 payload: {handshake: true},
31 });
32 } else if (payload.hookSettings) {
33 window.removeEventListener('message', messageListener);
34 resolveHookSettingsInjection(payload.hookSettings);
35 resolveComponentFiltersInjection(payload.componentFilters);
36 }
37 }
38 }
39
40 // Avoid double execution
41 if (!window.hasOwnProperty('__REACT_DEVTOOLS_GLOBAL_HOOK__')) {
42 const hookSettingsPromise = new Promise<DevToolsHookSettings>(resolve => {
43 resolveHookSettingsInjection = resolve;
44 });
45 const componentFiltersPromise = new Promise<Array<ComponentFilter>>(
46 resolve => {
47 resolveComponentFiltersInjection = resolve;
48 },
49 );
50
51 window.addEventListener('message', messageListener);
52 postMessage({
53 source: 'react-devtools-hook-installer',
54 payload: {handshake: true},
55 });
56
57 const shouldStartProfiling = getIfReloadedAndProfiling();
58 const profilingSettings = getProfilingSettings();
59 // Can't delay hook installation, inject settings lazily
60 installHook(
61 window,
62 componentFiltersPromise,
63 hookSettingsPromise,
64 shouldStartProfiling,
65 profilingSettings,
66 );
67
68 // Detect React
69 window.__REACT_DEVTOOLS_GLOBAL_HOOK__.on(
70 'renderer',
71 createReactRendererListener(window),
72 );
73 }