chrome-devtools-frontend 1.0.1675430 → 1.0.1678416

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/AUTHORS +1 -0
  2. package/WATCHLISTS +0 -4
  3. package/front_end/core/common/EventTarget.ts +0 -5
  4. package/front_end/core/common/Settings.ts +0 -66
  5. package/front_end/core/host/InspectorFrontendHostAPI.ts +1 -0
  6. package/front_end/core/host/UserMetrics.ts +5 -0
  7. package/front_end/core/root/Runtime.ts +5 -5
  8. package/front_end/core/sdk/CSSMetadata.ts +5 -9
  9. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +16 -34
  10. package/front_end/core/sdk/DebuggerModel.ts +92 -57
  11. package/front_end/core/sdk/EmulationModel.ts +2 -1
  12. package/front_end/core/sdk/NetworkManager.ts +16 -2
  13. package/front_end/core/sdk/OverlayModel.ts +19 -9
  14. package/front_end/core/sdk/OverlayPersistentHighlighter.ts +10 -4
  15. package/front_end/core/sdk/ResourceTreeModel.ts +20 -1
  16. package/front_end/core/sdk/SDKSettings.ts +117 -0
  17. package/front_end/core/sdk/Script.ts +9 -53
  18. package/front_end/core/sdk/sdk-meta.ts +0 -431
  19. package/front_end/devtools_compatibility.js +1 -0
  20. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +213 -23
  21. package/front_end/entrypoints/inspector_main/InspectorMain.ts +6 -5
  22. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +14 -15
  23. package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +157 -0
  24. package/front_end/entrypoints/main/MainImpl.ts +32 -0
  25. package/front_end/entrypoints/shell/shell.ts +0 -1
  26. package/front_end/foundation/Universe.ts +8 -0
  27. package/front_end/generated/InspectorBackendCommands.ts +8 -8
  28. package/front_end/generated/SupportedCSSProperties.ts +53 -4
  29. package/front_end/generated/protocol-mapping.d.ts +27 -21
  30. package/front_end/generated/protocol-proxy-api.d.ts +22 -17
  31. package/front_end/generated/protocol.ts +43 -18
  32. package/front_end/models/ai_assistance/AiAgent2.ts +47 -2
  33. package/front_end/models/ai_assistance/AiConversation.ts +22 -5
  34. package/front_end/models/ai_assistance/README.md +52 -26
  35. package/front_end/models/ai_assistance/agents/AiAgent.ts +54 -8
  36. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -1
  37. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +7 -194
  38. package/front_end/models/ai_assistance/agents/StorageAgent.ts +21 -87
  39. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +2 -1
  40. package/front_end/models/ai_assistance/ai_assistance.ts +24 -0
  41. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +124 -0
  42. package/front_end/models/ai_assistance/contexts/StorageContext.ts +100 -0
  43. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +69 -1
  44. package/front_end/models/ai_assistance/skills/README.md +63 -1
  45. package/front_end/models/ai_assistance/skills/Skill.ts +1 -1
  46. package/front_end/models/ai_assistance/skills/SkillRegistry.ts +4 -0
  47. package/front_end/models/ai_assistance/skills/accessibility.md +7 -0
  48. package/front_end/models/ai_assistance/skills/performance.md +15 -1
  49. package/front_end/models/ai_assistance/skills/sources.md +16 -0
  50. package/front_end/models/ai_assistance/skills/storage.md +31 -0
  51. package/front_end/models/ai_assistance/tools/GetDetailedCallTree.ts +107 -0
  52. package/front_end/models/ai_assistance/tools/GetFunctionCode.ts +122 -0
  53. package/front_end/models/ai_assistance/tools/GetResourceContent.ts +127 -0
  54. package/front_end/models/ai_assistance/tools/GetSourceContent.ts +101 -0
  55. package/front_end/models/ai_assistance/tools/GetTraceEventByKey.ts +83 -0
  56. package/front_end/models/ai_assistance/tools/GetTraceMainThreadSummary.ts +106 -0
  57. package/front_end/models/ai_assistance/tools/GetTraceNetworkSummary.ts +104 -0
  58. package/front_end/models/ai_assistance/tools/ListPageOrigins.ts +95 -0
  59. package/front_end/models/ai_assistance/tools/ListSources.ts +116 -0
  60. package/front_end/models/ai_assistance/tools/RunLighthouse.ts +89 -0
  61. package/front_end/models/ai_assistance/tools/SelectTraceEventByKey.ts +90 -0
  62. package/front_end/models/ai_assistance/tools/Tool.ts +26 -1
  63. package/front_end/models/ai_assistance/tools/ToolRegistry.ts +22 -0
  64. package/front_end/models/bindings/CSSWorkspaceBinding.ts +4 -0
  65. package/front_end/models/bindings/CompilerScriptMapping.ts +4 -0
  66. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +8 -0
  67. package/front_end/models/bindings/ResourceScriptMapping.ts +3 -201
  68. package/front_end/models/bindings/SASSSourceMapping.ts +6 -0
  69. package/front_end/models/breakpoints/BreakpointManager.ts +2 -49
  70. package/front_end/models/comment_manager/CommentManager.ts +141 -0
  71. package/front_end/models/comment_manager/comment_manager.ts +9 -0
  72. package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +27 -0
  73. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +10 -2
  74. package/front_end/models/issues_manager/descriptions/connectionAllowlistEmbeddingRequirementNotSatisfied.md +26 -0
  75. package/front_end/models/issues_manager/descriptions/connectionAllowlistIFrameAttributeLoosensEmbeddingRequirement.md +19 -0
  76. package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidAllowConnectionAllowlistFrom.md +21 -0
  77. package/front_end/models/javascript_metadata/NativeFunctions.js +6 -6
  78. package/front_end/models/persistence/IsolatedFileSystem.ts +7 -8
  79. package/front_end/models/persistence/IsolatedFileSystemManager.ts +2 -2
  80. package/front_end/models/persistence/PlatformFileSystem.ts +1 -1
  81. package/front_end/models/persistence/persistence-meta.ts +9 -9
  82. package/front_end/models/trace/types/TraceEvents.ts +36 -0
  83. package/front_end/panels/accessibility/ARIAAttributesView.ts +3 -3
  84. package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingView.ts +25 -0
  85. package/front_end/panels/accessibility/AccessibilityNodeView.ts +36 -36
  86. package/front_end/panels/accessibility/AccessibilitySidebarView.ts +9 -0
  87. package/front_end/panels/accessibility/AccessibilityStrings.ts +168 -168
  88. package/front_end/panels/accessibility/SourceOrderView.ts +7 -7
  89. package/front_end/panels/accessibility/accessibility-meta.ts +2 -2
  90. package/front_end/panels/accessibility/accessibility.ts +2 -0
  91. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +5 -5
  92. package/front_end/panels/ai_assistance/components/AIv2MarkdownRenderer.ts +2 -3
  93. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
  94. package/front_end/panels/ai_assistance/components/ChatMessage.ts +92 -12
  95. package/front_end/panels/ai_assistance/components/chatMessage.css +6 -0
  96. package/front_end/panels/application/ApplicationPanelSidebar.ts +10 -4
  97. package/front_end/panels/application/IndexedDBViews.ts +65 -63
  98. package/front_end/panels/application/StorageView.ts +116 -45
  99. package/front_end/panels/application/WebMCPView.ts +16 -7
  100. package/front_end/panels/application/application-meta.ts +11 -0
  101. package/front_end/panels/application/components/AdsView.ts +1 -1
  102. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +5 -5
  103. package/front_end/panels/common/BadgeNotification.ts +8 -8
  104. package/front_end/panels/common/ExtensionPanel.ts +9 -8
  105. package/front_end/panels/common/ExtensionServer.ts +21 -1
  106. package/front_end/panels/common/GdpSignUpDialog.ts +16 -16
  107. package/front_end/panels/common/GeminiRebrandPromoDialog.ts +5 -6
  108. package/front_end/panels/common/PersistenceUtils.ts +2 -2
  109. package/front_end/panels/common/common.ts +0 -97
  110. package/front_end/panels/console/ConsoleInsightTeaser.ts +2 -2
  111. package/front_end/panels/console/ConsolePanel.ts +4 -0
  112. package/front_end/panels/console/ConsolePinPane.ts +2 -2
  113. package/front_end/panels/console/ConsolePrompt.ts +12 -0
  114. package/front_end/panels/console/ConsoleView.ts +31 -20
  115. package/front_end/panels/console/ConsoleViewMessage.ts +37 -13
  116. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +2 -2
  117. package/front_end/panels/css_overview/CSSOverviewModel.ts +1 -1
  118. package/front_end/panels/elements/ElementStatePaneWidget.ts +2 -1
  119. package/front_end/panels/elements/ElementsTreeElement.ts +455 -372
  120. package/front_end/panels/elements/LayoutPane.ts +2 -8
  121. package/front_end/panels/elements/StylePropertyTreeElement.ts +16 -15
  122. package/front_end/panels/elements/elements-meta.ts +152 -10
  123. package/front_end/panels/elements/elements.ts +0 -2
  124. package/front_end/panels/emulation/DeviceModeView.ts +9 -1
  125. package/front_end/panels/event_listeners/EventListenersView.ts +8 -4
  126. package/front_end/panels/issues/AffectedTrackingSitesView.ts +25 -14
  127. package/front_end/panels/lighthouse/LighthouseController.ts +3 -2
  128. package/front_end/panels/media/PlayerMessagesView.ts +149 -68
  129. package/front_end/panels/network/BinaryResourceView.ts +134 -81
  130. package/front_end/panels/network/EventSourceMessagesView.ts +10 -10
  131. package/front_end/panels/network/FetchHeaderCommenting.ts +291 -0
  132. package/front_end/panels/network/NetworkConfigView.ts +10 -10
  133. package/front_end/panels/network/NetworkDataGridNode.ts +14 -14
  134. package/front_end/panels/network/NetworkItemView.ts +27 -28
  135. package/front_end/panels/network/NetworkLogView.ts +137 -38
  136. package/front_end/panels/network/NetworkLogViewColumns.ts +35 -35
  137. package/front_end/panels/network/NetworkManageCustomHeadersView.ts +1 -1
  138. package/front_end/panels/network/NetworkPanel.ts +2 -2
  139. package/front_end/panels/network/RequestConditionsDrawer.ts +5 -5
  140. package/front_end/panels/network/RequestCookiesView.ts +4 -4
  141. package/front_end/panels/network/RequestHeadersView.ts +5 -5
  142. package/front_end/panels/network/RequestPayloadView.ts +4 -3
  143. package/front_end/panels/network/RequestTimingView.ts +8 -8
  144. package/front_end/panels/network/ResourceChunkView.ts +1 -1
  145. package/front_end/panels/network/ResourceDirectSocketChunkView.ts +1 -1
  146. package/front_end/panels/network/ResourceWebSocketFrameView.ts +16 -16
  147. package/front_end/panels/network/binaryResourceView.css +14 -12
  148. package/front_end/panels/network/components/DirectSocketConnectionView.ts +2 -2
  149. package/front_end/panels/network/components/HeaderSectionRow.ts +1 -1
  150. package/front_end/panels/network/components/RequestTrustTokensView.ts +2 -2
  151. package/front_end/panels/network/network-meta.ts +1 -1
  152. package/front_end/panels/network/network.ts +2 -0
  153. package/front_end/panels/profiler/HeapDetachedElementsDataGrid.ts +0 -1
  154. package/front_end/panels/profiler/HeapSnapshotView.ts +0 -2
  155. package/front_end/panels/profiler/heapProfiler.css +0 -9
  156. package/front_end/panels/recorder/RecorderPanel.ts +2 -3
  157. package/front_end/panels/screencast/ScreencastView.ts +148 -138
  158. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +2 -2
  159. package/front_end/panels/sources/BreakpointsView.ts +2 -2
  160. package/front_end/panels/sources/DebuggerPlugin.ts +10 -59
  161. package/front_end/panels/sources/NavigatorView.ts +2 -1
  162. package/front_end/panels/sources/ScopeChainSidebarPane.ts +1 -1
  163. package/front_end/panels/sources/SourcesPanel.ts +23 -73
  164. package/front_end/panels/sources/SourcesView.ts +248 -157
  165. package/front_end/panels/sources/TabbedEditorContainer.ts +118 -23
  166. package/front_end/panels/sources/UISourceCodeFrame.ts +5 -9
  167. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +4 -2
  168. package/front_end/panels/sources/sources-meta.ts +52 -0
  169. package/front_end/panels/timeline/TimelineController.ts +36 -64
  170. package/front_end/panels/timeline/TimelinePanel.ts +11 -8
  171. package/front_end/panels/timeline/TimelineUIUtils.ts +5 -2
  172. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +2 -2
  173. package/front_end/panels/timeline/timelinePanel.css +0 -10
  174. package/front_end/panels/utils/utils.ts +7 -7
  175. package/front_end/services/tracing/PerformanceTracing.ts +5 -17
  176. package/front_end/third_party/chromium/README.chromium +1 -1
  177. package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
  178. package/front_end/third_party/codemirror.next/chunk/codemirror.js.map +1 -1
  179. package/front_end/third_party/codemirror.next/package.json +2 -2
  180. package/front_end/third_party/codemirror.next/rebuild.sh +4 -1
  181. package/front_end/ui/comments/CommentAnchorResolver.ts +430 -35
  182. package/front_end/ui/comments/CommentOverlayManager.ts +635 -0
  183. package/front_end/ui/comments/CommentsOverlayWidget.ts +134 -0
  184. package/front_end/ui/comments/comments.ts +4 -0
  185. package/front_end/ui/comments/commentsOverlay.css +49 -0
  186. package/front_end/{panels/common → ui/components/dialogs}/FreDialog.ts +6 -6
  187. package/front_end/ui/components/dialogs/TypeToAllowDialog.ts +96 -0
  188. package/front_end/ui/components/dialogs/dialogs.ts +4 -0
  189. package/front_end/ui/components/settings/SettingCheckbox.ts +3 -3
  190. package/front_end/{panels/common → ui/components/text_editor}/AiCodeCompletionDisclaimer.ts +13 -13
  191. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +7 -6
  192. package/front_end/{panels/common → ui/components/text_editor}/AiCodeCompletionTeaser.ts +43 -46
  193. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +22 -26
  194. package/front_end/{panels/common → ui/components/text_editor}/AiCodeGenerationTeaser.ts +10 -10
  195. package/front_end/{panels/common → ui/components/text_editor}/AiCodeGenerationUpgradeDialog.ts +5 -5
  196. package/front_end/ui/components/text_editor/text_editor.ts +4 -0
  197. package/front_end/ui/legacy/Toolbar.ts +1 -1
  198. package/front_end/ui/legacy/UIUtils.ts +0 -56
  199. package/front_end/ui/legacy/View.ts +10 -4
  200. package/front_end/ui/legacy/Widget.ts +10 -1
  201. package/front_end/ui/legacy/components/color_picker/ContrastDetails.ts +2 -1
  202. package/front_end/ui/legacy/components/color_picker/ContrastOverlay.ts +5 -4
  203. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +11 -3
  204. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +507 -209
  205. package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +5 -0
  206. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +11 -16
  207. package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +5 -12
  208. package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.ts +38 -20
  209. package/front_end/ui/legacy/components/source_frame/JSONView.ts +12 -2
  210. package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +3 -3
  211. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +37 -6
  212. package/front_end/ui/legacy/components/source_frame/StreamingContentHexView.ts +22 -4
  213. package/front_end/ui/settings/SettingUIRegistration.ts +55 -6
  214. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
  215. package/mcp/mcp.ts +6 -1
  216. package/package.json +6 -6
  217. package/front_end/Images/toolbarResizerVertical.png +0 -0
  218. package/front_end/emulated_devices/MotoG4-landscape.svg +0 -155
  219. package/front_end/emulated_devices/MotoG4-portrait.svg +0 -155
  220. package/front_end/emulated_devices/Nexus5X-landscape.svg +0 -19
  221. package/front_end/emulated_devices/Nexus5X-portrait.svg +0 -19
  222. package/front_end/emulated_devices/Nexus6P-landscape.svg +0 -50
  223. package/front_end/emulated_devices/Nexus6P-portrait.svg +0 -54
  224. package/front_end/emulated_devices/google-nest-hub-horizontal.png +0 -0
  225. package/front_end/emulated_devices/google-nest-hub-max-horizontal.png +0 -0
  226. package/front_end/emulated_devices/google-nexus-5-horizontal-default-1x.png +0 -0
  227. package/front_end/emulated_devices/google-nexus-5-horizontal-default-2x.png +0 -0
  228. package/front_end/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png +0 -0
  229. package/front_end/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png +0 -0
  230. package/front_end/emulated_devices/google-nexus-5-horizontal-navigation-1x.png +0 -0
  231. package/front_end/emulated_devices/google-nexus-5-horizontal-navigation-2x.png +0 -0
  232. package/front_end/emulated_devices/google-nexus-5-vertical-default-1x.png +0 -0
  233. package/front_end/emulated_devices/google-nexus-5-vertical-default-2x.png +0 -0
  234. package/front_end/emulated_devices/google-nexus-5-vertical-keyboard-1x.png +0 -0
  235. package/front_end/emulated_devices/google-nexus-5-vertical-keyboard-2x.png +0 -0
  236. package/front_end/emulated_devices/google-nexus-5-vertical-navigation-1x.png +0 -0
  237. package/front_end/emulated_devices/google-nexus-5-vertical-navigation-2x.png +0 -0
  238. package/front_end/emulated_devices/google-nexus-5x-horizontal-default-1x.png +0 -0
  239. package/front_end/emulated_devices/google-nexus-5x-horizontal-default-2x.png +0 -0
  240. package/front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png +0 -0
  241. package/front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png +0 -0
  242. package/front_end/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png +0 -0
  243. package/front_end/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png +0 -0
  244. package/front_end/emulated_devices/google-nexus-5x-vertical-default-1x.png +0 -0
  245. package/front_end/emulated_devices/google-nexus-5x-vertical-default-2x.png +0 -0
  246. package/front_end/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png +0 -0
  247. package/front_end/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png +0 -0
  248. package/front_end/emulated_devices/google-nexus-5x-vertical-navigation-1x.png +0 -0
  249. package/front_end/emulated_devices/google-nexus-5x-vertical-navigation-2x.png +0 -0
  250. package/front_end/emulated_devices/iPad-landscape.svg +0 -73
  251. package/front_end/emulated_devices/iPad-portrait.svg +0 -76
  252. package/front_end/emulated_devices/iPhone5-landscape.svg +0 -99
  253. package/front_end/emulated_devices/iPhone5-portrait.svg +0 -83
  254. package/front_end/emulated_devices/iPhone6-landscape.svg +0 -111
  255. package/front_end/emulated_devices/iPhone6-portrait.svg +0 -116
  256. package/front_end/emulated_devices/iPhone6Plus-landscape.svg +0 -118
  257. package/front_end/emulated_devices/iPhone6Plus-portrait.svg +0 -116
  258. package/front_end/emulated_devices/optimized/MotoG4-landscape.avif +0 -0
  259. package/front_end/emulated_devices/optimized/MotoG4-portrait.avif +0 -0
  260. package/front_end/emulated_devices/optimized/Nexus5X-landscape.avif +0 -0
  261. package/front_end/emulated_devices/optimized/Nexus5X-portrait.avif +0 -0
  262. package/front_end/emulated_devices/optimized/Nexus6P-landscape.avif +0 -0
  263. package/front_end/emulated_devices/optimized/Nexus6P-portrait.avif +0 -0
  264. package/front_end/emulated_devices/optimized/README.md +0 -9
  265. package/front_end/emulated_devices/optimized/google-nest-hub-horizontal.avif +0 -0
  266. package/front_end/emulated_devices/optimized/google-nest-hub-max-horizontal.avif +0 -0
  267. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-default-1x.avif +0 -0
  268. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-default-2x.avif +0 -0
  269. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-1x.avif +0 -0
  270. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-2x.avif +0 -0
  271. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-navigation-1x.avif +0 -0
  272. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-navigation-2x.avif +0 -0
  273. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-default-1x.avif +0 -0
  274. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-default-2x.avif +0 -0
  275. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-keyboard-1x.avif +0 -0
  276. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-keyboard-2x.avif +0 -0
  277. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-navigation-1x.avif +0 -0
  278. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-navigation-2x.avif +0 -0
  279. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-default-1x.avif +0 -0
  280. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-default-2x.avif +0 -0
  281. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-1x.avif +0 -0
  282. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-2x.avif +0 -0
  283. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-1x.avif +0 -0
  284. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-2x.avif +0 -0
  285. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-default-1x.avif +0 -0
  286. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-default-2x.avif +0 -0
  287. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-1x.avif +0 -0
  288. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-2x.avif +0 -0
  289. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-navigation-1x.avif +0 -0
  290. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-navigation-2x.avif +0 -0
  291. package/front_end/emulated_devices/optimized/iPad-landscape.avif +0 -0
  292. package/front_end/emulated_devices/optimized/iPad-portrait.avif +0 -0
  293. package/front_end/emulated_devices/optimized/iPhone5-landscape.avif +0 -0
  294. package/front_end/emulated_devices/optimized/iPhone5-portrait.avif +0 -0
  295. package/front_end/emulated_devices/optimized/iPhone6-landscape.avif +0 -0
  296. package/front_end/emulated_devices/optimized/iPhone6-portrait.avif +0 -0
  297. package/front_end/emulated_devices/optimized/iPhone6Plus-landscape.avif +0 -0
  298. package/front_end/emulated_devices/optimized/iPhone6Plus-portrait.avif +0 -0
  299. package/front_end/emulated_devices/optimized/optimized_images.gni +0 -53
  300. package/front_end/models/ai_assistance/agents/README.md +0 -136
  301. package/front_end/panels/elements/ElementsTreeOutlineRenderer.ts +0 -89
  302. package/front_end/ui/legacy/components/object_ui/object_ui-meta.ts +0 -27
  303. /package/front_end/{panels/common → ui/components/dialogs}/freDialog.css +0 -0
  304. /package/front_end/{panels/common/common.css → ui/components/dialogs/typeToAllowDialog.css} +0 -0
  305. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeCompletionDisclaimer.css +0 -0
  306. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeCompletionTeaser.css +0 -0
  307. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeGenerationTeaser.css +0 -0
  308. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeGenerationUpgradeDialog.css +0 -0
@@ -64,8 +64,8 @@ export interface ObjectPropertySearchResult extends UI.TreeOutline.TreeSearchRes
64
64
  matchType: 'name'|'value';
65
65
  range: TextUtils.TextRange.SourceRange;
66
66
  }
67
- const {widget} = UI.Widget;
68
- const {ref, repeat, ifDefined, classMap, until} = Directives;
67
+ const {widget, widgetRef} = UI.Widget;
68
+ const {ref, repeat, ifDefined, classMap} = Directives;
69
69
  const UIStrings = {
70
70
  /**
71
71
  * @description Text in Object Properties Section
@@ -167,6 +167,7 @@ const objectPropertiesSectionMap = new WeakMap<Element, ObjectPropertiesSection>
167
167
  // the legacy TreeOutline/TreeElement dependencies are removed.
168
168
  const topLevelNodesCache = new WeakMap<ObjectTreeNodeBase, {
169
169
  nodes: UI.TreeOutline.TreeElement[],
170
+ listener: () => void,
170
171
  linkifier?: Components.Linkifier.Linkifier,
171
172
  }>();
172
173
 
@@ -416,6 +417,7 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
416
417
  get isWasm(): boolean {
417
418
  return isWasmObject(this.object);
418
419
  }
420
+
419
421
  get expanded(): boolean {
420
422
  return this.#expanded;
421
423
  }
@@ -443,6 +445,7 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
443
445
  get search(): UI.TreeOutline.TreeSearch<ObjectTreeNodeBase>|undefined {
444
446
  return this.options.search;
445
447
  }
448
+
446
449
  get includeNullOrUndefinedValues(): boolean {
447
450
  return this.filter?.includeNullOrUndefinedValues ?? true;
448
451
  }
@@ -488,7 +491,7 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
488
491
  yield* child.#walk(Math.max(-1, maxDepth - 1), filter);
489
492
  }
490
493
  }
491
- }
494
+ }
492
495
 
493
496
  async expandRecursively(maxDepth: number): Promise<void> {
494
497
  for (const node of this.#walk(maxDepth, n => n.canExpandRecursively)) {
@@ -968,33 +971,6 @@ export class ObjectPropertiesSection extends UI.TreeOutline.TreeOutlineInShadow
968
971
  this.rootElement().childrenListElement.classList.add('source-code', 'object-properties-section');
969
972
  }
970
973
 
971
- static defaultObjectPresentation(object: SDK.RemoteObject.RemoteObject, linkifier?: Components.Linkifier.Linkifier,
972
- skipProto?: boolean, readOnly?: boolean): Element {
973
- const objectPropertiesSection =
974
- ObjectPropertiesSection.defaultObjectPropertiesSection(object, linkifier, skipProto, readOnly);
975
- if (!object.hasChildren) {
976
- return objectPropertiesSection.titleElement;
977
- }
978
- return objectPropertiesSection.element;
979
- }
980
-
981
- static defaultObjectPropertiesSection(object: SDK.RemoteObject.RemoteObject,
982
- linkifier?: Components.Linkifier.Linkifier, skipProto?: boolean,
983
- readOnly?: boolean): ObjectPropertiesSection {
984
- const titleElement = document.createElement('span');
985
- titleElement.classList.add('source-code');
986
- const shadowRoot = UI.UIUtils.createShadowRootWithCoreStyles(titleElement, {cssFile: objectValueStyles});
987
- const propertyValue =
988
- ObjectPropertiesSection.createPropertyValue(object, /* wasThrown */ false, /* showPreview */ true);
989
- shadowRoot.appendChild(propertyValue);
990
- const objectPropertiesSection = new ObjectPropertiesSection(object, titleElement, linkifier, undefined, !readOnly);
991
- if (skipProto) {
992
- objectPropertiesSection.skipProto();
993
- }
994
-
995
- return objectPropertiesSection;
996
- }
997
-
998
974
  // The RemoteObjectProperty overload is kept for web test compatibility for now.
999
975
  static compareProperties(propertyA: ObjectTreeNode|SDK.RemoteObject.RemoteObjectProperty,
1000
976
  propertyB: ObjectTreeNode|SDK.RemoteObject.RemoteObjectProperty,
@@ -1144,19 +1120,6 @@ export class ObjectPropertiesSection extends UI.TreeOutline.TreeOutlineInShadow
1144
1120
  }
1145
1121
  }
1146
1122
 
1147
- static createPropertyValueWithCustomSupport(value: SDK.RemoteObject.RemoteObject, wasThrown: boolean,
1148
- showPreview: boolean, linkifier?: Components.Linkifier.Linkifier,
1149
- isSyntheticProperty?: boolean, variableName?: string,
1150
- includeNullOrUndefined?: boolean): HTMLElement {
1151
- if (value.customPreview()) {
1152
- const result = (new CustomPreviewComponent(value)).element;
1153
- result.classList.add('object-properties-section-custom-section');
1154
- return result;
1155
- }
1156
- return ObjectPropertiesSection.createPropertyValue(value, wasThrown, showPreview, linkifier, isSyntheticProperty,
1157
- variableName, includeNullOrUndefined);
1158
- }
1159
-
1160
1123
  static getMemoryIcon(object: SDK.RemoteObject.RemoteObject, expression?: string): LitTemplate {
1161
1124
  // Directly set styles on memory icon, so that the memory icon is also
1162
1125
  // styled within the context of code mirror.
@@ -1181,81 +1144,6 @@ export class ObjectPropertiesSection extends UI.TreeOutline.TreeOutlineInShadow
1181
1144
  element.appendChild(fragment);
1182
1145
  }
1183
1146
 
1184
- static createPropertyValue(value: SDK.RemoteObject.RemoteObject, wasThrown: boolean, showPreview: boolean,
1185
- linkifier?: Components.Linkifier.Linkifier, isSyntheticProperty = false,
1186
- variableName?: string, includeNullOrUndefined?: boolean): HTMLElement {
1187
- const propertyValue = document.createDocumentFragment();
1188
- const type = value.type;
1189
- const subtype = value.subtype;
1190
- const description = value.description || '';
1191
- const className = value.className;
1192
-
1193
- const contents = (): LitTemplate => {
1194
- if (type === 'object' && subtype === 'internal#location') {
1195
- const rawLocation = value.debuggerModel().createRawLocationByScriptId(
1196
- value.value.scriptId, value.value.lineNumber, value.value.columnNumber);
1197
- if (rawLocation && linkifier) {
1198
- return html`${linkifier.linkifyRawLocation(rawLocation, Platform.DevToolsPath.EmptyUrlString, 'value')}`;
1199
- }
1200
- const title = description || undefined;
1201
- return html`<span class=value title=${ifDefined(title)}>${'<' + i18nString(UIStrings.unknown) + '>'}</span>`;
1202
- }
1203
- if (type === 'string' && typeof description === 'string') {
1204
- const text = Platform.StringUtilities.escapeUnicodeAsText(JSON.stringify(description));
1205
- const tooLong = description.length > maxRenderableStringLength;
1206
- return html`<span class="value object-value-string" title=${ifDefined(tooLong ? undefined : description)}>${
1207
- tooLong ? widget(ExpandableTextPropertyValue, {text}) : text}</span>`;
1208
- }
1209
- if (type === 'object' && subtype === 'trustedtype') {
1210
- const text = `${className} "${description}"`;
1211
- const tooLong = text.length > maxRenderableStringLength;
1212
- return html`<span class="value object-value-trustedtype" title=${ifDefined(tooLong ? undefined : text)}>${
1213
- tooLong ? widget(ExpandableTextPropertyValue, {text}) : renderTrustedType(description, className)}</span>`;
1214
- }
1215
- if (type === 'function') {
1216
- return html`<span class="value">${
1217
- ObjectPropertiesSection.valueElementForFunctionDescription(description)}</span>`;
1218
- }
1219
- if (type === 'object' && subtype === 'node' && description) {
1220
- return html`<span class="value object-value-node"
1221
- @click=${(event: Event) => {
1222
- void Common.Revealer.reveal(value);
1223
- event.consume(true);
1224
- }}
1225
- @mousemove=${() => SDK.OverlayModel.OverlayModel.highlightObjectAsDOMNode(value)}
1226
- @mouseleave=${
1227
- () => SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance())}
1228
- >${renderNodeTitle(description)}</span>`;
1229
- }
1230
- if (description.length > maxRenderableStringLength) {
1231
- // clang-format off
1232
- return html`<span class="value object-value-${subtype || type}" title=${description}>
1233
- ${widget(ExpandableTextPropertyValue, {text: description})}
1234
- </span>`;
1235
- // clang-format on
1236
- }
1237
- const hasPreview = value.preview && showPreview;
1238
- return html`<span class="value object-value-${subtype || type}" title=${description}>${
1239
- hasPreview ? new RemoteObjectPreviewFormatter().renderObjectPreview(value.preview, includeNullOrUndefined) :
1240
- description}${isSyntheticProperty ? nothing : this.getMemoryIcon(value, variableName)}</span>`;
1241
- };
1242
-
1243
- if (wasThrown) {
1244
- // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
1245
- render(html`<span class="error value">${
1246
- uiI18n.getFormatLocalizedStringTemplate(str_, UIStrings.exceptionS, {PH1: contents()})}</span>`,
1247
- propertyValue);
1248
- } else {
1249
- // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
1250
- render(contents(), propertyValue);
1251
- }
1252
- const child = propertyValue.firstElementChild;
1253
- if (!(child instanceof HTMLElement)) {
1254
- throw new Error('Expected an HTML element');
1255
- }
1256
- return child;
1257
- }
1258
-
1259
1147
  static isDisplayableProperty(property: SDK.RemoteObject.RemoteObjectProperty,
1260
1148
  parentProperty?: SDK.RemoteObject.RemoteObjectProperty): boolean {
1261
1149
  if (!parentProperty?.synthetic) {
@@ -1304,6 +1192,174 @@ export class ObjectPropertiesSection extends UI.TreeOutline.TreeOutlineInShadow
1304
1192
  }
1305
1193
  }
1306
1194
 
1195
+ export class ObjectPropertiesSectionWidget extends UI.Widget.Widget {
1196
+ #root?: ObjectTree;
1197
+ #title?: Element|TemplateResult;
1198
+ #skipProto = false;
1199
+ #linkifier?: Components.Linkifier.Linkifier;
1200
+ #showOverflow = true;
1201
+ #rootContextMenuEnabled = false;
1202
+ readonly #view: ObjectPropertiesSectionView = OBJECT_PROPERTIES_SECTION_DEFAULT_VIEW;
1203
+
1204
+ constructor(element?: HTMLElement, view: ObjectPropertiesSectionView = OBJECT_PROPERTIES_SECTION_DEFAULT_VIEW) {
1205
+ super(element);
1206
+ this.#view = view;
1207
+ }
1208
+
1209
+ get root(): SDK.RemoteObject.RemoteObject|undefined {
1210
+ return this.#root?.object;
1211
+ }
1212
+
1213
+ set root(val: SDK.RemoteObject.RemoteObject) {
1214
+ if (val === this.#root?.object) {
1215
+ return;
1216
+ }
1217
+ this.objectTree = new ObjectTree(val, {
1218
+ readOnly: false,
1219
+ propertiesMode: ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
1220
+ });
1221
+ }
1222
+
1223
+ get objectTree(): ObjectTree|undefined {
1224
+ return this.#root;
1225
+ }
1226
+
1227
+ set objectTree(val: ObjectTree|undefined) {
1228
+ if (val === this.#root) {
1229
+ return;
1230
+ }
1231
+ this.#root?.removeEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.requestUpdate, this);
1232
+ this.#root?.removeEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.requestUpdate, this);
1233
+ this.#root = val;
1234
+ this.#root?.addEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.requestUpdate, this);
1235
+ this.#root?.addEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.requestUpdate, this);
1236
+ this.requestUpdate();
1237
+ }
1238
+
1239
+ get title(): Element|TemplateResult|undefined {
1240
+ return this.#title;
1241
+ }
1242
+
1243
+ set title(val: Element|TemplateResult|undefined) {
1244
+ if (val === this.#title) {
1245
+ return;
1246
+ }
1247
+ this.#title = val;
1248
+ this.requestUpdate();
1249
+ }
1250
+
1251
+ get skipProto(): boolean {
1252
+ return this.#skipProto;
1253
+ }
1254
+
1255
+ set skipProto(val: boolean) {
1256
+ if (val === this.#skipProto) {
1257
+ return;
1258
+ }
1259
+ this.#skipProto = val;
1260
+ this.requestUpdate();
1261
+ }
1262
+
1263
+ get linkifier(): Components.Linkifier.Linkifier|undefined {
1264
+ return this.#linkifier;
1265
+ }
1266
+
1267
+ set linkifier(val: Components.Linkifier.Linkifier) {
1268
+ if (val === this.#linkifier) {
1269
+ return;
1270
+ }
1271
+ this.#linkifier = val;
1272
+ this.requestUpdate();
1273
+ }
1274
+
1275
+ get showOverflow(): boolean {
1276
+ return this.#showOverflow;
1277
+ }
1278
+
1279
+ set showOverflow(val: boolean) {
1280
+ if (val === this.#showOverflow) {
1281
+ return;
1282
+ }
1283
+ this.#showOverflow = val;
1284
+ this.requestUpdate();
1285
+ }
1286
+
1287
+ override performUpdate(): void {
1288
+ if (!this.#root) {
1289
+ return;
1290
+ }
1291
+ this.#view({
1292
+ objectTree: this.#root,
1293
+ title: this.#title,
1294
+ linkifier: this.#linkifier,
1295
+ skipProto: this.#skipProto,
1296
+ showOverflow: this.#showOverflow,
1297
+ onRootContextMenu: this.#rootContextMenuEnabled ? this.onRootContextMenu : undefined,
1298
+ onRootItemContextMenu: this.onRootItemContextMenu,
1299
+ },
1300
+ {}, this.contentElement);
1301
+ }
1302
+
1303
+ override onDetach(): void {
1304
+ this.#root?.removeEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.requestUpdate, this);
1305
+ this.#root?.removeEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.requestUpdate, this);
1306
+ }
1307
+
1308
+ override wasShown(): void {
1309
+ super.wasShown();
1310
+ this.#root?.removeEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.requestUpdate, this);
1311
+ this.#root?.removeEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.requestUpdate, this);
1312
+ this.#root?.addEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.requestUpdate, this);
1313
+ this.#root?.addEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.requestUpdate, this);
1314
+ }
1315
+
1316
+ get rootContextMenuEnabled(): boolean {
1317
+ return this.#rootContextMenuEnabled;
1318
+ }
1319
+
1320
+ set rootContextMenuEnabled(val: boolean) {
1321
+ if (this.#rootContextMenuEnabled === val) {
1322
+ return;
1323
+ }
1324
+ this.#rootContextMenuEnabled = val;
1325
+ this.requestUpdate();
1326
+ }
1327
+
1328
+ private onRootContextMenu = (contextMenu: UI.ContextMenu.ContextMenu): void => {
1329
+ if (!this.#root) {
1330
+ return;
1331
+ }
1332
+ contextMenu.appendApplicableItems(this.#root);
1333
+ if (this.#root.object instanceof SDK.RemoteObject.LocalJSONObject) {
1334
+ contextMenu.viewSection().appendItem(i18nString(UIStrings.expandRecursively),
1335
+ this.#root.expandRecursively.bind(this.#root, EXPANDABLE_MAX_DEPTH),
1336
+ {jslogContext: 'expand-recursively'});
1337
+ contextMenu.viewSection().appendItem(i18nString(UIStrings.collapseChildren),
1338
+ this.#root.collapseRecursively.bind(this.#root),
1339
+ {jslogContext: 'collapse-children'});
1340
+ }
1341
+ };
1342
+
1343
+ private onRootItemContextMenu = (contextMenu: UI.ContextMenu.ContextMenu): void => {
1344
+ const root = this.#root;
1345
+ if (!root) {
1346
+ return;
1347
+ }
1348
+ populateObjectTreeContextMenu(
1349
+ contextMenu,
1350
+ root,
1351
+ root.expandRecursively.bind(root, EXPANDABLE_MAX_DEPTH),
1352
+ root.collapseRecursively.bind(root),
1353
+ () => {
1354
+ root.sortPropertiesAlphabetically = !root.sortPropertiesAlphabetically;
1355
+ },
1356
+ () => {
1357
+ root.includeNullOrUndefinedValues = !root.includeNullOrUndefinedValues;
1358
+ },
1359
+ );
1360
+ };
1361
+ }
1362
+
1307
1363
  /** @constant */
1308
1364
  const ARRAY_LOAD_THRESHOLD = 100;
1309
1365
 
@@ -1366,71 +1422,227 @@ export function populateObjectTreeContextMenu(
1366
1422
  {checked: object.includeNullOrUndefinedValues, jslogContext: 'show-all'});
1367
1423
  }
1368
1424
 
1369
- function renderObjectTreeInternal(
1370
- objectTree: ObjectTree,
1371
- linkifier?: Components.Linkifier.Linkifier,
1372
- emptyPlaceholder?: string|null,
1373
- classes: Record<string, boolean> = {},
1374
- ): LitTemplate|DirectiveResult {
1375
- const entry = topLevelNodesCache.get(objectTree);
1376
- if (entry && entry.linkifier === linkifier) {
1377
- return html`
1378
- <ul class=${classMap(classes)} role="group">
1379
- ${entry.nodes.map(node => html`<devtools-tree-wrapper .treeElement=${node}></devtools-tree-wrapper>`)}
1380
- </ul>
1381
- `;
1382
- }
1383
-
1384
- const promise = (async () => {
1385
- await ObjectPropertyTreeElement.populateChildrenIfNeeded(objectTree);
1386
- const nodes = Array.from(ObjectPropertyTreeElement.createNodes(
1387
- objectTree, /* skipProto= */ false, /* skipGettersAndSetters= */ false, linkifier, emptyPlaceholder));
1388
- topLevelNodesCache.set(objectTree, {linkifier, nodes});
1425
+ interface ObjectTreeViewInput {
1426
+ renderAsSubtree: boolean;
1427
+ objectTree?: ObjectTree;
1428
+ linkifier?: Components.Linkifier.Linkifier;
1429
+ emptyPlaceholder?: string;
1430
+ skipProto: boolean;
1431
+ onExpand: (expanded: boolean) => void;
1432
+ }
1433
+ type ObjectTreeView = (input: ObjectTreeViewInput, output: object, target: HTMLElement) => void;
1434
+ export const OBJECT_TREE_DEFAULT_VIEW: ObjectTreeView = (input, output, target) => {
1435
+ const objectTree = input.objectTree;
1436
+ if (!objectTree) {
1437
+ render(nothing, target);
1438
+ return;
1439
+ }
1440
+ const classes = input.renderAsSubtree ? ['source-code', 'object-properties-section'] : [];
1441
+ let entry = topLevelNodesCache.get(objectTree);
1442
+ if (!entry || entry.linkifier !== input.linkifier || (!entry.nodes.length && objectTree.children)) {
1443
+ if (entry) {
1444
+ objectTree.removeEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, entry.listener);
1445
+ }
1446
+ const nodes = Array.from(ObjectPropertyTreeElement.createNodes(objectTree, input.skipProto, false, input.linkifier,
1447
+ input.emptyPlaceholder));
1389
1448
  const listener = (): void => {
1390
1449
  topLevelNodesCache.delete(objectTree);
1391
1450
  objectTree.removeEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, listener);
1392
1451
  };
1452
+ entry = {linkifier: input.linkifier, nodes, listener};
1453
+ topLevelNodesCache.set(objectTree, entry);
1393
1454
  objectTree.addEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, listener);
1455
+ }
1456
+
1457
+ render(entry.nodes.map(node => html`<devtools-tree-wrapper .treeElement=${node}></devtools-tree-wrapper>`), target, {
1458
+ container: {
1459
+ classes,
1460
+ attributes: {role: 'group'},
1461
+ interceptedListeners: {
1462
+ expand: (e: Event) => input.onExpand((e as UI.TreeOutline.TreeViewElement.ExpandEvent).detail.expanded),
1463
+ },
1464
+ },
1465
+ });
1466
+ };
1467
+
1468
+ export class ObjectTreeWidget extends UI.Widget.Widget {
1469
+ #objectTree: ObjectTree|undefined = undefined;
1470
+ #linkifier: Components.Linkifier.Linkifier|undefined = undefined;
1471
+ #emptyPlaceholder?: string;
1472
+ #renderAsSubtree = false;
1473
+ #skipProto = false;
1474
+ readonly #view: ObjectTreeView;
1475
+
1476
+ constructor(element?: HTMLElement, view = OBJECT_TREE_DEFAULT_VIEW) {
1477
+ super(element);
1478
+ this.#view = view;
1479
+ }
1480
+
1481
+ onExpand = (expanded: boolean): void => {
1482
+ if (this.#objectTree) {
1483
+ this.#objectTree.expanded = expanded;
1484
+ }
1485
+ };
1486
+
1487
+ get skipProto(): boolean {
1488
+ return this.#skipProto;
1489
+ }
1394
1490
 
1395
- return html`
1396
- <ul class=${classMap(classes)} role="group">
1397
- ${nodes.map(node => html`<devtools-tree-wrapper .treeElement=${node}></devtools-tree-wrapper>`)}
1398
- </ul>
1399
- `;
1400
- })();
1491
+ set skipProto(val: boolean) {
1492
+ this.#skipProto = val;
1493
+ this.requestUpdate();
1494
+ }
1495
+
1496
+ get objectTree(): ObjectTree|undefined {
1497
+ return this.#objectTree;
1498
+ }
1401
1499
 
1402
- return until(promise, html`<ul class=${classMap(classes)} role="group"></ul>`);
1500
+ set objectTree(val: ObjectTree) {
1501
+ if (val === this.#objectTree) {
1502
+ return;
1503
+ }
1504
+ this.#objectTree?.removeEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.requestUpdate, this);
1505
+ this.#objectTree?.removeEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.requestUpdate, this);
1506
+ this.#objectTree = val;
1507
+ this.#objectTree?.addEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.requestUpdate, this);
1508
+ this.#objectTree?.addEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.requestUpdate, this);
1509
+ this.requestUpdate();
1510
+ }
1511
+
1512
+ get linkifier(): Components.Linkifier.Linkifier|undefined {
1513
+ return this.#linkifier;
1514
+ }
1515
+
1516
+ set linkifier(val: Components.Linkifier.Linkifier) {
1517
+ if (val === this.#linkifier) {
1518
+ return;
1519
+ }
1520
+ this.#linkifier = val;
1521
+ this.requestUpdate();
1522
+ }
1523
+
1524
+ get emptyPlaceholder(): string|undefined {
1525
+ return this.#emptyPlaceholder;
1526
+ }
1527
+
1528
+ set emptyPlaceholder(val: string) {
1529
+ if (val === this.#emptyPlaceholder) {
1530
+ return;
1531
+ }
1532
+ this.#emptyPlaceholder = val;
1533
+ this.requestUpdate();
1534
+ }
1535
+
1536
+ get renderAsSubtree(): boolean {
1537
+ return this.#renderAsSubtree;
1538
+ }
1539
+
1540
+ set renderAsSubtree(val: boolean) {
1541
+ if (val === this.#renderAsSubtree) {
1542
+ return;
1543
+ }
1544
+ this.#renderAsSubtree = val;
1545
+ this.requestUpdate();
1546
+ }
1547
+
1548
+ override async performUpdate(): Promise<void> {
1549
+ if (this.#objectTree?.expanded) {
1550
+ await ObjectPropertyTreeElement.populateChildrenIfNeeded(this.#objectTree);
1551
+ }
1552
+ this.#view(this, {}, this.contentElement);
1553
+ }
1554
+
1555
+ override onDetach(): void {
1556
+ this.#objectTree?.removeEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.requestUpdate, this);
1557
+ this.#objectTree?.removeEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.requestUpdate, this);
1558
+ }
1559
+
1560
+ override wasShown(): void {
1561
+ super.wasShown();
1562
+ this.#objectTree?.removeEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.requestUpdate, this);
1563
+ this.#objectTree?.removeEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.requestUpdate, this);
1564
+ this.#objectTree?.addEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.requestUpdate, this);
1565
+ this.#objectTree?.addEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.requestUpdate, this);
1566
+ }
1403
1567
  }
1404
1568
 
1405
1569
  export function renderObjectTree(
1406
1570
  objectTree: ObjectTree,
1407
1571
  linkifier?: Components.Linkifier.Linkifier,
1408
- emptyPlaceholder?: string|null,
1572
+ emptyPlaceholder?: string,
1409
1573
  ): LitTemplate|DirectiveResult {
1410
- return renderObjectTreeInternal(objectTree, linkifier, emptyPlaceholder, {
1411
- 'source-code': true,
1412
- 'object-properties-section': true,
1413
- });
1574
+ return html`<ul role="group" ${
1575
+ widget(ObjectTreeWidget, {objectTree, linkifier, emptyPlaceholder, renderAsSubtree: true})} ${
1576
+ /* The empty widgetRef forces the widget to be materialized in the template DOM */
1577
+ widgetRef(ObjectTreeWidget, () => {})}></ul>`;
1414
1578
  }
1415
1579
 
1416
- export function renderObjectPropertiesSection(
1417
- objectTree: ObjectTree,
1418
- title: LitTemplate,
1419
- linkifier?: Components.Linkifier.Linkifier,
1420
- ): LitTemplate {
1421
- const treeContent = renderObjectTreeInternal(objectTree, linkifier, undefined, {});
1422
-
1423
- return html`<devtools-tree class="object-properties-section" show-selection-on-keyboard-focus .template=${html`
1424
- <ul role="tree" class="source-code object-properties-section">
1425
- <style>${objectValueStyles}</style>
1426
- <style>${objectPropertiesSectionStyles}</style>
1427
- <li role="treeitem" class="object-properties-section-root-element" ?open=${objectTree.expanded}>
1428
- ${title}
1429
- ${treeContent}
1430
- </li>
1431
- </ul>
1432
- `}></devtools-tree>`;
1580
+ export interface ObjectPropertiesSectionViewInput {
1581
+ objectTree: ObjectTree;
1582
+ title?: Element|TemplateResult;
1583
+ linkifier?: Components.Linkifier.Linkifier;
1584
+ skipProto: boolean;
1585
+ showOverflow: boolean;
1586
+ onRootContextMenu?: (menu: UI.ContextMenu.ContextMenu) => void;
1587
+ onRootItemContextMenu: (menu: UI.ContextMenu.ContextMenu) => void;
1433
1588
  }
1589
+
1590
+ export type ObjectPropertiesSectionView =
1591
+ (input: ObjectPropertiesSectionViewInput, output: object, target: HTMLElement) => void;
1592
+
1593
+ export const OBJECT_PROPERTIES_SECTION_DEFAULT_VIEW: ObjectPropertiesSectionView = (input, _output, target) => {
1594
+ const contextMenuHandler = (event: Event): void => {
1595
+ if (!input.onRootContextMenu) {
1596
+ return;
1597
+ }
1598
+ event.consume(true);
1599
+ const contextMenu = new UI.ContextMenu.ContextMenu(event);
1600
+ input.onRootContextMenu(contextMenu);
1601
+ void contextMenu.show();
1602
+ };
1603
+
1604
+ const onRootItemContextMenuHandler = (event: Event): void => {
1605
+ event.consume(true);
1606
+ const contextMenu = new UI.ContextMenu.ContextMenu(event);
1607
+ input.onRootItemContextMenu(contextMenu);
1608
+ void contextMenu.show();
1609
+ };
1610
+
1611
+ render(html`
1612
+ <devtools-tree
1613
+ class="object-properties-section"
1614
+ ?hide-overflow=${!input.showOverflow}
1615
+ show-selection-on-keyboard-focus
1616
+ @contextmenu=${input.onRootContextMenu ? contextMenuHandler : undefined}
1617
+ .template=${
1618
+ input.title ?
1619
+ html`
1620
+ <ul role="tree" class="source-code object-properties-section">
1621
+ <style>${objectValueStyles}</style>
1622
+ <style>${objectPropertiesSectionStyles}</style>
1623
+ <li role="treeitem" class="object-properties-section-root-element" ?open=${
1624
+ input.objectTree.expanded} @contextmenu=${onRootItemContextMenuHandler}>
1625
+ ${input.title}
1626
+ <ul role="group" ${widget(ObjectTreeWidget, {
1627
+ objectTree: input.objectTree,
1628
+ linkifier: input.linkifier,
1629
+ skipProto: input.skipProto,
1630
+ })} ${widgetRef(ObjectTreeWidget, () => {})}></ul>
1631
+ </li>
1632
+ </ul>` :
1633
+ html`
1634
+ <ul role="tree" class="source-code object-properties-section title-less-mode" open ${
1635
+ widget(ObjectTreeWidget,
1636
+ {objectTree: input.objectTree, linkifier: input.linkifier, skipProto: input.skipProto})} ${
1637
+ /* The empty widgetRef forces the widget to be materialized in the template DOM */
1638
+ widgetRef(ObjectTreeWidget, () => {})}>
1639
+ <style>${objectValueStyles}</style>
1640
+ <style>${objectPropertiesSectionStyles}</style>
1641
+ </ul>`}>
1642
+ </devtools-tree>`,
1643
+ target);
1644
+ };
1645
+
1434
1646
  class RootElement extends UI.TreeOutline.TreeElement {
1435
1647
  private readonly object: ObjectTree;
1436
1648
  private readonly linkifier: Components.Linkifier.Linkifier|undefined;
@@ -1525,6 +1737,123 @@ export async function formatObjectAsFunction(func: SDK.RemoteObject.RemoteObject
1525
1737
  details, linkify);
1526
1738
  }
1527
1739
 
1740
+ export function renderPropertyValue(value: SDK.RemoteObject.RemoteObject, wasThrown: boolean, showPreview: boolean,
1741
+ linkifier?: Components.Linkifier.Linkifier, isSyntheticProperty = false,
1742
+ variableName?: string, includeNullOrUndefined?: boolean, useCustomPreview = false,
1743
+ valueRef?: (element: Element|undefined) => void): LitTemplate {
1744
+ if (useCustomPreview && value.customPreview()) {
1745
+ const result = (new CustomPreviewComponent(value)).element;
1746
+ result.classList.add('object-properties-section-custom-section');
1747
+ valueRef?.(result);
1748
+ return html`${result}`;
1749
+ }
1750
+
1751
+ const type = value.type;
1752
+ const subtype = value.subtype;
1753
+ const description = value.description || '';
1754
+ const className = value.className;
1755
+
1756
+ const isInternalLocation = type === 'object' && subtype === 'internal#location';
1757
+ const isString = type === 'string' && typeof description === 'string';
1758
+ const isTrustedType = type === 'object' && subtype === 'trustedtype';
1759
+ const isFunction = type === 'function';
1760
+ const isNode = type === 'object' && subtype === 'node' && Boolean(description);
1761
+ const isDefault = !isInternalLocation && !isString && !isTrustedType && !isFunction && !isNode;
1762
+ const classes = classMap({
1763
+ value: true,
1764
+ [`object-value-${subtype || type}`]: isDefault,
1765
+ 'object-value-string': isString,
1766
+ 'object-value-trustedtype': isTrustedType,
1767
+ 'object-value-node': isNode,
1768
+ });
1769
+
1770
+ const onNodeClick = (event: Event): void => {
1771
+ void Common.Revealer.reveal(value);
1772
+ event.consume(true);
1773
+ };
1774
+ const onNodeMouseMove = (): void => SDK.OverlayModel.OverlayModel.highlightObjectAsDOMNode(value);
1775
+ const onNodeMouseLeave = (): void =>
1776
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
1777
+
1778
+ let title: string|undefined;
1779
+ let content: LitTemplate|string|Element|DirectiveResult|null = description;
1780
+ if (isNode) {
1781
+ content = renderNodeTitle(description);
1782
+ } else if (isInternalLocation) {
1783
+ const rawLocation = value.debuggerModel().createRawLocationByScriptId(value.value.scriptId, value.value.lineNumber,
1784
+ value.value.columnNumber);
1785
+ const linkifiedLocation = rawLocation && linkifier ?
1786
+ linkifier.linkifyRawLocation(rawLocation, Platform.DevToolsPath.EmptyUrlString, 'value') :
1787
+ null;
1788
+ if (linkifiedLocation) {
1789
+ valueRef?.(linkifiedLocation);
1790
+ return html`${linkifiedLocation}`;
1791
+ }
1792
+ title = description || undefined;
1793
+ content = '<' + i18nString(UIStrings.unknown) + '>';
1794
+ } else if (isString) {
1795
+ const text = Platform.StringUtilities.escapeUnicodeAsText(JSON.stringify(description));
1796
+ const tooLong = description.length > maxRenderableStringLength;
1797
+ title = tooLong ? undefined : description;
1798
+ content = tooLong ? widget(ExpandableTextPropertyValue, {text}) : text;
1799
+ } else if (isTrustedType) {
1800
+ const text = `${className} "${description}"`;
1801
+ const tooLong = text.length > maxRenderableStringLength;
1802
+ title = tooLong ? undefined : text;
1803
+ content = tooLong ? widget(ExpandableTextPropertyValue, {text}) : renderTrustedType(description, className);
1804
+ } else if (isFunction) {
1805
+ content = ObjectPropertiesSection.valueElementForFunctionDescription(description);
1806
+ } else if (description.length > maxRenderableStringLength) {
1807
+ title = description;
1808
+ content = widget(ExpandableTextPropertyValue, {text: description});
1809
+ } else {
1810
+ title = description;
1811
+ const hasPreview = value.preview && showPreview;
1812
+ const previewContent = hasPreview ?
1813
+ new RemoteObjectPreviewFormatter().renderObjectPreview(value.preview, includeNullOrUndefined) :
1814
+ description;
1815
+ content = html`${previewContent}${
1816
+ isSyntheticProperty ? nothing : ObjectPropertiesSection.getMemoryIcon(value, variableName)}`;
1817
+ }
1818
+
1819
+ if (wasThrown) {
1820
+ return html`<span ${valueRef ? ref(valueRef) : nothing} class="error value">${
1821
+ uiI18n.getFormatLocalizedStringTemplate(str_, UIStrings.exceptionS, {
1822
+ PH1: html`<span
1823
+ class=${classes}
1824
+ title=${ifDefined(title)}
1825
+ @click=${isNode ? onNodeClick : nothing}
1826
+ @mousemove=${isNode ? onNodeMouseMove : nothing}
1827
+ @mouseleave=${isNode ? onNodeMouseLeave : nothing}>${content}</span>`,
1828
+ })}</span>`;
1829
+ }
1830
+ return html`<span
1831
+ ${valueRef ? ref(valueRef) : nothing}
1832
+ class=${classes}
1833
+ title=${ifDefined(title)}
1834
+ @click=${isNode ? onNodeClick : nothing}
1835
+ @mousemove=${isNode ? onNodeMouseMove : nothing}
1836
+ @mouseleave=${isNode ? onNodeMouseLeave : nothing}>${content}</span>`;
1837
+ }
1838
+
1839
+ export function defaultObjectPresentation(objectOrTree: SDK.RemoteObject.RemoteObject|ObjectTree,
1840
+ linkifier?: Components.Linkifier.Linkifier, skipProto?: boolean,
1841
+ readOnly?: boolean): LitTemplate {
1842
+ const objectTree = objectOrTree instanceof ObjectTree ? objectOrTree : new ObjectTree(objectOrTree, {
1843
+ readOnly: Boolean(readOnly),
1844
+ propertiesMode: ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
1845
+ });
1846
+ const object = objectTree.object;
1847
+ const title = html`<span class="source-code"><style>${objectValueStyles}</style>${
1848
+ renderPropertyValue(object, /* wasThrown= */ false, /* showPreview= */ true)}</span>`;
1849
+ if (!object.hasChildren) {
1850
+ return title;
1851
+ }
1852
+ return html`${
1853
+ widget(ObjectPropertiesSectionWidget,
1854
+ {objectTree, title, linkifier, skipProto: !!skipProto, showOverflow: !readOnly})}`;
1855
+ }
1856
+
1528
1857
  /**
1529
1858
  * Number of initially visible children in an ObjectPropertyTreeElement.
1530
1859
  * Remaining children are shown as soon as requested via a show more properties button.
@@ -1584,7 +1913,7 @@ export const OBJECT_PROPERTY_DEFAULT_VIEW: ObjectPropertyView = (input, output,
1584
1913
  (entries ?? []).filter(e => e !== currentMatch && e.matchType === 'name').map(e => e.range.cssValue()).join(' ');
1585
1914
  const valueRanges =
1586
1915
  (entries ?? []).filter(e => e !== currentMatch && e.matchType === 'value').map(e => e.range.cssValue()).join(' ');
1587
- const value = (): LitTemplate|HTMLElement => {
1916
+ const value = (): LitTemplate => {
1588
1917
  const valueRef = ref(e => {
1589
1918
  output.valueElement = e;
1590
1919
  });
@@ -1593,11 +1922,11 @@ export const OBJECT_PROPERTY_DEFAULT_VIEW: ObjectPropertyView = (input, output,
1593
1922
  }
1594
1923
  if (property.value) {
1595
1924
  const showPreview = property.name !== '[[Prototype]]';
1596
- const value = ObjectPropertiesSection.createPropertyValueWithCustomSupport(
1597
- property.value, property.wasThrown, showPreview, input.linkifier, property.synthetic,
1598
- input.node.path /* variableName */, input.node.includeNullOrUndefinedValues);
1599
- output.valueElement = value;
1600
- return value;
1925
+ return renderPropertyValue(property.value, property.wasThrown, showPreview, input.linkifier, property.synthetic,
1926
+ input.node.path /* variableName */, input.node.includeNullOrUndefinedValues,
1927
+ /* useCustomPreview */ true, e => {
1928
+ output.valueElement = e;
1929
+ });
1601
1930
  }
1602
1931
  if (property.getter) {
1603
1932
  const getter = property.getter;
@@ -1684,6 +2013,7 @@ export class ObjectPropertyWidget extends UI.Widget.Widget {
1684
2013
  get property(): ObjectTreeNode|undefined {
1685
2014
  return this.#property;
1686
2015
  }
2016
+
1687
2017
  set property(property: ObjectTreeNode) {
1688
2018
  if (this.#property) {
1689
2019
  this.#property.removeEventListener(ObjectTreeNodeBase.Events.VALUE_CHANGED, this.requestUpdate, this);
@@ -1703,6 +2033,7 @@ export class ObjectPropertyWidget extends UI.Widget.Widget {
1703
2033
  get expanded(): boolean {
1704
2034
  return this.#expanded;
1705
2035
  }
2036
+
1706
2037
  set expanded(expanded: boolean) {
1707
2038
  this.#expanded = expanded;
1708
2039
  this.requestUpdate();
@@ -1711,6 +2042,7 @@ export class ObjectPropertyWidget extends UI.Widget.Widget {
1711
2042
  get linkifier(): Components.Linkifier.Linkifier|undefined {
1712
2043
  return this.#linkifier;
1713
2044
  }
2045
+
1714
2046
  set linkifier(linkifier: Components.Linkifier.Linkifier|undefined) {
1715
2047
  this.#linkifier = linkifier;
1716
2048
  this.requestUpdate();
@@ -1719,6 +2051,7 @@ export class ObjectPropertyWidget extends UI.Widget.Widget {
1719
2051
  get editable(): boolean {
1720
2052
  return this.#editable;
1721
2053
  }
2054
+
1722
2055
  set editable(val: boolean) {
1723
2056
  this.#editable = val;
1724
2057
  this.requestUpdate();
@@ -2010,6 +2343,7 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
2010
2343
  get editable(): boolean {
2011
2344
  return this.#widget.editable;
2012
2345
  }
2346
+
2013
2347
  set editable(val: boolean) {
2014
2348
  this.#widget.editable = val;
2015
2349
  }
@@ -2388,42 +2722,6 @@ export class ArrayGroupingTreeElement extends UI.TreeOutline.TreeElement {
2388
2722
  static sparseIterationThreshold = 250000;
2389
2723
  }
2390
2724
 
2391
- let rendererInstance: Renderer;
2392
-
2393
- export class Renderer implements UI.UIUtils.Renderer {
2394
- static instance(opts: {forceNew: boolean} = {forceNew: false}): Renderer {
2395
- const {forceNew} = opts;
2396
- if (!rendererInstance || forceNew) {
2397
- rendererInstance = new Renderer();
2398
- }
2399
- return rendererInstance;
2400
- }
2401
-
2402
- async render(object: Object, options?: UI.UIUtils.Options): Promise<UI.UIUtils.RenderedObject|null> {
2403
- if (!(object instanceof SDK.RemoteObject.RemoteObject)) {
2404
- throw new Error('Can\'t render ' + object);
2405
- }
2406
- const title = options?.title;
2407
- const section = new ObjectPropertiesSection(object, title, undefined, undefined, Boolean(options?.editable));
2408
- if (!title) {
2409
- section.titleLessMode();
2410
- }
2411
- if (options?.expand) {
2412
- section.firstChild()?.expand();
2413
- }
2414
- const dispatchDimensionChange = (): void => {
2415
- section.element.dispatchEvent(new CustomEvent('dimensionschanged'));
2416
- };
2417
- section.addEventListener(UI.TreeOutline.Events.ElementAttached, dispatchDimensionChange);
2418
- section.addEventListener(UI.TreeOutline.Events.ElementExpanded, dispatchDimensionChange);
2419
- section.addEventListener(UI.TreeOutline.Events.ElementCollapsed, dispatchDimensionChange);
2420
- return {
2421
- element: section.element,
2422
- forceSelect: section.forceSelect.bind(section),
2423
- };
2424
- }
2425
- }
2426
-
2427
2725
  interface ExpandableTextViewInput {
2428
2726
  copyText: () => void;
2429
2727
  expandText: () => void;