chrome-devtools-frontend 1.0.1675430 → 1.0.1678416

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 (308) hide show
  1. package/AUTHORS +1 -0
  2. package/WATCHLISTS +0 -4
  3. package/front_end/core/common/EventTarget.ts +0 -5
  4. package/front_end/core/common/Settings.ts +0 -66
  5. package/front_end/core/host/InspectorFrontendHostAPI.ts +1 -0
  6. package/front_end/core/host/UserMetrics.ts +5 -0
  7. package/front_end/core/root/Runtime.ts +5 -5
  8. package/front_end/core/sdk/CSSMetadata.ts +5 -9
  9. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +16 -34
  10. package/front_end/core/sdk/DebuggerModel.ts +92 -57
  11. package/front_end/core/sdk/EmulationModel.ts +2 -1
  12. package/front_end/core/sdk/NetworkManager.ts +16 -2
  13. package/front_end/core/sdk/OverlayModel.ts +19 -9
  14. package/front_end/core/sdk/OverlayPersistentHighlighter.ts +10 -4
  15. package/front_end/core/sdk/ResourceTreeModel.ts +20 -1
  16. package/front_end/core/sdk/SDKSettings.ts +117 -0
  17. package/front_end/core/sdk/Script.ts +9 -53
  18. package/front_end/core/sdk/sdk-meta.ts +0 -431
  19. package/front_end/devtools_compatibility.js +1 -0
  20. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +213 -23
  21. package/front_end/entrypoints/inspector_main/InspectorMain.ts +6 -5
  22. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +14 -15
  23. package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +157 -0
  24. package/front_end/entrypoints/main/MainImpl.ts +32 -0
  25. package/front_end/entrypoints/shell/shell.ts +0 -1
  26. package/front_end/foundation/Universe.ts +8 -0
  27. package/front_end/generated/InspectorBackendCommands.ts +8 -8
  28. package/front_end/generated/SupportedCSSProperties.ts +53 -4
  29. package/front_end/generated/protocol-mapping.d.ts +27 -21
  30. package/front_end/generated/protocol-proxy-api.d.ts +22 -17
  31. package/front_end/generated/protocol.ts +43 -18
  32. package/front_end/models/ai_assistance/AiAgent2.ts +47 -2
  33. package/front_end/models/ai_assistance/AiConversation.ts +22 -5
  34. package/front_end/models/ai_assistance/README.md +52 -26
  35. package/front_end/models/ai_assistance/agents/AiAgent.ts +54 -8
  36. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -1
  37. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +7 -194
  38. package/front_end/models/ai_assistance/agents/StorageAgent.ts +21 -87
  39. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +2 -1
  40. package/front_end/models/ai_assistance/ai_assistance.ts +24 -0
  41. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +124 -0
  42. package/front_end/models/ai_assistance/contexts/StorageContext.ts +100 -0
  43. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +69 -1
  44. package/front_end/models/ai_assistance/skills/README.md +63 -1
  45. package/front_end/models/ai_assistance/skills/Skill.ts +1 -1
  46. package/front_end/models/ai_assistance/skills/SkillRegistry.ts +4 -0
  47. package/front_end/models/ai_assistance/skills/accessibility.md +7 -0
  48. package/front_end/models/ai_assistance/skills/performance.md +15 -1
  49. package/front_end/models/ai_assistance/skills/sources.md +16 -0
  50. package/front_end/models/ai_assistance/skills/storage.md +31 -0
  51. package/front_end/models/ai_assistance/tools/GetDetailedCallTree.ts +107 -0
  52. package/front_end/models/ai_assistance/tools/GetFunctionCode.ts +122 -0
  53. package/front_end/models/ai_assistance/tools/GetResourceContent.ts +127 -0
  54. package/front_end/models/ai_assistance/tools/GetSourceContent.ts +101 -0
  55. package/front_end/models/ai_assistance/tools/GetTraceEventByKey.ts +83 -0
  56. package/front_end/models/ai_assistance/tools/GetTraceMainThreadSummary.ts +106 -0
  57. package/front_end/models/ai_assistance/tools/GetTraceNetworkSummary.ts +104 -0
  58. package/front_end/models/ai_assistance/tools/ListPageOrigins.ts +95 -0
  59. package/front_end/models/ai_assistance/tools/ListSources.ts +116 -0
  60. package/front_end/models/ai_assistance/tools/RunLighthouse.ts +89 -0
  61. package/front_end/models/ai_assistance/tools/SelectTraceEventByKey.ts +90 -0
  62. package/front_end/models/ai_assistance/tools/Tool.ts +26 -1
  63. package/front_end/models/ai_assistance/tools/ToolRegistry.ts +22 -0
  64. package/front_end/models/bindings/CSSWorkspaceBinding.ts +4 -0
  65. package/front_end/models/bindings/CompilerScriptMapping.ts +4 -0
  66. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +8 -0
  67. package/front_end/models/bindings/ResourceScriptMapping.ts +3 -201
  68. package/front_end/models/bindings/SASSSourceMapping.ts +6 -0
  69. package/front_end/models/breakpoints/BreakpointManager.ts +2 -49
  70. package/front_end/models/comment_manager/CommentManager.ts +141 -0
  71. package/front_end/models/comment_manager/comment_manager.ts +9 -0
  72. package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +27 -0
  73. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +10 -2
  74. package/front_end/models/issues_manager/descriptions/connectionAllowlistEmbeddingRequirementNotSatisfied.md +26 -0
  75. package/front_end/models/issues_manager/descriptions/connectionAllowlistIFrameAttributeLoosensEmbeddingRequirement.md +19 -0
  76. package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidAllowConnectionAllowlistFrom.md +21 -0
  77. package/front_end/models/javascript_metadata/NativeFunctions.js +6 -6
  78. package/front_end/models/persistence/IsolatedFileSystem.ts +7 -8
  79. package/front_end/models/persistence/IsolatedFileSystemManager.ts +2 -2
  80. package/front_end/models/persistence/PlatformFileSystem.ts +1 -1
  81. package/front_end/models/persistence/persistence-meta.ts +9 -9
  82. package/front_end/models/trace/types/TraceEvents.ts +36 -0
  83. package/front_end/panels/accessibility/ARIAAttributesView.ts +3 -3
  84. package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingView.ts +25 -0
  85. package/front_end/panels/accessibility/AccessibilityNodeView.ts +36 -36
  86. package/front_end/panels/accessibility/AccessibilitySidebarView.ts +9 -0
  87. package/front_end/panels/accessibility/AccessibilityStrings.ts +168 -168
  88. package/front_end/panels/accessibility/SourceOrderView.ts +7 -7
  89. package/front_end/panels/accessibility/accessibility-meta.ts +2 -2
  90. package/front_end/panels/accessibility/accessibility.ts +2 -0
  91. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +5 -5
  92. package/front_end/panels/ai_assistance/components/AIv2MarkdownRenderer.ts +2 -3
  93. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
  94. package/front_end/panels/ai_assistance/components/ChatMessage.ts +92 -12
  95. package/front_end/panels/ai_assistance/components/chatMessage.css +6 -0
  96. package/front_end/panels/application/ApplicationPanelSidebar.ts +10 -4
  97. package/front_end/panels/application/IndexedDBViews.ts +65 -63
  98. package/front_end/panels/application/StorageView.ts +116 -45
  99. package/front_end/panels/application/WebMCPView.ts +16 -7
  100. package/front_end/panels/application/application-meta.ts +11 -0
  101. package/front_end/panels/application/components/AdsView.ts +1 -1
  102. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +5 -5
  103. package/front_end/panels/common/BadgeNotification.ts +8 -8
  104. package/front_end/panels/common/ExtensionPanel.ts +9 -8
  105. package/front_end/panels/common/ExtensionServer.ts +21 -1
  106. package/front_end/panels/common/GdpSignUpDialog.ts +16 -16
  107. package/front_end/panels/common/GeminiRebrandPromoDialog.ts +5 -6
  108. package/front_end/panels/common/PersistenceUtils.ts +2 -2
  109. package/front_end/panels/common/common.ts +0 -97
  110. package/front_end/panels/console/ConsoleInsightTeaser.ts +2 -2
  111. package/front_end/panels/console/ConsolePanel.ts +4 -0
  112. package/front_end/panels/console/ConsolePinPane.ts +2 -2
  113. package/front_end/panels/console/ConsolePrompt.ts +12 -0
  114. package/front_end/panels/console/ConsoleView.ts +31 -20
  115. package/front_end/panels/console/ConsoleViewMessage.ts +37 -13
  116. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +2 -2
  117. package/front_end/panels/css_overview/CSSOverviewModel.ts +1 -1
  118. package/front_end/panels/elements/ElementStatePaneWidget.ts +2 -1
  119. package/front_end/panels/elements/ElementsTreeElement.ts +455 -372
  120. package/front_end/panels/elements/LayoutPane.ts +2 -8
  121. package/front_end/panels/elements/StylePropertyTreeElement.ts +16 -15
  122. package/front_end/panels/elements/elements-meta.ts +152 -10
  123. package/front_end/panels/elements/elements.ts +0 -2
  124. package/front_end/panels/emulation/DeviceModeView.ts +9 -1
  125. package/front_end/panels/event_listeners/EventListenersView.ts +8 -4
  126. package/front_end/panels/issues/AffectedTrackingSitesView.ts +25 -14
  127. package/front_end/panels/lighthouse/LighthouseController.ts +3 -2
  128. package/front_end/panels/media/PlayerMessagesView.ts +149 -68
  129. package/front_end/panels/network/BinaryResourceView.ts +134 -81
  130. package/front_end/panels/network/EventSourceMessagesView.ts +10 -10
  131. package/front_end/panels/network/FetchHeaderCommenting.ts +291 -0
  132. package/front_end/panels/network/NetworkConfigView.ts +10 -10
  133. package/front_end/panels/network/NetworkDataGridNode.ts +14 -14
  134. package/front_end/panels/network/NetworkItemView.ts +27 -28
  135. package/front_end/panels/network/NetworkLogView.ts +137 -38
  136. package/front_end/panels/network/NetworkLogViewColumns.ts +35 -35
  137. package/front_end/panels/network/NetworkManageCustomHeadersView.ts +1 -1
  138. package/front_end/panels/network/NetworkPanel.ts +2 -2
  139. package/front_end/panels/network/RequestConditionsDrawer.ts +5 -5
  140. package/front_end/panels/network/RequestCookiesView.ts +4 -4
  141. package/front_end/panels/network/RequestHeadersView.ts +5 -5
  142. package/front_end/panels/network/RequestPayloadView.ts +4 -3
  143. package/front_end/panels/network/RequestTimingView.ts +8 -8
  144. package/front_end/panels/network/ResourceChunkView.ts +1 -1
  145. package/front_end/panels/network/ResourceDirectSocketChunkView.ts +1 -1
  146. package/front_end/panels/network/ResourceWebSocketFrameView.ts +16 -16
  147. package/front_end/panels/network/binaryResourceView.css +14 -12
  148. package/front_end/panels/network/components/DirectSocketConnectionView.ts +2 -2
  149. package/front_end/panels/network/components/HeaderSectionRow.ts +1 -1
  150. package/front_end/panels/network/components/RequestTrustTokensView.ts +2 -2
  151. package/front_end/panels/network/network-meta.ts +1 -1
  152. package/front_end/panels/network/network.ts +2 -0
  153. package/front_end/panels/profiler/HeapDetachedElementsDataGrid.ts +0 -1
  154. package/front_end/panels/profiler/HeapSnapshotView.ts +0 -2
  155. package/front_end/panels/profiler/heapProfiler.css +0 -9
  156. package/front_end/panels/recorder/RecorderPanel.ts +2 -3
  157. package/front_end/panels/screencast/ScreencastView.ts +148 -138
  158. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +2 -2
  159. package/front_end/panels/sources/BreakpointsView.ts +2 -2
  160. package/front_end/panels/sources/DebuggerPlugin.ts +10 -59
  161. package/front_end/panels/sources/NavigatorView.ts +2 -1
  162. package/front_end/panels/sources/ScopeChainSidebarPane.ts +1 -1
  163. package/front_end/panels/sources/SourcesPanel.ts +23 -73
  164. package/front_end/panels/sources/SourcesView.ts +248 -157
  165. package/front_end/panels/sources/TabbedEditorContainer.ts +118 -23
  166. package/front_end/panels/sources/UISourceCodeFrame.ts +5 -9
  167. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +4 -2
  168. package/front_end/panels/sources/sources-meta.ts +52 -0
  169. package/front_end/panels/timeline/TimelineController.ts +36 -64
  170. package/front_end/panels/timeline/TimelinePanel.ts +11 -8
  171. package/front_end/panels/timeline/TimelineUIUtils.ts +5 -2
  172. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +2 -2
  173. package/front_end/panels/timeline/timelinePanel.css +0 -10
  174. package/front_end/panels/utils/utils.ts +7 -7
  175. package/front_end/services/tracing/PerformanceTracing.ts +5 -17
  176. package/front_end/third_party/chromium/README.chromium +1 -1
  177. package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
  178. package/front_end/third_party/codemirror.next/chunk/codemirror.js.map +1 -1
  179. package/front_end/third_party/codemirror.next/package.json +2 -2
  180. package/front_end/third_party/codemirror.next/rebuild.sh +4 -1
  181. package/front_end/ui/comments/CommentAnchorResolver.ts +430 -35
  182. package/front_end/ui/comments/CommentOverlayManager.ts +635 -0
  183. package/front_end/ui/comments/CommentsOverlayWidget.ts +134 -0
  184. package/front_end/ui/comments/comments.ts +4 -0
  185. package/front_end/ui/comments/commentsOverlay.css +49 -0
  186. package/front_end/{panels/common → ui/components/dialogs}/FreDialog.ts +6 -6
  187. package/front_end/ui/components/dialogs/TypeToAllowDialog.ts +96 -0
  188. package/front_end/ui/components/dialogs/dialogs.ts +4 -0
  189. package/front_end/ui/components/settings/SettingCheckbox.ts +3 -3
  190. package/front_end/{panels/common → ui/components/text_editor}/AiCodeCompletionDisclaimer.ts +13 -13
  191. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +7 -6
  192. package/front_end/{panels/common → ui/components/text_editor}/AiCodeCompletionTeaser.ts +43 -46
  193. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +22 -26
  194. package/front_end/{panels/common → ui/components/text_editor}/AiCodeGenerationTeaser.ts +10 -10
  195. package/front_end/{panels/common → ui/components/text_editor}/AiCodeGenerationUpgradeDialog.ts +5 -5
  196. package/front_end/ui/components/text_editor/text_editor.ts +4 -0
  197. package/front_end/ui/legacy/Toolbar.ts +1 -1
  198. package/front_end/ui/legacy/UIUtils.ts +0 -56
  199. package/front_end/ui/legacy/View.ts +10 -4
  200. package/front_end/ui/legacy/Widget.ts +10 -1
  201. package/front_end/ui/legacy/components/color_picker/ContrastDetails.ts +2 -1
  202. package/front_end/ui/legacy/components/color_picker/ContrastOverlay.ts +5 -4
  203. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +11 -3
  204. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +507 -209
  205. package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +5 -0
  206. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +11 -16
  207. package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +5 -12
  208. package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.ts +38 -20
  209. package/front_end/ui/legacy/components/source_frame/JSONView.ts +12 -2
  210. package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +3 -3
  211. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +37 -6
  212. package/front_end/ui/legacy/components/source_frame/StreamingContentHexView.ts +22 -4
  213. package/front_end/ui/settings/SettingUIRegistration.ts +55 -6
  214. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
  215. package/mcp/mcp.ts +6 -1
  216. package/package.json +6 -6
  217. package/front_end/Images/toolbarResizerVertical.png +0 -0
  218. package/front_end/emulated_devices/MotoG4-landscape.svg +0 -155
  219. package/front_end/emulated_devices/MotoG4-portrait.svg +0 -155
  220. package/front_end/emulated_devices/Nexus5X-landscape.svg +0 -19
  221. package/front_end/emulated_devices/Nexus5X-portrait.svg +0 -19
  222. package/front_end/emulated_devices/Nexus6P-landscape.svg +0 -50
  223. package/front_end/emulated_devices/Nexus6P-portrait.svg +0 -54
  224. package/front_end/emulated_devices/google-nest-hub-horizontal.png +0 -0
  225. package/front_end/emulated_devices/google-nest-hub-max-horizontal.png +0 -0
  226. package/front_end/emulated_devices/google-nexus-5-horizontal-default-1x.png +0 -0
  227. package/front_end/emulated_devices/google-nexus-5-horizontal-default-2x.png +0 -0
  228. package/front_end/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png +0 -0
  229. package/front_end/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png +0 -0
  230. package/front_end/emulated_devices/google-nexus-5-horizontal-navigation-1x.png +0 -0
  231. package/front_end/emulated_devices/google-nexus-5-horizontal-navigation-2x.png +0 -0
  232. package/front_end/emulated_devices/google-nexus-5-vertical-default-1x.png +0 -0
  233. package/front_end/emulated_devices/google-nexus-5-vertical-default-2x.png +0 -0
  234. package/front_end/emulated_devices/google-nexus-5-vertical-keyboard-1x.png +0 -0
  235. package/front_end/emulated_devices/google-nexus-5-vertical-keyboard-2x.png +0 -0
  236. package/front_end/emulated_devices/google-nexus-5-vertical-navigation-1x.png +0 -0
  237. package/front_end/emulated_devices/google-nexus-5-vertical-navigation-2x.png +0 -0
  238. package/front_end/emulated_devices/google-nexus-5x-horizontal-default-1x.png +0 -0
  239. package/front_end/emulated_devices/google-nexus-5x-horizontal-default-2x.png +0 -0
  240. package/front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png +0 -0
  241. package/front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png +0 -0
  242. package/front_end/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png +0 -0
  243. package/front_end/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png +0 -0
  244. package/front_end/emulated_devices/google-nexus-5x-vertical-default-1x.png +0 -0
  245. package/front_end/emulated_devices/google-nexus-5x-vertical-default-2x.png +0 -0
  246. package/front_end/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png +0 -0
  247. package/front_end/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png +0 -0
  248. package/front_end/emulated_devices/google-nexus-5x-vertical-navigation-1x.png +0 -0
  249. package/front_end/emulated_devices/google-nexus-5x-vertical-navigation-2x.png +0 -0
  250. package/front_end/emulated_devices/iPad-landscape.svg +0 -73
  251. package/front_end/emulated_devices/iPad-portrait.svg +0 -76
  252. package/front_end/emulated_devices/iPhone5-landscape.svg +0 -99
  253. package/front_end/emulated_devices/iPhone5-portrait.svg +0 -83
  254. package/front_end/emulated_devices/iPhone6-landscape.svg +0 -111
  255. package/front_end/emulated_devices/iPhone6-portrait.svg +0 -116
  256. package/front_end/emulated_devices/iPhone6Plus-landscape.svg +0 -118
  257. package/front_end/emulated_devices/iPhone6Plus-portrait.svg +0 -116
  258. package/front_end/emulated_devices/optimized/MotoG4-landscape.avif +0 -0
  259. package/front_end/emulated_devices/optimized/MotoG4-portrait.avif +0 -0
  260. package/front_end/emulated_devices/optimized/Nexus5X-landscape.avif +0 -0
  261. package/front_end/emulated_devices/optimized/Nexus5X-portrait.avif +0 -0
  262. package/front_end/emulated_devices/optimized/Nexus6P-landscape.avif +0 -0
  263. package/front_end/emulated_devices/optimized/Nexus6P-portrait.avif +0 -0
  264. package/front_end/emulated_devices/optimized/README.md +0 -9
  265. package/front_end/emulated_devices/optimized/google-nest-hub-horizontal.avif +0 -0
  266. package/front_end/emulated_devices/optimized/google-nest-hub-max-horizontal.avif +0 -0
  267. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-default-1x.avif +0 -0
  268. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-default-2x.avif +0 -0
  269. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-1x.avif +0 -0
  270. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-2x.avif +0 -0
  271. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-navigation-1x.avif +0 -0
  272. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-navigation-2x.avif +0 -0
  273. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-default-1x.avif +0 -0
  274. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-default-2x.avif +0 -0
  275. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-keyboard-1x.avif +0 -0
  276. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-keyboard-2x.avif +0 -0
  277. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-navigation-1x.avif +0 -0
  278. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-navigation-2x.avif +0 -0
  279. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-default-1x.avif +0 -0
  280. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-default-2x.avif +0 -0
  281. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-1x.avif +0 -0
  282. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-2x.avif +0 -0
  283. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-1x.avif +0 -0
  284. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-2x.avif +0 -0
  285. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-default-1x.avif +0 -0
  286. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-default-2x.avif +0 -0
  287. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-1x.avif +0 -0
  288. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-2x.avif +0 -0
  289. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-navigation-1x.avif +0 -0
  290. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-navigation-2x.avif +0 -0
  291. package/front_end/emulated_devices/optimized/iPad-landscape.avif +0 -0
  292. package/front_end/emulated_devices/optimized/iPad-portrait.avif +0 -0
  293. package/front_end/emulated_devices/optimized/iPhone5-landscape.avif +0 -0
  294. package/front_end/emulated_devices/optimized/iPhone5-portrait.avif +0 -0
  295. package/front_end/emulated_devices/optimized/iPhone6-landscape.avif +0 -0
  296. package/front_end/emulated_devices/optimized/iPhone6-portrait.avif +0 -0
  297. package/front_end/emulated_devices/optimized/iPhone6Plus-landscape.avif +0 -0
  298. package/front_end/emulated_devices/optimized/iPhone6Plus-portrait.avif +0 -0
  299. package/front_end/emulated_devices/optimized/optimized_images.gni +0 -53
  300. package/front_end/models/ai_assistance/agents/README.md +0 -136
  301. package/front_end/panels/elements/ElementsTreeOutlineRenderer.ts +0 -89
  302. package/front_end/ui/legacy/components/object_ui/object_ui-meta.ts +0 -27
  303. /package/front_end/{panels/common → ui/components/dialogs}/freDialog.css +0 -0
  304. /package/front_end/{panels/common/common.css → ui/components/dialogs/typeToAllowDialog.css} +0 -0
  305. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeCompletionDisclaimer.css +0 -0
  306. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeCompletionTeaser.css +0 -0
  307. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeGenerationTeaser.css +0 -0
  308. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeGenerationUpgradeDialog.css +0 -0
@@ -0,0 +1,635 @@
1
+ // Copyright 2026 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import * as Common from '../../core/common/common.js';
6
+ import * as CommentManager from '../../models/comment_manager/comment_manager.js';
7
+
8
+ import {
9
+ type CommentThread,
10
+ deepQuerySelectorAll,
11
+ isElementVisible,
12
+ rematchCommentAnchor,
13
+ resolveCommentAnchor,
14
+ resolveCommentAnchorElement,
15
+ } from './CommentAnchorResolver.js';
16
+
17
+ export interface StartOptions {
18
+ root?: Document|Element;
19
+ scrollTarget?: EventTarget;
20
+ resizeTarget?: Element;
21
+ defaultText?: string;
22
+ }
23
+
24
+ export interface PinPositionData {
25
+ id: string;
26
+ top: number;
27
+ left: number;
28
+ visible: boolean;
29
+ }
30
+
31
+ export interface HighlightRectData {
32
+ id: string;
33
+ top: number;
34
+ left: number;
35
+ width: number;
36
+ height: number;
37
+ visible: boolean;
38
+ }
39
+
40
+ export interface HoverHighlightData {
41
+ top: number;
42
+ left: number;
43
+ width: number;
44
+ height: number;
45
+ visible: boolean;
46
+ }
47
+
48
+ export const enum Events {
49
+ POSITIONS_UPDATED = 'PositionsUpdated',
50
+ HOVER_HIGHLIGHT_CHANGED = 'HoverHighlightChanged',
51
+ }
52
+
53
+ export interface EventTypes {
54
+ [Events.POSITIONS_UPDATED]: {
55
+ pins: PinPositionData[],
56
+ highlights: HighlightRectData[],
57
+ };
58
+ [Events.HOVER_HIGHLIGHT_CHANGED]: HoverHighlightData|null;
59
+ }
60
+
61
+ /**
62
+ * Orchestrates live DOM overlay positioning, coordinates interactive commenting UI mode,
63
+ * and tracks live DOM element positions via observers and event listeners.
64
+ */
65
+ export class CommentOverlayManager extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
66
+ readonly #commentManager: CommentManager.CommentManager.CommentManager;
67
+
68
+ readonly #liveNodeCache = new WeakMap<CommentThread, Element>();
69
+ #observedThreads = new WeakSet<Element>();
70
+ #intersectionObserver?: IntersectionObserver;
71
+
72
+ #hoverData: HoverHighlightData|null = null;
73
+ #pinPositions: PinPositionData[] = [];
74
+ #highlightRects: HighlightRectData[] = [];
75
+
76
+ #clickListener?: (event: Event) => void;
77
+ #hoverListener?: (event: Event) => void;
78
+ #suppressListener?: (event: Event) => void;
79
+ #clickContainer?: Element|Document;
80
+
81
+ readonly #hoverEventTypes = [
82
+ 'mouseover',
83
+ 'mouseout',
84
+ 'mouseenter',
85
+ 'mouseleave',
86
+ 'pointerover',
87
+ 'pointerout',
88
+ 'mousemove',
89
+ ];
90
+ readonly #suppressEventTypes = [
91
+ 'mousedown',
92
+ 'pointerdown',
93
+ 'mouseup',
94
+ 'pointerup',
95
+ 'dblclick',
96
+ ];
97
+
98
+ #scrollListener?: (event: Event) => void;
99
+ #scrollTarget?: EventTarget;
100
+ #scrollRafId?: number;
101
+
102
+ #devToolsResizeObserver?: ResizeObserver;
103
+ #resizeRafId?: number;
104
+
105
+ #mutationObserver?: MutationObserver;
106
+ #rematchTimeoutId?: ReturnType<typeof setTimeout>;
107
+
108
+ constructor(commentManager: CommentManager.CommentManager.CommentManager) {
109
+ super();
110
+ this.#commentManager = commentManager;
111
+ this.#commentManager.addEventListener(
112
+ CommentManager.CommentManager.Events.COMMENT_THREADS_CHANGED,
113
+ () => {
114
+ this.#updatePositions();
115
+ },
116
+ this,
117
+ );
118
+ this.#commentManager.addEventListener(
119
+ CommentManager.CommentManager.Events.COMMENT_MODE_CHANGED,
120
+ ({data: active}) => {
121
+ if (!active) {
122
+ this.#setHoverHighlight(null);
123
+ }
124
+ document.body.style.cursor = active ? 'crosshair' : '';
125
+ },
126
+ this,
127
+ );
128
+ }
129
+
130
+ get commentManager(): CommentManager.CommentManager.CommentManager {
131
+ return this.#commentManager;
132
+ }
133
+
134
+ /**
135
+ * Lazily creates an IntersectionObserver that monitors the visibility and viewport intersection
136
+ * of elements with active comment anchors.
137
+ *
138
+ * As anchored DOM nodes scroll in or out of visible viewport regions or virtualized lists,
139
+ * the observer triggers position recalculations to ensure comment pins and highlights are
140
+ * positioned accurately or hidden when out of view.
141
+ */
142
+ #getIntersectionObserver(): IntersectionObserver {
143
+ if (!this.#intersectionObserver) {
144
+ this.#intersectionObserver = new IntersectionObserver(() => {
145
+ this.#updatePositions();
146
+ });
147
+ }
148
+ return this.#intersectionObserver;
149
+ }
150
+
151
+ setCommentMode(active: boolean): void {
152
+ this.#commentManager.setCommentMode(active);
153
+ }
154
+
155
+ isCommentMode(): boolean {
156
+ return this.#commentManager.isCommentMode();
157
+ }
158
+
159
+ #setHoverHighlight(data: HoverHighlightData|null): void {
160
+ if (data === null && this.#hoverData === null) {
161
+ return;
162
+ }
163
+ if (data && this.#hoverData && data.top === this.#hoverData.top && data.left === this.#hoverData.left &&
164
+ data.width === this.#hoverData.width && data.height === this.#hoverData.height &&
165
+ data.visible === this.#hoverData.visible) {
166
+ return;
167
+ }
168
+ this.#hoverData = data;
169
+ this.dispatchEventToListeners(Events.HOVER_HIGHLIGHT_CHANGED, data);
170
+ }
171
+
172
+ getHoverHighlight(): HoverHighlightData|null {
173
+ return this.#hoverData;
174
+ }
175
+
176
+ getPinPositions(): PinPositionData[] {
177
+ return this.#pinPositions;
178
+ }
179
+
180
+ getHighlightRects(): HighlightRectData[] {
181
+ return this.#highlightRects;
182
+ }
183
+
184
+ handleElementClick(element: Element, commentText = 'New comment'): CommentThread|null {
185
+ if (!this.isCommentMode()) {
186
+ return null;
187
+ }
188
+ return this.createComment(element, commentText, 'DEVELOPER');
189
+ }
190
+
191
+ createComment(
192
+ element: Element,
193
+ text: string,
194
+ author: 'DEVELOPER'|'AGENT' = 'DEVELOPER',
195
+ changes?: Array<Record<string, unknown>>,
196
+ ): CommentThread|null {
197
+ const anchorEl = resolveCommentAnchorElement(element);
198
+ const anchor = resolveCommentAnchor(element);
199
+ if (!anchor || !anchorEl) {
200
+ return null;
201
+ }
202
+
203
+ const thread = this.#commentManager.createCommentThread(anchor, text, author, changes);
204
+ this.#liveNodeCache.set(thread, anchorEl);
205
+
206
+ const observer = this.#getIntersectionObserver();
207
+ observer.observe(anchorEl);
208
+ this.#observedThreads.add(anchorEl);
209
+
210
+ this.#updatePositions();
211
+ return thread;
212
+ }
213
+
214
+ getCommentThread(id: string): CommentThread|undefined {
215
+ return this.#commentManager.getCommentThread(id);
216
+ }
217
+
218
+ getCommentThreads(): CommentThread[] {
219
+ return this.#commentManager.getCommentThreads();
220
+ }
221
+
222
+ removeCommentThread(id: string): void {
223
+ const thread = this.#commentManager.getCommentThread(id);
224
+ if (!thread) {
225
+ return;
226
+ }
227
+ const el = this.#liveNodeCache.get(thread);
228
+ this.#liveNodeCache.delete(thread);
229
+
230
+ if (el && this.#intersectionObserver) {
231
+ let isElementStillObserved = false;
232
+ for (const remainingThread of this.#commentManager.getCommentThreads()) {
233
+ if (remainingThread.id !== id && this.#liveNodeCache.get(remainingThread) === el) {
234
+ isElementStillObserved = true;
235
+ break;
236
+ }
237
+ }
238
+ if (!isElementStillObserved) {
239
+ this.#intersectionObserver.unobserve(el);
240
+ this.#observedThreads.delete(el);
241
+ }
242
+ }
243
+
244
+ this.#commentManager.removeCommentThread(id);
245
+ }
246
+
247
+ /**
248
+ * Rematches stored comments to live DOM nodes across dynamic container updates.
249
+ *
250
+ * Pre-queries [jslog] elements once across the container to avoid redundant deep DOM traversals
251
+ * during batch rematching, and cleans up unobserved IntersectionObserver nodes in O(N) time.
252
+ */
253
+ #rematchAllComments(root: Document|Element = document): void {
254
+ const jslogElements = deepQuerySelectorAll(root, '[jslog]');
255
+ const oldElements = new Set<Element>();
256
+ const newElements = new Set<Element>();
257
+
258
+ for (const thread of this.#commentManager.getCommentThreads()) {
259
+ const oldEl = this.#liveNodeCache.get(thread);
260
+ if (oldEl) {
261
+ oldElements.add(oldEl);
262
+ }
263
+ // Always try to rematch to support virtualized lists where DOM nodes are recycled.
264
+ const el = rematchCommentAnchor(thread, root, jslogElements);
265
+
266
+ if (el) {
267
+ this.#liveNodeCache.set(thread, el);
268
+ newElements.add(el);
269
+ } else {
270
+ this.#liveNodeCache.delete(thread);
271
+ }
272
+ }
273
+
274
+ if (this.#intersectionObserver) {
275
+ // Unobserve old elements no longer referenced by any comment thread in O(N) time.
276
+ for (const oldEl of oldElements) {
277
+ if (!newElements.has(oldEl)) {
278
+ this.#intersectionObserver.unobserve(oldEl);
279
+ this.#observedThreads.delete(oldEl);
280
+ }
281
+ }
282
+ }
283
+
284
+ this.#updatePositions();
285
+ }
286
+
287
+ #updatePositions(): void {
288
+ const scrollX = window.scrollX;
289
+ const scrollY = window.scrollY;
290
+
291
+ const newPins: PinPositionData[] = [];
292
+ const newHighlights: HighlightRectData[] = [];
293
+ const elementPinCounts = new Map<Element, number>();
294
+
295
+ for (const thread of this.#commentManager.getCommentThreads()) {
296
+ const el = this.#liveNodeCache.get(thread) || null;
297
+ if (!el || !el.isConnected) {
298
+ continue;
299
+ }
300
+
301
+ const observer = this.#getIntersectionObserver();
302
+ if (!this.#observedThreads.has(el)) {
303
+ observer.observe(el);
304
+ this.#observedThreads.add(el);
305
+ }
306
+
307
+ if (!isElementVisible(el)) {
308
+ continue;
309
+ }
310
+
311
+ const rect = el.getBoundingClientRect();
312
+ const offsetIndex = elementPinCounts.get(el) || 0;
313
+ elementPinCounts.set(el, offsetIndex + 1);
314
+ // Offset by 26px vertically (24px pin icon height + 2px spacing) so multiple comment pins on the same element stack vertically without overlapping.
315
+ const offsetY = offsetIndex * 26;
316
+
317
+ // Offset by -12px (half of the 24px pin diameter) so the pin icon is centered on the top-right corner of the target element.
318
+ newPins.push({
319
+ id: thread.id,
320
+ top: scrollY + rect.top - 12 + offsetY,
321
+ left: scrollX + rect.right - 12,
322
+ visible: true,
323
+ });
324
+
325
+ newHighlights.push({
326
+ id: thread.id,
327
+ top: scrollY + rect.top,
328
+ left: scrollX + rect.left,
329
+ width: rect.width,
330
+ height: rect.height,
331
+ visible: true,
332
+ });
333
+ }
334
+
335
+ this.#pinPositions = newPins;
336
+ this.#highlightRects = newHighlights;
337
+ this.dispatchEventToListeners(Events.POSITIONS_UPDATED, {
338
+ pins: newPins,
339
+ highlights: newHighlights,
340
+ });
341
+ }
342
+
343
+ /**
344
+ * Initializes event listeners and lifecycle observers across the target DOM container.
345
+ *
346
+ * Sets up:
347
+ * - Capturing click, hover, and interaction suppression handlers to coordinate comment placement.
348
+ * - A capturing scroll listener on the window to track scrolling across nested subpanes.
349
+ * - A ResizeObserver to recalculate overlay coordinates when DevTools panels or drawers are resized.
350
+ * - A MutationObserver to automatically rematch existing comment anchors when the DOM re-renders.
351
+ */
352
+ start(rootOrOptions?: Document|Element|StartOptions, defaultText = 'New comment'): void {
353
+ let root: Document|Element|undefined;
354
+ let scrollTarget: EventTarget|undefined;
355
+ let resizeTarget: Element|undefined;
356
+ let text = defaultText;
357
+
358
+ if (rootOrOptions && !(rootOrOptions instanceof Document) && !(rootOrOptions instanceof Element)) {
359
+ root = rootOrOptions.root;
360
+ scrollTarget = rootOrOptions.scrollTarget;
361
+ resizeTarget = rootOrOptions.resizeTarget;
362
+ text = rootOrOptions.defaultText ?? defaultText;
363
+ } else if (rootOrOptions) {
364
+ root = rootOrOptions;
365
+ }
366
+
367
+ root = root || document;
368
+ scrollTarget = scrollTarget || (root instanceof Document ? (root.defaultView || window) : window);
369
+ resizeTarget = resizeTarget || (root instanceof Document ? (root.body || root.documentElement) : root);
370
+
371
+ this.stop();
372
+ this.#installClickListener(root, text);
373
+ this.#installScrollListener(scrollTarget);
374
+ this.#installResizeObserver(resizeTarget);
375
+ this.#installMutationObserver(root);
376
+ }
377
+
378
+ /**
379
+ * Stops and detaches all active listeners and observers without clearing comment threads.
380
+ */
381
+ stop(): void {
382
+ this.#removeClickListener();
383
+ this.#removeScrollListener();
384
+ this.#removeResizeObserver();
385
+ this.#removeMutationObserver();
386
+ }
387
+
388
+ /**
389
+ * Sets up capturing click, hover, and pointer interaction listeners on the container.
390
+ *
391
+ * When Comment Mode is active:
392
+ * - Clicks on anchorable elements create new comment threads and consume the click event,
393
+ * preventing normal DevTools UI triggers such as node selection or navigation.
394
+ * - Pointer and mouse press events are suppressed to prevent accidental text selections or drag interactions.
395
+ * - Hover events compute and display a real-time preview highlight over the candidate anchor element.
396
+ */
397
+ #installClickListener(container: Element|Document = document, defaultText = 'New comment'): void {
398
+ this.#removeClickListener();
399
+ this.#clickContainer = container;
400
+
401
+ this.#clickListener = (event: Event): void => {
402
+ if (!this.isCommentMode()) {
403
+ return;
404
+ }
405
+ const composedTarget = event.composedPath()[0];
406
+ const target = (composedTarget instanceof Element) ? composedTarget : event.target;
407
+ if (!(target instanceof Element)) {
408
+ return;
409
+ }
410
+ const thread = this.handleElementClick(target, defaultText);
411
+ if (thread) {
412
+ event.consume(true);
413
+ }
414
+ };
415
+
416
+ this.#suppressListener = (event: Event): void => {
417
+ if (!this.isCommentMode()) {
418
+ return;
419
+ }
420
+ const composedTarget = event.composedPath()[0];
421
+ const target = (composedTarget instanceof Element) ? composedTarget : event.target;
422
+ if (!(target instanceof Element)) {
423
+ return;
424
+ }
425
+ const anchorEl = resolveCommentAnchorElement(target);
426
+ if (anchorEl) {
427
+ event.consume(true);
428
+ }
429
+ };
430
+
431
+ this.#hoverListener = (event: Event): void => {
432
+ if (!this.isCommentMode()) {
433
+ this.#setHoverHighlight(null);
434
+ return;
435
+ }
436
+ const composedTarget = event.composedPath()[0];
437
+ const target = (composedTarget instanceof Element) ? composedTarget : event.target;
438
+ if (!(target instanceof Element)) {
439
+ this.#setHoverHighlight(null);
440
+ return;
441
+ }
442
+ const isLeaveEvent = event.type === 'mouseout' || event.type === 'mouseleave' || event.type === 'pointerout';
443
+ const anchorEl = resolveCommentAnchorElement(target);
444
+ if (isLeaveEvent) {
445
+ const relatedTarget = (event as MouseEvent | PointerEvent).relatedTarget;
446
+ if (anchorEl && relatedTarget instanceof Node && anchorEl.contains(relatedTarget)) {
447
+ event.consume(true);
448
+ return;
449
+ }
450
+
451
+ this.#setHoverHighlight(null);
452
+ if (anchorEl) {
453
+ event.consume(true);
454
+ }
455
+ return;
456
+ }
457
+ if (anchorEl) {
458
+ const cmLine = target.closest('.cm-line');
459
+ const highlightTarget = (cmLine && anchorEl.classList.contains('cm-editor')) ? cmLine : anchorEl;
460
+ const rect = highlightTarget.getBoundingClientRect();
461
+ const scrollX = window.scrollX;
462
+ const scrollY = window.scrollY;
463
+ this.#setHoverHighlight({
464
+ top: scrollY + rect.top,
465
+ left: scrollX + rect.left,
466
+ width: rect.width,
467
+ height: rect.height,
468
+ visible: true,
469
+ });
470
+ event.consume(true);
471
+ } else {
472
+ this.#setHoverHighlight(null);
473
+ }
474
+ };
475
+
476
+ container.addEventListener('click', this.#clickListener, {capture: true});
477
+ for (const type of this.#suppressEventTypes) {
478
+ container.addEventListener(type, this.#suppressListener, {capture: true});
479
+ }
480
+ for (const type of this.#hoverEventTypes) {
481
+ container.addEventListener(type, this.#hoverListener, {capture: true});
482
+ }
483
+ }
484
+
485
+ #removeClickListener(): void {
486
+ if (this.#clickContainer) {
487
+ if (this.#clickListener) {
488
+ this.#clickContainer.removeEventListener('click', this.#clickListener, {capture: true});
489
+ }
490
+ if (this.#suppressListener) {
491
+ for (const type of this.#suppressEventTypes) {
492
+ this.#clickContainer.removeEventListener(type, this.#suppressListener, {capture: true});
493
+ }
494
+ }
495
+ if (this.#hoverListener) {
496
+ for (const type of this.#hoverEventTypes) {
497
+ this.#clickContainer.removeEventListener(type, this.#hoverListener, {capture: true});
498
+ }
499
+ }
500
+ this.#clickListener = undefined;
501
+ this.#suppressListener = undefined;
502
+ this.#hoverListener = undefined;
503
+ this.#clickContainer = undefined;
504
+ }
505
+ }
506
+
507
+ /**
508
+ * Registers a capturing scroll listener on the window or target container.
509
+ *
510
+ * Because DevTools contains multiple independently scrolling subpanes (such as the Elements tree,
511
+ * Sources editor, and Network list), a capturing listener on the top-level window catches scroll
512
+ * events anywhere in the tree and schedules a throttled position update using requestAnimationFrame.
513
+ */
514
+ #installScrollListener(target: EventTarget = window): void {
515
+ this.#removeScrollListener();
516
+ this.#scrollTarget = target;
517
+ this.#scrollListener = (): void => {
518
+ this.#setHoverHighlight(null);
519
+ if (this.#scrollRafId !== undefined) {
520
+ cancelAnimationFrame(this.#scrollRafId);
521
+ }
522
+ this.#scrollRafId = requestAnimationFrame(() => {
523
+ this.#scrollRafId = undefined;
524
+ this.#updatePositions();
525
+ });
526
+ };
527
+ target.addEventListener('scroll', this.#scrollListener, {capture: true, passive: true});
528
+ }
529
+
530
+ #removeScrollListener(): void {
531
+ if (this.#scrollTarget && this.#scrollListener) {
532
+ this.#scrollTarget.removeEventListener('scroll', this.#scrollListener, {capture: true});
533
+ this.#scrollListener = undefined;
534
+ this.#scrollTarget = undefined;
535
+ }
536
+ if (this.#scrollRafId !== undefined) {
537
+ cancelAnimationFrame(this.#scrollRafId);
538
+ this.#scrollRafId = undefined;
539
+ }
540
+ }
541
+
542
+ /**
543
+ * Observes dimensions of the root element to react to layout changes.
544
+ *
545
+ * Resizing DevTools windows, adjusting drawer splitters, or toggling sidebars alters the bounding
546
+ * boxes of anchored elements. The observer ensures overlay pins and highlight boxes are updated
547
+ * whenever container dimensions change.
548
+ */
549
+ #installResizeObserver(element: Element = document.body): void {
550
+ this.#removeResizeObserver();
551
+ this.#devToolsResizeObserver = new ResizeObserver(() => {
552
+ this.#setHoverHighlight(null);
553
+ if (this.#resizeRafId !== undefined) {
554
+ cancelAnimationFrame(this.#resizeRafId);
555
+ }
556
+ this.#resizeRafId = requestAnimationFrame(() => {
557
+ this.#resizeRafId = undefined;
558
+ this.#updatePositions();
559
+ });
560
+ });
561
+ this.#devToolsResizeObserver.observe(element);
562
+ }
563
+
564
+ #removeResizeObserver(): void {
565
+ if (this.#devToolsResizeObserver) {
566
+ this.#devToolsResizeObserver.disconnect();
567
+ this.#devToolsResizeObserver = undefined;
568
+ }
569
+ if (this.#resizeRafId !== undefined) {
570
+ cancelAnimationFrame(this.#resizeRafId);
571
+ this.#resizeRafId = undefined;
572
+ }
573
+ }
574
+
575
+ /**
576
+ * Debounces rematching of comments across dynamic DOM updates.
577
+ */
578
+ #scheduleRematch(root: Document|Element = document): void {
579
+ if (this.#rematchTimeoutId) {
580
+ clearTimeout(this.#rematchTimeoutId);
581
+ }
582
+ this.#rematchTimeoutId = setTimeout(() => {
583
+ this.#rematchTimeoutId = undefined;
584
+ this.#rematchAllComments(root);
585
+ }, 250);
586
+ }
587
+
588
+ /**
589
+ * Monitors DOM tree additions, removals, and attribute mutations across the container.
590
+ *
591
+ * DevTools inspector panes dynamically re-render items when expanding trees, filtering results,
592
+ * or updating state. By observing child list mutations and key domain attributes (`jslog`,
593
+ * `data-network-request-id`, `data-backend-node-id`, `aria-expanded`), the manager schedules a
594
+ * debounced rematch so comments remain bound to their corresponding live DOM elements.
595
+ */
596
+ #installMutationObserver(root: Document|Element = document): void {
597
+ this.#removeMutationObserver();
598
+ this.#mutationObserver = new MutationObserver(() => {
599
+ this.#scheduleRematch(root);
600
+ });
601
+ const targetNode = root instanceof Document ? (root.body || root.documentElement) : root;
602
+ this.#mutationObserver.observe(targetNode, {
603
+ childList: true,
604
+ subtree: true,
605
+ attributes: true,
606
+ attributeFilter: ['jslog', 'data-network-request-id', 'data-backend-node-id', 'aria-expanded'],
607
+ });
608
+ }
609
+
610
+ #removeMutationObserver(): void {
611
+ if (this.#mutationObserver) {
612
+ this.#mutationObserver.disconnect();
613
+ this.#mutationObserver = undefined;
614
+ }
615
+ if (this.#rematchTimeoutId) {
616
+ clearTimeout(this.#rematchTimeoutId);
617
+ this.#rematchTimeoutId = undefined;
618
+ }
619
+ }
620
+
621
+ /**
622
+ * Fully resets the manager by disabling comment mode, disconnecting all observers and listeners,
623
+ * and purging all active comment threads and overlay data.
624
+ */
625
+ clear(): void {
626
+ this.#commentManager.clear();
627
+ this.stop();
628
+ this.#intersectionObserver?.disconnect();
629
+ this.#intersectionObserver = undefined;
630
+ this.#observedThreads = new WeakSet();
631
+ this.#pinPositions = [];
632
+ this.#highlightRects = [];
633
+ this.#updatePositions();
634
+ }
635
+ }