blob: 31e16b0fba6f8443f127e9779b8e0b799bff01c3 [file] [log] [blame]
Philip Pfaffe5df66262021-07-19 16:55:50 +02001// Copyright 2021 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5export namespace Chrome {
6 export namespace DevTools {
Tim van der Lippe269e9ae2021-12-14 14:33:28 +01007 export interface EventSink<ListenerT extends(...args: any) => void> {
Philip Pfaffe5df66262021-07-19 16:55:50 +02008 addListener(listener: ListenerT): void;
9 }
10
11 export interface Resource {
Philip Pfaffe11e43682021-07-29 13:14:42 +020012 readonly url: string;
Philip Pfaffe5df66262021-07-19 16:55:50 +020013
14 getContent(callback: (content: string, encoding: string) => unknown): void;
15 setContent(content: string, commit: boolean, callback?: (error?: Object) => unknown): void;
16 }
17
18 export interface InspectedWindow {
19 tabId: number;
20
21 onResourceAdded: EventSink<(resource: Resource) => unknown>;
22 onResourceContentCommitted: EventSink<(resource: Resource, content: string) => unknown>;
23
24 eval(
25 expression: string,
26 options?: {contextSecurityOrigin?: string, frameURL?: string, useContentScriptContext?: boolean},
27 callback?: (result: unknown, exceptioninfo: {
28 code: string,
29 description: string,
30 details: unknown[],
31 isError: boolean,
32 isException: boolean,
33 value: string
34 }) => unknown): void;
35 getResources(callback: (resources: Resource[]) => unknown): void;
36 reload(reloadOptions?: {ignoreCache?: boolean, injectedScript?: string, userAgent?: string}): void;
37 }
38
39 export interface Button {
40 onClicked: EventSink<() => unknown>;
41 update(iconPath?: string, tooltipText?: string, disabled?: boolean): void;
42 }
43
44 export interface ExtensionView {
45 onHidden: EventSink<() => unknown>;
46 onShown: EventSink<(window?: Window) => unknown>;
47 }
48
49 export interface ExtensionPanel extends ExtensionView {
50 onSearch: EventSink<(action: string, queryString?: string) => unknown>;
51 createStatusBarButton(iconPath: string, tooltipText: string, disabled: boolean): Button;
52 }
53
54 export interface ExtensionSidebarPane extends ExtensionView {
55 setHeight(height: string): void;
56 setObject(jsonObject: string, rootTitle?: string, callback?: () => unknown): void;
57 setPage(path: string): void;
58 }
59
60 export interface PanelWithSidebar {
61 createSidebarPane(title: string, callback?: (result: ExtensionSidebarPane) => unknown): void;
62 onSelectionChanged: EventSink<() => unknown>;
63 }
64
65 export interface Panels {
66 elements: PanelWithSidebar;
67 sources: PanelWithSidebar;
68 themeName: string;
69
70 create(title: string, iconPath: string, pagePath: string, callback?: (panel: ExtensionPanel) => unknown): void;
Philip Pfaffe140e5432021-09-13 18:34:23 +020071 openResource(url: string, lineNumber: number, columnNumber?: number, callback?: () => unknown): void;
Paul Lewisada689f2022-01-11 12:03:40 +000072
73 /**
74 * Fired when the theme changes in DevTools.
75 *
76 * @param callback The handler callback to register and be invoked on theme changes.
77 */
78 setThemeChangeHandler(callback?: (themeName: string) => unknown): void;
Philip Pfaffe5df66262021-07-19 16:55:50 +020079 }
80
81 export interface Request {
82 getContent(callback: (content: string, encoding: string) => unknown): void;
83 }
84
85 export interface Network {
86 onNavigated: EventSink<(url: string) => unknown>;
87 onRequestFinished: EventSink<(request: Request) => unknown>;
88
89 getHAR(callback: (harLog: object) => unknown): void;
90 }
91
92 export interface DevToolsAPI {
93 network: Network;
94 panels: Panels;
95 inspectedWindow: InspectedWindow;
96 languageServices: LanguageExtensions;
Alex Rudenkoa3850822022-05-24 09:34:22 +020097 recorder: RecorderExtensions;
Philip Pfaffe5df66262021-07-19 16:55:50 +020098 }
99
100 export interface ExperimentalDevToolsAPI {
101 inspectedWindow: InspectedWindow;
102 }
103
104 export interface RawModule {
105 url: string;
106 code?: ArrayBuffer;
107 }
108
109 export interface RawLocationRange {
110 rawModuleId: string;
111 startOffset: number;
112 endOffset: number;
113 }
114
115 export interface RawLocation {
116 rawModuleId: string;
117 codeOffset: number;
118 inlineFrameIndex: number;
119 }
120
121 export interface SourceLocation {
122 rawModuleId: string;
123 sourceFileURL: string;
124 lineNumber: number;
125 columnNumber: number;
126 }
127
128 export interface Variable {
129 scope: string;
130 name: string;
131 type: string;
132 nestedName?: string[];
133 }
134
135 export interface ScopeInfo {
136 type: string;
137 typeName: string;
138 icon?: string;
139 }
140
141 export interface FunctionInfo {
142 name: string;
143 }
144
Philip Pfaffe1e2a3712021-07-22 14:23:01 +0200145 export type Enumerator = {
146 name: string,
147 value: unknown,
148 typeId: unknown,
149 };
150
Philip Pfaffe5df66262021-07-19 16:55:50 +0200151 export interface FieldInfo {
152 name?: string;
153 offset: number;
154 typeId: unknown;
155 }
156
157 export interface TypeInfo {
158 typeNames: string[];
159 typeId: unknown;
160 members: FieldInfo[];
Philip Pfaffe1e2a3712021-07-22 14:23:01 +0200161 enumerators?: Enumerator[];
Philip Pfaffe5df66262021-07-19 16:55:50 +0200162 alignment: number;
163 arraySize: number;
164 size: number;
165 canExpand: boolean;
166 hasValue: boolean;
167 }
168
169 export interface EvalBase {
170 rootType: TypeInfo;
171 payload: unknown;
172 }
173
Alex Rudenkoa3850822022-05-24 09:34:22 +0200174 export interface RecorderExtensionPlugin {
Alex Rudenkofba45c52022-06-01 09:32:05 +0200175 stringify(recording: Record<string, any>): Promise<string>;
176 stringifyStep(step: Record<string, any>): Promise<string>;
Alex Rudenkoa3850822022-05-24 09:34:22 +0200177 }
178
Philip Pfaffe6ed01262022-07-06 10:41:39 +0000179 export type RemoteObjectId = string;
180 export type RemoteObjectType = 'object'|'undefined'|'string'|'number'|'boolean'|'bigint'|'array'|'null';
181
182
183 export interface RemoteObject {
184 type: RemoteObjectType;
185 className?: string;
186 value?: any;
187 description?: string;
188 objectId?: RemoteObjectId;
189 linearMemoryAddress?: number;
Philip Pfaffe1ae5c9d2022-09-20 09:40:52 +0000190 linearMemorySize?: number;
Philip Pfaffe6ed01262022-07-06 10:41:39 +0000191 hasChildren: boolean;
192 }
193
194 export interface PropertyDescriptor {
195 name: string;
196 value: RemoteObject;
197 }
198
Philip Pfaffe5df66262021-07-19 16:55:50 +0200199 export interface LanguageExtensionPlugin {
200 /**
201 * A new raw module has been loaded. If the raw wasm module references an external debug info module, its URL will be
202 * passed as symbolsURL.
203 */
Philip Pfaffeae1192b2022-06-02 13:08:03 +0000204 addRawModule(rawModuleId: string, symbolsURL: string|undefined, rawModule: RawModule):
205 Promise<string[]|{missingSymbolFiles: string[]}>;
Philip Pfaffe5df66262021-07-19 16:55:50 +0200206
207 /**
208 * Find locations in raw modules from a location in a source file.
209 */
210 sourceLocationToRawLocation(sourceLocation: SourceLocation): Promise<RawLocationRange[]>;
211
212 /**
213 * Find locations in source files from a location in a raw module.
214 */
215 rawLocationToSourceLocation(rawLocation: RawLocation): Promise<SourceLocation[]>;
216
217 /**
218 * Return detailed information about a scope.
219 */
220 getScopeInfo(type: string): Promise<ScopeInfo>;
221
222 /**
223 * List all variables in lexical scope at a given location in a raw module.
224 */
225 listVariablesInScope(rawLocation: RawLocation): Promise<Variable[]>;
226
227 /**
228 * Notifies the plugin that a script is removed.
229 */
230 removeRawModule(rawModuleId: string): Promise<void>;
231
232 /**
Philip Pfaffe889342a2022-07-08 06:18:47 +0000233 * DEPRECATED. Return type information for an expression. The result describes the type (and recursively its
234 * member types) of the result of the expression if it were evaluated in the given context.
235 * TODO(crbug.com/1342848) Remove.
Philip Pfaffe5df66262021-07-19 16:55:50 +0200236 */
237 getTypeInfo(expression: string, context: RawLocation): Promise<{
238 typeInfos: Array<TypeInfo>,
239 base: EvalBase,
240 }|null>;
241
242 /**
Philip Pfaffe889342a2022-07-08 06:18:47 +0000243 * DEPRECATED. Returns a piece of JavaScript code that, if evaluated, produces a representation of the given
244 * expression or field.
245 * TODO(crbug.com/1342848) Remove.
Philip Pfaffe5df66262021-07-19 16:55:50 +0200246 */
247 getFormatter(
248 expressionOrField: string|{
249 base: EvalBase,
250 field: Array<FieldInfo>,
251 },
252 context: RawLocation): Promise<{
253 js: string,
254 }|null>;
255
256 /**
Philip Pfaffe889342a2022-07-08 06:18:47 +0000257 * Evaluate a source language expression in the context of a given raw location and a given stopId. stopId is an
258 * opaque key that should be passed to the APIs accessing wasm state, e.g., getWasmLinearMemory. A stopId is
259 * invalidated once the debugger resumes.
260 * TODO(crbug.com/1342848) Make non-optional.
Philip Pfaffe6ed01262022-07-06 10:41:39 +0000261 */
Philip Pfaffe889342a2022-07-08 06:18:47 +0000262 evaluate?(expression: string, context: RawLocation, stopId: unknown): Promise<RemoteObject|null>;
Philip Pfaffe6ed01262022-07-06 10:41:39 +0000263
264 /**
Philip Pfaffe889342a2022-07-08 06:18:47 +0000265 * DEPRECATED. Returns a piece of JavaScript code that, if evaluated, produces the address of the given field in the wasm memory.
266 * TODO(crbug.com/1342848) Remove.
Philip Pfaffe5df66262021-07-19 16:55:50 +0200267 */
268 getInspectableAddress(field: {
269 base: EvalBase,
270 field: Array<FieldInfo>,
271 }): Promise<{
272 js: string,
273 }>;
274
275 /**
276 * Find locations in source files from a location in a raw module
277 */
Philip Pfaffeae1192b2022-06-02 13:08:03 +0000278 getFunctionInfo(rawLocation: RawLocation):
279 Promise<{frames: Array<FunctionInfo>}|{missingSymbolFiles: Array<string>}>;
Philip Pfaffe5df66262021-07-19 16:55:50 +0200280
281 /**
282 * Find locations in raw modules corresponding to the inline function
283 * that rawLocation is in. Used for stepping out of an inline function.
284 */
285 getInlinedFunctionRanges(rawLocation: RawLocation): Promise<RawLocationRange[]>;
286
287 /**
288 * Find locations in raw modules corresponding to inline functions
289 * called by the function or inline frame that rawLocation is in.
290 * Used for stepping over inline functions.
291 */
292 getInlinedCalleesRanges(rawLocation: RawLocation): Promise<RawLocationRange[]>;
293
294 /**
295 * Retrieve a list of line numbers in a file for which line-to-raw-location mappings exist.
296 */
297 getMappedLines(rawModuleId: string, sourceFileURL: string): Promise<number[]|undefined>;
Philip Pfaffe6ed01262022-07-06 10:41:39 +0000298
299 /**
300 * Retrieve properties of the remote object identified by the object id.
Philip Pfaffe889342a2022-07-08 06:18:47 +0000301 * TODO(crbug.com/1342848) Make non-optional.
Philip Pfaffe6ed01262022-07-06 10:41:39 +0000302 */
Philip Pfaffe889342a2022-07-08 06:18:47 +0000303 getProperties?(objectId: RemoteObjectId): Promise<PropertyDescriptor[]>;
Philip Pfaffe6ed01262022-07-06 10:41:39 +0000304 /**
305 * Permanently release the remote object identified by the object id.
Philip Pfaffe889342a2022-07-08 06:18:47 +0000306 * TODO(crbug.com/1342848) Make non-optional.
Philip Pfaffe6ed01262022-07-06 10:41:39 +0000307 */
Philip Pfaffe889342a2022-07-08 06:18:47 +0000308 releaseObject?(objectId: RemoteObjectId): Promise<void>;
Philip Pfaffe5df66262021-07-19 16:55:50 +0200309 }
310
311
312 export interface SupportedScriptTypes {
313 language: string;
314 symbol_types: string[];
315 }
316
Philip Pfaffe6ed01262022-07-06 10:41:39 +0000317 export type WasmValue = {type: 'i32'|'f32'|'f64', value: number}|{type: 'i64', value: bigint}|
318 {type: 'v128', value: string};
319
Philip Pfaffe5df66262021-07-19 16:55:50 +0200320 export interface LanguageExtensions {
321 registerLanguageExtensionPlugin(
322 plugin: LanguageExtensionPlugin, pluginName: string,
323 supportedScriptTypes: SupportedScriptTypes): Promise<void>;
324 unregisterLanguageExtensionPlugin(plugin: LanguageExtensionPlugin): Promise<void>;
Philip Pfaffe6ed01262022-07-06 10:41:39 +0000325
326 getWasmLinearMemory(offset: number, length: number, stopId: unknown): Promise<ArrayBuffer>;
327 getWasmLocal(local: number, stopId: unknown): Promise<WasmValue>;
328 getWasmGlobal(global: number, stopId: unknown): Promise<WasmValue>;
329 getWasmOp(op: number, stopId: unknown): Promise<WasmValue>;
Philip Pfaffe5df66262021-07-19 16:55:50 +0200330 }
331
Alex Rudenkoa3850822022-05-24 09:34:22 +0200332 export interface RecorderExtensions {
Alex Rudenko53dbba42022-06-02 15:01:23 +0200333 registerRecorderExtensionPlugin(plugin: RecorderExtensionPlugin, pluginName: string, mediaType: string):
Alex Rudenkofba45c52022-06-01 09:32:05 +0200334 Promise<void>;
Alex Rudenkoa3850822022-05-24 09:34:22 +0200335 unregisterRecorderExtensionPlugin(plugin: RecorderExtensionPlugin): Promise<void>;
336 }
337
Philip Pfaffe5df66262021-07-19 16:55:50 +0200338 export interface Chrome {
339 devtools: DevToolsAPI;
340 experimental: {devtools: ExperimentalDevToolsAPI};
341 }
342 }
343}
344
345declare global {
346 interface Window {
347 chrome: Chrome.DevTools.Chrome;
348 }
349}