chrome-devtools-frontend 1.0.1652307 → 1.0.1656291

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 (267) hide show
  1. package/.agents/skills/fixing-skipped-tests/SKILL.md +32 -0
  2. package/.agents/skills/migrate-chromium-test/SKILL.md +144 -0
  3. package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +116 -0
  4. package/.agents/skills/ui-eng-vision-logic-consolidator/SKILL.md +82 -0
  5. package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +123 -0
  6. package/.agents/skills/ui-eng-vision-test-scaffolder/SKILL.md +125 -0
  7. package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +75 -0
  8. package/AUTHORS +1 -0
  9. package/config/owner/COMMON_OWNERS +0 -4
  10. package/docs/get_the_code.md +1 -2
  11. package/docs/playbook.md +1 -1
  12. package/docs/ui_engineering.md +3 -1
  13. package/eslint.config.mjs +0 -5
  14. package/front_end/Tests.js +1 -0
  15. package/front_end/core/common/Settings.ts +47 -30
  16. package/front_end/core/sdk/CPUThrottlingManager.ts +23 -167
  17. package/front_end/core/sdk/CSSMetadata.ts +23 -0
  18. package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +8 -4
  19. package/front_end/core/sdk/ConsoleModel.ts +13 -11
  20. package/front_end/core/sdk/DOMDebuggerModel.ts +11 -5
  21. package/front_end/core/sdk/DOMModel.ts +4 -0
  22. package/front_end/core/sdk/EmulationModel.ts +4 -0
  23. package/front_end/core/sdk/EventBreakpointsModel.ts +9 -5
  24. package/front_end/core/sdk/IsolateManager.ts +6 -6
  25. package/front_end/core/sdk/ResourceTreeModel.ts +8 -5
  26. package/front_end/core/sdk/TargetManager.ts +17 -0
  27. package/front_end/entrypoints/devtools_app/devtools_app.ts +0 -1
  28. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +459 -74
  29. package/front_end/entrypoints/main/MainImpl.ts +12 -42
  30. package/front_end/foundation/Universe.ts +116 -3
  31. package/front_end/generated/InspectorBackendCommands.ts +11 -6
  32. package/front_end/generated/SupportedCSSProperties.js +124 -34
  33. package/front_end/generated/protocol-mapping.d.ts +8 -0
  34. package/front_end/generated/protocol-proxy-api.d.ts +15 -0
  35. package/front_end/generated/protocol.ts +94 -1
  36. package/front_end/models/ai_assistance/AiConversation.ts +2 -7
  37. package/front_end/models/ai_assistance/README.md +4 -3
  38. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -1
  39. package/front_end/models/ai_assistance/agents/NetworkAgent.snapshot.txt +1 -1
  40. package/front_end/models/ai_assistance/agents/PerformanceAgent.snapshot.txt +2 -2
  41. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +13 -320
  42. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +0 -24
  43. package/front_end/models/ai_assistance/agents/StylingAgent.ts +2 -358
  44. package/front_end/models/ai_assistance/ai_assistance.ts +6 -8
  45. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +295 -0
  46. package/front_end/models/ai_assistance/contexts/RequestContext.snapshot.txt +0 -1
  47. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +0 -2
  48. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +10 -10
  49. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +12 -11
  50. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +6 -6
  51. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -14
  52. package/front_end/models/ai_assistance/skills/accessibility.md +4 -2
  53. package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +142 -0
  54. package/front_end/models/ai_assistance/tools/GetStyles.ts +1 -1
  55. package/front_end/models/ai_assistance/tools/README.md +21 -1
  56. package/front_end/models/ai_assistance/tools/{ResolveLighthousePath.ts → ResolveDevtoolsNodePath.ts} +18 -17
  57. package/front_end/models/ai_assistance/tools/Tool.ts +6 -1
  58. package/front_end/models/ai_assistance/tools/ToolRegistry.ts +4 -2
  59. package/front_end/models/autofill_manager/AutofillManager.ts +6 -15
  60. package/front_end/models/bindings/NetworkProject.ts +4 -8
  61. package/front_end/models/breakpoints/BreakpointManager.ts +9 -9
  62. package/front_end/models/emulation/DeviceModeModel.ts +24 -0
  63. package/front_end/models/emulation/EmulatedDevices.ts +108 -0
  64. package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +36 -0
  65. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +8 -0
  66. package/front_end/models/issues_manager/IssuesManager.ts +10 -6
  67. package/front_end/models/javascript_metadata/JavaScriptMetadata.ts +4 -5
  68. package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
  69. package/front_end/models/live-metrics/LiveMetrics.ts +6 -6
  70. package/front_end/models/live-metrics/web-vitals-injected/spec/spec.ts +5 -5
  71. package/front_end/models/live-metrics/web-vitals-injected/web-vitals-injected.ts +3 -3
  72. package/front_end/models/logs/LogManager.ts +25 -10
  73. package/front_end/models/logs/NetworkLog.ts +24 -19
  74. package/front_end/models/persistence/AutomaticFileSystemManager.ts +14 -13
  75. package/front_end/models/persistence/AutomaticFileSystemWorkspaceBinding.ts +26 -14
  76. package/front_end/models/persistence/IsolatedFileSystem.ts +9 -11
  77. package/front_end/models/persistence/IsolatedFileSystemManager.ts +22 -11
  78. package/front_end/models/persistence/NetworkPersistenceManager.ts +73 -44
  79. package/front_end/models/persistence/PersistenceImpl.ts +4 -5
  80. package/front_end/models/project_settings/ProjectSettingsModel.ts +12 -11
  81. package/front_end/models/trace/EntityMapper.ts +1 -1
  82. package/front_end/models/trace/handlers/ScreenshotsHandler.ts +14 -59
  83. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +12 -38
  84. package/front_end/panels/ai_assistance/ExportConversation.ts +4 -1
  85. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
  86. package/front_end/panels/application/DeviceBoundSessionsView.ts +15 -3
  87. package/front_end/panels/application/FrameDetailsView.ts +2 -1
  88. package/front_end/panels/application/IndexedDBViews.ts +38 -36
  89. package/front_end/panels/application/ServiceWorkersView.ts +23 -16
  90. package/front_end/panels/application/components/AdsView.ts +4 -0
  91. package/front_end/panels/autofill/AutofillView.ts +1 -1
  92. package/front_end/panels/autofill/autofill-meta.ts +3 -2
  93. package/front_end/panels/common/CPUThrottlingOption.ts +142 -0
  94. package/front_end/panels/common/ThrottlingUtils.ts +9 -4
  95. package/front_end/panels/common/common.ts +1 -1
  96. package/front_end/panels/console/ConsoleViewMessage.ts +45 -0
  97. package/front_end/panels/elements/AccessibilityTreeUtils.ts +26 -15
  98. package/front_end/panels/elements/AccessibilityTreeView.ts +12 -9
  99. package/front_end/panels/elements/ElementsPanel.ts +0 -74
  100. package/front_end/panels/elements/ElementsTreeOutline.ts +5 -4
  101. package/front_end/panels/emulation/DeviceModeToolbar.ts +46 -45
  102. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +118 -68
  103. package/front_end/panels/layer_viewer/Layers3DView.ts +1 -1
  104. package/front_end/panels/layer_viewer/layerTreeOutline.css +20 -13
  105. package/front_end/panels/layers/LayersPanel.ts +1 -1
  106. package/front_end/panels/mobile_throttling/CalibrationController.ts +6 -5
  107. package/front_end/panels/mobile_throttling/MobileThrottlingSelector.ts +1 -1
  108. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +40 -13
  109. package/front_end/panels/mobile_throttling/ThrottlingPresets.ts +13 -17
  110. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +79 -30
  111. package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +5 -0
  112. package/front_end/panels/network/LinkPreloadGenerator.ts +101 -0
  113. package/front_end/panels/network/NetworkLogView.ts +28 -9
  114. package/front_end/panels/network/NetworkPanel.ts +1 -63
  115. package/front_end/panels/network/RequestInitiatorView.ts +29 -4
  116. package/front_end/panels/network/components/HeaderSectionRow.css +9 -7
  117. package/front_end/panels/network/components/HeaderSectionRow.ts +20 -1
  118. package/front_end/panels/network/components/RequestHeaderSection.css +5 -3
  119. package/front_end/panels/network/components/RequestHeaderSection.ts +1 -2
  120. package/front_end/panels/network/components/RequestHeadersView.css +1 -1
  121. package/front_end/panels/network/network.ts +2 -0
  122. package/front_end/panels/profiler/HeapSnapshotView.ts +121 -33
  123. package/front_end/panels/profiler/ModuleUIStrings.ts +4 -0
  124. package/front_end/panels/security/SecurityPanel.ts +36 -23
  125. package/front_end/panels/settings/SettingsScreen.ts +18 -103
  126. package/front_end/panels/settings/settings-meta.ts +0 -24
  127. package/front_end/panels/timeline/TimelineController.ts +3 -2
  128. package/front_end/panels/timeline/TimelineHistoryManager.ts +38 -37
  129. package/front_end/panels/timeline/TimelinePanel.ts +52 -11
  130. package/front_end/panels/timeline/components/CPUThrottlingSelector.ts +20 -18
  131. package/front_end/panels/timeline/components/LiveMetricsView.ts +38 -38
  132. package/front_end/panels/timeline/components/MetricCard.ts +18 -18
  133. package/front_end/panels/timeline/components/liveMetricsView.css +6 -6
  134. package/front_end/panels/timeline/components/metricCard.css +4 -4
  135. package/front_end/panels/timeline/timelineFlamechartPopover.css +2 -0
  136. package/front_end/panels/utils/utils.ts +25 -24
  137. package/front_end/panels/whats_new/ReleaseNoteText.ts +3 -3
  138. package/front_end/panels/whats_new/resources/WNDT.md +1 -1
  139. package/front_end/third_party/chromium/README.chromium +1 -1
  140. package/front_end/third_party/puppeteer/README.chromium +2 -2
  141. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +34 -55
  142. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +96 -83
  143. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +10 -1
  144. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
  146. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/CDPSession.d.ts.map +1 -1
  150. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/CDPSession.js.map +1 -1
  151. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.d.ts +3 -2
  152. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.d.ts.map +1 -1
  153. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.js.map +1 -1
  154. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts.map +1 -1
  155. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js.map +1 -1
  156. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Target.d.ts +1 -1
  157. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Target.js +1 -1
  158. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.d.ts.map +1 -1
  159. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.js.map +1 -1
  160. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  161. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js +2 -1
  162. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js.map +1 -1
  163. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Realm.d.ts.map +1 -1
  164. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Realm.js.map +1 -1
  165. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts +2 -2
  166. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
  167. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +5 -2
  168. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
  169. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js +1 -1
  170. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js.map +1 -1
  171. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.d.ts.map +1 -1
  172. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js +23 -13
  173. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js.map +1 -1
  174. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.d.ts.map +1 -1
  175. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.js +4 -1
  176. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.js.map +1 -1
  177. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Input.js +1 -1
  178. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/LifecycleWatcher.d.ts.map +1 -1
  179. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/LifecycleWatcher.js.map +1 -1
  180. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.d.ts.map +1 -1
  181. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.js.map +1 -1
  182. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts +3 -41
  183. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts.map +1 -1
  184. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.js.map +1 -1
  185. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  186. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  187. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +4 -2
  188. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
  189. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/LaunchOptions.d.ts +5 -0
  190. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/LaunchOptions.d.ts.map +1 -1
  191. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +1 -1
  192. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +1 -1
  193. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.d.ts +1 -1
  194. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.d.ts.map +1 -1
  195. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.js +5 -5
  196. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.js.map +1 -1
  197. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  198. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  199. package/front_end/third_party/puppeteer/package/lib/types.d.ts +34 -55
  200. package/front_end/third_party/puppeteer/package/package.json +4 -4
  201. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +13 -1
  202. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +2 -3
  203. package/front_end/third_party/puppeteer/package/src/api/CDPSession.ts +3 -1
  204. package/front_end/third_party/puppeteer/package/src/api/HTTPResponse.ts +3 -2
  205. package/front_end/third_party/puppeteer/package/src/api/Realm.ts +1 -2
  206. package/front_end/third_party/puppeteer/package/src/api/Target.ts +1 -1
  207. package/front_end/third_party/puppeteer/package/src/api/locators/locators.ts +1 -2
  208. package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +3 -1
  209. package/front_end/third_party/puppeteer/package/src/bidi/core/Realm.ts +1 -3
  210. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +13 -3
  211. package/front_end/third_party/puppeteer/package/src/cdp/Frame.ts +1 -1
  212. package/front_end/third_party/puppeteer/package/src/cdp/FrameManager.ts +24 -13
  213. package/front_end/third_party/puppeteer/package/src/cdp/HTTPResponse.ts +4 -1
  214. package/front_end/third_party/puppeteer/package/src/cdp/Input.ts +1 -1
  215. package/front_end/third_party/puppeteer/package/src/cdp/LifecycleWatcher.ts +1 -4
  216. package/front_end/third_party/puppeteer/package/src/cdp/Target.ts +2 -4
  217. package/front_end/third_party/puppeteer/package/src/cdp/WebMCP.ts +7 -76
  218. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +1 -4
  219. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +4 -1
  220. package/front_end/third_party/puppeteer/package/src/node/LaunchOptions.ts +5 -0
  221. package/front_end/third_party/puppeteer/package/src/revisions.ts +1 -1
  222. package/front_end/third_party/puppeteer/package/src/util/httpUtils.ts +5 -5
  223. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  224. package/front_end/third_party/puppeteer/third_party/parsel/README.chromium +1 -1
  225. package/front_end/ui/components/dialogs/Dialog.ts +3 -0
  226. package/front_end/ui/components/markdown_view/MarkdownLinksMap.ts +0 -7
  227. package/front_end/ui/helpers/OpenInNewTab.ts +15 -7
  228. package/front_end/ui/legacy/InspectorDrawerView.ts +7 -5
  229. package/front_end/ui/legacy/ListWidget.ts +12 -0
  230. package/front_end/ui/legacy/SplitWidget.ts +12 -11
  231. package/front_end/ui/legacy/TabbedPane.ts +1 -108
  232. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +9 -0
  233. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +192 -139
  234. package/front_end/ui/legacy/components/data_grid/DataGridExporter.ts +89 -0
  235. package/front_end/ui/legacy/components/data_grid/dataGrid.css +10 -0
  236. package/front_end/ui/legacy/components/data_grid/data_grid.ts +3 -1
  237. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +8 -1
  238. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +110 -17
  239. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +89 -40
  240. package/front_end/ui/legacy/treeoutline.css +1 -1
  241. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
  242. package/package.json +4 -3
  243. package/front_end/Images/navigationControls.png +0 -0
  244. package/front_end/Images/navigationControls_2x.png +0 -0
  245. package/front_end/Images/popoverArrows.png +0 -0
  246. package/front_end/entrypoints/greendev_floaty/FloatyEntrypoint.ts +0 -746
  247. package/front_end/entrypoints/greendev_floaty/floaty.css +0 -301
  248. package/front_end/entrypoints/greendev_floaty/floaty.html +0 -38
  249. package/front_end/entrypoints/greendev_floaty/greendev_floaty.ts +0 -415
  250. package/front_end/models/ai_assistance/agents/GreenDevAgent.ts +0 -834
  251. package/front_end/models/ai_assistance/agents/GreenDevAgentAntigravityCliSocketClient.ts +0 -53
  252. package/front_end/models/ai_assistance/agents/GreenDevAgentGeminiCliSocketClient.ts +0 -117
  253. package/front_end/models/annotations/AnnotationRepository.ts +0 -238
  254. package/front_end/models/annotations/AnnotationType.ts +0 -10
  255. package/front_end/models/annotations/README.md +0 -7
  256. package/front_end/models/annotations/annotations.ts +0 -6
  257. package/front_end/models/greendev/Prototypes.ts +0 -68
  258. package/front_end/models/greendev/README.md +0 -5
  259. package/front_end/models/greendev/greendev.ts +0 -5
  260. package/front_end/panels/common/Annotation.ts +0 -184
  261. package/front_end/panels/common/AnnotationManager.ts +0 -208
  262. package/front_end/panels/common/annotation.css +0 -40
  263. package/front_end/panels/greendev/GreenDevPanel.css +0 -282
  264. package/front_end/panels/greendev/GreenDevPanel.ts +0 -364
  265. package/front_end/panels/greendev/GreenDevShared.ts +0 -13
  266. package/front_end/panels/greendev/greendev-meta.ts +0 -52
  267. package/front_end/panels/greendev/greendev.ts +0 -9
@@ -142,7 +142,7 @@ const UIStrings = {
142
142
  } as const;
143
143
  const str_ = i18n.i18n.registerUIStrings('ui/legacy/components/object_ui/ObjectPropertiesSection.ts', UIStrings);
144
144
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
145
- const EXPANDABLE_MAX_DEPTH = 100;
145
+ export const EXPANDABLE_MAX_DEPTH = 100;
146
146
 
147
147
  const objectPropertiesSectionMap = new WeakMap<Element, ObjectPropertiesSection>();
148
148
 
@@ -406,7 +406,10 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
406
406
  } else {
407
407
  this.options.expansionTracker?.collapse(this);
408
408
  }
409
- this.#expanded = val;
409
+ if (this.#expanded !== val) {
410
+ this.#expanded = val;
411
+ this.dispatchEventToListeners(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, val);
412
+ }
410
413
  }
411
414
 
412
415
  get readOnly(): boolean {
@@ -425,6 +428,10 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
425
428
  this.setFilter({includeNullOrUndefinedValues: value, regex: this.filter?.regex ?? null});
426
429
  }
427
430
 
431
+ get canExpandRecursively(): boolean {
432
+ return true;
433
+ }
434
+
428
435
  get sortPropertiesAlphabetically(): boolean {
429
436
  if (this.isWasm) {
430
437
  return false;
@@ -440,14 +447,16 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
440
447
  setting.set(value);
441
448
  this.removeChildren();
442
449
  }
443
-
444
450
  // Performs a pre-order tree traversal over the populated children. If any children need to be populated, callers must
445
451
  // do that while walking (pre-order visitation enables that).
446
- * #walk(maxDepth = -1): Generator<ObjectTreeNodeBase> {
452
+ * #walk(maxDepth = -1, filter?: (node: ObjectTreeNodeBase) => boolean): Generator<ObjectTreeNodeBase> {
453
+ if (filter && !filter(this)) {
454
+ return;
455
+ }
447
456
  function* walkChildren(children: ObjectTreeNodeBase[]|undefined): Generator<ObjectTreeNodeBase> {
448
457
  if (children) {
449
458
  for (const child of children) {
450
- yield* child.#walk(Math.max(-1, maxDepth - 1));
459
+ yield* child.#walk(Math.max(-1, maxDepth - 1), filter);
451
460
  }
452
461
  }
453
462
  }
@@ -460,7 +469,7 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
460
469
  }
461
470
 
462
471
  async expandRecursively(maxDepth: number): Promise<void> {
463
- for (const node of this.#walk(maxDepth)) {
472
+ for (const node of this.#walk(maxDepth, n => n.canExpandRecursively)) {
464
473
  await node.populateChildrenIfNeeded();
465
474
  node.expanded = true;
466
475
  }
@@ -655,11 +664,13 @@ export namespace ObjectTreeNodeBase {
655
664
  VALUE_CHANGED = 'value-changed',
656
665
  CHILDREN_CHANGED = 'children-changed',
657
666
  FILTER_CHANGED = 'filter-changed',
667
+ EXPANDED_CHANGED = 'expanded-changed',
658
668
  }
659
669
  export interface EventTypes {
660
670
  [Events.VALUE_CHANGED]: void;
661
671
  [Events.CHILDREN_CHANGED]: void;
662
672
  [Events.FILTER_CHANGED]: void;
673
+ [Events.EXPANDED_CHANGED]: boolean;
663
674
  }
664
675
  }
665
676
 
@@ -758,6 +769,10 @@ export class ObjectTreeNode extends ObjectTreeNodeBase {
758
769
  return Boolean(this.filter && !this.property.match(this.filter));
759
770
  }
760
771
 
772
+ override get canExpandRecursively(): boolean {
773
+ return this.property.name !== '[[Prototype]]';
774
+ }
775
+
761
776
  get name(): string {
762
777
  return this.property.name;
763
778
  }
@@ -1664,6 +1679,7 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1664
1679
  this.property.addEventListener(ObjectTreeNodeBase.Events.VALUE_CHANGED, this.#updateValue, this);
1665
1680
  this.property.addEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.#updateChildren, this);
1666
1681
  this.property.addEventListener(ObjectTreeNodeBase.Events.FILTER_CHANGED, this.#updateFilter, this);
1682
+ this.property.addEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.#onExpandedChanged, this);
1667
1683
  this.toggleOnClick = true;
1668
1684
  this.linkifier = linkifier;
1669
1685
  this.maxNumPropertiesToShow = InitialVisibleChildrenLimit;
@@ -1684,12 +1700,51 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1684
1700
  linkifier?: Components.Linkifier.Linkifier,
1685
1701
  emptyPlaceholder?: string|null,
1686
1702
  ): Promise<void> {
1687
- const properties = await value.populateChildrenIfNeeded();
1703
+ await ObjectPropertyTreeElement.populateChildrenIfNeeded(value);
1704
+ ObjectPropertyTreeElement.populateImpl(treeElement, value, skipProto, skipGettersAndSetters, linkifier,
1705
+ emptyPlaceholder);
1706
+ }
1707
+
1708
+ static async populateChildrenIfNeeded(value: ObjectTreeNodeBase): Promise<void> {
1709
+ const children = await value.populateChildrenIfNeeded();
1710
+ await ArrayGroupingTreeElement.populateChildrenIfNeeded(children);
1711
+ }
1712
+
1713
+ static populateImpl(
1714
+ treeElement: UI.TreeOutline.TreeElement,
1715
+ value: ObjectTreeNodeBase,
1716
+ skipProto: boolean,
1717
+ skipGettersAndSetters: boolean,
1718
+ linkifier?: Components.Linkifier.Linkifier,
1719
+ emptyPlaceholder?: string|null,
1720
+ ): void {
1721
+ for (const childNode of ObjectPropertyTreeElement.createNodes(
1722
+ value, skipProto, skipGettersAndSetters, linkifier, emptyPlaceholder,
1723
+ property => treeElement instanceof ObjectPropertyTreeElement &&
1724
+ !ObjectPropertiesSection.isDisplayableProperty(property, treeElement.property?.property))) {
1725
+ treeElement.appendChild(childNode);
1726
+ }
1727
+ }
1728
+
1729
+ static *
1730
+ createNodes(
1731
+ value: ObjectTreeNodeBase,
1732
+ skipProto: boolean,
1733
+ skipGettersAndSetters: boolean,
1734
+ linkifier?: Components.Linkifier.Linkifier,
1735
+ emptyPlaceholder?: string|null,
1736
+ isNotDisplayablePropertyCallback?: (property: SDK.RemoteObject.RemoteObjectProperty) => boolean,
1737
+ ): Generator<UI.TreeOutline.TreeElement> {
1738
+ const properties = value.children;
1739
+ if (!properties) {
1740
+ return;
1741
+ }
1688
1742
  if (properties.arrayRanges) {
1689
- await ArrayGroupingTreeElement.populate(treeElement, properties, linkifier);
1743
+ yield* ArrayGroupingTreeElement.createNodes(properties, linkifier, isNotDisplayablePropertyCallback);
1690
1744
  } else {
1691
- ObjectPropertyTreeElement.populateWithProperties(
1692
- treeElement, properties, skipProto, skipGettersAndSetters, linkifier, emptyPlaceholder);
1745
+ yield*
1746
+ ObjectPropertyTreeElement.createPropertyNodes(properties, skipProto, skipGettersAndSetters, linkifier,
1747
+ emptyPlaceholder, isNotDisplayablePropertyCallback);
1693
1748
  }
1694
1749
  }
1695
1750
 
@@ -1869,6 +1924,15 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1869
1924
  this.hidden = this.property.isFiltered;
1870
1925
  }
1871
1926
 
1927
+ #onExpandedChanged(event: Common.EventTarget.EventTargetEvent<boolean>): void {
1928
+ const expanded = event.data;
1929
+ if (expanded) {
1930
+ this.expand();
1931
+ } else {
1932
+ this.collapse();
1933
+ }
1934
+ }
1935
+
1872
1936
  getContextMenu(event: Event): UI.ContextMenu.ContextMenu {
1873
1937
  const contextMenu = new UI.ContextMenu.ContextMenu(event);
1874
1938
  contextMenu.appendApplicableItems(this);
@@ -2082,6 +2146,7 @@ export class ArrayGroupingTreeElement extends UI.TreeOutline.TreeElement {
2082
2146
  super(Platform.StringUtilities.sprintf('[%d … %d]', child.range.fromIndex, child.range.toIndex), true);
2083
2147
  this.#child = child;
2084
2148
  this.#child.addEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.onpopulate, this);
2149
+ this.#child.addEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.#onExpandedChanged, this);
2085
2150
  this.toggleOnClick = true;
2086
2151
  this.linkifier = linkifier;
2087
2152
  if (child.expanded) {
@@ -2089,25 +2154,53 @@ export class ArrayGroupingTreeElement extends UI.TreeOutline.TreeElement {
2089
2154
  }
2090
2155
  }
2091
2156
 
2092
- static async populate(
2093
- treeNode: UI.TreeOutline.TreeElement, children: NodeChildren,
2094
- linkifier?: Components.Linkifier.Linkifier): Promise<void> {
2157
+ #onExpandedChanged(event: Common.EventTarget.EventTargetEvent<boolean>): void {
2158
+ const expanded = event.data;
2159
+ if (expanded) {
2160
+ this.expand();
2161
+ } else {
2162
+ this.collapse();
2163
+ }
2164
+ }
2165
+
2166
+ static *
2167
+ createNodes(children: NodeChildren, linkifier?: Components.Linkifier.Linkifier,
2168
+ isNotDisplayablePropertyCallback?: (property: SDK.RemoteObject.RemoteObjectProperty) => boolean):
2169
+ Generator<UI.TreeOutline.TreeElement> {
2095
2170
  if (!children.arrayRanges) {
2096
2171
  return;
2097
2172
  }
2098
2173
  if (children.arrayRanges.length === 1) {
2099
- await ObjectPropertyTreeElement.populate(treeNode, children.arrayRanges[0], false, false, linkifier);
2174
+ yield*
2175
+ ObjectPropertyTreeElement.createNodes(children.arrayRanges[0], false, false, linkifier, null,
2176
+ isNotDisplayablePropertyCallback);
2100
2177
  } else {
2101
2178
  for (const child of children.arrayRanges) {
2102
2179
  if (child.singular) {
2103
- await ObjectPropertyTreeElement.populate(treeNode, child, false, false, linkifier);
2180
+ yield*
2181
+ ObjectPropertyTreeElement.createNodes(child, false, false, linkifier, null,
2182
+ isNotDisplayablePropertyCallback);
2104
2183
  } else {
2105
- treeNode.appendChild(new ArrayGroupingTreeElement(child, linkifier));
2184
+ yield new ArrayGroupingTreeElement(child, linkifier);
2106
2185
  }
2107
2186
  }
2108
2187
  }
2109
2188
 
2110
- ObjectPropertyTreeElement.populateWithProperties(treeNode, children, false, false, linkifier);
2189
+ yield*
2190
+ ObjectPropertyTreeElement.createPropertyNodes(children, false, false, linkifier, null,
2191
+ isNotDisplayablePropertyCallback);
2192
+ }
2193
+
2194
+ static async populateChildrenIfNeeded(children: NodeChildren): Promise<void> {
2195
+ if (!children.arrayRanges) {
2196
+ return;
2197
+ }
2198
+ if (children.arrayRanges.length === 1) {
2199
+ await ObjectPropertyTreeElement.populateChildrenIfNeeded(children.arrayRanges[0]);
2200
+ } else {
2201
+ await Promise.all(children.arrayRanges.filter(child => child.singular)
2202
+ .map(child => ObjectPropertyTreeElement.populateChildrenIfNeeded(child)));
2203
+ }
2111
2204
  }
2112
2205
 
2113
2206
  override onexpand(): void {
@@ -947,7 +947,6 @@ export class FlameChart extends Common.ObjectWrapper.eventMixin<EventTypes, type
947
947
  mouseX = coordinate?.x ? coordinate.x - canvasViewportOffsetX : mouseX;
948
948
  mouseY = coordinate?.y ? coordinate.y - canvasViewportOffsetY : mouseY;
949
949
  }
950
- // The parent dimensions are the maximum the popover can use.
951
950
  const parentWidth = this.popoverElement.parentElement ? this.popoverElement.parentElement.clientWidth : 0;
952
951
  const parentHeight = this.popoverElement.parentElement ? this.popoverElement.parentElement.clientHeight : 0;
953
952
  const infoWidth = this.popoverElement.clientWidth;
@@ -957,40 +956,18 @@ export class FlameChart extends Common.ObjectWrapper.eventMixin<EventTypes, type
957
956
  const offsetX = 10;
958
957
  // Incorporate any network flamechart height into dynamic positioning
959
958
  const offsetY = 6 + this.#tooltipPopoverYAdjustment;
960
- let x;
961
- let y;
962
959
 
963
- /**
964
- * Fancy positioning algorithm. It optimizes for consistent positioning, not obstructing any of the popover, and not positioning atop the mouse cursor.
965
- *
966
- * Take the mouse cursor position (mouseX/mouseY) and split up the area into four quadrants
967
- * 0: bottom-right. 1: top-right. 2: bottom-left. 3: top-left.
968
- *
969
- * We attempt this in two passes, first is for keeping the whole popover visible, the second is slightly relaxed.
970
- * If we hit the second pass, its because the tooltip size is close to the size of the available (parent*) space.
971
- * In each pass, we loop through the quadrants
972
- * If the tooltip can fit (after some adjustments) within a quadrant, we `break` and that x,y is used.
973
- */
974
- for (let pass = 0; pass < 2; ++pass) {
975
- for (let quadrant = 0; quadrant < 4; ++quadrant) {
976
- // The bitwise AND operator is used to generate the 4 unique combinations of two booleans. (true+false, true+true, etc)
977
- const dx = quadrant & 2 ? -offsetX - infoWidth : offsetX;
978
- const dy = quadrant & 1 ? -offsetY - infoHeight : offsetY;
979
- // mouseX+dx is ideal, but clamp against the available space (It will be adapted to fit)
980
- x = Platform.NumberUtilities.clamp(mouseX + dx, 0, parentWidth - infoWidth);
981
- y = Platform.NumberUtilities.clamp(mouseY + dy, 0, parentHeight - infoHeight);
982
-
983
- const popoverFits = pass === 0 ?
984
- // Will the whole popover be visible?
985
- (x >= mouseX || mouseX >= x + infoWidth) && (y >= mouseY || mouseY >= y + infoHeight) :
986
- // Will the popover fit well in 1 dimension? (Though we typically see it fit in both, here. Shrug.)
987
- x >= mouseX || mouseX >= x + infoWidth || y >= mouseY || mouseY >= y + infoHeight;
988
-
989
- if (popoverFits) {
990
- break;
991
- }
992
- }
993
- }
960
+ const {x, y} = calculatePopoverOffset({
961
+ mouseX,
962
+ mouseY,
963
+ parentWidth,
964
+ parentHeight,
965
+ infoWidth,
966
+ infoHeight,
967
+ offsetX,
968
+ offsetY,
969
+ });
970
+
994
971
  this.popoverElement.style.left = x + 'px';
995
972
  this.popoverElement.style.top = y + 'px';
996
973
  }
@@ -1187,6 +1164,10 @@ export class FlameChart extends Common.ObjectWrapper.eventMixin<EventTypes, type
1187
1164
  this.expandGroup(groupIndex, !this.rawTimelineData.groups[groupIndex].expanded /* setExpanded */);
1188
1165
  }
1189
1166
 
1167
+ blurCanvasForTesting(): void {
1168
+ this.canvas.blur();
1169
+ }
1170
+
1190
1171
  bulkExpandGroups(indexes: number[]): void {
1191
1172
  if (indexes.length === 0) {
1192
1173
  return;
@@ -2136,12 +2117,8 @@ export class FlameChart extends Common.ObjectWrapper.eventMixin<EventTypes, type
2136
2117
  if (y >= this.groupOffsets[groupIndex] && y < this.groupOffsets[nextIndex]) {
2137
2118
  // This section is used to calculate the position of current group's header
2138
2119
  // If we are in edit mode, the track label is pushed right to make room for the icons.
2139
- const context = this.context;
2140
- context.save();
2141
- context.font = this.#font;
2142
2120
  const headerRight = HEADER_LEFT_PADDING + (this.#inTrackConfigEditMode ? EDIT_MODE_TOTAL_ICON_WIDTH : 0) +
2143
- this.labelWidthForGroup(context, groups[groupIndex]);
2144
- context.restore();
2121
+ this.labelWidthForGroup(this.context, groups[groupIndex]);
2145
2122
 
2146
2123
  const mouseInHeaderRow =
2147
2124
  y >= this.groupOffsets[groupIndex] && y < this.groupOffsets[groupIndex] + groups[groupIndex].style.height;
@@ -3143,8 +3120,12 @@ export class FlameChart extends Common.ObjectWrapper.eventMixin<EventTypes, type
3143
3120
  * @returns the width of the label of the group.
3144
3121
  */
3145
3122
  labelWidthForGroup(context: CanvasRenderingContext2D, group: Group): number {
3146
- return EXPANSION_ARROW_INDENT * (group.style.nestingLevel + 1) + ARROW_SIDE / 2 + HEADER_LABEL_X_PADDING +
3123
+ context.save();
3124
+ context.font = this.#font;
3125
+ const width = EXPANSION_ARROW_INDENT * (group.style.nestingLevel + 1) + ARROW_SIDE / 2 + HEADER_LABEL_X_PADDING +
3147
3126
  UI.UIUtils.measureTextWidth(context, group.name) + HEADER_LABEL_X_PADDING - HEADER_LEFT_PADDING;
3127
+ context.restore();
3128
+ return width;
3148
3129
  }
3149
3130
 
3150
3131
  private drawCollapsedOverviewForGroup(group: Group, y: number, endLevel: number): void {
@@ -4502,3 +4483,71 @@ export interface PersistedGroupConfig {
4502
4483
  originalIndex: number;
4503
4484
  visualIndex: number;
4504
4485
  }
4486
+
4487
+ export interface PopoverOffsetOptions {
4488
+ /** The horizontal offset of the mouse relative to the flame chart. */
4489
+ mouseX: number;
4490
+ /** The vertical offset of the mouse relative to the flame chart. */
4491
+ mouseY: number;
4492
+ /** The width of the parent container holding the popover. */
4493
+ parentWidth: number;
4494
+ /** The height of the parent container holding the popover. */
4495
+ parentHeight: number;
4496
+ /** The measured width of the popover element itself. */
4497
+ infoWidth: number;
4498
+ /** The measured height of the popover element itself. */
4499
+ infoHeight: number;
4500
+ /** The horizontal offset spacing to keep between the popover and the mouse position. */
4501
+ offsetX: number;
4502
+ /** The vertical offset spacing to keep between the popover and the mouse position. */
4503
+ offsetY: number;
4504
+ }
4505
+
4506
+ /**
4507
+ * Calculates the positioning coordinates (x, y) for a popover window relative to the mouse.
4508
+ *
4509
+ * It uses a two-pass quadrant placement algorithm:
4510
+ * - Pass 0: Tries to find a quadrant where the popover fits fully on screen without overlapping the mouse.
4511
+ * - Pass 1: Relaxed fit; allows overlapping the mouse if the popover is too large for the available space,
4512
+ * clamping it strictly to remain within the parent bounds [0, parentWidth - infoWidth].
4513
+ *
4514
+ * Quadrants:
4515
+ * 0: bottom-right (x + offsetX, y + offsetY)
4516
+ * 1: top-right (x + offsetX, y - offsetY - height)
4517
+ * 2: bottom-left (x - offsetX - width, y + offsetY)
4518
+ * 3: top-left (x - offsetX - width, y - offsetY - height)
4519
+ */
4520
+ export function calculatePopoverOffset(options: PopoverOffsetOptions): {x: number, y: number} {
4521
+ const {mouseX, mouseY, parentWidth, parentHeight, infoWidth, infoHeight, offsetX, offsetY} = options;
4522
+
4523
+ const quadrants = [
4524
+ {left: false, top: false}, // 0: Bottom-Right
4525
+ {left: false, top: true}, // 1: Top-Right
4526
+ {left: true, top: false}, // 2: Bottom-Left
4527
+ {left: true, top: true}, // 3: Top-Left
4528
+ ];
4529
+
4530
+ let x = 0;
4531
+ let y = 0;
4532
+
4533
+ for (let pass = 0; pass < 2; ++pass) {
4534
+ for (const {left, top} of quadrants) {
4535
+ const dx = left ? -offsetX - infoWidth : offsetX;
4536
+ const dy = top ? -offsetY - infoHeight : offsetY;
4537
+
4538
+ // Ensure upper bound of clamp is never negative (minimum of 0) to avoid errors when infoWidth/infoHeight > parent container bounds
4539
+ x = Platform.NumberUtilities.clamp(mouseX + dx, 0, Math.max(0, parentWidth - infoWidth));
4540
+ y = Platform.NumberUtilities.clamp(mouseY + dy, 0, Math.max(0, parentHeight - infoHeight));
4541
+
4542
+ const mouseOverlapsX = mouseX > x && mouseX < x + infoWidth;
4543
+ const mouseOverlapsY = mouseY > y && mouseY < y + infoHeight;
4544
+
4545
+ const popoverFits = pass === 0 ? (!mouseOverlapsX && !mouseOverlapsY) : !(mouseOverlapsX && mouseOverlapsY);
4546
+
4547
+ if (popoverFits) {
4548
+ return {x, y};
4549
+ }
4550
+ }
4551
+ }
4552
+ return {x, y};
4553
+ }
@@ -98,7 +98,7 @@ ol.tree-outline:not(.hide-selection-when-blurred) li.selected:focus {
98
98
  color: currentcolor;
99
99
  }
100
100
 
101
- & *:not(devtools-icon) {
101
+ & *:not(devtools-icon, .new-badge) {
102
102
  color: inherit;
103
103
  }
104
104
  }
@@ -1031,13 +1031,16 @@ export const knownContextValues = new Set([
1031
1031
  'copy-all-declarations',
1032
1032
  'copy-all-urls',
1033
1033
  'copy-as-base',
1034
+ 'copy-as-csv',
1034
1035
  'copy-as-curl',
1035
1036
  'copy-as-curl-bash',
1036
1037
  'copy-as-curl-cmd',
1037
1038
  'copy-as-fetch',
1038
1039
  'copy-as-hex',
1040
+ 'copy-as-markdown',
1039
1041
  'copy-as-nodejs-fetch',
1040
1042
  'copy-as-powershell',
1043
+ 'copy-as-preload',
1041
1044
  'copy-as-utf',
1042
1045
  'copy-color',
1043
1046
  'copy-console',
package/package.json CHANGED
@@ -30,7 +30,8 @@
30
30
  "start": "vpython3 third_party/node/node.py --output scripts/run_start.mjs",
31
31
  "webtest": "vpython3 third_party/node/node.py --output scripts/npm_test.js",
32
32
  "watch": "npm run build -- --watch",
33
- "test": "vpython3 third_party/node/node.py --output scripts/run_on_target.mjs gen/test/run.js"
33
+ "test": "vpython3 third_party/node/node.py --output scripts/run_on_target.mjs gen/test/run.js",
34
+ "test-health": "node scripts/test_health.ts"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@rollup/plugin-node-resolve": "16.0.3",
@@ -75,7 +76,7 @@
75
76
  "mocha": "11.7.5",
76
77
  "ora": "9.0.0",
77
78
  "postcss": "8.5.15",
78
- "puppeteer-core": "25.0.4",
79
+ "puppeteer-core": "25.2.0",
79
80
  "rollup": "4.60.4",
80
81
  "rollup-plugin-sourcemaps2": "0.5.4",
81
82
  "sinon": "22.0.0",
@@ -91,5 +92,5 @@
91
92
  "webidl2": "24.5.0",
92
93
  "yargs": "17.7.2"
93
94
  },
94
- "version": "1.0.1652307"
95
+ "version": "1.0.1656291"
95
96
  }
Binary file