Skip to content

Commit c892c93

Browse files
committed
[DevTools] Improve type coverage for extension runtime API
1 parent e0cc720 commit c892c93

2 files changed

Lines changed: 80 additions & 19 deletions

File tree

packages/react-devtools-extensions/src/main/index.js

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* global chrome */
1+
/* global chrome, ExtensionRuntimePort */
22
/** @flow */
33

44
import type {RootType} from 'react-dom/src/client/ReactDOMRoot';
@@ -61,7 +61,7 @@ function createBridge() {
6161
listen(fn) {
6262
const bridgeListener = (message: Message) => fn(message);
6363
// Store the reference so that we unsubscribe from the same object.
64-
const portOnMessage = ((port: any): ExtensionPort).onMessage;
64+
const portOnMessage = port.onMessage;
6565
portOnMessage.addListener(bridgeListener);
6666

6767
lastSubscribedBridgeListener = bridgeListener;
@@ -621,22 +621,7 @@ let root: RootType = (null: $FlowFixMe);
621621

622622
let currentSelectedSource: null | SourceSelection = null;
623623

624-
type ExtensionEvent = {
625-
addListener(callback: (message: Message, port: ExtensionPort) => void): void,
626-
removeListener(
627-
callback: (message: Message, port: ExtensionPort) => void,
628-
): void,
629-
};
630-
631-
/** https://developer.chrome.com/docs/extensions/reference/api/runtime#type-Port */
632-
type ExtensionPort = {
633-
onDisconnect: ExtensionEvent,
634-
onMessage: ExtensionEvent,
635-
postMessage(message: mixed, transferable?: Array<mixed>): void,
636-
disconnect(): void,
637-
};
638-
639-
let port: ExtensionPort = (null: $FlowFixMe);
624+
let port: ExtensionRuntimePort = (null: $FlowFixMe);
640625

641626
// In case when multiple navigation events emitted in a short period of time
642627
// This debounced callback primarily used to avoid mounting React DevTools multiple times, which results

scripts/flow/react-devtools.js

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,80 @@ declare const __IS_CHROME__: boolean;
1717
declare const __IS_EDGE__: boolean;
1818
declare const __IS_NATIVE__: boolean;
1919

20-
declare const chrome: any;
20+
interface ExtensionDevtools {
21+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/devtools/inspectedWindow} */
22+
inspectedWindow: $FlowFixMe;
23+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/devtools/network} */
24+
network: $FlowFixMe;
25+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/devtools/panels} */
26+
panels: $FlowFixMe;
27+
}
28+
29+
interface ExtensionEvent<Listener: Function> {
30+
addListener(callback: Listener): void;
31+
removeListener(callback: Listener): void;
32+
}
33+
34+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port} */
35+
interface ExtensionRuntimePort {
36+
onMessage: ExtensionEvent<(message: any, port: ExtensionRuntimePort) => void>;
37+
onDisconnect: ExtensionEvent<(port: ExtensionRuntimePort) => void>;
38+
postMessage(message: mixed, transferable?: Array<mixed>): void;
39+
disconnect(): void;
40+
}
41+
42+
interface ExtensionMessageSender {
43+
id?: string;
44+
url?: string;
45+
tab?: {
46+
id: number,
47+
url: string,
48+
};
49+
}
50+
51+
interface ExtensionRuntime {
52+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/connect} */
53+
connect(connectInfo?: {
54+
name?: string,
55+
includeTlsChannelId?: boolean,
56+
}): ExtensionRuntimePort;
57+
connect(
58+
extensionId: string,
59+
connectInfo?: {name?: string, includeTlsChannelId?: boolean},
60+
): ExtensionRuntimePort;
61+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage} */
62+
onMessage: ExtensionEvent<
63+
(
64+
message: any,
65+
sender: ExtensionMessageSender,
66+
sendResponse: (response: any) => void,
67+
) => any,
68+
>;
69+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onConnect} */
70+
onConnect: ExtensionEvent<(port: ExtensionRuntimePort) => void>;
71+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage} */
72+
sendMessage(
73+
message: any,
74+
options?: {includeTlsChannelId?: boolean},
75+
): Promise<any>;
76+
sendMessage(
77+
extensionId: string,
78+
message: any,
79+
// We're making this required so that we don't accidentally call the wrong overload.
80+
options: {includeTlsChannelId?: boolean},
81+
): Promise<any>;
82+
}
83+
84+
interface ExtensionAPI {
85+
devtools: ExtensionDevtools;
86+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/permissions} */
87+
permissions: $FlowFixMe;
88+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime} */
89+
runtime: ExtensionRuntime;
90+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting} */
91+
scripting: $FlowFixMe;
92+
/** @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage} */
93+
storage: $FlowFixMe;
94+
}
95+
96+
declare const chrome: ExtensionAPI;

0 commit comments

Comments
 (0)