chrome-devtools-frontend 1.0.1657110 → 1.0.1660788

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 (317) hide show
  1. package/.agents/skills/devtools-ux-writing-refactor/SKILL.md +125 -0
  2. package/.agents/skills/migrate-chromium-test/SKILL.md +15 -70
  3. package/.agents/skills/repro-flaky-tests/SKILL.md +53 -0
  4. package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +37 -18
  5. package/.agents/skills/version-control/SKILL.md +8 -1
  6. package/AUTHORS +1 -0
  7. package/SECURITY.md +3 -0
  8. package/docs/get_the_code.md +6 -0
  9. package/front_end/Images/src/ads.svg +1 -0
  10. package/front_end/Tests.js +6 -6
  11. package/front_end/core/common/Gzip.ts +12 -5
  12. package/front_end/core/common/ResourceType.ts +19 -19
  13. package/front_end/core/common/Revealer.ts +15 -15
  14. package/front_end/core/common/SettingRegistration.ts +19 -19
  15. package/front_end/core/host/AidaClient.ts +35 -9
  16. package/front_end/core/host/GdpClient.ts +10 -7
  17. package/front_end/core/platform/StringUtilities.ts +35 -0
  18. package/front_end/core/sdk/AccessibilityModel.snapshot.txt +17 -0
  19. package/front_end/core/sdk/AccessibilityModel.ts +132 -2
  20. package/front_end/core/sdk/CPUThrottlingManager.ts +8 -5
  21. package/front_end/core/sdk/CSSMetadata.ts +110 -16
  22. package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +2 -5
  23. package/front_end/core/sdk/ConsoleModel.ts +5 -5
  24. package/front_end/core/sdk/DOMDebuggerModel.ts +5 -1
  25. package/front_end/core/sdk/DOMModel.ts +32 -18
  26. package/front_end/core/sdk/NetworkManager.ts +58 -14
  27. package/front_end/core/sdk/NetworkRequest.ts +37 -1
  28. package/front_end/core/sdk/OverlayModel.ts +45 -6
  29. package/front_end/core/sdk/ResourceTreeModel.ts +6 -7
  30. package/front_end/core/sdk/ScreenCaptureModel.ts +2 -2
  31. package/front_end/core/sdk/ServerTiming.ts +17 -13
  32. package/front_end/core/sdk/ServiceWorkerCacheModel.ts +4 -2
  33. package/front_end/core/sdk/ServiceWorkerManager.ts +19 -5
  34. package/front_end/core/sdk/TargetManager.ts +10 -1
  35. package/front_end/core/sdk/TraceObject.ts +4 -2
  36. package/front_end/core/sdk/sdk-meta.ts +170 -0
  37. package/front_end/design_system_tokens.css +0 -5
  38. package/front_end/entrypoints/devtools_app/devtools_app.ts +1 -1
  39. package/front_end/entrypoints/formatter_worker/CSSFormatter.ts +13 -4
  40. package/front_end/entrypoints/formatter_worker/FormattedContentBuilder.ts +5 -2
  41. package/front_end/entrypoints/formatter_worker/FormatterWorker.ts +23 -4
  42. package/front_end/entrypoints/formatter_worker/HTMLFormatter.ts +33 -10
  43. package/front_end/entrypoints/formatter_worker/JavaScriptFormatter.ts +8 -3
  44. package/front_end/entrypoints/inspector_main/InspectorMain.ts +4 -4
  45. package/front_end/entrypoints/inspector_main/OutermostTargetSelector.ts +2 -2
  46. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +36 -37
  47. package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +15 -33
  48. package/front_end/entrypoints/js_app/js_app.ts +6 -5
  49. package/front_end/entrypoints/main/GlobalAiButton.ts +4 -4
  50. package/front_end/entrypoints/main/MainImpl.ts +25 -55
  51. package/front_end/entrypoints/main/main-meta.ts +50 -50
  52. package/front_end/entrypoints/node_app/app/NodeConnectionsPanel.ts +5 -5
  53. package/front_end/entrypoints/node_app/app/NodeMain.ts +3 -3
  54. package/front_end/entrypoints/node_app/node_app.ts +10 -9
  55. package/front_end/entrypoints/worker_app/WorkerMain.ts +1 -1
  56. package/front_end/foundation/Universe.ts +76 -6
  57. package/front_end/generated/InspectorBackendCommands.ts +3 -3
  58. package/front_end/generated/SupportedCSSProperties.js +19 -12
  59. package/front_end/generated/protocol.ts +7 -1
  60. package/front_end/models/ai_assistance/AiConversation.ts +19 -17
  61. package/front_end/models/ai_assistance/AiHistoryStorage.ts +37 -14
  62. package/front_end/models/ai_assistance/AiUtils.ts +38 -42
  63. package/front_end/models/ai_assistance/agents/AiAgent.ts +5 -1
  64. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +3 -2
  65. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +2 -1
  66. package/front_end/models/ai_assistance/agents/StorageAgent.ts +7 -5
  67. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +270 -286
  68. package/front_end/models/ai_assistance/data_formatters/UnitFormatters.ts +20 -0
  69. package/front_end/models/ai_assistance/performance/AICallTree.ts +3 -1
  70. package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +3 -2
  71. package/front_end/models/autofill_manager/AutofillManager.ts +3 -1
  72. package/front_end/models/bindings/CSSWorkspaceBinding.ts +8 -5
  73. package/front_end/models/bindings/CompilerScriptMapping.ts +2 -1
  74. package/front_end/models/bindings/DebuggerLanguagePlugins.ts +15 -16
  75. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +6 -4
  76. package/front_end/models/bindings/FileUtils.ts +11 -12
  77. package/front_end/models/bindings/NetworkProject.ts +4 -0
  78. package/front_end/models/bindings/PresentationConsoleMessageHelper.ts +2 -1
  79. package/front_end/models/bindings/ResourceUtils.ts +1 -1
  80. package/front_end/models/bindings/SASSSourceMapping.ts +8 -5
  81. package/front_end/models/emulation/DeviceModeModel.ts +14 -14
  82. package/front_end/models/emulation/EmulatedDevices.ts +392 -11
  83. package/front_end/models/extensions/ExtensionAPI.ts +6 -6
  84. package/front_end/models/extensions/LanguageExtensionEndpoint.ts +13 -12
  85. package/front_end/models/issues_manager/BounceTrackingIssue.ts +1 -1
  86. package/front_end/models/issues_manager/ClientHintIssue.ts +1 -1
  87. package/front_end/models/issues_manager/ConnectionAllowlistIssue.ts +1 -1
  88. package/front_end/models/issues_manager/ContentSecurityPolicyIssue.ts +7 -7
  89. package/front_end/models/issues_manager/CookieDeprecationMetadataIssue.ts +2 -2
  90. package/front_end/models/issues_manager/CookieIssue.ts +6 -7
  91. package/front_end/models/issues_manager/CorsIssue.ts +3 -3
  92. package/front_end/models/issues_manager/CrossOriginEmbedderPolicyIssue.ts +2 -2
  93. package/front_end/models/issues_manager/DeprecationIssue.ts +3 -3
  94. package/front_end/models/issues_manager/EmailVerificationRequestIssue.ts +1 -1
  95. package/front_end/models/issues_manager/FederatedAuthRequestIssue.ts +1 -1
  96. package/front_end/models/issues_manager/FederatedAuthUserInfoRequestIssue.ts +1 -1
  97. package/front_end/models/issues_manager/GenericIssue.ts +7 -7
  98. package/front_end/models/issues_manager/HeavyAdIssue.ts +3 -3
  99. package/front_end/models/issues_manager/Issue.ts +8 -8
  100. package/front_end/models/issues_manager/MixedContentIssue.ts +1 -1
  101. package/front_end/models/issues_manager/PartitioningBlobURLIssue.ts +3 -3
  102. package/front_end/models/issues_manager/QuirksModeIssue.ts +1 -1
  103. package/front_end/models/issues_manager/SRIMessageSignatureIssue.ts +2 -2
  104. package/front_end/models/issues_manager/SelectivePermissionsInterventionIssue.ts +2 -2
  105. package/front_end/models/issues_manager/SharedArrayBufferIssue.ts +2 -2
  106. package/front_end/models/issues_manager/SharedDictionaryIssue.ts +1 -1
  107. package/front_end/models/issues_manager/UnencodedDigestIssue.ts +3 -3
  108. package/front_end/models/javascript_metadata/NativeFunctions.js +5 -1
  109. package/front_end/models/stack_trace/StackTraceModel.ts +3 -3
  110. package/front_end/models/text_utils/ContentData.ts +27 -0
  111. package/front_end/models/trace/helpers/SamplesIntegrator.ts +21 -5
  112. package/front_end/models/trace_source_maps_resolver/SourceMapsResolver.ts +29 -14
  113. package/front_end/models/web_mcp/WebMCPModel.ts +24 -6
  114. package/front_end/models/workspace/IgnoreListManager.ts +6 -6
  115. package/front_end/models/workspace/UISourceCode.ts +3 -3
  116. package/front_end/models/workspace_diff/WorkspaceDiff.ts +23 -12
  117. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +25 -22
  118. package/front_end/panels/ai_assistance/ExportConversation.ts +3 -4
  119. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +3 -3
  120. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
  121. package/front_end/panels/ai_assistance/components/ChatMessage.ts +7 -0
  122. package/front_end/panels/ai_assistance/components/DisabledWidget.ts +2 -2
  123. package/front_end/panels/animation/AnimationTimeline.ts +17 -19
  124. package/front_end/panels/animation/AnimationUI.ts +5 -5
  125. package/front_end/panels/animation/animation-meta.ts +2 -2
  126. package/front_end/panels/application/ApplicationPanelSidebar.ts +13 -4
  127. package/front_end/panels/application/BackgroundServiceView.ts +2 -1
  128. package/front_end/panels/application/DeviceBoundSessionsView.ts +2 -6
  129. package/front_end/panels/application/IndexedDBViews.ts +245 -262
  130. package/front_end/panels/application/OpenedWindowDetailsView.ts +1 -1
  131. package/front_end/panels/application/ResourcesPanel.ts +9 -2
  132. package/front_end/panels/application/ServiceWorkersView.ts +252 -211
  133. package/front_end/panels/application/StorageView.ts +97 -33
  134. package/front_end/panels/application/WebMCPView.ts +15 -1
  135. package/front_end/panels/application/components/AdsView.ts +1 -1
  136. package/front_end/panels/application/indexedDBViews.css +38 -9
  137. package/front_end/panels/application/preloading/helper/PreloadingForward.ts +2 -1
  138. package/front_end/panels/application/resourcesSidebar.css +5 -0
  139. package/front_end/panels/application/storageView.css +26 -9
  140. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +5 -1
  141. package/front_end/panels/browser_debugger/browser_debugger-meta.ts +8 -6
  142. package/front_end/panels/common/DOMLinkifier.ts +1 -1
  143. package/front_end/panels/common/ExtensionServer.ts +119 -14
  144. package/front_end/panels/console/ConsoleContextSelector.ts +4 -4
  145. package/front_end/panels/console/ConsolePinPane.ts +12 -12
  146. package/front_end/panels/console/ConsolePrompt.ts +6 -6
  147. package/front_end/panels/console/ConsoleSidebar.ts +7 -7
  148. package/front_end/panels/console/ConsoleView.ts +45 -44
  149. package/front_end/panels/console/ConsoleViewMessage.ts +40 -40
  150. package/front_end/panels/console/SymbolizedErrorWidget.ts +2 -1
  151. package/front_end/panels/console/console-meta.ts +34 -34
  152. package/front_end/panels/console_counters/WarningErrorCounter.ts +2 -2
  153. package/front_end/panels/coverage/CoverageListView.ts +28 -28
  154. package/front_end/panels/coverage/CoverageModel.ts +2 -1
  155. package/front_end/panels/coverage/CoverageView.ts +23 -23
  156. package/front_end/panels/coverage/coverage-meta.ts +5 -5
  157. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +36 -36
  158. package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +1 -1
  159. package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +2 -2
  160. package/front_end/panels/css_overview/CSSOverviewStartView.ts +6 -6
  161. package/front_end/panels/css_overview/CSSOverviewUnusedDeclarations.ts +6 -6
  162. package/front_end/panels/css_overview/css_overview-meta.ts +2 -2
  163. package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +20 -21
  164. package/front_end/panels/developer_resources/DeveloperResourcesView.ts +6 -8
  165. package/front_end/panels/developer_resources/developer_resources-meta.ts +2 -2
  166. package/front_end/panels/elements/AccessibilityTreeUtils.ts +8 -102
  167. package/front_end/panels/elements/AccessibilityTreeView.ts +163 -70
  168. package/front_end/panels/elements/ElementsPanel.ts +17 -11
  169. package/front_end/panels/elements/ElementsTreeElement.ts +49 -2
  170. package/front_end/panels/elements/ElementsTreeOutline.ts +4 -4
  171. package/front_end/panels/elements/LayoutPane.ts +1 -1
  172. package/front_end/panels/elements/MetricsSidebarPane.ts +100 -34
  173. package/front_end/panels/elements/StylePropertiesSection.ts +2 -2
  174. package/front_end/panels/elements/StylePropertyTreeElement.ts +8 -2
  175. package/front_end/panels/elements/StylesSidebarPane.ts +1 -1
  176. package/front_end/panels/elements/components/AccessibilityTreeNode.ts +7 -18
  177. package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +2 -2
  178. package/front_end/panels/elements/components/QueryContainer.ts +1 -1
  179. package/front_end/panels/issues/AffectedDirectivesView.ts +1 -1
  180. package/front_end/panels/issues/AffectedResourcesView.ts +2 -1
  181. package/front_end/panels/layer_viewer/LayerViewHost.ts +1 -1
  182. package/front_end/panels/media/EventDisplayTable.ts +2 -2
  183. package/front_end/panels/media/EventTimelineView.ts +4 -4
  184. package/front_end/panels/media/MainView.ts +4 -4
  185. package/front_end/panels/media/PlayerDetailView.ts +5 -5
  186. package/front_end/panels/media/PlayerListView.ts +1 -1
  187. package/front_end/panels/media/PlayerMessagesView.ts +12 -12
  188. package/front_end/panels/media/PlayerPropertiesView.ts +17 -17
  189. package/front_end/panels/network/NetworkDataGridNode.ts +124 -36
  190. package/front_end/panels/network/NetworkLogView.ts +11 -2
  191. package/front_end/panels/network/NetworkLogViewColumns.ts +18 -0
  192. package/front_end/panels/network/NetworkPanel.ts +2 -1
  193. package/front_end/panels/network/NetworkWaterfallColumn.ts +1 -3
  194. package/front_end/panels/network/RequestConditionsDrawer.ts +2 -2
  195. package/front_end/panels/network/RequestPayloadView.ts +53 -7
  196. package/front_end/panels/network/RequestPreviewView.ts +7 -1
  197. package/front_end/panels/network/components/ResponseHeaderSection.ts +1 -1
  198. package/front_end/panels/network/forward/UIFilter.ts +1 -0
  199. package/front_end/panels/network/networkPanel.css +1 -0
  200. package/front_end/panels/network/networkTimingTable.css +1 -1
  201. package/front_end/panels/network/requestPayloadView.css +10 -0
  202. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +12 -12
  203. package/front_end/panels/performance_monitor/performance_monitor-meta.ts +7 -7
  204. package/front_end/panels/profiler/HeapDetachedElementsView.ts +2 -2
  205. package/front_end/panels/profiler/HeapProfileView.ts +563 -51
  206. package/front_end/panels/profiler/HeapSnapshotView.ts +15 -9
  207. package/front_end/panels/profiler/ProfilesPanel.ts +13 -7
  208. package/front_end/panels/profiler/WritableProfileHeader.ts +152 -0
  209. package/front_end/panels/profiler/profiler.ts +2 -2
  210. package/front_end/panels/protocol_monitor/JSONEditor.ts +10 -10
  211. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +28 -32
  212. package/front_end/panels/protocol_monitor/protocol_monitor-meta.ts +1 -1
  213. package/front_end/panels/recorder/RecorderController.ts +15 -15
  214. package/front_end/panels/recorder/RecorderEvents.ts +8 -0
  215. package/front_end/panels/recorder/components/CreateRecordingView.ts +11 -11
  216. package/front_end/panels/recorder/components/ExtensionView.ts +74 -83
  217. package/front_end/panels/recorder/components/RecordingListView.ts +3 -3
  218. package/front_end/panels/recorder/components/RecordingView.ts +13 -10
  219. package/front_end/panels/recorder/components/ReplaySection.ts +9 -9
  220. package/front_end/panels/recorder/components/StepEditor.ts +352 -321
  221. package/front_end/panels/recorder/components/StepView.ts +36 -37
  222. package/front_end/panels/recorder/components/recordingView.css +1 -1
  223. package/front_end/panels/recorder/models/RecorderSettings.ts +2 -2
  224. package/front_end/panels/recorder/recorder-meta.ts +7 -7
  225. package/front_end/panels/screencast/ScreencastApp.ts +1 -1
  226. package/front_end/panels/screencast/ScreencastView.ts +12 -12
  227. package/front_end/panels/search/SearchResultsPane.ts +4 -4
  228. package/front_end/panels/search/SearchView.ts +20 -20
  229. package/front_end/panels/security/SecurityModel.ts +7 -7
  230. package/front_end/panels/security/SecurityPanel.ts +99 -107
  231. package/front_end/panels/security/SecurityPanelSidebar.ts +7 -7
  232. package/front_end/panels/security/security-meta.ts +2 -2
  233. package/front_end/panels/sensors/LocationsSettingsTab.ts +19 -19
  234. package/front_end/panels/sensors/SensorsView.ts +27 -27
  235. package/front_end/panels/sensors/sensors-meta.ts +13 -167
  236. package/front_end/panels/settings/AISettingsTab.ts +98 -56
  237. package/front_end/panels/settings/EditFileSystemView.ts +2 -2
  238. package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +20 -20
  239. package/front_end/panels/settings/KeybindsSettingsTab.ts +20 -21
  240. package/front_end/panels/settings/SettingsScreen.ts +11 -11
  241. package/front_end/panels/settings/WorkspaceSettingsTab.ts +5 -5
  242. package/front_end/panels/settings/components/SyncSection.ts +12 -12
  243. package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +13 -13
  244. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +31 -31
  245. package/front_end/panels/settings/emulation/emulation-meta.ts +1 -1
  246. package/front_end/panels/settings/settings-meta.ts +14 -14
  247. package/front_end/panels/sources/NavigatorView.ts +7 -6
  248. package/front_end/panels/sources/ScopeChainSidebarPane.ts +83 -37
  249. package/front_end/panels/sources/SourcesNavigator.ts +20 -18
  250. package/front_end/panels/sources/SourcesView.ts +10 -1
  251. package/front_end/panels/sources/scopeChainSidebarPane.css +12 -4
  252. package/front_end/panels/sources/sources-meta.ts +4 -4
  253. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +5 -2
  254. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +2 -1
  255. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +2 -1
  256. package/front_end/panels/timeline/TimelineFlameChartView.ts +1 -1
  257. package/front_end/panels/timeline/TimelinePanel.ts +2 -1
  258. package/front_end/panels/timeline/TimelineUIUtils.ts +5 -2
  259. package/front_end/panels/timeline/components/NetworkRequestDetails.ts +4 -2
  260. package/front_end/panels/timeline/components/NetworkRequestTooltip.ts +4 -2
  261. package/front_end/panels/timeline/components/insights/ImageRef.ts +2 -1
  262. package/front_end/panels/utils/utils.ts +7 -3
  263. package/front_end/panels/web_audio/WebAudioView.ts +17 -18
  264. package/front_end/panels/web_audio/web_audio-meta.ts +3 -3
  265. package/front_end/panels/webauthn/WebauthnPane.ts +10 -10
  266. package/front_end/panels/whats_new/ReleaseNoteView.ts +1 -1
  267. package/front_end/panels/whats_new/whats_new-meta.ts +11 -11
  268. package/front_end/third_party/chromium/README.chromium +1 -1
  269. package/front_end/third_party/lit/lib/async-directive.d.ts +2 -1
  270. package/front_end/third_party/lit/lib/async-directive.js +1 -1
  271. package/front_end/third_party/lit/lib/async-directive.js.map +1 -1
  272. package/front_end/third_party/lit/lib/decorators.d.ts +2 -1
  273. package/front_end/third_party/lit/lib/decorators.js.map +1 -1
  274. package/front_end/third_party/lit/lib/directive.d.ts +2 -1
  275. package/front_end/third_party/lit/lib/directive.js.map +1 -1
  276. package/front_end/third_party/lit/lib/directives.d.ts +2 -1
  277. package/front_end/third_party/lit/lib/directives.js +8 -8
  278. package/front_end/third_party/lit/lib/directives.js.map +1 -1
  279. package/front_end/third_party/lit/lib/lit.d.ts +2 -1
  280. package/front_end/third_party/lit/lib/lit.js +1 -1
  281. package/front_end/third_party/lit/lib/lit.js.map +1 -1
  282. package/front_end/third_party/lit/lib/static-html.d.ts +2 -1
  283. package/front_end/third_party/lit/lib/static-html.js +1 -1
  284. package/front_end/third_party/lit/lib/static-html.js.map +1 -1
  285. package/front_end/third_party/lit/package.json +2 -2
  286. package/front_end/third_party/lit/rebuild.sh +1 -1
  287. package/front_end/third_party/lit/src/async-directive.ts +5 -0
  288. package/front_end/ui/components/dialogs/Dialog.ts +1 -1
  289. package/front_end/ui/components/dialogs/ShortcutDialog.ts +1 -1
  290. package/front_end/ui/components/dialogs/shortcutDialog.css +15 -12
  291. package/front_end/ui/components/diff_view/DiffView.ts +2 -2
  292. package/front_end/ui/components/issue_counter/IssueCounter.ts +3 -3
  293. package/front_end/ui/components/issue_counter/IssueLinkIcon.ts +5 -5
  294. package/front_end/ui/components/lists/List.ts +2 -2
  295. package/front_end/ui/components/panel_feedback/PreviewToggle.ts +1 -1
  296. package/front_end/ui/components/request_link_icon/RequestLinkIcon.ts +5 -5
  297. package/front_end/ui/components/settings/SettingCheckbox.ts +1 -1
  298. package/front_end/ui/components/snackbars/Snackbar.ts +1 -1
  299. package/front_end/ui/components/survey_link/SurveyLink.ts +3 -3
  300. package/front_end/ui/components/text_editor/config.ts +2 -2
  301. package/front_end/ui/components/tree_outline/TreeOutline.ts +34 -1
  302. package/front_end/ui/legacy/ReportView.ts +5 -0
  303. package/front_end/ui/legacy/Treeoutline.ts +18 -0
  304. package/front_end/ui/legacy/View.ts +1 -1
  305. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +2 -0
  306. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +8 -3
  307. package/front_end/ui/legacy/components/data_grid/data_grid.ts +1 -0
  308. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +1 -1
  309. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +100 -36
  310. package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +7 -1
  311. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +5 -0
  312. package/front_end/ui/legacy/components/utils/ImagePreview.ts +4 -2
  313. package/front_end/ui/legacy/inspectorCommon.css +5 -0
  314. package/front_end/ui/visual_logging/KnownContextValues.ts +4 -0
  315. package/mcp/mcp.ts +2 -0
  316. package/package.json +4 -4
  317. package/front_end/panels/profiler/ProfileView.ts +0 -610
@@ -1,128 +1,222 @@
1
1
  // Copyright 2020 The Chromium Authors
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
- /* eslint-disable @devtools/no-imperative-dom-api */
5
4
 
6
5
  import type * as Common from '../../core/common/common.js';
6
+ import * as i18n from '../../core/i18n/i18n.js';
7
7
  import * as SDK from '../../core/sdk/sdk.js';
8
8
  import * as TreeOutline from '../../ui/components/tree_outline/tree_outline.js';
9
9
  import * as UI from '../../ui/legacy/legacy.js';
10
+ import * as Lit from '../../ui/lit/lit.js';
10
11
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
11
12
 
12
13
  import * as AccessibilityTreeUtils from './AccessibilityTreeUtils.js';
13
14
  import accessibilityTreeViewStyles from './accessibilityTreeView.css.js';
14
15
  import {ElementsPanel} from './ElementsPanel.js';
15
16
 
17
+ const {html, render, Directives: {ref}} = Lit;
18
+ const UIStrings = {
19
+ /**
20
+ * @description Text for copying, copy should be used as a verb
21
+ */
22
+ copy: 'Copy',
23
+ } as const;
24
+ const str_ = i18n.i18n.registerUIStrings('panels/elements/AccessibilityTreeView.ts', UIStrings);
25
+ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
26
+
27
+ export interface ViewInput {
28
+ nodes: AccessibilityTreeUtils.AXTreeNode[];
29
+ onNodeSelected: (node: SDK.AccessibilityModel.AccessibilityNode) => void;
30
+ onNodeHighlight: (node: SDK.AccessibilityModel.AccessibilityNode) => void;
31
+ onNodeClearHighlight: () => void;
32
+ onCopy: (node: SDK.AccessibilityModel.AccessibilityNode) => void;
33
+ }
34
+
35
+ export interface ViewOutput {
36
+ expandRoots?(): Promise<void>;
37
+ revealNode?(ancestors: string[], nodeId: string): Promise<void>;
38
+ }
39
+
40
+ export type View = (input: ViewInput, output: ViewOutput, target: HTMLElement) => void;
41
+
42
+ export const DEFAULT_VIEW: View = (input, output, target) => {
43
+ const treeData: TreeOutline.TreeOutline.TreeOutlineData<AccessibilityTreeUtils.AXTreeNodeData> = {
44
+ defaultRenderer: AccessibilityTreeUtils.accessibilityNodeRenderer,
45
+ tree: input.nodes,
46
+ filter: node => {
47
+ return node.ignored() || (node.role()?.value === 'generic' && !node.name()?.value) ?
48
+ TreeOutline.TreeOutline.FilterOption.FLATTEN :
49
+ TreeOutline.TreeOutline.FilterOption.SHOW;
50
+ },
51
+ };
52
+
53
+ const onTreeOutlineRef = (el?: Element): void => {
54
+ const treeOutline = el as TreeOutline.TreeOutline.TreeOutline<AccessibilityTreeUtils.AXTreeNodeData>| undefined;
55
+ if (treeOutline) {
56
+ output.expandRoots = () => treeOutline.expandRecursively(1);
57
+ output.revealNode = (ancestors: string[], nodeId: string) =>
58
+ treeOutline.expandNodeIds(ancestors).then(() => treeOutline.focusNodeId(nodeId));
59
+ } else {
60
+ output.expandRoots = undefined;
61
+ output.revealNode = undefined;
62
+ }
63
+ };
64
+
65
+ let selectedAXNode: SDK.AccessibilityModel.AccessibilityNode|null = null;
66
+
67
+ const onItemSelected =
68
+ (event: TreeOutline.TreeOutline.ItemSelectedEvent<AccessibilityTreeUtils.AXTreeNodeData>): void => {
69
+ selectedAXNode = event.data.node.treeNodeData;
70
+ input.onNodeSelected(selectedAXNode);
71
+ };
72
+ const onItemMouseOver =
73
+ (event: TreeOutline.TreeOutline.ItemMouseOverEvent<AccessibilityTreeUtils.AXTreeNodeData>): void => {
74
+ input.onNodeHighlight(event.data.node.treeNodeData);
75
+ };
76
+ const onItemMouseOut = (): void => {
77
+ input.onNodeClearHighlight();
78
+ };
79
+ const onItemContextMenu =
80
+ (event: TreeOutline.TreeOutline.ItemContextMenuEvent<AccessibilityTreeUtils.AXTreeNodeData>): void => {
81
+ event.data.originalEvent.preventDefault();
82
+ event.data.originalEvent.stopPropagation();
83
+ const contextMenu = new UI.ContextMenu.ContextMenu(event.data.originalEvent);
84
+ const axNode = event.data.node.treeNodeData;
85
+ contextMenu.clipboardSection().appendItem(i18nString(UIStrings.copy), () => input.onCopy(axNode),
86
+ {jslogContext: 'copy'});
87
+ void contextMenu.show();
88
+ };
89
+
90
+ const onCopy = (event: ClipboardEvent): void => {
91
+ event.preventDefault();
92
+ event.stopPropagation();
93
+ if (selectedAXNode) {
94
+ input.onCopy(selectedAXNode);
95
+ }
96
+ };
97
+
98
+ // clang-format off
99
+ render(html`
100
+ <div class="accessibility-tree-view-container" jslog=${VisualLogging.tree('full-accessibility')} @copy=${onCopy}>
101
+ <devtools-tree-outline .data=${treeData}
102
+ @itemselected=${onItemSelected}
103
+ @itemmouseover=${onItemMouseOver}
104
+ @itemmouseout=${onItemMouseOut}
105
+ @itemcontextmenu=${onItemContextMenu}
106
+ ${ref(onTreeOutlineRef)}></devtools-tree-outline>
107
+ </div>
108
+ `, target);
109
+ // clang-format on
110
+ };
16
111
  export class AccessibilityTreeView extends UI.Widget.VBox implements
17
112
  SDK.TargetManager.SDKModelObserver<SDK.AccessibilityModel.AccessibilityModel> {
18
- private accessibilityTreeComponent: TreeOutline.TreeOutline.TreeOutline<AccessibilityTreeUtils.AXTreeNodeData>;
19
113
  private inspectedDOMNode: SDK.DOMModel.DOMNode|null = null;
20
114
  private root: SDK.AccessibilityModel.AccessibilityNode|null = null;
21
115
 
116
+ readonly #view: View;
22
117
  readonly #frameManager: SDK.FrameManager.FrameManager;
118
+ readonly #treeOperations: ViewOutput = {};
23
119
 
24
- constructor(accessibilityTreeComponent: TreeOutline.TreeOutline.TreeOutline<AccessibilityTreeUtils.AXTreeNodeData>,
120
+ constructor(view: View = DEFAULT_VIEW,
25
121
  frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance()) {
26
122
  super();
123
+ this.#view = view;
27
124
  this.registerRequiredCSS(accessibilityTreeViewStyles);
28
- this.accessibilityTreeComponent = accessibilityTreeComponent;
29
125
  this.#frameManager = frameManager;
30
126
 
31
- const container = this.contentElement.createChild('div');
32
-
33
- container.classList.add('accessibility-tree-view-container');
34
- container.setAttribute('jslog', `${VisualLogging.tree('full-accessibility')}`);
35
- container.appendChild(this.accessibilityTreeComponent);
127
+ SDK.TargetManager.TargetManager.instance().observeModels(SDK.AccessibilityModel.AccessibilityModel, this,
128
+ {scoped: true});
129
+ }
36
130
 
37
- SDK.TargetManager.TargetManager.instance().observeModels(
38
- SDK.AccessibilityModel.AccessibilityModel, this, {scoped: true});
131
+ #onNodeSelected = (axNode: SDK.AccessibilityModel.AccessibilityNode): void => {
132
+ if (!axNode.isDOMNode()) {
133
+ return;
134
+ }
135
+ const deferredNode = axNode.deferredDOMNode();
136
+ if (deferredNode) {
137
+ deferredNode.resolve(domNode => {
138
+ if (domNode) {
139
+ this.inspectedDOMNode = domNode;
140
+ void ElementsPanel.instance().revealAndSelectNode(
141
+ domNode, {showPanel: true, focusNode: true, highlightInOverlay: true});
142
+ }
143
+ });
144
+ }
145
+ };
39
146
 
40
- // The DOM tree and accessibility are kept in sync as much as possible, so
41
- // on node selection, update the currently inspected node and reveal in the
42
- // DOM tree.
43
- this.accessibilityTreeComponent.addEventListener('itemselected', (event: Event) => {
44
- const evt = event as TreeOutline.TreeOutline.ItemSelectedEvent<AccessibilityTreeUtils.AXTreeNodeData>;
45
- const axNode = evt.data.node.treeNodeData;
46
- if (!axNode.isDOMNode()) {
47
- return;
48
- }
49
- const deferredNode = axNode.deferredDOMNode();
50
- if (deferredNode) {
51
- deferredNode.resolve(domNode => {
52
- if (domNode) {
53
- this.inspectedDOMNode = domNode;
54
- void ElementsPanel.instance().revealAndSelectNode(
55
- domNode, {showPanel: true, focusNode: true, highlightInOverlay: true});
56
- }
57
- });
58
- }
59
- });
147
+ #onNodeHighlight = (axNode: SDK.AccessibilityModel.AccessibilityNode): void => {
148
+ axNode.highlightDOMNode();
149
+ };
60
150
 
61
- this.accessibilityTreeComponent.addEventListener('itemmouseover', (event: Event) => {
62
- const evt = event as TreeOutline.TreeOutline.ItemMouseOverEvent<AccessibilityTreeUtils.AXTreeNodeData>;
63
- evt.data.node.treeNodeData.highlightDOMNode();
64
- });
151
+ #onNodeClearHighlight = (): void => {
152
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
153
+ };
65
154
 
66
- this.accessibilityTreeComponent.addEventListener('itemmouseout', () => {
67
- SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
68
- });
69
- }
155
+ #onCopy = async(axNode: SDK.AccessibilityModel.AccessibilityNode): Promise<void> => {
156
+ const text = await axNode.axNodeToText();
157
+ UI.UIUtils.copyTextToClipboard(text);
158
+ };
70
159
 
71
160
  override async wasShown(): Promise<void> {
72
161
  super.wasShown();
162
+ this.requestUpdate();
73
163
  await this.refreshAccessibilityTree();
74
164
  if (this.inspectedDOMNode) {
75
165
  await this.loadSubTreeIntoAccessibilityModel(this.inspectedDOMNode);
76
166
  }
77
167
  }
78
168
 
79
- async refreshAccessibilityTree(): Promise<void> {
169
+ override async performUpdate(): Promise<void> {
170
+ let nodes: AccessibilityTreeUtils.AXTreeNode[] = [];
80
171
  if (!this.root) {
81
172
  const frameId = this.#frameManager.getOutermostFrame()?.id;
82
- if (!frameId) {
83
- throw new Error('No top frame');
84
- }
85
- this.root = await AccessibilityTreeUtils.getRootNode(frameId, this.#frameManager);
86
- if (!this.root) {
87
- throw new Error('No root');
173
+ if (frameId) {
174
+ this.root = await SDK.AccessibilityModel.getRootNode(frameId, this.#frameManager);
88
175
  }
89
176
  }
90
- await this.renderTree();
91
- await this.accessibilityTreeComponent.expandRecursively(1);
177
+ if (this.root) {
178
+ nodes = await AccessibilityTreeUtils.sdkNodeToAXTreeNodes(this.root);
179
+ }
180
+ const input: ViewInput = {
181
+ nodes,
182
+ onNodeSelected: this.#onNodeSelected,
183
+ onNodeHighlight: this.#onNodeHighlight,
184
+ onNodeClearHighlight: this.#onNodeClearHighlight,
185
+ onCopy: this.#onCopy,
186
+ };
187
+ this.#view(input, this.#treeOperations, this.contentElement);
92
188
  }
93
189
 
94
- async renderTree(): Promise<void> {
190
+ async refreshAccessibilityTree(): Promise<void> {
95
191
  if (!this.root) {
96
192
  const frameId = this.#frameManager.getOutermostFrame()?.id;
97
- if (frameId) {
98
- this.root = await AccessibilityTreeUtils.getRootNode(frameId, this.#frameManager);
193
+ if (!frameId) {
194
+ throw new Error('No top frame');
195
+ }
196
+ this.root = await SDK.AccessibilityModel.getRootNode(frameId, this.#frameManager);
197
+ if (!this.root) {
198
+ throw new Error('No root');
99
199
  }
100
200
  }
101
- if (!this.root) {
102
- return;
103
- }
104
- const treeData = await AccessibilityTreeUtils.sdkNodeToAXTreeNodes(this.root, this.#frameManager);
105
- this.accessibilityTreeComponent.data = {
106
- defaultRenderer: AccessibilityTreeUtils.accessibilityNodeRenderer,
107
- tree: treeData,
108
- filter: node => {
109
- return node.ignored() || (node.role()?.value === 'generic' && !node.name()?.value) ?
110
- TreeOutline.TreeOutline.FilterOption.FLATTEN :
111
- TreeOutline.TreeOutline.FilterOption.SHOW;
112
- },
113
- };
201
+ this.requestUpdate();
202
+ await this.updateComplete;
203
+ await this.#treeOperations.expandRoots?.();
114
204
  }
115
205
 
116
206
  // Given a selected DOM node, asks the model to load the missing subtree from the root to the
117
207
  // selected node and then re-renders the tree.
118
208
  async loadSubTreeIntoAccessibilityModel(selectedNode: SDK.DOMModel.DOMNode): Promise<void> {
119
- const ancestors = await AccessibilityTreeUtils.getNodeAndAncestorsFromDOMNode(selectedNode, this.#frameManager);
209
+ const ancestors = await SDK.AccessibilityModel.getNodeAndAncestorsFromDOMNode(selectedNode);
120
210
  const inspectedAXNode = ancestors.find(node => node.backendDOMNodeId() === selectedNode.backendNodeId());
121
211
  if (!inspectedAXNode) {
122
212
  return;
123
213
  }
124
- await this.accessibilityTreeComponent.expandNodeIds(ancestors.map(node => node.getFrameId() + '#' + node.id()));
125
- await this.accessibilityTreeComponent.focusNodeId(AccessibilityTreeUtils.getNodeId(inspectedAXNode));
214
+ this.requestUpdate();
215
+ await this.updateComplete;
216
+ await this.#treeOperations.revealNode?.(
217
+ ancestors.map(node => node.getFrameId() + '#' + node.id()),
218
+ inspectedAXNode.getNodeId(),
219
+ );
126
220
  }
127
221
 
128
222
  // A node was revealed through the elements picker.
@@ -160,16 +254,15 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
160
254
  }
161
255
  if (!data.root) {
162
256
  this.root = null;
163
- void this.renderTree();
257
+ this.requestUpdate();
164
258
  return;
165
259
  }
166
260
  const outermostFrameId = this.#frameManager.getOutermostFrame()?.id;
167
261
  if (data.root?.getFrameId() !== outermostFrameId) {
168
- void this.renderTree();
262
+ this.requestUpdate();
169
263
  return;
170
264
  }
171
265
  this.root = data.root;
172
- void this.accessibilityTreeComponent.collapseAllNodes();
173
266
 
174
267
  void this.refreshAccessibilityTree();
175
268
  }
@@ -43,11 +43,9 @@ import type * as Protocol from '../../generated/protocol.js';
43
43
  import * as ComputedStyle from '../../models/computed_style/computed_style.js';
44
44
  import * as PanelCommon from '../../panels/common/common.js';
45
45
  import type * as Adorners from '../../ui/components/adorners/adorners.js';
46
- import * as TreeOutline from '../../ui/components/tree_outline/tree_outline.js';
47
46
  import * as UI from '../../ui/legacy/legacy.js';
48
47
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
49
48
 
50
- import type {AXTreeNodeData} from './AccessibilityTreeUtils.js';
51
49
  import {AccessibilityTreeView} from './AccessibilityTreeView.js';
52
50
  import {ColorSwatchPopoverIcon} from './ColorSwatchPopoverIcon.js';
53
51
  import * as ElementsComponents from './components/components.js';
@@ -269,7 +267,7 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
269
267
  this.#settings.moduleSetting('dom-word-wrap').addChangeListener(this.domWordWrapSettingChanged.bind(this));
270
268
 
271
269
  crumbsContainer.id = 'elements-crumbs';
272
- this.accessibilityTreeView = new AccessibilityTreeView(new TreeOutline.TreeOutline.TreeOutline<AXTreeNodeData>());
270
+ this.accessibilityTreeView = new AccessibilityTreeView();
273
271
  this.breadcrumbs = new ElementsComponents.ElementsBreadcrumbs.ElementsBreadcrumbs();
274
272
  this.breadcrumbs.addEventListener('breadcrumbsnodeselected', event => {
275
273
  this.crumbNodeSelected(event);
@@ -317,8 +315,9 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
317
315
  this.#domTreeWidget.setWordWrap(this.#settings.moduleSetting('dom-word-wrap').get());
318
316
 
319
317
  this.#targetManager.observeModels(SDK.DOMModel.DOMModel, this, {scoped: true});
320
- this.#targetManager.addEventListener(SDK.TargetManager.Events.NAME_CHANGED,
321
- event => this.targetNameChanged(event.data));
318
+ this.#targetManager.addModelListener(SDK.ResourceTreeModel.ResourceTreeModel,
319
+ SDK.ResourceTreeModel.Events.PrimaryPageChanged, this.onPrimaryPageChanged,
320
+ this, {scoped: true});
322
321
  this.#settings.moduleSetting('show-ua-shadow-dom').addChangeListener(this.showUAShadowDOMChanged.bind(this));
323
322
  PanelCommon.ExtensionServer.ExtensionServer.instance().addEventListener(
324
323
  PanelCommon.ExtensionServer.Events.SidebarPaneAdded, this.extensionSidebarPaneAdded, this);
@@ -467,10 +466,15 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
467
466
  });
468
467
  }
469
468
 
470
- private targetNameChanged(target: SDK.Target.Target): void {
471
- const domModel = target.model(SDK.DOMModel.DOMModel);
472
- if (!domModel) {
473
- return;
469
+ private onPrimaryPageChanged(
470
+ event: Common.EventTarget.EventTargetEvent<
471
+ {frame: SDK.ResourceTreeModel.ResourceTreeFrame, type: SDK.ResourceTreeModel.PrimaryPageChangeType}>): void {
472
+ const {frame, type} = event.data;
473
+ if (type === SDK.ResourceTreeModel.PrimaryPageChangeType.ACTIVATION) {
474
+ const domModel = frame.resourceTreeModel().target().model(SDK.DOMModel.DOMModel);
475
+ if (domModel && !domModel.parentModel()) {
476
+ this.#domTreeWidget.show(this.domTreeContainer);
477
+ }
474
478
  }
475
479
  }
476
480
 
@@ -502,7 +506,7 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
502
506
  }
503
507
 
504
508
  override willHide(): void {
505
- SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
509
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
506
510
  this.evaluateTrackingComputedStyleUpdatesForNode();
507
511
  this.#domTreeWidget.detach();
508
512
  super.willHide();
@@ -551,7 +555,9 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
551
555
  if (!selectedNode) {
552
556
  return;
553
557
  }
554
- void selectedNode.setAsInspectedNode();
558
+ if (selectedNode.canInspectNode()) {
559
+ void selectedNode.setAsInspectedNode();
560
+ }
555
561
  if (focus) {
556
562
  this.selectedNodeOnReset = selectedNode;
557
563
  this.hasNonDefaultSelectedNode = true;
@@ -145,6 +145,11 @@ const UIStrings = {
145
145
  * @description Text to paste an element, paste should be used as a verb
146
146
  */
147
147
  paste: 'Paste',
148
+ /**
149
+ * @description Context menu item in the Edit as HTML editor that selects the editor's entire
150
+ * contents. "Select all" should be used as a verb.
151
+ */
152
+ selectAll: 'Select all',
148
153
  /**
149
154
  * @description Text in Elements Tree Element of the Elements panel, copy should be used as a verb
150
155
  */
@@ -459,6 +464,7 @@ export interface ViewInput {
459
464
 
460
465
  isHovered: boolean;
461
466
  isSelected: boolean;
467
+ canInspect: boolean;
462
468
  showAiButton: boolean;
463
469
  aiButtonTitle?: string;
464
470
  onAiButtonClick: (e: Event) => void;
@@ -1173,7 +1179,7 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
1173
1179
  <span>${ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL_SNAP}</span>
1174
1180
  </devtools-adorner>` : nothing}
1175
1181
  </div>`: nothing}
1176
- ${input.isSelected ? html`
1182
+ ${input.isSelected && input.canInspect ? html`
1177
1183
  <span class="selected-hint ${input.editorState ? 'hidden' : ''}" title=${i18nString(UIStrings.useSInTheConsoleToReferToThis, { PH1: '$0' })} aria-hidden="true"></span>
1178
1184
  ` : nothing}
1179
1185
  ${input.showAiButton ? html`
@@ -1212,6 +1218,9 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1212
1218
  #hovered: boolean;
1213
1219
  private editing: EditorHandles|null;
1214
1220
  #editorRef?: TextEditor.TextEditor.TextEditor;
1221
+ // True while the Edit as HTML editor's own context menu is open, so that the
1222
+ // focusout caused by the menu taking focus does not commit the edit.
1223
+ #editAsHtmlMenuOpen = false;
1215
1224
  #editorState: CodeMirror.EditorState|null = null;
1216
1225
  #editorWidth: number|null = null;
1217
1226
  expandAllButtonElement: UI.TreeOutline.TreeElement|null;
@@ -1430,6 +1439,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1430
1439
  },
1431
1440
  isHovered: this.#hovered,
1432
1441
  isSelected: this.selected,
1442
+ canInspect: this.node().canInspectNode(),
1433
1443
  showAiButton: Boolean(this.#hovered || this.selected) && this.node().nodeType() === Node.ELEMENT_NODE &&
1434
1444
  this.isAiButtonEnabled() && (this.treeOutline as ElementsTreeOutline)?.showAIButton,
1435
1445
  aiButtonTitle: this.isAiButtonEnabled() ?
@@ -1806,6 +1816,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1806
1816
  onTopLayerAdornerClick: () => {},
1807
1817
  isHovered: false,
1808
1818
  isSelected: false,
1819
+ canInspect: false,
1809
1820
  showAiButton: false,
1810
1821
  onAiButtonClick: () => {},
1811
1822
  decorations: [],
@@ -2691,7 +2702,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
2691
2702
  }),
2692
2703
  CodeMirror.EditorView.domEventHandlers({
2693
2704
  focusout: event => {
2694
- if (!this.#editorRef) {
2705
+ if (!this.#editorRef || this.#editAsHtmlMenuOpen) {
2695
2706
  return;
2696
2707
  }
2697
2708
  // The relatedTarget is null when no element gains focus, e.g. switching windows.
@@ -2700,6 +2711,42 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
2700
2711
  this.editing?.commit();
2701
2712
  }
2702
2713
  },
2714
+ contextmenu: (event, view) => {
2715
+ // The editor virtualizes its content, so the browser's native
2716
+ // "Select all" only reaches the rendered lines. Show a menu whose
2717
+ // "Select all" spans the whole document, like Ctrl/Cmd+A.
2718
+ event.consume(true);
2719
+ const {from, to, empty} = view.state.selection.main;
2720
+ const copy = (): void =>
2721
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(view.state.sliceDoc(from, to));
2722
+ const contextMenu = new UI.ContextMenu.ContextMenu(event, {
2723
+ onSoftMenuClosed: () => {
2724
+ this.#editAsHtmlMenuOpen = false;
2725
+ },
2726
+ });
2727
+ contextMenu.clipboardSection().appendItem(i18nString(UIStrings.cut), () => {
2728
+ copy();
2729
+ view.dispatch({changes: {from, to, insert: ''}});
2730
+ view.focus();
2731
+ }, {disabled: empty, jslogContext: 'cut'});
2732
+ contextMenu.clipboardSection().appendItem(i18nString(UIStrings.copy), () => {
2733
+ copy();
2734
+ view.focus();
2735
+ }, {disabled: empty, jslogContext: 'copy'});
2736
+ contextMenu.clipboardSection().appendItem(i18nString(UIStrings.paste), () => {
2737
+ void navigator.clipboard.readText().then(text => {
2738
+ view.dispatch(view.state.replaceSelection(text));
2739
+ view.focus();
2740
+ });
2741
+ }, {jslogContext: 'paste'});
2742
+ contextMenu.editSection().appendItem(i18nString(UIStrings.selectAll), () => {
2743
+ view.dispatch({selection: {anchor: 0, head: view.state.doc.length}});
2744
+ view.focus();
2745
+ }, {jslogContext: 'select-all'});
2746
+ this.#editAsHtmlMenuOpen = true;
2747
+ void contextMenu.show();
2748
+ return true;
2749
+ },
2703
2750
  }),
2704
2751
  ],
2705
2752
  });
@@ -1348,7 +1348,7 @@ export class ElementsTreeOutline extends
1348
1348
  }
1349
1349
 
1350
1350
  private onfocusout(_event: Event): void {
1351
- SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
1351
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
1352
1352
  }
1353
1353
 
1354
1354
  private onmousedown(event: MouseEvent): void {
@@ -1401,7 +1401,7 @@ export class ElementsTreeOutline extends
1401
1401
 
1402
1402
  private onmouseleave(_event: MouseEvent): void {
1403
1403
  this.setHoverEffect(null);
1404
- SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
1404
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
1405
1405
  }
1406
1406
 
1407
1407
  private ondragstart(event: DragEvent): boolean|undefined {
@@ -1429,7 +1429,7 @@ export class ElementsTreeOutline extends
1429
1429
  event.dataTransfer.effectAllowed = 'copyMove';
1430
1430
  this.treeElementBeingDragged = treeElement;
1431
1431
 
1432
- SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
1432
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
1433
1433
 
1434
1434
  return true;
1435
1435
  }
@@ -1790,7 +1790,7 @@ export class ElementsTreeOutline extends
1790
1790
  this.selectDOMNode(null, false);
1791
1791
  this.imagePreviewPopover.hide();
1792
1792
  delete this.clipboardNodeData;
1793
- SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
1793
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
1794
1794
  this.updateRecords.clear();
1795
1795
  }
1796
1796
 
@@ -116,7 +116,7 @@ const nodeToLayoutElement = (node: SDK.DOMModel.DOMNode): LayoutElement => {
116
116
  node.highlight();
117
117
  },
118
118
  hideHighlight: () => {
119
- SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
119
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
120
120
  },
121
121
  toggle: (_value: boolean) => {
122
122
  throw new Error('Not implemented');