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,337 @@
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 type * as Common from '../../core/common/common.js';
7
+ import * as Host from '../../core/host/host.js';
8
+ import type * as Platform from '../../core/platform/platform.js';
9
+ import * as SDK from '../../core/sdk/sdk.js';
10
+ import type * as Protocol from '../../generated/protocol.js';
11
+ import * as UI from '../../ui/legacy/legacy.js';
12
+
13
+ import greenDevPanelStyles from './GreenDevPanel.css.js';
14
+ import type {SyncMessage} from './GreenDevShared.js';
15
+
16
+ let greenDevPanelInstance: GreenDevPanel;
17
+
18
+ export class GreenDevPanel extends UI.Panel.Panel {
19
+ #tabbedPane: UI.TabbedPane.TabbedPane;
20
+ #sessions = new Map<
21
+ string,
22
+ {view: UI.Widget.Widget, container: HTMLDivElement, description: HTMLDivElement, node?: SDK.DOMModel.DOMNode}>();
23
+ #syncChannel: BroadcastChannel;
24
+
25
+ private constructor() {
26
+ super('greendev');
27
+ this.contentElement.style.display = 'flex';
28
+ this.contentElement.style.flexDirection = 'column';
29
+ this.contentElement.style.height = '100%';
30
+ this.contentElement.style.overflow = 'hidden';
31
+
32
+ this.#tabbedPane = new UI.TabbedPane.TabbedPane();
33
+ this.#tabbedPane.element.style.flex = '1';
34
+ this.#tabbedPane.show(this.contentElement);
35
+
36
+ // Welcome Tab
37
+ this.#createWelcomeTab();
38
+
39
+ this.#tabbedPane.addEventListener(UI.TabbedPane.Events.TabClosed, this.#onTabClosed, this);
40
+
41
+ this.#syncChannel = new BroadcastChannel('green-dev-sync');
42
+ this.#syncChannel.onmessage = event => {
43
+ void this.#handlePanelMessage(event.data as SyncMessage);
44
+ };
45
+
46
+ // Request state from active floaties
47
+ this.#syncChannel.postMessage({type: 'request-session-state'});
48
+ }
49
+
50
+ override wasShown(): void {
51
+ super.wasShown();
52
+ this.registerRequiredCSS(greenDevPanelStyles);
53
+ SDK.OverlayModel.OverlayModel.setInspectNodeHandler(this.#handleInspectNode.bind(this));
54
+ }
55
+
56
+ override willHide(): void {
57
+ super.willHide();
58
+ SDK.OverlayModel.OverlayModel.setInspectNodeHandler(async () => {});
59
+ }
60
+
61
+ async #handleInspectNode(_node: SDK.DOMModel.DOMNode): Promise<void> {
62
+ // Suppress reveal in Elements panel by doing nothing here.
63
+ // The Floaty will handle its own opening and broadcasting.
64
+ }
65
+
66
+ #onTabClosed(event: Common.EventTarget.EventTargetEvent<UI.TabbedPane.EventData>): void {
67
+ const tabId = event.data.tabId;
68
+ if (tabId === 'welcome') {
69
+ return;
70
+ }
71
+ this.#sessions.delete(tabId);
72
+ if (this.#sessions.size === 0) {
73
+ if (!this.#tabbedPane.hasTab('welcome')) {
74
+ this.#createWelcomeTab();
75
+ }
76
+ }
77
+ }
78
+
79
+ #createWelcomeTab(): void {
80
+ const welcomeWidget = new UI.Widget.Widget();
81
+ welcomeWidget.element.style.display = 'flex';
82
+ welcomeWidget.element.style.alignItems = 'center';
83
+ welcomeWidget.element.style.justifyContent = 'center';
84
+ welcomeWidget.element.style.height = '100%';
85
+ const welcomeContent = document.createElement('div');
86
+ welcomeContent.textContent = 'Interact with GreenDev Floaty dialogs to see conversations here.';
87
+ welcomeContent.style.padding = '20px';
88
+ welcomeContent.style.fontSize = '14px';
89
+ welcomeContent.style.color = 'var(--sys-color-on-surface-subtle)';
90
+ welcomeWidget.contentElement.appendChild(welcomeContent);
91
+ this.#tabbedPane.appendTab('welcome', 'Welcome', welcomeWidget);
92
+ this.#tabbedPane.selectTab('welcome');
93
+ }
94
+
95
+ closeSession(sessionId: string): void {
96
+ this.#tabbedPane.closeTab(sessionId);
97
+ }
98
+
99
+ async #handlePanelMessage(data: SyncMessage): Promise<void> {
100
+ const sessionId = String(data.sessionId);
101
+ if (!sessionId || sessionId === '0' || sessionId === 'undefined') {
102
+ return;
103
+ }
104
+
105
+ let session = this.#sessions.get(sessionId);
106
+ if (!session) {
107
+ // If we are adding a new tab, check if we need to remove the welcome tab
108
+ if (this.#tabbedPane.hasTab('welcome')) {
109
+ this.#tabbedPane.closeTab('welcome');
110
+ }
111
+
112
+ const widget = new UI.Widget.Widget();
113
+ widget.contentElement.className = 'green-dev-floaty-dialog';
114
+ widget.contentElement.style.display = 'flex';
115
+ widget.contentElement.style.flexDirection = 'column';
116
+ widget.contentElement.style.height = '100%';
117
+ widget.contentElement.style.padding = '0';
118
+
119
+ const content = document.createElement('div');
120
+ content.className = 'green-dev-floaty-dialog-content';
121
+ content.style.flexGrow = '1';
122
+ content.style.display = 'flex';
123
+ content.style.flexDirection = 'column';
124
+ content.style.overflow = 'hidden';
125
+
126
+ // Top row: Context added
127
+ const topRow = document.createElement('div');
128
+ topRow.className = 'green-dev-floaty-dialog-top-row';
129
+ topRow.style.flexShrink = '0';
130
+ const geminiIcon = document.createElement('div');
131
+ geminiIcon.className = 'green-dev-floaty-dialog-gemini-icon';
132
+ const checkmarkIcon = document.createElement('div');
133
+ checkmarkIcon.className = 'green-dev-floaty-dialog-checkmark-icon';
134
+ const contextText = document.createElement('span');
135
+ contextText.className = 'green-dev-floaty-dialog-context-text';
136
+ contextText.textContent = 'Context added';
137
+ topRow.appendChild(geminiIcon);
138
+ topRow.appendChild(checkmarkIcon);
139
+ topRow.appendChild(contextText);
140
+ content.appendChild(topRow);
141
+
142
+ const chatContainer = document.createElement('div');
143
+ chatContainer.className = 'green-dev-floaty-dialog-chat-container';
144
+ chatContainer.style.flexGrow = '1';
145
+ chatContainer.style.overflowY = 'auto';
146
+ content.appendChild(chatContainer);
147
+
148
+ const blueCard = document.createElement('div');
149
+ blueCard.className = 'green-dev-floaty-dialog-blue-card';
150
+ blueCard.style.flexShrink = '0';
151
+
152
+ const desc = document.createElement('div');
153
+ desc.className = 'green-dev-floaty-dialog-node-description';
154
+ desc.style.whiteSpace = 'normal';
155
+ desc.style.overflow = 'auto';
156
+ blueCard.appendChild(desc);
157
+
158
+ const inputRow = document.createElement('div');
159
+ inputRow.className = 'input-row';
160
+
161
+ const input = document.createElement('input');
162
+ input.type = 'text';
163
+ input.className = 'green-dev-floaty-dialog-text-field';
164
+ input.placeholder = 'Ask a question...';
165
+
166
+ const button = document.createElement('button');
167
+ button.className = 'green-dev-floaty-dialog-play-button';
168
+
169
+ const sendAction = (): void => {
170
+ const text = input.value;
171
+ if (text) {
172
+ input.value = '';
173
+ // Do not append locally; wait for broadcast from floaty
174
+ this.#syncChannel.postMessage({type: 'user-input', sessionId: parseInt(sessionId, 10), text});
175
+ }
176
+ };
177
+
178
+ button.addEventListener('click', sendAction);
179
+ input.addEventListener('keydown', e => {
180
+ if (e.key === 'Enter') {
181
+ sendAction();
182
+ }
183
+ });
184
+
185
+ inputRow.appendChild(input);
186
+ inputRow.appendChild(button);
187
+ blueCard.appendChild(inputRow);
188
+
189
+ const disclaimer = document.createElement('div');
190
+ disclaimer.className = 'green-dev-floaty-disclaimer';
191
+
192
+ const link = document.createElement('span');
193
+ link.className = 'disclaimer-link';
194
+ link.textContent = 'Relevant data';
195
+ disclaimer.appendChild(link);
196
+
197
+ disclaimer.appendChild(document.createTextNode(' is sent to Google'));
198
+
199
+ const tooltip = document.createElement('div');
200
+ tooltip.className = 'disclaimer-tooltip';
201
+
202
+ tooltip.appendChild(document.createTextNode(
203
+ 'Chat messages and any data the inspected page can access via Web APIs are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won\'t always get it right.'));
204
+ tooltip.appendChild(document.createElement('br'));
205
+ tooltip.appendChild(document.createElement('br'));
206
+
207
+ const learnMore = document.createElement('a');
208
+ const href = 'https://developer.chrome.com/docs/devtools/ai-assistance' as Platform.DevToolsPath.UrlString;
209
+ learnMore.href = href;
210
+ learnMore.className = 'learn-more-link';
211
+ learnMore.textContent = 'Learn about AI in DevTools';
212
+ learnMore.addEventListener('click', event => {
213
+ event.preventDefault();
214
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.openInNewTab(href);
215
+ });
216
+ tooltip.appendChild(learnMore);
217
+
218
+ disclaimer.appendChild(tooltip);
219
+ blueCard.appendChild(disclaimer);
220
+
221
+ content.appendChild(blueCard);
222
+ widget.contentElement.appendChild(content);
223
+
224
+ this.#sessions.set(sessionId, {view: widget, container: chatContainer, description: desc});
225
+ session = {view: widget, container: chatContainer, description: desc};
226
+
227
+ const title = data.nodeDescription || `Node ${sessionId}`;
228
+ this.#tabbedPane.appendTab(sessionId, title, widget, undefined, undefined, true);
229
+ this.#tabbedPane.selectTab(sessionId);
230
+ }
231
+
232
+ if (!session.node && (data.type === 'full-state' || data.type === 'node-changed' || !session)) {
233
+ const backendNodeId = parseInt(sessionId, 10);
234
+ const targetManager = SDK.TargetManager.TargetManager.instance();
235
+ let mainTarget = targetManager.primaryPageTarget();
236
+
237
+ const fetchNode = async(target: SDK.Target.Target): Promise<void> => {
238
+ const domModel = target.model(SDK.DOMModel.DOMModel);
239
+ if (domModel) {
240
+ const nodesMap = await domModel.pushNodesByBackendIdsToFrontend(
241
+ new Set([backendNodeId]) as Set<Protocol.DOM.BackendNodeId>);
242
+ const node = nodesMap?.get(backendNodeId as Protocol.DOM.BackendNodeId) || null;
243
+ if (node && session) {
244
+ session.node = node;
245
+ this.#addHighlightListeners(session.description, node);
246
+ }
247
+ }
248
+ };
249
+
250
+ if (mainTarget) {
251
+ await fetchNode(mainTarget);
252
+ } else {
253
+ targetManager.observeTargets({
254
+ targetAdded: async(target: SDK.Target.Target): Promise<void> => {
255
+ if (target === targetManager.primaryPageTarget()) {
256
+ mainTarget = target;
257
+ await fetchNode(mainTarget);
258
+ }
259
+ },
260
+ targetRemoved: (_: SDK.Target.Target): void => {},
261
+ });
262
+ }
263
+ }
264
+
265
+ if (data.type === 'new-message' && data.text) {
266
+ this.#appendMessageToContainer(session.container, data.text, data.isUser ?? false);
267
+ } else if (data.type === 'update-last-message') {
268
+ const lastMsg = session.container.lastElementChild?.querySelector('.message-content');
269
+ if (lastMsg) {
270
+ lastMsg.textContent = data.text ?? null;
271
+ }
272
+ } else if (data.type === 'full-state') {
273
+ session.container.innerHTML = '';
274
+ if (data.messages) {
275
+ for (const msg of data.messages) {
276
+ this.#appendMessageToContainer(session.container, msg.text, msg.isUser);
277
+ }
278
+ }
279
+ } else if (data.type === 'select-tab') {
280
+ this.#tabbedPane.selectTab(sessionId);
281
+ }
282
+
283
+ if (data.nodeDescription) {
284
+ session.description.textContent = data.nodeDescription;
285
+ if (data.type === 'node-changed') {
286
+ this.#tabbedPane.changeTabTitle(sessionId, data.nodeDescription);
287
+ }
288
+ }
289
+ }
290
+
291
+ #addHighlightListeners(element: HTMLElement, node: SDK.DOMModel.DOMNode): void {
292
+ element.addEventListener('mousemove', () => {
293
+ node.highlight();
294
+ });
295
+ element.addEventListener('mouseleave', () => {
296
+ void node.domModel().overlayModel().clearHighlight();
297
+ });
298
+ }
299
+
300
+ #appendMessageToContainer(container: HTMLDivElement, text: string, isUser: boolean): void {
301
+ const messageElement = document.createElement('div');
302
+ messageElement.className = `message ${isUser ? 'user-message' : 'ai-message'}`;
303
+ messageElement.style.display = 'flex';
304
+ messageElement.style.flexDirection = 'column';
305
+ messageElement.style.flexShrink = '0';
306
+
307
+ const content = document.createElement('div');
308
+ content.className = 'message-content';
309
+ content.textContent = text;
310
+ content.style.flexGrow = '1';
311
+ messageElement.appendChild(content);
312
+
313
+ container.appendChild(messageElement);
314
+ container.scrollTop = container.scrollHeight;
315
+ }
316
+
317
+ static instance(opts: {
318
+ forceNew: boolean|null,
319
+ } = {forceNew: null}): GreenDevPanel {
320
+ const {forceNew} = opts;
321
+ if (!greenDevPanelInstance || forceNew) {
322
+ greenDevPanelInstance = new GreenDevPanel();
323
+ }
324
+
325
+ return greenDevPanelInstance;
326
+ }
327
+ }
328
+
329
+ // Expose global method for browser process to call
330
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
331
+ (window as any).GreenDevPanel = {
332
+ closeSession: (sessionId: number): void => {
333
+ if (greenDevPanelInstance) {
334
+ greenDevPanelInstance.closeSession(String(sessionId));
335
+ }
336
+ },
337
+ };
@@ -0,0 +1,13 @@
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
+
5
+ export interface SyncMessage {
6
+ type: 'main-window-alive'|'request-session-state'|'user-input'|'restore-floaty'|'full-state'|'activate-panel'|
7
+ 'select-tab'|'node-changed'|'new-message'|'update-last-message';
8
+ sessionId?: number;
9
+ text?: string;
10
+ isUser?: boolean;
11
+ nodeDescription?: string|null;
12
+ messages?: Array<{text: string, isUser: boolean}>;
13
+ }
@@ -0,0 +1,52 @@
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
+
5
+ import * as i18n from '../../core/i18n/i18n.js';
6
+ import * as UI from '../../ui/legacy/legacy.js';
7
+
8
+ import type * as GreenDev from './greendev.js';
9
+
10
+ let loadedGreenDevModule: (typeof GreenDev|undefined);
11
+
12
+ async function loadGreenDevModule(): Promise<typeof GreenDev> {
13
+ if (!loadedGreenDevModule) {
14
+ loadedGreenDevModule = await import('./greendev.js');
15
+ }
16
+ return loadedGreenDevModule;
17
+ }
18
+
19
+ UI.ViewManager.registerViewExtension({
20
+ location: UI.ViewManager.ViewLocationValues.PANEL,
21
+ id: 'greendev',
22
+ title: i18n.i18n.lockedLazyString('GreenDev'),
23
+ commandPrompt: i18n.i18n.lockedLazyString('Show GreenDev'),
24
+ persistence: UI.ViewManager.ViewPersistence.CLOSEABLE,
25
+ order: 100,
26
+ async loadView() {
27
+ const GreenDev = await loadGreenDevModule();
28
+ return GreenDev.GreenDevPanel.GreenDevPanel.instance();
29
+ },
30
+ condition: config => {
31
+ return Boolean(config?.devToolsGreenDevUi?.enabled);
32
+ },
33
+ });
34
+
35
+ const syncChannel = new BroadcastChannel('green-dev-sync');
36
+
37
+ syncChannel.postMessage({type: 'main-window-alive'});
38
+
39
+ syncChannel.onmessage = event => {
40
+ if (event.data.type === 'activate-panel') {
41
+ console.error('[GreenDev] Meta: Received activate-panel broadcast');
42
+
43
+ void UI.ViewManager.ViewManager.instance().showView('greendev').then(() => {
44
+ console.error('[GreenDev] Meta: View shown, broadcasting select-tab');
45
+
46
+ const replyChannel = new BroadcastChannel('green-dev-sync');
47
+ replyChannel.postMessage({type: 'select-tab', sessionId: event.data.sessionId});
48
+
49
+ replyChannel.close();
50
+ });
51
+ }
52
+ };
@@ -0,0 +1,9 @@
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
+
5
+ import * as GreenDevPanel from './GreenDevPanel.js';
6
+
7
+ export {
8
+ GreenDevPanel,
9
+ };
@@ -176,7 +176,7 @@ export class CorsIssueDetailsView extends AffectedResourcesView {
176
176
  this.appendColumnTitle(header, i18nString(UIStrings.preflightRequestIfProblematic));
177
177
  this.appendColumnTitle(header, i18nString(UIStrings.allowCredentialsValueFromHeader));
178
178
  break;
179
- case IssuesManager.CorsIssue.IssueCode.INSECURE_PRIVATE_NETWORK:
179
+ case IssuesManager.CorsIssue.IssueCode.INSECURE_LOCAL_NETWORK:
180
180
  this.appendColumnTitle(header, i18nString(UIStrings.resourceAddressSpace));
181
181
  this.appendColumnTitle(header, i18nString(UIStrings.initiatorAddressSpace));
182
182
  this.appendColumnTitle(header, i18nString(UIStrings.initiatorContext));
@@ -207,7 +207,7 @@ export class CorsIssueDetailsView extends AffectedResourcesView {
207
207
  default:
208
208
  Platform.assertUnhandled<IssuesManager.CorsIssue.IssueCode.PREFLIGHT_MISSING_ALLOW_EXTERNAL|
209
209
  IssuesManager.CorsIssue.IssueCode.PREFLIGHT_INVALID_ALLOW_EXTERNAL|
210
- IssuesManager.CorsIssue.IssueCode.INVALID_PRIVATE_NETWORK_ACCESS|
210
+ IssuesManager.CorsIssue.IssueCode.INVALID_LOCAL_NETWORK_ACCESS|
211
211
  IssuesManager.CorsIssue.IssueCode.LOCAL_NETWORK_ACCESS_PERMISSION_DENIED>(issueCode);
212
212
  }
213
213
 
@@ -362,7 +362,7 @@ export class CorsIssueDetailsView extends AffectedResourcesView {
362
362
  }
363
363
  this.appendIssueDetailCell(element, details.corsErrorStatus.failedParameter, 'code-example');
364
364
  break;
365
- case IssuesManager.CorsIssue.IssueCode.INSECURE_PRIVATE_NETWORK:
365
+ case IssuesManager.CorsIssue.IssueCode.INSECURE_LOCAL_NETWORK:
366
366
  element.appendChild(this.createRequestCell(details.request, opts));
367
367
  this.#appendStatus(element, details.isWarning);
368
368
  this.appendIssueDetailCell(element, details.resourceIPAddressSpace ?? '');
@@ -433,7 +433,7 @@ export class CorsIssueDetailsView extends AffectedResourcesView {
433
433
  this.#appendStatus(element, details.isWarning);
434
434
  Platform.assertUnhandled<IssuesManager.CorsIssue.IssueCode.PREFLIGHT_MISSING_ALLOW_EXTERNAL|
435
435
  IssuesManager.CorsIssue.IssueCode.PREFLIGHT_INVALID_ALLOW_EXTERNAL|
436
- IssuesManager.CorsIssue.IssueCode.INVALID_PRIVATE_NETWORK_ACCESS|
436
+ IssuesManager.CorsIssue.IssueCode.INVALID_LOCAL_NETWORK_ACCESS|
437
437
  IssuesManager.CorsIssue.IssueCode.LOCAL_NETWORK_ACCESS_PERMISSION_DENIED>(issueCode);
438
438
  break;
439
439
  }
@@ -197,7 +197,7 @@ export class LighthouseReportRenderer {
197
197
  continue;
198
198
  }
199
199
 
200
- auditEl.setAttribute('jslog', `${VisualLogging.item(`lighthouse.audit.${id}`).track({resize: true})}`);
200
+ auditEl.setAttribute('jslog', `${VisualLogging.item(`lighthouse.audit.${id}`)}`);
201
201
 
202
202
  let state: string|undefined;
203
203
  for (const className of auditEl.classList) {
@@ -60,7 +60,7 @@ function renderEndiannessSetting(
60
60
  data-endianness="true" @change=${(e: Event) => onEndiannessChanged((e.target as HTMLSelectElement).value as Endianness)}>
61
61
  ${[Endianness.LITTLE, Endianness.BIG].map(endianness => {
62
62
  return html`<option value=${endianness} .selected=${currentEndiannes === endianness}
63
- jslog=${VisualLogging.item(Platform.StringUtilities.toKebabCase(endianness)).track({click: true, resize: true})}>${
63
+ jslog=${VisualLogging.item(Platform.StringUtilities.toKebabCase(endianness)).track({click: true})}>${
64
64
  i18n.i18n.lockedString(endianness)}</option>`;
65
65
  })}
66
66
  </select>
@@ -104,7 +104,7 @@ export const DEFAULT_VIEW: View = (input: ViewInput, _output: undefined, target:
104
104
  ${VALUE_TYPE_MODE_LIST.filter(x => isValidMode(type, x)).map(mode => {
105
105
  return html`
106
106
  <option value=${mode} .selected=${input.valueTypeModes.get(type) === mode}
107
- jslog=${VisualLogging.item(mode).track({click: true, resize: true})}>${
107
+ jslog=${VisualLogging.item(mode).track({click: true})}>${
108
108
  i18n.i18n.lockedString(mode)}
109
109
  </option>`;
110
110
  })}
@@ -84,7 +84,7 @@ const DEFAULT_VIEW: View = (input, _output, target) => {
84
84
  @contextmenu=${(e: Event) => input.onPlayerContextMenu(player.playerID, e)}
85
85
  role="option"
86
86
  aria-selected=${isSelected}
87
- jslog=${VisualLogging.item('player').track({click: true, resize: true})}>
87
+ jslog=${VisualLogging.item('player').track({click: true})}>
88
88
  <div class="player-entry-status-icon vbox">
89
89
  <div class="player-entry-status-icon-centering">
90
90
  <devtools-icon name=${player.iconName}></devtools-icon>
@@ -410,8 +410,7 @@ export class NetworkLogViewColumns {
410
410
 
411
411
  private createWaterfallHeader(): void {
412
412
  this.waterfallHeaderElement = this.waterfallColumn.contentElement.createChild('div', 'network-waterfall-header');
413
- this.waterfallHeaderElement.setAttribute(
414
- 'jslog', `${VisualLogging.tableHeader('waterfall').track({click: true, resize: true})}`);
413
+ this.waterfallHeaderElement.setAttribute('jslog', `${VisualLogging.tableHeader('waterfall').track({click: true})}`);
415
414
  this.waterfallHeaderElement.addEventListener('click', waterfallHeaderClicked.bind(this));
416
415
  this.waterfallHeaderElement.addEventListener('contextmenu', event => {
417
416
  const contextMenu = new UI.ContextMenu.ContextMenu(event);
@@ -184,21 +184,18 @@ export class RequestInitiatorView extends UI.Widget.VBox {
184
184
  if (!initiator?.stack) {
185
185
  return null;
186
186
  }
187
+ const targetManager = SDK.TargetManager.TargetManager.instance();
187
188
  const networkManager = SDK.NetworkManager.NetworkManager.forRequest(request);
188
- const target = networkManager ? networkManager.target() : undefined;
189
+ const target = networkManager?.target() ?? targetManager.primaryPageTarget() ?? targetManager.rootTarget();
190
+ let stackTrace: StackTrace.StackTrace.StackTrace|null = null;
191
+ const preview = new Components.JSPresentationUtils.StackTracePreviewContent(
192
+ undefined, target ?? undefined, linkifier, {tabStops: focusableLink});
189
193
  if (target) {
190
- const stackTrace = await Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance()
191
- .createStackTraceFromProtocolRuntime(initiator.stack, target);
192
- const preview = new Components.JSPresentationUtils.StackTracePreviewContent(
193
- undefined, target, linkifier, {tabStops: focusableLink});
194
+ stackTrace = await Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance()
195
+ .createStackTraceFromProtocolRuntime(initiator.stack, target);
194
196
  preview.stackTrace = stackTrace;
195
- return {preview, stackTrace};
196
197
  }
197
- return {
198
- preview: new Components.JSPresentationUtils.StackTracePreviewContent(
199
- undefined, target, linkifier, {runtimeStackTrace: initiator.stack, tabStops: focusableLink}),
200
- stackTrace: null
201
- };
198
+ return {preview, stackTrace};
202
199
  }
203
200
 
204
201
  override performUpdate(): void {
@@ -576,7 +576,7 @@ export class RequestTimingView extends UI.Widget.VBox {
576
576
  calculator: this.#calculator,
577
577
  requestStartTime: this.#request.startTime,
578
578
  requestIssueTime: this.#request.issueTime(),
579
- requestUnfinished: false,
579
+ requestUnfinished: !this.#request.finished,
580
580
  fetchDetails: this.#fetchDetailsTree(),
581
581
  routerDetails: this.#routerDetailsTree(),
582
582
  wasThrottled: conditions?.urlPattern ? conditions : undefined,
@@ -59,7 +59,7 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
59
59
  ${headers.map(header => html`
60
60
  <devtools-header-section-row
61
61
  .data=${{ header }}
62
- jslog=${VisualLogging.item('request-header').track({resize: true})}
62
+ jslog=${VisualLogging.item('request-header')}
63
63
  ></devtools-header-section-row>
64
64
  `)}
65
65
  `, target);
@@ -990,7 +990,7 @@ function renderTargetSelectorRow(input: ViewInput): Lit.TemplateResult|undefined
990
990
  jslog=${VisualLogging.dropDown('target-selector').track({change: true})}
991
991
  @change=${input.onTargetSelected}>
992
992
  ${input.targets.map(target => html`
993
- <option jslog=${VisualLogging.item('target').track({click: true, resize: true})}
993
+ <option jslog=${VisualLogging.item('target').track({click: true})}
994
994
  value=${target.id()} ?selected=${target.id() === input.targetId}>
995
995
  ${target.name()} (${target.inspectedURL()})
996
996
  </option>`)}
@@ -140,7 +140,7 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
140
140
  @keydown=${(event: Event) => onKeyDown(recording.storageName, event)}
141
141
  @click=${(event: Event) => onOpenClick(recording.storageName, event)}
142
142
  jslog=${VisualLogging.item()
143
- .track({ click: true, resize: true })
143
+ .track({ click: true })
144
144
  .context('recording')}>
145
145
  <div class="icon">
146
146
  <devtools-icon name="flow">
@@ -646,7 +646,7 @@ export class StepEditor extends LitElement {
646
646
  #renderTypeRow(editable: boolean): Lit.TemplateResult {
647
647
  this.#renderedAttributes.add('type');
648
648
  // clang-format off
649
- return html`<div class="row attribute" data-attribute="type" jslog=${VisualLogging.treeItem('type').track({resize: true})}>
649
+ return html`<div class="row attribute" data-attribute="type" jslog=${VisualLogging.treeItem('type')}>
650
650
  <div id="type">type<span class="separator">:</span></div>
651
651
  <devtools-suggestion-input
652
652
  aria-labelledby="type"
@@ -667,7 +667,7 @@ export class StepEditor extends LitElement {
667
667
  return;
668
668
  }
669
669
  // clang-format off
670
- return html`<div class="row attribute" data-attribute=${attribute} jslog=${VisualLogging.treeItem(Platform.StringUtilities.toKebabCase(attribute)).track({resize: true})}>
670
+ return html`<div class="row attribute" data-attribute=${attribute} jslog=${VisualLogging.treeItem(Platform.StringUtilities.toKebabCase(attribute))}>
671
671
  <div id=${attribute}>${attribute}<span class="separator">:</span></div>
672
672
  <devtools-suggestion-input
673
673
  .disabled=${this.disabled}
@@ -706,7 +706,7 @@ export class StepEditor extends LitElement {
706
706
  }
707
707
  // clang-format off
708
708
  return html`
709
- <div class="attribute" data-attribute="frame" jslog=${VisualLogging.treeItem('frame').track({resize: true})}>
709
+ <div class="attribute" data-attribute="frame" jslog=${VisualLogging.treeItem('frame')}>
710
710
  <div class="row">
711
711
  <div id="frame">frame<span class="separator">:</span></div>
712
712
  ${this.#renderDeleteButton('frame')}
@@ -15,8 +15,6 @@ import * as UI from '../../ui/legacy/legacy.js';
15
15
  import {html, render} from '../../ui/lit/lit.js';
16
16
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
17
17
 
18
- import {CookieControlsView} from './CookieControlsView.js';
19
- import {CookieReportView} from './CookieReportView.js';
20
18
  import lockIconStyles from './lockIcon.css.js';
21
19
  import mainViewStyles from './mainView.css.js';
22
20
  import {ShowOriginEvent} from './OriginTreeElement.js';
@@ -555,8 +553,6 @@ const DEFAULT_VIEW: View = (input: ViewInput, output: ViewOutput, target: HTMLEl
555
553
  <devtools-widget
556
554
  slot="sidebar"
557
555
  .widgetConfig=${widgetConfig(SecurityPanelSidebar)}
558
- @showCookieReport=${()=>output.setVisibleView(new CookieReportView())}
559
- @showFlagControls=${() => output.setVisibleView(new CookieControlsView())}
560
556
  ${UI.Widget.widgetRef(SecurityPanelSidebar, e => {output.sidebar = e;})}>
561
557
  </devtools-widget>
562
558
  </devtools-split-view>`,