chrome-devtools-frontend 1.0.1579812 → 1.0.1581708

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 (351) hide show
  1. package/agents/prompts/creating-a-model.md +51 -0
  2. package/agents/prompts/merging-devtools-module.md +144 -0
  3. package/agents/prompts/ui-widgets.md +351 -0
  4. package/agents/prompts/verification.md +2 -1
  5. package/docs/contributing/README.md +5 -6
  6. package/docs/contributing/changes.md +1 -2
  7. package/docs/feature-specs/elements-tree-edit-html.md +14 -0
  8. package/docs/feature-specs/elements-tree-node-title.md +46 -0
  9. package/docs/styleguide/ux/README.md +1 -1
  10. package/front_end/core/host/UserMetrics.ts +3 -7
  11. package/front_end/core/root/Runtime.ts +0 -1
  12. package/front_end/core/sdk/NetworkManager.ts +0 -35
  13. package/front_end/core/sdk/OverlayModel.ts +12 -0
  14. package/front_end/core/sdk/StorageKeyManager.ts +6 -1
  15. package/front_end/core/sdk/Target.ts +4 -2
  16. package/front_end/devtools_compatibility.js +4 -0
  17. package/front_end/entrypoints/devtools_app/devtools_app.ts +1 -0
  18. package/front_end/entrypoints/greendev_floaty/FloatyEntrypoint.ts +536 -0
  19. package/front_end/entrypoints/greendev_floaty/floaty.css +298 -0
  20. package/front_end/entrypoints/greendev_floaty/floaty.html +38 -0
  21. package/front_end/entrypoints/greendev_floaty/greendev_floaty.ts +422 -0
  22. package/front_end/entrypoints/inspector_main/InspectorMain.ts +0 -38
  23. package/front_end/entrypoints/node_app/app/NodeMain.ts +19 -1
  24. package/front_end/entrypoints/node_app/node_app.ts +34 -0
  25. package/front_end/generated/InspectorBackendCommands.ts +9 -3
  26. package/front_end/generated/SupportedCSSProperties.js +39 -31
  27. package/front_end/generated/protocol-mapping.d.ts +12 -0
  28. package/front_end/generated/protocol-proxy-api.d.ts +12 -0
  29. package/front_end/generated/protocol.ts +56 -2
  30. package/front_end/models/ai_assistance/AiConversation.ts +10 -0
  31. package/front_end/models/ai_assistance/agents/AiAgent.ts +2 -0
  32. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.snapshot.txt +24 -2
  33. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +104 -9
  34. package/front_end/{panels/elements → models/computed_style}/ComputedStyleModel.ts +26 -0
  35. package/front_end/models/computed_style/computed_style.ts +9 -0
  36. package/front_end/models/issues_manager/CookieIssue.ts +0 -28
  37. package/front_end/models/issues_manager/CorsIssue.ts +11 -14
  38. package/front_end/panels/accessibility/AXBreadcrumbsPane.ts +3 -5
  39. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +102 -6
  40. package/front_end/panels/ai_assistance/components/ChatInput.ts +15 -2
  41. package/front_end/panels/ai_assistance/components/ChatView.ts +2 -0
  42. package/front_end/panels/animation/AnimationGroupPreviewUI.ts +1 -1
  43. package/front_end/panels/application/ApplicationPanelSidebar.ts +13 -11
  44. package/front_end/panels/application/DOMStorageModel.ts +1 -1
  45. package/front_end/panels/application/ResourcesPanel.ts +10 -5
  46. package/front_end/panels/application/ServiceWorkerUpdateCycleView.ts +0 -1
  47. package/front_end/panels/application/components/BackForwardCacheView.ts +2 -4
  48. package/front_end/panels/autofill/AutofillView.ts +1 -1
  49. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +0 -1
  50. package/front_end/panels/changes/changesSidebar.css +5 -0
  51. package/front_end/panels/common/AiCodeCompletionTeaser.ts +13 -3
  52. package/front_end/panels/common/ExtensionPanel.ts +4 -0
  53. package/front_end/panels/common/FreDialog.ts +4 -0
  54. package/front_end/panels/common/aiCodeCompletionTeaser.css +6 -0
  55. package/front_end/panels/console/ConsoleViewMessage.ts +0 -1
  56. package/front_end/panels/console_counters/WarningErrorCounter.ts +16 -10
  57. package/front_end/panels/coverage/CoverageListView.ts +18 -3
  58. package/front_end/panels/elements/AdoptedStyleSheetTreeElement.ts +11 -0
  59. package/front_end/panels/elements/ComputedStyleWidget.ts +67 -45
  60. package/front_end/panels/elements/ElementsPanel.ts +4 -3
  61. package/front_end/panels/elements/ElementsSidebarPane.ts +11 -8
  62. package/front_end/panels/elements/ElementsTreeElement.ts +0 -1
  63. package/front_end/panels/elements/ElementsTreeOutline.ts +25 -15
  64. package/front_end/panels/elements/LayoutPane.ts +7 -8
  65. package/front_end/panels/elements/MetricsSidebarPane.ts +2 -2
  66. package/front_end/panels/elements/PlatformFontsWidget.ts +24 -9
  67. package/front_end/panels/elements/PropertiesWidget.ts +3 -6
  68. package/front_end/panels/elements/StylesSidebarPane.ts +4 -3
  69. package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +1 -1
  70. package/front_end/panels/elements/components/StylePropertyEditor.ts +1 -2
  71. package/front_end/panels/elements/elements.ts +1 -3
  72. package/front_end/panels/greendev/GreenDevPanel.css +282 -0
  73. package/front_end/panels/greendev/GreenDevPanel.ts +337 -0
  74. package/front_end/panels/greendev/GreenDevShared.ts +13 -0
  75. package/front_end/panels/greendev/greendev-meta.ts +52 -0
  76. package/front_end/panels/greendev/greendev.ts +9 -0
  77. package/front_end/panels/issues/CorsIssueDetailsView.ts +4 -4
  78. package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +1 -1
  79. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +1 -1
  80. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +1 -1
  81. package/front_end/panels/media/PlayerListView.ts +1 -1
  82. package/front_end/panels/network/NetworkLogViewColumns.ts +1 -2
  83. package/front_end/panels/network/RequestInitiatorView.ts +8 -11
  84. package/front_end/panels/network/RequestTimingView.ts +1 -1
  85. package/front_end/panels/network/components/RequestHeaderSection.ts +1 -1
  86. package/front_end/panels/protocol_monitor/JSONEditor.ts +1 -1
  87. package/front_end/panels/recorder/components/RecordingListView.ts +1 -1
  88. package/front_end/panels/recorder/components/StepEditor.ts +3 -3
  89. package/front_end/panels/security/SecurityPanel.ts +0 -4
  90. package/front_end/panels/security/SecurityPanelSidebar.ts +2 -42
  91. package/front_end/panels/security/security-meta.ts +2 -14
  92. package/front_end/panels/security/security.ts +0 -4
  93. package/front_end/panels/settings/KeybindsSettingsTab.ts +5 -5
  94. package/front_end/panels/sources/OutlineQuickOpen.ts +19 -0
  95. package/front_end/panels/sources/SourcesSearchScope.ts +2 -1
  96. package/front_end/panels/sources/components/HeadersView.ts +2 -2
  97. package/front_end/panels/timeline/TimelinePanel.ts +25 -0
  98. package/front_end/panels/timeline/components/BreadcrumbsUI.ts +1 -1
  99. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +1 -1
  100. package/front_end/third_party/chromium/README.chromium +1 -1
  101. package/front_end/third_party/lighthouse/README.chromium +2 -2
  102. package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +145 -144
  103. package/front_end/third_party/lighthouse/report/bundle.js +12 -5
  104. package/front_end/third_party/lighthouse/report-assets/report-generator.mjs +2 -2
  105. package/front_end/third_party/puppeteer/README.chromium +2 -2
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +35 -0
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js +19 -0
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.d.ts +16 -1
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.d.ts.map +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.js.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.d.ts +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.js +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +21 -0
  116. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js +6 -0
  118. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/locators/locators.d.ts +13 -1
  120. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/locators/locators.d.ts.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/locators/locators.js +56 -36
  122. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/locators/locators.js.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts +2 -2
  124. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js +32 -8
  126. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts +5 -1
  128. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  129. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js +32 -2
  130. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js.map +1 -1
  131. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts +3 -2
  132. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts.map +1 -1
  133. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js +20 -0
  134. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js.map +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts +2 -1
  136. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +25 -8
  138. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Browser.d.ts +2 -0
  140. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Browser.d.ts.map +1 -1
  141. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Browser.js +23 -0
  142. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Browser.js.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts +3 -2
  144. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js +10 -6
  146. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.d.ts.map +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.js +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.js.map +1 -1
  150. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.d.ts +29 -0
  151. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  152. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js +46 -6
  153. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js.map +1 -1
  154. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts +5 -1
  155. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  156. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js +18 -0
  157. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js.map +1 -1
  158. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ExecutionContext.js +2 -2
  159. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ExecutionContext.js.map +1 -1
  160. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
  161. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.js +13 -1
  162. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.js.map +1 -1
  163. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/JSHandle.js +2 -2
  164. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/JSHandle.js.map +1 -1
  165. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +7 -2
  166. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  167. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +43 -7
  168. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  169. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/utils.d.ts +10 -1
  170. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/utils.d.ts.map +1 -1
  171. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/utils.js +34 -4
  172. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/utils.js.map +1 -1
  173. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Cookie.d.ts +1 -1
  174. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Cookie.d.ts.map +1 -1
  175. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +1 -1
  176. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts.map +1 -1
  177. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +1 -1
  178. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js.map +1 -1
  179. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/XPathQuerySelector.js +1 -1
  180. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/XPathQuerySelector.js.map +1 -1
  181. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  182. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  183. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.js +1 -0
  184. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.js.map +1 -1
  185. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
  186. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js +2 -0
  187. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js.map +1 -1
  188. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/LaunchOptions.d.ts +4 -0
  189. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/LaunchOptions.d.ts.map +1 -1
  190. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/PuppeteerNode.d.ts.map +1 -1
  191. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/PuppeteerNode.js +2 -2
  192. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/PuppeteerNode.js.map +1 -1
  193. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  194. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  195. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  196. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  197. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  198. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +129 -3
  199. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +233 -65
  200. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +35 -0
  201. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  202. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js +19 -0
  203. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  204. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.d.ts +16 -1
  205. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.d.ts.map +1 -1
  206. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.js.map +1 -1
  207. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.d.ts +1 -1
  208. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.js +1 -1
  209. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +21 -0
  210. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  211. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js +6 -0
  212. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  213. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/locators/locators.d.ts +13 -1
  214. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/locators/locators.d.ts.map +1 -1
  215. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/locators/locators.js +56 -36
  216. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/locators/locators.js.map +1 -1
  217. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts +2 -2
  218. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts.map +1 -1
  219. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js +30 -6
  220. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js.map +1 -1
  221. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts +5 -1
  222. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  223. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js +32 -2
  224. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js.map +1 -1
  225. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts +3 -2
  226. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts.map +1 -1
  227. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js +20 -0
  228. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js.map +1 -1
  229. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts +2 -1
  230. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
  231. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +25 -8
  232. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
  233. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Browser.d.ts +2 -0
  234. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Browser.d.ts.map +1 -1
  235. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Browser.js +23 -0
  236. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Browser.js.map +1 -1
  237. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts +3 -2
  238. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  239. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js +10 -6
  240. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  241. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.d.ts.map +1 -1
  242. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.js +1 -1
  243. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.js.map +1 -1
  244. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.d.ts +29 -0
  245. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  246. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js +46 -6
  247. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js.map +1 -1
  248. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts +5 -1
  249. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  250. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js +19 -1
  251. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js.map +1 -1
  252. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ExecutionContext.js +3 -3
  253. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ExecutionContext.js.map +1 -1
  254. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
  255. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.js +14 -2
  256. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.js.map +1 -1
  257. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/JSHandle.js +3 -3
  258. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/JSHandle.js.map +1 -1
  259. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +7 -2
  260. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  261. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +43 -8
  262. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  263. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/utils.d.ts +10 -1
  264. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/utils.d.ts.map +1 -1
  265. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/utils.js +31 -3
  266. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/utils.js.map +1 -1
  267. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Cookie.d.ts +1 -1
  268. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Cookie.d.ts.map +1 -1
  269. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +1 -1
  270. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts.map +1 -1
  271. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +1 -1
  272. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js.map +1 -1
  273. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/XPathQuerySelector.js +1 -1
  274. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/XPathQuerySelector.js.map +1 -1
  275. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  276. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.js +1 -0
  277. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.js.map +1 -1
  278. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
  279. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js +2 -0
  280. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js.map +1 -1
  281. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/LaunchOptions.d.ts +4 -0
  282. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/LaunchOptions.d.ts.map +1 -1
  283. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/PuppeteerNode.d.ts.map +1 -1
  284. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/PuppeteerNode.js +2 -2
  285. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/PuppeteerNode.js.map +1 -1
  286. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  287. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  288. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  289. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  290. package/front_end/third_party/puppeteer/package/lib/types.d.ts +129 -3
  291. package/front_end/third_party/puppeteer/package/package.json +4 -4
  292. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +46 -0
  293. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +21 -0
  294. package/front_end/third_party/puppeteer/package/src/api/Frame.ts +1 -1
  295. package/front_end/third_party/puppeteer/package/src/api/Page.ts +23 -0
  296. package/front_end/third_party/puppeteer/package/src/api/locators/locators.ts +88 -56
  297. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +33 -8
  298. package/front_end/third_party/puppeteer/package/src/bidi/BrowserContext.ts +61 -3
  299. package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +23 -2
  300. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +29 -8
  301. package/front_end/third_party/puppeteer/package/src/bidi/core/Browser.ts +30 -0
  302. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +13 -2
  303. package/front_end/third_party/puppeteer/package/src/bidi/core/UserContext.ts +1 -0
  304. package/front_end/third_party/puppeteer/package/src/cdp/Accessibility.ts +85 -8
  305. package/front_end/third_party/puppeteer/package/src/cdp/BrowserContext.ts +36 -1
  306. package/front_end/third_party/puppeteer/package/src/cdp/ExecutionContext.ts +5 -5
  307. package/front_end/third_party/puppeteer/package/src/cdp/HTTPRequest.ts +23 -2
  308. package/front_end/third_party/puppeteer/package/src/cdp/JSHandle.ts +3 -3
  309. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +60 -8
  310. package/front_end/third_party/puppeteer/package/src/cdp/utils.ts +36 -3
  311. package/front_end/third_party/puppeteer/package/src/common/Cookie.ts +1 -1
  312. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  313. package/front_end/third_party/puppeteer/package/src/injected/XPathQuerySelector.ts +1 -1
  314. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +1 -0
  315. package/front_end/third_party/puppeteer/package/src/node/ChromeLauncher.ts +2 -0
  316. package/front_end/third_party/puppeteer/package/src/node/LaunchOptions.ts +4 -0
  317. package/front_end/third_party/puppeteer/package/src/node/PuppeteerNode.ts +8 -6
  318. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  319. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  320. package/front_end/ui/components/suggestion_input/SuggestionInput.ts +12 -7
  321. package/front_end/ui/components/text_editor/AutocompleteHistory.ts +2 -1
  322. package/front_end/ui/components/text_editor/TextEditorHistory.ts +1 -1
  323. package/front_end/ui/components/tree_outline/TreeOutline.ts +1 -1
  324. package/front_end/ui/legacy/ListControl.ts +27 -1
  325. package/front_end/ui/legacy/ListWidget.ts +1 -1
  326. package/front_end/ui/legacy/SearchableView.ts +5 -2
  327. package/front_end/ui/legacy/SoftContextMenu.ts +1 -2
  328. package/front_end/ui/legacy/Treeoutline.ts +1 -2
  329. package/front_end/ui/legacy/UIUtils.ts +17 -7
  330. package/front_end/ui/legacy/Widget.ts +15 -0
  331. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +8 -4
  332. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +50 -1
  333. package/front_end/ui/legacy/components/data_grid/ViewportDataGrid.ts +2 -1
  334. package/front_end/ui/legacy/components/data_grid/data_grid.ts +1 -0
  335. package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +1 -1
  336. package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +4 -2
  337. package/front_end/ui/visual_logging/KnownContextValues.ts +15 -0
  338. package/inspector_overlay/main.ts +18 -3
  339. package/inspector_overlay/tool_green_dev_anchors.css +54 -0
  340. package/inspector_overlay/tool_green_dev_anchors.ts +164 -0
  341. package/inspector_overlay/tool_persistent.ts +14 -0
  342. package/mcp/mcp.ts +1 -0
  343. package/package.json +1 -1
  344. package/docs/contributing/design.md +0 -166
  345. package/docs/design_guidelines.md +0 -1
  346. package/front_end/panels/security/CookieControlsTreeElement.ts +0 -21
  347. package/front_end/panels/security/CookieControlsView.ts +0 -447
  348. package/front_end/panels/security/CookieReportTreeElement.ts +0 -21
  349. package/front_end/panels/security/CookieReportView.ts +0 -549
  350. package/front_end/panels/security/cookieControlsView.css +0 -139
  351. package/front_end/panels/security/cookieReportView.css +0 -90
@@ -0,0 +1,536 @@
1
+ // Copyright 2026 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+ /* eslint-disable @devtools/no-imperative-dom-api */
5
+
6
+ import '../../core/sdk/sdk-meta.js';
7
+ import '../../models/workspace/workspace-meta.js';
8
+ import '../../panels/sensors/sensors-meta.js';
9
+ import '../../entrypoints/inspector_main/inspector_main-meta.js';
10
+ import '../../entrypoints/main/main-meta.js';
11
+
12
+ import * as Common from '../../core/common/common.js';
13
+ import * as Host from '../../core/host/host.js';
14
+ import * as i18n from '../../core/i18n/i18n.js';
15
+ import type * as Platform from '../../core/platform/platform.js';
16
+ import type * as ExperimentNames from '../../core/root/ExperimentNames.js';
17
+ import * as Root from '../../core/root/root.js';
18
+ import * as SDK from '../../core/sdk/sdk.js';
19
+ import * as Foundation from '../../foundation/foundation.js';
20
+ import type * as Protocol from '../../generated/protocol.js';
21
+ import * as AiAssistance from '../../models/ai_assistance/ai_assistance.js';
22
+ import type {SyncMessage} from '../../panels/greendev/GreenDevShared.js';
23
+ import * as UI from '../../ui/legacy/legacy.js';
24
+ import * as ThemeSupport from '../../ui/legacy/theme_support/theme_support.js';
25
+
26
+ const {AidaClient} = Host.AidaClient;
27
+ const {ResponseType} = AiAssistance.AiAgent;
28
+
29
+ let pendingActivationSessionId: number|null = null;
30
+
31
+ class GreenDevFloaty {
32
+ #chatContainer!: HTMLDivElement;
33
+ #textField!: HTMLInputElement;
34
+ #playButton!: HTMLButtonElement;
35
+ #node?: SDK.DOMModel.DOMNode;
36
+ #agent?: AiAssistance.StylingAgent.StylingAgent;
37
+ #nodeContext?: AiAssistance.StylingAgent.NodeContext;
38
+ #backendNodeId?: Protocol.DOM.BackendNodeId;
39
+ #syncChannel: BroadcastChannel;
40
+ #isFloatyWindow: boolean;
41
+
42
+ constructor(document: Document) {
43
+ const params = new URLSearchParams(window.location.hash.substring(1));
44
+ this.#backendNodeId = parseInt(params.get('backendNodeId') || '0', 10) as Protocol.DOM.BackendNodeId;
45
+ this.#isFloatyWindow = !!this.#backendNodeId;
46
+
47
+ this.#syncChannel = new BroadcastChannel('green-dev-sync');
48
+ this.#syncChannel.onmessage = event => {
49
+ this.#onSyncMessage(event.data);
50
+ };
51
+
52
+ this.#initFloatyMode(document);
53
+ }
54
+
55
+ #initFloatyMode(doc: Document): void {
56
+ this.#chatContainer = doc.getElementById('chat-container') as HTMLDivElement;
57
+ this.#textField = doc.querySelector('.green-dev-floaty-dialog-text-field') as HTMLInputElement;
58
+ this.#playButton = doc.querySelector('.green-dev-floaty-dialog-play-button') as HTMLButtonElement;
59
+
60
+ this.#playButton?.addEventListener('click', () => {
61
+ if (this.#node) {
62
+ void this.runConversation();
63
+ }
64
+ });
65
+
66
+ const contextText = doc.querySelector('.green-dev-floaty-dialog-context-text') as HTMLSpanElement;
67
+ if (contextText) {
68
+ contextText.style.cursor = 'pointer';
69
+ contextText.title = 'Click to show in DevTools Panel';
70
+ contextText.addEventListener('click', () => {
71
+ this.#broadcastFullState();
72
+ });
73
+ }
74
+
75
+ const learnMoreLink = doc.querySelector('.learn-more-link');
76
+ if (learnMoreLink) {
77
+ learnMoreLink.addEventListener('click', event => {
78
+ event.preventDefault();
79
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.openInNewTab(
80
+ 'https://developer.chrome.com/docs/devtools/ai-assistance' as Platform.DevToolsPath.UrlString);
81
+ });
82
+ }
83
+
84
+ const nodeDescriptionElement = doc.querySelector('.green-dev-floaty-dialog-node-description') as HTMLDivElement;
85
+ nodeDescriptionElement?.addEventListener('mousemove', () => {
86
+ if (this.#node) {
87
+ this.#node.highlight();
88
+ }
89
+ });
90
+ nodeDescriptionElement?.addEventListener('mouseleave', () => {
91
+ if (this.#node && this.#backendNodeId) {
92
+ const msg = JSON.stringify({
93
+ id: 9999,
94
+ method: 'Overlay.setShowInspectedElementAnchor',
95
+ params: {inspectedElementAnchorConfig: {backendNodeId: this.#backendNodeId}}
96
+ });
97
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.sendMessageToBackend(msg);
98
+ }
99
+ });
100
+
101
+ this.#textField?.addEventListener('keydown', event => {
102
+ if (event.key === 'Enter' && this.#node) {
103
+ void this.runConversation();
104
+ }
105
+ });
106
+
107
+ this.#textField?.focus();
108
+ }
109
+
110
+ #broadcastFullState(): void {
111
+ const state = {
112
+ type: 'full-state',
113
+ messages: this.#getMessages(),
114
+ sessionId: this.#backendNodeId,
115
+ nodeDescription: document.querySelector('.green-dev-floaty-dialog-node-description')?.textContent
116
+ };
117
+ this.#syncChannel.postMessage(state);
118
+ }
119
+
120
+ #onSyncMessage(data: SyncMessage): void {
121
+ if (data.type === 'main-window-alive') {
122
+ if (pendingActivationSessionId) {
123
+ const syncChannel = new BroadcastChannel('green-dev-sync');
124
+ syncChannel.postMessage({type: 'activate-panel', sessionId: pendingActivationSessionId});
125
+ syncChannel.close();
126
+ }
127
+ } else if (data.type === 'request-session-state') {
128
+ this.#broadcastFullState();
129
+
130
+ if (pendingActivationSessionId) {
131
+ this.#syncChannel.postMessage({type: 'select-tab', sessionId: pendingActivationSessionId});
132
+ pendingActivationSessionId = null;
133
+ }
134
+ } else if (data.type === 'user-input' && data.sessionId === this.#backendNodeId) {
135
+ if (this.#textField) {
136
+ this.#textField.value = data.text ?? '';
137
+ void this.runConversation();
138
+ }
139
+ } else if (data.type === 'restore-floaty' && data.sessionId === this.#backendNodeId) {
140
+ // The main DevTools window will bring the floaty to the front,
141
+ // so the floaty window itself doesn't need to do it.
142
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.bringToFront();
143
+ }
144
+ }
145
+
146
+ static instance(opts: {
147
+ forceNew: boolean|null,
148
+ document: Document,
149
+ } = {forceNew: null, document}): GreenDevFloaty {
150
+ const {forceNew, document} = opts;
151
+ if (!greenDevFloatyInstance || forceNew) {
152
+ greenDevFloatyInstance = new GreenDevFloaty(document);
153
+ }
154
+ return greenDevFloatyInstance;
155
+ }
156
+
157
+ handlePanelRequest = (event: Common.EventTarget.EventTargetEvent<number>): void => {
158
+ pendingActivationSessionId = event.data;
159
+ this.#sendActivatePanelMessage(pendingActivationSessionId, 0);
160
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.openInNewTab(
161
+ 'magic:open-devtools' as Platform.DevToolsPath.UrlString);
162
+ };
163
+
164
+ readonly #maxActivationRetries = 10;
165
+ readonly #activationRetryDelayMs = 200;
166
+
167
+ #sendActivatePanelMessage(sessionId: number, retryCount: number): void {
168
+ if (retryCount >= this.#maxActivationRetries) {
169
+ return;
170
+ }
171
+
172
+ const syncChannel = new BroadcastChannel('green-dev-sync');
173
+ syncChannel.postMessage({type: 'activate-panel', sessionId});
174
+ syncChannel.close();
175
+
176
+ // To ensure the activate-panel is always received, let's add a small delay and retry.
177
+ // This is a pragmatic fix for the prototype given the existing async message flow.
178
+ setTimeout(() => {
179
+ // Check if pendingActivationSessionId is still set. If it is, it means
180
+ // the panel hasn't been activated yet (or the confirmation message
181
+ // hasn't arrived), so we retry.
182
+ if (pendingActivationSessionId === sessionId) {
183
+ this.#sendActivatePanelMessage(sessionId, retryCount + 1);
184
+ }
185
+ }, this.#activationRetryDelayMs);
186
+ }
187
+
188
+ handleRestoreEvent(event: Common.EventTarget.EventTargetEvent<number>): void {
189
+ const sessionId = event.data;
190
+ // Only the main DevTools window (which is NOT a floaty window) should broadcast the restore request.
191
+ if (!this.#isFloatyWindow) {
192
+ this.#syncChannel.postMessage({type: 'restore-floaty', sessionId});
193
+ } else if (this.#backendNodeId === sessionId) {
194
+ // If a floaty window receives a restore request for its own session,
195
+ // it should bring itself to the front.
196
+ console.error('[GreenDev] Calling bringToFront for session ' + sessionId);
197
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.bringToFront();
198
+ }
199
+ }
200
+
201
+ setNode(node: SDK.DOMModel.DOMNode): void {
202
+ if (this.#node) {
203
+ this.#node.domModel().overlayModel().removeEventListener(
204
+ SDK.OverlayModel.Events.INSPECT_PANEL_SHOW_REQUESTED, this.handlePanelRequest);
205
+ }
206
+ if (this.#node === node) {
207
+ return;
208
+ }
209
+ this.#node = node;
210
+ this.#node.domModel().overlayModel().addEventListener(
211
+ SDK.OverlayModel.Events.INSPECT_PANEL_SHOW_REQUESTED, this.handlePanelRequest);
212
+ this.#backendNodeId = node.backendNodeId();
213
+
214
+ void node.domModel().overlayModel().clearHighlight();
215
+ this.#textField?.focus();
216
+ this.#agent = undefined;
217
+ this.#nodeContext = undefined;
218
+
219
+ const nodeDescriptionElement = document.querySelector('.green-dev-floaty-dialog-node-description');
220
+ let description = '';
221
+ if (nodeDescriptionElement) {
222
+ const id = node.getAttribute('id');
223
+ if (id) {
224
+ description = `#${id}`;
225
+ } else {
226
+ const classes = node.classNames().join('.');
227
+ description = node.nodeName().toLowerCase() + (classes ? `.${classes}` : '');
228
+ }
229
+ nodeDescriptionElement.textContent = description;
230
+ }
231
+
232
+ this.#syncChannel.postMessage({type: 'node-changed', sessionId: this.#backendNodeId, nodeDescription: description});
233
+
234
+ if (this.#backendNodeId) {
235
+ const msg = JSON.stringify({
236
+ id: 9999,
237
+ method: 'Overlay.setShowInspectedElementAnchor',
238
+ params: {inspectedElementAnchorConfig: {backendNodeId: this.#backendNodeId}}
239
+ });
240
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.sendMessageToBackend(msg);
241
+ }
242
+ }
243
+
244
+ #getMessages(): Array<{text: string, isUser: boolean}> {
245
+ const messages = [];
246
+ if (this.#chatContainer) {
247
+ const messageElements = this.#chatContainer.querySelectorAll('.message');
248
+ for (const el of messageElements) {
249
+ const isUser = el.classList.contains('user-message');
250
+ const content = el.querySelector('.message-content')?.textContent || '';
251
+ messages.push({text: content, isUser});
252
+ }
253
+ }
254
+ return messages;
255
+ }
256
+
257
+ runConversation = async(): Promise<void> => {
258
+ if (!this.#textField || !this.#node) {
259
+ return;
260
+ }
261
+ const query = this.#textField.value || this.#textField.placeholder;
262
+ this.#textField.value = '';
263
+
264
+ if (!this.#agent) {
265
+ const aidaClient = new AidaClient();
266
+ this.#agent = new AiAssistance.StylingAgent.StylingAgent({aidaClient});
267
+ this.#nodeContext = new AiAssistance.StylingAgent.NodeContext(this.#node);
268
+ }
269
+
270
+ this.#addMessageInternal(query, true);
271
+ this.#syncChannel.postMessage({
272
+ type: 'new-message',
273
+ text: query,
274
+ isUser: true,
275
+ sessionId: this.#backendNodeId,
276
+ nodeDescription: document.querySelector('.green-dev-floaty-dialog-node-description')?.textContent,
277
+ });
278
+
279
+ const {content: aiContent} = this.#addMessageInternal('Thinking...', false);
280
+ this.#syncChannel.postMessage({
281
+ type: 'new-message',
282
+ text: 'Thinking...',
283
+ isUser: false,
284
+ sessionId: this.#backendNodeId,
285
+ nodeDescription: document.querySelector('.green-dev-floaty-dialog-node-description')?.textContent,
286
+ });
287
+
288
+ try {
289
+ if (!this.#nodeContext) {
290
+ throw new Error('Node context not found.');
291
+ }
292
+ for await (const result of this.#agent.run(query, {selected: this.#nodeContext})) {
293
+ switch (result.type) {
294
+ case ResponseType.ANSWER:
295
+ aiContent.textContent = result.text;
296
+ this.#syncChannel.postMessage(
297
+ {type: 'update-last-message', text: result.text, sessionId: this.#backendNodeId});
298
+ break;
299
+ case ResponseType.ERROR:
300
+ aiContent.textContent = `Error: ${result.error}`;
301
+ this.#syncChannel.postMessage(
302
+ {type: 'update-last-message', text: `Error: ${result.error}`, sessionId: this.#backendNodeId});
303
+ break;
304
+ case ResponseType.SIDE_EFFECT:
305
+ result.confirm(true);
306
+ break;
307
+ default:
308
+ break;
309
+ }
310
+ if (this.#chatContainer) {
311
+ this.#chatContainer.scrollTop = this.#chatContainer.scrollHeight;
312
+ }
313
+ }
314
+ } catch (e) {
315
+ aiContent.textContent = `Exception: ${e instanceof Error ? e.message : String(e)}`;
316
+ }
317
+ };
318
+
319
+ #addMessageInternal(text: string, isUser: boolean): {content: HTMLDivElement, details?: HTMLDivElement} {
320
+ const messageElement = document.createElement('div');
321
+ messageElement.className = `message ${isUser ? 'user-message' : 'ai-message'}`;
322
+
323
+ const content = document.createElement('div');
324
+ content.className = 'message-content';
325
+ content.textContent = text;
326
+ messageElement.appendChild(content);
327
+
328
+ let details: HTMLDivElement|undefined;
329
+ if (!isUser) {
330
+ details = document.createElement('div');
331
+ details.className = 'message-details';
332
+ details.style.display = 'none';
333
+ messageElement.appendChild(details);
334
+
335
+ const toggle = document.createElement('div');
336
+ toggle.className = 'message-details-toggle';
337
+ toggle.textContent = 'Show details';
338
+ toggle.onclick = () => {
339
+ if (details) {
340
+ const isHidden = details.style.display === 'none';
341
+ details.style.display = isHidden ? 'block' : 'none';
342
+ toggle.textContent = isHidden ? 'Hide details' : 'Show details';
343
+ }
344
+ };
345
+ messageElement.appendChild(toggle);
346
+ }
347
+ if (this.#chatContainer) {
348
+ this.#chatContainer.appendChild(messageElement);
349
+ this.#chatContainer.scrollTop = this.#chatContainer.scrollHeight;
350
+ }
351
+ return {content, details};
352
+ }
353
+ }
354
+
355
+ let greenDevFloatyInstance: GreenDevFloaty;
356
+
357
+ function safeRegisterExperiment(name: string, title: string): void {
358
+ try {
359
+ Root.Runtime.experiments.register(name as ExperimentNames.ExperimentName, title);
360
+ } catch (e) {
361
+ console.error('Unable to register experiment ', name, title, e);
362
+ }
363
+ }
364
+
365
+ async function init(): Promise<void> {
366
+ try {
367
+ Root.Runtime.Runtime.setPlatform(Host.Platform.platform());
368
+ const [config, prefs] = await Promise.all([
369
+ new Promise<Root.Runtime.HostConfig>(
370
+ resolve => Host.InspectorFrontendHost.InspectorFrontendHostInstance.getHostConfig(resolve)),
371
+ new Promise<Record<string, string>>(
372
+ resolve => Host.InspectorFrontendHost.InspectorFrontendHostInstance.getPreferences(resolve)),
373
+ ]);
374
+ Object.assign(Root.Runtime.hostConfig, config);
375
+
376
+ safeRegisterExperiment(
377
+ Root.ExperimentNames.ExperimentName.CAPTURE_NODE_CREATION_STACKS, 'Capture node creation stacks');
378
+ safeRegisterExperiment(
379
+ Root.ExperimentNames.ExperimentName.INSTRUMENTATION_BREAKPOINTS, 'Enable instrumentation breakpoints');
380
+ safeRegisterExperiment(
381
+ Root.ExperimentNames.ExperimentName.USE_SOURCE_MAP_SCOPES, 'Use scope information from source maps');
382
+ safeRegisterExperiment(Root.ExperimentNames.ExperimentName.LIVE_HEAP_PROFILE, 'Live heap profile');
383
+ safeRegisterExperiment(Root.ExperimentNames.ExperimentName.PROTOCOL_MONITOR, 'Protocol Monitor');
384
+ safeRegisterExperiment(
385
+ Root.ExperimentNames.ExperimentName.SAMPLING_HEAP_PROFILER_TIMELINE, 'Sampling heap profiler timeline');
386
+ safeRegisterExperiment(Root.ExperimentNames.ExperimentName.APCA, 'APCA');
387
+
388
+ const hostUnsyncedStorage: Common.Settings.SettingsBackingStore = {
389
+ register: (name: string) =>
390
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.registerPreference(name, {synced: false}),
391
+ set: Host.InspectorFrontendHost.InspectorFrontendHostInstance.setPreference,
392
+ get: (name: string) =>
393
+ new Promise(resolve => Host.InspectorFrontendHost.InspectorFrontendHostInstance.getPreference(name, resolve)),
394
+ remove: Host.InspectorFrontendHost.InspectorFrontendHostInstance.removePreference,
395
+ clear: Host.InspectorFrontendHost.InspectorFrontendHostInstance.clearPreferences,
396
+ };
397
+ const syncedStorage = new Common.Settings.SettingsStorage(prefs, hostUnsyncedStorage, '');
398
+ const globalStorage = new Common.Settings.SettingsStorage(prefs, hostUnsyncedStorage, '');
399
+ const localStorage = new Common.Settings.SettingsStorage(
400
+ window.localStorage, {
401
+ register(_setting: string): void{},
402
+ async get(setting: string): Promise<string> {
403
+ return window.localStorage.getItem(setting) as unknown as string;
404
+ },
405
+ set(setting: string, value: string): void {
406
+ window.localStorage.setItem(setting, value);
407
+ },
408
+ remove(setting: string): void {
409
+ window.localStorage.removeItem(setting);
410
+ },
411
+ clear: () => window.localStorage.clear(),
412
+ },
413
+ '');
414
+
415
+ Common.Settings.Settings.instance({
416
+ forceNew: true,
417
+ syncedStorage,
418
+ globalStorage,
419
+ localStorage,
420
+ settingRegistrations: Common.SettingRegistration.getRegisteredSettings(),
421
+ });
422
+
423
+ UI.UIUtils.initializeUIUtils(document);
424
+ ThemeSupport.ThemeSupport.instance({
425
+ forceNew: true,
426
+ setting: Common.Settings.Settings.instance().moduleSetting('ui-theme'),
427
+ });
428
+ UI.ZoomManager.ZoomManager.instance(
429
+ {forceNew: true, win: window, frontendHost: Host.InspectorFrontendHost.InspectorFrontendHostInstance});
430
+
431
+ const settingLanguage = Common.Settings.Settings.instance().moduleSetting<string>('language').get();
432
+ i18n.DevToolsLocale.DevToolsLocale.instance({
433
+ create: true,
434
+ data: {
435
+ navigatorLanguage: navigator.language,
436
+ settingLanguage,
437
+ lookupClosestDevToolsLocale: i18n.i18n.lookupClosestSupportedDevToolsLocale,
438
+ },
439
+ });
440
+
441
+ const universe = new Foundation.Universe.Universe({
442
+ settingsCreationOptions: {
443
+ syncedStorage,
444
+ globalStorage,
445
+ localStorage,
446
+ settingRegistrations: Common.SettingRegistration.getRegisteredSettings(),
447
+ }
448
+ });
449
+ Root.DevToolsContext.setGlobalInstance(universe.context);
450
+
451
+ await i18n.i18n.fetchAndRegisterLocaleData('en-US');
452
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.connectionReady();
453
+
454
+ const hash = window.location.hash.substring(1);
455
+ const params = new URLSearchParams(hash);
456
+ const backendNodeId = parseInt(params.get('backendNodeId') || '0', 10);
457
+
458
+ const floaty = GreenDevFloaty.instance({forceNew: null, document});
459
+
460
+ if (backendNodeId) {
461
+ await SDK.Connections.initMainConnection(async () => {
462
+ const targetManager = SDK.TargetManager.TargetManager.instance();
463
+ targetManager.createTarget('main', 'Main', SDK.Target.Type.FRAME, null);
464
+ const mainTarget = await new Promise<SDK.Target.Target|null>(resolve => {
465
+ const t = targetManager.primaryPageTarget();
466
+ if (t) {
467
+ resolve(t);
468
+ return;
469
+ }
470
+ const observer = {
471
+ targetAdded: (target: SDK.Target.Target) => {
472
+ if (target === targetManager.primaryPageTarget()) {
473
+ targetManager.unobserveTargets(observer);
474
+ resolve(target);
475
+ }
476
+ },
477
+ targetRemoved: () => {},
478
+ };
479
+ targetManager.observeTargets(observer);
480
+ });
481
+ if (!mainTarget) {
482
+ return;
483
+ }
484
+ const domModel = mainTarget.model(SDK.DOMModel.DOMModel);
485
+ if (!domModel) {
486
+ return;
487
+ }
488
+
489
+ // Add listener for floaty restore events
490
+ const overlayModel = mainTarget.model(SDK.OverlayModel.OverlayModel);
491
+ if (overlayModel) {
492
+ overlayModel.addEventListener(
493
+ SDK.OverlayModel.Events.INSPECTED_ELEMENT_WINDOW_RESTORED, floaty.handleRestoreEvent, floaty);
494
+ }
495
+
496
+ const nodesMap =
497
+ await domModel.pushNodesByBackendIdsToFrontend(new Set([backendNodeId as Protocol.DOM.BackendNodeId]));
498
+ const node = nodesMap?.get(backendNodeId as Protocol.DOM.BackendNodeId) || null;
499
+ if (node) {
500
+ floaty.setNode(node);
501
+ }
502
+ }, () => {});
503
+ } else {
504
+ const targetManager = SDK.TargetManager.TargetManager.instance();
505
+ const observer = {
506
+ targetAdded: (target: SDK.Target.Target) => {
507
+ if (target.type() === SDK.Target.Type.FRAME) {
508
+ const overlayModel = target.model(SDK.OverlayModel.OverlayModel);
509
+ if (overlayModel) {
510
+ overlayModel.addEventListener(
511
+ SDK.OverlayModel.Events.INSPECTED_ELEMENT_WINDOW_RESTORED, floaty.handleRestoreEvent, floaty);
512
+ overlayModel.addEventListener(
513
+ SDK.OverlayModel.Events.INSPECT_PANEL_SHOW_REQUESTED, floaty.handlePanelRequest);
514
+ }
515
+ }
516
+ },
517
+ targetRemoved: (target: SDK.Target.Target) => {
518
+ if (target.type() === SDK.Target.Type.FRAME) {
519
+ const overlayModel = target.model(SDK.OverlayModel.OverlayModel);
520
+ if (overlayModel) {
521
+ overlayModel.removeEventListener(
522
+ SDK.OverlayModel.Events.INSPECTED_ELEMENT_WINDOW_RESTORED, floaty.handleRestoreEvent, floaty);
523
+ overlayModel.removeEventListener(
524
+ SDK.OverlayModel.Events.INSPECT_PANEL_SHOW_REQUESTED, floaty.handlePanelRequest);
525
+ }
526
+ }
527
+ },
528
+ };
529
+ targetManager.observeTargets(observer);
530
+ }
531
+ } catch (err) {
532
+ console.error('[GreenDev] FATAL ERROR during init():', err);
533
+ }
534
+ }
535
+
536
+ void init();