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
@@ -14,21 +14,21 @@ import {AccessibilitySubPane} from './AccessibilitySubPane.js';
14
14
 
15
15
  const UIStrings = {
16
16
  /**
17
- * @description Name of a tool which allows the developer to view the contents of the page in the
18
- * 'source order' (the order in which the HTML elements show up in the source code). In the
19
- * Accessibility panel.
17
+ * @description Name of a feature that allows the developer to view the contents of the page in the
18
+ * 'source order' (the order in which the HTML elements show up in the source code) under the
19
+ * Accessibility tab in the Elements panel.
20
20
  */
21
- sourceOrderViewer: 'Source Order Viewer',
21
+ sourceOrderViewer: 'Source order viewer',
22
22
  /**
23
- * @description Text in Source Order Viewer of the Accessibility panel shown when the selected node has no child elements
23
+ * @description Text in the source order viewer under the Accessibility tab of the Elements panel shown when the selected node has no child elements.
24
24
  */
25
25
  noSourceOrderInformation: 'No source order information available',
26
26
  /**
27
- * @description Text in Source Order Viewer of the Accessibility panel shown when the selected node has many child elements
27
+ * @description Text in the source order viewer under the Accessibility tab of the Elements panel shown when the selected node has many child elements.
28
28
  */
29
29
  thereMayBeADelayInDisplaying: 'There may be a delay in displaying source order for elements with many children',
30
30
  /**
31
- * @description Checkbox label in Source Order Viewer of the Accessibility panel. Source order
31
+ * @description Checkbox label in the source order viewer under the Accessibility tab of the Elements panel. Source order
32
32
  * means the order in which the HTML elements show up in the source code.
33
33
  */
34
34
  showSourceOrder: 'Show source order',
@@ -11,11 +11,11 @@ let loadedAccessibilityModule: (typeof Accessibility|undefined);
11
11
 
12
12
  const UIStrings = {
13
13
  /**
14
- * @description Text for accessibility of the web page
14
+ * @description Title of the Accessibility tab in the Elements panel.
15
15
  */
16
16
  accessibility: 'Accessibility',
17
17
  /**
18
- * @description Command for showing the 'Accessibility' tool
18
+ * @description Command for showing the Accessibility tab in the Elements panel.
19
19
  */
20
20
  shoAccessibility: 'Show Accessibility',
21
21
  } as const;
@@ -2,6 +2,7 @@
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
4
 
5
+ import * as AccessibilityAnnouncementRecordingView from './AccessibilityAnnouncementRecordingView.js';
5
6
  import * as AccessibilityNodeView from './AccessibilityNodeView.js';
6
7
  import * as AccessibilitySidebarView from './AccessibilitySidebarView.js';
7
8
  import * as AccessibilityStrings from './AccessibilityStrings.js';
@@ -10,6 +11,7 @@ import * as ARIAAttributesView from './ARIAAttributesView.js';
10
11
  import * as ARIAMetadata from './ARIAMetadata.js';
11
12
 
12
13
  export {
14
+ AccessibilityAnnouncementRecordingView,
13
15
  AccessibilityNodeView,
14
16
  AccessibilitySidebarView,
15
17
  AccessibilityStrings,
@@ -543,12 +543,12 @@ function createPerformanceTraceContext(focus: AiAssistanceModel.AIContext.AgentF
543
543
  return new AiAssistanceModel.PerformanceTraceContext.PerformanceTraceContext(focus);
544
544
  }
545
545
 
546
- function createStorageContext(item: AiAssistanceModel.StorageItem.StorageItem|null):
547
- AiAssistanceModel.StorageAgent.StorageContext|null {
546
+ function createStorageContext(item: AiAssistanceModel.StorageItem.StorageItem|
547
+ null): AiAssistanceModel.StorageContext.StorageContext|null {
548
548
  if (!item) {
549
549
  return null;
550
550
  }
551
- return new AiAssistanceModel.StorageAgent.StorageContext(item);
551
+ return new AiAssistanceModel.StorageContext.StorageContext(item);
552
552
  }
553
553
 
554
554
  /**
@@ -606,7 +606,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
606
606
  #selectedRequest: AiAssistanceModel.RequestContext.RequestContext|null = null;
607
607
 
608
608
  #selectedAccessibility: AiAssistanceModel.AccessibilityContext.AccessibilityContext|null = null;
609
- #selectedStorage: AiAssistanceModel.StorageAgent.StorageContext|null = null;
609
+ #selectedStorage: AiAssistanceModel.StorageContext.StorageContext|null = null;
610
610
 
611
611
  // Messages displayed in the `ChatView` component.
612
612
 
@@ -1640,7 +1640,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1640
1640
 
1641
1641
  } else if (data instanceof AiAssistanceModel.AccessibilityContext.AccessibilityContext) {
1642
1642
  this.#selectedAccessibility = data;
1643
- } else if (data instanceof AiAssistanceModel.StorageAgent.StorageContext) {
1643
+ } else if (data instanceof AiAssistanceModel.StorageContext.StorageContext) {
1644
1644
  this.#selectedStorage = data;
1645
1645
  }
1646
1646
 
@@ -110,9 +110,8 @@ export class AIv2MarkdownRenderer extends MarkdownView.MarkdownView.MarkdownInsi
110
110
  return html`${fallbackText}`;
111
111
  }
112
112
  if (href.startsWith('#file-')) {
113
- const file = AiAssistanceModel.ContextSelectionAgent.ContextSelectionAgent.getUISourceCodes().find(
114
- file => AiAssistanceModel.ContextSelectionAgent.ContextSelectionAgent.uiSourceCodeId.get(file) ===
115
- Number(href.substring(6)));
113
+ const file = AiAssistanceModel.ListSources.ListSourcesTool.getUISourceCodes().find(
114
+ file => AiAssistanceModel.ListSources.ListSourcesTool.uiSourceCodeId.get(file) === Number(href.substring(6)));
116
115
 
117
116
  if (file) {
118
117
  return this.#revealableLink(file, file.name());
@@ -194,7 +194,7 @@ function getContextRemoveLabel(context: AiAssistanceModel.AiAgent.ConversationCo
194
194
  if (context instanceof AiAssistanceModel.PerformanceTraceContext.PerformanceTraceContext) {
195
195
  return lockedString(UIStringsNotTranslate.removeContextPerfInsight);
196
196
  }
197
- if (context instanceof AiAssistanceModel.StorageAgent.StorageContext) {
197
+ if (context instanceof AiAssistanceModel.StorageContext.StorageContext) {
198
198
  return lockedString(UIStringsNotTranslate.removeContextStorage);
199
199
  }
200
200
  return lockedString(UIStringsNotTranslate.removeContext);
@@ -371,7 +371,7 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
371
371
  html`<devtools-icon class="icon" name="performance" title="Lighthouse"></devtools-icon>` :
372
372
  input.context instanceof AiAssistanceModel.PerformanceTraceContext.PerformanceTraceContext ?
373
373
  html`<devtools-icon class="icon" name="performance" title="Performance"></devtools-icon>` :
374
- input.context instanceof AiAssistanceModel.StorageAgent.StorageContext ?
374
+ input.context instanceof AiAssistanceModel.StorageContext.StorageContext ?
375
375
  html`<devtools-icon class="icon" name="table" title="Storage"></devtools-icon>` :
376
376
  Lit.nothing}
377
377
  <span
@@ -15,8 +15,9 @@ import type * as Protocol from '../../../generated/protocol.js';
15
15
  import type {
16
16
  AiWidget, BottomUpTreeAiWidget, ComputedStyleAiWidget, CoreVitalsAiWidget, DomTreeAiWidget, LighthouseReportAiWidget,
17
17
  NetworkRequestGeneralHeadersAiWidget, NetworkRequestsListAiWidget, NetworkTrackAiWidget, PerfInsightAiWidget,
18
- PerformanceTraceAiWidget, SourceCodeAiWidget, SourceFileAiWidget, SourceFilesListAiWidget, StylePropertiesAiWidget,
19
- TimelineEventSummaryAiWidget, TimelineRangeSummaryAiWidget} from '../../../models/ai_assistance/agents/AiAgent.js';
18
+ PerformanceTraceAiWidget, SourceCodeAiWidget, SourceFileAiWidget, SourceFilesListAiWidget, StorageBreakdownAiWidget,
19
+ StylePropertiesAiWidget, TimelineEventSummaryAiWidget,
20
+ TimelineRangeSummaryAiWidget} from '../../../models/ai_assistance/agents/AiAgent.js';
20
21
  import * as AiAssistanceModel from '../../../models/ai_assistance/ai_assistance.js';
21
22
  import * as ComputedStyle from '../../../models/computed_style/computed_style.js';
22
23
  import * as Formatter from '../../../models/formatter/formatter.js';
@@ -31,9 +32,11 @@ import type * as MarkdownView from '../../../ui/components/markdown_view/markdow
31
32
  import type {MarkdownLitRenderer} from '../../../ui/components/markdown_view/MarkdownView.js';
32
33
  import * as Snackbars from '../../../ui/components/snackbars/snackbars.js';
33
34
  import * as UIHelpers from '../../../ui/helpers/helpers.js';
35
+ import type * as PerfUI from '../../../ui/legacy/components/perf_ui/perf_ui.js';
34
36
  import * as UI from '../../../ui/legacy/legacy.js';
35
37
  import * as Lit from '../../../ui/lit/lit.js';
36
38
  import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
39
+ import * as Application from '../../application/application.js';
37
40
  import * as Elements from '../../elements/elements.js';
38
41
  import * as Lighthouse from '../../lighthouse/lighthouse.js';
39
42
  import * as NetworkForward from '../../network/forward/forward.js';
@@ -421,6 +424,14 @@ const UIStringsNotTranslate = {
421
424
  * @description Title for the source files list widget.
422
425
  */
423
426
  inspectedFileNames: 'Inspected file names',
427
+ /**
428
+ * @description Title for the storage breakdown widget.
429
+ */
430
+ storageBreakdown: 'Storage breakdown',
431
+ /**
432
+ * @description Accessible label for the reveal button in the storage breakdown widget.
433
+ */
434
+ revealStorageBreakdown: 'Reveal storage breakdown in Application panel',
424
435
  } as const;
425
436
 
426
437
  /**
@@ -1006,6 +1017,51 @@ async function resolveNode(backendNodeId: Protocol.DOM.BackendNodeId): Promise<S
1006
1017
  return resolved;
1007
1018
  }
1008
1019
 
1020
+ async function makeStorageBreakdownWidget(widgetData: StorageBreakdownAiWidget): Promise<WidgetMakerResponse|null> {
1021
+ const target = SDK.TargetManager.TargetManager.instance().primaryPageTarget();
1022
+ if (!target) {
1023
+ return null;
1024
+ }
1025
+
1026
+ const breakdown = widgetData.data.usageBreakdown;
1027
+ const total = breakdown.reduce((sum, item) => sum + item.bytes, 0);
1028
+
1029
+ const slices = breakdown.map(item => {
1030
+ const color = Application.StorageView.storagePieColors.get(item.storageType as Protocol.Storage.StorageType) ||
1031
+ 'rgb(180, 180, 180)';
1032
+ const title = Application.StorageView.StorageView.getStorageTypeNameForWidget(item.storageType);
1033
+
1034
+ return {
1035
+ value: item.bytes,
1036
+ color,
1037
+ title,
1038
+ };
1039
+ });
1040
+
1041
+ const chartData: PerfUI.PieChart.PieChartData = {
1042
+ chartName: lockedString(UIStringsNotTranslate.storageBreakdown),
1043
+ size: 110,
1044
+ formatter: val => AiAssistanceModel.UnitFormatters.bytes(val),
1045
+ showLegend: true,
1046
+ total,
1047
+ slices,
1048
+ };
1049
+
1050
+ const renderedWidget = html`
1051
+ <div class="storage-breakdown-widget">
1052
+ <devtools-perf-piechart .data=${chartData}></devtools-perf-piechart>
1053
+ </div>
1054
+ `;
1055
+
1056
+ return {
1057
+ renderedWidget,
1058
+ title: lockedString(UIStringsNotTranslate.storageBreakdown),
1059
+ revealable: new Application.StorageView.StorageRevealable(target),
1060
+ accessibleRevealLabel: lockedString(UIStringsNotTranslate.revealStorageBreakdown),
1061
+ jslogContext: 'storage-breakdown-widget',
1062
+ };
1063
+ }
1064
+
1009
1065
  async function makeComputedStyleWidget(widgetData: ComputedStyleAiWidget): Promise<WidgetMakerResponse|null> {
1010
1066
  const domNodeForId = await resolveNode(widgetData.data.backendNodeId);
1011
1067
  if (!domNodeForId) {
@@ -1678,6 +1734,9 @@ export function getWidgetSignature(widget: AiWidget): string {
1678
1734
  return `${widget.name}:${widget.data.url}:${widget.data.line ?? ''}:${widget.data.column ?? ''}`;
1679
1735
  case 'NETWORK_REQUESTS_LIST':
1680
1736
  return `${widget.name}:${widget.data.requests.map(r => r.requestId()).join(',')}`;
1737
+ case 'STORAGE_BREAKDOWN':
1738
+ return `${widget.name}:${widget.data.totalUsageBytes}:${
1739
+ widget.data.usageBreakdown.map(e => `${e.storageType}_${e.bytes}`).join(',')}`;
1681
1740
  default:
1682
1741
  Platform.assertNever(widget, 'Unknown AiWidget name');
1683
1742
  }
@@ -1785,17 +1844,27 @@ async function renderWidgets(
1785
1844
  case 'SOURCE_CODE':
1786
1845
  response = await makeSourceCodeWidget(widgetData);
1787
1846
  break;
1847
+ case 'STORAGE_BREAKDOWN':
1848
+ response = await makeStorageBreakdownWidget(widgetData);
1849
+ break;
1788
1850
  default:
1789
1851
  Platform.assertNever(widgetData, 'Unknown AiWidget name');
1790
1852
  }
1791
1853
  return renderWidgetResponse(response);
1792
1854
  }));
1793
1855
 
1856
+ // Omit the wrapper element entirely if every widget maker resolved to Lit.nothing
1857
+ // so empty container elements do not occupy vertical layout space in the chat stream.
1858
+ const renderedItems = ui.filter(item => item !== Lit.nothing);
1859
+ if (renderedItems.length === 0) {
1860
+ return Lit.nothing;
1861
+ }
1862
+
1794
1863
  if (options.wrapperClass) {
1795
- return html`<div class=${options.wrapperClass}>${ui}</div>`;
1864
+ return html`<div class=${options.wrapperClass}>${renderedItems}</div>`;
1796
1865
  }
1797
1866
 
1798
- return html`${ui}`;
1867
+ return html`${renderedItems}`;
1799
1868
  }
1800
1869
 
1801
1870
  function renderSideEffectConfirmationUi(step: Step): Lit.LitTemplate {
@@ -2334,19 +2403,30 @@ async function makeNetworkTrackWidget(widgetData: NetworkTrackAiWidget): Promise
2334
2403
  }
2335
2404
 
2336
2405
  async function makeLighthouseReportWidget(widgetData: LighthouseReportAiWidget): Promise<WidgetMakerResponse|null> {
2337
- const reportEl =
2338
- Lighthouse.LighthouseReportRenderer.LighthouseReportRenderer.renderLighthouseScores(widgetData.data.report);
2339
- if (!reportEl) {
2340
- return null;
2406
+ let reportEl: HTMLElement|null = null;
2407
+ try {
2408
+ // Snapshot mode audits only collect individual audit results and do not generate
2409
+ // top-level category score gauges.
2410
+ reportEl =
2411
+ Lighthouse.LighthouseReportRenderer.LighthouseReportRenderer.renderLighthouseScores(widgetData.data.report);
2412
+ } catch {
2413
+ reportEl = null;
2341
2414
  }
2342
-
2343
2415
  const snapshotReport = widgetData.data.snapshotReport;
2416
+ const revealLighthouseLabel = lockedString(UIStringsNotTranslate.revealLighthouse);
2417
+
2418
+ // When score gauges are rendered, the widget header displays the title "Lighthouse report"
2419
+ // and the header button defaults to "Reveal". When score gauges are absent (snapshot mode),
2420
+ // no header is rendered, so customRevealTitle labels the standalone button ("Reveal Lighthouse report").
2421
+ const title = reportEl ? lockedString(UIStringsNotTranslate.lighthouseReport) : null;
2422
+ const customRevealTitle = reportEl ? undefined : revealLighthouseLabel;
2344
2423
 
2345
2424
  return {
2346
- renderedWidget: html`<div class="lighthouse-report-widget">${reportEl}</div>`,
2425
+ renderedWidget: reportEl ? html`<div class="lighthouse-report-widget">${reportEl}</div>` : null,
2347
2426
  revealable: new Lighthouse.LighthousePanel.ActiveLighthouseReport(widgetData.data.report),
2348
- accessibleRevealLabel: lockedString(UIStringsNotTranslate.revealLighthouse),
2349
- title: lockedString(UIStringsNotTranslate.lighthouseReport),
2427
+ accessibleRevealLabel: revealLighthouseLabel,
2428
+ customRevealTitle,
2429
+ title,
2350
2430
  jslogContext: snapshotReport ? 'lighthouse-snapshot-report-widget' : 'lighthouse-report-widget',
2351
2431
  };
2352
2432
  }
@@ -612,4 +612,10 @@
612
612
  flex-direction: column;
613
613
  gap: var(--sys-size-4);
614
614
  }
615
+
616
+ .storage-breakdown-widget {
617
+ display: flex;
618
+ justify-content: center;
619
+ padding: var(--sys-size-4);
620
+ }
615
621
  }
@@ -339,6 +339,7 @@ export class ApplicationPanelSidebar extends UI.Widget.VBox implements SDK.Targe
339
339
  reportingApiTreeElement: ReportingApiTreeElement;
340
340
  webMcpTreeElement?: WebMCPTreeElement;
341
341
  adsTreeElement?: ApplicationPanelTreeElement;
342
+ storageTreeElement?: StorageTreeElement;
342
343
  deviceBoundSessionsRootTreeElement: DeviceBoundSessionsRootTreeElement|undefined;
343
344
  deviceBoundSessionsModel: DeviceBoundSessionsModel|undefined;
344
345
  preloadingSummaryTreeElement: PreloadingSummaryTreeElement|undefined;
@@ -378,8 +379,8 @@ export class ApplicationPanelSidebar extends UI.Widget.VBox implements SDK.Targe
378
379
  manifestTreeElement.generateChildren();
379
380
  this.serviceWorkersTreeElement = new ServiceWorkersTreeElement(panel);
380
381
  this.applicationTreeElement.appendChild(this.serviceWorkersTreeElement);
381
- const clearStorageTreeElement = new ClearStorageTreeElement(panel);
382
- this.applicationTreeElement.appendChild(clearStorageTreeElement);
382
+ this.storageTreeElement = new StorageTreeElement(panel);
383
+ this.applicationTreeElement.appendChild(this.storageTreeElement);
383
384
  if (Root.Runtime.hostConfig.devToolsWebMCPSupport?.enabled) {
384
385
  this.webMcpTreeElement = new WebMCPTreeElement(panel);
385
386
  this.applicationTreeElement.appendChild(this.webMcpTreeElement);
@@ -937,6 +938,11 @@ export class ApplicationPanelSidebar extends UI.Widget.VBox implements SDK.Targe
937
938
  }
938
939
  }
939
940
 
941
+ // Selects the Storage tree element in the sidebar (which opens the StorageView component for the main Storage tab).
942
+ showStorage(): void {
943
+ this.storageTreeElement?.select();
944
+ }
945
+
940
946
  private onmousemove(event: MouseEvent): void {
941
947
  const nodeUnderMouse = (event.target as Node);
942
948
  if (!nodeUnderMouse) {
@@ -1140,7 +1146,7 @@ export class AppManifestTreeElement extends ApplicationPanelTreeElement {
1140
1146
  }
1141
1147
  }
1142
1148
 
1143
- export class ClearStorageTreeElement extends ApplicationPanelTreeElement {
1149
+ export class StorageTreeElement extends ApplicationPanelTreeElement {
1144
1150
  private view?: StorageView;
1145
1151
  constructor(storagePanel: ResourcesPanel) {
1146
1152
  super(storagePanel, i18nString(UIStrings.storage), false, 'storage');
@@ -1149,7 +1155,7 @@ export class ClearStorageTreeElement extends ApplicationPanelTreeElement {
1149
1155
  }
1150
1156
 
1151
1157
  override get itemURL(): Platform.DevToolsPath.UrlString {
1152
- return 'clear-storage://' as Platform.DevToolsPath.UrlString;
1158
+ return 'storage://' as Platform.DevToolsPath.UrlString;
1153
1159
  }
1154
1160
 
1155
1161
  override onselect(selectedByUser?: boolean): boolean {
@@ -254,7 +254,6 @@ export interface IndexedDBDataViewInput {
254
254
  onKeyFilterChange: (value: string) => void;
255
255
  onRowSelected: (rowNumber: number) => void;
256
256
  deleteEntry: (entry: Entry) => Promise<void>;
257
- populateContextMenu: (e: CustomEvent<UI.ContextMenu.ContextMenu>, entry: Entry) => void;
258
257
  }
259
258
 
260
259
  const renderKeyPathString = (keyPathString: string): LitTemplate => {
@@ -272,6 +271,21 @@ const renderKeyColumnHeader = (prefix: string, keyPath: string|string[]|null|und
272
271
  renderKeyPathString(keyPath)})`;
273
272
  };
274
273
 
274
+ const populateContextMenu = (e: CustomEvent<UI.ContextMenu.ContextMenu>): void => {
275
+ const row = e.currentTarget as HTMLElement;
276
+ const widgetElement = row.querySelector('.value-column devtools-widget');
277
+ const widget = widgetElement ? UI.Widget.Widget.get(widgetElement) as ObjectPropertiesSectionWidget : null;
278
+ if (widget?.objectTree) {
279
+ const contextMenu = e.detail;
280
+ contextMenu.revealSection().appendItem(i18nString(UIStrings.expandRecursively), () => {
281
+ void widget.expandRecursively();
282
+ }, {jslogContext: 'expand-recursively'});
283
+ contextMenu.revealSection().appendItem(i18nString(UIStrings.collapse), () => {
284
+ widget.expanded = false;
285
+ }, {jslogContext: 'collapse'});
286
+ }
287
+ };
288
+
275
289
  const renderDataGrid = (input: IndexedDBDataViewInput): LitTemplate => {
276
290
  const keyPath = input.isIndex && input.index ? input.index.keyPath : input.objectStore.keyPath;
277
291
  // clang-format off
@@ -284,17 +298,20 @@ const renderDataGrid = (input: IndexedDBDataViewInput): LitTemplate => {
284
298
  ${input.isIndex ? html`<th id="primary-key">${renderKeyColumnHeader(i18nString(UIStrings.primaryKey), input.objectStore.keyPath)}</th>` : nothing}
285
299
  <th id="value">${i18nString(UIStrings.valueString)}</th>
286
300
  </tr>
287
- ${repeat(input.entries, (_entry, index) => index, (entry, index) => html`
288
- <tr ?selected=${index + input.skipCount === input.selectedRowNumber}
289
- @select=${() => input.onRowSelected(index + input.skipCount)}
290
- @delete=${() => input.deleteEntry(entry)}
291
- @contextmenu=${(e: CustomEvent<UI.ContextMenu.ContextMenu>) => input.populateContextMenu(e, entry)}>
292
- <td>${index + input.skipCount}</td>
293
- <td>${widget(ObjectPropertiesSectionWidget, {value: entry.key})}</td>
294
- ${input.isIndex ? html`<td>${widget(ObjectPropertiesSectionWidget, {value: entry.primaryKey})}</td>` : nothing}
295
- <td class="value-column">${widget(ObjectPropertiesSectionWidget, {value: entry.value})}</td>
296
- </tr>`,
297
- )}
301
+ ${repeat(input.entries, (_entry, index) => index, (entry, index) => {
302
+ return html`
303
+ <tr ?selected=${index + input.skipCount === input.selectedRowNumber}
304
+ class="data-grid-data-row"
305
+ @select=${() => input.onRowSelected(index + input.skipCount)}
306
+ @delete=${() => input.deleteEntry(entry)}
307
+ @contextmenu=${populateContextMenu}>
308
+ <td>${index + input.skipCount}</td>
309
+ <td>${widget(ObjectPropertiesSectionWidget, {value: entry.key})}</td>
310
+ ${input.isIndex ? html`<td>${widget(ObjectPropertiesSectionWidget, {value: entry.primaryKey})}</td>`
311
+ : nothing}
312
+ <td class="value-column">${widget(ObjectPropertiesSectionWidget, {value: entry.value})}</td>
313
+ </tr>`;
314
+ })}
298
315
  </table>`}>
299
316
  </devtools-data-grid>`;
300
317
  // clang-format on
@@ -467,31 +484,6 @@ export class IDBDataView extends UI.View.SimpleView {
467
484
  this.updateData(false);
468
485
  }
469
486
 
470
- private populateContextMenu(e: CustomEvent<UI.ContextMenu.ContextMenu>, {value}: Entry): void {
471
- const contextMenu = e.detail;
472
- if (value && value.hasChildren) {
473
- const tr = e.currentTarget as HTMLElement;
474
- const valueTd = tr.querySelector('.value-column');
475
- if (valueTd) {
476
- const widgetEl = valueTd.querySelector('devtools-widget');
477
- if (widgetEl) {
478
- const widget = UI.Widget.Widget.get(widgetEl);
479
- if (widget instanceof ObjectPropertiesSectionWidget) {
480
- const objectUi = widget.objectPropertiesSection;
481
- if (objectUi) {
482
- contextMenu.revealSection().appendItem(i18nString(UIStrings.expandRecursively), () => {
483
- void objectUi.objectTreeElement().expandRecursively();
484
- }, {jslogContext: 'expand-recursively'});
485
- contextMenu.revealSection().appendItem(i18nString(UIStrings.collapse), () => {
486
- objectUi.objectTreeElement().collapse();
487
- }, {jslogContext: 'collapse'});
488
- }
489
- }
490
- }
491
- }
492
- }
493
- }
494
-
495
487
  refreshData(): void {
496
488
  this.updateData(true);
497
489
  }
@@ -683,43 +675,33 @@ export class IDBDataView extends UI.View.SimpleView {
683
675
  },
684
676
  onRowSelected: this.onRowSelected.bind(this),
685
677
  deleteEntry: this.deleteEntry.bind(this),
686
- populateContextMenu: this.populateContextMenu.bind(this),
687
678
  },
688
679
  undefined, this.element);
689
680
  }
690
681
  }
691
682
 
692
683
  interface ObjectPropertiesSectionWidgetInput {
693
- value: SDK.RemoteObject.RemoteObject|null;
694
- }
695
-
696
- interface ObjectPropertiesSectionWidgetOutput {
697
- objectPropSection: ObjectUI.ObjectPropertiesSection.ObjectPropertiesSection|null;
684
+ objectTree: ObjectUI.ObjectPropertiesSection.ObjectTree|null;
698
685
  }
699
686
 
700
687
  type ObjectPropertiesSectionWidgetView = (
701
688
  input: ObjectPropertiesSectionWidgetInput,
702
- output: ObjectPropertiesSectionWidgetOutput,
689
+ output: void,
703
690
  target: HTMLElement,
704
691
  ) => void;
705
692
 
706
693
  const OBJECT_PROPERTIES_SECTION_WIDGET_DEFAULT_VIEW: ObjectPropertiesSectionWidgetView = (input, output, target) => {
707
- if (!input.value) {
708
- output.objectPropSection = null;
694
+ if (!input.objectTree) {
709
695
  render(nothing, target);
710
696
  return;
711
697
  }
712
- const objectPropSection = ObjectUI.ObjectPropertiesSection.ObjectPropertiesSection.defaultObjectPropertiesSection(
713
- input.value, undefined /* linkifier */, true /* skipProto */, true /* readOnly */);
714
- output.objectPropSection = objectPropSection;
715
-
716
- const element = input.value.hasChildren ? objectPropSection.element : objectPropSection.titleElement;
717
- render(html`${element}`, target);
698
+ render(ObjectUI.ObjectPropertiesSection.defaultObjectPresentation(input.objectTree, undefined /* linkifier */,
699
+ true /* skipProto */, true /* readOnly */),
700
+ target);
718
701
  };
719
702
 
720
- class ObjectPropertiesSectionWidget extends UI.Widget.Widget {
721
- #value: SDK.RemoteObject.RemoteObject|null = null;
722
- #objectPropSection: ObjectUI.ObjectPropertiesSection.ObjectPropertiesSection|null = null;
703
+ export class ObjectPropertiesSectionWidget extends UI.Widget.Widget {
704
+ #objectTree: ObjectUI.ObjectPropertiesSection.ObjectTree|null = null;
723
705
  readonly #view: ObjectPropertiesSectionWidgetView;
724
706
 
725
707
  constructor(element?: HTMLElement, view = OBJECT_PROPERTIES_SECTION_WIDGET_DEFAULT_VIEW) {
@@ -728,20 +710,40 @@ class ObjectPropertiesSectionWidget extends UI.Widget.Widget {
728
710
  }
729
711
 
730
712
  set value(value: SDK.RemoteObject.RemoteObject|null) {
731
- if (this.#value === value) {
732
- return;
713
+ if (value) {
714
+ this.#objectTree = new ObjectUI.ObjectPropertiesSection.ObjectTree(value, {
715
+ readOnly: true,
716
+ propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
717
+ });
718
+ } else {
719
+ this.#objectTree = null;
733
720
  }
734
- this.#value = value;
735
721
  this.requestUpdate();
736
722
  }
737
723
 
738
- get objectPropertiesSection(): ObjectUI.ObjectPropertiesSection.ObjectPropertiesSection|null {
739
- return this.#objectPropSection;
724
+ get objectTree(): ObjectUI.ObjectPropertiesSection.ObjectTree|null {
725
+ return this.#objectTree;
726
+ }
727
+
728
+ get expanded(): boolean {
729
+ return this.#objectTree?.expanded ?? false;
730
+ }
731
+
732
+ set expanded(expanded: boolean) {
733
+ if (this.#objectTree) {
734
+ this.#objectTree.expanded = expanded;
735
+ this.requestUpdate();
736
+ }
737
+ }
738
+
739
+ async expandRecursively(): Promise<void> {
740
+ if (this.#objectTree) {
741
+ await this.#objectTree.expandRecursively(ObjectUI.ObjectPropertiesSection.EXPANDABLE_MAX_DEPTH);
742
+ this.requestUpdate();
743
+ }
740
744
  }
741
745
 
742
746
  override performUpdate(): void {
743
- const output: ObjectPropertiesSectionWidgetOutput = {objectPropSection: null};
744
- this.#view({value: this.#value}, output, this.contentElement);
745
- this.#objectPropSection = output.objectPropSection;
747
+ this.#view({objectTree: this.#objectTree}, undefined, this.contentElement);
746
748
  }
747
749
  }