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
@@ -217,16 +217,21 @@ class SuggestionBox extends LitElement {
217
217
  return;
218
218
  }
219
219
 
220
- // clang-format off
221
220
  return html`<style>${contentEditableStyles}</style><ul class="suggestions">
222
- ${this.#suggestions.map((suggestion, index) => html`
223
- <li class=${classMap({selected: index === this.cursor})}
224
- @mousedown=${this.#dispatchSuggestEvent.bind(this, suggestion)}
225
- jslog=${VisualLogging.item('suggestion').track({ click: true, resize: true })}>
221
+ ${this.#suggestions.map((suggestion, index) => {
222
+ return html`<li
223
+ class=${classMap({
224
+ selected: index === this.cursor,
225
+ })}
226
+ @mousedown=${this.#dispatchSuggestEvent.bind(this, suggestion)}
227
+ jslog=${VisualLogging.item('suggestion').track({
228
+ click: true,
229
+ })}
230
+ >
226
231
  ${suggestion}
227
- </li>`)}
232
+ </li>`;
233
+ })}
228
234
  </ul>`;
229
- // clang-format on
230
235
  }
231
236
  }
232
237
 
@@ -107,10 +107,11 @@ export class AutocompleteHistory {
107
107
  }
108
108
  }
109
109
 
110
- next(): string|undefined {
110
+ next(currentText: string): string|undefined {
111
111
  if (this.#historyOffset === 1) {
112
112
  return undefined;
113
113
  }
114
+ this.#saveCurrentEdit(currentText);
114
115
  --this.#historyOffset;
115
116
  return this.#currentHistoryItem();
116
117
  }
@@ -48,7 +48,7 @@ export class TextEditorHistory {
48
48
 
49
49
  const text = editor.state.doc.toString();
50
50
  const history = this.#history;
51
- const newText = isBackward ? history.previous(text) : history.next();
51
+ const newText = isBackward ? history.previous(text) : history.next(text);
52
52
  if (newText === undefined) {
53
53
  return false;
54
54
  }
@@ -475,7 +475,7 @@ export class TreeOutline<TreeNodeDataType> extends HTMLElement {
475
475
  aria-level=${depth + 1}
476
476
  aria-posinset=${positionInSet + 1}
477
477
  class=${listItemClasses}
478
- jslog=${VisualLogging.treeItem(node.jslogContext).track({click: true, resize: true, keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Enter|Space|Home|End'})}
478
+ jslog=${VisualLogging.treeItem(node.jslogContext).track({click: true, keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Enter|Space|Home|End'})}
479
479
  @click=${this.#onNodeClick}
480
480
  track-dom-node-to-tree-node=${trackDOMNodeToTreeNode(this.#domNodeToTreeNodeMap, node)}
481
481
  ${Lit.Directives.ref(domNode => {
@@ -282,6 +282,26 @@ export class ListControl<T> {
282
282
  return false;
283
283
  }
284
284
 
285
+ selectFirstItem(center?: boolean): boolean {
286
+ const index = this.findFirstSelectable(0, +1, false);
287
+ if (index !== -1) {
288
+ this.scrollIntoView(index, center);
289
+ this.select(index);
290
+ return true;
291
+ }
292
+ return false;
293
+ }
294
+
295
+ selectLastItem(center?: boolean): boolean {
296
+ const index = this.findFirstSelectable(this.model.length - 1, -1, false);
297
+ if (index !== -1) {
298
+ this.scrollIntoView(index, center);
299
+ this.select(index);
300
+ return true;
301
+ }
302
+ return false;
303
+ }
304
+
285
305
  private scrollIntoView(index: number, center?: boolean): void {
286
306
  if (this.mode === ListMode.NonViewport) {
287
307
  this.elementAtIndex(index).scrollIntoViewIfNeeded(Boolean(center));
@@ -328,6 +348,12 @@ export class ListControl<T> {
328
348
  case 'PageDown':
329
349
  selected = this.selectItemNextPage(false);
330
350
  break;
351
+ case 'Home':
352
+ selected = this.selectFirstItem();
353
+ break;
354
+ case 'End':
355
+ selected = this.selectLastItem();
356
+ break;
331
357
  }
332
358
  if (selected) {
333
359
  event.consume(true);
@@ -365,7 +391,7 @@ export class ListControl<T> {
365
391
  if (!element.hasAttribute('jslog')) {
366
392
  element.setAttribute(
367
393
  'jslog',
368
- `${VisualLogging.item().track({click: true, resize: true, keydown: 'ArrowUp|ArrowDown|PageUp|PageDown'})}`);
394
+ `${VisualLogging.item().track({click: true, keydown: 'ArrowUp|ArrowDown|PageUp|PageDown|Home|End'})}`);
369
395
  }
370
396
  this.itemToElement.set(item, element);
371
397
  this.updateElementARIA(element, index);
@@ -150,7 +150,7 @@ export class ListWidget<T> extends VBox {
150
150
  }
151
151
  const content = this.delegate.renderItem(item, editable, this.#items.length - 1);
152
152
  if (!content.hasAttribute('jslog')) {
153
- element.setAttribute('jslog', `${VisualLogging.item().track({resize: true})}`);
153
+ element.setAttribute('jslog', `${VisualLogging.item()}`);
154
154
  }
155
155
  element.appendChild(content);
156
156
  if (editable) {
@@ -502,8 +502,10 @@ export class SearchableView extends VBox {
502
502
  private updateSearchNavigationButtonState(enabled: boolean): void {
503
503
  this.replaceButtonElement.disabled = !enabled;
504
504
  this.replaceAllButtonElement.disabled = !enabled;
505
- this.searchNavigationPrevElement.setEnabled(enabled);
506
- this.searchNavigationNextElement.setEnabled(enabled);
505
+ if (this.searchProvider.supportsMatchCounts?.() === true) {
506
+ this.searchNavigationPrevElement.setEnabled(enabled);
507
+ this.searchNavigationNextElement.setEnabled(enabled);
508
+ }
507
509
  }
508
510
 
509
511
  private updateSearchMatchesCountAndCurrentMatchIndex(matches: number, currentMatchIndex: number): void {
@@ -682,6 +684,7 @@ export class SearchableView extends VBox {
682
684
  const searchableViewsByElement = new WeakMap<Element, SearchableView>();
683
685
 
684
686
  export interface Searchable {
687
+ supportsMatchCounts?(): boolean;
685
688
  currentQuery?: string;
686
689
  currentSearchMatches?: number;
687
690
  onSearchCanceled(): void;
@@ -335,8 +335,7 @@ export class SoftContextMenu {
335
335
  menuItemElement.addEventListener('mouseleave', (this.menuItemMouseLeave.bind(this) as EventListener), false);
336
336
 
337
337
  if (item.jslogContext) {
338
- menuItemElement.setAttribute(
339
- 'jslog', `${VisualLogging.item(item.jslogContext).track({click: true, resize: true})}`);
338
+ menuItemElement.setAttribute('jslog', `${VisualLogging.item().context(item.jslogContext)}`);
340
339
  }
341
340
  return menuItemElement;
342
341
  }
@@ -499,7 +499,6 @@ export class TreeElement {
499
499
  this.listItemNode.setAttribute(
500
500
  'jslog', `${VisualLogging.treeItem().parent('parentTreeItem').context(jslogContext).track({
501
501
  click: true,
502
- resize: true,
503
502
  keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Backspace|Delete|Enter|Space|Home|End',
504
503
  })}`);
505
504
  ARIAUtils.markAsTreeitem(this.listItemNode);
@@ -1567,7 +1566,7 @@ class TreeViewTreeElement extends TreeElement {
1567
1566
  this.listItemElement.classList.add(className);
1568
1567
  this.#clonedClasses.add(className);
1569
1568
  }
1570
- InterceptBindingDirective.attachEventListeners(this.configElement, this.listItemElement);
1569
+ InterceptBindingDirective.setEventListeners(this.configElement, this.listItemElement);
1571
1570
 
1572
1571
  for (const child of this.configElement.childNodes) {
1573
1572
  if (child instanceof HTMLUListElement && child.role === 'group') {
@@ -1970,6 +1970,7 @@ export function bindToAction(actionName: string): ReturnType<typeof Directives.r
1970
1970
  type BindingEventListener = (arg: any) => any;
1971
1971
  export class InterceptBindingDirective extends Lit.Directive.Directive {
1972
1972
  static readonly #interceptedBindings = new WeakMap<Element, Map<string, BindingEventListener>>();
1973
+ static readonly #attachedBindings = new WeakMap<Element, Map<string, BindingEventListener>>();
1973
1974
 
1974
1975
  override update(part: Lit.Directive.Part, [listener]: [BindingEventListener]): unknown {
1975
1976
  if (part.type !== Lit.Directive.PartType.EVENT) {
@@ -1990,13 +1991,22 @@ export class InterceptBindingDirective extends Lit.Directive.Directive {
1990
1991
  return undefined;
1991
1992
  }
1992
1993
 
1993
- static attachEventListeners(templateElement: Element, renderedElement: Element): void {
1994
- const eventListeners = InterceptBindingDirective.#interceptedBindings.get(templateElement);
1995
- if (!eventListeners) {
1996
- return;
1994
+ static setEventListeners(templateElement: Element, renderedElement: Element): void {
1995
+ const attachedListeners = InterceptBindingDirective.#attachedBindings.get(renderedElement);
1996
+ if (attachedListeners) {
1997
+ for (const [name, listener] of attachedListeners) {
1998
+ renderedElement.removeEventListener(name, listener);
1999
+ }
1997
2000
  }
1998
- for (const [name, listener] of eventListeners) {
1999
- renderedElement.addEventListener(name, listener);
2001
+
2002
+ const newListeners = InterceptBindingDirective.#interceptedBindings.get(templateElement);
2003
+ if (newListeners?.size) {
2004
+ for (const [name, listener] of newListeners) {
2005
+ renderedElement.addEventListener(name, listener);
2006
+ }
2007
+ InterceptBindingDirective.#attachedBindings.set(renderedElement, new Map(newListeners));
2008
+ } else {
2009
+ InterceptBindingDirective.#attachedBindings.delete(renderedElement);
2000
2010
  }
2001
2011
  }
2002
2012
  }
@@ -2029,7 +2039,7 @@ export class HTMLElementWithLightDOMTemplate extends HTMLElement {
2029
2039
  clone.appendChild(HTMLElementWithLightDOMTemplate.cloneNode(child));
2030
2040
  }
2031
2041
  if (node instanceof Element && clone instanceof Element) {
2032
- InterceptBindingDirective.attachEventListeners(node, clone);
2042
+ InterceptBindingDirective.setEventListeners(node, clone);
2033
2043
  }
2034
2044
  return clone;
2035
2045
  }
@@ -73,6 +73,7 @@ let currentUpdateQueue: Map<Widget, PromiseWithResolvers<void>>|null = null;
73
73
  const currentlyProcessed = new Set<Widget>();
74
74
  let nextUpdateQueue = new Map<Widget, PromiseWithResolvers<void>>();
75
75
  let pendingAnimationFrame: number|null = null;
76
+ let overallUpdatePromise: PromiseWithResolvers<void>|null = null;
76
77
 
77
78
  function enqueueIntoNextUpdateQueue(widget: Widget): Promise<void> {
78
79
  const scheduledUpdate = nextUpdateQueue.get(widget) ?? Promise.withResolvers<void>();
@@ -132,6 +133,10 @@ function runNextUpdate(): void {
132
133
  } else {
133
134
  currentUpdateQueue = null;
134
135
  currentlyProcessed.clear();
136
+ if (!pendingAnimationFrame && overallUpdatePromise) {
137
+ overallUpdatePromise.resolve();
138
+ overallUpdatePromise = null;
139
+ }
135
140
  }
136
141
  });
137
142
  }
@@ -414,6 +419,16 @@ export class Widget {
414
419
  return widgetMap.get(node);
415
420
  }
416
421
 
422
+ static get allUpdatesComplete(): Promise<void> {
423
+ if (!pendingAnimationFrame && !currentUpdateQueue) {
424
+ return Promise.resolve();
425
+ }
426
+ if (!overallUpdatePromise) {
427
+ overallUpdatePromise = Promise.withResolvers<void>();
428
+ }
429
+ return overallUpdatePromise.promise;
430
+ }
431
+
417
432
  static getOrCreateWidget(element: HTMLElement): Widget {
418
433
  const widget = Widget.get(element);
419
434
  if (widget) {
@@ -1679,6 +1679,8 @@ export const enum Events {
1679
1679
  OPENED_NODE = 'OpenedNode',
1680
1680
  SORTING_CHANGED = 'SortingChanged',
1681
1681
  PADDING_CHANGED = 'PaddingChanged',
1682
+ EXPANDED_NODE = 'ExpandedNode',
1683
+ COLLAPSED_NODE = 'CollapsedNode',
1682
1684
  }
1683
1685
 
1684
1686
  export interface EventTypes<T> {
@@ -1687,6 +1689,8 @@ export interface EventTypes<T> {
1687
1689
  [Events.OPENED_NODE]: DataGridNode<T>;
1688
1690
  [Events.SORTING_CHANGED]: void;
1689
1691
  [Events.PADDING_CHANGED]: void;
1692
+ [Events.EXPANDED_NODE]: DataGridNode<T>;
1693
+ [Events.COLLAPSED_NODE]: DataGridNode<T>;
1690
1694
  }
1691
1695
 
1692
1696
  export enum Order {
@@ -1762,10 +1766,8 @@ export class DataGridNode<T> {
1762
1766
 
1763
1767
  protected createElement(): HTMLElement {
1764
1768
  this.elementInternal = document.createElement('tr');
1765
- this.elementInternal.setAttribute('jslog', `${VisualLogging.tableRow().track({
1766
- resize: true,
1767
- keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Enter|Space'
1768
- })}`);
1769
+ this.elementInternal.setAttribute(
1770
+ 'jslog', `${VisualLogging.tableRow().track({keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Enter|Space'})}`);
1769
1771
  this.elementInternal.classList.add('data-grid-data-grid-node');
1770
1772
  if (this.dataGrid) {
1771
1773
  this.dataGrid.elementToDataGridNode.set(this.elementInternal, this);
@@ -2229,6 +2231,7 @@ export class DataGridNode<T> {
2229
2231
  for (let i = 0; i < this.children.length; ++i) {
2230
2232
  this.children[i].revealed = false;
2231
2233
  }
2234
+ this.dataGrid?.dispatchEventToListeners(Events.COLLAPSED_NODE, this);
2232
2235
  }
2233
2236
 
2234
2237
  collapseRecursively(): void {
@@ -2286,6 +2289,7 @@ export class DataGridNode<T> {
2286
2289
  }
2287
2290
 
2288
2291
  this.expandedInternal = true;
2292
+ this.dataGrid?.dispatchEventToListeners(Events.EXPANDED_NODE, this);
2289
2293
  }
2290
2294
 
2291
2295
  expandRecursively(): void {
@@ -5,6 +5,7 @@
5
5
 
6
6
  import type * as Platform from '../../../../core/platform/platform.js';
7
7
  import type * as TextUtils from '../../../../models/text_utils/text_utils.js';
8
+ import * as Lit from '../../../lit/lit.js';
8
9
  import * as UI from '../../legacy.js';
9
10
 
10
11
  import dataGridStyles from './dataGrid.css.js';
@@ -81,6 +82,12 @@ class DataGridElement extends UI.UIUtils.HTMLElementWithLightDOMTemplate {
81
82
  this.#dataGrid.addEventListener(
82
83
  DataGridEvents.OPENED_NODE,
83
84
  e => (e.data as DataGridElementNode).configElement.dispatchEvent(new CustomEvent('open')));
85
+ this.#dataGrid.addEventListener(
86
+ DataGridEvents.EXPANDED_NODE,
87
+ e => (e.data as DataGridElementNode).configElement.dispatchEvent(new CustomEvent('expand')));
88
+ this.#dataGrid.addEventListener(
89
+ DataGridEvents.COLLAPSED_NODE,
90
+ e => (e.data as DataGridElementNode).configElement.dispatchEvent(new CustomEvent('collapse')));
84
91
  this.#dataGrid.addEventListener(DataGridEvents.SORTING_CHANGED, () => this.dispatchEvent(new CustomEvent('sort', {
85
92
  detail: {columnId: this.#dataGrid.sortColumnId(), ascending: this.#dataGrid.isSortOrderAscending()}
86
93
  })));
@@ -170,6 +177,14 @@ class DataGridElement extends UI.UIUtils.HTMLElementWithLightDOMTemplate {
170
177
  return this.#columns;
171
178
  }
172
179
 
180
+ #updateHasChildren(dataGridNode: DataGridElementNode, dataRow: Element): void {
181
+ let hasChildren = dataGridNode.children.length > 0;
182
+ if (!hasChildren) {
183
+ hasChildren = Boolean(dataRow.querySelector('td table'));
184
+ }
185
+ dataGridNode.setHasChildren(hasChildren);
186
+ }
187
+
173
188
  #updateColumns(): void {
174
189
  for (const column of Object.keys(this.#dataGrid.columns)) {
175
190
  this.#dataGrid.removeColumn(column);
@@ -292,6 +307,7 @@ class DataGridElement extends UI.UIUtils.HTMLElementWithLightDOMTemplate {
292
307
  const nextNode = this.#findNextExistingNode(element);
293
308
  const index = nextNode ? parentNode.children.indexOf(nextNode) : parentNode.children.length;
294
309
  const node = new DataGridElementNode(element, this);
310
+ this.#updateHasChildren(node, element);
295
311
  if ((parentRow || node.hasChildren()) && !this.#dataGrid.disclosureColumnId) {
296
312
  this.#dataGrid.disclosureColumnId = this.#columns[0].id;
297
313
  }
@@ -319,7 +335,7 @@ class DataGridElement extends UI.UIUtils.HTMLElementWithLightDOMTemplate {
319
335
  for (const element of this.#getDataRows(nodes)) {
320
336
  const node = DataGridElementNode.get(element);
321
337
  if (node) {
322
- node.remove();
338
+ DataGridElementNode.remove(node);
323
339
  }
324
340
  }
325
341
  }
@@ -344,6 +360,7 @@ class DataGridElement extends UI.UIUtils.HTMLElementWithLightDOMTemplate {
344
360
  } else if (attributeName === 'highlighted') {
345
361
  dataGridNode.setHighlighted(hasBooleanAttribute(dataRow, 'highlighted'));
346
362
  } else {
363
+ this.#updateHasChildren(dataGridNode, dataRow);
347
364
  dataGridNode.refresh();
348
365
  }
349
366
  }
@@ -591,3 +608,35 @@ export interface DataGridInternalToken {
591
608
  const INTERNAL_TOKEN: DataGridInternalToken = {
592
609
  token: 'DataGridInternalToken'
593
610
  };
611
+
612
+ export const ifExpanded = Lit.Directive.directive(class extends Lit.Directive.Directive {
613
+ #partInfo: {type: Lit.Directive.PartType, startNode: Node};
614
+ constructor(partInfo: Lit.Directive.PartInfo) {
615
+ if (partInfo.type !== Lit.Directive.PartType.CHILD) {
616
+ throw new Error('expand directive must be used in a child node');
617
+ }
618
+ super(partInfo);
619
+ this.#partInfo = partInfo as {type: Lit.Directive.PartType, startNode: Node};
620
+ }
621
+
622
+ render(content: () => Lit.TemplateResult): Lit.LitTemplate {
623
+ return this.#isInExpandedRow(this.#partInfo.startNode) ? content() : Lit.nothing;
624
+ }
625
+
626
+ #isInExpandedRow(element: Node|null|undefined): boolean {
627
+ if (!element) {
628
+ return false;
629
+ }
630
+ if (!(element instanceof HTMLElement)) {
631
+ element = element.parentNode;
632
+ }
633
+ if (!(element instanceof HTMLElement)) {
634
+ return false;
635
+ }
636
+ const node = DataGridElementNode.get(element.closest('tr') ?? undefined);
637
+ if (!node) {
638
+ return false;
639
+ }
640
+ return node.expanded;
641
+ }
642
+ });
@@ -7,7 +7,7 @@ import * as Platform from '../../../../core/platform/platform.js';
7
7
  import type * as TextUtils from '../../../../models/text_utils/text_utils.js';
8
8
  import * as RenderCoordinator from '../../../components/render_coordinator/render_coordinator.js';
9
9
 
10
- import {type DataGridData, DataGridImpl, DataGridNode, type Parameters} from './DataGrid.js';
10
+ import {type DataGridData, DataGridImpl, DataGridNode, Events as DataGridEvents, type Parameters} from './DataGrid.js';
11
11
 
12
12
  let nextId = 0;
13
13
 
@@ -492,6 +492,7 @@ export class ViewportDataGridNode<T> extends DataGridNode<ViewportDataGridNode<T
492
492
  (this.dataGrid as ViewportDataGrid<T>).announceSelectedGridNode();
493
493
  }
494
494
  (this.dataGrid as ViewportDataGrid<T>).scheduleUpdateStructure();
495
+ this.dataGrid?.dispatchEventToListeners(DataGridEvents.COLLAPSED_NODE, this);
495
496
  }
496
497
 
497
498
  override expand(): void {
@@ -13,4 +13,5 @@ import * as ShowMoreDataGridNode from './ShowMoreDataGridNode.js';
13
13
  import * as SortableDataGrid from './SortableDataGrid.js';
14
14
  import * as ViewportDataGrid from './ViewportDataGrid.js';
15
15
 
16
+ export {ifExpanded} from './DataGridElement.js';
16
17
  export {DataGrid, ShowMoreDataGridNode, SortableDataGrid, ViewportDataGrid};
@@ -280,7 +280,7 @@ export class FilteredListWidget extends Common.ObjectWrapper.eventMixin<EventTyp
280
280
  if (this.provider) {
281
281
  render(this.provider.renderItem(item, this.cleanValue()), wrapperElement);
282
282
  wrapperElement.setAttribute(
283
- 'jslog', `${VisualLogging.item(this.provider.jslogContextAt(item)).track({click: true, resize: true})}`);
283
+ 'jslog', `${VisualLogging.item(this.provider.jslogContextAt(item)).track({click: true})}`);
284
284
  }
285
285
  UI.ARIAUtils.markAsOption(wrapperElement);
286
286
  return wrapperElement;
@@ -353,8 +353,6 @@ export class StackTracePreviewContent extends UI.Widget.Widget {
353
353
  this.#table = this.contentElement.createChild('table', 'stack-preview-container');
354
354
  this.#table.classList.toggle('width-constrained', this.#options.widthConstrained ?? false);
355
355
 
356
- this.#stackTrace?.addEventListener(StackTrace.StackTrace.Events.UPDATED, this.performUpdate.bind(this));
357
-
358
356
  this.performUpdate();
359
357
  }
360
358
 
@@ -407,7 +405,11 @@ export class StackTracePreviewContent extends UI.Widget.Widget {
407
405
  }
408
406
 
409
407
  set stackTrace(stackTrace: StackTrace.StackTrace.StackTrace) {
408
+ if (this.#stackTrace) {
409
+ this.#stackTrace.removeEventListener(StackTrace.StackTrace.Events.UPDATED, this.requestUpdate, this);
410
+ }
410
411
  this.#stackTrace = stackTrace;
412
+ this.#stackTrace.addEventListener(StackTrace.StackTrace.Events.UPDATED, this.requestUpdate, this);
411
413
  this.requestUpdate();
412
414
  }
413
415
 
@@ -923,6 +923,14 @@ export const knownContextValues = new Set([
923
923
  'content-type',
924
924
  'content-visibility',
925
925
  'context',
926
+ 'context-added',
927
+ 'context-change-drjones-file',
928
+ 'context-change-drjones-network-request',
929
+ 'context-change-drjones-performance',
930
+ 'context-change-freestyler',
931
+ 'context-change-none',
932
+ 'context-change-performance-insight',
933
+ 'context-removed',
926
934
  'context3',
927
935
  'contextmenu',
928
936
  'continue',
@@ -1770,6 +1778,7 @@ export const knownContextValues = new Set([
1770
1778
  'gotpointercapture',
1771
1779
  'grace-period-link',
1772
1780
  'grace-period-mitigation-disabled',
1781
+ 'greendev',
1773
1782
  'greendev-ai-annotations-enabled',
1774
1783
  'greendev-artifact-viewer-enabled',
1775
1784
  'greendev-copy-to-gemini-enabled',
@@ -2515,6 +2524,7 @@ export const knownContextValues = new Set([
2515
2524
  'margin-left',
2516
2525
  'margin-right',
2517
2526
  'margin-top',
2527
+ 'margin-trim',
2518
2528
  'marker',
2519
2529
  'marker-end',
2520
2530
  'marker-mid',
@@ -3261,6 +3271,7 @@ export const knownContextValues = new Set([
3261
3271
  'rule-inset',
3262
3272
  'rule-interior-inset',
3263
3273
  'rule-outset',
3274
+ 'rule-overlap',
3264
3275
  'rule-set',
3265
3276
  'rule-set-details',
3266
3277
  'rule-style',
@@ -3689,6 +3700,7 @@ export const knownContextValues = new Set([
3689
3700
  'start-conversation-drjones-performance',
3690
3701
  'start-conversation-freestyler',
3691
3702
  'start-conversation-performance-insight',
3703
+ 'start-conversation-performance-none',
3692
3704
  'start-new-chat',
3693
3705
  'start-recording',
3694
3706
  'start-time',
@@ -3894,6 +3906,9 @@ export const knownContextValues = new Set([
3894
3906
  'timeline-tree-current-thread',
3895
3907
  'timeline-tree-group-by',
3896
3908
  'timeline-trigger',
3909
+ 'timeline-trigger-activation-range',
3910
+ 'timeline-trigger-activation-range-end',
3911
+ 'timeline-trigger-activation-range-start',
3897
3912
  'timeline-trigger-active-range',
3898
3913
  'timeline-trigger-active-range-end',
3899
3914
  'timeline-trigger-active-range-start',
@@ -7,6 +7,13 @@ import commonStyle from './common.css';
7
7
  import {adoptStyleSheet} from './common.js';
8
8
  import {gridStyle} from './highlight_grid_common.js';
9
9
  // @ts-expect-error Importing CSS is handled in Rollup.
10
+ import greenDevAnchorsStyle from './tool_green_dev_anchors.css';
11
+ import {
12
+ type GreenDevAnchorsDispatchMessage,
13
+ GreenDevAnchorsOverlay,
14
+ type GreenDevAnchorsToolMessage
15
+ } from './tool_green_dev_anchors.js';
16
+ // @ts-expect-error Importing CSS is handled in Rollup.
10
17
  import highlightGridStyle from './tool_grid.css';
11
18
  // @ts-expect-error Importing CSS is handled in Rollup.
12
19
  import highlightStyle from './tool_highlight.css';
@@ -29,7 +36,9 @@ import {WindowControlsOverlay} from './tool_window_controls.js';
29
36
  declare global {
30
37
  interface Window {
31
38
  // eslint-disable-next-line @typescript-eslint/naming-convention
32
- InspectorOverlayHost: {send(data: PausedToolMessage|PersistentToolMessage|ScreenshotToolMessage|string): void};
39
+ InspectorOverlayHost: {
40
+ send(data: PausedToolMessage|PersistentToolMessage|ScreenshotToolMessage|GreenDevAnchorsToolMessage|string): void,
41
+ };
33
42
  }
34
43
  }
35
44
 
@@ -39,14 +48,18 @@ const gridStyleSheet = new CSSStyleSheet();
39
48
  gridStyleSheet.replaceSync(gridStyle);
40
49
 
41
50
  const highlightOverlay = new HighlightOverlay(window, [highlightStyle, gridStyleSheet]);
42
- const persistentOverlay = new PersistentOverlay(window, [highlightGridStyle, gridStyleSheet]);
51
+ const persistentOverlay = new PersistentOverlay(window, [highlightGridStyle, greenDevAnchorsStyle, gridStyleSheet]);
43
52
  const pausedOverlay = new PausedOverlay(window, pausedStyle);
44
53
  const screenshotOverlay = new ScreenshotOverlay(window, screenshotStyle);
54
+ const greenDevAnchorsOverlay = new GreenDevAnchorsOverlay(window, greenDevAnchorsStyle);
45
55
  const sourceOrderOverlay = new SourceOrderOverlay(window, sourceOrderStyle);
46
56
  const viewportSizeOverlay = new ViewportSizeOverlay(window);
47
57
  const windowControlsOverlay = new WindowControlsOverlay(window, [wcoStyle]);
48
58
 
59
+ persistentOverlay.setGreenDevAnchorsOverlay(greenDevAnchorsOverlay);
60
+
49
61
  interface Overlays {
62
+ greenDevFloaty: GreenDevAnchorsOverlay;
50
63
  highlight: HighlightOverlay;
51
64
  persistent: PersistentOverlay;
52
65
  paused: PausedOverlay;
@@ -60,6 +73,7 @@ type PlatformName = string;
60
73
 
61
74
  // Key in this object is the name the backend refers to a particular overlay by.
62
75
  const overlays: Overlays = {
76
+ greenDevFloaty: greenDevAnchorsOverlay,
63
77
  highlight: highlightOverlay,
64
78
  persistent: persistentOverlay,
65
79
  paused: pausedOverlay,
@@ -76,6 +90,7 @@ interface MessageLookup {
76
90
  setOverlay: keyof Overlays;
77
91
  setPlatform: PlatformName;
78
92
  drawingFinished: '';
93
+ update: GreenDevAnchorsDispatchMessage;
79
94
  }
80
95
 
81
96
  const dispatch = <K extends keyof MessageLookup>(message: [a: K, b: MessageLookup[K]]) => {
@@ -93,7 +108,7 @@ const dispatch = <K extends keyof MessageLookup>(message: [a: K, b: MessageLooku
93
108
  currentOverlay.install();
94
109
  }
95
110
  } else if (functionName === 'setPlatform') {
96
- platformName = message[1];
111
+ platformName = message[1] as PlatformName;
97
112
  } else if (functionName === 'drawingFinished') {
98
113
  // TODO The logic needs to be added here once the backend starts sending this event.
99
114
  } else {
@@ -0,0 +1,54 @@
1
+ /*
2
+ * Copyright 2026 The Chromium Authors
3
+ * Use of this source code is governed by a BSD-style license that can be
4
+ * found in the LICENSE file.
5
+ */
6
+ /* eslint-disable color-named, plugin/use_theme_colors */
7
+
8
+ :root {
9
+ --gemini-logo: url("data:image/svg+xml,%0A%3Csvg%20fill%3D%22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2065%2065%22%3E%3Cmask%20id%3D%22maskme%22%20style%3D%22mask-type%3Aalpha%22%20maskUnits%3D%22userSpaceOnUse%22%20x%3D%220%22%20y%3D%220%22%20width%3D%2265%22%20height%3D%2265%22%3E%3Cpath%20d%3D%22M32.447%200c.68%200%201.273.465%201.439%201.125a38.904%2038.904%200%20001.999%205.905c2.152%205%205.105%209.376%208.854%2013.125%203.751%203.75%208.126%206.703%2013.125%208.855a38.98%2038.98%200%20005.906%201.999c.66.166%201.124.758%201.124%201.438%200%20.68-.464%201.273-1.125%201.439a38.902%2038.902%200%2000-5.905%201.999c-5%202.152-9.375%205.105-13.125%208.854-3.749%203.751-6.702%208.126-8.854%2013.125a38.973%2038.973%200%2000-2%205.906%201.485%201.485%200%2001-1.438%201.124c-.68%200-1.272-.464-1.438-1.125a38.913%2038.913%200%2000-2-5.905c-2.151-5-5.103-9.375-8.854-13.125-3.75-3.749-8.125-6.702-13.125-8.854a38.973%2038.973%200%2000-5.905-2A1.485%201.485%200%20010%2032.448c0-.68.465-1.272%201.125-1.438a38.903%2038.903%200%20005.905-2c5-2.151%209.376-5.104%2013.125-8.854%203.75-3.749%206.703-8.125%208.855-13.125a38.972%2038.972%200%20001.999-5.905A1.485%201.485%200%200132.447%200z%22%20fill%3D%22%23000%22/%3E%3Cpath%20d%3D%22M32.447%200c.68%200%201.273.465%201.439%201.125a38.904%2038.904%200%20001.999%205.905c2.152%205%205.105%209.376%208.854%2013.125%203.751%203.75%208.126%206.703%2013.125%208.855a38.98%2038.98%200%20005.906%201.999c.66.166%201.124.758%201.124%201.438%200%20.68-.464%201.273-1.125%201.439a38.902%2038.902%200%2000-5.905%201.999c-5%202.152-9.375%205.105-13.125%208.854-3.749%203.751-6.702%208.126-8.854%2013.125a38.973%2038.973%200%2000-2%205.906%201.485%201.485%200%2001-1.438%201.124c-.68%200-1.272-.464-1.438-1.125a38.913%2038.913%200%2000-2-5.905c-2.151-5-5.103-9.375-8.854-13.125-3.75-3.749-8.125-6.702-13.125-8.854a38.973%2038.973%200%2000-5.905-2A1.485%201.485%200%20010%2032.448c0-.68.465-1.272%201.125-1.438a38.903%2038.903%200%20005.905-2c5-2.151%209.376-5.104%2013.125-8.854%203.75-3.749%206.703-8.125%208.855-13.125a38.972%2038.972%200%20001.999-5.905A1.485%201.485%200%200132.447%200z%22%20fill%3D%22%23000%22/%3E%3C/mask%3E%3Cg%20mask%3D%22url(%23maskme)%22%3E%3Cpath%20fill%3D%22%234285F4%22%20d%3D%22M0%200h38.235L65%2027.66%2065%2065H0z%22/%3E%3Cpath%20fill%3D%22%23EA4335%22%20d%3D%22M26.765%200H65v38.235z%22/%3E%3Cpath%20fill%3D%22%2334A853%22%20d%3D%22M0%2026.765H38.235V65H0z%22/%3E%3Cpath%20fill%3D%22%23FBBC04%22%20d%3D%22M27.66%2065L65%2038.235V65z%22/%3E%3C/g%3E%3C/svg%3E");
10
+ --open-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6' /%3E%3Cpolyline points='15 3 21 3 21 9' /%3E%3Cline x1='10' y1='14' x2='21' y2='3' /%3E%3C/svg%3E");
11
+ }
12
+
13
+ #green-dev-anchors-container {
14
+ position: absolute;
15
+ top: 0;
16
+ left: 0;
17
+ width: 100%;
18
+ height: 100%;
19
+ z-index: 1000;
20
+ pointer-events: none;
21
+ }
22
+
23
+ .green-dev-anchor-minimal {
24
+ position: absolute;
25
+ width: 70px;
26
+ height: 40px;
27
+ background-color: #fff;
28
+ border-radius: 12px;
29
+ box-shadow: 0 4px 8px rgb(0 0 0 / 20%);
30
+ pointer-events: auto;
31
+ z-index: 1001;
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: center;
35
+ padding: 0 5px;
36
+ cursor: pointer;
37
+ }
38
+
39
+ .green-dev-anchor-icon-gemini {
40
+ width: 24px;
41
+ height: 24px;
42
+ background-image: var(--gemini-logo);
43
+ background-size: cover;
44
+ background-repeat: no-repeat;
45
+ margin-right: 5px;
46
+ }
47
+
48
+ .green-dev-anchor-icon-open {
49
+ width: 20px;
50
+ height: 20px;
51
+ background-image: var(--open-icon);
52
+ background-size: cover;
53
+ background-repeat: no-repeat;
54
+ }