mirror of
https://github.com/facebook/react.git
synced 2026-02-21 19:31:52 +00:00
Type react-devtools-hook-installer and react-devtools-hook-settings-injector messages (#35586)
This commit is contained in:
committed by
GitHub
parent
b546603bcb
commit
cdbd55f440
@@ -593,6 +593,7 @@ module.exports = {
|
|||||||
mixin$Animatable: 'readonly',
|
mixin$Animatable: 'readonly',
|
||||||
MouseEventHandler: 'readonly',
|
MouseEventHandler: 'readonly',
|
||||||
NavigateEvent: 'readonly',
|
NavigateEvent: 'readonly',
|
||||||
|
Partial: 'readonly',
|
||||||
PerformanceMeasureOptions: 'readonly',
|
PerformanceMeasureOptions: 'readonly',
|
||||||
PropagationPhases: 'readonly',
|
PropagationPhases: 'readonly',
|
||||||
PropertyDescriptor: 'readonly',
|
PropertyDescriptor: 'readonly',
|
||||||
|
|||||||
16
flow-typed/environments/bom.js
vendored
16
flow-typed/environments/bom.js
vendored
@@ -826,7 +826,7 @@ declare class WebSocket extends EventTarget {
|
|||||||
bufferedAmount: number;
|
bufferedAmount: number;
|
||||||
extensions: string;
|
extensions: string;
|
||||||
onopen: (ev: any) => mixed;
|
onopen: (ev: any) => mixed;
|
||||||
onmessage: (ev: MessageEvent) => mixed;
|
onmessage: (ev: MessageEvent<>) => mixed;
|
||||||
onclose: (ev: CloseEvent) => mixed;
|
onclose: (ev: CloseEvent) => mixed;
|
||||||
onerror: (ev: any) => mixed;
|
onerror: (ev: any) => mixed;
|
||||||
binaryType: 'blob' | 'arraybuffer';
|
binaryType: 'blob' | 'arraybuffer';
|
||||||
@@ -855,8 +855,8 @@ declare class Worker extends EventTarget {
|
|||||||
workerOptions?: WorkerOptions
|
workerOptions?: WorkerOptions
|
||||||
): void;
|
): void;
|
||||||
onerror: null | ((ev: any) => mixed);
|
onerror: null | ((ev: any) => mixed);
|
||||||
onmessage: null | ((ev: MessageEvent) => mixed);
|
onmessage: null | ((ev: MessageEvent<>) => mixed);
|
||||||
onmessageerror: null | ((ev: MessageEvent) => mixed);
|
onmessageerror: null | ((ev: MessageEvent<>) => mixed);
|
||||||
postMessage(message: any, ports?: any): void;
|
postMessage(message: any, ports?: any): void;
|
||||||
terminate(): void;
|
terminate(): void;
|
||||||
}
|
}
|
||||||
@@ -888,14 +888,14 @@ declare class WorkerGlobalScope extends EventTarget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
declare class DedicatedWorkerGlobalScope extends WorkerGlobalScope {
|
declare class DedicatedWorkerGlobalScope extends WorkerGlobalScope {
|
||||||
onmessage: (ev: MessageEvent) => mixed;
|
onmessage: (ev: MessageEvent<>) => mixed;
|
||||||
onmessageerror: (ev: MessageEvent) => mixed;
|
onmessageerror: (ev: MessageEvent<>) => mixed;
|
||||||
postMessage(message: any, transfer?: Iterable<any>): void;
|
postMessage(message: any, transfer?: Iterable<any>): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare class SharedWorkerGlobalScope extends WorkerGlobalScope {
|
declare class SharedWorkerGlobalScope extends WorkerGlobalScope {
|
||||||
name: string;
|
name: string;
|
||||||
onconnect: (ev: MessageEvent) => mixed;
|
onconnect: (ev: MessageEvent<>) => mixed;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare class WorkerLocation {
|
declare class WorkerLocation {
|
||||||
@@ -2056,8 +2056,8 @@ declare class MessagePort extends EventTarget {
|
|||||||
start(): void;
|
start(): void;
|
||||||
close(): void;
|
close(): void;
|
||||||
|
|
||||||
onmessage: null | ((ev: MessageEvent) => mixed);
|
onmessage: null | ((ev: MessageEvent<>) => mixed);
|
||||||
onmessageerror: null | ((ev: MessageEvent) => mixed);
|
onmessageerror: null | ((ev: MessageEvent<>) => mixed);
|
||||||
}
|
}
|
||||||
|
|
||||||
declare class MessageChannel {
|
declare class MessageChannel {
|
||||||
|
|||||||
6
flow-typed/environments/dom.js
vendored
6
flow-typed/environments/dom.js
vendored
@@ -151,7 +151,7 @@ type TransitionEventHandler = (event: TransitionEvent) => mixed;
|
|||||||
type TransitionEventListener =
|
type TransitionEventListener =
|
||||||
| {handleEvent: TransitionEventHandler, ...}
|
| {handleEvent: TransitionEventHandler, ...}
|
||||||
| TransitionEventHandler;
|
| TransitionEventHandler;
|
||||||
type MessageEventHandler = (event: MessageEvent) => mixed;
|
type MessageEventHandler = (event: MessageEvent<>) => mixed;
|
||||||
type MessageEventListener =
|
type MessageEventListener =
|
||||||
| {handleEvent: MessageEventHandler, ...}
|
| {handleEvent: MessageEventHandler, ...}
|
||||||
| MessageEventHandler;
|
| MessageEventHandler;
|
||||||
@@ -845,8 +845,8 @@ declare class PageTransitionEvent extends Event {
|
|||||||
// https://www.w3.org/TR/2008/WD-html5-20080610/comms.html
|
// https://www.w3.org/TR/2008/WD-html5-20080610/comms.html
|
||||||
// and
|
// and
|
||||||
// https://html.spec.whatwg.org/multipage/comms.html#the-messageevent-interfaces
|
// https://html.spec.whatwg.org/multipage/comms.html#the-messageevent-interfaces
|
||||||
declare class MessageEvent extends Event {
|
declare class MessageEvent<Data = mixed> extends Event {
|
||||||
data: mixed;
|
data: Data;
|
||||||
origin: string;
|
origin: string;
|
||||||
lastEventId: string;
|
lastEventId: string;
|
||||||
source: WindowProxy;
|
source: WindowProxy;
|
||||||
|
|||||||
4
flow-typed/environments/html.js
vendored
4
flow-typed/environments/html.js
vendored
@@ -109,8 +109,8 @@ declare class ErrorEvent extends Event {
|
|||||||
// https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts
|
// https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts
|
||||||
declare class BroadcastChannel extends EventTarget {
|
declare class BroadcastChannel extends EventTarget {
|
||||||
name: string;
|
name: string;
|
||||||
onmessage: ?(event: MessageEvent) => void;
|
onmessage: ?(event: MessageEvent<>) => void;
|
||||||
onmessageerror: ?(event: MessageEvent) => void;
|
onmessageerror: ?(event: MessageEvent<>) => void;
|
||||||
|
|
||||||
constructor(name: string): void;
|
constructor(name: string): void;
|
||||||
postMessage(msg: mixed): void;
|
postMessage(msg: mixed): void;
|
||||||
|
|||||||
2
packages/react-devtools-core/src/backend.js
vendored
2
packages/react-devtools-core/src/backend.js
vendored
@@ -293,7 +293,7 @@ export function connectToDevTools(options: ?ConnectOptions) {
|
|||||||
scheduleRetry();
|
scheduleRetry();
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleMessage(event: MessageEvent) {
|
function handleMessage(event: MessageEvent<>) {
|
||||||
let data;
|
let data;
|
||||||
try {
|
try {
|
||||||
if (typeof event.data === 'string') {
|
if (typeof event.data === 'string') {
|
||||||
|
|||||||
@@ -1,38 +1,50 @@
|
|||||||
/* global chrome */
|
/* global chrome */
|
||||||
|
/** @flow */
|
||||||
|
|
||||||
// We can't use chrome.storage domain from scripts which are injected in ExecutionWorld.MAIN
|
// We can't use chrome.storage domain from scripts which are injected in ExecutionWorld.MAIN
|
||||||
// This is the only purpose of this script - to send persisted settings to installHook.js content script
|
// This is the only purpose of this script - to send persisted settings to installHook.js content script
|
||||||
|
|
||||||
async function messageListener(event: MessageEvent) {
|
import type {UnknownMessageEvent} from './messages';
|
||||||
|
import type {DevToolsHookSettings} from 'react-devtools-shared/src/backend/types';
|
||||||
|
import {postMessage} from './messages';
|
||||||
|
|
||||||
|
async function messageListener(event: UnknownMessageEvent) {
|
||||||
if (event.source !== window) {
|
if (event.source !== window) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.data.source === 'react-devtools-hook-installer') {
|
if (event.data.source === 'react-devtools-hook-installer') {
|
||||||
if (event.data.payload.handshake) {
|
if (event.data.payload.handshake) {
|
||||||
const settings = await chrome.storage.local.get();
|
const settings: Partial<DevToolsHookSettings> =
|
||||||
|
await chrome.storage.local.get();
|
||||||
// If storage was empty (first installation), define default settings
|
// If storage was empty (first installation), define default settings
|
||||||
if (typeof settings.appendComponentStack !== 'boolean') {
|
const hookSettings: DevToolsHookSettings = {
|
||||||
settings.appendComponentStack = true;
|
appendComponentStack:
|
||||||
}
|
typeof settings.appendComponentStack === 'boolean'
|
||||||
if (typeof settings.breakOnConsoleErrors !== 'boolean') {
|
? settings.appendComponentStack
|
||||||
settings.breakOnConsoleErrors = false;
|
: true,
|
||||||
}
|
breakOnConsoleErrors:
|
||||||
if (typeof settings.showInlineWarningsAndErrors !== 'boolean') {
|
typeof settings.breakOnConsoleErrors === 'boolean'
|
||||||
settings.showInlineWarningsAndErrors = true;
|
? settings.breakOnConsoleErrors
|
||||||
}
|
: false,
|
||||||
if (typeof settings.hideConsoleLogsInStrictMode !== 'boolean') {
|
showInlineWarningsAndErrors:
|
||||||
settings.hideConsoleLogsInStrictMode = false;
|
typeof settings.showInlineWarningsAndErrors === 'boolean'
|
||||||
}
|
? settings.showInlineWarningsAndErrors
|
||||||
if (
|
: true,
|
||||||
typeof settings.disableSecondConsoleLogDimmingInStrictMode !== 'boolean'
|
hideConsoleLogsInStrictMode:
|
||||||
) {
|
typeof settings.hideConsoleLogsInStrictMode === 'boolean'
|
||||||
settings.disableSecondConsoleLogDimmingInStrictMode = false;
|
? settings.hideConsoleLogsInStrictMode
|
||||||
}
|
: false,
|
||||||
|
disableSecondConsoleLogDimmingInStrictMode:
|
||||||
|
typeof settings.disableSecondConsoleLogDimmingInStrictMode ===
|
||||||
|
'boolean'
|
||||||
|
? settings.disableSecondConsoleLogDimmingInStrictMode
|
||||||
|
: false,
|
||||||
|
};
|
||||||
|
|
||||||
window.postMessage({
|
postMessage({
|
||||||
source: 'react-devtools-hook-settings-injector',
|
source: 'react-devtools-hook-settings-injector',
|
||||||
payload: {settings},
|
payload: {settings: hookSettings},
|
||||||
});
|
});
|
||||||
|
|
||||||
window.removeEventListener('message', messageListener);
|
window.removeEventListener('message', messageListener);
|
||||||
@@ -41,7 +53,7 @@ async function messageListener(event: MessageEvent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('message', messageListener);
|
window.addEventListener('message', messageListener);
|
||||||
window.postMessage({
|
postMessage({
|
||||||
source: 'react-devtools-hook-settings-injector',
|
source: 'react-devtools-hook-settings-injector',
|
||||||
payload: {handshake: true},
|
payload: {handshake: true},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,39 +1,46 @@
|
|||||||
|
/** @flow */
|
||||||
|
|
||||||
|
import type {UnknownMessageEvent} from './messages';
|
||||||
|
import type {DevToolsHookSettings} from 'react-devtools-shared/src/backend/types';
|
||||||
|
|
||||||
import {installHook} from 'react-devtools-shared/src/hook';
|
import {installHook} from 'react-devtools-shared/src/hook';
|
||||||
import {
|
import {
|
||||||
getIfReloadedAndProfiling,
|
getIfReloadedAndProfiling,
|
||||||
getProfilingSettings,
|
getProfilingSettings,
|
||||||
} from 'react-devtools-shared/src/utils';
|
} from 'react-devtools-shared/src/utils';
|
||||||
|
import {postMessage} from './messages';
|
||||||
|
|
||||||
let resolveHookSettingsInjection;
|
let resolveHookSettingsInjection: (settings: DevToolsHookSettings) => void;
|
||||||
|
|
||||||
function messageListener(event: MessageEvent) {
|
function messageListener(event: UnknownMessageEvent) {
|
||||||
if (event.source !== window) {
|
if (event.source !== window) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.data.source === 'react-devtools-hook-settings-injector') {
|
if (event.data.source === 'react-devtools-hook-settings-injector') {
|
||||||
|
const payload = event.data.payload;
|
||||||
// In case handshake message was sent prior to hookSettingsInjector execution
|
// In case handshake message was sent prior to hookSettingsInjector execution
|
||||||
// We can't guarantee order
|
// We can't guarantee order
|
||||||
if (event.data.payload.handshake) {
|
if (payload.handshake) {
|
||||||
window.postMessage({
|
postMessage({
|
||||||
source: 'react-devtools-hook-installer',
|
source: 'react-devtools-hook-installer',
|
||||||
payload: {handshake: true},
|
payload: {handshake: true},
|
||||||
});
|
});
|
||||||
} else if (event.data.payload.settings) {
|
} else if (payload.settings) {
|
||||||
window.removeEventListener('message', messageListener);
|
window.removeEventListener('message', messageListener);
|
||||||
resolveHookSettingsInjection(event.data.payload.settings);
|
resolveHookSettingsInjection(payload.settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avoid double execution
|
// Avoid double execution
|
||||||
if (!window.hasOwnProperty('__REACT_DEVTOOLS_GLOBAL_HOOK__')) {
|
if (!window.hasOwnProperty('__REACT_DEVTOOLS_GLOBAL_HOOK__')) {
|
||||||
const hookSettingsPromise = new Promise(resolve => {
|
const hookSettingsPromise = new Promise<DevToolsHookSettings>(resolve => {
|
||||||
resolveHookSettingsInjection = resolve;
|
resolveHookSettingsInjection = resolve;
|
||||||
});
|
});
|
||||||
|
|
||||||
window.addEventListener('message', messageListener);
|
window.addEventListener('message', messageListener);
|
||||||
window.postMessage({
|
postMessage({
|
||||||
source: 'react-devtools-hook-installer',
|
source: 'react-devtools-hook-installer',
|
||||||
payload: {handshake: true},
|
payload: {handshake: true},
|
||||||
});
|
});
|
||||||
|
|||||||
42
packages/react-devtools-extensions/src/contentScripts/messages.js
vendored
Normal file
42
packages/react-devtools-extensions/src/contentScripts/messages.js
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/** @flow */
|
||||||
|
|
||||||
|
import type {DevToolsHookSettings} from 'react-devtools-shared/src/backend/types';
|
||||||
|
|
||||||
|
export function postMessage(event: UnknownMessageEventData): void {
|
||||||
|
window.postMessage(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface UnknownMessageEvent
|
||||||
|
extends MessageEvent<UnknownMessageEventData> {}
|
||||||
|
|
||||||
|
export type UnknownMessageEventData =
|
||||||
|
| HookSettingsInjectorEventData
|
||||||
|
| HookInstallerEventData;
|
||||||
|
|
||||||
|
export type HookInstallerEventData = {
|
||||||
|
source: 'react-devtools-hook-installer',
|
||||||
|
payload: HookInstallerEventPayload,
|
||||||
|
};
|
||||||
|
|
||||||
|
export type HookInstallerEventPayload = HookInstallerEventPayloadHandshake;
|
||||||
|
|
||||||
|
export type HookInstallerEventPayloadHandshake = {
|
||||||
|
handshake: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
export type HookSettingsInjectorEventData = {
|
||||||
|
source: 'react-devtools-hook-settings-injector',
|
||||||
|
payload: HookSettingsInjectorEventPayload,
|
||||||
|
};
|
||||||
|
|
||||||
|
export type HookSettingsInjectorEventPayload =
|
||||||
|
| HookSettingsInjectorEventPayloadHandshake
|
||||||
|
| HookSettingsInjectorEventPayloadSettings;
|
||||||
|
|
||||||
|
export type HookSettingsInjectorEventPayloadHandshake = {
|
||||||
|
handshake: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
export type HookSettingsInjectorEventPayloadSettings = {
|
||||||
|
settings: DevToolsHookSettings,
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user