@gjsify/devtools-cdp 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # @gjsify/devtools-cdp
2
+
3
+ A client for the **WebKit Remote Inspector Protocol** — the CDP-shaped (Chrome DevTools Protocol-shaped) JSON-RPC protocol that WebKitGTK speaks over a per-target WebSocket. It is the foundation for driving a real WebKitGTK page's deep devtools (Runtime / DOM / CSS / Network / Console / Debugger) from an agent over MCP — the deep-protocol companion to [`@gjsify/devtools-browser`](../devtools-browser)'s in-page-eval inspector tools.
4
+
5
+ > **CDP?** WebKit's protocol is *shaped like* Chrome's CDP (same domain/command/event structure, many identical names) but is **not** CDP — it's WebKit's own "Remote Inspector Protocol", with real differences (`DOM.getOuterHTML`, no `Page.navigate`, …). The `-cdp` name is the widely-recognized shorthand for "this family of protocols".
6
+
7
+ It ships three layers: the **transport-pure** protocol client + target discovery (usable standalone), the **in-app `DevtoolsExtension`** that exposes the protocol over the `org.gjsify.Devtools` control plane, and the **protocol→MCP tool generator**. The curated `cdpProfile` that registers those tools (driven by `gjsify debug --profile cdp`) lives in [`@gjsify/devtools-mcp`](../devtools-mcp), where zod lives.
8
+
9
+ ## Protocol client
10
+
11
+ ```ts
12
+ import { InspectorProtocolClient } from '@gjsify/devtools-cdp';
13
+
14
+ const client = new InspectorProtocolClient('ws://127.0.0.1:9222/socket/1/1/web-page');
15
+ await client.connect();
16
+ await client.enableDomains(['Inspector', 'Runtime', 'DOM', 'Console']);
17
+
18
+ const result = await client.send('Runtime.evaluate', { expression: '1 + 1', returnByValue: true });
19
+ // → { result: { type: 'number', value: 2 }, wasThrown: false }
20
+
21
+ client.on('Console.messageAdded', (params) => console.log('console:', params));
22
+ const events = client.drainEvents(); // poll buffered events (for a stateless MCP bridge)
23
+ client.close();
24
+ ```
25
+
26
+ - **`send(method, params?)`** — id-correlated request; resolves with the `result`, rejects with a `ProtocolError` on a protocol error or on timeout.
27
+ - **`on(method, cb)` / `awaitEvent(method, predicate?, timeoutMs?)`** — subscribe to pushed events.
28
+ - **`drainEvents()`** — return + clear a bounded ring buffer of events (the poll a request/response MCP transport uses for pushed notifications).
29
+ - **`enableDomains([...])`** — send `<Domain>.enable` for each (tolerates domains with no `enable`).
30
+
31
+ One client == one WebSocket == one target (WebKit has no session multiplexing). The client is written against a minimal `WebSocketLike` surface with an injectable factory, so it is **fully unit-testable headless** — and under GJS it uses the global `WebSocket` from [`@gjsify/websocket`](../../web/websocket) (libsoup).
32
+
33
+ ## Target discovery
34
+
35
+ WebKit's inspector HTTP server (enabled with `WEBKIT_INSPECTOR_HTTP_SERVER=host:port`) has **no `/json` endpoint** — `GET /` returns an HTML listing of `<a href="/socket/{conn}/{target}/{type}">` anchors. This package parses them:
36
+
37
+ ```ts
38
+ import { discoverInspectorTargets } from '@gjsify/devtools-cdp';
39
+
40
+ const targets = await discoverInspectorTargets(9222); // [{ connectionId, targetId, targetType, wsUrl, title }]
41
+ const page = targets.find((t) => t.targetType === 'web-page');
42
+ const client = new InspectorProtocolClient(page!.wsUrl);
43
+ ```
44
+
45
+ Targets only appear once a page has begun loading, so a caller racing startup should poll — an empty array is a valid "not ready yet". `parseInspectorTargetsHtml(html, host, port)` is the pure, exported core (`fetch` is injectable for tests).
46
+
47
+ ## In-app bridge
48
+
49
+ `inspectorProtocolExtension({ port })` returns a [`DevtoolsExtension`](../devtools) that adds four methods to the app's `org.gjsify.Devtools` control plane:
50
+
51
+ | DBus method | MCP-facing | Kind |
52
+ |---|---|---|
53
+ | `CdpDiscoverTargets()` | list inspectable targets | read-only |
54
+ | `CdpConnect(target_json)` | connect (defaults to the first `web-page`) + auto-`enable` Inspector/Runtime/DOM/Console | read-only |
55
+ | `CdpSend(method, params_json)` | the universal escape hatch to any `Domain.command` | mutating |
56
+ | `CdpDrainEvents()` | poll + clear buffered protocol events | read-only |
57
+
58
+ The WebSocket(s) live **in the app process** (one client per connected target, cached) — never in the MCP bridge — so the bridge runs no second GLib main loop; it just calls these DBus methods.
59
+
60
+ `@gjsify/devtools-browser` wires this in automatically: **`gjsify browse --inspector-port 9222 --devtools`** sets `WEBKIT_INSPECTOR_HTTP_SERVER=127.0.0.1:9222` before the WebView, marks the view inspectable, and adds the extension. Then **`gjsify debug --profile cdp`** bridges it to MCP — the `cdp_send` escape hatch + the curated typed tools.
61
+
62
+ ## Protocol spec + tool generation
63
+
64
+ The 27 WebKit protocol domains are embedded as a **pruned snapshot** in `src/spec-data.ts` (generated from `refs/webkit` by `scripts/generate-spec-data.mjs`), so the package needs no `refs/webkit` at runtime. `generateCdpTools(PROTOCOL_SPEC)` turns it into MCP-tool descriptors — one per command (248 of them):
65
+
66
+ ```ts
67
+ import { PROTOCOL_SPEC, generateCdpTools } from '@gjsify/devtools-cdp';
68
+
69
+ const tools = generateCdpTools(PROTOCOL_SPEC);
70
+ // [{ name: 'cdp_runtime_evaluate', method: 'Runtime.evaluate', domain, command,
71
+ // description, parameters: [{ name, jsType, optional, description, enum? }] }, …]
72
+
73
+ const curated = generateCdpTools(PROTOCOL_SPEC, { include: (d, c) => d === 'Runtime' && c === 'evaluate' });
74
+ ```
75
+
76
+ Each descriptor flattens the command's parameters to simplified JS types (`$ref` resolved one level to its base type) — no zod/MCP dependency here, so it stays pure + headless-testable. The curated `cdpProfile` (in `@gjsify/devtools-mcp`, where zod lives) turns these descriptors into registered MCP tools; regenerate the snapshot with `node scripts/generate-spec-data.mjs <protocolDir>` after a WebKit protocol bump.
77
+
78
+ ## Exports
79
+
80
+ - `InspectorProtocolClient`, `ProtocolError` (+ types `InspectorProtocolClientOptions`, `ProtocolEvent`, `ProtocolEventListener`, `WebSocketLike`, `WebSocketFactory`)
81
+ - `discoverInspectorTargets`, `parseInspectorTargetsHtml` (+ types `InspectorTarget`, `DiscoverInspectorTargetsOptions`)
82
+ - `inspectorProtocolExtension` (+ type `InspectorProtocolExtensionOptions`)
83
+ - `PROTOCOL_SPEC`, `PROTOCOL_SOURCE`, `buildTypeIndex`, `resolveRef` (+ protocol types `ProtocolDomain` / `ProtocolCommand` / `ProtocolType` / `ProtocolParameter`)
84
+ - `generateCdpTools`, `cdpToolName`, `snakeCase` (+ types `CdpToolDescriptor`, `CdpToolParam`, `CdpJsType`, `GenerateCdpToolsOptions`)
85
+
86
+ ## Build / test
87
+
88
+ ```bash
89
+ gjsify workspace @gjsify/devtools-cdp build
90
+ gjsify workspace @gjsify/devtools-cdp test
91
+ ```
92
+
93
+ 86 headless tests: `inspector-protocol-client.spec.ts` (mock WebSocket — id correlation, events, timeout, close), `target-discovery.spec.ts` (captured WebKit listing + injected fetch), `inspector-protocol-extension.spec.ts` (auto-replying mock WS driving the `Cdp*` handlers), `tool-generator.spec.ts` (fixture domain + the embedded spec).
@@ -0,0 +1 @@
1
+ var e=Object.defineProperty,__name=(t,n)=>e(t,`name`,{value:n,configurable:!0});export{__name};
@@ -0,0 +1 @@
1
+ import{InspectorProtocolClient as e,ProtocolError as t}from"./inspector-protocol-client.js";import{discoverInspectorTargets as n,parseInspectorTargetsHtml as r}from"./target-discovery.js";import{inspectorProtocolExtension as i}from"./inspector-protocol-extension.js";import{PROTOCOL_SOURCE as a,PROTOCOL_SPEC as o}from"./spec-data.js";import{buildTypeIndex as s,resolveRef as c}from"./protocol-spec.js";import{cdpToolName as l,generateCdpTools as u,snakeCase as d}from"./tool-generator.js";export{e as InspectorProtocolClient,a as PROTOCOL_SOURCE,o as PROTOCOL_SPEC,t as ProtocolError,s as buildTypeIndex,l as cdpToolName,n as discoverInspectorTargets,u as generateCdpTools,i as inspectorProtocolExtension,r as parseInspectorTargetsHtml,c as resolveRef,d as snakeCase};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";var ProtocolError=class extends Error{constructor(e,t){super(e),this.name=`ProtocolError`,this.code=t}};function defaultFactory(e){let t=globalThis.WebSocket;if(!t)throw Error(`InspectorProtocolClient: no global WebSocket — pass options.createWebSocket (GJS: register @gjsify/websocket)`);return new t(e)}var InspectorProtocolClient=class{constructor(e,t={}){this.ws=null,this.nextId=1,this.pending=new Map,this.listeners=new Map,this.eventBuffer=[],this.connectPromise=null,this.closed=!1,this.url=e,this.factory=t.createWebSocket??defaultFactory,this.maxBuffered=t.maxBufferedEvents??1e3,this.requestTimeoutMs=t.requestTimeoutMs??3e4}get connected(){return!this.closed&&this.ws!==null&&this.ws.readyState===1}connect(){return this.connectPromise||=new Promise((e,t)=>{let n=!1,r=this.factory(this.url);this.ws=r,r.addEventListener(`open`,()=>{n=!0,e()}),r.addEventListener(`message`,e=>this.onMessage(e.data)),r.addEventListener(`error`,e=>{n||(n=!0,t(Error(`InspectorProtocolClient: WebSocket error before open (${this.url})`))),this.failAllPending(e)}),r.addEventListener(`close`,e=>{n||(n=!0,t(Error(`InspectorProtocolClient: WebSocket closed before open (code ${e.code??`?`})`))),this.onClose()})}),this.connectPromise}send(e,t){if(this.closed)return Promise.reject(Error(`InspectorProtocolClient: client is closed`));if(!this.ws)return Promise.reject(Error(`InspectorProtocolClient: connect() not called`));let n=this.nextId++,r=JSON.stringify(t===void 0?{id:n,method:e}:{id:n,method:e,params:t});return new Promise((t,i)=>{let a=null;this.requestTimeoutMs>0&&(a=setTimeout(()=>{this.pending.delete(n),i(Error(`InspectorProtocolClient: "${e}" timed out after ${this.requestTimeoutMs}ms`))},this.requestTimeoutMs)),this.pending.set(n,{resolve:t,reject:i,timer:a});try{this.ws.send(r)}catch(e){this.pending.delete(n),a&&clearTimeout(a),i(e)}})}on(e,t){let n=this.listeners.get(e);return n||(n=new Set,this.listeners.set(e,n)),n.add(t),()=>this.off(e,t)}off(e,t){this.listeners.get(e)?.delete(t)}awaitEvent(e,t,n=this.requestTimeoutMs){return new Promise((r,i)=>{let a=null,o=this.on(e,e=>{t&&!t(e)||(a&&clearTimeout(a),o(),r(e))});n>0&&(a=setTimeout(()=>{o(),i(Error(`InspectorProtocolClient: awaitEvent("${e}") timed out after ${n}ms`))},n))})}async enableDomains(e){for(let t of e)try{await this.send(`${t}.enable`)}catch{}}drainEvents(){let e=this.eventBuffer.slice();return this.eventBuffer.length=0,e}close(){if(!this.closed){this.closed=!0;try{this.ws?.close()}catch{}this.onClose()}}onMessage(e){let t;try{t=JSON.parse(typeof e==`string`?e:String(e))}catch{return}if(typeof t.id==`number`){let e=this.pending.get(t.id);if(!e)return;if(this.pending.delete(t.id),e.timer&&clearTimeout(e.timer),t.error!==void 0){let{message:n,code:r}=normalizeError(t.error);e.reject(new ProtocolError(n,r))}else e.resolve(t.result);return}if(typeof t.method==`string`){let e={method:t.method,params:t.params};this.eventBuffer.push(e),this.eventBuffer.length>this.maxBuffered&&this.eventBuffer.shift();let n=this.listeners.get(t.method);if(n)for(let e of Array.from(n))e(t.params)}}onClose(){this.failAllPending(Error(`InspectorProtocolClient: connection closed`))}failAllPending(e){for(let[,t]of this.pending)t.timer&&clearTimeout(t.timer),t.reject(e instanceof Error?e:Error(`InspectorProtocolClient: socket error`));this.pending.clear()}};function normalizeError(e){return typeof e==`string`?{message:e}:{message:e.message??`protocol error`,code:e.code}}export{InspectorProtocolClient,ProtocolError};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{InspectorProtocolClient as e}from"./inspector-protocol-client.js";import{discoverInspectorTargets as t}from"./target-discovery.js";const n=[`Inspector`,`Runtime`,`DOM`,`Console`];function inspectorProtocolExtension(r){let{port:i}=r,a=r.host??`127.0.0.1`,o=r.autoEnableDomains??n,s=new Map,c=null,discover=()=>t(i,{host:a,fetchImpl:r.fetchImpl});async function resolveTarget(e){let t=e&&e.trim()?JSON.parse(e):null;if(t&&typeof t.wsUrl==`string`)return t;let n=await discover();if(t&&typeof t.targetId==`string`){let e=n.find(e=>e.targetId===t.targetId);if(e)return e}return n.find(e=>e.targetType===`web-page`)??n[0]}async function connect(t){let n=await resolveTarget(t);if(!n)return!1;let i=s.get(n.wsUrl);return i||(i=new e(n.wsUrl,{createWebSocket:r.createWebSocket}),s.set(n.wsUrl,i)),i.connected||(await i.connect(),await i.enableDomains(o)),c=n.wsUrl,!0}let currentClient=()=>c?s.get(c)??null:null;return{methodsXml:[`<method name="CdpDiscoverTargets"><arg type="s" direction="out" name="targets_json"/></method>`,`<method name="CdpConnect"><arg type="s" direction="in" name="target_json"/><arg type="b" direction="out" name="ok"/></method>`,`<method name="CdpSend"><arg type="s" direction="in" name="method"/><arg type="s" direction="in" name="params_json"/><arg type="s" direction="out" name="result_json"/></method>`,`<method name="CdpDrainEvents"><arg type="s" direction="out" name="events_json"/></method>`],handlers:{CdpDiscoverTargets:async()=>JSON.stringify(await discover(),null,2),CdpConnect:async e=>connect(e),CdpSend:async(e,t)=>{let n=currentClient();if(!n)throw Error(`CdpSend: not connected — call CdpConnect first`);let r=t&&t.trim()?JSON.parse(t):void 0,i=await n.send(e,r);return JSON.stringify(i??null,null,2)},CdpDrainEvents:()=>{let e=currentClient();return JSON.stringify(e?e.drainEvents():[],null,2)}},methodKinds:{CdpDiscoverTargets:`read-only`,CdpConnect:`read-only`,CdpSend:`mutating`,CdpDrainEvents:`read-only`},contributeStatus:()=>({inspector:{port:i,host:a,connected:currentClient()?.connected??!1,targetCount:s.size}})}}export{inspectorProtocolExtension};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{PROTOCOL_SOURCE as e,PROTOCOL_SPEC as t}from"./spec-data.js";function buildTypeIndex(e){let t=new Map;for(let n of e)for(let e of n.types??[])t.set(`${n.domain}.${e.id}`,e),t.has(e.id)||t.set(e.id,e);return t}function resolveRef(e,t,n){return e.includes(`.`)?n.get(e):n.get(`${t}.${e}`)??n.get(e)}export{e as PROTOCOL_SOURCE,t as PROTOCOL_SPEC,buildTypeIndex,resolveRef};
@@ -0,0 +1 @@
1
+ const e={generator:`scripts/generate-spec-data.mjs`,domains:27,commands:248},t=[{domain:`Animation`,types:[{id:`AnimationId`,type:`string`},{id:`AnimationState`,type:`string`,enum:[`ready`,`delayed`,`active`,`canceled`,`done`]},{id:`PlaybackDirection`,type:`string`,enum:[`normal`,`reverse`,`alternate`,`alternate-reverse`]},{id:`FillMode`,type:`string`,enum:[`none`,`forwards`,`backwards`,`both`,`auto`]},{id:`Animation`,type:`object`,properties:[{name:`animationId`,$ref:`AnimationId`},{name:`name`,type:`string`,optional:!0,description:"Equal to `Animation.prototype.get id`."},{name:`cssAnimationName`,type:`string`,optional:!0,description:"Equal to the corresponding `animation-name` CSS property. Should not be provided if `transitionProperty` is also provided."},{name:`cssTransitionProperty`,type:`string`,optional:!0,description:"Equal to the corresponding `transition-property` CSS property. Should not be provided if `animationName` is also provided."},{name:`stackTrace`,$ref:`Console.StackTrace`,optional:!0,description:"Backtrace that was captured when this `WebAnimation` was created."}]},{id:`Effect`,type:`object`,properties:[{name:`startDelay`,type:`number`,optional:!0},{name:`endDelay`,type:`number`,optional:!0},{name:`iterationCount`,type:`number`,optional:!0,description:`Number of iterations in the animation. <code>Infinity</code> is represented as <code>-1</code>.`},{name:`iterationStart`,type:`number`,optional:!0,description:`Index of which iteration to start at.`},{name:`iterationDuration`,type:`number`,optional:!0,description:`Total time of each iteration, measured in milliseconds.`},{name:`timingFunction`,type:`string`,optional:!0,description:`CSS timing function of the overall animation.`},{name:`playbackDirection`,$ref:`PlaybackDirection`,optional:!0},{name:`fillMode`,$ref:`FillMode`,optional:!0},{name:`keyframes`,type:`array`,optional:!0,items:{$ref:`Keyframe`}}]},{id:`Keyframe`,type:`object`,properties:[{name:`offset`,type:`number`,description:`Decimal percentage [0,1] representing where this keyframe is in the entire duration of the animation.`},{name:`easing`,type:`string`,optional:!0,description:"CSS timing function for how the `style` is applied."},{name:`style`,type:`string`,optional:!0,description:`CSS style declaration of the CSS properties that will be animated.`}]},{id:`TrackingUpdate`,type:`object`,properties:[{name:`trackingAnimationId`,$ref:`AnimationId`},{name:`animationState`,$ref:`AnimationState`},{name:`nodeId`,$ref:`DOM.NodeId`,optional:!0},{name:`animationName`,type:`string`,optional:!0,description:"Equal to the corresponding `animation-name` CSS property. Should not be provided if `transitionProperty` is also provided."},{name:`transitionProperty`,type:`string`,optional:!0,description:"Equal to the corresponding `transition-property` CSS property. Should not be provided if `animationName` is also provided."}]}],commands:[{name:`enable`,description:`Enables Canvas domain events.`},{name:`disable`,description:`Disables Canvas domain events.`},{name:`requestEffect`,description:"Gets the `Effect` for the animation with the given `AnimationId`.",parameters:[{name:`animationId`,$ref:`AnimationId`}],returns:[{name:`effect`,$ref:`Effect`,optional:!0,description:`This is omitted when there is no effect.`}]},{name:`requestEffectTarget`,description:"Gets the `DOM.NodeId` for the target of the effect of the animation with the given `AnimationId`.",parameters:[{name:`animationId`,$ref:`AnimationId`}],returns:[{name:`effectTarget`,$ref:`DOM.Styleable`}]},{name:`resolveAnimation`,description:"Resolves JavaScript `WebAnimation` object for given `AnimationId`.",parameters:[{name:`animationId`,$ref:`AnimationId`},{name:`objectGroup`,type:`string`,optional:!0,description:`Symbolic group name that can be used to release multiple objects.`}],returns:[{name:`object`,$ref:`Runtime.RemoteObject`}]},{name:`startTracking`,description:"Start tracking animations. This will produce a `trackingStart` event."},{name:`stopTracking`,description:"Stop tracking animations. This will produce a `trackingComplete` event."}]},{domain:`Audit`,commands:[{name:`setup`,description:"Creates the `WebInspectorAudit` object that is passed to run. Must call teardown before calling setup more than once.",parameters:[{name:`contextId`,$ref:`Runtime.ExecutionContextId`,optional:!0,description:`Specifies in which isolated context to run the test. Each content script lives in an isolated context and this parameter may be used to specify one of those contexts. If the parameter is omitted or 0 the evaluation will be performed in the context of the inspected page.`}]},{name:`run`,description:'Parses and evaluates the given test string and sends back the result. Returned values are saved to the "audit" object group. Call setup before and teardown after if the `WebInspectorAudit` object should be passed into the test.',parameters:[{name:`test`,type:`string`,description:`Test string to parse and evaluate.`},{name:`contextId`,$ref:`Runtime.ExecutionContextId`,optional:!0,description:`Specifies in which isolated context to run the test. Each content script lives in an isolated context and this parameter may be used to specify one of those contexts. If the parameter is omitted or 0 the evaluation will be performed in the context of the inspected page.`}],returns:[{name:`result`,$ref:`Runtime.RemoteObject`,description:`Evaluation result.`},{name:`wasThrown`,type:`boolean`,optional:!0,description:`True if the result was thrown during the evaluation.`}]},{name:`teardown`,description:"Destroys the `WebInspectorAudit` object that is passed to run. Must call setup before calling teardown."}]},{domain:`Browser`,types:[{id:`ExtensionId`,type:`string`},{id:`Extension`,type:`object`,properties:[{name:`extensionId`,$ref:`ExtensionId`,description:`Extension identifier.`},{name:`name`,type:`string`,description:`The display name for the extension.`}]}],commands:[{name:`enable`,description:`Enables Browser domain events.`},{name:`disable`,description:`Disables Browser domain events.`}]},{domain:`CPUProfiler`,types:[{id:`ThreadInfo`,type:`object`,properties:[{name:`name`,type:`string`,description:`Some thread identification information.`},{name:`usage`,type:`number`,description:`CPU usage for this thread. This should not exceed 100% for an individual thread.`},{name:`type`,type:`string`,optional:!0,enum:[`main`,`webkit`],description:`Type of thread. There should be a single main thread.`},{name:`targetId`,type:`string`,optional:!0,description:`A thread may be associated with a target, such as a Worker, in the process.`}]},{id:`Event`,type:`object`,properties:[{name:`timestamp`,type:`number`},{name:`usage`,type:`number`,description:`Percent of total cpu usage. If there are multiple cores the usage may be greater than 100%.`},{name:`threads`,type:`array`,optional:!0,items:{$ref:`ThreadInfo`},description:`Per-thread CPU usage information. Does not include the main thread.`}]}],commands:[{name:`startTracking`,description:`Start tracking cpu usage.`},{name:`stopTracking`,description:"Stop tracking cpu usage. This will produce a `trackingComplete` event."}]},{domain:`CSS`,types:[{id:`StyleSheetId`,type:`string`},{id:`CSSStyleId`,type:`object`,properties:[{name:`styleSheetId`,$ref:`StyleSheetId`,description:`Enclosing stylesheet identifier.`},{name:`ordinal`,type:`integer`,description:`The style ordinal within the stylesheet.`}]},{id:`StyleSheetOrigin`,type:`string`,enum:[`user`,`user-agent`,`author`,`inspector`]},{id:`CSSRuleId`,type:`object`,properties:[{name:`styleSheetId`,$ref:`StyleSheetId`,description:`Enclosing stylesheet identifier.`},{name:`ordinal`,type:`integer`,description:`The rule ordinal within the stylesheet.`}]},{id:`PseudoId`,type:`string`,enum:`first-line.first-letter.grammar-error.highlight.marker.before.after.selection.backdrop.spelling-error.target-text.checkmark.picker-icon.slider-fill.slider-thumb.slider-track.view-transition.view-transition-group.view-transition-image-pair.view-transition-old.view-transition-new.-webkit-scrollbar.-webkit-resizer.-webkit-scrollbar-thumb.-webkit-scrollbar-button.-webkit-scrollbar-track.-webkit-scrollbar-track-piece.-webkit-scrollbar-corner`.split(`.`)},{id:`ForceablePseudoClass`,type:`string`,enum:[`active`,`focus`,`focus-visible`,`focus-within`,`hover`,`target`,`visited`]},{id:`PseudoIdMatches`,type:`object`,properties:[{name:`pseudoId`,$ref:`PseudoId`},{name:`matches`,type:`array`,items:{$ref:`RuleMatch`},description:`Matches of CSS rules applicable to the pseudo style.`}]},{id:`InheritedStyleEntry`,type:`object`,properties:[{name:`inlineStyle`,$ref:`CSSStyle`,optional:!0,description:`The ancestor node's inline style, if any, in the style inheritance chain.`},{name:`matchedCSSRules`,type:`array`,items:{$ref:`RuleMatch`},description:`Matches of CSS rules matching the ancestor node in the style inheritance chain.`}]},{id:`RuleMatch`,type:`object`,properties:[{name:`rule`,$ref:`CSSRule`,description:`CSS rule in the match.`},{name:`matchingSelectors`,type:`array`,items:{type:`integer`},description:`Matching selector indices in the rule's selectorList selectors (0-based).`}]},{id:`CSSSelector`,type:`object`,properties:[{name:`text`,type:`string`,description:`Canonicalized selector text.`},{name:`specificity`,type:`array`,optional:!0,items:{type:`integer`},description:`Specificity (a, b, c) tuple. Included if the selector is sent in response to CSS.getMatchedStylesForNode which provides a context element.`},{name:`dynamic`,type:`boolean`,optional:!0,description:`Whether or not the specificity can be dynamic. Included if the selector is sent in response to CSS.getMatchedStylesForNode which provides a context element.`}]},{id:`SelectorList`,type:`object`,properties:[{name:`selectors`,type:`array`,items:{$ref:`CSSSelector`},description:`Selectors in the list.`},{name:`text`,type:`string`,description:`Rule selector text.`},{name:`range`,$ref:`SourceRange`,optional:!0,description:`Rule selector range in the underlying resource (if available).`}]},{id:`CSSStyleAttribute`,type:`object`,properties:[{name:`name`,type:`string`,description:`DOM attribute name (e.g. "width").`},{name:`style`,$ref:`CSSStyle`,description:`CSS style generated by the respective DOM attribute.`}]},{id:`CSSStyleSheetHeader`,type:`object`,properties:[{name:`styleSheetId`,$ref:`StyleSheetId`,description:`The stylesheet identifier.`},{name:`frameId`,$ref:`Network.FrameId`,description:`Owner frame identifier.`},{name:`sourceURL`,type:`string`,description:`Stylesheet resource URL.`},{name:`origin`,$ref:`StyleSheetOrigin`,description:`Stylesheet origin.`},{name:`title`,type:`string`,description:`Stylesheet title.`},{name:`disabled`,type:`boolean`,description:`Denotes whether the stylesheet is disabled.`},{name:`isInline`,type:`boolean`,description:`Whether this stylesheet is a <style> tag created by the parser. This is not set for document.written <style> tags.`},{name:`startLine`,type:`number`,description:`Line offset of the stylesheet within the resource (zero based).`},{name:`startColumn`,type:`number`,description:`Column offset of the stylesheet within the resource (zero based).`}]},{id:`CSSStyleSheetBody`,type:`object`,properties:[{name:`styleSheetId`,$ref:`StyleSheetId`,description:`The stylesheet identifier.`},{name:`rules`,type:`array`,items:{$ref:`CSSRule`},description:`Stylesheet resource URL.`},{name:`text`,type:`string`,optional:!0,description:`Stylesheet resource contents (if available).`}]},{id:`CSSRule`,type:`object`,properties:[{name:`ruleId`,$ref:`CSSRuleId`,optional:!0,description:`The CSS rule identifier (absent for user agent stylesheet and user-specified stylesheet rules).`},{name:`selectorList`,$ref:`SelectorList`,description:`Rule selector data.`},{name:`sourceURL`,type:`string`,optional:!0,description:`Parent stylesheet resource URL (for regular rules).`},{name:`sourceLine`,type:`integer`,description:`Line ordinal of the rule selector start character in the resource.`},{name:`origin`,$ref:`StyleSheetOrigin`,description:`Parent stylesheet's origin.`},{name:`style`,$ref:`CSSStyle`,description:`Associated style declaration.`},{name:`groupings`,type:`array`,optional:!0,items:{$ref:`Grouping`},description:`Grouping list array (for rules involving @media/@supports). The array enumerates CSS groupings starting with the innermost one, going outwards.`},{name:`isImplicitlyNested`,type:`boolean`,optional:!0,description:`<code>true</code> if this style is for a rule implicitly wrapping properties declared inside of CSSGrouping.`}]},{id:`SourceRange`,type:`object`,properties:[{name:`startLine`,type:`integer`,description:`Start line of range.`},{name:`startColumn`,type:`integer`,description:`Start column of range (inclusive).`},{name:`endLine`,type:`integer`,description:`End line of range`},{name:`endColumn`,type:`integer`,description:`End column of range (exclusive).`}]},{id:`ShorthandEntry`,type:`object`,properties:[{name:`name`,type:`string`,description:`Shorthand name.`},{name:`value`,type:`string`,description:`Shorthand value.`}]},{id:`CSSPropertyInfo`,type:`object`,properties:[{name:`name`,type:`string`,description:`Property name.`},{name:`aliases`,type:`array`,optional:!0,items:{type:`string`},description:`Other names for this property.`},{name:`longhands`,type:`array`,optional:!0,items:{type:`string`},description:`Longhand property names.`},{name:`values`,type:`array`,optional:!0,items:{type:`string`},description:`Supported values for this property.`},{name:`inherited`,type:`boolean`,optional:!0,description:`Whether the property is able to be inherited.`}]},{id:`CSSComputedStyleProperty`,type:`object`,properties:[{name:`name`,type:`string`,description:`Computed style property name.`},{name:`value`,type:`string`,description:`Computed style property value.`}]},{id:`CSSStyle`,type:`object`,properties:[{name:`styleId`,$ref:`CSSStyleId`,optional:!0,description:`The CSS style identifier (absent for attribute styles).`},{name:`cssProperties`,type:`array`,items:{$ref:`CSSProperty`},description:`CSS properties in the style.`},{name:`shorthandEntries`,type:`array`,items:{$ref:`ShorthandEntry`},description:`Computed values for all shorthands found in the style.`},{name:`cssText`,type:`string`,optional:!0,description:`Style declaration text (if available).`},{name:`range`,$ref:`SourceRange`,optional:!0,description:`Style declaration range in the enclosing stylesheet (if available).`},{name:`width`,type:`string`,optional:!0,description:`The effective "width" property value from this style.`},{name:`height`,type:`string`,optional:!0,description:`The effective "height" property value from this style.`}]},{id:`CSSPropertyStatus`,type:`string`,enum:[`active`,`inactive`,`disabled`,`style`]},{id:`CSSProperty`,type:`object`,properties:[{name:`name`,type:`string`,description:`The property name.`},{name:`value`,type:`string`,description:`The property value.`},{name:`priority`,type:`string`,optional:!0,description:`The property priority (implies "" if absent).`},{name:`implicit`,type:`boolean`,optional:!0,description:`Whether the property is implicit (implies <code>false</code> if absent).`},{name:`text`,type:`string`,optional:!0,description:`The full property text as specified in the style.`},{name:`parsedOk`,type:`boolean`,optional:!0,description:`Whether the property is understood by the browser (implies <code>true</code> if absent).`},{name:`status`,$ref:`CSSPropertyStatus`,optional:!0,description:`Whether the property is active or disabled.`},{name:`range`,$ref:`SourceRange`,optional:!0,description:`The entire property range in the enclosing style declaration (if available).`}]},{id:`Grouping`,type:`object`,properties:[{name:`type`,type:`string`,enum:[`media-rule`,`media-import-rule`,`media-link-node`,`media-style-node`,`supports-rule`,`layer-rule`,`layer-import-rule`,`container-rule`,`scope-rule`,`starting-style-rule`,`style-rule`],description:`Source of the media query: "media-rule" if specified by a @media rule, "media-import-rule" if specified by an @import rule, "media-link-node" if specified by a "media" attribute in a linked style sheet's LINK tag, "media-style-node" if specified by a "media" attribute in an inline style sheet's STYLE tag, "supports-rule" if specified by an @supports rule, "layer-rule" if specified by an @layer rule, "container-rule" if specified by an @container rule, "scope-rule" if specified by a @scope rule, "starting-style-rule" if specified by a @starting-style rule, "style-rule" if specified by a CSSStyleRule containing the rule inside this grouping.`},{name:`ruleId`,$ref:`CSSRuleId`,optional:!0,description:"The CSS rule identifier for the `@rule` (absent for non-editable grouping rules) or the nesting parent style rule's selector. In CSSOM terms, this is the parent rule of either the previous Grouping for a CSSRule, or of a CSSRule itself."},{name:`text`,type:`string`,optional:!0,description:`Query text if specified by a @media, @supports, or @container rule. Layer name (or not present for anonymous layers) for @layer rules.`},{name:`sourceURL`,type:`string`,optional:!0,description:`URL of the document containing the CSS grouping.`},{name:`range`,$ref:`SourceRange`,optional:!0,description:`@-rule's header text range in the enclosing stylesheet (if available). This is from the first non-whitespace character after the @ declarartion to the last non-whitespace character before an opening curly bracket or semicolon.`}]},{id:`Font`,type:`object`,properties:[{name:`displayName`,type:`string`,description:`The display name defined by the font.`},{name:`variationAxes`,type:`array`,items:{$ref:`FontVariationAxis`},description:`The variation axes defined by the font.`},{name:`synthesizedBold`,type:`boolean`,optional:!0,description:`Whether the font has synthesized its boldness or not.`},{name:`synthesizedOblique`,type:`boolean`,optional:!0,description:`Whether the font has synthesized its obliqueness or not`}]},{id:`FontVariationAxis`,type:`object`,properties:[{name:`name`,type:`string`,optional:!0,description:`The name, generally human-readable, of the variation axis. Some axes may not provide a human-readable name distiguishable from the tag. This field is ommited when there is no name, or the name matches the tag exactly.`},{name:`tag`,type:`string`,description:`The four character tag for the variation axis.`},{name:`minimumValue`,type:`number`,description:`The minimum value that will affect the axis.`},{name:`maximumValue`,type:`number`,description:`The maximum value that will affect the axis.`},{name:`defaultValue`,type:`number`,description:`The value that is used for the axis when it is not otherwise controlled.`}]},{id:`LayoutFlag`,type:`string`,enum:[`rendered`,`scrollable`,`flex`,`grid`,`subgrid`,`grid-lanes`,`event`,`slot-assigned`,`slot-filled`]},{id:`LayoutContextTypeChangedMode`,type:`string`,enum:[`observed`,`all`]}],commands:[{name:`enable`,description:`Enables the CSS agent for the given page. Clients should not assume that the CSS agent has been enabled until the result of this command is received.`},{name:`disable`,description:`Disables the CSS agent for the given page.`},{name:`getMatchedStylesForNode`,description:`Returns requested styles for a DOM node identified by <code>nodeId</code>.`,parameters:[{name:`nodeId`,$ref:`DOM.NodeId`},{name:`includePseudo`,type:`boolean`,optional:!0,description:`Whether to include pseudo styles (default: true).`},{name:`includeInherited`,type:`boolean`,optional:!0,description:`Whether to include inherited styles (default: true).`}],returns:[{name:`matchedCSSRules`,type:`array`,optional:!0,items:{$ref:`RuleMatch`},description:`CSS rules matching this node, from all applicable stylesheets.`},{name:`pseudoElements`,type:`array`,optional:!0,items:{$ref:`PseudoIdMatches`},description:`Pseudo style matches for this node.`},{name:`inherited`,type:`array`,optional:!0,items:{$ref:`InheritedStyleEntry`},description:`A chain of inherited styles (from the immediate node parent up to the DOM tree root).`}]},{name:`getInlineStylesForNode`,description:`Returns the styles defined inline (explicitly in the "style" attribute and implicitly, using DOM attributes) for a DOM node identified by <code>nodeId</code>.`,parameters:[{name:`nodeId`,$ref:`DOM.NodeId`}],returns:[{name:`inlineStyle`,$ref:`CSSStyle`,optional:!0,description:`Inline style for the specified DOM node.`},{name:`attributesStyle`,$ref:`CSSStyle`,optional:!0,description:`Attribute-defined element style (e.g. resulting from "width=20 height=100%").`}]},{name:`getComputedStyleForNode`,description:`Returns the computed style for a DOM node identified by <code>nodeId</code>.`,parameters:[{name:`nodeId`,$ref:`DOM.NodeId`}],returns:[{name:`computedStyle`,type:`array`,items:{$ref:`CSSComputedStyleProperty`},description:`Computed style for the specified DOM node.`}]},{name:`getFontDataForNode`,description:`Returns the primary font of the computed font cascade for a DOM node identified by <code>nodeId</code>.`,parameters:[{name:`nodeId`,$ref:`DOM.NodeId`}],returns:[{name:`primaryFont`,$ref:`Font`,description:`Computed primary font for the specified DOM node.`}]},{name:`getAllStyleSheets`,description:`Returns metainfo entries for all known stylesheets.`,returns:[{name:`headers`,type:`array`,items:{$ref:`CSSStyleSheetHeader`},description:`Descriptor entries for all available stylesheets.`}]},{name:`getStyleSheet`,description:`Returns stylesheet data for the specified <code>styleSheetId</code>.`,parameters:[{name:`styleSheetId`,$ref:`StyleSheetId`}],returns:[{name:`styleSheet`,$ref:`CSSStyleSheetBody`,description:`Stylesheet contents for the specified <code>styleSheetId</code>.`}]},{name:`getStyleSheetText`,description:`Returns the current textual content and the URL for a stylesheet.`,parameters:[{name:`styleSheetId`,$ref:`StyleSheetId`}],returns:[{name:`text`,type:`string`,description:`The stylesheet text.`}]},{name:`setStyleSheetText`,description:`Sets the new stylesheet text, thereby invalidating all existing <code>CSSStyleId</code>'s and <code>CSSRuleId</code>'s contained by this stylesheet.`,parameters:[{name:`styleSheetId`,$ref:`StyleSheetId`},{name:`text`,type:`string`}]},{name:`setStyleText`,description:`Sets the new <code>text</code> for the respective style.`,parameters:[{name:`styleId`,$ref:`CSSStyleId`},{name:`text`,type:`string`}],returns:[{name:`style`,$ref:`CSSStyle`,description:`The resulting style after the text modification.`}]},{name:`setRuleSelector`,description:`Modifies the rule selector.`,parameters:[{name:`ruleId`,$ref:`CSSRuleId`},{name:`selector`,type:`string`}],returns:[{name:`rule`,$ref:`CSSRule`,description:`The resulting rule after the selector modification.`}]},{name:`setGroupingHeaderText`,description:`Modifies an @rule grouping's header text.`,parameters:[{name:`ruleId`,$ref:`CSSRuleId`},{name:`headerText`,type:`string`}],returns:[{name:`grouping`,$ref:`Grouping`,description:`The resulting grouping after the header text modification.`}]},{name:`createStyleSheet`,description:`Creates a new special "inspector" stylesheet in the frame with given <code>frameId</code>.`,parameters:[{name:`frameId`,$ref:`Network.FrameId`,description:`Identifier of the frame where the new "inspector" stylesheet should be created. Ignored when dispatched to a FrameTarget; the receiving frame is used implicitly.`}],returns:[{name:`styleSheetId`,$ref:`StyleSheetId`,description:`Identifier of the created "inspector" stylesheet.`}]},{name:`addRule`,description:`Creates a new empty rule with the given <code>selector</code> in a stylesheet with given <code>styleSheetId</code>.`,parameters:[{name:`styleSheetId`,$ref:`StyleSheetId`},{name:`selector`,type:`string`}],returns:[{name:`rule`,$ref:`CSSRule`,description:`The newly created rule.`}]},{name:`getSupportedCSSProperties`,description:`Returns all supported CSS property names.`,returns:[{name:`cssProperties`,type:`array`,items:{$ref:`CSSPropertyInfo`},description:`Supported property metainfo.`}]},{name:`getSupportedSystemFontFamilyNames`,description:`Returns all supported system font family names.`,returns:[{name:`fontFamilyNames`,type:`array`,items:{type:`string`},description:`Supported system font families.`}]},{name:`forcePseudoState`,description:`Ensures that the given node will have specified pseudo-classes whenever its style is computed by the browser.`,parameters:[{name:`nodeId`,$ref:`DOM.NodeId`,description:`The element id for which to force the pseudo state.`},{name:`forcedPseudoClasses`,type:`array`,items:{$ref:`ForceablePseudoClass`},description:`Element pseudo classes to force when computing the element's style.`}]},{name:`setLayoutContextTypeChangedMode`,description:`Change how layout context type changes are handled for nodes. When the new mode would observe nodes the frontend has not yet recieved, those nodes will be sent to the frontend immediately.`,parameters:[{name:`mode`,$ref:`LayoutContextTypeChangedMode`,description:`The mode for how layout context type changes are handled.`}]}]},{domain:`Canvas`,types:[{id:`CanvasId`,type:`string`},{id:`ProgramId`,type:`string`},{id:`ColorSpace`,type:`string`,enum:[`srgb`,`srgb-linear`,`display-p3`,`display-p3-linear`]},{id:`ContextType`,type:`string`,enum:[`canvas-2d`,`offscreen-canvas-2d`,`bitmaprenderer`,`offscreen-bitmaprenderer`,`webgl`,`offscreen-webgl`,`webgl2`,`offscreen-webgl2`]},{id:`ProgramType`,type:`string`,enum:[`compute`,`render`]},{id:`ShaderType`,type:`string`,enum:[`compute`,`fragment`,`vertex`]},{id:`ContextAttributes`,type:`object`,properties:[{name:`alpha`,type:`boolean`,optional:!0,description:`WebGL, WebGL2, ImageBitmapRenderingContext`},{name:`colorSpace`,$ref:`ColorSpace`,optional:!0,description:`2D`},{name:`desynchronized`,type:`boolean`,optional:!0,description:`2D`},{name:`willReadFrequently`,type:`boolean`,optional:!0,description:`2D`},{name:`depth`,type:`boolean`,optional:!0,description:`WebGL, WebGL2`},{name:`stencil`,type:`boolean`,optional:!0,description:`WebGL, WebGL2`},{name:`antialias`,type:`boolean`,optional:!0,description:`WebGL, WebGL2`},{name:`premultipliedAlpha`,type:`boolean`,optional:!0,description:`WebGL, WebGL2`},{name:`preserveDrawingBuffer`,type:`boolean`,optional:!0,description:`WebGL, WebGL2`},{name:`failIfMajorPerformanceCaveat`,type:`boolean`,optional:!0,description:`WebGL, WebGL2`},{name:`powerPreference`,type:`string`,optional:!0,description:`WebGL, WebGL2`}]},{id:`Canvas`,type:`object`,properties:[{name:`canvasId`,$ref:`CanvasId`,description:`Canvas identifier.`},{name:`contextType`,$ref:`ContextType`,description:`The type of rendering context backing the canvas.`},{name:`width`,type:`number`,description:`Width of the canvas in pixels.`},{name:`height`,type:`number`,description:`Height of the canvas in pixels.`},{name:`nodeId`,$ref:`DOM.NodeId`,optional:!0,description:`The corresponding DOM node id.`},{name:`cssCanvasName`,type:`string`,optional:!0,description:`The CSS canvas identifier, for canvases created with <code>document.getCSSCanvasContext</code>.`},{name:`contextAttributes`,$ref:`ContextAttributes`,optional:!0,description:`Context attributes for rendering contexts.`},{name:`memoryCost`,type:`number`,optional:!0,description:`Memory usage of the canvas in bytes.`},{name:`stackTrace`,$ref:`Console.StackTrace`,optional:!0,description:`Backtrace that was captured when this canvas context was created.`}]},{id:`ShaderProgram`,type:`object`,properties:[{name:`programId`,$ref:`ProgramId`},{name:`programType`,$ref:`ProgramType`},{name:`canvasId`,$ref:`CanvasId`}]}],commands:[{name:`enable`,description:`Enables Canvas domain events.`},{name:`disable`,description:`Disables Canvas domain events.`},{name:`requestNode`,description:`Gets the NodeId for the canvas node with the given CanvasId.`,parameters:[{name:`canvasId`,$ref:`CanvasId`,description:`Canvas identifier.`}],returns:[{name:`nodeId`,$ref:`DOM.NodeId`,description:`Node identifier for given canvas.`}]},{name:`requestContent`,description:`Gets the data for the canvas node with the given CanvasId.`,parameters:[{name:`canvasId`,$ref:`CanvasId`,description:`Canvas identifier.`}],returns:[{name:`content`,type:`string`,description:`Base64-encoded data of the canvas' contents.`}]},{name:`requestClientNodes`,description:`Gets all <code>-webkit-canvas</code> nodes or active <code>HTMLCanvasElement</code> for a <code>WebGPUDevice</code>.`,parameters:[{name:`canvasId`,$ref:`CanvasId`}],returns:[{name:`clientNodeIds`,type:`array`,items:{$ref:`DOM.NodeId`}}]},{name:`resolveContext`,description:`Resolves JavaScript canvas/device context object for given canvasId.`,parameters:[{name:`canvasId`,$ref:`CanvasId`,description:`Canvas identifier.`},{name:`objectGroup`,type:`string`,optional:!0,description:`Symbolic group name that can be used to release multiple objects.`}],returns:[{name:`object`,$ref:`Runtime.RemoteObject`,description:`JavaScript object wrapper for given canvas context.`}]},{name:`setRecordingAutoCaptureFrameCount`,description:"Tells the backend to record `count` frames whenever a new context is created.",parameters:[{name:`count`,type:`integer`,description:`Number of frames to record (0 means don't record anything).`}]},{name:`startRecording`,description:`Record the next frame, or up to the given number of bytes of data, for the given canvas.`,parameters:[{name:`canvasId`,$ref:`CanvasId`},{name:`frameCount`,type:`integer`,optional:!0,description:`Number of frames to record (unlimited when not specified).`},{name:`memoryLimit`,type:`integer`,optional:!0,description:`Memory limit of recorded data (100MB when not specified).`}]},{name:`stopRecording`,description:`Stop recording the given canvas.`,parameters:[{name:`canvasId`,$ref:`CanvasId`}]},{name:`requestShaderSource`,description:`Requests the source of the shader of the given type from the program with the given id.`,parameters:[{name:`programId`,$ref:`ProgramId`},{name:`shaderType`,$ref:`ShaderType`}],returns:[{name:`source`,type:`string`}]},{name:`updateShader`,description:`Compiles and links the shader with identifier and type with the given source code.`,parameters:[{name:`programId`,$ref:`ProgramId`},{name:`shaderType`,$ref:`ShaderType`},{name:`source`,type:`string`}]},{name:`setShaderProgramDisabled`,description:`Enable/disable the visibility of the given shader program.`,parameters:[{name:`programId`,$ref:`ProgramId`},{name:`disabled`,type:`boolean`}]},{name:`setShaderProgramHighlighted`,description:`Enable/disable highlighting of the given shader program.`,parameters:[{name:`programId`,$ref:`ProgramId`},{name:`highlighted`,type:`boolean`}]}]},{domain:`Console`,types:[{id:`ChannelSource`,type:`string`,enum:[`xml`,`javascript`,`network`,`console-api`,`storage`,`rendering`,`css`,`accessibility`,`security`,`content-blocker`,`media`,`mediasource`,`webrtc`,`itp-debug`,`private-click-measurement`,`payment-request`,`other`]},{id:`ChannelLevel`,type:`string`,enum:[`off`,`basic`,`verbose`]},{id:`ClearReason`,type:`string`,enum:[`console-api`,`frontend`,`main-frame-navigation`]},{id:`Channel`,type:`object`,properties:[{name:`source`,$ref:`ChannelSource`},{name:`level`,$ref:`ChannelLevel`}]},{id:`ConsoleMessage`,type:`object`,properties:[{name:`source`,$ref:`ChannelSource`},{name:`level`,type:`string`,enum:[`log`,`info`,`warning`,`error`,`debug`],description:`Message severity.`},{name:`text`,type:`string`,description:`Message text.`},{name:`type`,type:`string`,optional:!0,enum:[`log`,`dir`,`dirxml`,`table`,`trace`,`clear`,`startGroup`,`startGroupCollapsed`,`endGroup`,`assert`,`timing`,`profile`,`profileEnd`,`image`],description:`Console message type.`},{name:`url`,type:`string`,optional:!0,description:`URL of the message origin.`},{name:`line`,type:`integer`,optional:!0,description:`Line number in the resource that generated this message.`},{name:`column`,type:`integer`,optional:!0,description:`Column number on the line in the resource that generated this message.`},{name:`repeatCount`,type:`integer`,optional:!0,description:`Repeat count for repeated messages.`},{name:`parameters`,type:`array`,optional:!0,items:{$ref:`Runtime.RemoteObject`},description:`Message parameters in case of the formatted message.`},{name:`stackTrace`,$ref:`StackTrace`,optional:!0,description:`JavaScript stack trace for assertions and error messages.`},{name:`networkRequestId`,$ref:`Network.RequestId`,optional:!0,description:`Identifier of the network request associated with this message.`},{name:`timestamp`,type:`number`,optional:!0,description:`Time when this message was added. Currently only used when an expensive operation happens to make sure that the frontend can account for it.`}]},{id:`CallFrame`,type:`object`,properties:[{name:`functionName`,type:`string`,description:`JavaScript function name.`},{name:`url`,type:`string`,description:`JavaScript script name or url.`},{name:`scriptId`,$ref:`Debugger.ScriptId`,description:`Script identifier.`},{name:`lineNumber`,type:`integer`,description:`JavaScript script line number.`},{name:`columnNumber`,type:`integer`,description:`JavaScript script column number.`}]},{id:`StackTrace`,type:`object`,properties:[{name:`callFrames`,type:`array`,items:{$ref:`CallFrame`}},{name:`topCallFrameIsBoundary`,type:`boolean`,optional:!0,description:`Whether the first item in <code>callFrames</code> is the native function that scheduled the asynchronous operation (e.g. setTimeout).`},{name:`truncated`,type:`boolean`,optional:!0,description:`Whether one or more frames have been truncated from the bottom of the stack.`},{name:`parentStackTrace`,$ref:`StackTrace`,optional:!0,description:`Parent StackTrace.`}]}],commands:[{name:`enable`,description:`Enables console domain, sends the messages collected so far to the client by means of the <code>messageAdded</code> notification.`},{name:`disable`,description:`Disables console domain, prevents further console messages from being reported to the client.`},{name:`clearMessages`,description:`Clears console messages collected in the browser.`},{name:`setConsoleClearAPIEnabled`,description:`Control whether calling <code>console.clear()</code> has an effect in Web Inspector. Defaults to true.`,parameters:[{name:`enable`,type:`boolean`}]},{name:`getLoggingChannels`,description:`List of the different message sources that are non-default logging channels.`,returns:[{name:`channels`,type:`array`,items:{$ref:`Channel`},description:`Logging channels.`}]},{name:`setLoggingChannelLevel`,description:`Modify the level of a channel.`,parameters:[{name:`source`,$ref:`ChannelSource`,description:`Logging channel to modify.`},{name:`level`,$ref:`ChannelLevel`,description:`New level.`}]}]},{domain:`DOM`,types:[{id:`NodeId`,type:`integer`},{id:`EventListenerId`,type:`integer`},{id:`PseudoType`,type:`string`,enum:[`before`,`after`]},{id:`ShadowRootType`,type:`string`,enum:[`user-agent`,`open`,`closed`]},{id:`CustomElementState`,type:`string`,enum:[`builtin`,`custom`,`waiting`,`failed`]},{id:`LiveRegionRelevant`,type:`string`,enum:[`additions`,`removals`,`text`]},{id:`Node`,type:`object`,properties:[{name:`nodeId`,$ref:`NodeId`,description:`Node identifier that is passed into the rest of the DOM messages as the <code>nodeId</code>. Backend will only push node with given <code>id</code> once. It is aware of all requested nodes and will only fire DOM events for nodes known to the client.`},{name:`nodeType`,type:`integer`,description:`<code>Node</code>'s nodeType.`},{name:`nodeName`,type:`string`,description:`<code>Node</code>'s nodeName.`},{name:`localName`,type:`string`,description:`<code>Node</code>'s localName.`},{name:`nodeValue`,type:`string`,description:`<code>Node</code>'s nodeValue.`},{name:`frameId`,$ref:`Network.FrameId`,optional:!0,description:`Identifier of the containing frame.`},{name:`childNodeCount`,type:`integer`,optional:!0,description:`Child count for <code>Container</code> nodes.`},{name:`children`,type:`array`,optional:!0,items:{$ref:`Node`},description:`Child nodes of this node when requested with children.`},{name:`attributes`,type:`array`,optional:!0,items:{type:`string`},description:`Attributes of the <code>Element</code> node in the form of flat array <code>[name1, value1, name2, value2]</code>.`},{name:`documentURL`,type:`string`,optional:!0,description:`Document URL that <code>Document</code> or <code>FrameOwner</code> node points to.`},{name:`baseURL`,type:`string`,optional:!0,description:`Base URL that <code>Document</code> or <code>FrameOwner</code> node uses for URL completion.`},{name:`publicId`,type:`string`,optional:!0,description:`<code>DocumentType</code>'s publicId.`},{name:`systemId`,type:`string`,optional:!0,description:`<code>DocumentType</code>'s systemId.`},{name:`xmlVersion`,type:`string`,optional:!0,description:`<code>Document</code>'s XML version in case of XML documents.`},{name:`name`,type:`string`,optional:!0,description:`<code>Attr</code>'s name.`},{name:`value`,type:`string`,optional:!0,description:`<code>Attr</code>'s value.`},{name:`pseudoType`,$ref:`PseudoType`,optional:!0,description:`Pseudo element type for this node.`},{name:`shadowRootType`,$ref:`ShadowRootType`,optional:!0,description:`Shadow root type.`},{name:`customElementState`,$ref:`CustomElementState`,optional:!0,description:`Custom element state.`},{name:`contentDocument`,$ref:`Node`,optional:!0,description:`Content document for frame owner elements.`},{name:`shadowRoots`,type:`array`,optional:!0,items:{$ref:`Node`},description:`Shadow root list for given element host.`},{name:`templateContent`,$ref:`Node`,optional:!0,description:`Content document fragment for template elements`},{name:`pseudoElements`,type:`array`,optional:!0,items:{$ref:`Node`},description:`Pseudo elements associated with this node.`},{name:`contentSecurityPolicyHash`,type:`string`,optional:!0,description:`Computed SHA-256 Content Security Policy hash source for given element.`},{name:`layoutFlags`,type:`array`,optional:!0,items:{type:`string`},description:`Relevant information about the layout of the node. When not provided, the layout of the node is not important to Web Inspector.`}]},{id:`DataBinding`,type:`object`,properties:[{name:`binding`,type:`string`,description:`The binding key that is specified.`},{name:`type`,type:`string`,optional:!0,description:`A more descriptive name for the type of binding that represents this paritcular data relationship`},{name:`value`,type:`string`,description:`The value that is resolved to with this data binding relationship.`}]},{id:`EventListener`,type:`object`,properties:[{name:`eventListenerId`,$ref:`EventListenerId`},{name:`type`,type:`string`,description:`<code>EventListener</code>'s type.`},{name:`useCapture`,type:`boolean`,description:`<code>EventListener</code>'s useCapture.`},{name:`isAttribute`,type:`boolean`,description:`<code>EventListener</code>'s isAttribute.`},{name:`nodeId`,$ref:`NodeId`,optional:!0,description:`The target <code>DOMNode</code> id if the event listener is for a node.`},{name:`onWindow`,type:`boolean`,optional:!0,description:`True if the event listener was added to the window.`},{name:`location`,$ref:`Debugger.Location`,optional:!0,description:`Handler code location.`},{name:`handlerName`,type:`string`,optional:!0,description:`Event handler function name.`},{name:`passive`,type:`boolean`,optional:!0,description:`<code>EventListener</code>'s passive.`},{name:`once`,type:`boolean`,optional:!0,description:`<code>EventListener</code>'s once.`},{name:`disabled`,type:`boolean`,optional:!0},{name:`hasBreakpoint`,type:`boolean`,optional:!0}]},{id:`AccessibilityProperties`,type:`object`,properties:[{name:`activeDescendantNodeId`,$ref:`NodeId`,optional:!0,description:`<code>DOMNode</code> id of the accessibility object referenced by aria-activedescendant.`},{name:`busy`,type:`boolean`,optional:!0,description:`Value of @aria-busy on current or ancestor node.`},{name:`checked`,type:`string`,optional:!0,enum:[`true`,`false`,`mixed`],description:`Checked state of certain form controls.`},{name:`childNodeIds`,type:`array`,optional:!0,items:{$ref:`NodeId`},description:`Array of <code>DOMNode</code> ids of the accessibility tree children if available.`},{name:`controlledNodeIds`,type:`array`,optional:!0,items:{$ref:`NodeId`},description:`Array of <code>DOMNode</code> ids of any nodes referenced via @aria-controls.`},{name:`current`,type:`string`,optional:!0,enum:[`true`,`false`,`page`,`step`,`location`,`date`,`time`],description:`Current item within a container or set of related elements.`},{name:`disabled`,type:`boolean`,optional:!0,description:`Disabled state of form controls.`},{name:`headingLevel`,type:`number`,optional:!0,description:`Heading level of a heading element.`},{name:`hierarchyLevel`,type:`number`,optional:!0,description:`The hierarchical level of an element.`},{name:`isPopUpButton`,type:`boolean`,optional:!0,description:`Whether an element is a popup button.`},{name:`exists`,type:`boolean`,description:`Indicates whether there is an existing AX object for the DOM node. If this is false, all the other properties will be default values.`},{name:`expanded`,type:`boolean`,optional:!0,description:`Expanded state.`},{name:`flowedNodeIds`,type:`array`,optional:!0,items:{$ref:`NodeId`},description:`Array of <code>DOMNode</code> ids of any nodes referenced via @aria-flowto.`},{name:`focused`,type:`boolean`,optional:!0,description:`Focused state. Only defined on focusable elements.`},{name:`ignored`,type:`boolean`,optional:!0,description:`Indicates whether the accessibility of the associated AX object node is ignored, whether heuristically or explicitly.`},{name:`ignoredByDefault`,type:`boolean`,optional:!0,description:`State indicating whether the accessibility of the associated AX object node is ignored by default for node type.`},{name:`invalid`,type:`string`,optional:!0,enum:[`true`,`false`,`grammar`,`spelling`],description:`Invalid status of form controls.`},{name:`hidden`,type:`boolean`,optional:!0,description:`Hidden state. True if node or an ancestor is hidden via CSS or explicit @aria-hidden, to clarify why the element is ignored.`},{name:`label`,type:`string`,description:`Computed label value for the node, sometimes calculated by referencing other nodes.`},{name:`liveRegionAtomic`,type:`boolean`,optional:!0,description:`Value of @aria-atomic.`},{name:`liveRegionRelevant`,type:`array`,optional:!0,items:{type:`string`},description:`Token value(s) of element's @aria-relevant attribute. Array of string values matching $ref LiveRegionRelevant. FIXME: Enum values blocked by http://webkit.org/b/133711`},{name:`liveRegionStatus`,type:`string`,optional:!0,enum:[`assertive`,`polite`,`off`],description:`Value of element's @aria-live attribute.`},{name:`mouseEventNodeId`,$ref:`NodeId`,optional:!0,description:`<code>DOMNode</code> id of node or closest ancestor node that has a mousedown, mouseup, or click event handler.`},{name:`nodeId`,$ref:`NodeId`,description:`Target <code>DOMNode</code> id.`},{name:`ownedNodeIds`,type:`array`,optional:!0,items:{$ref:`NodeId`},description:`Array of <code>DOMNode</code> ids of any nodes referenced via @aria-owns.`},{name:`parentNodeId`,$ref:`NodeId`,optional:!0,description:`<code>DOMNode</code> id of the accessibility tree parent object if available.`},{name:`pressed`,type:`boolean`,optional:!0,description:`Pressed state for toggle buttons.`},{name:`readonly`,type:`boolean`,optional:!0,description:`Readonly state of text controls.`},{name:`required`,type:`boolean`,optional:!0,description:`Required state of form controls.`},{name:`role`,type:`string`,description:`Computed value for first recognized role token, default role per element, or overridden role.`},{name:`selected`,type:`boolean`,optional:!0,description:`Selected state of certain form controls.`},{name:`selectedChildNodeIds`,type:`array`,optional:!0,items:{$ref:`NodeId`},description:`Array of <code>DOMNode</code> ids of any children marked as selected.`},{name:`switchState`,type:`string`,optional:!0,enum:[`off`,`on`],description:`On / off state of switch form controls.`}]},{id:`RGBAColor`,type:`object`,properties:[{name:`r`,type:`integer`,description:`The red component, in the [0-255] range.`},{name:`g`,type:`integer`,description:`The green component, in the [0-255] range.`},{name:`b`,type:`integer`,description:`The blue component, in the [0-255] range.`},{name:`a`,type:`number`,optional:!0,description:`The alpha component, in the [0-1] range (default: 1).`}]},{id:`Quad`,type:`array`},{id:`HighlightConfig`,type:`object`,properties:[{name:`showInfo`,type:`boolean`,optional:!0,description:`Whether the node info tooltip should be shown (default: false).`},{name:`contentColor`,$ref:`RGBAColor`,optional:!0,description:`The content box highlight fill color (default: transparent).`},{name:`paddingColor`,$ref:`RGBAColor`,optional:!0,description:`The padding highlight fill color (default: transparent).`},{name:`borderColor`,$ref:`RGBAColor`,optional:!0,description:`The border highlight fill color (default: transparent).`},{name:`marginColor`,$ref:`RGBAColor`,optional:!0,description:`The margin highlight fill color (default: transparent).`}]},{id:`GridOverlayConfig`,type:`object`,properties:[{name:`gridColor`,$ref:`RGBAColor`,description:`The primary color to use for the grid overlay.`},{name:`showLineNames`,type:`boolean`,optional:!0,description:`Show labels for grid line names. If not specified, the default value is false.`},{name:`showLineNumbers`,type:`boolean`,optional:!0,description:`Show labels for grid line numbers. If not specified, the default value is false.`},{name:`showExtendedGridLines`,type:`boolean`,optional:!0,description:`Show grid lines that extend beyond the bounds of the grid. If not specified, the default value is false.`},{name:`showTrackSizes`,type:`boolean`,optional:!0,description:`Show grid track size information. If not specified, the default value is false.`},{name:`showAreaNames`,type:`boolean`,optional:!0,description:`Show labels for grid area names. If not specified, the default value is false.`},{name:`showOrderNumbers`,type:`boolean`,optional:!0,description:`Show labels for grid item order. If not specified, the default value is false.`}]},{id:`FlexOverlayConfig`,type:`object`,properties:[{name:`flexColor`,$ref:`RGBAColor`,description:`The primary color to use for the flex overlay.`},{name:`showOrderNumbers`,type:`boolean`,optional:!0,description:`Show labels for flex order. If not specified, the default value is false.`}]},{id:`Styleable`,type:`object`,properties:[{name:`nodeId`,$ref:`NodeId`},{name:`pseudoId`,$ref:`CSS.PseudoId`,optional:!0}]},{id:`MediaStats`,type:`object`,properties:[{name:`audio`,$ref:`AudioMediaStats`,optional:!0},{name:`video`,$ref:`VideoMediaStats`,optional:!0},{name:`devicePixelRatio`,type:`number`,optional:!0,description:`The ratio between physical screen pixels and CSS pixels.`},{name:`viewport`,$ref:`ViewportSize`,optional:!0,description:`The viewport size occupied by the media element.`},{name:`quality`,$ref:`VideoPlaybackQuality`,optional:!0},{name:`source`,type:`string`,optional:!0,description:`The source type of the media element.`}]},{id:`AudioMediaStats`,type:`object`,properties:[{name:`bitrate`,type:`integer`,description:`The data rate of the primary audio track in bits/s.`},{name:`codec`,type:`string`,description:`The codec string of the primary audio track. (E.g., "hvc1.1.6.L123.B0")`},{name:`humanReadableCodecString`,type:`string`,description:"A human readable version of the `codec` parameter."},{name:`numberOfChannels`,type:`integer`,description:`The number of audio channels in the primary audio track.`},{name:`sampleRate`,type:`number`,description:`The sample rate of the primary audio track in hertz.`},{name:`isProtected`,type:`boolean`,optional:!0,description:`Whether the track contains protected contents`}]},{id:`VideoMediaStats`,type:`object`,properties:[{name:`bitrate`,type:`integer`,description:`The data rate of the video track in bits/s.`},{name:`codec`,type:`string`,description:`The codec string of the video track. (E.g., "hvc1.1.6.L123.B0")`},{name:`humanReadableCodecString`,type:`string`,description:"A human readable version of the `codec` parameter."},{name:`colorSpace`,$ref:`VideoColorSpace`},{name:`framerate`,type:`number`,description:`The nominal frame rate of video track in frames per second.`},{name:`height`,type:`integer`,description:`The native height of the video track in CSS pixels`},{name:`width`,type:`integer`,description:`The native width of the video track in CSS pixels`},{name:`immersiveVideoMetadata`,$ref:`ImmersiveVideoMetadata`,optional:!0},{name:`isProtected`,type:`boolean`,optional:!0,description:`Whether the track contains protected contents`}]},{id:`VideoColorSpace`,type:`object`,properties:[{name:`fullRange`,type:`boolean`,optional:!0,description:`A flag indicating whether the colorspace is Full range (true) or Video range (false)`},{name:`matrix`,type:`string`,optional:!0,description:`The matrix specification of the colorspace`},{name:`primaries`,type:`string`,optional:!0,description:`The color primaries specification of the colorspace`},{name:`transfer`,type:`string`,optional:!0,description:`The transfer function specification of the colorspace`}]},{id:`VideoPlaybackQuality`,type:`object`,properties:[{name:`displayCompositedVideoFrames`,type:`integer`,description:`The number of frames of the total which were composited by the display.`},{name:`droppedVideoFrames`,type:`integer`,description:`The number of frames of the total which were dropped without being displayed.`},{name:`totalVideoFrames`,type:`integer`,description:`The total number of frames enqueued for display by the media element.`}]},{id:`ImmersiveVideoMetadata`,type:`object`,properties:[{name:`kind`,$ref:`VideoProjectionMetadataKind`,description:`The kind of immersive video.`},{name:`width`,type:`number`},{name:`height`,type:`number`},{name:`horizontalFieldOfView`,type:`integer`,optional:!0,description:`The horizontal field-of-view measurement, in degrees`},{name:`stereoCameraBaseline`,type:`integer`,optional:!0,description:`The distance between the centers of the lenses in a camera system, in micrometers`},{name:`horizontalDisparityAdjustment`,type:`integer`,optional:!0,description:`The relative shift of the left and right eye images, as a percentage`}]},{id:`VideoProjectionMetadataKind`,type:`string`,enum:[`unknown`,`rectilinear`,`equirectangular`,`half-equirectangular`,`equi-angular-cubemap`,`parametric`,`pyramid`,`apple-immersive-video`]},{id:`ViewportSize`,type:`object`,properties:[{name:`width`,type:`number`},{name:`height`,type:`number`}]}],commands:[{name:`getDocument`,description:`Returns the root DOM node to the caller.`,returns:[{name:`root`,$ref:`Node`,description:`Resulting node.`}]},{name:`requestChildNodes`,description:`Requests that children of the node with given id are returned to the caller in form of <code>setChildNodes</code> events where not only immediate children are retrieved, but all children down to the specified depth.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to get children for.`},{name:`depth`,type:`integer`,optional:!0,description:`The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the entire subtree or provide an integer larger than 0.`}]},{name:`requestAssignedSlot`,description:`Requests the <code>HTMLSlotElement</code> that the node with the given id is assigned to.`,parameters:[{name:`nodeId`,$ref:`NodeId`}],returns:[{name:`slotElementId`,$ref:`NodeId`,optional:!0,description:`Not provided if the given node is not assigned to a <code>HTMLSlotElement</code>.`}]},{name:`requestAssignedNodes`,description:`Requests the list of assigned nodes for the <code>HTMLSlotElement</code> with the given id.`,parameters:[{name:`slotElementId`,$ref:`NodeId`}],returns:[{name:`assignedNodeIds`,type:`array`,items:{$ref:`NodeId`}}]},{name:`querySelector`,description:`Executes <code>querySelector</code> on a given node.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to query upon.`},{name:`selector`,type:`string`,description:`Selector string.`}],returns:[{name:`nodeId`,$ref:`NodeId`,optional:!0,description:`Query selector result.`}]},{name:`querySelectorAll`,description:`Executes <code>querySelectorAll</code> on a given node.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to query upon.`},{name:`selector`,type:`string`,description:`Selector string.`}],returns:[{name:`nodeIds`,type:`array`,items:{$ref:`NodeId`},description:`Query selector result.`}]},{name:`setNodeName`,description:`Sets node name for a node with given id.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to set name for.`},{name:`name`,type:`string`,description:`New node's name.`}],returns:[{name:`nodeId`,$ref:`NodeId`,description:`New node's id.`}]},{name:`setNodeValue`,description:`Sets node value for a node with given id.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to set value for.`},{name:`value`,type:`string`,description:`New node's value.`}]},{name:`removeNode`,description:`Removes node with given id.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to remove.`}]},{name:`setAttributeValue`,description:`Sets attribute for an element with given id.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the element to set attribute for.`},{name:`name`,type:`string`,description:`Attribute name.`},{name:`value`,type:`string`,description:`Attribute value.`}]},{name:`setAttributesAsText`,description:`Sets attributes on element with given id. This method is useful when user edits some existing attribute value and types in several attribute name/value pairs.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the element to set attributes for.`},{name:`text`,type:`string`,description:`Text with a number of attributes. Will parse this text using HTML parser.`},{name:`name`,type:`string`,optional:!0,description:`Attribute name to replace with new attributes derived from text in case text parsed successfully.`}]},{name:`removeAttribute`,description:`Removes attribute with given name from an element with given id.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the element to remove attribute from.`},{name:`name`,type:`string`,description:`Name of the attribute to remove.`}]},{name:`getSupportedEventNames`,description:`Gets the list of builtin DOM event names.`,returns:[{name:`eventNames`,type:`array`,items:{type:`string`}}]},{name:`getDataBindingsForNode`,description:`Returns all data binding relationships between data that is associated with the node and the node itself.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to get data bindings for.`}],returns:[{name:`dataBindings`,type:`array`,items:{$ref:`DataBinding`},description:`Array of binding relationships between data and node`}]},{name:`getAssociatedDataForNode`,description:`Returns all data that has been associated with the node and is available for data binding.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to get associated data for.`}],returns:[{name:`associatedData`,type:`string`,optional:!0,description:`Associated data bound to this node. Sent as a JSON string.`}]},{name:`getEventListenersForNode`,description:`Returns event listeners relevant to the node.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to get listeners for.`},{name:`includeAncestors`,type:`boolean`,optional:!0,description:`Controls whether ancestor event listeners are included. Defaults to true.`}],returns:[{name:`listeners`,type:`array`,items:{$ref:`EventListener`},description:`Array of relevant listeners.`}]},{name:`setEventListenerDisabled`,description:`Enable/disable the given event listener. A disabled event listener will not fire.`,parameters:[{name:`eventListenerId`,$ref:`EventListenerId`},{name:`disabled`,type:`boolean`}]},{name:`setBreakpointForEventListener`,description:`Set a breakpoint on the given event listener.`,parameters:[{name:`eventListenerId`,$ref:`EventListenerId`},{name:`options`,$ref:`Debugger.BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}]},{name:`removeBreakpointForEventListener`,description:`Remove any breakpoints on the given event listener.`,parameters:[{name:`eventListenerId`,$ref:`EventListenerId`}]},{name:`getAccessibilityPropertiesForNode`,description:`Returns a dictionary of accessibility properties for the node.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node for which to get accessibility properties.`}],returns:[{name:`properties`,$ref:`AccessibilityProperties`,description:`Dictionary of relevant accessibility properties.`}]},{name:`getOuterHTML`,description:`Returns node's HTML markup.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to get markup for.`}],returns:[{name:`outerHTML`,type:`string`,description:`Outer HTML markup.`}]},{name:`setOuterHTML`,description:`Sets node HTML markup, returns new node id.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to set markup for.`},{name:`outerHTML`,type:`string`,description:`Outer HTML markup to set.`}]},{name:`insertAdjacentHTML`,parameters:[{name:`nodeId`,$ref:`NodeId`},{name:`position`,type:`string`},{name:`html`,type:`string`}]},{name:`performSearch`,description:`Searches for a given string in the DOM tree. Use <code>getSearchResults</code> to access search results or <code>cancelSearch</code> to end this search session.`,parameters:[{name:`query`,type:`string`,description:`Plain text or query selector or XPath search query.`},{name:`nodeIds`,type:`array`,optional:!0,items:{$ref:`NodeId`},description:`Ids of nodes to use as starting points for the search.`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:`If true, search is case sensitive.`}],returns:[{name:`searchId`,type:`string`,description:`Unique search session identifier.`},{name:`resultCount`,type:`integer`,description:`Number of search results.`}]},{name:`getSearchResults`,description:`Returns search results from given <code>fromIndex</code> to given <code>toIndex</code> from the sarch with the given identifier.`,parameters:[{name:`searchId`,type:`string`,description:`Unique search session identifier.`},{name:`fromIndex`,type:`integer`,description:`Start index of the search result to be returned.`},{name:`toIndex`,type:`integer`,description:`End index of the search result to be returned.`}],returns:[{name:`nodeIds`,type:`array`,items:{$ref:`NodeId`},description:`Ids of the search result nodes.`}]},{name:`discardSearchResults`,description:`Discards search results from the session with the given id. <code>getSearchResults</code> should no longer be called for that search.`,parameters:[{name:`searchId`,type:`string`,description:`Unique search session identifier.`}]},{name:`requestNode`,description:`Requests that the node is sent to the caller given the JavaScript node object reference. All nodes that form the path from the node to the root are also sent to the client as a series of <code>setChildNodes</code> notifications.`,parameters:[{name:`objectId`,$ref:`Runtime.RemoteObjectId`,description:`JavaScript object id to convert into node.`}],returns:[{name:`nodeId`,$ref:`NodeId`,description:`Node id for given object.`}]},{name:`setInspectModeEnabled`,description:`Enters the 'inspect' mode. In this mode, elements that user is hovering over are highlighted. Backend then generates 'inspect' command upon element selection.`,parameters:[{name:`enabled`,type:`boolean`,description:`True to enable inspection mode, false to disable it.`},{name:`highlightConfig`,$ref:`HighlightConfig`,optional:!0,description:`A descriptor for the highlight appearance of hovered-over nodes. May be omitted if <code>enabled == false</code>.`},{name:`gridOverlayConfig`,$ref:`GridOverlayConfig`,optional:!0,description:`If provided, used to configure a grid overlay shown during element selection. This overrides DOM.showGridOverlay.`},{name:`flexOverlayConfig`,$ref:`FlexOverlayConfig`,optional:!0,description:`If provided, used to configure a flex overlay shown during element selection. This overrides DOM.showFlexOverlay.`}]},{name:`setInspectModeEnabled`,description:`Enters the 'inspect' mode. In this mode, elements that user is hovering over are highlighted. Backend then generates 'inspect' command upon element selection.`,parameters:[{name:`enabled`,type:`boolean`,description:`True to enable inspection mode, false to disable it.`},{name:`highlightConfig`,$ref:`HighlightConfig`,optional:!0,description:`A descriptor for the highlight appearance of hovered-over nodes. May be omitted if <code>enabled == false</code>.`},{name:`gridOverlayConfig`,$ref:`GridOverlayConfig`,optional:!0,description:`If provided, used to configure a grid overlay shown during element selection. This overrides DOM.showGridOverlay.`},{name:`flexOverlayConfig`,$ref:`FlexOverlayConfig`,optional:!0,description:`If provided, used to configure a flex overlay shown during element selection. This overrides DOM.showFlexOverlay.`},{name:`showRulers`,type:`boolean`,optional:!0,description:`Whether the rulers should be shown during element selection. This overrides Page.setShowRulers.`}]},{name:`highlightRect`,description:`Highlights given rectangle. Coordinates are absolute with respect to the main frame viewport.`,parameters:[{name:`x`,type:`integer`,description:`X coordinate`},{name:`y`,type:`integer`,description:`Y coordinate`},{name:`width`,type:`integer`,description:`Rectangle width`},{name:`height`,type:`integer`,description:`Rectangle height`},{name:`color`,$ref:`RGBAColor`,optional:!0,description:`The highlight fill color (default: transparent).`},{name:`outlineColor`,$ref:`RGBAColor`,optional:!0,description:`The highlight outline color (default: transparent).`},{name:`usePageCoordinates`,type:`boolean`,optional:!0,description:`Indicates whether the provided parameters are in page coordinates or in viewport coordinates (the default).`}]},{name:`highlightQuad`,description:`Highlights given quad. Coordinates are absolute with respect to the main frame viewport.`,parameters:[{name:`quad`,$ref:`Quad`,description:`Quad to highlight`},{name:`color`,$ref:`RGBAColor`,optional:!0,description:`The highlight fill color (default: transparent).`},{name:`outlineColor`,$ref:`RGBAColor`,optional:!0,description:`The highlight outline color (default: transparent).`},{name:`usePageCoordinates`,type:`boolean`,optional:!0,description:`Indicates whether the provided parameters are in page coordinates or in viewport coordinates (the default).`}]},{name:`highlightSelector`,description:`Highlights all DOM nodes that match a given selector. A string containing a CSS selector must be specified.`,parameters:[{name:`selectorString`,type:`string`,description:`A CSS selector for finding matching nodes to highlight.`},{name:`frameId`,type:`string`,optional:!0,description:`Identifier of the frame which will be searched using the selector. If not provided, the main frame will be used.`},{name:`highlightConfig`,$ref:`HighlightConfig`,description:`A descriptor for the highlight appearance.`},{name:`gridOverlayConfig`,$ref:`GridOverlayConfig`,optional:!0,description:`If provided, used to configure a grid overlay shown during element selection. This overrides DOM.showGridOverlay.`},{name:`flexOverlayConfig`,$ref:`FlexOverlayConfig`,optional:!0,description:`If provided, used to configure a flex overlay shown during element selection. This overrides DOM.showFlexOverlay.`}]},{name:`highlightSelector`,description:`Highlights all DOM nodes that match a given selector. A string containing a CSS selector must be specified.`,parameters:[{name:`selectorString`,type:`string`,description:`A CSS selector for finding matching nodes to highlight.`},{name:`frameId`,type:`string`,optional:!0,description:`Identifier of the frame which will be searched using the selector. If not provided, the main frame will be used.`},{name:`highlightConfig`,$ref:`HighlightConfig`,description:`A descriptor for the highlight appearance.`},{name:`gridOverlayConfig`,$ref:`GridOverlayConfig`,optional:!0,description:`If provided, used to configure a grid overlay shown during element selection. This overrides DOM.showGridOverlay.`},{name:`flexOverlayConfig`,$ref:`FlexOverlayConfig`,optional:!0,description:`If provided, used to configure a flex overlay shown during element selection. This overrides DOM.showFlexOverlay.`},{name:`showRulers`,type:`boolean`,optional:!0,description:`Whether the rulers should be shown during element selection. This overrides Page.setShowRulers.`}]},{name:`highlightNode`,description:`Highlights DOM node with given id or with the given JavaScript object wrapper. Either nodeId or objectId must be specified.`,parameters:[{name:`nodeId`,$ref:`NodeId`,optional:!0,description:`Identifier of the node to highlight.`},{name:`objectId`,$ref:`Runtime.RemoteObjectId`,optional:!0,description:`JavaScript object id of the node to be highlighted.`},{name:`highlightConfig`,$ref:`HighlightConfig`,description:`A descriptor for the highlight appearance.`},{name:`gridOverlayConfig`,$ref:`GridOverlayConfig`,optional:!0,description:`If provided, used to configure a grid overlay shown during element selection. This overrides DOM.showGridOverlay.`},{name:`flexOverlayConfig`,$ref:`FlexOverlayConfig`,optional:!0,description:`If provided, used to configure a flex overlay shown during element selection. This overrides DOM.showFlexOverlay.`}]},{name:`highlightNode`,description:`Highlights DOM node with given id or with the given JavaScript object wrapper. Either nodeId or objectId must be specified.`,parameters:[{name:`nodeId`,$ref:`NodeId`,optional:!0,description:`Identifier of the node to highlight.`},{name:`objectId`,$ref:`Runtime.RemoteObjectId`,optional:!0,description:`JavaScript object id of the node to be highlighted.`},{name:`highlightConfig`,$ref:`HighlightConfig`,description:`A descriptor for the highlight appearance.`},{name:`gridOverlayConfig`,$ref:`GridOverlayConfig`,optional:!0,description:`If provided, used to configure a grid overlay shown during element selection. This overrides DOM.showGridOverlay.`},{name:`flexOverlayConfig`,$ref:`FlexOverlayConfig`,optional:!0,description:`If provided, used to configure a flex overlay shown during element selection. This overrides DOM.showFlexOverlay.`},{name:`showRulers`,type:`boolean`,optional:!0,description:`Whether the rulers should be shown during element selection. This overrides Page.setShowRulers.`}]},{name:`highlightNodeList`,description:`Highlights each DOM node in the given list.`,parameters:[{name:`nodeIds`,type:`array`,items:{$ref:`NodeId`}},{name:`highlightConfig`,$ref:`HighlightConfig`},{name:`gridOverlayConfig`,$ref:`GridOverlayConfig`,optional:!0,description:`If provided, used to configure a grid overlay shown during element selection. This overrides DOM.showGridOverlay.`},{name:`flexOverlayConfig`,$ref:`FlexOverlayConfig`,optional:!0,description:`If provided, used to configure a flex overlay shown during element selection. This overrides DOM.showFlexOverlay.`}]},{name:`highlightNodeList`,description:`Highlights each DOM node in the given list.`,parameters:[{name:`nodeIds`,type:`array`,items:{$ref:`NodeId`}},{name:`highlightConfig`,$ref:`HighlightConfig`},{name:`gridOverlayConfig`,$ref:`GridOverlayConfig`,optional:!0,description:`If provided, used to configure a grid overlay shown during element selection. This overrides DOM.showGridOverlay.`},{name:`flexOverlayConfig`,$ref:`FlexOverlayConfig`,optional:!0,description:`If provided, used to configure a flex overlay shown during element selection. This overrides DOM.showFlexOverlay.`},{name:`showRulers`,type:`boolean`,optional:!0,description:`Whether the rulers should be shown during element selection. This overrides Page.setShowRulers.`}]},{name:`hideHighlight`,description:`Hides DOM node highlight.`},{name:`highlightFrame`,description:`Highlights owner element of the frame with given id.`,parameters:[{name:`frameId`,$ref:`Network.FrameId`,description:`Identifier of the frame to highlight.`},{name:`contentColor`,$ref:`RGBAColor`,optional:!0,description:`The content box highlight fill color (default: transparent).`},{name:`contentOutlineColor`,$ref:`RGBAColor`,optional:!0,description:`The content box highlight outline color (default: transparent).`}]},{name:`showGridOverlay`,description:`Shows a grid overlay for a node that begins a 'grid' layout context. The command has no effect if <code>nodeId</code> is invalid or the associated node does not begin a 'grid' layout context. A node can only have one grid overlay at a time; subsequent calls with the same <code>nodeId</code> will override earlier calls.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`The node for which a grid overlay should be shown.`},{name:`gridOverlayConfig`,$ref:`GridOverlayConfig`,description:`Configuration options for the grid overlay.`}]},{name:`hideGridOverlay`,description:`Hides a grid overlay for a node that begins a 'grid' layout context. The command has no effect if <code>nodeId</code> is specified and invalid, or if there is not currently an overlay set for the <code>nodeId</code>.`,parameters:[{name:`nodeId`,$ref:`NodeId`,optional:!0,description:`The node for which a grid overlay should be hidden. If a <code>nodeId</code> is not specified, all grid overlays will be hidden.`}]},{name:`showFlexOverlay`,description:`Shows a flex overlay for a node that begins a 'flex' layout context. The command has no effect if <code>nodeId</code> is invalid or the associated node does not begin a 'flex' layout context. A node can only have one flex overlay at a time; subsequent calls with the same <code>nodeId</code> will override earlier calls.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`The node for which a flex overlay should be shown.`},{name:`flexOverlayConfig`,$ref:`FlexOverlayConfig`,description:`Configuration options for the flex overlay.`}]},{name:`hideFlexOverlay`,description:`Hides a flex overlay for a node that begins a 'flex' layout context. The command has no effect if <code>nodeId</code> is specified and invalid, or if there is not currently an overlay set for the <code>nodeId</code>.`,parameters:[{name:`nodeId`,$ref:`NodeId`,optional:!0,description:`The node for which a flex overlay should be hidden. If a <code>nodeId</code> is not specified, all flex overlays will be hidden.`}]},{name:`pushNodeByPathToFrontend`,description:`Requests that the node is sent to the caller given its path.`,parameters:[{name:`path`,type:`string`,description:`Path to node in the proprietary format.`}],returns:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node for given path.`}]},{name:`resolveNode`,description:`Resolves JavaScript node object for given node id.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to resolve.`},{name:`objectGroup`,type:`string`,optional:!0,description:`Symbolic group name that can be used to release multiple objects.`}],returns:[{name:`object`,$ref:`Runtime.RemoteObject`,description:`JavaScript object wrapper for given node.`}]},{name:`getAttributes`,description:`Returns attributes for the specified node.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to retrieve attributes for.`}],returns:[{name:`attributes`,type:`array`,items:{type:`string`},description:`An interleaved array of node attribute names and values.`}]},{name:`moveTo`,description:`Moves node into the new container, places it before the given anchor.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to drop.`},{name:`targetNodeId`,$ref:`NodeId`,description:`Id of the element to drop into.`},{name:`insertBeforeNodeId`,$ref:`NodeId`,optional:!0,description:`Drop node before given one.`}],returns:[{name:`nodeId`,$ref:`NodeId`,description:`New id of the moved node.`}]},{name:`undo`,description:`Undoes the last performed action.`},{name:`redo`,description:`Re-does the last undone action.`},{name:`markUndoableState`,description:`Marks last undoable state.`},{name:`focus`,description:`Focuses the given element.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to focus.`}]},{name:`setInspectedNode`,description:`Enables console to refer to the node with given id via $0 (see Command Line API for more details).`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`DOM node id to be accessible by means of $0 command line API.`}]},{name:`setAllowEditingUserAgentShadowTrees`,description:`Controls whether any DOM commands work for nodes inside a UserAgent shadow tree.`,parameters:[{name:`allow`,type:`boolean`}]},{name:`getMediaStats`,description:`Returns media stats for the selected node.`,parameters:[{name:`nodeId`,$ref:`NodeId`,description:`Id of the node to retrieve mediastats for.`}],returns:[{name:`mediaStats`,$ref:`MediaStats`,description:`An interleaved array of node attribute names and values.`}]}]},{domain:`DOMDebugger`,types:[{id:`DOMBreakpointType`,type:`string`,enum:[`subtree-modified`,`attribute-modified`,`node-removed`]},{id:`EventBreakpointType`,type:`string`,enum:[`animation-frame`,`interval`,`listener`,`timeout`]}],commands:[{name:`setDOMBreakpoint`,description:`Sets breakpoint on particular operation with DOM.`,parameters:[{name:`nodeId`,$ref:`DOM.NodeId`,description:`Identifier of the node to set breakpoint on.`},{name:`type`,$ref:`DOMBreakpointType`,description:`Type of the operation to stop upon.`},{name:`options`,$ref:`Debugger.BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}]},{name:`removeDOMBreakpoint`,description:`Removes DOM breakpoint that was set using <code>setDOMBreakpoint</code>.`,parameters:[{name:`nodeId`,$ref:`DOM.NodeId`,description:`Identifier of the node to remove breakpoint from.`},{name:`type`,$ref:`DOMBreakpointType`,description:`Type of the breakpoint to remove.`}]},{name:`setEventBreakpoint`,description:`Sets breakpoint on particular event of given type.`,parameters:[{name:`breakpointType`,$ref:`EventBreakpointType`},{name:`eventName`,type:`string`,optional:!0,description:`The name of the specific event to stop on.`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:`If true, eventName is case sensitive. Defaults to true.`},{name:`isRegex`,type:`boolean`,optional:!0,description:`If true, treats eventName as a regex. Defaults to false.`},{name:`options`,$ref:`Debugger.BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}]},{name:`removeEventBreakpoint`,description:`Removes breakpoint on particular event of given type.`,parameters:[{name:`breakpointType`,$ref:`EventBreakpointType`},{name:`eventName`,type:`string`,optional:!0,description:`The name of the specific event to stop on.`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:`If true, eventName is case sensitive. Defaults to true.`},{name:`isRegex`,type:`boolean`,optional:!0,description:`If true, treats eventName as a regex. Defaults to false.`}]},{name:`setURLBreakpoint`,description:`Sets breakpoint on network activity for the given URL.`,parameters:[{name:`url`,type:`string`,description:`Resource URL substring or regular expression. All requests having this substring in the URL will get stopped upon. An empty string will pause on all requests.`},{name:`isRegex`,type:`boolean`,optional:!0,description:`Whether the URL string is a regular expression.`},{name:`options`,$ref:`Debugger.BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}]},{name:`removeURLBreakpoint`,description:`Removes breakpoint from network activity for the given URL.`,parameters:[{name:`url`,type:`string`,description:`Resource URL substring. An empty string will stop pausing on all requests.`},{name:`isRegex`,type:`boolean`,optional:!0,description:`Whether the URL string is a regular expression.`}]}]},{domain:`DOMStorage`,types:[{id:`StorageId`,type:`object`,properties:[{name:`securityOrigin`,type:`string`,description:`Security origin for the storage.`},{name:`isLocalStorage`,type:`boolean`,description:`Whether the storage is local storage (not session storage).`}]},{id:`Item`,type:`array`}],commands:[{name:`enable`,description:`Enables storage tracking, storage events will now be delivered to the client.`},{name:`disable`,description:`Disables storage tracking, prevents storage events from being sent to the client.`},{name:`getDOMStorageItems`,parameters:[{name:`storageId`,$ref:`StorageId`}],returns:[{name:`entries`,type:`array`,items:{$ref:`Item`}}]},{name:`setDOMStorageItem`,parameters:[{name:`storageId`,$ref:`StorageId`},{name:`key`,type:`string`},{name:`value`,type:`string`}]},{name:`removeDOMStorageItem`,parameters:[{name:`storageId`,$ref:`StorageId`},{name:`key`,type:`string`}]},{name:`clearDOMStorageItems`,parameters:[{name:`storageId`,$ref:`StorageId`}]}]},{domain:`Debugger`,types:[{id:`BreakpointId`,type:`string`},{id:`BreakpointActionIdentifier`,type:`integer`},{id:`ScriptId`,type:`string`},{id:`CallFrameId`,type:`string`},{id:`Location`,type:`object`,properties:[{name:`scriptId`,$ref:`ScriptId`,description:`Script identifier as reported in the <code>Debugger.scriptParsed</code>.`},{name:`lineNumber`,type:`integer`,description:`Line number in the script (0-based).`},{name:`columnNumber`,type:`integer`,optional:!0,description:`Column number in the script (0-based).`}]},{id:`BreakpointAction`,type:`object`,properties:[{name:`type`,type:`string`,enum:[`log`,`evaluate`,`sound`,`probe`],description:`Different kinds of breakpoint actions.`},{name:`data`,type:`string`,optional:!0,description:`Data associated with this breakpoint type (e.g. for type "eval" this is the JavaScript string to evaluate).`},{name:`id`,$ref:`BreakpointActionIdentifier`,optional:!0,description:`A frontend-assigned identifier for this breakpoint action.`},{name:`emulateUserGesture`,type:`boolean`,optional:!0,description:`Indicates whether this action should be executed with a user gesture or not. Defaults to <code>false<code>.`}]},{id:`BreakpointOptions`,type:`object`,properties:[{name:`condition`,type:`string`,optional:!0,description:`Expression to use as a breakpoint condition. When specified, debugger will only stop on the breakpoint if this expression evaluates to true.`},{name:`actions`,type:`array`,optional:!0,items:{$ref:`BreakpointAction`},description:`Actions to perform automatically when the breakpoint is triggered.`},{name:`autoContinue`,type:`boolean`,optional:!0,description:`Automatically continue after hitting this breakpoint and running actions.`},{name:`ignoreCount`,type:`integer`,optional:!0,description:`Number of times to ignore this breakpoint, before stopping on the breakpoint and running actions.`}]},{id:`FunctionDetails`,type:`object`,properties:[{name:`location`,$ref:`Location`,description:`Location of the function.`},{name:`name`,type:`string`,optional:!0,description:`Name of the function. Not present for anonymous functions.`},{name:`displayName`,type:`string`,optional:!0,description:`Display name of the function(specified in 'displayName' property on the function object).`},{name:`scopeChain`,type:`array`,optional:!0,items:{$ref:`Scope`},description:`Scope chain for this closure.`}]},{id:`CallFrame`,type:`object`,properties:[{name:`callFrameId`,$ref:`CallFrameId`,description:`Call frame identifier. This identifier is only valid while the virtual machine is paused.`},{name:`functionName`,type:`string`,description:`Name of the JavaScript function called on this call frame.`},{name:`location`,$ref:`Location`,description:`Location in the source code.`},{name:`scopeChain`,type:`array`,items:{$ref:`Scope`},description:`Scope chain for this call frame.`},{name:`this`,$ref:`Runtime.RemoteObject`,description:`<code>this</code> object for this call frame.`},{name:`isTailDeleted`,type:`boolean`,description:`Is the current frame tail deleted from a tail call.`}]},{id:`Scope`,type:`object`,properties:[{name:`object`,$ref:`Runtime.RemoteObject`,description:`Object representing the scope. For <code>global</code> and <code>with</code> scopes it represents the actual object; for the rest of the scopes, it is artificial transient object enumerating scope variables as its properties.`},{name:`type`,type:`string`,enum:[`global`,`with`,`closure`,`catch`,`functionName`,`globalLexicalEnvironment`,`nestedLexical`],description:`Scope type.`},{name:`name`,type:`string`,optional:!0,description:`Name associated with the scope.`},{name:`location`,$ref:`Location`,optional:!0,description:`Location if available of the scope definition.`},{name:`empty`,type:`boolean`,optional:!0,description:`Whether the scope has any variables.`}]},{id:`ProbeSample`,type:`object`,properties:[{name:`probeId`,$ref:`BreakpointActionIdentifier`,description:`Identifier of the probe breakpoint action that created the sample.`},{name:`sampleId`,type:`integer`,description:`Unique identifier for this sample.`},{name:`batchId`,type:`integer`,description:`A batch identifier which is the same for all samples taken at the same breakpoint hit.`},{name:`timestamp`,type:`number`,description:`Timestamp of when the sample was taken.`},{name:`payload`,$ref:`Runtime.RemoteObject`,description:`Contents of the sample.`}]},{id:`AssertPauseReason`,type:`object`,properties:[{name:`message`,type:`string`,optional:!0,description:`The console.assert message string if provided.`}]},{id:`BreakpointPauseReason`,type:`object`,properties:[{name:`breakpointId`,type:`string`,description:`The identifier of the breakpoint causing the pause.`}]},{id:`CSPViolationPauseReason`,type:`object`,properties:[{name:`directive`,type:`string`,description:`The CSP directive that blocked script execution.`}]}],commands:[{name:`enable`,description:`Enables debugger for the given page. Clients should not assume that the debugging has been enabled until the result for this command is received.`},{name:`disable`,description:`Disables debugger for given page.`},{name:`setAsyncStackTraceDepth`,description:`Set the async stack trace depth for the page. A value of zero disables recording of async stack traces.`,parameters:[{name:`depth`,type:`integer`,description:`Async stack trace depth.`}]},{name:`setBreakpointsActive`,description:`Activates / deactivates all breakpoints on the page.`,parameters:[{name:`active`,type:`boolean`,description:`New value for breakpoints active state.`}]},{name:`setBreakpointByUrl`,description:`Sets JavaScript breakpoint at given location specified either by URL or URL regex. Once this command is issued, all existing parsed scripts will have breakpoints resolved and returned in <code>locations</code> property. Further matching script parsing will result in subsequent <code>breakpointResolved</code> events issued. This logical breakpoint will survive page reloads.`,parameters:[{name:`lineNumber`,type:`integer`,description:`Line number to set breakpoint at.`},{name:`url`,type:`string`,optional:!0,description:`URL of the resources to set breakpoint on.`},{name:`urlRegex`,type:`string`,optional:!0,description:`Regex pattern for the URLs of the resources to set breakpoints on. Either <code>url</code> or <code>urlRegex</code> must be specified.`},{name:`columnNumber`,type:`integer`,optional:!0,description:`Offset in the line to set breakpoint at.`},{name:`options`,$ref:`BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}],returns:[{name:`breakpointId`,$ref:`BreakpointId`,description:`Id of the created breakpoint for further reference.`},{name:`locations`,type:`array`,items:{$ref:`Location`},description:`List of the locations this breakpoint resolved into upon addition.`}]},{name:`setBreakpoint`,description:`Sets JavaScript breakpoint at a given location.`,parameters:[{name:`location`,$ref:`Location`,description:`Location to set breakpoint in.`},{name:`options`,$ref:`BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}],returns:[{name:`breakpointId`,$ref:`BreakpointId`,description:`Id of the created breakpoint for further reference.`},{name:`actualLocation`,$ref:`Location`,description:`Location this breakpoint resolved into.`}]},{name:`removeBreakpoint`,description:`Removes JavaScript breakpoint.`,parameters:[{name:`breakpointId`,$ref:`BreakpointId`}]},{name:`addSymbolicBreakpoint`,description:`Adds a JavaScript breakpoint that pauses execution whenever a function with the given name is about to be called.`,parameters:[{name:`symbol`,type:`string`,description:`The name of the function to pause in when called.`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:`If true, symbol is case sensitive. Defaults to true.`},{name:`isRegex`,type:`boolean`,optional:!0,description:`If true, treats symbol as a regex. Defaults to false.`},{name:`options`,$ref:`BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}]},{name:`removeSymbolicBreakpoint`,description:`Removes a previously added symbolic breakpoint.`,parameters:[{name:`symbol`,type:`string`,description:`The name of the function to pause in when called.`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:`If true, symbol is case sensitive. Defaults to true.`},{name:`isRegex`,type:`boolean`,optional:!0,description:`If true, treats symbol as a regex. Defaults to false.`}]},{name:`continueUntilNextRunLoop`,description:`Continues execution until the current evaluation completes. This will trigger either a Debugger.paused or Debugger.resumed event.`},{name:`continueToLocation`,description:`Continues execution until specific location is reached. This will trigger either a Debugger.paused or Debugger.resumed event.`,parameters:[{name:`location`,$ref:`Location`,description:`Location to continue to.`}]},{name:`stepNext`,description:`Steps over the expression. This will trigger either a Debugger.paused or Debugger.resumed event.`},{name:`stepOver`,description:`Steps over the statement. This will trigger either a Debugger.paused or Debugger.resumed event.`},{name:`stepInto`,description:`Steps into the function call. This will trigger either a Debugger.paused or Debugger.resumed event.`},{name:`stepOut`,description:`Steps out of the function call. This will trigger either a Debugger.paused or Debugger.resumed event.`},{name:`pause`,description:`Stops on the next JavaScript statement.`},{name:`resume`,description:`Resumes JavaScript execution. This will trigger a Debugger.resumed event.`},{name:`searchInContent`,description:`Searches for given string in script content.`,parameters:[{name:`scriptId`,$ref:`ScriptId`,description:`Id of the script to search in.`},{name:`query`,type:`string`,description:`String to search for.`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:`If true, search is case sensitive.`},{name:`isRegex`,type:`boolean`,optional:!0,description:`If true, treats string parameter as regex.`}],returns:[{name:`result`,type:`array`,items:{$ref:`GenericTypes.SearchMatch`},description:`List of search matches.`}]},{name:`getScriptSource`,description:`Returns source for the script with given id.`,parameters:[{name:`scriptId`,$ref:`ScriptId`,description:`Id of the script to get source for.`}],returns:[{name:`scriptSource`,type:`string`,description:`Script source.`}]},{name:`getFunctionDetails`,description:`Returns detailed information on given function.`,parameters:[{name:`functionId`,$ref:`Runtime.RemoteObjectId`,description:`Id of the function to get location for.`}],returns:[{name:`details`,$ref:`FunctionDetails`,description:`Information about the function.`}]},{name:`getBreakpointLocations`,description:`Returns a list of valid breakpoint locations within the given location range.`,parameters:[{name:`start`,$ref:`Location`,description:`Starting location to look for breakpoint locations after (inclusive). Must have same scriptId as end.`},{name:`end`,$ref:`Location`,description:`Ending location to look for breakpoint locations before (exclusive). Must have same scriptId as start.`}],returns:[{name:`locations`,type:`array`,items:{$ref:`Location`},description:`List of resolved breakpoint locations.`}]},{name:`setPauseOnDebuggerStatements`,description:"Control whether the debugger pauses execution before `debugger` statements.",parameters:[{name:`enabled`,type:`boolean`},{name:`options`,$ref:`BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}]},{name:`setPauseOnExceptions`,description:`Defines pause on exceptions state. Can be set to stop on all exceptions, uncaught exceptions or no exceptions. Initial pause on exceptions state is <code>none</code>.`,parameters:[{name:`state`,type:`string`,enum:[`none`,`uncaught`,`all`],description:`Pause on exceptions mode.`},{name:`options`,$ref:`BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}]},{name:`setPauseOnAssertions`,description:`Set pause on assertions state. Assertions are console.assert assertions.`,parameters:[{name:`enabled`,type:`boolean`},{name:`options`,$ref:`BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}]},{name:`setPauseOnMicrotasks`,description:`Pause when running the next JavaScript microtask.`,parameters:[{name:`enabled`,type:`boolean`},{name:`options`,$ref:`BreakpointOptions`,optional:!0,description:`Options to apply to this breakpoint to modify its behavior.`}]},{name:`setPauseForInternalScripts`,description:`Change whether to pause in the debugger for internal scripts. The default value is false.`,parameters:[{name:`shouldPause`,type:`boolean`}]},{name:`evaluateOnCallFrame`,description:`Evaluates expression on a given call frame.`,parameters:[{name:`callFrameId`,$ref:`CallFrameId`,description:`Call frame identifier to evaluate on.`},{name:`expression`,type:`string`,description:`Expression to evaluate.`},{name:`objectGroup`,type:`string`,optional:!0,description:`String object group name to put result into (allows rapid releasing resulting object handles using <code>releaseObjectGroup</code>).`},{name:`includeCommandLineAPI`,type:`boolean`,optional:!0,description:`Specifies whether command line API should be available to the evaluated expression, defaults to false.`},{name:`doNotPauseOnExceptionsAndMuteConsole`,type:`boolean`,optional:!0,description:`Specifies whether evaluation should stop on exceptions and mute console. Overrides setPauseOnException state.`},{name:`returnByValue`,type:`boolean`,optional:!0,description:`Whether the result is expected to be a JSON object that should be sent by value.`},{name:`generatePreview`,type:`boolean`,optional:!0,description:`Whether preview should be generated for the result.`},{name:`saveResult`,type:`boolean`,optional:!0,description:`Whether the resulting value should be considered for saving in the $n history.`},{name:`emulateUserGesture`,type:`boolean`,optional:!0,description:`Whether the expression should be considered to be in a user gesture or not.`}],returns:[{name:`result`,$ref:`Runtime.RemoteObject`,description:`Object wrapper for the evaluation result.`},{name:`wasThrown`,type:`boolean`,optional:!0,description:`True if the result was thrown during the evaluation.`},{name:`savedResultIndex`,type:`integer`,optional:!0,description:`If the result was saved, this is the $n index that can be used to access the value.`}]},{name:`setShouldBlackboxURL`,description:`Sets whether the given URL should be in the list of blackboxed scripts, which are ignored when pausing.`,parameters:[{name:`url`,type:`string`},{name:`shouldBlackbox`,type:`boolean`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:`If <code>true</code>, <code>url</code> is case sensitive. Defaults to true.`},{name:`isRegex`,type:`boolean`,optional:!0,description:`If <code>true</code>, treat <code>url</code> as regular expression. Defaults to false.`},{name:`sourceRanges`,type:`array`,optional:!0,items:{type:`integer`},description:`If provided, limits where in the script the debugger will skip pauses. Expected structure is a repeated <code>[startLine, startColumn, endLine, endColumn]</code>. Ignored if <code>shouldBlackbox</code> is <code>false</code>.`}]},{name:`setBlackboxBreakpointEvaluations`,description:`Sets whether evaluation of breakpoint conditions, ignore counts, and actions happen at the location of the breakpoint or are deferred due to blackboxing.`,parameters:[{name:`blackboxBreakpointEvaluations`,type:`boolean`}]}]},{domain:`GenericTypes`,types:[{id:`SearchMatch`,type:`object`,properties:[{name:`lineNumber`,type:`number`,description:`Line number in resource content.`},{name:`lineContent`,type:`string`,description:`Line with match content.`}]}]},{domain:`Heap`,types:[{id:`GarbageCollection`,type:`object`,properties:[{name:`type`,type:`string`,enum:[`full`,`partial`],description:`The type of garbage collection.`},{name:`startTime`,type:`number`},{name:`endTime`,type:`number`}]},{id:`HeapSnapshotData`,type:`string`}],commands:[{name:`enable`,description:`Enables Heap domain events.`},{name:`disable`,description:`Disables Heap domain events.`},{name:`gc`,description:`Trigger a full garbage collection.`},{name:`snapshot`,description:`Take a heap snapshot.`,returns:[{name:`timestamp`,type:`number`},{name:`snapshotData`,$ref:`HeapSnapshotData`}]},{name:`startTracking`,description:"Start tracking heap changes. This will produce a `trackingStart` event."},{name:`stopTracking`,description:"Stop tracking heap changes. This will produce a `trackingComplete` event."},{name:`getPreview`,description:`Returns a preview (string, Debugger.FunctionDetails, or Runtime.ObjectPreview) for a Heap.HeapObjectId.`,parameters:[{name:`heapObjectId`,type:`integer`,description:`Identifier of the heap object within the snapshot.`}],returns:[{name:`string`,type:`string`,optional:!0,description:`String value.`},{name:`functionDetails`,$ref:`Debugger.FunctionDetails`,optional:!0,description:`Function details.`},{name:`preview`,$ref:`Runtime.ObjectPreview`,optional:!0,description:`Object preview.`}]},{name:`getRemoteObject`,description:`Returns the strongly referenced Runtime.RemoteObject for a Heap.HeapObjectId.`,parameters:[{name:`heapObjectId`,type:`integer`,description:`Identifier of the heap object within the snapshot.`},{name:`objectGroup`,type:`string`,optional:!0,description:`Symbolic group name that can be used to release multiple objects.`}],returns:[{name:`result`,$ref:`Runtime.RemoteObject`,description:`Resulting object.`}]}]},{domain:`IndexedDB`,types:[{id:`DatabaseWithObjectStores`,type:`object`,properties:[{name:`name`,type:`string`,description:`Database name.`},{name:`version`,type:`number`,description:`Database version.`},{name:`objectStores`,type:`array`,items:{$ref:`ObjectStore`},description:`Object stores in this database.`}]},{id:`ObjectStore`,type:`object`,properties:[{name:`name`,type:`string`,description:`Object store name.`},{name:`keyPath`,$ref:`KeyPath`,description:`Object store key path.`},{name:`autoIncrement`,type:`boolean`,description:`If true, object store has auto increment flag set.`},{name:`indexes`,type:`array`,items:{$ref:`ObjectStoreIndex`},description:`Indexes in this object store.`}]},{id:`ObjectStoreIndex`,type:`object`,properties:[{name:`name`,type:`string`,description:`Index name.`},{name:`keyPath`,$ref:`KeyPath`,description:`Index key path.`},{name:`unique`,type:`boolean`,description:`If true, index is unique.`},{name:`multiEntry`,type:`boolean`,description:`If true, index allows multiple entries for a key.`}]},{id:`Key`,type:`object`,properties:[{name:`type`,type:`string`,enum:[`number`,`string`,`date`,`array`],description:`Key type.`},{name:`number`,type:`number`,optional:!0,description:`Number value.`},{name:`string`,type:`string`,optional:!0,description:`String value.`},{name:`date`,type:`number`,optional:!0,description:`Date value.`},{name:`array`,type:`array`,optional:!0,items:{$ref:`Key`},description:`Array value.`}]},{id:`KeyRange`,type:`object`,properties:[{name:`lower`,$ref:`Key`,optional:!0,description:`Lower bound.`},{name:`upper`,$ref:`Key`,optional:!0,description:`Upper bound.`},{name:`lowerOpen`,type:`boolean`,description:`If true lower bound is open.`},{name:`upperOpen`,type:`boolean`,description:`If true upper bound is open.`}]},{id:`DataEntry`,type:`object`,properties:[{name:`key`,$ref:`Runtime.RemoteObject`,description:`Key.`},{name:`primaryKey`,$ref:`Runtime.RemoteObject`,description:`Primary key.`},{name:`value`,$ref:`Runtime.RemoteObject`,description:`Value.`}]},{id:`KeyPath`,type:`object`,properties:[{name:`type`,type:`string`,enum:[`null`,`string`,`array`],description:`Key path type.`},{name:`string`,type:`string`,optional:!0,description:`String value.`},{name:`array`,type:`array`,optional:!0,items:{type:`string`},description:`Array value.`}]}],commands:[{name:`enable`,description:`Enables events from backend.`},{name:`disable`,description:`Disables events from backend.`},{name:`requestDatabaseNames`,description:`Requests database names for given security origin.`,parameters:[{name:`securityOrigin`,type:`string`,description:`Security origin.`}],returns:[{name:`databaseNames`,type:`array`,items:{type:`string`},description:`Database names for origin.`}],async:!0},{name:`requestDatabase`,description:`Requests database with given name in given frame.`,parameters:[{name:`securityOrigin`,type:`string`,description:`Security origin.`},{name:`databaseName`,type:`string`,description:`Database name.`}],returns:[{name:`databaseWithObjectStores`,$ref:`DatabaseWithObjectStores`,description:`Database with an array of object stores.`}],async:!0},{name:`requestData`,description:`Requests data from object store or index.`,parameters:[{name:`securityOrigin`,type:`string`,description:`Security origin.`},{name:`databaseName`,type:`string`,description:`Database name.`},{name:`objectStoreName`,type:`string`,description:`Object store name.`},{name:`indexName`,type:`string`,description:`Index name, empty string for object store data requests.`},{name:`skipCount`,type:`integer`,description:`Number of records to skip.`},{name:`pageSize`,type:`integer`,description:`Number of records to fetch.`},{name:`keyRange`,$ref:`KeyRange`,optional:!0,description:`Key range.`}],returns:[{name:`objectStoreDataEntries`,type:`array`,items:{$ref:`DataEntry`},description:`Array of object store data entries.`},{name:`hasMore`,type:`boolean`,description:`If true, there are more entries to fetch in the given range.`}],async:!0},{name:`clearObjectStore`,description:`Clears all entries from an object store.`,parameters:[{name:`securityOrigin`,type:`string`,description:`Security origin.`},{name:`databaseName`,type:`string`,description:`Database name.`},{name:`objectStoreName`,type:`string`,description:`Object store name.`}],async:!0}]},{domain:`Inspector`,commands:[{name:`enable`,description:`Enables inspector domain notifications.`},{name:`disable`,description:`Disables inspector domain notifications.`},{name:`initialized`,description:`Sent by the frontend after all initialization messages have been sent.`}]},{domain:`LayerTree`,types:[{id:`LayerId`,type:`string`},{id:`PseudoElementId`,type:`string`},{id:`IntRect`,type:`object`,properties:[{name:`x`,type:`integer`,description:`The x position.`},{name:`y`,type:`integer`,description:`The y position.`},{name:`width`,type:`integer`,description:`The width metric.`},{name:`height`,type:`integer`,description:`The height metric.`}]},{id:`Layer`,type:`object`,properties:[{name:`layerId`,$ref:`LayerId`,description:`The unique id for this layer.`},{name:`nodeId`,$ref:`DOM.NodeId`,description:`The id for the node associated with this layer.`},{name:`bounds`,$ref:`IntRect`,description:`Bounds of the layer in absolute page coordinates.`},{name:`paintCount`,type:`integer`,description:`Indicates how many time this layer has painted.`},{name:`memory`,type:`integer`,description:`Estimated memory used by this layer.`},{name:`compositedBounds`,$ref:`IntRect`,description:`The bounds of the composited layer.`},{name:`isInShadowTree`,type:`boolean`,optional:!0,description:`Indicates whether this layer is associated with an element hosted in a shadow tree.`},{name:`isReflection`,type:`boolean`,optional:!0,description:`Indicates whether this layer was used to provide a reflection for the element.`},{name:`isGeneratedContent`,type:`boolean`,optional:!0,description:`Indicates whether the layer is attached to a pseudo element that is CSS generated content.`},{name:`isAnonymous`,type:`boolean`,optional:!0,description:`Indicates whether the layer was created for a CSS anonymous block or box.`},{name:`pseudoElementId`,$ref:`PseudoElementId`,optional:!0,description:`The id for the pseudo element associated with this layer.`},{name:`pseudoElement`,type:`string`,optional:!0,description:`The name of the CSS pseudo-element that prompted the layer to be generated.`}]},{id:`CompositingReasons`,type:`object`,properties:[{name:`transform3D`,type:`boolean`,optional:!0,description:`Composition due to association with an element with a CSS 3D transform.`},{name:`video`,type:`boolean`,optional:!0,description:`Composition due to association with a <video> element.`},{name:`canvas`,type:`boolean`,optional:!0,description:`Composition due to the element being a <canvas> element.`},{name:`plugin`,type:`boolean`,optional:!0,description:`Composition due to association with a plugin.`},{name:`iFrame`,type:`boolean`,optional:!0,description:`Composition due to association with an <iframe> element.`},{name:`model`,type:`boolean`,optional:!0,description:`Composition due to association with a <model> element.`},{name:`backfaceVisibilityHidden`,type:`boolean`,optional:!0,description:`Composition due to association with an element with a "backface-visibility: hidden" style.`},{name:`clipsCompositingDescendants`,type:`boolean`,optional:!0,description:`Composition due to association with an element clipping compositing descendants.`},{name:`animation`,type:`boolean`,optional:!0,description:`Composition due to association with an animated element.`},{name:`filters`,type:`boolean`,optional:!0,description:`Composition due to association with an element with CSS filters applied.`},{name:`positionFixed`,type:`boolean`,optional:!0,description:`Composition due to association with an element with a "position: fixed" style.`},{name:`positionSticky`,type:`boolean`,optional:!0,description:`Composition due to association with an element with a "position: sticky" style.`},{name:`overflowScrollingTouch`,type:`boolean`,optional:!0,description:`Composition due to association with an element with a "overflow-scrolling: touch" style.`},{name:`stacking`,type:`boolean`,optional:!0,description:`Composition due to association with an element establishing a stacking context.`},{name:`overlap`,type:`boolean`,optional:!0,description:`Composition due to association with an element overlapping other composited elements.`},{name:`negativeZIndexChildren`,type:`boolean`,optional:!0,description:`Composition due to association with an element with descendants that have a negative z-index.`},{name:`transformWithCompositedDescendants`,type:`boolean`,optional:!0,description:`Composition due to association with an element with composited descendants.`},{name:`opacityWithCompositedDescendants`,type:`boolean`,optional:!0,description:`Composition due to association with an element with opacity applied and composited descendants.`},{name:`maskWithCompositedDescendants`,type:`boolean`,optional:!0,description:`Composition due to association with a masked element and composited descendants.`},{name:`reflectionWithCompositedDescendants`,type:`boolean`,optional:!0,description:`Composition due to association with an element with a reflection and composited descendants.`},{name:`filterWithCompositedDescendants`,type:`boolean`,optional:!0,description:`Composition due to association with an element with CSS filters applied and composited descendants.`},{name:`blendingWithCompositedDescendants`,type:`boolean`,optional:!0,description:`Composition due to association with an element with CSS blending applied and composited descendants.`},{name:`isolatesCompositedBlendingDescendants`,type:`boolean`,optional:!0,description:`Composition due to association with an element isolating compositing descendants having CSS blending applied.`},{name:`perspective`,type:`boolean`,optional:!0,description:`Composition due to association with an element with perspective applied.`},{name:`preserve3D`,type:`boolean`,optional:!0,description:`Composition due to association with an element with a "transform-style: preserve-3d" style.`},{name:`willChange`,type:`boolean`,optional:!0,description:`Composition due to association with an element with a "will-change" style.`},{name:`root`,type:`boolean`,optional:!0,description:`Composition due to association with the root element.`},{name:`blending`,type:`boolean`,optional:!0,description:`Composition due to association with an element with a "blend-mode" style.`},{name:`backdropRoot`,type:`boolean`,optional:!0,description:`Composition due to association with an element that is a backdrop root`}]}],commands:[{name:`enable`,description:`Enables compositing tree inspection.`},{name:`disable`,description:`Disables compositing tree inspection.`},{name:`layersForNode`,description:`Returns the layer tree structure of the current page.`,parameters:[{name:`nodeId`,$ref:`DOM.NodeId`,description:`Root of the subtree for which we want to gather layers.`}],returns:[{name:`layers`,type:`array`,items:{$ref:`Layer`},description:`Child layers.`}]},{name:`reasonsForCompositingLayer`,description:`Provides the reasons why the given layer was composited.`,parameters:[{name:`layerId`,$ref:`LayerId`,description:`The id of the layer for which we want to get the reasons it was composited.`}],returns:[{name:`compositingReasons`,$ref:`CompositingReasons`,description:`An object containing the reasons why the layer was composited as properties.`}]},{name:`requestContent`,description:`Captures a snapshot of the layer's rendered content as a PNG data URL.`,parameters:[{name:`layerId`,$ref:`LayerId`,description:`The id of the layer to snapshot.`}],returns:[{name:`content`,type:`string`,description:`Base64-encoded PNG data URL of the layer's rendered content.`}]}]},{domain:`Memory`,types:[{id:`Event`,type:`object`,properties:[{name:`timestamp`,type:`number`},{name:`categories`,type:`array`,items:{$ref:`CategoryData`},description:`Breakdown of memory in categories.`}]},{id:`CategoryData`,type:`object`,properties:[{name:`type`,type:`string`,enum:[`javascript`,`jit`,`images`,`layers`,`page`,`other`],description:`Category type.`},{name:`size`,type:`number`,description:`Category size in bytes.`}]}],commands:[{name:`enable`,description:`Enables Memory domain events.`},{name:`disable`,description:`Disables Memory domain events.`},{name:`startTracking`,description:"Start tracking memory. This will produce a `trackingStart` event."},{name:`stopTracking`,description:"Stop tracking memory. This will produce a `trackingComplete` event."}]},{domain:`Network`,types:[{id:`LoaderId`,type:`string`},{id:`FrameId`,type:`string`},{id:`RequestId`,type:`string`},{id:`Timestamp`,type:`number`},{id:`Walltime`,type:`number`},{id:`ReferrerPolicy`,type:`string`,enum:[`empty-string`,`no-referrer`,`no-referrer-when-downgrade`,`same-origin`,`origin`,`strict-origin`,`origin-when-cross-origin`,`strict-origin-when-cross-origin`,`unsafe-url`]},{id:`Headers`,type:`object`},{id:`ResourceTiming`,type:`object`,properties:[{name:`startTime`,$ref:`Timestamp`,description:`Request is initiated`},{name:`redirectStart`,$ref:`Timestamp`,description:`Started redirect resolution.`},{name:`redirectEnd`,$ref:`Timestamp`,description:`Finished redirect resolution.`},{name:`fetchStart`,$ref:`Timestamp`,description:`Resource fetching started.`},{name:`domainLookupStart`,type:`number`,description:`Started DNS address resolve in milliseconds relative to fetchStart.`},{name:`domainLookupEnd`,type:`number`,description:`Finished DNS address resolve in milliseconds relative to fetchStart.`},{name:`connectStart`,type:`number`,description:`Started connecting to the remote host in milliseconds relative to fetchStart.`},{name:`connectEnd`,type:`number`,description:`Connected to the remote host in milliseconds relative to fetchStart.`},{name:`secureConnectionStart`,type:`number`,description:`Started SSL handshake in milliseconds relative to fetchStart.`},{name:`requestStart`,type:`number`,description:`Started sending request in milliseconds relative to fetchStart.`},{name:`responseStart`,type:`number`,description:`Started receiving response headers in milliseconds relative to fetchStart.`},{name:`responseEnd`,type:`number`,description:`Finished receiving response headers in milliseconds relative to fetchStart.`}]},{id:`Request`,type:`object`,properties:[{name:`url`,type:`string`,description:`Request URL.`},{name:`method`,type:`string`,description:`HTTP request method.`},{name:`headers`,$ref:`Headers`,description:`HTTP request headers.`},{name:`postData`,type:`string`,optional:!0,description:`HTTP POST request data.`},{name:`referrerPolicy`,$ref:`ReferrerPolicy`,optional:!0,description:`The level of included referrer information.`},{name:`integrity`,type:`string`,optional:!0,description:`The base64 cryptographic hash of the resource.`}]},{id:`Response`,type:`object`,properties:[{name:`url`,type:`string`,description:`Response URL. This URL can be different from CachedResource.url in case of redirect.`},{name:`status`,type:`integer`,description:`HTTP response status code.`},{name:`statusText`,type:`string`,description:`HTTP response status text.`},{name:`headers`,$ref:`Headers`,description:`HTTP response headers.`},{name:`mimeType`,type:`string`,description:`Resource mimeType as determined by the browser.`},{name:`source`,type:`string`,enum:[`unknown`,`network`,`memory-cache`,`disk-cache`,`service-worker`,`inspector-override`],description:`Specifies where the response came from.`},{name:`requestHeaders`,$ref:`Headers`,optional:!0,description:`Refined HTTP request headers that were actually transmitted over the network.`},{name:`timing`,$ref:`ResourceTiming`,optional:!0,description:`Timing information for the given request.`},{name:`security`,$ref:`Security.Security`,optional:!0,description:`The security information for the given request.`}]},{id:`Metrics`,type:`object`,properties:[{name:`protocol`,type:`string`,optional:!0,description:`Network protocol. ALPN Protocol ID Identification Sequence, as per RFC 7301 (for example, http/2, http/1.1, spdy/3.1)`},{name:`priority`,type:`string`,optional:!0,enum:[`low`,`medium`,`high`],description:`Network priority.`},{name:`connectionIdentifier`,type:`string`,optional:!0,description:`Connection identifier.`},{name:`remoteAddress`,type:`string`,optional:!0,description:`Remote IP address.`},{name:`requestHeaders`,$ref:`Headers`,optional:!0,description:`Refined HTTP request headers that were actually transmitted over the network.`},{name:`requestHeaderBytesSent`,type:`number`,optional:!0,description:`Total HTTP request header bytes sent over the network.`},{name:`requestBodyBytesSent`,type:`number`,optional:!0,description:`Total HTTP request body bytes sent over the network.`},{name:`responseHeaderBytesReceived`,type:`number`,optional:!0,description:`Total HTTP response header bytes received over the network.`},{name:`responseBodyBytesReceived`,type:`number`,optional:!0,description:`Total HTTP response body bytes received over the network.`},{name:`responseBodyDecodedSize`,type:`number`,optional:!0,description:`Total decoded response body size in bytes.`},{name:`securityConnection`,$ref:`Security.Connection`,optional:!0,description:`Connection information for the completed request.`},{name:`isProxyConnection`,type:`boolean`,optional:!0,description:`Whether or not the connection was proxied through a server. If <code>true</code>, the <code>remoteAddress</code> will be for the proxy server, not the server that provided the resource to the proxy server.`}]},{id:`WebSocketRequest`,type:`object`,properties:[{name:`headers`,$ref:`Headers`,description:`HTTP response headers.`}]},{id:`WebSocketResponse`,type:`object`,properties:[{name:`status`,type:`integer`,description:`HTTP response status code.`},{name:`statusText`,type:`string`,description:`HTTP response status text.`},{name:`headers`,$ref:`Headers`,description:`HTTP response headers.`}]},{id:`WebSocketFrame`,type:`object`,properties:[{name:`opcode`,type:`number`,description:`WebSocket frame opcode.`},{name:`mask`,type:`boolean`,description:`WebSocket frame mask.`},{name:`payloadData`,type:`string`,description:`WebSocket frame payload data, binary frames (opcode = 2) are base64-encoded.`},{name:`payloadLength`,type:`number`,description:`WebSocket frame payload length in bytes.`}]},{id:`CachedResource`,type:`object`,properties:[{name:`url`,type:`string`,description:`Resource URL. This is the url of the original network request.`},{name:`type`,$ref:`Page.ResourceType`,description:`Type of this resource.`},{name:`response`,$ref:`Response`,optional:!0,description:`Cached response data.`},{name:`bodySize`,type:`number`,description:`Cached response body size.`},{name:`sourceMapURL`,type:`string`,optional:!0,description:`URL of source map associated with this resource (if any).`}]},{id:`Initiator`,type:`object`,properties:[{name:`type`,type:`string`,enum:[`parser`,`script`,`other`],description:`Type of this initiator.`},{name:`stackTrace`,$ref:`Console.StackTrace`,optional:!0,description:`Initiator JavaScript stack trace, set for Script only.`},{name:`url`,type:`string`,optional:!0,description:`Initiator URL, set for Parser type only.`},{name:`lineNumber`,type:`number`,optional:!0,description:`Initiator line number, set for Parser type only.`},{name:`nodeId`,$ref:`DOM.NodeId`,optional:!0,description:`Set if the load was triggered by a DOM node, in addition to the other initiator information.`}]},{id:`NetworkStage`,type:`string`,enum:[`request`,`response`]},{id:`ResourceErrorType`,type:`string`,enum:[`General`,`AccessControl`,`Cancellation`,`Timeout`]}],commands:[{name:`enable`,description:`Enables network tracking, network events will now be delivered to the client.`},{name:`disable`,description:`Disables network tracking, prevents network events from being sent to the client.`},{name:`setExtraHTTPHeaders`,description:`Specifies whether to always send extra HTTP headers with the requests from this page.`,parameters:[{name:`headers`,$ref:`Headers`,description:`Map with extra HTTP headers.`}]},{name:`getResponseBody`,description:`Returns content served for the given request.`,parameters:[{name:`requestId`,$ref:`RequestId`,description:`Identifier of the network request to get content for.`}],returns:[{name:`body`,type:`string`,description:`Response body.`},{name:`base64Encoded`,type:`boolean`,description:`True, if content was sent as base64.`}],async:!0},{name:`setResourceCachingDisabled`,description:`Toggles whether the resource cache may be used when loading resources in the inspected page. If <code>true</code>, the resource cache will not be used when loading resources.`,parameters:[{name:`disabled`,type:`boolean`,description:`Whether to prevent usage of the resource cache.`}]},{name:`setClearResourceDataOnNavigate`,description:`Toggles whether resource data is cleared on page navigations / reloads.`,parameters:[{name:`clearResourceDataOnNavigate`,type:`boolean`,description:`Whether to clear resource data on navigations.`}]},{name:`loadResource`,description:`Loads a resource in the context of a frame on the inspected page without cross origin checks.`,parameters:[{name:`frameId`,$ref:`FrameId`,description:`Frame to load the resource from.`},{name:`url`,type:`string`,description:`URL of the resource to load.`}],returns:[{name:`content`,type:`string`,description:`Resource content.`},{name:`mimeType`,type:`string`,description:`Resource mimeType.`},{name:`status`,type:`integer`,description:`HTTP response status code.`}],async:!0},{name:`getSerializedCertificate`,description:`Fetches a serialized secure certificate for the given requestId to be displayed via InspectorFrontendHost.showCertificate.`,parameters:[{name:`requestId`,$ref:`RequestId`}],returns:[{name:`serializedCertificate`,type:`string`,description:`Represents a base64 encoded WebCore::CertificateInfo object.`}]},{name:`resolveWebSocket`,description:`Resolves JavaScript WebSocket object for given request id.`,parameters:[{name:`requestId`,$ref:`RequestId`,description:`Identifier of the WebSocket resource to resolve.`},{name:`objectGroup`,type:`string`,optional:!0,description:`Symbolic group name that can be used to release multiple objects.`}],returns:[{name:`object`,$ref:`Runtime.RemoteObject`,description:`JavaScript object wrapper for given node.`}]},{name:`setInterceptionEnabled`,description:`Enable interception of network requests.`,parameters:[{name:`enabled`,type:`boolean`}]},{name:`addInterception`,description:`Add an interception.`,parameters:[{name:`url`,type:`string`,description:`URL pattern to intercept, intercept everything if not specified or empty`},{name:`stage`,$ref:`NetworkStage`,description:`Stage to intercept.`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:"If false, ignores letter casing of `url` parameter."},{name:`isRegex`,type:`boolean`,optional:!0,description:"If true, treats `url` parameter as a regular expression."}]},{name:`removeInterception`,description:`Remove an interception.`,parameters:[{name:`url`,type:`string`},{name:`stage`,$ref:`NetworkStage`,description:`Stage to intercept.`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:"If false, ignores letter casing of `url` parameter."},{name:`isRegex`,type:`boolean`,optional:!0,description:"If true, treats `url` parameter as a regular expression."}]},{name:`interceptContinue`,description:`Continue request or response without modifications.`,parameters:[{name:`requestId`,$ref:`RequestId`,description:`Identifier for the intercepted Network request or response to continue.`},{name:`stage`,$ref:`NetworkStage`,description:`Stage to continue.`}]},{name:`interceptWithRequest`,description:`Replace intercepted request with the provided one.`,parameters:[{name:`requestId`,$ref:`RequestId`,description:`Identifier for the intercepted Network request or response to continue.`},{name:`url`,type:`string`,optional:!0,description:`HTTP request url.`},{name:`method`,type:`string`,optional:!0,description:`HTTP request method.`},{name:`headers`,$ref:`Headers`,optional:!0,description:`HTTP response headers. Pass through original values if unmodified.`},{name:`postData`,type:`string`,optional:!0,description:`HTTP POST request data, base64-encoded.`}]},{name:`interceptWithResponse`,description:`Provide response content for an intercepted response.`,parameters:[{name:`requestId`,$ref:`RequestId`,description:`Identifier for the intercepted Network response to modify.`},{name:`content`,type:`string`},{name:`base64Encoded`,type:`boolean`,description:`True, if content was sent as base64.`},{name:`mimeType`,type:`string`,optional:!0,description:`MIME Type for the data.`},{name:`status`,type:`integer`,optional:!0,description:`HTTP response status code. Pass through original values if unmodified.`},{name:`statusText`,type:`string`,optional:!0,description:`HTTP response status text. Pass through original values if unmodified.`},{name:`headers`,$ref:`Headers`,optional:!0,description:`HTTP response headers. Pass through original values if unmodified.`}]},{name:`interceptRequestWithResponse`,description:`Provide response for an intercepted request. Request completely bypasses the network in this case and is immediately fulfilled with the provided data.`,parameters:[{name:`requestId`,$ref:`RequestId`,description:`Identifier for the intercepted Network response to modify.`},{name:`content`,type:`string`},{name:`base64Encoded`,type:`boolean`,description:`True, if content was sent as base64.`},{name:`mimeType`,type:`string`,description:`MIME Type for the data.`},{name:`status`,type:`integer`,description:`HTTP response status code.`},{name:`statusText`,type:`string`,description:`HTTP response status text.`},{name:`headers`,$ref:`Headers`,description:`HTTP response headers.`}]},{name:`interceptRequestWithError`,description:`Fail request with given error type.`,parameters:[{name:`requestId`,$ref:`RequestId`,description:`Identifier for the intercepted Network request to fail.`},{name:`errorType`,$ref:`ResourceErrorType`,description:`Deliver error reason for the request failure.`}]},{name:`setEmulatedConditions`,description:`Emulate various network conditions (e.g. bytes per second, latency, etc.).`,parameters:[{name:`bytesPerSecondLimit`,type:`integer`,optional:!0,description:`Limits the bytes per second of requests if positive. Removes any limits if zero or not provided.`}]}]},{domain:`Page`,types:[{id:`Setting`,type:`string`,enum:[`PrivateClickMeasurementDebugModeEnabled`,`AuthorAndUserStylesEnabled`,`ICECandidateFilteringEnabled`,`ITPDebugModeEnabled`,`ImagesEnabled`,`MediaCaptureRequiresSecureConnection`,`MockCaptureDevicesEnabled`,`NeedsSiteSpecificQuirks`,`ScriptEnabled`,`ShowDebugBorders`,`ShowRepaintCounter`,`WebSecurityEnabled`]},{id:`UserPreference`,type:`object`,properties:[{name:`name`,$ref:`UserPreferenceName`,description:`Preference name.`},{name:`value`,$ref:`UserPreferenceValue`,description:`Preference value.`}]},{id:`UserPreferenceName`,type:`string`,enum:[`PrefersReducedMotion`,`PrefersContrast`,`PrefersColorScheme`]},{id:`UserPreferenceValue`,type:`string`,enum:[`NoPreference`,`Reduce`,`More`,`Light`,`Dark`]},{id:`ResourceType`,type:`string`,enum:[`Document`,`StyleSheet`,`Image`,`Font`,`Script`,`XHR`,`Fetch`,`Ping`,`Beacon`,`WebSocket`,`EventSource`,`Other`]},{id:`CoordinateSystem`,type:`string`,enum:[`Viewport`,`Page`]},{id:`CookieSameSitePolicy`,type:`string`,enum:[`None`,`Lax`,`Strict`]},{id:`Frame`,type:`object`,properties:[{name:`id`,type:`string`,description:`Frame unique identifier.`},{name:`parentId`,type:`string`,optional:!0,description:`Parent frame identifier.`},{name:`loaderId`,$ref:`Network.LoaderId`,description:`Identifier of the loader associated with this frame.`},{name:`name`,type:`string`,optional:!0,description:`Frame's name as specified in the tag.`},{name:`url`,type:`string`,description:`Frame document's URL.`},{name:`securityOrigin`,type:`string`,description:`Frame document's security origin.`},{name:`mimeType`,type:`string`,description:`Frame document's mimeType as determined by the browser.`}]},{id:`FrameResource`,type:`object`,properties:[{name:`url`,type:`string`,description:`Resource URL.`},{name:`type`,$ref:`ResourceType`,description:`Type of this resource.`},{name:`mimeType`,type:`string`,description:`Resource mimeType as determined by the browser.`},{name:`failed`,type:`boolean`,optional:!0,description:`True if the resource failed to load.`},{name:`canceled`,type:`boolean`,optional:!0,description:`True if the resource was canceled during loading.`},{name:`sourceMapURL`,type:`string`,optional:!0,description:`URL of source map associated with this resource (if any).`},{name:`targetId`,type:`string`,optional:!0,description:`Identifier for the context of where the load originated. In general this is the target identifier. For Workers this will be the workerId.`}]},{id:`FrameResourceTree`,type:`object`,properties:[{name:`frame`,$ref:`Frame`,description:`Frame information for this tree item.`},{name:`childFrames`,type:`array`,optional:!0,items:{$ref:`FrameResourceTree`},description:`Child frames.`},{name:`resources`,type:`array`,items:{$ref:`FrameResource`},description:`Information about frame resources.`}]},{id:`SearchResult`,type:`object`,properties:[{name:`url`,type:`string`,description:`Resource URL.`},{name:`frameId`,$ref:`Network.FrameId`,description:`Resource frame id.`},{name:`matchesCount`,type:`number`,description:`Number of matches in the resource content.`},{name:`requestId`,$ref:`Network.RequestId`,optional:!0,description:`Network request id.`}]},{id:`Cookie`,type:`object`,properties:[{name:`name`,type:`string`,description:`Cookie name.`},{name:`value`,type:`string`,description:`Cookie value.`},{name:`domain`,type:`string`,description:`Cookie domain.`},{name:`path`,type:`string`,description:`Cookie path.`},{name:`expires`,type:`number`,description:`Cookie expires.`},{name:`session`,type:`boolean`,description:`True in case of session cookie.`},{name:`httpOnly`,type:`boolean`,description:`True if cookie is http-only.`},{name:`secure`,type:`boolean`,description:`True if cookie is secure.`},{name:`sameSite`,$ref:`CookieSameSitePolicy`,description:`Cookie Same-Site policy.`},{name:`partitionKey`,type:`string`,optional:!0,description:`Cookie partition key. If null and partitioned property is true, then key must be computed.`}]}],commands:[{name:`enable`,description:`Enables page domain notifications.`},{name:`disable`,description:`Disables page domain notifications.`},{name:`reload`,description:`Reloads the main frame of the inspected page.`,parameters:[{name:`ignoreCache`,type:`boolean`,optional:!0,description:`If true, the page is reloaded from its origin without using cached resources.`},{name:`revalidateAllResources`,type:`boolean`,optional:!0,description:`If true, all cached subresources will be revalidated when the main resource loads. Otherwise, only expired cached subresources will be revalidated (the default behavior for most WebKit clients).`}]},{name:`overrideUserAgent`,description:`Override's the user agent of the inspected page`,parameters:[{name:`value`,type:`string`,optional:!0,description:`Value to override the user agent with. If this value is not provided, the override is removed. Overrides are removed when Web Inspector closes/disconnects.`}]},{name:`overrideSetting`,description:`Allows the frontend to override the inspected page's settings.`,parameters:[{name:`setting`,$ref:`Setting`},{name:`value`,type:`boolean`,optional:!0,description:`Value to override the setting with. If this value is not provided, the override is removed. Overrides are removed when Web Inspector closes/disconnects.`}]},{name:`overrideUserPreference`,description:`Allows the frontend to override the user's preferences on the inspected page.`,parameters:[{name:`name`,$ref:`UserPreferenceName`},{name:`value`,$ref:`UserPreferenceValue`,optional:!0,description:`Value to override the user preference with. If this value is not provided, the override is removed. Overrides are removed when Web Inspector closes/disconnects.`}]},{name:`getCookies`,description:`Returns all browser cookies. Depending on the backend support, will return detailed cookie information in the <code>cookies</code> field.`,returns:[{name:`cookies`,type:`array`,items:{$ref:`Cookie`},description:`Array of cookie objects.`}]},{name:`setCookie`,description:`Sets a new browser cookie with the given name, domain, and path.`,parameters:[{name:`cookie`,$ref:`Cookie`},{name:`shouldPartition`,type:`boolean`,optional:!0,description:`If true, then cookie's partition key should be set.`}]},{name:`deleteCookie`,description:`Deletes browser cookie with given name, domain, and path.`,parameters:[{name:`cookieName`,type:`string`,description:`Name of the cookie to remove.`},{name:`url`,type:`string`,description:`URL to match cookie domain and path.`}]},{name:`getResourceTree`,description:`Returns present frame / resource tree structure.`,returns:[{name:`frameTree`,$ref:`FrameResourceTree`,description:`Present frame / resource tree structure.`}],async:!0},{name:`getResourceContent`,description:`Returns content of the given resource.`,parameters:[{name:`frameId`,$ref:`Network.FrameId`,description:`Frame id to get resource for.`},{name:`url`,type:`string`,description:`URL of the resource to get content for.`}],returns:[{name:`content`,type:`string`,description:`Resource content.`},{name:`base64Encoded`,type:`boolean`,description:`True, if content was served as base64.`}]},{name:`setBootstrapScript`,parameters:[{name:`source`,type:`string`,optional:!0,description:"If `source` is provided (and not empty), it will be injected into all future global objects as soon as they're created. Omitting `source` will stop this from happening."}]},{name:`searchInResource`,description:`Searches for given string in resource content.`,parameters:[{name:`frameId`,$ref:`Network.FrameId`,description:`Frame id for resource to search in.`},{name:`url`,type:`string`,description:`URL of the resource to search in.`},{name:`query`,type:`string`,description:`String to search for.`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:`If true, search is case sensitive.`},{name:`isRegex`,type:`boolean`,optional:!0,description:`If true, treats string parameter as regex.`},{name:`requestId`,$ref:`Network.RequestId`,optional:!0,description:`Request id for resource to search in.`}],returns:[{name:`result`,type:`array`,items:{$ref:`GenericTypes.SearchMatch`},description:`List of search matches.`}]},{name:`searchInResources`,description:`Searches for given string in frame / resource tree structure.`,parameters:[{name:`text`,type:`string`,description:`String to search for.`},{name:`caseSensitive`,type:`boolean`,optional:!0,description:`If true, search is case sensitive.`},{name:`isRegex`,type:`boolean`,optional:!0,description:`If true, treats string parameter as regex.`}],returns:[{name:`result`,type:`array`,items:{$ref:`SearchResult`},description:`List of search results.`}]},{name:`setShowRulers`,description:`Requests that backend draw rulers in the inspector overlay`,parameters:[{name:`result`,type:`boolean`,description:`True for showing rulers`}]},{name:`setShowPaintRects`,description:`Requests that backend shows paint rectangles`,parameters:[{name:`result`,type:`boolean`,description:`True for showing paint rectangles`}]},{name:`setEmulatedMedia`,description:`Emulates the given media for CSS media queries.`,parameters:[{name:`media`,type:`string`,description:`Media type to emulate. Empty string disables the override.`}]},{name:`snapshotNode`,description:`Capture a snapshot of the specified node that does not include unrelated layers.`,parameters:[{name:`nodeId`,$ref:`DOM.NodeId`,description:`Id of the node to snapshot.`}],returns:[{name:`dataURL`,type:`string`,description:`Base64-encoded image data (PNG).`}]},{name:`snapshotRect`,description:`Capture a snapshot of the page within the specified rectangle and coordinate system.`,parameters:[{name:`x`,type:`integer`,description:`X coordinate`},{name:`y`,type:`integer`,description:`Y coordinate`},{name:`width`,type:`integer`,description:`Rectangle width`},{name:`height`,type:`integer`,description:`Rectangle height`},{name:`coordinateSystem`,$ref:`CoordinateSystem`,description:`Indicates the coordinate system of the supplied rectangle.`}],returns:[{name:`dataURL`,type:`string`,description:`Base64-encoded image data (PNG).`}]},{name:`archive`,description:`Grab an archive of the page.`,returns:[{name:`data`,type:`string`,description:`Base64-encoded web archive.`}]},{name:`setScreenSizeOverride`,description:`Overrides screen size exposed to DOM and used in media queries for testing with provided values.`,parameters:[{name:`width`,type:`integer`,optional:!0,description:`Screen width`},{name:`height`,type:`integer`,optional:!0,description:`Screen height`}]}]},{domain:`Recording`,types:[{id:`Type`,type:`string`,enum:[`canvas-2d`,`offscreen-canvas-2d`,`canvas-bitmaprenderer`,`offscreen-canvas-bitmaprenderer`,`canvas-webgl`,`offscreen-canvas-webgl`,`canvas-webgl2`,`offscreen-canvas-webgl2`]},{id:`Initiator`,type:`string`,enum:[`frontend`,`console`,`auto-capture`]},{id:`InitialState`,type:`object`,properties:[{name:`attributes`,type:`object`,optional:!0,description:`Key-value map for each attribute of the state.`},{name:`states`,type:`array`,optional:!0,items:{type:`object`},description:`Array of saved states of the context.`},{name:`parameters`,type:`array`,optional:!0,items:{type:`any`},description:`Array of values that were used to construct the recorded object.`},{name:`content`,type:`string`,optional:!0,description:`Current content at the start of the recording.`}]},{id:`Frame`,type:`object`,properties:[{name:`actions`,type:`array`,items:{type:`any`},description:`Information about an action made to the recorded object. Follows the structure [name, parameters, swizzleTypes, stackTrace, snapshot], where name is a string, parameters is an array, swizzleTypes is an array, stackTrace is a Console.StackTrace, and snapshot is a data URL image of the current contents after this action.`},{name:`duration`,type:`number`,optional:!0,description:`Total execution time of all actions recorded in this frame in milliseconds. `},{name:`incomplete`,type:`boolean`,optional:!0,description:`Flag indicating if the recording was stopped before this frame ended.`}]},{id:`Recording`,type:`object`,properties:[{name:`version`,type:`integer`,description:`Used for future/backwards compatibility.`},{name:`type`,$ref:`Type`},{name:`initialState`,$ref:`InitialState`,description:`JSON data of inital state of object before recording.`},{name:`data`,type:`array`,items:{type:`any`},description:`Array of objects that can be referenced by index. Used to avoid duplicating objects.`},{name:`name`,type:`string`,optional:!0}]}]},{domain:`Runtime`,types:[{id:`RemoteObjectId`,type:`string`},{id:`RemoteObject`,type:`object`,properties:[{name:`type`,type:`string`,enum:[`object`,`function`,`undefined`,`string`,`number`,`boolean`,`symbol`,`bigint`],description:`Object type.`},{name:`subtype`,type:`string`,optional:!0,enum:[`array`,`null`,`node`,`regexp`,`date`,`error`,`map`,`set`,`weakmap`,`weakset`,`iterator`,`class`,`proxy`,`weakref`],description:`Object subtype hint. Specified for <code>object</code> <code>function</code> (for class) type values only.`},{name:`className`,type:`string`,optional:!0,description:`Object class (constructor) name. Specified for <code>object</code> type values only.`},{name:`value`,type:`any`,optional:!0,description:`Remote object value (in case of primitive values or JSON values if it was requested).`},{name:`description`,type:`string`,optional:!0,description:`String representation of the object.`},{name:`objectId`,$ref:`RemoteObjectId`,optional:!0,description:`Unique object identifier (for non-primitive values).`},{name:`size`,type:`integer`,optional:!0,description:`Size of the array/collection. Specified for array/map/set/weakmap/weakset object type values only.`},{name:`classPrototype`,$ref:`RemoteObject`,optional:!0,description:`Remote object for the class prototype. Specified for class object type values only.`},{name:`preview`,$ref:`ObjectPreview`,optional:!0,description:`Preview containing abbreviated property values. Specified for <code>object</code> type values only.`}]},{id:`ObjectPreview`,type:`object`,properties:[{name:`type`,type:`string`,enum:[`object`,`function`,`undefined`,`string`,`number`,`boolean`,`symbol`,`bigint`],description:`Object type.`},{name:`subtype`,type:`string`,optional:!0,enum:[`array`,`null`,`node`,`regexp`,`date`,`error`,`map`,`set`,`weakmap`,`weakset`,`iterator`,`class`,`proxy`,`weakref`],description:`Object subtype hint. Specified for <code>object</code> type values only.`},{name:`description`,type:`string`,optional:!0,description:`String representation of the object.`},{name:`lossless`,type:`boolean`,description:`Determines whether preview is lossless (contains all information of the original object).`},{name:`overflow`,type:`boolean`,optional:!0,description:`True iff some of the properties of the original did not fit.`},{name:`properties`,type:`array`,optional:!0,items:{$ref:`PropertyPreview`},description:`List of the properties.`},{name:`entries`,type:`array`,optional:!0,items:{$ref:`EntryPreview`},description:`List of the entries. Specified for <code>map</code> and <code>set</code> subtype values only.`},{name:`size`,type:`integer`,optional:!0,description:`Size of the array/collection. Specified for array/map/set/weakmap/weakset object type values only.`}]},{id:`PropertyPreview`,type:`object`,properties:[{name:`name`,type:`string`,description:`Property name.`},{name:`type`,type:`string`,enum:[`object`,`function`,`undefined`,`string`,`number`,`boolean`,`symbol`,`bigint`,`accessor`],description:`Object type.`},{name:`subtype`,type:`string`,optional:!0,enum:[`array`,`null`,`node`,`regexp`,`date`,`error`,`map`,`set`,`weakmap`,`weakset`,`iterator`,`class`,`proxy`,`weakref`],description:`Object subtype hint. Specified for <code>object</code> type values only.`},{name:`value`,type:`string`,optional:!0,description:`User-friendly property value string.`},{name:`valuePreview`,$ref:`ObjectPreview`,optional:!0,description:`Nested value preview.`},{name:`isPrivate`,type:`boolean`,optional:!0,description:`True if this is a private field.`},{name:`internal`,type:`boolean`,optional:!0,description:`True if this is an internal property.`}]},{id:`EntryPreview`,type:`object`,properties:[{name:`key`,$ref:`ObjectPreview`,optional:!0,description:`Entry key. Specified for map-like collection entries.`},{name:`value`,$ref:`ObjectPreview`,description:`Entry value.`}]},{id:`CollectionEntry`,type:`object`,properties:[{name:`key`,$ref:`Runtime.RemoteObject`,optional:!0,description:`Entry key of a map-like collection, otherwise not provided.`},{name:`value`,$ref:`Runtime.RemoteObject`,description:`Entry value.`}]},{id:`PropertyDescriptor`,type:`object`,properties:[{name:`name`,type:`string`,description:`Property name or symbol description.`},{name:`value`,$ref:`RemoteObject`,optional:!0,description:`The value associated with the property.`},{name:`writable`,type:`boolean`,optional:!0,description:`True if the value associated with the property may be changed (data descriptors only).`},{name:`get`,$ref:`RemoteObject`,optional:!0,description:`A function which serves as a getter for the property, or <code>undefined</code> if there is no getter (accessor descriptors only).`},{name:`set`,$ref:`RemoteObject`,optional:!0,description:`A function which serves as a setter for the property, or <code>undefined</code> if there is no setter (accessor descriptors only).`},{name:`wasThrown`,type:`boolean`,optional:!0,description:`True if the result was thrown during the evaluation.`},{name:`configurable`,type:`boolean`,optional:!0,description:`True if the type of this property descriptor may be changed and if the property may be deleted from the corresponding object.`},{name:`enumerable`,type:`boolean`,optional:!0,description:`True if this property shows up during enumeration of the properties on the corresponding object.`},{name:`isOwn`,type:`boolean`,optional:!0,description:`True if the property is owned for the object.`},{name:`symbol`,$ref:`Runtime.RemoteObject`,optional:!0,description:`Property symbol object, if the property is a symbol.`},{name:`isPrivate`,$ref:`boolean`,optional:!0,description:`True if the property is a private field.`},{name:`nativeGetter`,type:`boolean`,optional:!0,description:`True if the property value came from a native getter.`}]},{id:`InternalPropertyDescriptor`,type:`object`,properties:[{name:`name`,type:`string`,description:`Conventional property name.`},{name:`value`,$ref:`RemoteObject`,optional:!0,description:`The value associated with the property.`}]},{id:`CallArgument`,type:`object`,properties:[{name:`value`,type:`any`,optional:!0,description:`Primitive value.`},{name:`objectId`,$ref:`RemoteObjectId`,optional:!0,description:`Remote object handle.`}]},{id:`ExecutionContextId`,type:`integer`},{id:`ExecutionContextType`,type:`string`,enum:[`normal`,`user`,`internal`]},{id:`ExecutionContextDescription`,type:`object`,properties:[{name:`id`,$ref:`ExecutionContextId`,description:`Unique id of the execution context. It can be used to specify in which execution context script evaluation should be performed.`},{name:`type`,$ref:`ExecutionContextType`},{name:`name`,type:`string`,description:`Human readable name describing given context.`},{name:`frameId`,$ref:`Network.FrameId`,description:`Id of the owning frame.`}]},{id:`SyntaxErrorType`,type:`string`,enum:[`none`,`irrecoverable`,`unterminated-literal`,`recoverable`]},{id:`ErrorRange`,type:`object`,properties:[{name:`startOffset`,type:`integer`,description:`Start offset of range (inclusive).`},{name:`endOffset`,type:`integer`,description:`End offset of range (exclusive).`}]},{id:`StructureDescription`,type:`object`,properties:[{name:`fields`,type:`array`,optional:!0,items:{type:`string`},description:`Array of strings, where the strings represent object properties.`},{name:`optionalFields`,type:`array`,optional:!0,items:{type:`string`},description:`Array of strings, where the strings represent optional object properties.`},{name:`constructorName`,type:`string`,optional:!0,description:`Name of the constructor.`},{name:`prototypeStructure`,$ref:`StructureDescription`,optional:!0,description:`Pointer to the StructureRepresentation of the protoype if one exists.`},{name:`isImprecise`,type:`boolean`,optional:!0,description:`If true, it indicates that the fields in this StructureDescription may be inaccurate. I.e, there might have been fields that have been deleted before it was profiled or it has fields we haven't profiled.`}]},{id:`TypeSet`,type:`object`,properties:[{name:`isFunction`,type:`boolean`,description:`Indicates if this type description has been type Function.`},{name:`isUndefined`,type:`boolean`,description:`Indicates if this type description has been type Undefined.`},{name:`isNull`,type:`boolean`,description:`Indicates if this type description has been type Null.`},{name:`isBoolean`,type:`boolean`,description:`Indicates if this type description has been type Boolean.`},{name:`isInteger`,type:`boolean`,description:`Indicates if this type description has been type Integer.`},{name:`isNumber`,type:`boolean`,description:`Indicates if this type description has been type Number.`},{name:`isString`,type:`boolean`,description:`Indicates if this type description has been type String.`},{name:`isObject`,type:`boolean`,description:`Indicates if this type description has been type Object.`},{name:`isSymbol`,type:`boolean`,description:`Indicates if this type description has been type Symbol.`},{name:`isBigInt`,type:`boolean`,description:`Indicates if this type description has been type BigInt.`}]},{id:`TypeDescription`,type:`object`,properties:[{name:`isValid`,type:`boolean`,description:`If true, we were able to correlate the offset successfuly with a program location. If false, the offset may be bogus or the offset may be from a CodeBlock that hasn't executed.`},{name:`leastCommonAncestor`,type:`string`,optional:!0,description:`Least common ancestor of all Constructors if the TypeDescription has seen any structures. This string is the display name of the shared constructor function.`},{name:`typeSet`,$ref:`TypeSet`,optional:!0,description:`Set of booleans for determining the aggregate type of this type description.`},{name:`structures`,type:`array`,optional:!0,items:{$ref:`StructureDescription`},description:`Array of descriptions for all structures seen for this variable.`},{name:`isTruncated`,type:`boolean`,optional:!0,description:`If true, this indicates that no more structures are being profiled because some maximum threshold has been reached and profiling has stopped because of memory pressure.`}]},{id:`TypeLocation`,type:`object`,properties:[{name:`typeInformationDescriptor`,type:`integer`,description:`What kind of type information do we want (normal, function return values, 'this' statement).`},{name:`sourceID`,type:`string`,description:`sourceID uniquely identifying a script`},{name:`divot`,type:`integer`,description:`character offset for assignment range`}]},{id:`BasicBlock`,type:`object`,properties:[{name:`startOffset`,type:`integer`,description:`Start offset of the basic block.`},{name:`endOffset`,type:`integer`,description:`End offset of the basic block.`},{name:`hasExecuted`,type:`boolean`,description:`Indicates if the basic block has executed before.`},{name:`executionCount`,type:`integer`,description:`Indicates how many times the basic block has executed.`}]}],commands:[{name:`parse`,description:`Parses JavaScript source code for errors.`,parameters:[{name:`source`,type:`string`,description:`Source code to parse.`}],returns:[{name:`result`,$ref:`SyntaxErrorType`,description:`Parse result.`},{name:`message`,type:`string`,optional:!0,description:`Parse error message.`},{name:`range`,$ref:`ErrorRange`,optional:!0,description:`Range in the source where the error occurred.`}]},{name:`evaluate`,description:`Evaluates expression on global object.`,parameters:[{name:`expression`,type:`string`,description:`Expression to evaluate.`},{name:`objectGroup`,type:`string`,optional:!0,description:`Symbolic group name that can be used to release multiple objects.`},{name:`includeCommandLineAPI`,type:`boolean`,optional:!0,description:`Determines whether Command Line API should be available during the evaluation.`},{name:`doNotPauseOnExceptionsAndMuteConsole`,type:`boolean`,optional:!0,description:`Specifies whether evaluation should stop on exceptions and mute console. Overrides setPauseOnException state.`},{name:`contextId`,$ref:`Runtime.ExecutionContextId`,optional:!0,description:`Specifies in which isolated context to perform evaluation. Each content script lives in an isolated context and this parameter may be used to specify one of those contexts. If the parameter is omitted or 0 the evaluation will be performed in the context of the inspected page.`},{name:`returnByValue`,type:`boolean`,optional:!0,description:`Whether the result is expected to be a JSON object that should be sent by value.`},{name:`generatePreview`,type:`boolean`,optional:!0,description:`Whether preview should be generated for the result.`},{name:`saveResult`,type:`boolean`,optional:!0,description:`Whether the resulting value should be considered for saving in the $n history.`},{name:`emulateUserGesture`,type:`boolean`,optional:!0,description:`Whether the expression should be considered to be in a user gesture or not.`}],returns:[{name:`result`,$ref:`RemoteObject`,description:`Evaluation result.`},{name:`wasThrown`,type:`boolean`,optional:!0,description:`True if the result was thrown during the evaluation.`},{name:`savedResultIndex`,type:`integer`,optional:!0,description:`If the result was saved, this is the $n index that can be used to access the value.`}]},{name:`awaitPromise`,description:`Calls the async callback when the promise with the given ID gets settled.`,parameters:[{name:`promiseObjectId`,$ref:`RemoteObjectId`,description:`Identifier of the promise.`},{name:`returnByValue`,type:`boolean`,optional:!0,description:`Whether the result is expected to be a JSON object that should be sent by value.`},{name:`generatePreview`,type:`boolean`,optional:!0,description:`Whether preview should be generated for the result.`},{name:`saveResult`,type:`boolean`,optional:!0,description:`Whether the resulting value should be considered for saving in the $n history.`}],returns:[{name:`result`,$ref:`RemoteObject`,description:`Evaluation result.`},{name:`wasThrown`,type:`boolean`,optional:!0,description:`True if the result was thrown during the evaluation.`},{name:`savedResultIndex`,type:`integer`,optional:!0,description:`If the result was saved, this is the $n index that can be used to access the value.`}],async:!0},{name:`callFunctionOn`,description:`Calls function with given declaration on the given object. Object group of the result is inherited from the target object.`,parameters:[{name:`objectId`,$ref:`RemoteObjectId`,description:`Identifier of the object to call function on.`},{name:`functionDeclaration`,type:`string`,description:`Declaration of the function to call.`},{name:`arguments`,type:`array`,optional:!0,items:{$ref:`CallArgument`},description:`Call arguments. All call arguments must belong to the same JavaScript world as the target object.`},{name:`doNotPauseOnExceptionsAndMuteConsole`,type:`boolean`,optional:!0,description:`Specifies whether function call should stop on exceptions and mute console. Overrides setPauseOnException state.`},{name:`returnByValue`,type:`boolean`,optional:!0,description:`Whether the result is expected to be a JSON object which should be sent by value.`},{name:`generatePreview`,type:`boolean`,optional:!0,description:`Whether preview should be generated for the result.`},{name:`emulateUserGesture`,type:`boolean`,optional:!0,description:`Whether the expression should be considered to be in a user gesture or not.`},{name:`awaitPromise`,type:`boolean`,optional:!0,description:`Whether to automatically await returned promise.`}],returns:[{name:`result`,$ref:`RemoteObject`,description:`Call result.`},{name:`wasThrown`,type:`boolean`,optional:!0,description:`True if the result was thrown during the evaluation.`}],async:!0},{name:`getPreview`,description:`Returns a preview for the given object.`,parameters:[{name:`objectId`,$ref:`RemoteObjectId`,description:`Identifier of the object to return a preview for.`}],returns:[{name:`preview`,$ref:`ObjectPreview`}]},{name:`getProperties`,description:`Returns properties of a given object. Object group of the result is inherited from the target object.`,parameters:[{name:`objectId`,$ref:`RemoteObjectId`,description:`Identifier of the object to return properties for.`},{name:`ownProperties`,type:`boolean`,optional:!0,description:`If true, returns properties belonging only to the object itself, not to its prototype chain.`},{name:`fetchStart`,type:`integer`,optional:!0,description:"If provided skip to this value before collecting values. Otherwise, start at the beginning. Has no effect when the `objectId` is for a `iterator`/`WeakMap`/`WeakSet` object."},{name:`fetchCount`,type:`integer`,optional:!0,description:"If provided only return `fetchCount` values. Otherwise, return values all the way to the end."},{name:`generatePreview`,type:`boolean`,optional:!0,description:`Whether preview should be generated for property values.`}],returns:[{name:`properties`,type:`array`,items:{$ref:`PropertyDescriptor`},description:`Object properties.`},{name:`internalProperties`,type:`array`,optional:!0,items:{$ref:`InternalPropertyDescriptor`},description:"Internal object properties. Only included if `fetchStart` is 0."}]},{name:`getDisplayableProperties`,description:`Returns displayable properties of a given object. Object group of the result is inherited from the target object. Displayable properties are own properties, internal properties, and native getters in the prototype chain (assumed to be bindings and treated like own properties for the frontend).`,parameters:[{name:`objectId`,$ref:`RemoteObjectId`,description:`Identifier of the object to return properties for.`},{name:`fetchStart`,type:`integer`,optional:!0,description:"If provided skip to this value before collecting values. Otherwise, start at the beginning. Has no effect when the `objectId` is for a `iterator`/`WeakMap`/`WeakSet` object."},{name:`fetchCount`,type:`integer`,optional:!0,description:"If provided only return `fetchCount` values. Otherwise, return values all the way to the end."},{name:`generatePreview`,type:`boolean`,optional:!0,description:`Whether preview should be generated for property values.`}],returns:[{name:`properties`,type:`array`,items:{$ref:`PropertyDescriptor`},description:`Object properties.`},{name:`internalProperties`,type:`array`,optional:!0,items:{$ref:`InternalPropertyDescriptor`},description:"Internal object properties. Only included if `fetchStart` is 0."}]},{name:`getCollectionEntries`,description:`Returns entries of given Map / Set collection.`,parameters:[{name:`objectId`,$ref:`Runtime.RemoteObjectId`,description:`Id of the collection to get entries for.`},{name:`objectGroup`,type:`string`,optional:!0,description:`Symbolic group name that can be used to release multiple. If not provided, it will be the same objectGroup as the RemoteObject determined from <code>objectId</code>. This is useful for WeakMap to release the collection entries.`},{name:`fetchStart`,type:`integer`,optional:!0,description:"If provided skip to this value before collecting values. Otherwise, start at the beginning. Has no effect when the `objectId<` is for a `iterator<`/`WeakMap<`/`WeakSet<` object."},{name:`fetchCount`,type:`integer`,optional:!0,description:"If provided only return `fetchCount` values. Otherwise, return values all the way to the end."}],returns:[{name:`entries`,type:`array`,items:{$ref:`CollectionEntry`},description:`Array of collection entries.`}]},{name:`saveResult`,description:`Assign a saved result index to this value.`,parameters:[{name:`value`,$ref:`CallArgument`,description:`Id or value of the object to save.`},{name:`contextId`,$ref:`ExecutionContextId`,optional:!0,description:`Unique id of the execution context. To specify in which execution context script evaluation should be performed. If not provided, determine from the CallArgument's objectId.`}],returns:[{name:`savedResultIndex`,type:`integer`,optional:!0,description:`If the value was saved, this is the $n index that can be used to access the value.`}]},{name:`setSavedResultAlias`,description:`Creates an additional reference to all saved values in the Console using the the given string as a prefix instead of $.`,parameters:[{name:`alias`,type:`string`,optional:!0,description:`Passing an empty/null string will clear the alias.`}]},{name:`releaseObject`,description:`Releases remote object with given id.`,parameters:[{name:`objectId`,$ref:`RemoteObjectId`,description:`Identifier of the object to release.`}]},{name:`releaseObjectGroup`,description:`Releases all remote objects that belong to a given group.`,parameters:[{name:`objectGroup`,type:`string`,description:`Symbolic object group name.`}]},{name:`enable`,description:`Enables reporting of execution contexts creation by means of <code>executionContextCreated</code> event. When the reporting gets enabled the event will be sent immediately for each existing execution context.`},{name:`disable`,description:`Disables reporting of execution contexts creation.`},{name:`getRuntimeTypesForVariablesAtOffsets`,description:`Returns detailed information on the given function.`,parameters:[{name:`locations`,type:`array`,items:{$ref:`TypeLocation`},description:`An array of type locations we're requesting information for. Results are expected in the same order they're sent in.`}],returns:[{name:`types`,type:`array`,items:{$ref:`TypeDescription`}}]},{name:`enableTypeProfiler`,description:`Enables type profiling on the VM.`},{name:`disableTypeProfiler`,description:`Disables type profiling on the VM.`},{name:`enableControlFlowProfiler`,description:`Enables control flow profiling on the VM.`},{name:`disableControlFlowProfiler`,description:`Disables control flow profiling on the VM.`},{name:`getBasicBlocks`,description:`Returns a list of basic blocks for the given sourceID with information about their text ranges and whether or not they have executed.`,parameters:[{name:`sourceID`,type:`string`,description:`Indicates which sourceID information is requested for.`}],returns:[{name:`basicBlocks`,type:`array`,items:{$ref:`BasicBlock`}}]}]},{domain:`ScriptProfiler`,types:[{id:`EventType`,type:`string`,enum:[`API`,`Microtask`,`Other`]},{id:`Event`,type:`object`,properties:[{name:`startTime`,type:`number`},{name:`endTime`,type:`number`},{name:`type`,$ref:`EventType`}]},{id:`ExpressionLocation`,type:`object`,properties:[{name:`line`,type:`integer`,description:`1-based.`},{name:`column`,type:`integer`,description:`1-based.`}]},{id:`StackFrame`,type:`object`,properties:[{name:`sourceID`,$ref:`Debugger.ScriptId`,description:`Unique script identifier.`},{name:`name`,type:`string`,description:`A displayable name for the stack frame. i.e function name, (program), etc.`},{name:`line`,type:`integer`,description:`-1 if unavailable. 1-based if available.`},{name:`column`,type:`integer`,description:`-1 if unavailable. 1-based if available.`},{name:`url`,type:`string`},{name:`expressionLocation`,$ref:`ExpressionLocation`,optional:!0}]},{id:`StackTrace`,type:`object`,properties:[{name:`timestamp`,type:`number`},{name:`stackFrames`,type:`array`,items:{$ref:`StackFrame`},description:`First array item is the bottom of the call stack and last array item is the top of the call stack.`}]},{id:`Samples`,type:`object`,properties:[{name:`stackTraces`,type:`array`,items:{$ref:`StackTrace`}}]}],commands:[{name:`startTracking`,description:`Start tracking script evaluations.`,parameters:[{name:`includeSamples`,type:`boolean`,optional:!0,description:`Start the sampling profiler, defaults to false.`}]},{name:`stopTracking`,description:"Stop tracking script evaluations. This will produce a `trackingComplete` event."}]},{domain:`Security`,types:[{id:`Connection`,type:`object`,properties:[{name:`protocol`,type:`string`,optional:!0},{name:`cipher`,type:`string`,optional:!0}]},{id:`Certificate`,type:`object`,properties:[{name:`subject`,type:`string`,optional:!0},{name:`validFrom`,$ref:`Network.Walltime`,optional:!0},{name:`validUntil`,$ref:`Network.Walltime`,optional:!0},{name:`dnsNames`,type:`array`,optional:!0,items:{type:`string`},description:`DNS names listed on the certificate.`},{name:`ipAddresses`,type:`array`,optional:!0,items:{type:`string`},description:`IP addresses listed on the certificate.`}]},{id:`Security`,type:`object`,properties:[{name:`connection`,$ref:`Connection`,optional:!0},{name:`certificate`,$ref:`Certificate`,optional:!0}]}]},{domain:`ServiceWorker`,types:[{id:`Configuration`,type:`object`,properties:[{name:`targetId`,type:`string`},{name:`securityOrigin`,type:`string`},{name:`url`,type:`string`,description:`ServiceWorker main script URL.`},{name:`content`,type:`string`,description:`ServiceWorker main script content.`}]}],commands:[{name:`getInitializationInfo`,description:`Returns the initialization information for this target.`,returns:[{name:`info`,$ref:`Configuration`}]}]},{domain:`Target`,types:[{id:`TargetInfo`,type:`object`,properties:[{name:`targetId`,type:`string`,description:`Unique identifier for the target.`},{name:`type`,type:`string`,enum:[`page`,`frame`,`service-worker`,`worker`]},{name:`isProvisional`,type:`boolean`,optional:!0,description:`Whether this is a provisional page target.`},{name:`isPaused`,type:`boolean`,optional:!0,description:`Whether the target is paused on start and has to be explicitely resumed by inspector.`}]}],commands:[{name:`setPauseOnStart`,description:`If set to true, new targets will be paused on start waiting for resume command. Other commands can be dispatched on the target before it is resumed.`,parameters:[{name:`pauseOnStart`,type:`boolean`,description:`If set to true, new targets will be paused on start waiting for resume command.`}]},{name:`resume`,description:`Will resume target if it was paused on start.`,parameters:[{name:`targetId`,type:`string`}]},{name:`sendMessageToTarget`,description:`Send an Inspector Protocol message to be dispatched to a Target's agents.`,parameters:[{name:`targetId`,type:`string`},{name:`message`,type:`string`,description:`JSON Inspector Protocol message (command) to be dispatched on the backend.`}]}]},{domain:`Timeline`,types:[{id:`EventType`,type:`string`,enum:[`EventDispatch`,`ScheduleStyleRecalculation`,`RecalculateStyles`,`InvalidateLayout`,`Layout`,`Paint`,`Composite`,`RenderingFrame`,`TimerInstall`,`TimerRemove`,`TimerFire`,`EvaluateScript`,`TimeStamp`,`Time`,`TimeEnd`,`FunctionCall`,`ProbeSample`,`ConsoleProfile`,`RequestAnimationFrame`,`CancelAnimationFrame`,`FireAnimationFrame`,`ObserverCallback`,`FirstContentfulPaint`,`LargestContentfulPaint`,`Screenshot`]},{id:`Instrument`,type:`string`,enum:[`ScriptProfiler`,`Timeline`,`CPU`,`Memory`,`Heap`,`Animation`,`Screenshot`]},{id:`TimelineEvent`,type:`object`,properties:[{name:`type`,$ref:`EventType`,description:`Event type.`},{name:`data`,type:`object`,description:`Event data.`},{name:`children`,type:`array`,optional:!0,items:{$ref:`TimelineEvent`},description:`Nested records.`}]}],commands:[{name:`enable`,description:`Enables Timeline domain events.`},{name:`disable`,description:`Disables Timeline domain events.`},{name:`start`,description:`Starts capturing instrumentation events.`,parameters:[{name:`maxCallStackDepth`,type:`integer`,optional:!0,description:`Samples JavaScript stack traces up to <code>maxCallStackDepth</code>, defaults to 5.`}]},{name:`stop`,description:`Stops capturing instrumentation events.`},{name:`setAutoCaptureEnabled`,description:`Toggle auto capture state. If <code>true</code> the backend will disable breakpoints and start capturing on navigation. The backend will fire the <code>autoCaptureStarted</code> event when an auto capture starts. The frontend should stop the auto capture when appropriate and re-enable breakpoints.`,parameters:[{name:`enabled`,type:`boolean`,description:`New auto capture state.`}]},{name:`setInstruments`,description:`Instruments to enable when capture starts on the backend (e.g. auto capture or programmatic capture).`,parameters:[{name:`instruments`,type:`array`,items:{$ref:`Instrument`},description:`Instruments to enable.`}]}]},{domain:`Worker`,commands:[{name:`enable`,description:`Enable Worker domain events.`},{name:`disable`,description:`Disable Worker domain events.`},{name:`initialized`,description:`Sent after the frontend has sent all initialization messages and can resume this worker. This command is required to allow execution in the worker.`,parameters:[{name:`workerId`,type:`string`}]},{name:`sendMessageToWorker`,description:`Send an Inspector Protocol message to be dispatched to a Worker's agents.`,parameters:[{name:`workerId`,type:`string`},{name:`message`,type:`string`,description:`JSON Inspector Protocol message (command) to be dispatched on the backend.`}]}]}];export{e as PROTOCOL_SOURCE,t as PROTOCOL_SPEC};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";const e=/\/socket\/([^/"'\s]+)\/([^/"'\s]+)\/([^/"'\s]+)/,t=/<a\b[^>]*\bhref\s*=\s*["']([^"']*\/socket\/[^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi;function stripTags(e){return e.replace(/<[^>]*>/g,``).replace(/&amp;/g,`&`).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&quot;/g,`"`).replace(/&#39;/g,`'`).replace(/\s+/g,` `).trim()}function parseInspectorTargetsHtml(n,r,i){let a=[],o=new Set;for(let s of n.matchAll(t)){let t=s[1],n=e.exec(t);if(!n)continue;let[,c,l,u]=n,d=`${c}/${l}/${u}`;if(o.has(d))continue;o.add(d);let f=stripTags(s[2]);a.push({connectionId:c,targetId:l,targetType:u,wsUrl:`ws://${r}:${i}/socket/${c}/${l}/${u}`,title:f||void 0})}return a}async function discoverInspectorTargets(e,t={}){let n=t.host??`127.0.0.1`,r=t.fetchImpl??globalThis.fetch;if(!r)throw Error(`discoverInspectorTargets: no global fetch — pass options.fetchImpl (GJS: register @gjsify/fetch)`);let i=await r(`http://${n}:${e}/`);if(!i.ok)throw Error(`discoverInspectorTargets: GET / returned ${i.status} ${i.statusText}`);return parseInspectorTargetsHtml(await i.text(),n,e)}export{discoverInspectorTargets,parseInspectorTargetsHtml};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{buildTypeIndex as e,resolveRef as t}from"./protocol-spec.js";function snakeCase(e){return e.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).replace(/([A-Z]+)([A-Z][a-z])/g,`$1_$2`).toLowerCase()}function cdpToolName(e,t,n=`cdp`){return`${n}_${snakeCase(e)}_${snakeCase(t)}`}const n={string:`string`,integer:`number`,number:`number`,boolean:`boolean`,object:`object`,array:`array`};function jsTypeFor(e,r,i){if(e.type)return n[e.type]??`unknown`;if(e.$ref){let a=t(e.$ref,r,i);return a?n[a.type]??`unknown`:`object`}return`unknown`}function generateCdpTools(t,n={}){let r=n.prefix??`cdp`,i=n.include,a=e(t),o=[];for(let e of t)for(let t of e.commands??[]){if(i&&!i(e.domain,t.name))continue;let n=(t.parameters??[]).map(t=>({name:t.name,jsType:jsTypeFor(t,e.domain,a),optional:!!t.optional,description:t.description,enum:t.enum}));o.push({name:cdpToolName(e.domain,t.name,r),method:`${e.domain}.${t.name}`,domain:e.domain,command:t.name,description:t.description,parameters:n})}return o}export{cdpToolName,generateCdpTools,snakeCase};
@@ -0,0 +1,10 @@
1
+ export { InspectorProtocolClient, ProtocolError } from './inspector-protocol-client.js';
2
+ export type { InspectorProtocolClientOptions, ProtocolEvent, ProtocolEventListener, WebSocketFactory, WebSocketLike, } from './inspector-protocol-client.js';
3
+ export { discoverInspectorTargets, parseInspectorTargetsHtml } from './target-discovery.js';
4
+ export type { DiscoverInspectorTargetsOptions, InspectorTarget } from './target-discovery.js';
5
+ export { inspectorProtocolExtension } from './inspector-protocol-extension.js';
6
+ export type { InspectorProtocolExtensionOptions } from './inspector-protocol-extension.js';
7
+ export { PROTOCOL_SPEC, PROTOCOL_SOURCE, buildTypeIndex, resolveRef } from './protocol-spec.js';
8
+ export type { ProtocolDomain, ProtocolCommand, ProtocolType, ProtocolParameter, ProtocolSpec, } from './protocol-spec.js';
9
+ export { generateCdpTools, cdpToolName, snakeCase } from './tool-generator.js';
10
+ export type { CdpToolDescriptor, CdpToolParam, CdpJsType, GenerateCdpToolsOptions } from './tool-generator.js';
@@ -0,0 +1,81 @@
1
+ /** The minimal WebSocket surface the client uses (W3C `WebSocket` subset). */
2
+ export interface WebSocketLike {
3
+ send(data: string): void;
4
+ close(code?: number, reason?: string): void;
5
+ /** W3C ready states: 0 CONNECTING, 1 OPEN, 2 CLOSING, 3 CLOSED. */
6
+ readyState: number;
7
+ addEventListener(type: 'open', listener: () => void): void;
8
+ addEventListener(type: 'message', listener: (event: {
9
+ data: unknown;
10
+ }) => void): void;
11
+ addEventListener(type: 'close', listener: (event: {
12
+ code?: number;
13
+ reason?: string;
14
+ }) => void): void;
15
+ addEventListener(type: 'error', listener: (event: unknown) => void): void;
16
+ }
17
+ /** Builds a {@link WebSocketLike} for a `ws://…` URL. Defaults to the global `WebSocket`. */
18
+ export type WebSocketFactory = (url: string) => WebSocketLike;
19
+ /** A pushed protocol event (`{method, params}` with no `id`). */
20
+ export interface ProtocolEvent {
21
+ method: string;
22
+ params: unknown;
23
+ }
24
+ /** A protocol error as surfaced to the caller (from `{error:{code,message}}` or `{error:"…"}`). */
25
+ export declare class ProtocolError extends Error {
26
+ readonly code?: number;
27
+ constructor(message: string, code?: number);
28
+ }
29
+ /** A per-method event listener; receives the event's `params`. */
30
+ export type ProtocolEventListener = (params: unknown) => void;
31
+ export interface InspectorProtocolClientOptions {
32
+ /** WebSocket factory (default: `globalThis.WebSocket`). Inject a mock for tests. */
33
+ createWebSocket?: WebSocketFactory;
34
+ /** Max events retained in the drain ring buffer; oldest dropped past this. Default 1000. */
35
+ maxBufferedEvents?: number;
36
+ /** Default per-request timeout in ms (0 disables). Default 30000. */
37
+ requestTimeoutMs?: number;
38
+ }
39
+ /**
40
+ * Connect to a single inspector target's WebSocket and drive its JSON-RPC
41
+ * protocol. One client == one WS == one target (WebKit has no session
42
+ * multiplexing — see {@link discoverInspectorTargets}).
43
+ */
44
+ export declare class InspectorProtocolClient {
45
+ private readonly url;
46
+ private readonly factory;
47
+ private readonly maxBuffered;
48
+ private readonly requestTimeoutMs;
49
+ private ws;
50
+ private nextId;
51
+ private readonly pending;
52
+ private readonly listeners;
53
+ private readonly eventBuffer;
54
+ private connectPromise;
55
+ private closed;
56
+ constructor(url: string, options?: InspectorProtocolClientOptions);
57
+ /** True once the socket is OPEN and not yet closed. */
58
+ get connected(): boolean;
59
+ /** Open the WebSocket; resolves on `open`, rejects on `error`/`close` before open. Idempotent. */
60
+ connect(): Promise<void>;
61
+ /**
62
+ * Send a `Domain.command` and resolve with its `result` (rejects with a
63
+ * {@link ProtocolError} on a protocol `error`, or a timeout error).
64
+ */
65
+ send(method: string, params?: Record<string, unknown>): Promise<unknown>;
66
+ /** Subscribe to a `Domain.event`; returns an unsubscribe function. */
67
+ on(method: string, listener: ProtocolEventListener): () => void;
68
+ /** Remove a previously-registered event listener. */
69
+ off(method: string, listener: ProtocolEventListener): void;
70
+ /** Resolve with the params of the next matching `method` event (optionally filtered). */
71
+ awaitEvent(method: string, predicate?: (params: unknown) => boolean, timeoutMs?: number): Promise<unknown>;
72
+ /** Send `<Domain>.enable` for each domain (sequentially), tolerating domains with no `enable`. */
73
+ enableDomains(domains: readonly string[]): Promise<void>;
74
+ /** Return all buffered events and clear the ring buffer (the poll for stateless transports). */
75
+ drainEvents(): ProtocolEvent[];
76
+ /** Close the socket and reject every in-flight request. */
77
+ close(): void;
78
+ private onMessage;
79
+ private onClose;
80
+ private failAllPending;
81
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,20 @@
1
+ import type { DevtoolsExtension } from '@gjsify/devtools';
2
+ import { type WebSocketFactory } from './inspector-protocol-client.js';
3
+ export interface InspectorProtocolExtensionOptions {
4
+ /** Port the WebKit inspector HTTP server is bound to (`WEBKIT_INSPECTOR_HTTP_SERVER`). */
5
+ port: number;
6
+ /** Host the inspector server is bound to. Default `127.0.0.1`. */
7
+ host?: string;
8
+ /** Domains auto-enabled on connect. Default: Inspector, Runtime, DOM, Console. */
9
+ autoEnableDomains?: readonly string[];
10
+ /** WebSocket factory (default: global). Inject a mock for tests. */
11
+ createWebSocket?: WebSocketFactory;
12
+ /** fetch implementation (default: global). Inject for tests. */
13
+ fetchImpl?: typeof fetch;
14
+ }
15
+ /**
16
+ * Build the {@link DevtoolsExtension} that adds the `Cdp*` methods. Connections
17
+ * are lazy + cached per target ws URL; `CdpConnect` selects the "current" target
18
+ * that `CdpSend` / `CdpDrainEvents` operate on.
19
+ */
20
+ export declare function inspectorProtocolExtension(options: InspectorProtocolExtensionOptions): DevtoolsExtension;
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,53 @@
1
+ /** A command/type parameter or a type's property. */
2
+ export interface ProtocolParameter {
3
+ name: string;
4
+ /** Primitive type when not a `$ref`: `string` | `integer` | `number` | `boolean` | `object` | `array`. */
5
+ type?: string;
6
+ /** Reference to a type, `Domain.TypeName` (cross-domain) or `TypeName` (same domain). */
7
+ $ref?: string;
8
+ optional?: boolean;
9
+ description?: string;
10
+ /** Element shape for `type: "array"`. */
11
+ items?: {
12
+ type?: string;
13
+ $ref?: string;
14
+ };
15
+ /** Allowed values for an enum-typed parameter. */
16
+ enum?: string[];
17
+ }
18
+ /** A protocol command (`Domain.command`). */
19
+ export interface ProtocolCommand {
20
+ name: string;
21
+ description?: string;
22
+ parameters?: ProtocolParameter[];
23
+ returns?: ProtocolParameter[];
24
+ async?: boolean;
25
+ }
26
+ /** A named protocol type (`Domain.TypeName`). */
27
+ export interface ProtocolType {
28
+ id: string;
29
+ type: string;
30
+ description?: string;
31
+ enum?: string[];
32
+ properties?: ProtocolParameter[];
33
+ }
34
+ /** A protocol domain (one source JSON). */
35
+ export interface ProtocolDomain {
36
+ domain: string;
37
+ description?: string;
38
+ types?: ProtocolType[];
39
+ commands?: ProtocolCommand[];
40
+ }
41
+ export type ProtocolSpec = readonly ProtocolDomain[];
42
+ export { PROTOCOL_SPEC, PROTOCOL_SOURCE } from './spec-data.js';
43
+ /**
44
+ * Index every type by its fully-qualified `Domain.TypeName` key (and also by the
45
+ * bare `TypeName` for same-domain lookups, last-writer-wins on collisions —
46
+ * resolve cross-domain refs with the qualified key when ambiguous).
47
+ */
48
+ export declare function buildTypeIndex(spec: ProtocolSpec): Map<string, ProtocolType>;
49
+ /**
50
+ * Resolve a `$ref` to its target {@link ProtocolType}. `Domain.Type` is looked up
51
+ * directly; a bare `Type` is resolved within `fromDomain` first, then globally.
52
+ */
53
+ export declare function resolveRef(ref: string, fromDomain: string, index: Map<string, ProtocolType>): ProtocolType | undefined;
@@ -0,0 +1,7 @@
1
+ import type { ProtocolDomain } from './protocol-spec.js';
2
+ export declare const PROTOCOL_SOURCE: {
3
+ readonly generator: "scripts/generate-spec-data.mjs";
4
+ readonly domains: 27;
5
+ readonly commands: 248;
6
+ };
7
+ export declare const PROTOCOL_SPEC: ProtocolDomain[];
@@ -0,0 +1,30 @@
1
+ /** One inspectable target from the WebKit remote-inspector listing. */
2
+ export interface InspectorTarget {
3
+ /** The inspector connection id (first `/socket/` path segment). */
4
+ connectionId: string;
5
+ /** The target id (second segment) — stable for the lifetime of the target. */
6
+ targetId: string;
7
+ /** Target kind: `web-page` | `javascript` | `service-worker` | `wasm-debugger` | … */
8
+ targetType: string;
9
+ /** `ws://host:port/socket/{conn}/{target}/{type}` — pass to InspectorProtocolClient. */
10
+ wsUrl: string;
11
+ /** The anchor's visible text (page title / target name), when present. */
12
+ title?: string;
13
+ }
14
+ export interface DiscoverInspectorTargetsOptions {
15
+ /** Host the inspector HTTP server is bound to. Default `127.0.0.1`. */
16
+ host?: string;
17
+ /** `fetch` implementation (default: global `fetch`). Inject for tests. */
18
+ fetchImpl?: typeof fetch;
19
+ }
20
+ /**
21
+ * Parse the WebKit `GET /` HTML listing into targets. Pure + deterministic —
22
+ * the unit-testable core of {@link discoverInspectorTargets}.
23
+ */
24
+ export declare function parseInspectorTargetsHtml(html: string, host: string, port: number): InspectorTarget[];
25
+ /**
26
+ * Fetch `http://host:port/` and parse its target listing. Targets only appear
27
+ * once a page has begun loading and there is no `/json` endpoint, so callers
28
+ * that race startup should poll (an empty array is a valid "not ready yet").
29
+ */
30
+ export declare function discoverInspectorTargets(port: number, options?: DiscoverInspectorTargetsOptions): Promise<InspectorTarget[]>;
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,34 @@
1
+ import { type ProtocolSpec } from './protocol-spec.js';
2
+ /** Simplified JS type used to build an input schema. */
3
+ export type CdpJsType = 'string' | 'number' | 'boolean' | 'object' | 'array' | 'unknown';
4
+ /** A flattened command parameter ready for schema generation. */
5
+ export interface CdpToolParam {
6
+ name: string;
7
+ jsType: CdpJsType;
8
+ optional: boolean;
9
+ description?: string;
10
+ enum?: string[];
11
+ }
12
+ /** One generated tool descriptor (1:1 with a protocol command). */
13
+ export interface CdpToolDescriptor {
14
+ /** MCP tool name, e.g. `cdp_dom_query_selector`. */
15
+ name: string;
16
+ /** Wire method, e.g. `DOM.querySelector` — pass to CdpSend. */
17
+ method: string;
18
+ domain: string;
19
+ command: string;
20
+ description?: string;
21
+ parameters: CdpToolParam[];
22
+ }
23
+ export interface GenerateCdpToolsOptions {
24
+ /** Tool-name prefix. Default `cdp`. */
25
+ prefix?: string;
26
+ /** Filter which `(domain, command)` pairs become tools. Default: all. */
27
+ include?: (domain: string, command: string) => boolean;
28
+ }
29
+ /** `getOuterHTML` → `get_outer_html`, `DOM` → `dom`. */
30
+ export declare function snakeCase(value: string): string;
31
+ /** MCP tool name for a `(domain, command)`, e.g. `cdp_dom_query_selector`. */
32
+ export declare function cdpToolName(domain: string, command: string, prefix?: string): string;
33
+ /** Generate one {@link CdpToolDescriptor} per command across the spec. */
34
+ export declare function generateCdpTools(spec: ProtocolSpec, options?: GenerateCdpToolsOptions): CdpToolDescriptor[];
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@gjsify/devtools-cdp",
3
+ "version": "0.11.0",
4
+ "description": "WebKit Remote Inspector Protocol (CDP-shaped) client for GJS — JSON-RPC over a per-target WebSocket + HTML target discovery, the basis for driving WebKitGTK devtools over MCP",
5
+ "type": "module",
6
+ "module": "lib/esm/index.js",
7
+ "types": "lib/types/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/types/index.d.ts",
11
+ "default": "./lib/esm/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "lib"
16
+ ],
17
+ "scripts": {
18
+ "clear": "rm -rf lib tmp tsconfig.tsbuildinfo test.gjs.mjs || exit 0",
19
+ "check": "gjsify tsc --noEmit",
20
+ "build": "gjsify run build:gjsify && gjsify run build:types",
21
+ "build:gjsify": "gjsify build --library 'src/**/*.{ts,js}' --exclude 'src/**/*.spec.{mts,ts}' 'src/test.{mts,ts}'",
22
+ "build:types": "gjsify tsc",
23
+ "build:test": "gjsify run build:test:gjs",
24
+ "build:test:gjs": "gjsify build src/test.mts --app gjs --outfile test.gjs.mjs",
25
+ "test": "gjsify run build:gjsify && gjsify run build:test && gjsify run test:gjs",
26
+ "test:gjs": "gjsify run test.gjs.mjs"
27
+ },
28
+ "keywords": [
29
+ "gjs",
30
+ "webkit",
31
+ "inspector",
32
+ "cdp",
33
+ "devtools",
34
+ "mcp"
35
+ ],
36
+ "dependencies": {
37
+ "@gjsify/devtools": "^0.11.0",
38
+ "@gjsify/fetch": "^0.11.0",
39
+ "@gjsify/websocket": "^0.11.0"
40
+ },
41
+ "devDependencies": {
42
+ "@gjsify/cli": "^0.11.0",
43
+ "@gjsify/unit": "^0.11.0",
44
+ "@types/node": "^25.9.2",
45
+ "typescript": "^6.0.3"
46
+ },
47
+ "gjsify": {
48
+ "runtimes": {
49
+ "gjs": "polyfill",
50
+ "node": "none",
51
+ "browser": "none",
52
+ "nativescript": "none"
53
+ }
54
+ },
55
+ "license": "MIT",
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "git+https://github.com/gjsify/gjsify.git",
59
+ "directory": "packages/framework/devtools-cdp"
60
+ },
61
+ "bugs": {
62
+ "url": "https://github.com/gjsify/gjsify/issues"
63
+ },
64
+ "homepage": "https://github.com/gjsify/gjsify/tree/main/packages/framework/devtools-cdp#readme"
65
+ }