chrome-devtools-frontend 1.0.1690116 → 1.0.1695017

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 (421) hide show
  1. package/.agents/skills/devtools-model-management/SKILL.md +3 -3
  2. package/.agents/skills/foundation-test-migration/SKILL.md +2 -2
  3. package/.agents/skills/merging-devtools-module/SKILL.md +5 -5
  4. package/AUTHORS +3 -0
  5. package/config/typescript/tsconfig.base.json +1 -0
  6. package/docs/get_the_code.md +4 -9
  7. package/front_end/Images/src/comment-mode-cursor.svg +23 -0
  8. package/front_end/Tests.js +1 -1
  9. package/front_end/application_tokens.css +5 -0
  10. package/front_end/core/common/ColorConverter.ts +3 -3
  11. package/front_end/core/host/UserMetrics.ts +27 -0
  12. package/front_end/core/protocol_client/DevToolsCDPConnection.ts +0 -46
  13. package/front_end/core/protocol_client/InspectorBackend.ts +6 -6
  14. package/front_end/core/root/Runtime.ts +1 -0
  15. package/front_end/core/sdk/CSSLocation.ts +32 -0
  16. package/front_end/core/sdk/CSSModel.ts +2 -22
  17. package/front_end/core/sdk/CSSQuery.ts +2 -1
  18. package/front_end/core/sdk/CSSRule.ts +29 -0
  19. package/front_end/core/sdk/DebuggerModel.ts +5 -1
  20. package/front_end/core/sdk/NetworkManager.ts +2 -0
  21. package/front_end/core/sdk/NetworkRequest.ts +63 -4
  22. package/front_end/core/sdk/NetworkRequestAccess.ts +191 -0
  23. package/front_end/core/sdk/ResourceTreeModel.ts +72 -23
  24. package/front_end/core/sdk/SecurityOrigin.ts +97 -12
  25. package/front_end/core/sdk/Target.ts +18 -0
  26. package/front_end/core/sdk/sdk.ts +4 -0
  27. package/front_end/entrypoints/main/MainImpl.ts +8 -1
  28. package/front_end/foundation/Universe.ts +14 -11
  29. package/front_end/generated/Deprecation.ts +8 -0
  30. package/front_end/generated/InspectorBackendCommands.ts +9 -8
  31. package/front_end/generated/SupportedCSSProperties.ts +14 -4
  32. package/front_end/generated/protocol.ts +24 -0
  33. package/front_end/models/ai_assistance/AiAgent2.ts +46 -10
  34. package/front_end/models/ai_assistance/AiConversation.ts +35 -24
  35. package/front_end/models/ai_assistance/README.md +5 -3
  36. package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +1 -0
  37. package/front_end/models/ai_assistance/agents/AiAgent.ts +28 -34
  38. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +13 -17
  39. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +5 -3
  40. package/front_end/models/ai_assistance/agents/StorageAgent.ts +16 -10
  41. package/front_end/models/ai_assistance/agents/StylingAgent.ts +3 -4
  42. package/front_end/models/ai_assistance/ai_assistance.ts +0 -2
  43. package/front_end/models/ai_assistance/contexts/AccessibilityContext.ts +11 -2
  44. package/front_end/models/ai_assistance/contexts/DOMNodeContext.ts +17 -5
  45. package/front_end/models/ai_assistance/contexts/FileContext.ts +13 -6
  46. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +52 -25
  47. package/front_end/models/ai_assistance/contexts/RequestContext.ts +18 -34
  48. package/front_end/models/ai_assistance/contexts/StorageContext.ts +14 -3
  49. package/front_end/models/ai_assistance/data_formatters/FileFormatter.ts +2 -5
  50. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +135 -58
  51. package/front_end/models/ai_assistance/tools/CookieUtils.ts +25 -35
  52. package/front_end/models/ai_assistance/tools/DOMStorageUtils.ts +6 -3
  53. package/front_end/models/ai_assistance/tools/ExecuteJavaScript.ts +9 -2
  54. package/front_end/models/ai_assistance/tools/GetCookieValues.ts +1 -1
  55. package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +3 -2
  56. package/front_end/models/ai_assistance/tools/GetFunctionCode.ts +3 -5
  57. package/front_end/models/ai_assistance/tools/GetInsightDetails.ts +1 -1
  58. package/front_end/models/ai_assistance/tools/GetNetworkRequestDetails.ts +8 -11
  59. package/front_end/models/ai_assistance/tools/GetResourceContent.ts +2 -4
  60. package/front_end/models/ai_assistance/tools/GetSourceContent.ts +6 -13
  61. package/front_end/models/ai_assistance/tools/GetStorageBreakdown.ts +1 -1
  62. package/front_end/models/ai_assistance/tools/GetStorageValues.ts +9 -9
  63. package/front_end/models/ai_assistance/tools/GetStyles.ts +3 -2
  64. package/front_end/models/ai_assistance/tools/ListCookies.ts +1 -1
  65. package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +6 -14
  66. package/front_end/models/ai_assistance/tools/ListPageOrigins.ts +10 -15
  67. package/front_end/models/ai_assistance/tools/ListSources.ts +5 -7
  68. package/front_end/models/ai_assistance/tools/ListStorageKeys.ts +9 -9
  69. package/front_end/models/ai_assistance/tools/README.md +4 -2
  70. package/front_end/models/ai_assistance/tools/ResolveDevtoolsNodePath.ts +3 -2
  71. package/front_end/models/ai_assistance/tools/Tool.ts +27 -3
  72. package/front_end/models/comment_manager/CD4ABridge.ts +128 -0
  73. package/front_end/models/comment_manager/CommentManager.ts +50 -8
  74. package/front_end/models/comment_manager/comment_manager.ts +2 -0
  75. package/front_end/models/emulation/DeviceModeModel.ts +37 -47
  76. package/front_end/models/javascript_metadata/NativeFunctions.ts +9 -1
  77. package/front_end/models/live-metrics/web-vitals-injected/README.md +1 -1
  78. package/front_end/models/source_map_scopes/NamesResolver.ts +9 -7
  79. package/front_end/models/trace/ModelImpl.ts +2 -0
  80. package/front_end/models/trace/Processor.ts +6 -4
  81. package/front_end/models/trace/handlers/LayerTreeHandler.ts +3 -3
  82. package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +1 -1
  83. package/front_end/models/trace/helpers/SyntheticEvents.ts +23 -1
  84. package/front_end/models/trace/types/Configuration.ts +7 -0
  85. package/front_end/models/trace/types/TraceEvents.ts +20 -4
  86. package/front_end/panels/accessibility/ARIAAttributesView.ts +3 -0
  87. package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingListView.ts +177 -0
  88. package/front_end/panels/accessibility/accessibility.ts +2 -0
  89. package/front_end/panels/accessibility/accessibilityAnnouncementRecordingListView.css +33 -0
  90. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +25 -15
  91. package/front_end/panels/ai_assistance/components/ChatMessage.ts +6 -35
  92. package/front_end/panels/ai_assistance/components/DisabledWidget.ts +4 -3
  93. package/front_end/panels/ai_assistance/components/chatMessage.css +3 -1
  94. package/front_end/panels/animation/AnimationTimeline.ts +1 -0
  95. package/front_end/panels/application/CrashReportContextView.ts +0 -1
  96. package/front_end/panels/application/FrameDetailsView.ts +5 -4
  97. package/front_end/panels/application/IndexedDBViews.ts +4 -4
  98. package/front_end/panels/application/components/BackForwardCacheView.ts +1 -1
  99. package/front_end/panels/application/components/EndpointsGrid.ts +2 -1
  100. package/front_end/panels/application/components/PermissionsPolicySection.ts +1 -1
  101. package/front_end/panels/application/components/ServiceWorkerRouterView.ts +1 -1
  102. package/front_end/panels/application/components/TrustTokensView.ts +1 -1
  103. package/front_end/panels/application/indexedDBViews.css +0 -14
  104. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +2 -1
  105. package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +2 -1
  106. package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +1 -1
  107. package/front_end/panels/common/CPUThrottlingOption.ts +12 -6
  108. package/front_end/panels/common/DOMLinkifier.ts +1 -1
  109. package/front_end/panels/common/ExtensionView.ts +2 -1
  110. package/front_end/panels/console/ConsoleContextSelector.ts +12 -5
  111. package/front_end/panels/console/ConsolePinPane.ts +4 -2
  112. package/front_end/panels/console/ConsoleSidebar.ts +6 -2
  113. package/front_end/panels/console/ConsoleViewMessage.ts +12 -8
  114. package/front_end/panels/console/PromptBuilder.ts +1 -1
  115. package/front_end/panels/coverage/CoverageListView.ts +1 -1
  116. package/front_end/panels/coverage/CoverageModel.ts +6 -4
  117. package/front_end/panels/coverage/coverageView.css +8 -8
  118. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +13 -14
  119. package/front_end/panels/css_overview/CSSOverviewPanel.ts +3 -3
  120. package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +2 -2
  121. package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +3 -3
  122. package/front_end/panels/css_overview/CSSOverviewStartView.ts +3 -3
  123. package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +1 -1
  124. package/front_end/panels/developer_resources/developerResourcesView.css +3 -3
  125. package/front_end/panels/elements/ComputedStyleWidget.ts +1 -1
  126. package/front_end/panels/elements/ElementsTreeElement.ts +43 -15
  127. package/front_end/panels/elements/ElementsTreeOutline.ts +185 -109
  128. package/front_end/panels/elements/MetricsSidebarPane.ts +1 -1
  129. package/front_end/panels/elements/PropertyNameCategories.ts +1 -1
  130. package/front_end/panels/elements/ShortcutTreeElement.ts +6 -1
  131. package/front_end/panels/elements/StandaloneStylesContainer.ts +1 -1
  132. package/front_end/panels/elements/StylePropertiesSection.ts +2 -35
  133. package/front_end/panels/elements/StylesSidebarPane.ts +3 -2
  134. package/front_end/panels/elements/components/CSSPropertyIconResolver.ts +5 -4
  135. package/front_end/panels/elements/components/StylePropertyEditor.ts +161 -148
  136. package/front_end/panels/elements/components/computedStyleProperty.css +5 -5
  137. package/front_end/panels/elements/components/computedStyleTrace.css +5 -5
  138. package/front_end/panels/elements/components/cssHintDetailsView.css +1 -1
  139. package/front_end/panels/elements/components/cssPropertyDocsView.css +3 -3
  140. package/front_end/panels/elements/components/cssVariableValueView.css +4 -4
  141. package/front_end/panels/elements/components/elementsBreadcrumbs.css +3 -3
  142. package/front_end/panels/elements/components/elementsTreeExpandButton.css +5 -5
  143. package/front_end/panels/elements/components/queryContainer.css +2 -2
  144. package/front_end/panels/elements/elementsTreeOutline.css +20 -4
  145. package/front_end/panels/emulation/MediaQueryInspector.ts +2 -1
  146. package/front_end/panels/event_listeners/eventListenersView.css +1 -1
  147. package/front_end/panels/issues/AffectedElementsView.ts +3 -0
  148. package/front_end/panels/issues/AffectedLazyLoadImagesView.ts +1 -1
  149. package/front_end/panels/issues/issues.ts +2 -0
  150. package/front_end/panels/layer_viewer/LayerDetailsView.ts +12 -10
  151. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +1 -0
  152. package/front_end/panels/layer_viewer/Layers3DView.ts +13 -11
  153. package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +1 -1
  154. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspectorUtils.ts +2 -2
  155. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplayUtils.ts +1 -1
  156. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +1 -1
  157. package/front_end/panels/linear_memory_inspector/components/linearMemoryHighlightChipList.css +11 -11
  158. package/front_end/panels/linear_memory_inspector/components/linearMemoryInspector.css +2 -2
  159. package/front_end/panels/linear_memory_inspector/components/linearMemoryNavigator.css +1 -1
  160. package/front_end/panels/linear_memory_inspector/components/linearMemoryValueInterpreter.css +5 -5
  161. package/front_end/panels/linear_memory_inspector/components/linearMemoryViewer.css +6 -6
  162. package/front_end/panels/linear_memory_inspector/components/valueInterpreterDisplay.css +6 -6
  163. package/front_end/panels/linear_memory_inspector/components/valueInterpreterSettings.css +2 -2
  164. package/front_end/panels/media/PlayerPropertiesView.ts +1 -1
  165. package/front_end/panels/media/TickingFlameChart.ts +3 -2
  166. package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +2 -1
  167. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +1 -1
  168. package/front_end/panels/mobile_throttling/ThrottlingPresets.ts +2 -1
  169. package/front_end/panels/network/NetworkDataGridNode.ts +11 -9
  170. package/front_end/panels/network/NetworkLogView.ts +4 -1
  171. package/front_end/panels/network/NetworkLogViewColumns.ts +5 -2
  172. package/front_end/panels/network/RequestConditionsDrawer.ts +2 -2
  173. package/front_end/panels/network/RequestHeadersView.ts +47 -11
  174. package/front_end/panels/network/RequestPayloadView.ts +1 -1
  175. package/front_end/panels/network/RequestResponseView.ts +1 -1
  176. package/front_end/panels/network/RequestTimingView.ts +1 -1
  177. package/front_end/panels/network/ShowMoreDetailsWidget.ts +1 -1
  178. package/front_end/panels/network/components/RequestHeadersView.css +12 -0
  179. package/front_end/panels/network/components/ResponseHeaderSection.ts +1 -1
  180. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +3 -3
  181. package/front_end/panels/profiler/HeapProfileView.ts +1 -1
  182. package/front_end/panels/profiler/HeapSnapshotGridNodes.ts +1 -1
  183. package/front_end/panels/protocol_monitor/JSONEditor.ts +1 -1
  184. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +3 -3
  185. package/front_end/panels/recorder/RecordingListView.ts +0 -6
  186. package/front_end/panels/recorder/RecordingView.ts +0 -6
  187. package/front_end/panels/recorder/controlButton.css +10 -10
  188. package/front_end/panels/recorder/startView.css +1 -1
  189. package/front_end/panels/screencast/ScreencastView.ts +4 -2
  190. package/front_end/panels/search/SearchView.ts +1 -1
  191. package/front_end/panels/security/SecurityPanel.ts +46 -35
  192. package/front_end/panels/sources/BreakpointEditDialog.ts +1 -1
  193. package/front_end/panels/sources/CallStackSidebarPane.ts +1 -1
  194. package/front_end/panels/sources/DebuggerPausedMessage.ts +8 -6
  195. package/front_end/panels/sources/ProfilePlugin.ts +2 -1
  196. package/front_end/panels/sources/ScopeChainSidebarPane.ts +1 -1
  197. package/front_end/panels/timeline/IsolateSelector.ts +1 -1
  198. package/front_end/panels/timeline/LayoutShiftsTrackAppender.ts +1 -1
  199. package/front_end/panels/timeline/NetworkTrackAppender.ts +1 -1
  200. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +1 -1
  201. package/front_end/panels/timeline/TimelineFlameChartView.ts +0 -32
  202. package/front_end/panels/timeline/TimelineHistoryManager.ts +1 -1
  203. package/front_end/panels/timeline/TimelinePaintProfilerView.ts +7 -3
  204. package/front_end/panels/timeline/TimelinePanel.ts +3 -20
  205. package/front_end/panels/timeline/TimelineTreeView.ts +1 -1
  206. package/front_end/panels/timeline/TimelineUIUtils.ts +4 -4
  207. package/front_end/panels/timeline/components/LayoutShiftDetails.ts +4 -3
  208. package/front_end/panels/timeline/components/LiveMetricsView.ts +1 -1
  209. package/front_end/panels/timeline/components/NetworkRequestDetails.ts +25 -24
  210. package/front_end/panels/timeline/components/RelatedInsightChips.ts +4 -3
  211. package/front_end/panels/timeline/components/Sidebar.ts +1 -1
  212. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +4 -3
  213. package/front_end/panels/timeline/components/cwvMetrics.css +2 -2
  214. package/front_end/panels/timeline/components/insights/checklist.css +1 -1
  215. package/front_end/panels/timeline/components/insights/table.css +3 -3
  216. package/front_end/panels/timeline/overlays/components/entriesLinkOverlay.css +4 -4
  217. package/front_end/panels/timeline/overlays/components/entryLabelOverlay.css +4 -4
  218. package/front_end/panels/timeline/overlays/components/timeRangeOverlay.css +2 -2
  219. package/front_end/panels/timeline/overlays/components/timespanBreakdownOverlay.css +4 -4
  220. package/front_end/panels/timeline/timelinePanel.css +0 -74
  221. package/front_end/panels/timeline/utils/Helpers.ts +1 -1
  222. package/front_end/panels/timeline/utils/ImageCache.ts +5 -3
  223. package/front_end/panels/web_audio/WebAudioView.ts +3 -3
  224. package/front_end/panels/web_audio/webAudio.css +5 -5
  225. package/front_end/panels/webauthn/WebauthnPane.ts +5 -11
  226. package/front_end/third_party/acorn/acorn.ts +3 -3
  227. package/front_end/third_party/chromium/README.chromium +1 -1
  228. package/front_end/third_party/chromium/ahem/ahem.d.ts +1 -0
  229. package/front_end/third_party/csp_evaluator/package/csp.ts +4 -4
  230. package/front_end/third_party/csp_evaluator/package/parser.ts +3 -1
  231. package/front_end/third_party/csp_evaluator/package/tsconfig.json +1 -0
  232. package/front_end/third_party/csp_evaluator/package/utils.ts +1 -1
  233. package/front_end/third_party/diff/DiffWrapper.ts +1 -8
  234. package/front_end/third_party/diff/diff_match_patch.d.ts +10 -0
  235. package/front_end/third_party/json5/json5.ts +2 -2
  236. package/front_end/third_party/puppeteer/README.chromium +2 -2
  237. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +183 -4
  238. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +708 -122
  239. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +85 -3
  240. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  241. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +84 -11
  242. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  243. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.d.ts +75 -0
  244. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.d.ts.map +1 -0
  245. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.js +102 -0
  246. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.js.map +1 -0
  247. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.d.ts +1 -0
  248. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.d.ts.map +1 -1
  249. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.js +1 -0
  250. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.js.map +1 -1
  251. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts +6 -1
  252. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts.map +1 -1
  253. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js +7 -0
  254. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js.map +1 -1
  255. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.d.ts +31 -0
  256. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.d.ts.map +1 -0
  257. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.js +138 -0
  258. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.js.map +1 -0
  259. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.d.ts +1 -0
  260. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.d.ts.map +1 -1
  261. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.js +1 -0
  262. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.js.map +1 -1
  263. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.d.ts +6 -0
  264. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  265. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.js +23 -0
  266. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  267. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts +6 -1
  268. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts.map +1 -1
  269. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js +7 -0
  270. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js.map +1 -1
  271. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.d.ts +31 -0
  272. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.d.ts.map +1 -0
  273. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.js +131 -0
  274. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.js.map +1 -0
  275. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.d.ts +1 -0
  276. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.d.ts.map +1 -1
  277. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.js +1 -0
  278. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.js.map +1 -1
  279. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js +7 -4
  280. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js.map +1 -1
  281. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.d.ts +4 -1
  282. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.d.ts.map +1 -1
  283. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js +5 -1
  284. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js.map +1 -1
  285. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts +42 -0
  286. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  287. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.d.ts +2 -2
  288. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.d.ts.map +1 -1
  289. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.js +265 -1
  290. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.js.map +1 -1
  291. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts +4 -0
  292. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  293. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +24 -3
  294. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
  295. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.d.ts +23 -2
  296. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.d.ts.map +1 -1
  297. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js +49 -3
  298. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js.map +1 -1
  299. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  300. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  301. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  302. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts.map +1 -1
  303. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  304. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js.map +1 -1
  305. package/front_end/third_party/puppeteer/package/lib/types.d.ts +183 -4
  306. package/front_end/third_party/puppeteer/package/package.json +4 -4
  307. package/front_end/third_party/puppeteer/package/src/api/Page.ts +143 -11
  308. package/front_end/third_party/puppeteer/package/src/api/ScreenRecording.ts +145 -0
  309. package/front_end/third_party/puppeteer/package/src/api/api.ts +1 -0
  310. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +11 -0
  311. package/front_end/third_party/puppeteer/package/src/bidi/ScreenRecording.ts +106 -0
  312. package/front_end/third_party/puppeteer/package/src/bidi/bidi.ts +1 -0
  313. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +41 -0
  314. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +11 -0
  315. package/front_end/third_party/puppeteer/package/src/cdp/ScreenRecording.ts +101 -0
  316. package/front_end/third_party/puppeteer/package/src/cdp/cdp.ts +1 -0
  317. package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +17 -9
  318. package/front_end/third_party/puppeteer/package/src/common/BrowserWebSocketTransport.ts +4 -0
  319. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +46 -0
  320. package/front_end/third_party/puppeteer/package/src/common/Device.ts +287 -1
  321. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +30 -1
  322. package/front_end/third_party/puppeteer/package/src/node/NodeWebSocketTransport.ts +73 -2
  323. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  324. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  325. package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +3 -0
  326. package/front_end/tsconfig.json +1 -2
  327. package/front_end/ui/comments/CommentAnchorResolver.ts +8 -3
  328. package/front_end/ui/comments/CommentOverlayManager.ts +53 -12
  329. package/front_end/ui/comments/CommentsOverlayWidget.ts +3 -3
  330. package/front_end/ui/comments/CommentsStatusBarPill.ts +96 -0
  331. package/front_end/ui/comments/comments-meta.ts +21 -0
  332. package/front_end/ui/comments/comments.ts +2 -0
  333. package/front_end/ui/comments/commentsOverlay.css +22 -3
  334. package/front_end/ui/components/buttons/floatingButton.css +25 -0
  335. package/front_end/ui/components/markdown_view/MarkdownView.ts +31 -1
  336. package/front_end/ui/components/srgb_overlay/SrgbOverlay.ts +1 -1
  337. package/front_end/ui/components/suggestion_input/SuggestionInput.ts +45 -25
  338. package/front_end/ui/kit/icons/Icon.ts +0 -1
  339. package/front_end/ui/kit/link/Link.ts +8 -1
  340. package/front_end/ui/legacy/ContextMenu.ts +2 -2
  341. package/front_end/ui/legacy/DropTarget.ts +6 -1
  342. package/front_end/ui/legacy/EmptyWidget.ts +1 -1
  343. package/front_end/ui/legacy/GlassPane.ts +1 -1
  344. package/front_end/ui/legacy/InspectorView.ts +17 -1
  345. package/front_end/ui/legacy/ShortcutRegistry.ts +2 -2
  346. package/front_end/ui/legacy/SplitWidget.ts +18 -3
  347. package/front_end/ui/legacy/StackedPane.ts +1 -1
  348. package/front_end/ui/legacy/StatusBar.ts +78 -0
  349. package/front_end/ui/legacy/TargetCrashedScreen.ts +1 -1
  350. package/front_end/ui/legacy/TextPrompt.ts +2 -1
  351. package/front_end/ui/legacy/Toolbar.ts +5 -1
  352. package/front_end/ui/legacy/Treeoutline.ts +91 -48
  353. package/front_end/ui/legacy/UIUtils.ts +8 -4
  354. package/front_end/ui/legacy/ViewManager.ts +1 -1
  355. package/front_end/ui/legacy/ViewRegistration.ts +1 -0
  356. package/front_end/ui/legacy/Widget.ts +1 -1
  357. package/front_end/ui/legacy/components/color_picker/Spectrum.ts +7 -1
  358. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +1 -1
  359. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +3 -2
  360. package/front_end/ui/legacy/components/data_grid/dataGrid.css +23 -23
  361. package/front_end/ui/legacy/components/inline_editor/AnimationTimingModel.ts +1 -1
  362. package/front_end/ui/legacy/components/inline_editor/BezierEditor.ts +48 -44
  363. package/front_end/ui/legacy/components/inline_editor/CSSAngleUtils.ts +1 -1
  364. package/front_end/ui/legacy/components/inline_editor/PositionAreaEditor.docs.ts +83 -0
  365. package/front_end/ui/legacy/components/inline_editor/PositionAreaEditor.ts +600 -0
  366. package/front_end/ui/legacy/components/inline_editor/animationNameSwatch.css +1 -1
  367. package/front_end/ui/legacy/components/inline_editor/colorMixSwatch.css +4 -4
  368. package/front_end/ui/legacy/components/inline_editor/cssAngleSwatch.css +3 -3
  369. package/front_end/ui/legacy/components/inline_editor/inline_editor.ts +2 -0
  370. package/front_end/ui/legacy/components/inline_editor/linkSwatch.css +1 -1
  371. package/front_end/ui/legacy/components/inline_editor/positionAreaEditor.css +154 -0
  372. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +224 -127
  373. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +10 -7
  374. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +25 -106
  375. package/front_end/ui/legacy/components/object_ui/customPreviewComponent.css +7 -3
  376. package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +1 -1
  377. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +0 -66
  378. package/front_end/ui/legacy/components/perf_ui/perf_ui.ts +0 -2
  379. package/front_end/ui/legacy/components/perf_ui/pieChart.css +7 -5
  380. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +8 -5
  381. package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +1 -1
  382. package/front_end/ui/legacy/components/utils/Linkifier.ts +5 -5
  383. package/front_end/ui/legacy/inspectorCommon.css +41 -6
  384. package/front_end/ui/legacy/legacy.ts +2 -0
  385. package/front_end/ui/legacy/statusBar.css +18 -0
  386. package/front_end/ui/visual_logging/Debugging.ts +2 -1
  387. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -1
  388. package/front_end/ui/visual_logging/LoggingDriver.ts +3 -3
  389. package/front_end/ui/visual_logging/LoggingEvents.ts +5 -5
  390. package/front_end/ui/visual_logging/LoggingState.ts +1 -1
  391. package/front_end/ui/visual_logging/visual_logging.ts +67 -56
  392. package/inspector_overlay/main.ts +8 -8
  393. package/mcp/mcp.ts +5 -0
  394. package/package.json +2 -8
  395. package/front_end/Images/generate-css-vars.js +0 -52
  396. package/front_end/Images/rollup.config.mjs +0 -36
  397. package/front_end/models/ai_assistance/AiOrigins.ts +0 -107
  398. package/front_end/models/live-metrics/web-vitals-injected/rollup.config.mjs +0 -20
  399. package/front_end/panels/recorder/injected/rollup.config.mjs +0 -20
  400. package/front_end/panels/timeline/EasterEgg.d.ts +0 -6
  401. package/front_end/panels/timeline/easter-egg-tsconfig.json +0 -8
  402. package/front_end/panels/timeline/enable-easter-egg.js +0 -20
  403. package/front_end/third_party/acorn/acorn-tsconfig.json +0 -12
  404. package/front_end/third_party/acorn/estree-tsconfig.json +0 -8
  405. package/front_end/third_party/chromium/client-variations/client-variations-tsconfig.json +0 -8
  406. package/front_end/third_party/codemirror/codemirror-legacy-types-tsconfig.json +0 -8
  407. package/front_end/third_party/codemirror/codemirror-tsconfig.json +0 -15
  408. package/front_end/third_party/codemirror.next/bundle-tsconfig.json +0 -24
  409. package/front_end/third_party/intl-messageformat/intl-messageformat-tsconfig.json +0 -16
  410. package/front_end/third_party/json5/json5-tsconfig.json +0 -8
  411. package/front_end/third_party/legacy-javascript/legacy-javascript-tsconfig.json +0 -8
  412. package/front_end/third_party/lighthouse/lighthouse-tsconfig.json +0 -11
  413. package/front_end/third_party/lighthouse/report/bundle-tsconfig.json +0 -8
  414. package/front_end/third_party/lit/lit-tsconfig.json +0 -15
  415. package/front_end/third_party/marked/marked-tsconfig.json +0 -8
  416. package/front_end/third_party/puppeteer-replay/puppeteer-replay-tsconfig.json +0 -8
  417. package/front_end/third_party/third-party-web/third-party-web-tsconfig.json +0 -8
  418. package/front_end/third_party/wasmparser/wasmparser-tsconfig.json +0 -9
  419. package/front_end/third_party/web-vitals/web-vitals-tsconfig.json +0 -47
  420. package/front_end/ui/legacy/components/perf_ui/BrickBreaker.ts +0 -606
  421. package/inspector_overlay/loadCSS.rollup.js +0 -29
@@ -73,7 +73,7 @@ import {ImagePreviewPopover} from './ImagePreviewPopover.js';
73
73
  import {ShortcutTreeElement} from './ShortcutTreeElement.js';
74
74
  import {TopLayerContainer} from './TopLayerContainer.js';
75
75
 
76
- const {html, nothing, render, Directives: {classMap}} = Lit;
76
+ const {html, nothing, render, Directives: {classMap, styleMap}} = Lit;
77
77
 
78
78
  const UIStrings = {
79
79
  /**
@@ -129,10 +129,12 @@ interface ViewInput {
129
129
  deindentSingleNode: boolean;
130
130
  currentHighlightedNode: SDK.DOMModel.DOMNode|null;
131
131
  hoveredNode?: SDK.DOMModel.DOMNode|null;
132
+ hoveredClosingTag?: boolean;
132
133
  searchMatchNode?: SDK.DOMModel.DOMNode|null;
133
134
  searchMatchQuery?: string|null;
134
135
 
135
136
  selectedNode: SDK.DOMModel.DOMNode|null;
137
+ selectedClosingTag?: boolean;
136
138
 
137
139
  onSelectedNodeChanged:
138
140
  (event: Common.EventTarget.EventTargetEvent<{node: SDK.DOMModel.DOMNode | null, focus: boolean}>) => void;
@@ -140,10 +142,10 @@ interface ViewInput {
140
142
  onElementCollapsed: () => void;
141
143
  onElementExpanded: () => void;
142
144
 
143
- onSelect?: (node: SDK.DOMModel.DOMNode, selectedByUser?: boolean) => void;
145
+ onSelect?: (node: SDK.DOMModel.DOMNode, isClosingTag?: boolean, selectedByUser?: boolean) => void;
144
146
  onExpand?: (node: SDK.DOMModel.DOMNode, expanded: boolean) => void;
145
147
  onContextMenu?: (node: SDK.DOMModel.DOMNode, event: MouseEvent, widget?: ElementsTreeWidget) => void;
146
- onHoverNode?: (node: SDK.DOMModel.DOMNode, showInfo?: boolean) => void;
148
+ onHoverNode?: (node: SDK.DOMModel.DOMNode|null, showInfo?: boolean, isClosingTag?: boolean) => void;
147
149
  onLeave?: () => void;
148
150
  onToggleHideElement?: (node: SDK.DOMModel.DOMNode) => void;
149
151
  onKeyDown?: (event: KeyboardEvent) => void;
@@ -157,6 +159,7 @@ interface ViewInput {
157
159
  moveDirection?: string) => void;
158
160
  nodeToEdit?: ({node: SDK.DOMModel.DOMNode}&InitialEditState)|null;
159
161
  onInitialEditCompleted?: () => void;
162
+ multilineEditingNode?: SDK.DOMModel.DOMNode|null;
160
163
  dragOverNode?: {node: SDK.DOMModel.DOMNode, isClosingTag: boolean}|null;
161
164
  isValidDragSource?: (node: SDK.DOMModel.DOMNode) => boolean;
162
165
  onDragStart?: (node: SDK.DOMModel.DOMNode, event: DragEvent, textContent?: string) => boolean;
@@ -520,12 +523,13 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
520
523
  SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
521
524
  };
522
525
 
526
+ // clang-format off
523
527
  return html`
524
528
  <li role="treeitem"
525
529
  ?selected=${isShortcutSelected}
526
530
  ?open=${isShortcutExpanded}
527
531
  class="elements-tree-shortcut"
528
- style="--indent: ${computeLeftIndent(shortcutDepth, hasShortcutChildren)}px"
532
+ style=${styleMap({'--indent': `${computeLeftIndent(shortcutDepth, hasShortcutChildren)}px`})}
529
533
  @select=${onShortcutSelect}
530
534
  @expand=${onShortcutExpand}
531
535
  @mousemove=${on(onShortcutMouseMove)}
@@ -534,34 +538,31 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
534
538
  <div class="selection fill"></div>
535
539
  <span class="elements-tree-shortcut-title">\u21AA ${title}</span>
536
540
  <devtools-adorner
537
- .name=${ElementsComponents.AdornerManager.RegisteredAdorners.REVEAL}
538
- class="adorner-reveal clickable"
539
- role=button
540
- tabindex=0
541
- jslog=${VisualLogging.adorner('reveal').track({
542
- click: true,
543
- })}
544
- aria-label=${i18nString(UIStrings.reveal)}
545
- @click=${on(onReveal)}
546
- @keydown=${handleAdornerKeydown(onReveal)}
547
- @mousedown=${(e: Event) => e.consume()}
548
- ${adornerRef()}>
541
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.REVEAL}
542
+ class="adorner-reveal clickable"
543
+ role=button
544
+ tabindex=0
545
+ jslog=${VisualLogging.adorner('reveal').track({click: true})}
546
+ aria-label=${i18nString(UIStrings.reveal)}
547
+ @click=${on(onReveal)}
548
+ @keydown=${handleAdornerKeydown(onReveal)}
549
+ @mousedown=${(e: Event) => e.consume()}
550
+ ${adornerRef()}>
549
551
  <span class="adorner-with-icon">
550
552
  <devtools-icon name="select-element"></devtools-icon>
551
553
  <span>${ElementsComponents.AdornerManager.RegisteredAdorners.REVEAL}</span>
552
554
  </span>
553
555
  </devtools-adorner>
554
- ${
555
- hasShortcutChildren ? html`
556
+ ${hasShortcutChildren ? html`
556
557
  <ul role="group">
557
558
  ${UI.TreeOutline.ifExpanded(html`
558
559
  ${shortcut.childShortcuts.map(child => renderShortcut(child, shortcutDepth + 1))}
559
560
  `)}
560
561
  </ul>
561
- ` :
562
- nothing}
562
+ ` : nothing}
563
563
  </li>
564
564
  `;
565
+ // clang-format on
565
566
  };
566
567
 
567
568
  const renderTopLayerContainer =
@@ -578,23 +579,25 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
578
579
  input.onSelectTopLayerContainer?.(doc);
579
580
  };
580
581
 
582
+ // clang-format off
581
583
  return html`
582
- <li role="treeitem"
583
- ?open=${isTopLayerExpanded}
584
- class="elements-tree-top-layer-container"
585
- style="--indent: ${computeLeftIndent(containerDepth, true)}px"
586
- @select=${onTopLayerSelect}
587
- @expand=${onTopLayerExpand}
588
- jslog=${VisualLogging.treeItem().parent('elementsTreeOutline')}>
589
- <div class="selection fill"></div>
590
- <span class="elements-tree-shortcut-title">#top-layer</span>
591
- <ul role="group">
592
- ${UI.TreeOutline.ifExpanded(html`
593
- ${shortcuts.map(sc => renderShortcut(sc, containerDepth + 1))}
594
- `)}
595
- </ul>
596
- </li>
597
- `;
584
+ <li role="treeitem"
585
+ ?open=${isTopLayerExpanded}
586
+ class="elements-tree-top-layer-container"
587
+ style=${styleMap({'--indent': `${computeLeftIndent(containerDepth, true)}px`})}
588
+ @select=${onTopLayerSelect}
589
+ @expand=${onTopLayerExpand}
590
+ jslog=${VisualLogging.treeItem().parent('elementsTreeOutline')}>
591
+ <div class="selection fill"></div>
592
+ <span class="elements-tree-shortcut-title">#top-layer</span>
593
+ <ul role="group">
594
+ ${UI.TreeOutline.ifExpanded(html`
595
+ ${shortcuts.map(sc => renderShortcut(sc, containerDepth + 1))}
596
+ `)}
597
+ </ul>
598
+ </li>
599
+ `;
600
+ // clang-format on
598
601
  };
599
602
 
600
603
  const renderAdoptedStyleSheet = (sheet: SDK.DOMModel.AdoptedStyleSheet, depth: number): Lit.LitTemplate => {
@@ -615,7 +618,7 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
615
618
  ?selected=${isSelected}
616
619
  ?open=${isExpanded}
617
620
  class="elements-tree-adopted-style-sheet"
618
- style="--indent: ${computeLeftIndent(depth, true)}px"
621
+ style=${styleMap({'--indent': `${computeLeftIndent(depth, true)}px`})}
619
622
  @select=${onSelect}
620
623
  @expand=${onExpand}
621
624
  jslog=${VisualLogging.treeItem('adopted-style-sheet').parent('elementsTreeOutline')}>
@@ -630,7 +633,7 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
630
633
  ${header ? html`
631
634
  <li role="treeitem"
632
635
  class="elements-tree-adopted-style-sheet-contents"
633
- style="--indent: ${computeLeftIndent(depth + 1, false)}px"
636
+ style=${styleMap({'--indent': `${computeLeftIndent(depth + 1, false)}px`})}
634
637
  jslog=${VisualLogging.treeItem('adopted-style-sheet-contents').parent('elementsTreeOutline')}>
635
638
  <div class="selection fill"></div>
636
639
  ${UI.Widget.widget(AdoptedStyleSheetContentsWidget, {styleSheetHeader: header})}
@@ -661,7 +664,7 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
661
664
  <li role="treeitem"
662
665
  ?open=${isExpanded}
663
666
  class="elements-tree-adopted-style-sheets"
664
- style="--indent: ${computeLeftIndent(depth, true)}px"
667
+ style=${styleMap({'--indent': `${computeLeftIndent(depth, true)}px`})}
665
668
  @select=${onSelect}
666
669
  @expand=${onExpand}
667
670
  jslog=${VisualLogging.treeItem('adopted-style-sheets').parent('elementsTreeOutline')}>
@@ -679,14 +682,23 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
679
682
 
680
683
  const renderNode = (node: SDK.DOMModel.DOMNode, depth = 0): Lit.LitTemplate => {
681
684
  const isSelected = input.selectedNode === node;
682
- const isHovered = (input.currentHighlightedNode === node) || (input.hoveredNode === node);
685
+ const isOpeningHovered =
686
+ (input.currentHighlightedNode === node) || (input.hoveredNode === node && !input.hoveredClosingTag);
687
+ const isClosingHovered = input.hoveredNode === node && Boolean(input.hoveredClosingTag);
683
688
  const isExpanded = Boolean(
684
689
  (input.currentHighlightedNode && isAncestorOf(node, input.currentHighlightedNode)) ||
685
690
  (input.isNodeExpanded ?
686
691
  input.isNodeExpanded(node) :
687
692
  (input.expandRoot &&
688
693
  (node === input.rootDOMNode || (input.omitRootDOMNode && node.parentNode === input.rootDOMNode)))));
689
- const hasChildren = nodeHasVisibleChildren(node, input.rootDOMNode, input.maxTreeDepth, input.omitRootDOMNode);
694
+ const isEditingAsHTML = input.multilineEditingNode === node ||
695
+ (input.nodeToEdit?.node === node && Boolean(input.nodeToEdit.isEditAsHTML));
696
+ const hasChildren =
697
+ !isEditingAsHTML && nodeHasVisibleChildren(node, input.rootDOMNode, input.maxTreeDepth, input.omitRootDOMNode);
698
+ const isCollapsible = !isEditingAsHTML &&
699
+ !(node.nodeType() === Node.ELEMENT_NODE && node.parentNode?.nodeType() === Node.DOCUMENT_NODE &&
700
+ !node.parentNode.parentNode);
701
+ const isExpandable = hasChildren && isCollapsible;
690
702
  const allVisibleChildren = hasChildren ? getVisibleChildren(node, input.showComments ?? true) : [];
691
703
  const limit = input.expandedChildrenLimit ? input.expandedChildrenLimit(node) : InitialChildrenLimit;
692
704
  const children = allVisibleChildren.slice(0, limit);
@@ -697,11 +709,14 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
697
709
 
698
710
  const on = Lit.Directive.directive(Lit.CustomDirectives.InterceptBindingDirective);
699
711
 
700
- const onSelect = (): void => {
701
- input.onSelect?.(node, /* selectedByUser= */ true);
712
+ const onSelect = (isClosingTag = false): void => {
713
+ input.onSelect?.(node, isClosingTag, /* selectedByUser= */ true);
702
714
  };
703
715
 
704
716
  const onExpand = (event: UI.TreeOutline.TreeViewElement.ExpandEvent): void => {
717
+ if (isEditingAsHTML) {
718
+ return;
719
+ }
705
720
  input.onExpand?.(node, event.detail.expanded);
706
721
  };
707
722
 
@@ -710,15 +725,22 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
710
725
  const isDraggable = !input.disableEdits && Boolean(input.isValidDragSource?.(node));
711
726
 
712
727
  const classes = classMap({
713
- hovered: isHovered,
728
+ hovered: isOpeningHovered,
714
729
  'in-clipboard': Boolean(input.isNodeInClipboard?.(node)),
715
730
  'elements-drag-over': isDragOver,
731
+ 'always-parent': !isCollapsible && !isEditingAsHTML,
716
732
  });
717
733
 
718
- const onMouseMove = (event: MouseEvent): void => {
734
+ const onOpeningMouseMove = (event: MouseEvent): void => {
719
735
  event.stopPropagation();
720
736
  const showInfo = !UI.KeyboardShortcut.KeyboardShortcut.eventHasEitherCtrlOrMeta(event);
721
- input.onHoverNode?.(node, showInfo);
737
+ input.onHoverNode?.(node, showInfo, /* isClosingTag= */ false);
738
+ };
739
+
740
+ const onClosingMouseMove = (event: MouseEvent): void => {
741
+ event.stopPropagation();
742
+ const showInfo = !UI.KeyboardShortcut.KeyboardShortcut.eventHasEitherCtrlOrMeta(event);
743
+ input.onHoverNode?.(node, showInfo, /* isClosingTag= */ true);
722
744
  };
723
745
 
724
746
  const onContextMenu = (event: MouseEvent): void => {
@@ -763,16 +785,17 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
763
785
  input.onDragEnd?.(event);
764
786
  };
765
787
 
766
- /* clang-format off */
788
+ // clang-format off
767
789
  return html`
768
790
  <li role="treeitem"
769
- ?selected=${isSelected}
791
+ ?selected=${isSelected && !input.selectedClosingTag}
770
792
  class=${classes}
771
- ?open=${isExpanded}
793
+ style=${styleMap({'--indent': `${computeLeftIndent(depth, isExpandable)}px`})}
794
+ ?open=${isExpanded && !isEditingAsHTML}
772
795
  draggable=${isDraggable ? 'true' : 'false'}
773
- @select=${onSelect}
796
+ @select=${on(() => onSelect(false))}
774
797
  @expand=${onExpand}
775
- @mousemove=${on(onMouseMove)}
798
+ @mousemove=${on(onOpeningMouseMove)}
776
799
  @contextmenu=${on(onContextMenu)}
777
800
  @dragstart=${on(onDragStart)}
778
801
  @dragover=${on(onDragOver)}
@@ -788,22 +811,22 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
788
811
  ${UI.Widget.widget(ElementsTreeWidget, {
789
812
  node,
790
813
  isClosingTag: false,
791
- expanded: isExpanded,
814
+ expanded: isExpanded && !isEditingAsHTML,
792
815
  isExpandable: hasChildren,
793
- selected: isSelected,
816
+ selected: isSelected && !input.selectedClosingTag,
794
817
  isDOMNodeSelected: isSelected,
795
- hovered: isHovered,
818
+ hovered: isOpeningHovered,
796
819
  searchQuery: input.searchMatchNode === node ? (input.searchMatchQuery ?? null) : null,
797
820
  inClipboard: input.isNodeInClipboard?.(node) ?? false,
798
- computeLeftIndent: computeLeftIndent(depth, hasChildren),
821
+ computeLeftIndent: computeLeftIndent(depth, isExpandable),
799
822
  disableEdits: input.disableEdits ?? false,
800
823
  showAIButton: input.showAIButton ?? true,
801
824
  initialEdit: input.nodeToEdit?.node === node ? input.nodeToEdit : null,
802
825
  onInitialEditCompleted: input.onInitialEditCompleted,
803
826
  revealInTopLayer: (n: SDK.DOMModel.DOMNode) => input.domTreeWidget?.revealInTopLayer(n),
804
- setMultilineEditing: multilineEditing => input.domTreeWidget?.setMultilineEditing(multilineEditing),
827
+ setMultilineEditing: (multilineEditing, n) => input.domTreeWidget?.setMultilineEditing(multilineEditing, n ?? node),
805
828
  visibleWidth: () => input.domTreeWidget?.visibleWidth ?? 0,
806
- selectDOMNode: (n: SDK.DOMModel.DOMNode, selectedByUser?: boolean) => input.onSelect?.(n, selectedByUser),
829
+ selectDOMNode: (n: SDK.DOMModel.DOMNode, selectedByUser?: boolean) => input.onSelect?.(n, false, selectedByUser),
807
830
  selectNodeAfterEdit: (wasExpanded: boolean, error: string|null, newNode: SDK.DOMModel.DOMNode|null, moveDirection?: string) => {
808
831
  input.onSelectNodeAfterEdit?.(wasExpanded, error, newNode, moveDirection);
809
832
  },
@@ -827,7 +850,7 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
827
850
  ${remainingChildrenCount > 0 ? html`
828
851
  <li role="treeitem"
829
852
  class="elements-tree-expand-all"
830
- style="--indent: ${computeLeftIndent(depth + 1, false)}px"
853
+ style=${styleMap({'--indent': `${computeLeftIndent(depth + 1, false)}px`})}
831
854
  jslog=${VisualLogging.treeItem('show-all-nodes').parent('elementsTreeOutline')}>
832
855
  <devtools-button
833
856
  .variant=${Buttons.Button.Variant.OUTLINED}
@@ -843,21 +866,27 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
843
866
  ${node instanceof SDK.DOMModel.DOMDocument ? renderTopLayerContainer(node, depth + 1) : nothing}
844
867
  ${needsClosingTag ? html`
845
868
  <li role="treeitem"
846
- class=${classMap({hovered: isHovered, 'elements-drag-over': isClosingTagDragOver})}
869
+ ?selected=${isSelected && Boolean(input.selectedClosingTag)}
870
+ class=${classMap({hovered: isClosingHovered, 'elements-drag-over': isClosingTagDragOver})}
871
+ style=${styleMap({'--indent': `${computeLeftIndent(depth + 1, false)}px`})}
872
+ draggable=${isDraggable ? 'true' : 'false'}
847
873
  jslog=${VisualLogging.treeItem().parent('elementsTreeOutline')}
848
- @mousemove=${on(onMouseMove)}
874
+ @select=${on(() => onSelect(true))}
875
+ @mousemove=${on(onClosingMouseMove)}
876
+ @dragstart=${on(onDragStart)}
849
877
  @dragover=${on(onClosingTagDragOver)}
850
878
  @dragleave=${on(onDragLeave)}
851
- @drop=${on(onClosingTagDrop)}>
879
+ @drop=${on(onClosingTagDrop)}
880
+ @dragend=${on(onDragEnd)}>
852
881
  ${UI.Widget.widget(ElementsTreeWidget, {
853
882
  node,
854
883
  isClosingTag: true,
855
884
  expanded: false,
856
885
  isExpandable: false,
857
- selected: false,
858
- isDOMNodeSelected: false,
859
- hovered: isHovered,
860
- computeLeftIndent: computeLeftIndent(depth, false),
886
+ selected: isSelected && Boolean(input.selectedClosingTag),
887
+ isDOMNodeSelected: isSelected,
888
+ hovered: isClosingHovered,
889
+ computeLeftIndent: computeLeftIndent(depth + 1, false),
861
890
  disableEdits: input.disableEdits ?? false,
862
891
  showAIButton: false,
863
892
  showContextMenu: (event: Event, widget?: ElementsTreeWidget) => {
@@ -874,10 +903,10 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
874
903
  ` : nothing}
875
904
  </li>
876
905
  `;
877
- /* clang-format on */
906
+ // clang-format on
878
907
  };
879
908
 
880
- /* clang-format off */
909
+ // clang-format off
881
910
  render(html`
882
911
  <style>${UI.inspectorCommonStyles}</style>
883
912
  <style>${elementsTreeOutlineStyles}</style>
@@ -888,6 +917,7 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
888
917
  aria-label=${i18nString(UIStrings.pageDom)}
889
918
  jslog=${VisualLogging.tree('elements')}
890
919
  ?show-selection-on-keyboard-focus=${input.showSelectionOnKeyboardFocus}
920
+ @enter=${(event: Event) => event.preventDefault()}
891
921
  @keydown=${input.onKeyDown}
892
922
  @clipboard-copy=${(event: Event) => input.onCopyOrCut?.(false, event)}
893
923
  @clipboard-cut=${(event: Event) => input.onCopyOrCut?.(true, event)}
@@ -898,6 +928,8 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
898
928
  <style>${elementsTreeOutlineStyles}</style>
899
929
  <style>${CodeHighlighter.codeHighlighterStyles}</style>
900
930
  <ul role="tree">
931
+ ${input.omitRootDOMNode && input.rootDOMNode && input.rootDOMNode.adoptedStyleSheetsForNode.length > 0 ?
932
+ renderAdoptedStyleSheets(input.rootDOMNode, 0) : nothing}
901
933
  ${rootNodes.map(node => renderNode(node))}
902
934
  ${input.omitRootDOMNode && input.rootDOMNode ? (() => {
903
935
  const remaining = allRootNodes.length - rootNodes.length;
@@ -908,7 +940,7 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
908
940
  return html`
909
941
  <li role="treeitem"
910
942
  class="elements-tree-expand-all"
911
- style="--indent: ${computeLeftIndent(0, false)}px"
943
+ style=${styleMap({'--indent': `${computeLeftIndent(0, false)}px`})}
912
944
  jslog=${VisualLogging.treeItem('show-all-nodes').parent('elementsTreeOutline')}>
913
945
  <devtools-button
914
946
  .variant=${Buttons.Button.Variant.OUTLINED}
@@ -928,7 +960,7 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
928
960
  </devtools-tree>
929
961
  </div>
930
962
  `, target);
931
- /* clang-format on */
963
+ // clang-format on
932
964
  };
933
965
 
934
966
  function getElementsTreeWidgetAndNode(element: Element): {node?: SDK.DOMModel.DOMNode, widget?: ElementsTreeWidget} {
@@ -1007,20 +1039,35 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1007
1039
  #expandedNodes = new Set<SDK.DOMModel.DOMNode>();
1008
1040
  #expandedChildrenLimitByNode = new WeakMap<SDK.DOMModel.DOMNode, number>();
1009
1041
 
1042
+ #expandRootNode(node: SDK.DOMModel.DOMNode): void {
1043
+ if (!this.#expandRoot && !this.omitRootDOMNode) {
1044
+ return;
1045
+ }
1046
+ this.#expandedNodes.add(node);
1047
+ const expandChildren = (): void => {
1048
+ if (this.#expandRoot && this.omitRootDOMNode && node.children()) {
1049
+ for (const child of node.children() ?? []) {
1050
+ this.#expandedNodes.add(child);
1051
+ }
1052
+ }
1053
+ };
1054
+ if (node.children()) {
1055
+ expandChildren();
1056
+ } else if (node.childNodeCount()) {
1057
+ void node.getChildNodes(() => {
1058
+ expandChildren();
1059
+ this.performUpdate();
1060
+ });
1061
+ }
1062
+ }
1063
+
1010
1064
  // FIXME: this is not declarative because ElementsTreeOutline can
1011
1065
  // change root node internally.
1012
1066
  set rootDOMNode(node: SDK.DOMModel.DOMNode|null) {
1013
1067
  if (this.#view === DECLARATIVE_VIEW) {
1014
1068
  this.#rootDOMNode = node;
1015
1069
  if (node) {
1016
- if (this.expandRoot || this.omitRootDOMNode) {
1017
- this.#expandedNodes.add(node);
1018
- }
1019
- if (!node.children() && node.childNodeCount()) {
1020
- void node.getChildNodes(() => {
1021
- this.performUpdate();
1022
- });
1023
- }
1070
+ this.#expandRootNode(node);
1024
1071
  }
1025
1072
  this.performUpdate();
1026
1073
  return;
@@ -1090,6 +1137,9 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1090
1137
 
1091
1138
  set expandRoot(expandRoot: boolean) {
1092
1139
  this.#expandRoot = expandRoot;
1140
+ if (this.#rootDOMNode) {
1141
+ this.#expandRootNode(this.#rootDOMNode);
1142
+ }
1093
1143
  this.performUpdate();
1094
1144
  }
1095
1145
 
@@ -1314,6 +1364,10 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1314
1364
  }
1315
1365
 
1316
1366
  updateModifiedNodes(): void {
1367
+ if (this.#updateModifiedNodesTimeout) {
1368
+ clearTimeout(this.#updateModifiedNodesTimeout);
1369
+ this.#updateModifiedNodesTimeout = undefined;
1370
+ }
1317
1371
  if (this.#view === DECLARATIVE_VIEW) {
1318
1372
  this.performUpdate();
1319
1373
  return;
@@ -1381,7 +1435,8 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1381
1435
  this.performUpdate();
1382
1436
  }
1383
1437
 
1384
- selectDOMNode(node: SDK.DOMModel.DOMNode|SDK.DOMModel.AdoptedStyleSheet|null, focus?: boolean): void {
1438
+ selectDOMNode(node: SDK.DOMModel.DOMNode|SDK.DOMModel.AdoptedStyleSheet|null, focus?: boolean,
1439
+ isClosingTag = false): void {
1385
1440
  this.#imagePreviewPopover?.hide();
1386
1441
  this.#issuePopoverHelper?.hidePopover();
1387
1442
  if (node instanceof SDK.DOMModel.AdoptedStyleSheet) {
@@ -1390,6 +1445,7 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1390
1445
  }
1391
1446
  this.#selectedAdoptedStyleSheet = null;
1392
1447
  if (this.#view === DECLARATIVE_VIEW) {
1448
+ this.#selectedClosingTag = Boolean(isClosingTag);
1393
1449
  const isSameNode = this.#selectedDOMNode === node;
1394
1450
  this.#selectedDOMNode = node;
1395
1451
  if (node) {
@@ -1455,6 +1511,9 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1455
1511
  }
1456
1512
 
1457
1513
  setNodeExpanded(node: SDK.DOMModel.DOMNode, expanded: boolean): void {
1514
+ if (!expanded && this.#multilineEditingNode === node) {
1515
+ return;
1516
+ }
1458
1517
  if (this.#view === DECLARATIVE_VIEW) {
1459
1518
  if (expanded) {
1460
1519
  this.#expandedNodes.add(node);
@@ -1513,7 +1572,7 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1513
1572
  this.setExpandedChildrenLimit(node, Math.max(visibleChildren.length, currentLimit + InitialChildrenLimit));
1514
1573
  }
1515
1574
 
1516
- async expandRecursively(node: SDK.DOMModel.DOMNode, maxDepth = Number.MAX_VALUE): Promise<void> {
1575
+ async expandRecursively(node: SDK.DOMModel.DOMNode, maxDepth: number = Number.MAX_VALUE): Promise<void> {
1517
1576
  if (this.#view === DECLARATIVE_VIEW) {
1518
1577
  await node.getSubtree(100, true);
1519
1578
  const expand = async(n: SDK.DOMModel.DOMNode, depth: number): Promise<void> => {
@@ -1546,11 +1605,10 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1546
1605
  collapseChildren(node: SDK.DOMModel.DOMNode): void {
1547
1606
  if (this.#view === DECLARATIVE_VIEW) {
1548
1607
  const collapse = (n: SDK.DOMModel.DOMNode): void => {
1549
- const pseudoElements = Array.from(n.pseudoElements().values()).flat();
1550
- const allChildren = [...(n.children() ?? []), ...pseudoElements];
1551
- for (const child of allChildren) {
1552
- this.#expandedNodes.delete(child);
1553
- collapse(child);
1608
+ for (const child of getVisibleChildren(n, this.#showComments)) {
1609
+ if (this.#expandedNodes.delete(child)) {
1610
+ collapse(child);
1611
+ }
1554
1612
  }
1555
1613
  };
1556
1614
  collapse(node);
@@ -1590,6 +1648,8 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1590
1648
  }
1591
1649
 
1592
1650
  #hoveredDOMNode: SDK.DOMModel.DOMNode|null = null;
1651
+ #hoveredClosingTag = false;
1652
+ #selectedClosingTag = false;
1593
1653
  #searchMatchNode: SDK.DOMModel.DOMNode|null = null;
1594
1654
  #searchMatchQuery: string|null = null;
1595
1655
  #nodeToEdit: ({node: SDK.DOMModel.DOMNode}&InitialEditState)|null = null;
@@ -1608,6 +1668,14 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1608
1668
  return null;
1609
1669
  }
1610
1670
 
1671
+ hoveredClosingTag(): boolean {
1672
+ return this.#hoveredClosingTag;
1673
+ }
1674
+
1675
+ selectedClosingTag(): boolean {
1676
+ return this.#selectedClosingTag;
1677
+ }
1678
+
1611
1679
  searchMatchNode(): SDK.DOMModel.DOMNode|null {
1612
1680
  return this.#searchMatchNode;
1613
1681
  }
@@ -1616,11 +1684,12 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1616
1684
  return this.#searchMatchQuery;
1617
1685
  }
1618
1686
 
1619
- setHoveredNode(node: SDK.DOMModel.DOMNode|null, showInfo = true): void {
1620
- if (this.#hoveredDOMNode === node) {
1687
+ setHoveredNode(node: SDK.DOMModel.DOMNode|null, showInfo = true, isClosingTag = false): void {
1688
+ if (this.hoveredDOMNode() === node && this.#hoveredClosingTag === Boolean(isClosingTag)) {
1621
1689
  return;
1622
1690
  }
1623
1691
  this.#hoveredDOMNode = node;
1692
+ this.#hoveredClosingTag = Boolean(isClosingTag);
1624
1693
  if (node) {
1625
1694
  const treeElement = this.treeElementForNode(node);
1626
1695
  const selectorList = treeElement?.isDisplayContents() ? '*' : undefined;
@@ -1665,9 +1734,11 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1665
1734
 
1666
1735
  currentHighlightedNode: this.#currentHighlightedNode,
1667
1736
  hoveredNode: this.#hoveredDOMNode,
1737
+ hoveredClosingTag: this.#hoveredClosingTag,
1668
1738
  searchMatchNode: this.#searchMatchNode,
1669
1739
  searchMatchQuery: this.#searchMatchQuery,
1670
1740
  selectedNode: this.selectedDOMNode(),
1741
+ selectedClosingTag: this.#selectedClosingTag,
1671
1742
  onElementsTreeUpdated: this.onElementsTreeUpdated.bind(this),
1672
1743
  onSelectedNodeChanged: event => {
1673
1744
  this.#clearHighlightedNode();
@@ -1679,14 +1750,14 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1679
1750
  onElementExpanded: () => {
1680
1751
  this.#clearHighlightedNode();
1681
1752
  },
1682
- onHoverNode: (node: SDK.DOMModel.DOMNode, showInfo?: boolean) => {
1683
- this.setHoveredNode(node, showInfo);
1753
+ onHoverNode: (node: SDK.DOMModel.DOMNode|null, showInfo?: boolean, isClosingTag = false) => {
1754
+ this.setHoveredNode(node, showInfo, isClosingTag);
1684
1755
  },
1685
1756
  onLeave: () => {
1686
1757
  this.setHoveredNode(null);
1687
1758
  },
1688
- onSelect: (node: SDK.DOMModel.DOMNode, selectedByUser?: boolean) => {
1689
- this.selectDOMNode(node, selectedByUser);
1759
+ onSelect: (node: SDK.DOMModel.DOMNode, isClosingTag = false, selectedByUser?: boolean) => {
1760
+ this.selectDOMNode(node, selectedByUser, isClosingTag);
1690
1761
  },
1691
1762
  onExpand: (node: SDK.DOMModel.DOMNode, expanded: boolean) => {
1692
1763
  this.setNodeExpanded(node, expanded);
@@ -1726,6 +1797,7 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1726
1797
  onInitialEditCompleted: () => {
1727
1798
  this.#nodeToEdit = null;
1728
1799
  },
1800
+ multilineEditingNode: this.#multilineEditingNode,
1729
1801
  dragOverNode: this.#dragOverNode,
1730
1802
  isValidDragSource: (node: SDK.DOMModel.DOMNode) => this.isValidDragSource(node),
1731
1803
  onDragStart: (node: SDK.DOMModel.DOMNode, event: DragEvent, textContent?: string) =>
@@ -1850,12 +1922,10 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1850
1922
  this.performUpdate();
1851
1923
  }
1852
1924
 
1853
- /**
1854
- * FIXME: which node is expanded should be part of the view input.
1855
- */
1856
1925
  expand(): void {
1857
- if (this.#viewOutput.elementsTreeOutline?.selectedTreeElement) {
1858
- this.#viewOutput.elementsTreeOutline.selectedTreeElement.expand();
1926
+ const selectedNode = this.selectedDOMNode();
1927
+ if (selectedNode) {
1928
+ this.setNodeExpanded(selectedNode, true);
1859
1929
  }
1860
1930
  }
1861
1931
 
@@ -1915,15 +1985,22 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1915
1985
  }
1916
1986
 
1917
1987
  #multilineEditing: MultilineEditorController|null = null;
1988
+ #multilineEditingNode: SDK.DOMModel.DOMNode|null = null;
1918
1989
 
1919
- setMultilineEditing(multilineEditing: MultilineEditorController|null): void {
1990
+ setMultilineEditing(multilineEditing: MultilineEditorController|null, node?: SDK.DOMModel.DOMNode): void {
1920
1991
  this.#multilineEditing = multilineEditing;
1992
+ this.#multilineEditingNode = multilineEditing ? (node ?? this.#multilineEditingNode) : null;
1993
+ this.performUpdate();
1921
1994
  }
1922
1995
 
1923
1996
  multilineEditing(): MultilineEditorController|null {
1924
1997
  return this.#multilineEditing;
1925
1998
  }
1926
1999
 
2000
+ multilineEditingNode(): SDK.DOMModel.DOMNode|null {
2001
+ return this.#multilineEditingNode;
2002
+ }
2003
+
1927
2004
  runPendingUpdates(): void {
1928
2005
  this.updateModifiedNodes();
1929
2006
  if (this.#view !== DECLARATIVE_VIEW) {
@@ -1963,10 +2040,12 @@ export class DOMTreeWidget extends UI.Widget.Widget {
1963
2040
  const wasExpanded = this.isNodeExpanded(node);
1964
2041
 
1965
2042
  const editingFinished = (success: boolean): void => {
2043
+ this.#multilineEditingNode = null;
1966
2044
  if (callback) {
1967
2045
  callback();
1968
2046
  }
1969
2047
  if (!success) {
2048
+ this.performUpdate();
1970
2049
  return;
1971
2050
  }
1972
2051
 
@@ -2000,6 +2079,7 @@ export class DOMTreeWidget extends UI.Widget.Widget {
2000
2079
  return;
2001
2080
  }
2002
2081
 
2082
+ this.#multilineEditingNode = node;
2003
2083
  this.#nodeToEdit = {
2004
2084
  node,
2005
2085
  isEditAsHTML: true,
@@ -2723,8 +2803,8 @@ export class ElementsTreeOutline extends ElementsTreeOutlineBase {
2723
2803
  this.elementInternal.classList.toggle('elements-tree-nowrap', !wrap);
2724
2804
  }
2725
2805
 
2726
- setMultilineEditing(multilineEditing: MultilineEditorController|null): void {
2727
- this.domTreeWidget?.setMultilineEditing(multilineEditing);
2806
+ setMultilineEditing(multilineEditing: MultilineEditorController|null, node?: SDK.DOMModel.DOMNode): void {
2807
+ this.domTreeWidget?.setMultilineEditing(multilineEditing, node);
2728
2808
  }
2729
2809
 
2730
2810
  visibleWidth(): number {
@@ -3101,18 +3181,12 @@ export class ElementsTreeOutline extends ElementsTreeOutlineBase {
3101
3181
  return;
3102
3182
  }
3103
3183
 
3104
- const showInfo = !UI.KeyboardShortcut.KeyboardShortcut.eventHasEitherCtrlOrMeta(event);
3105
- if (this.domTreeWidget && element instanceof ElementsTreeElement) {
3106
- this.domTreeWidget.setHoveredNode(element.node(), showInfo);
3107
- return;
3108
- }
3109
-
3110
- this.domTreeWidget?.setHoveredNode(null);
3111
3184
  this.setHoverEffect(element);
3112
- this.highlightTreeElement((element as UI.TreeOutline.TreeElement), showInfo);
3185
+ const showInfo = !UI.KeyboardShortcut.KeyboardShortcut.eventHasEitherCtrlOrMeta(event);
3186
+ this.highlightTreeElement((element as UI.TreeOutline.TreeElement | null), showInfo);
3113
3187
  }
3114
3188
 
3115
- private highlightTreeElement(element: UI.TreeOutline.TreeElement, showInfo: boolean): void {
3189
+ private highlightTreeElement(element: UI.TreeOutline.TreeElement|null, showInfo: boolean): void {
3116
3190
  if (element instanceof ElementsTreeElement) {
3117
3191
  const selectorList = element.isDisplayContents() ? '*' : undefined;
3118
3192
  element.node().domModel().overlayModel().highlightInOverlay({node: element.node(), selectorList}, 'all',
@@ -3123,11 +3197,13 @@ export class ElementsTreeOutline extends ElementsTreeOutlineBase {
3123
3197
  if (element instanceof ShortcutTreeElement) {
3124
3198
  element.domModel().overlayModel().highlightInOverlay(
3125
3199
  {deferredNode: element.deferredNode(), selectorList: undefined}, 'all', showInfo);
3200
+ return;
3126
3201
  }
3202
+
3203
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
3127
3204
  }
3128
3205
 
3129
3206
  private onmouseleave(_event: MouseEvent): void {
3130
- this.domTreeWidget?.setHoveredNode(null);
3131
3207
  this.setHoverEffect(null);
3132
3208
  SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
3133
3209
  }
@@ -3816,7 +3892,7 @@ export namespace ElementsTreeOutline {
3816
3892
  }
3817
3893
 
3818
3894
  // clang-format off
3819
- export const MappedCharToEntity = new Map<string, string>([
3895
+ export const MappedCharToEntity: Map<string, string> = new Map<string, string>([
3820
3896
  ['\xA0', 'nbsp'],
3821
3897
  ['\xAD', 'shy'],
3822
3898
  ['\u2002', 'ensp'],