chrome-devtools-frontend 1.0.1578729 → 1.0.1581449

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