chrome-devtools-frontend 1.0.1632065 → 1.0.1635876

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.
Files changed (107) hide show
  1. package/front_end/core/host/UserMetrics.ts +5 -2
  2. package/front_end/core/root/ExperimentNames.ts +1 -0
  3. package/front_end/core/root/Runtime.ts +5 -0
  4. package/front_end/core/sdk/SourceMapCache.ts +13 -11
  5. package/front_end/core/sdk/SourceMapManager.ts +7 -3
  6. package/front_end/entrypoints/greendev_floaty/FloatyEntrypoint.ts +84 -22
  7. package/front_end/entrypoints/main/MainImpl.ts +8 -0
  8. package/front_end/generated/InspectorBackendCommands.ts +3 -4
  9. package/front_end/generated/SupportedCSSProperties.js +272 -2
  10. package/front_end/generated/protocol-mapping.d.ts +0 -10
  11. package/front_end/generated/protocol-proxy-api.d.ts +0 -8
  12. package/front_end/generated/protocol.ts +5 -7
  13. package/front_end/models/ai_assistance/AiConversation.ts +16 -11
  14. package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +13 -2
  15. package/front_end/models/ai_assistance/agents/AiAgent.ts +65 -11
  16. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +42 -2
  17. package/front_end/models/ai_assistance/agents/GreenDevAgent.ts +68 -5
  18. package/front_end/models/ai_assistance/agents/GreenDevAgentAntigravityCliSocketClient.ts +53 -0
  19. package/front_end/models/ai_assistance/agents/GreenDevAgentGeminiCliSocketClient.ts +117 -0
  20. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +30 -1
  21. package/front_end/models/ai_assistance/ai_assistance.ts +4 -0
  22. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +4 -2
  23. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +5 -2
  24. package/front_end/models/extensions/RecorderExtensionEndpoint.ts +9 -1
  25. package/front_end/models/extensions/RecorderPluginManager.ts +1 -0
  26. package/front_end/models/greendev/Prototypes.ts +17 -5
  27. package/front_end/models/trace/handlers/FramesHandler.ts +19 -13
  28. package/front_end/panels/ai_assistance/components/AccessibilityAgentMarkdownRenderer.ts +3 -0
  29. package/front_end/panels/ai_assistance/components/ChatInput.ts +4 -2
  30. package/front_end/panels/ai_assistance/components/ChatMessage.ts +3 -1
  31. package/front_end/panels/application/preloading/components/PreloadingString.ts +0 -8
  32. package/front_end/panels/common/ExtensionServer.ts +34 -11
  33. package/front_end/panels/elements/CSSRuleValidator.ts +37 -34
  34. package/front_end/panels/elements/CSSRuleValidatorHelper.ts +8 -6
  35. package/front_end/panels/elements/ElementsTreeElement.ts +8 -2
  36. package/front_end/panels/elements/components/CSSHintDetailsView.ts +5 -5
  37. package/front_end/panels/js_timeline/js_timeline-meta.ts +30 -0
  38. package/front_end/panels/protocol_monitor/JSONEditor.ts +4 -4
  39. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +2 -2
  40. package/front_end/panels/recorder/RecorderController.ts +50 -1
  41. package/front_end/panels/recorder/extensions/ExtensionManager.ts +1 -0
  42. package/front_end/panels/recorder/models/RecordingPlayer.ts +12 -3
  43. package/front_end/panels/recorder/testing/RecorderHelpers.ts +2 -0
  44. package/front_end/panels/settings/SettingsScreen.ts +3 -2
  45. package/front_end/panels/sources/FilteredUISourceCodeListProvider.ts +5 -2
  46. package/front_end/panels/timeline/timeline-meta.ts +10 -6
  47. package/front_end/panels/whats_new/ReleaseNoteText.ts +9 -9
  48. package/front_end/panels/whats_new/resources/WNDT.md +9 -9
  49. package/front_end/third_party/chromium/README.chromium +1 -1
  50. package/front_end/third_party/puppeteer/README.chromium +2 -2
  51. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +8 -5
  52. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +35 -33
  53. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.d.ts.map +1 -1
  54. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js +0 -1
  55. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js.map +1 -1
  56. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts.map +1 -1
  57. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.js +0 -3
  58. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.js.map +1 -1
  59. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.d.ts +8 -8
  60. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.d.ts.map +1 -1
  61. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.js +8 -8
  62. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.js.map +1 -1
  63. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts +1 -1
  64. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts.map +1 -1
  65. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js +1 -1
  66. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js.map +1 -1
  67. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/CustomQuerySelector.d.ts +2 -2
  68. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/CustomQuerySelector.d.ts.map +1 -1
  69. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/CustomQuerySelector.js +2 -1
  70. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/CustomQuerySelector.js.map +1 -1
  71. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/injected.d.ts +2 -7
  72. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/injected.d.ts.map +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/PuppeteerNode.d.ts +1 -1
  74. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/PuppeteerNode.js +1 -1
  75. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  76. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  77. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/Mutex.d.ts +10 -7
  79. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/Mutex.d.ts.map +1 -1
  80. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/Mutex.js +16 -12
  81. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/Mutex.js.map +1 -1
  82. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  83. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  84. package/front_end/third_party/puppeteer/package/lib/types.d.ts +8 -5
  85. package/front_end/third_party/puppeteer/package/package.json +5 -7
  86. package/front_end/third_party/puppeteer/package/src/cdp/TargetManager.ts +0 -1
  87. package/front_end/third_party/puppeteer/package/src/cdp/WebMCP.ts +0 -3
  88. package/front_end/third_party/puppeteer/package/src/common/Debug.ts +11 -11
  89. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  90. package/front_end/third_party/puppeteer/package/src/injected/CustomQuerySelector.ts +3 -2
  91. package/front_end/third_party/puppeteer/package/src/node/PuppeteerNode.ts +1 -1
  92. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  93. package/front_end/third_party/puppeteer/package/src/util/Mutex.ts +17 -12
  94. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  95. package/front_end/ui/components/markdown_view/MarkdownLinksMap.ts +7 -0
  96. package/front_end/ui/legacy/InspectorDrawerView.ts +2 -1
  97. package/front_end/ui/legacy/InspectorView.ts +1 -1
  98. package/front_end/ui/legacy/PlusButton.ts +269 -0
  99. package/front_end/ui/legacy/ViewManager.ts +38 -11
  100. package/front_end/ui/legacy/components/source_frame/FontView.ts +11 -3
  101. package/front_end/ui/legacy/components/source_frame/ImageView.ts +16 -0
  102. package/front_end/ui/legacy/components/source_frame/imageView.css +13 -0
  103. package/front_end/ui/legacy/components/utils/Linkifier.ts +1 -1
  104. package/front_end/ui/legacy/legacy.ts +2 -0
  105. package/front_end/ui/visual_logging/KnownContextValues.ts +21 -0
  106. package/mcp/mcp.ts +1 -1
  107. package/package.json +1 -10
@@ -746,6 +746,7 @@ export enum KeyboardShortcutAction {
746
746
  MAX_VALUE = 120,
747
747
  }
748
748
 
749
+ /** Update DevToolsIssuesPanelOpenedFrom in tools/metrics/histograms/metadata/dev/enums.xml if new enum is added. **/
749
750
  export const enum IssueOpener {
750
751
  CONSOLE_INFO_BAR = 0,
751
752
  LEARN_MORE_LINK_COEP = 1,
@@ -753,7 +754,8 @@ export const enum IssueOpener {
753
754
  HAMBURGER_MENU = 3,
754
755
  ADORNER = 4,
755
756
  COMMAND_MENU = 5,
756
- MAX_VALUE = 6,
757
+ MORE_TOOLS_MENU = 6,
758
+ MAX_VALUE = 7,
757
759
  }
758
760
 
759
761
  /**
@@ -767,10 +769,11 @@ export enum DevtoolsExperiments {
767
769
  'use-source-map-scopes' = 76,
768
770
  'durable-messages' = 110,
769
771
  'jpeg-xl' = 111,
772
+ 'plus-button' = 112,
770
773
  /* eslint-enable @typescript-eslint/naming-convention */
771
774
 
772
775
  // Increment this when new experiments are added.
773
- MAX_VALUE = 112,
776
+ MAX_VALUE = 113,
774
777
  }
775
778
 
776
779
  /** Update DevToolsIssuesPanelIssueExpanded from tools/metrics/histograms/enums.xml if new enum is added. **/
@@ -9,6 +9,7 @@ export enum ExperimentName {
9
9
  USE_SOURCE_MAP_SCOPES = 'use-source-map-scopes',
10
10
  DURABLE_MESSAGES = 'durable-messages',
11
11
  JPEG_XL = 'jpeg-xl',
12
+ PLUS_BUTTON = 'plus-button',
12
13
  // Adding or removing an entry from this enum?
13
14
  // You will need to update:
14
15
  // 1. DevToolsExperiments enum in host/UserMetrics.ts
@@ -633,6 +633,10 @@ interface DevToolsWebMCPSupport {
633
633
  enabled: boolean;
634
634
  }
635
635
 
636
+ interface DevToolsPlusButton {
637
+ enabled: boolean;
638
+ }
639
+
636
640
  /**
637
641
  * The host configuration that we expect from the DevTools back-end.
638
642
  *
@@ -687,6 +691,7 @@ export type HostConfig = Platform.TypeScriptUtilities.RecursivePartial<{
687
691
  devToolsProtocolMonitor: DevToolsProtocolMonitor,
688
692
  devToolsWebMCPSupport: DevToolsWebMCPSupport,
689
693
  devToolsUseGcaApi: UseGcaApi,
694
+ devToolsPlusButton: DevToolsPlusButton,
690
695
  }>;
691
696
 
692
697
  /**
@@ -2,6 +2,8 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
+ import type * as Platform from '../platform/platform.js';
6
+
5
7
  import type {DebugId, SourceMapV3} from './SourceMap.js';
6
8
 
7
9
  /** A thin wrapper around the Cache API to store source map JSONs keyed on Debug IDs */
@@ -28,14 +30,14 @@ export class SourceMapCache {
28
30
  this.#name = name;
29
31
  }
30
32
 
31
- async set(debugId: DebugId, sourceMap: SourceMapV3): Promise<void> {
33
+ async set(debugId: DebugId, securityOrigin: Platform.DevToolsPath.UrlString, sourceMap: SourceMapV3): Promise<void> {
32
34
  const cache = await this.#cache();
33
- await cache.put(SourceMapCache.#urlForDebugId(debugId), new Response(JSON.stringify(sourceMap)));
35
+ await cache.put(SourceMapCache.#urlForDebugId(debugId, securityOrigin), new Response(JSON.stringify(sourceMap)));
34
36
  }
35
37
 
36
- async get(debugId: DebugId): Promise<SourceMapV3|null> {
38
+ async get(debugId: DebugId, securityOrigin: Platform.DevToolsPath.UrlString): Promise<SourceMapV3|null> {
37
39
  const cache = await this.#cache();
38
- const response = await cache.match(SourceMapCache.#urlForDebugId(debugId));
40
+ const response = await cache.match(SourceMapCache.#urlForDebugId(debugId, securityOrigin));
39
41
  return await response?.json() ?? null;
40
42
  }
41
43
 
@@ -49,8 +51,8 @@ export class SourceMapCache {
49
51
  }
50
52
 
51
53
  /** The Cache API only allows URL as keys, so we construct a simple one. Given that we have our own cache, we have no risk of conflicting URLs */
52
- static #urlForDebugId(debugId: DebugId): string {
53
- return 'http://debug.id/' + encodeURIComponent(debugId);
54
+ static #urlForDebugId(debugId: DebugId, securityOrigin: Platform.DevToolsPath.UrlString): string {
55
+ return `http://debug.id/${encodeURIComponent(debugId)}?origin=${encodeURIComponent(securityOrigin)}`;
54
56
  }
55
57
 
56
58
  async disposeForTest(): Promise<void> {
@@ -59,14 +61,14 @@ export class SourceMapCache {
59
61
  }
60
62
 
61
63
  const IN_MEMORY_INSTANCE = new (class implements Pick<SourceMapCache, 'get'|'set'|'disposeForTest'> {
62
- readonly #cache = new Map<DebugId, SourceMapV3>();
64
+ readonly #cache = new Map<string, SourceMapV3>();
63
65
 
64
- async set(debugId: DebugId, sourceMap: SourceMapV3): Promise<void> {
65
- this.#cache.set(debugId, sourceMap);
66
+ async set(debugId: DebugId, securityOrigin: Platform.DevToolsPath.UrlString, sourceMap: SourceMapV3): Promise<void> {
67
+ this.#cache.set(`${debugId}|${securityOrigin}`, sourceMap);
66
68
  }
67
69
 
68
- async get(debugId: DebugId): Promise<SourceMapV3|null> {
69
- return this.#cache.get(debugId) ?? null;
70
+ async get(debugId: DebugId, securityOrigin: Platform.DevToolsPath.UrlString): Promise<SourceMapV3|null> {
71
+ return this.#cache.get(`${debugId}|${securityOrigin}`) ?? null;
70
72
  }
71
73
 
72
74
  async disposeForTest(): Promise<void> {
@@ -190,7 +190,9 @@ async function loadSourceMap(
190
190
  initiator: PageResourceLoadInitiator): Promise<SourceMapV3> {
191
191
  try {
192
192
  if (debugId) {
193
- const cachedSourceMap = await SourceMapCache.instance().get(debugId);
193
+ const securityOrigin = initiator.initiatorUrl ? Common.ParsedURL.ParsedURL.extractOrigin(initiator.initiatorUrl) :
194
+ Platform.DevToolsPath.EmptyUrlString;
195
+ const cachedSourceMap = await SourceMapCache.instance().get(debugId, securityOrigin);
194
196
  if (cachedSourceMap) {
195
197
  return cachedSourceMap;
196
198
  }
@@ -198,9 +200,11 @@ async function loadSourceMap(
198
200
 
199
201
  const {content} = await resourceLoader.loadResource(url, initiator);
200
202
  const sourceMap = parseSourceMap(content);
201
- if ('debugId' in sourceMap && sourceMap.debugId) {
203
+ if (debugId && 'debugId' in sourceMap && sourceMap.debugId === debugId) {
202
204
  // In case something goes wrong with updating the cache, we still want to use the source map.
203
- await SourceMapCache.instance().set(sourceMap.debugId as DebugId, sourceMap).catch();
205
+ const securityOrigin = initiator.initiatorUrl ? Common.ParsedURL.ParsedURL.extractOrigin(initiator.initiatorUrl) :
206
+ Platform.DevToolsPath.EmptyUrlString;
207
+ await SourceMapCache.instance().set(sourceMap.debugId as DebugId, securityOrigin, sourceMap).catch();
204
208
  }
205
209
  return sourceMap;
206
210
  } catch (cause) {
@@ -45,6 +45,9 @@ class GreenDevFloaty {
45
45
  #backendNodeId?: Protocol.DOM.BackendNodeId;
46
46
  #syncChannel: BroadcastChannel;
47
47
  #isFloatyWindow: boolean;
48
+ #socketClient:
49
+ AiAssistance.GreenDevAgentAntigravityCliSocketClient.GreenDevAgentAntigravityCliSocketClient|
50
+ AiAssistance.GreenDevAgentGeminiCliSocketClient.GreenDevAgentGeminiCliSocketClient;
48
51
 
49
52
  constructor(document: Document) {
50
53
  const params = new URLSearchParams(window.location.hash.substring(1));
@@ -57,6 +60,12 @@ class GreenDevFloaty {
57
60
  };
58
61
 
59
62
  this.#initFloatyMode(document);
63
+ if (Greendev.Prototypes.instance().isEnabled('beyondStylingAntigravity')) {
64
+ this.#socketClient =
65
+ new AiAssistance.GreenDevAgentAntigravityCliSocketClient.GreenDevAgentAntigravityCliSocketClient();
66
+ } else {
67
+ this.#socketClient = new AiAssistance.GreenDevAgentGeminiCliSocketClient.GreenDevAgentGeminiCliSocketClient();
68
+ }
60
69
  }
61
70
 
62
71
  #initFloatyMode(doc: Document): void {
@@ -269,12 +278,67 @@ class GreenDevFloaty {
269
278
  const query = this.#textField.value || this.#textField.placeholder;
270
279
  this.#textField.value = '';
271
280
 
272
- const useGreenDevAgent = Greendev.Prototypes.instance().isEnabled('beyondStyling');
281
+ const useAntigravity = Greendev.Prototypes.instance().isEnabled('beyondStylingAntigravity');
282
+ const useGemini = Greendev.Prototypes.instance().isEnabled('beyondStylingGemini');
283
+ const useGreenDevAgent = useAntigravity || useGemini;
284
+ const isAntigravity = useAntigravity;
273
285
 
274
286
  if (!this.#agent) {
275
287
  const aidaClient = new AidaClient();
276
288
  if (useGreenDevAgent) {
289
+ if (isAntigravity) {
290
+ this.#socketClient =
291
+ new AiAssistance.GreenDevAgentAntigravityCliSocketClient.GreenDevAgentAntigravityCliSocketClient();
292
+ } else {
293
+ this.#socketClient = new AiAssistance.GreenDevAgentGeminiCliSocketClient.GreenDevAgentGeminiCliSocketClient();
294
+ }
295
+
277
296
  this.#agent = new AiAssistance.GreenDevAgent.GreenDevAgent({aidaClient});
297
+ this.#agent.addEventListener(
298
+ AiAssistance.GreenDevAgent.Events.CLI_PROMPT_REQUESTED,
299
+ async (
300
+ event: Common.EventTarget.EventTargetEvent<
301
+ AiAssistance.GreenDevAgent.EventTypes[AiAssistance.GreenDevAgent.Events.CLI_PROMPT_REQUESTED]>) => {
302
+ const {prompt} = event.data;
303
+ const remoteName = isAntigravity ? 'Antigravity' : 'Gemini';
304
+ const aiContent =
305
+ this.#addMessageInternal(`Fix has been submitted to ${remoteName} CLI, please wait...`, false);
306
+
307
+ if (isAntigravity) {
308
+ let fullResponse = '';
309
+ void (
310
+ this.#socketClient as
311
+ AiAssistance.GreenDevAgentAntigravityCliSocketClient.GreenDevAgentAntigravityCliSocketClient)
312
+ .sendPrompt(prompt, (chunk: string) => {
313
+ fullResponse += chunk;
314
+ const responseText = `Antigravity CLI responds: ${fullResponse}`;
315
+ const markdown = new MarkdownView.MarkdownView.MarkdownView();
316
+ markdown.data = {
317
+ tokens: Marked.Marked.lexer(responseText),
318
+ };
319
+
320
+ const style = document.createElement('style');
321
+ style.textContent =
322
+ '.message { font-size: 1.0rem; } .message code { font-size: 1.0rem; font-family: \'Roboto Mono\', ' +
323
+ 'monospace; color: green; } .message ul { margin-left: 20px; }';
324
+ markdown.shadowRoot?.appendChild(style);
325
+
326
+ this.#updateAiMessage(aiContent, markdown, responseText);
327
+ });
328
+ } else {
329
+ const response =
330
+ await (this.#socketClient as
331
+ AiAssistance.GreenDevAgentGeminiCliSocketClient.GreenDevAgentGeminiCliSocketClient)
332
+ .sendPrompt(prompt);
333
+
334
+ const responseText = `Gemini CLI responds: ${response}`;
335
+ const markdown = new MarkdownView.MarkdownView.MarkdownView();
336
+ markdown.data = {
337
+ tokens: Marked.Marked.lexer(responseText),
338
+ };
339
+ this.#updateAiMessage(aiContent, markdown, responseText);
340
+ }
341
+ });
278
342
  } else {
279
343
  this.#agent = new AiAssistance.StylingAgent.StylingAgent({aidaClient});
280
344
  this.#nodeContext = new AiAssistance.StylingAgent.NodeContext(this.#node);
@@ -282,22 +346,7 @@ class GreenDevFloaty {
282
346
  }
283
347
 
284
348
  this.#addMessageInternal(query, true);
285
- this.#syncChannel.postMessage({
286
- type: 'new-message',
287
- text: query,
288
- isUser: true,
289
- sessionId: this.#backendNodeId,
290
- nodeDescription: document.querySelector('.green-dev-floaty-dialog-node-description')?.textContent,
291
- });
292
-
293
349
  const aiContent = this.#addMessageInternal('Thinking...', false);
294
- this.#syncChannel.postMessage({
295
- type: 'new-message',
296
- text: 'Thinking...',
297
- isUser: false,
298
- sessionId: this.#backendNodeId,
299
- nodeDescription: document.querySelector('.green-dev-floaty-dialog-node-description')?.textContent,
300
- });
301
350
 
302
351
  let agentFinished = false;
303
352
  let steps = 0;
@@ -433,7 +482,8 @@ ${axTree}`;
433
482
  markdown.data = {
434
483
  tokens: Marked.Marked.lexer(sanitizedText),
435
484
  };
436
- aiContent.append(markdown);
485
+ this.#updateAiMessage(aiContent, markdown, result.text);
486
+
437
487
  void new Promise(resolve => setTimeout(resolve, 0)).then(() => {
438
488
  const style = document.createElement('style');
439
489
  style.textContent =
@@ -456,15 +506,12 @@ ${axTree}`;
456
506
  }
457
507
  }
458
508
  });
459
- this.#syncChannel.postMessage(
460
- {type: 'update-last-message', text: result.text, sessionId: this.#backendNodeId});
461
509
  agentFinished = true;
462
510
  break;
463
511
  }
464
512
  case ResponseType.ERROR:
465
- aiContent.textContent = this.#formatError(result.error);
466
- this.#syncChannel.postMessage(
467
- {type: 'update-last-message', text: this.#formatError(result.error), sessionId: this.#backendNodeId});
513
+ this.#updateAiMessage(
514
+ aiContent, document.createTextNode(this.#formatError(result.error)), this.#formatError(result.error));
468
515
  agentFinished = true;
469
516
  break;
470
517
  case ResponseType.SIDE_EFFECT:
@@ -503,8 +550,23 @@ ${axTree}`;
503
550
  this.#chatContainer.appendChild(messageElement);
504
551
  this.#chatContainer.scrollTop = this.#chatContainer.scrollHeight;
505
552
  }
553
+
554
+ this.#syncChannel.postMessage({
555
+ type: 'new-message',
556
+ text,
557
+ isUser,
558
+ sessionId: this.#backendNodeId,
559
+ nodeDescription: document.querySelector('.green-dev-floaty-dialog-node-description')?.textContent,
560
+ });
561
+
506
562
  return content;
507
563
  }
564
+
565
+ #updateAiMessage(aiContentElement: HTMLDivElement, newContent: Node, newText: string): void {
566
+ aiContentElement.textContent = '';
567
+ aiContentElement.append(newContent);
568
+ this.#syncChannel.postMessage({type: 'update-last-message', text: newText, sessionId: this.#backendNodeId});
569
+ }
508
570
  }
509
571
 
510
572
  let greenDevFloatyInstance: GreenDevFloaty;
@@ -384,6 +384,14 @@ export class MainImpl {
384
384
  requiresChromeRestart: true,
385
385
  });
386
386
 
387
+ Root.Runtime.experiments.registerHostExperiment({
388
+ name: Root.ExperimentNames.ExperimentName.PLUS_BUTTON,
389
+ title: 'Show "+" button on the tab strip for adding tools',
390
+ aboutFlag: 'devtools-plus-button',
391
+ isEnabled: Root.Runtime.hostConfig.devToolsPlusButton?.enabled ?? false,
392
+ requiresChromeRestart: false,
393
+ });
394
+
387
395
  Root.Runtime.experiments.enableExperimentsByDefault([
388
396
  Root.ExperimentNames.ExperimentName.USE_SOURCE_MAP_SCOPES,
389
397
  ]);
@@ -540,8 +540,7 @@ inspectorBackend.registerCommand("Emulation.getOverriddenSensorInformation", [{"
540
540
  inspectorBackend.registerCommand("Emulation.setSensorOverrideEnabled", [{"name": "enabled", "type": "boolean", "optional": false, "description": "", "typeRef": null}, {"name": "type", "type": "string", "optional": false, "description": "", "typeRef": "Emulation.SensorType"}, {"name": "metadata", "type": "object", "optional": true, "description": "", "typeRef": "Emulation.SensorMetadata"}], [], "Overrides a platform sensor of a given type. If |enabled| is true, calls to Sensor.start() will use a virtual sensor as backend rather than fetching data from a real hardware sensor. Otherwise, existing virtual sensor-backend Sensor objects will fire an error event and new calls to Sensor.start() will attempt to use a real sensor instead.");
541
541
  inspectorBackend.registerCommand("Emulation.setSensorOverrideReadings", [{"name": "type", "type": "string", "optional": false, "description": "", "typeRef": "Emulation.SensorType"}, {"name": "reading", "type": "object", "optional": false, "description": "", "typeRef": "Emulation.SensorReading"}], [], "Updates the sensor readings reported by a sensor type previously overridden by setSensorOverrideEnabled.");
542
542
  inspectorBackend.registerCommand("Emulation.setPressureSourceOverrideEnabled", [{"name": "enabled", "type": "boolean", "optional": false, "description": "", "typeRef": null}, {"name": "source", "type": "string", "optional": false, "description": "", "typeRef": "Emulation.PressureSource"}, {"name": "metadata", "type": "object", "optional": true, "description": "", "typeRef": "Emulation.PressureMetadata"}], [], "Overrides a pressure source of a given type, as used by the Compute Pressure API, so that updates to PressureObserver.observe() are provided via setPressureStateOverride instead of being retrieved from platform-provided telemetry data.");
543
- inspectorBackend.registerCommand("Emulation.setPressureStateOverride", [{"name": "source", "type": "string", "optional": false, "description": "", "typeRef": "Emulation.PressureSource"}, {"name": "state", "type": "string", "optional": false, "description": "", "typeRef": "Emulation.PressureState"}], [], "TODO: OBSOLETE: To remove when setPressureDataOverride is merged. Provides a given pressure state that will be processed and eventually be delivered to PressureObserver users. |source| must have been previously overridden by setPressureSourceOverrideEnabled.");
544
- inspectorBackend.registerCommand("Emulation.setPressureDataOverride", [{"name": "source", "type": "string", "optional": false, "description": "", "typeRef": "Emulation.PressureSource"}, {"name": "state", "type": "string", "optional": false, "description": "", "typeRef": "Emulation.PressureState"}, {"name": "ownContributionEstimate", "type": "number", "optional": true, "description": "", "typeRef": null}], [], "Provides a given pressure data set that will be processed and eventually be delivered to PressureObserver users. |source| must have been previously overridden by setPressureSourceOverrideEnabled.");
543
+ inspectorBackend.registerCommand("Emulation.setPressureStateOverride", [{"name": "source", "type": "string", "optional": false, "description": "", "typeRef": "Emulation.PressureSource"}, {"name": "state", "type": "string", "optional": false, "description": "", "typeRef": "Emulation.PressureState"}], [], "Provides a given pressure state that will be processed and eventually be delivered to PressureObserver users. |source| must have been previously overridden by setPressureSourceOverrideEnabled.");
545
544
  inspectorBackend.registerCommand("Emulation.setIdleOverride", [{"name": "isUserActive", "type": "boolean", "optional": false, "description": "Mock isUserActive", "typeRef": null}, {"name": "isScreenUnlocked", "type": "boolean", "optional": false, "description": "Mock isScreenUnlocked", "typeRef": null}], [], "Overrides the Idle state.");
546
545
  inspectorBackend.registerCommand("Emulation.clearIdleOverride", [], [], "Clears Idle state overrides.");
547
546
  inspectorBackend.registerCommand("Emulation.setNavigatorOverrides", [{"name": "platform", "type": "string", "optional": false, "description": "The platform navigator.platform should return.", "typeRef": null}], [], "Overrides value returned by the javascript navigator object.");
@@ -1212,7 +1211,7 @@ inspectorBackend.registerEnum("Preload.SpeculationAction", {Prefetch: "Prefetch"
1212
1211
  inspectorBackend.registerEnum("Preload.SpeculationTargetHint", {Blank: "Blank", Self: "Self"});
1213
1212
  inspectorBackend.registerEnum("Preload.PrerenderFinalStatus", {Activated: "Activated", Destroyed: "Destroyed", LowEndDevice: "LowEndDevice", InvalidSchemeRedirect: "InvalidSchemeRedirect", InvalidSchemeNavigation: "InvalidSchemeNavigation", NavigationRequestBlockedByCsp: "NavigationRequestBlockedByCsp", MojoBinderPolicy: "MojoBinderPolicy", RendererProcessCrashed: "RendererProcessCrashed", RendererProcessKilled: "RendererProcessKilled", Download: "Download", TriggerDestroyed: "TriggerDestroyed", NavigationNotCommitted: "NavigationNotCommitted", NavigationBadHttpStatus: "NavigationBadHttpStatus", ClientCertRequested: "ClientCertRequested", NavigationRequestNetworkError: "NavigationRequestNetworkError", CancelAllHostsForTesting: "CancelAllHostsForTesting", DidFailLoad: "DidFailLoad", Stop: "Stop", SslCertificateError: "SslCertificateError", LoginAuthRequested: "LoginAuthRequested", UaChangeRequiresReload: "UaChangeRequiresReload", BlockedByClient: "BlockedByClient", AudioOutputDeviceRequested: "AudioOutputDeviceRequested", MixedContent: "MixedContent", TriggerBackgrounded: "TriggerBackgrounded", MemoryLimitExceeded: "MemoryLimitExceeded", DataSaverEnabled: "DataSaverEnabled", TriggerUrlHasEffectiveUrl: "TriggerUrlHasEffectiveUrl", ActivatedBeforeStarted: "ActivatedBeforeStarted", InactivePageRestriction: "InactivePageRestriction", StartFailed: "StartFailed", TimeoutBackgrounded: "TimeoutBackgrounded", CrossSiteRedirectInInitialNavigation: "CrossSiteRedirectInInitialNavigation", CrossSiteNavigationInInitialNavigation: "CrossSiteNavigationInInitialNavigation", SameSiteCrossOriginRedirectNotOptInInInitialNavigation: "SameSiteCrossOriginRedirectNotOptInInInitialNavigation", SameSiteCrossOriginNavigationNotOptInInInitialNavigation: "SameSiteCrossOriginNavigationNotOptInInInitialNavigation", ActivationNavigationParameterMismatch: "ActivationNavigationParameterMismatch", ActivatedInBackground: "ActivatedInBackground", EmbedderHostDisallowed: "EmbedderHostDisallowed", ActivationNavigationDestroyedBeforeSuccess: "ActivationNavigationDestroyedBeforeSuccess", TabClosedByUserGesture: "TabClosedByUserGesture", TabClosedWithoutUserGesture: "TabClosedWithoutUserGesture", PrimaryMainFrameRendererProcessCrashed: "PrimaryMainFrameRendererProcessCrashed", PrimaryMainFrameRendererProcessKilled: "PrimaryMainFrameRendererProcessKilled", ActivationFramePolicyNotCompatible: "ActivationFramePolicyNotCompatible", PreloadingDisabled: "PreloadingDisabled", BatterySaverEnabled: "BatterySaverEnabled", ActivatedDuringMainFrameNavigation: "ActivatedDuringMainFrameNavigation", PreloadingUnsupportedByWebContents: "PreloadingUnsupportedByWebContents", CrossSiteRedirectInMainFrameNavigation: "CrossSiteRedirectInMainFrameNavigation", CrossSiteNavigationInMainFrameNavigation: "CrossSiteNavigationInMainFrameNavigation", SameSiteCrossOriginRedirectNotOptInInMainFrameNavigation: "SameSiteCrossOriginRedirectNotOptInInMainFrameNavigation", SameSiteCrossOriginNavigationNotOptInInMainFrameNavigation: "SameSiteCrossOriginNavigationNotOptInInMainFrameNavigation", MemoryPressureOnTrigger: "MemoryPressureOnTrigger", MemoryPressureAfterTriggered: "MemoryPressureAfterTriggered", PrerenderingDisabledByDevTools: "PrerenderingDisabledByDevTools", SpeculationRuleRemoved: "SpeculationRuleRemoved", ActivatedWithAuxiliaryBrowsingContexts: "ActivatedWithAuxiliaryBrowsingContexts", MaxNumOfRunningEagerPrerendersExceeded: "MaxNumOfRunningEagerPrerendersExceeded", MaxNumOfRunningNonEagerPrerendersExceeded: "MaxNumOfRunningNonEagerPrerendersExceeded", MaxNumOfRunningEmbedderPrerendersExceeded: "MaxNumOfRunningEmbedderPrerendersExceeded", PrerenderingUrlHasEffectiveUrl: "PrerenderingUrlHasEffectiveUrl", RedirectedPrerenderingUrlHasEffectiveUrl: "RedirectedPrerenderingUrlHasEffectiveUrl", ActivationUrlHasEffectiveUrl: "ActivationUrlHasEffectiveUrl", JavaScriptInterfaceAdded: "JavaScriptInterfaceAdded", JavaScriptInterfaceRemoved: "JavaScriptInterfaceRemoved", AllPrerenderingCanceled: "AllPrerenderingCanceled", WindowClosed: "WindowClosed", SlowNetwork: "SlowNetwork", OtherPrerenderedPageActivated: "OtherPrerenderedPageActivated", V8OptimizerDisabled: "V8OptimizerDisabled", PrerenderFailedDuringPrefetch: "PrerenderFailedDuringPrefetch", BrowsingDataRemoved: "BrowsingDataRemoved", PrerenderHostReused: "PrerenderHostReused", FormSubmitWhenPrerendering: "FormSubmitWhenPrerendering", CrossDocumentRestart: "CrossDocumentRestart"});
1214
1213
  inspectorBackend.registerEnum("Preload.PreloadingStatus", {Pending: "Pending", Running: "Running", Ready: "Ready", Success: "Success", Failure: "Failure", NotSupported: "NotSupported"});
1215
- inspectorBackend.registerEnum("Preload.PrefetchStatus", {PrefetchAllowed: "PrefetchAllowed", PrefetchFailedIneligibleRedirect: "PrefetchFailedIneligibleRedirect", PrefetchFailedInvalidRedirect: "PrefetchFailedInvalidRedirect", PrefetchFailedMIMENotSupported: "PrefetchFailedMIMENotSupported", PrefetchFailedNetError: "PrefetchFailedNetError", PrefetchFailedNon2XX: "PrefetchFailedNon2XX", PrefetchEvictedAfterBrowsingDataRemoved: "PrefetchEvictedAfterBrowsingDataRemoved", PrefetchEvictedAfterCandidateRemoved: "PrefetchEvictedAfterCandidateRemoved", PrefetchEvictedForNewerPrefetch: "PrefetchEvictedForNewerPrefetch", PrefetchHeldback: "PrefetchHeldback", PrefetchIneligibleRetryAfter: "PrefetchIneligibleRetryAfter", PrefetchIsPrivacyDecoy: "PrefetchIsPrivacyDecoy", PrefetchIsStale: "PrefetchIsStale", PrefetchNotEligibleBrowserContextOffTheRecord: "PrefetchNotEligibleBrowserContextOffTheRecord", PrefetchNotEligibleDataSaverEnabled: "PrefetchNotEligibleDataSaverEnabled", PrefetchNotEligibleExistingProxy: "PrefetchNotEligibleExistingProxy", PrefetchNotEligibleHostIsNonUnique: "PrefetchNotEligibleHostIsNonUnique", PrefetchNotEligibleNonDefaultStoragePartition: "PrefetchNotEligibleNonDefaultStoragePartition", PrefetchNotEligibleSameSiteCrossOriginPrefetchRequiredProxy: "PrefetchNotEligibleSameSiteCrossOriginPrefetchRequiredProxy", PrefetchNotEligibleSchemeIsNotHttps: "PrefetchNotEligibleSchemeIsNotHttps", PrefetchNotEligibleUserHasCookies: "PrefetchNotEligibleUserHasCookies", PrefetchNotEligibleUserHasServiceWorker: "PrefetchNotEligibleUserHasServiceWorker", PrefetchNotEligibleUserHasServiceWorkerNoFetchHandler: "PrefetchNotEligibleUserHasServiceWorkerNoFetchHandler", PrefetchNotEligibleRedirectFromServiceWorker: "PrefetchNotEligibleRedirectFromServiceWorker", PrefetchNotEligibleRedirectToServiceWorker: "PrefetchNotEligibleRedirectToServiceWorker", PrefetchNotEligibleBatterySaverEnabled: "PrefetchNotEligibleBatterySaverEnabled", PrefetchNotEligiblePreloadingDisabled: "PrefetchNotEligiblePreloadingDisabled", PrefetchNotFinishedInTime: "PrefetchNotFinishedInTime", PrefetchNotStarted: "PrefetchNotStarted", PrefetchNotUsedCookiesChanged: "PrefetchNotUsedCookiesChanged", PrefetchProxyNotAvailable: "PrefetchProxyNotAvailable", PrefetchResponseUsed: "PrefetchResponseUsed", PrefetchSuccessfulButNotUsed: "PrefetchSuccessfulButNotUsed", PrefetchNotUsedProbeFailed: "PrefetchNotUsedProbeFailed", PrefetchCancelledOnUserNavigation: "PrefetchCancelledOnUserNavigation"});
1214
+ inspectorBackend.registerEnum("Preload.PrefetchStatus", {PrefetchAllowed: "PrefetchAllowed", PrefetchFailedIneligibleRedirect: "PrefetchFailedIneligibleRedirect", PrefetchFailedInvalidRedirect: "PrefetchFailedInvalidRedirect", PrefetchFailedMIMENotSupported: "PrefetchFailedMIMENotSupported", PrefetchFailedNetError: "PrefetchFailedNetError", PrefetchFailedNon2XX: "PrefetchFailedNon2XX", PrefetchEvictedAfterBrowsingDataRemoved: "PrefetchEvictedAfterBrowsingDataRemoved", PrefetchEvictedAfterCandidateRemoved: "PrefetchEvictedAfterCandidateRemoved", PrefetchEvictedForNewerPrefetch: "PrefetchEvictedForNewerPrefetch", PrefetchHeldback: "PrefetchHeldback", PrefetchIneligibleRetryAfter: "PrefetchIneligibleRetryAfter", PrefetchIsPrivacyDecoy: "PrefetchIsPrivacyDecoy", PrefetchIsStale: "PrefetchIsStale", PrefetchNotEligibleBrowserContextOffTheRecord: "PrefetchNotEligibleBrowserContextOffTheRecord", PrefetchNotEligibleDataSaverEnabled: "PrefetchNotEligibleDataSaverEnabled", PrefetchNotEligibleExistingProxy: "PrefetchNotEligibleExistingProxy", PrefetchNotEligibleHostIsNonUnique: "PrefetchNotEligibleHostIsNonUnique", PrefetchNotEligibleNonDefaultStoragePartition: "PrefetchNotEligibleNonDefaultStoragePartition", PrefetchNotEligibleSameSiteCrossOriginPrefetchRequiredProxy: "PrefetchNotEligibleSameSiteCrossOriginPrefetchRequiredProxy", PrefetchNotEligibleSchemeIsNotHttps: "PrefetchNotEligibleSchemeIsNotHttps", PrefetchNotEligibleUserHasCookies: "PrefetchNotEligibleUserHasCookies", PrefetchNotEligibleUserHasServiceWorker: "PrefetchNotEligibleUserHasServiceWorker", PrefetchNotEligibleUserHasServiceWorkerNoFetchHandler: "PrefetchNotEligibleUserHasServiceWorkerNoFetchHandler", PrefetchNotEligibleRedirectFromServiceWorker: "PrefetchNotEligibleRedirectFromServiceWorker", PrefetchNotEligibleRedirectToServiceWorker: "PrefetchNotEligibleRedirectToServiceWorker", PrefetchNotEligibleBatterySaverEnabled: "PrefetchNotEligibleBatterySaverEnabled", PrefetchNotEligiblePreloadingDisabled: "PrefetchNotEligiblePreloadingDisabled", PrefetchNotFinishedInTime: "PrefetchNotFinishedInTime", PrefetchNotStarted: "PrefetchNotStarted", PrefetchNotUsedCookiesChanged: "PrefetchNotUsedCookiesChanged", PrefetchProxyNotAvailable: "PrefetchProxyNotAvailable", PrefetchResponseUsed: "PrefetchResponseUsed", PrefetchSuccessfulButNotUsed: "PrefetchSuccessfulButNotUsed", PrefetchNotUsedProbeFailed: "PrefetchNotUsedProbeFailed"});
1216
1215
  inspectorBackend.registerEvent("Preload.ruleSetUpdated", ["ruleSet"]);
1217
1216
  inspectorBackend.registerEvent("Preload.ruleSetRemoved", ["id"]);
1218
1217
  inspectorBackend.registerEvent("Preload.preloadEnabledStateUpdated", ["disabledByPreference", "disabledByDataSaver", "disabledByBatterySaver", "disabledByHoldbackPrefetchSpeculationRules", "disabledByHoldbackPrerenderSpeculationRules"]);
@@ -1410,7 +1409,7 @@ inspectorBackend.registerCommand("Target.setDiscoverTargets", [{"name": "discove
1410
1409
  inspectorBackend.registerCommand("Target.setRemoteLocations", [{"name": "locations", "type": "array", "optional": false, "description": "List of remote locations.", "typeRef": "Target.RemoteLocation"}], [], "Enables target discovery for the specified locations, when `setDiscoverTargets` was set to `true`.");
1411
1410
  inspectorBackend.registerCommand("Target.getDevToolsTarget", [{"name": "targetId", "type": "string", "optional": false, "description": "Page or tab target ID.", "typeRef": "Target.TargetID"}], ["targetId"], "Gets the targetId of the DevTools page target opened for the given target (if any).");
1412
1411
  inspectorBackend.registerCommand("Target.openDevTools", [{"name": "targetId", "type": "string", "optional": false, "description": "This can be the page or tab target ID.", "typeRef": "Target.TargetID"}, {"name": "panelId", "type": "string", "optional": true, "description": "The id of the panel we want DevTools to open initially. Currently supported panels are elements, console, network, sources, resources and performance.", "typeRef": null}], ["targetId"], "Opens a DevTools window for the target.");
1413
- inspectorBackend.registerType("Target.TargetInfo", [{"name": "targetId", "type": "string", "optional": false, "description": "", "typeRef": "Target.TargetID"}, {"name": "type", "type": "string", "optional": false, "description": "List of types: https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/devtools_agent_host_impl.cc?ss=chromium&q=f:devtools%20-f:out%20%22::kTypeTab%5B%5D%22", "typeRef": null}, {"name": "title", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "url", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "attached", "type": "boolean", "optional": false, "description": "Whether the target has an attached client.", "typeRef": null}, {"name": "parentId", "type": "string", "optional": true, "description": "Id of the parent target, if any. For example, \\\"iframe\\\" target may have a \\\"page\\\" parent.", "typeRef": "Target.TargetID"}, {"name": "openerId", "type": "string", "optional": true, "description": "Opener target Id", "typeRef": "Target.TargetID"}, {"name": "canAccessOpener", "type": "boolean", "optional": false, "description": "Whether the target has access to the originating window.", "typeRef": null}, {"name": "openerFrameId", "type": "string", "optional": true, "description": "Frame id of originating window (is only set if target has an opener).", "typeRef": "Page.FrameId"}, {"name": "parentFrameId", "type": "string", "optional": true, "description": "Id of the parent frame, present for \\\"iframe\\\" and \\\"worker\\\" targets. For nested workers, this is the \\\"ancestor\\\" frame that created the first worker in the nested chain.", "typeRef": "Page.FrameId"}, {"name": "browserContextId", "type": "string", "optional": true, "description": "", "typeRef": "Browser.BrowserContextID"}, {"name": "subtype", "type": "string", "optional": true, "description": "Provides additional details for specific target types. For example, for the type of \\\"page\\\", this may be set to \\\"prerender\\\".", "typeRef": null}]);
1412
+ inspectorBackend.registerType("Target.TargetInfo", [{"name": "targetId", "type": "string", "optional": false, "description": "", "typeRef": "Target.TargetID"}, {"name": "type", "type": "string", "optional": false, "description": "List of types: https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/devtools_agent_host_impl.cc?ss=chromium&q=f:devtools%20-f:out%20%22::kTypeTab%5B%5D%22", "typeRef": null}, {"name": "title", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "url", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "attached", "type": "boolean", "optional": false, "description": "Whether the target has an attached client.", "typeRef": null}, {"name": "parentId", "type": "string", "optional": true, "description": "Id of the parent target, if any. For example, \\\"iframe\\\" target may have a \\\"page\\\" parent.", "typeRef": "Target.TargetID"}, {"name": "openerId", "type": "string", "optional": true, "description": "Opener target Id", "typeRef": "Target.TargetID"}, {"name": "canAccessOpener", "type": "boolean", "optional": false, "description": "Whether the target has access to the originating window.", "typeRef": null}, {"name": "openerFrameId", "type": "string", "optional": true, "description": "Frame id of originating window (is only set if target has an opener).", "typeRef": "Page.FrameId"}, {"name": "parentFrameId", "type": "string", "optional": true, "description": "Id of the parent frame, present for \\\"iframe\\\" and \\\"worker\\\" targets. For nested workers, this is the \\\"ancestor\\\" frame that created the first worker in the nested chain.", "typeRef": "Page.FrameId"}, {"name": "browserContextId", "type": "string", "optional": true, "description": "", "typeRef": "Browser.BrowserContextID"}, {"name": "subtype", "type": "string", "optional": true, "description": "Provides additional details for specific target types. For example, for the type of \\\"page\\\", this may be set to \\\"prerender\\\".", "typeRef": null}, {"name": "embedderData", "type": "object", "optional": true, "description": "Embedder-specific target metadata. This is only set for targets of type \\\"tab\\\".", "typeRef": null}]);
1414
1413
  inspectorBackend.registerType("Target.FilterEntry", [{"name": "exclude", "type": "boolean", "optional": true, "description": "If set, causes exclusion of matching targets from the list.", "typeRef": null}, {"name": "type", "type": "string", "optional": true, "description": "If not present, matches any type.", "typeRef": null}]);
1415
1414
  inspectorBackend.registerType("Target.TargetFilter", [{"name": "TargetFilter", "type": "array", "optional": false, "description": "The entries in TargetFilter are matched sequentially against targets and the first entry that matches determines if the target is included or not, depending on the value of `exclude` field in the entry. If filter is not specified, the one assumed is [{type: \\\"browser\\\", exclude: true}, {type: \\\"tab\\\", exclude: true}, {}] (i.e. include everything but `browser` and `tab`).", "typeRef": "Target.FilterEntry"}]);
1416
1415
  inspectorBackend.registerType("Target.RemoteLocation", [{"name": "host", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "port", "type": "number", "optional": false, "description": "", "typeRef": null}]);