chrome-devtools-frontend 1.0.1674545 → 1.0.1676824

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 (258) hide show
  1. package/.agents/skills/devtools-ux-writing-refactor/SKILL.md +26 -9
  2. package/WATCHLISTS +0 -4
  3. package/front_end/core/common/ParsedURL.ts +5 -1
  4. package/front_end/core/common/SettingRegistration.ts +29 -8
  5. package/front_end/core/common/Settings.ts +0 -77
  6. package/front_end/core/root/Runtime.ts +4 -5
  7. package/front_end/core/sdk/CSSMetadata.ts +5 -9
  8. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +8 -28
  9. package/front_end/core/sdk/DebuggerModel.ts +50 -30
  10. package/front_end/core/sdk/ResourceTreeModel.ts +20 -1
  11. package/front_end/core/sdk/Script.ts +9 -53
  12. package/front_end/core/sdk/TargetManager.ts +18 -0
  13. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +213 -23
  14. package/front_end/entrypoints/main/MainImpl.ts +32 -0
  15. package/front_end/foundation/Universe.ts +44 -29
  16. package/front_end/generated/InspectorBackendCommands.ts +3 -1
  17. package/front_end/generated/SupportedCSSProperties.ts +21 -4
  18. package/front_end/generated/protocol-mapping.d.ts +14 -0
  19. package/front_end/generated/protocol-proxy-api.d.ts +10 -0
  20. package/front_end/generated/protocol.ts +35 -0
  21. package/front_end/models/ai_assistance/AiAgent2.ts +11 -0
  22. package/front_end/models/ai_assistance/AiConversation.ts +22 -5
  23. package/front_end/models/ai_assistance/README.md +52 -26
  24. package/front_end/models/ai_assistance/agents/AiAgent.ts +54 -8
  25. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -1
  26. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +15 -192
  27. package/front_end/models/ai_assistance/agents/StorageAgent.ts +8 -87
  28. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +2 -1
  29. package/front_end/models/ai_assistance/ai_assistance.ts +16 -0
  30. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +124 -0
  31. package/front_end/models/ai_assistance/contexts/StorageContext.ts +111 -0
  32. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +69 -1
  33. package/front_end/models/ai_assistance/skills/README.md +63 -1
  34. package/front_end/models/ai_assistance/skills/Skill.ts +1 -1
  35. package/front_end/models/ai_assistance/skills/SkillRegistry.ts +4 -0
  36. package/front_end/models/ai_assistance/skills/performance.md +8 -0
  37. package/front_end/models/ai_assistance/skills/sources.md +16 -0
  38. package/front_end/models/ai_assistance/skills/storage.md +31 -0
  39. package/front_end/models/ai_assistance/tools/GetSourceContent.ts +101 -0
  40. package/front_end/models/ai_assistance/tools/GetTraceEventByKey.ts +83 -0
  41. package/front_end/models/ai_assistance/tools/GetTraceMainThreadSummary.ts +106 -0
  42. package/front_end/models/ai_assistance/tools/GetTraceNetworkSummary.ts +104 -0
  43. package/front_end/models/ai_assistance/tools/ListPageOrigins.ts +81 -0
  44. package/front_end/models/ai_assistance/tools/ListSources.ts +116 -0
  45. package/front_end/models/ai_assistance/tools/SelectTraceEventByKey.ts +90 -0
  46. package/front_end/models/ai_assistance/tools/Tool.ts +22 -1
  47. package/front_end/models/ai_assistance/tools/ToolRegistry.ts +14 -0
  48. package/front_end/models/bindings/CSSWorkspaceBinding.ts +4 -0
  49. package/front_end/models/bindings/CompilerScriptMapping.ts +4 -0
  50. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +8 -0
  51. package/front_end/models/bindings/ResourceScriptMapping.ts +3 -201
  52. package/front_end/models/bindings/SASSSourceMapping.ts +6 -0
  53. package/front_end/models/breakpoints/BreakpointManager.ts +2 -49
  54. package/front_end/models/emulation/DeviceModeModel.ts +60 -71
  55. package/front_end/models/emulation/EmulatedDevices.ts +18 -66
  56. package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +27 -0
  57. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +10 -2
  58. package/front_end/models/issues_manager/descriptions/connectionAllowlistEmbeddingRequirementNotSatisfied.md +26 -0
  59. package/front_end/models/issues_manager/descriptions/connectionAllowlistIFrameAttributeLoosensEmbeddingRequirement.md +19 -0
  60. package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidAllowConnectionAllowlistFrom.md +21 -0
  61. package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
  62. package/front_end/models/persistence/AutomaticFileSystemManager.ts +2 -2
  63. package/front_end/models/persistence/IsolatedFileSystem.ts +7 -8
  64. package/front_end/models/persistence/IsolatedFileSystemManager.ts +22 -31
  65. package/front_end/models/persistence/PlatformFileSystem.ts +1 -1
  66. package/front_end/models/persistence/persistence-meta.ts +9 -9
  67. package/front_end/models/trace/types/TraceEvents.ts +36 -0
  68. package/front_end/models/workspace/FileManager.ts +13 -6
  69. package/front_end/panels/accessibility/ARIAAttributesView.ts +3 -3
  70. package/front_end/panels/accessibility/AccessibilityNodeView.ts +36 -36
  71. package/front_end/panels/accessibility/AccessibilityStrings.ts +168 -168
  72. package/front_end/panels/accessibility/SourceOrderView.ts +7 -7
  73. package/front_end/panels/accessibility/accessibility-meta.ts +2 -2
  74. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +5 -5
  75. package/front_end/panels/ai_assistance/components/AIv2MarkdownRenderer.ts +2 -3
  76. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
  77. package/front_end/panels/ai_assistance/components/ChatMessage.ts +27 -2
  78. package/front_end/panels/application/IndexedDBViews.ts +65 -63
  79. package/front_end/panels/application/WebMCPView.ts +29 -12
  80. package/front_end/panels/application/components/AdsView.ts +24 -1
  81. package/front_end/panels/application/components/adsView.css +27 -21
  82. package/front_end/panels/autofill/AutofillView.ts +12 -12
  83. package/front_end/panels/autofill/autofill-meta.ts +2 -2
  84. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +5 -5
  85. package/front_end/panels/common/BadgeNotification.ts +8 -8
  86. package/front_end/panels/common/ExtensionServer.ts +21 -1
  87. package/front_end/panels/common/GdpSignUpDialog.ts +16 -16
  88. package/front_end/panels/common/GeminiRebrandPromoDialog.ts +5 -6
  89. package/front_end/panels/common/PersistenceUtils.ts +2 -2
  90. package/front_end/panels/common/common.ts +0 -97
  91. package/front_end/panels/console/ConsoleInsightTeaser.ts +2 -2
  92. package/front_end/panels/console/ConsolePinPane.ts +2 -2
  93. package/front_end/panels/console/ConsoleView.ts +20 -19
  94. package/front_end/panels/elements/ElementsTreeElement.ts +550 -327
  95. package/front_end/panels/elements/ElementsTreeOutline.ts +1 -1
  96. package/front_end/panels/elements/LayoutPane.ts +2 -8
  97. package/front_end/panels/event_listeners/EventListenersView.ts +8 -4
  98. package/front_end/panels/issues/AffectedTrackingSitesView.ts +25 -14
  99. package/front_end/panels/js_timeline/js_timeline-meta.ts +8 -8
  100. package/front_end/panels/layer_viewer/LayerDetailsView.ts +30 -30
  101. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +6 -6
  102. package/front_end/panels/layer_viewer/LayerViewHost.ts +1 -1
  103. package/front_end/panels/layer_viewer/Layers3DView.ts +11 -11
  104. package/front_end/panels/layer_viewer/PaintProfilerView.ts +8 -8
  105. package/front_end/panels/layer_viewer/TransformController.ts +3 -3
  106. package/front_end/panels/layer_viewer/layer_viewer-meta.ts +11 -11
  107. package/front_end/panels/media/PlayerMessagesView.ts +149 -68
  108. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +1 -58
  109. package/front_end/panels/mobile_throttling/mobile_throttling.ts +0 -10
  110. package/front_end/panels/network/NetworkPanel.ts +1 -1
  111. package/front_end/panels/network/RequestPayloadView.ts +1 -0
  112. package/front_end/panels/profiler/HeapSnapshotView.ts +0 -2
  113. package/front_end/panels/profiler/heapProfiler.css +0 -9
  114. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +7 -0
  115. package/front_end/panels/recorder/RecorderPanel.ts +2 -3
  116. package/front_end/panels/screencast/ScreencastView.ts +148 -138
  117. package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +1 -2
  118. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +2 -2
  119. package/front_end/panels/sources/DebuggerPlugin.ts +9 -58
  120. package/front_end/panels/sources/ScopeChainSidebarPane.ts +1 -1
  121. package/front_end/panels/sources/UISourceCodeFrame.ts +3 -8
  122. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +4 -2
  123. package/front_end/panels/timeline/TimelineController.ts +36 -64
  124. package/front_end/panels/timeline/TimelinePanel.ts +11 -8
  125. package/front_end/panels/timeline/TimelineUIUtils.ts +5 -2
  126. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +2 -2
  127. package/front_end/panels/timeline/timelinePanel.css +0 -10
  128. package/front_end/panels/utils/utils.ts +7 -7
  129. package/front_end/services/tracing/PerformanceTracing.ts +5 -17
  130. package/front_end/third_party/chromium/README.chromium +1 -1
  131. package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
  132. package/front_end/third_party/codemirror.next/chunk/codemirror.js.map +1 -1
  133. package/front_end/third_party/codemirror.next/package.json +2 -2
  134. package/front_end/third_party/codemirror.next/rebuild.sh +4 -1
  135. package/front_end/ui/comments/CommentAnchorResolver.ts +558 -0
  136. package/front_end/ui/comments/CommentManager.ts +640 -0
  137. package/front_end/ui/comments/CommentsOverlayWidget.ts +121 -0
  138. package/front_end/ui/comments/comments.ts +13 -0
  139. package/front_end/ui/comments/commentsOverlay.css +49 -0
  140. package/front_end/{panels/common → ui/components/dialogs}/FreDialog.ts +6 -6
  141. package/front_end/ui/components/dialogs/TypeToAllowDialog.ts +96 -0
  142. package/front_end/ui/components/dialogs/dialogs.ts +4 -0
  143. package/front_end/ui/components/settings/SettingCheckbox.ts +3 -3
  144. package/front_end/{panels/common → ui/components/text_editor}/AiCodeCompletionDisclaimer.ts +13 -13
  145. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +7 -6
  146. package/front_end/{panels/common → ui/components/text_editor}/AiCodeCompletionTeaser.ts +43 -46
  147. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +22 -26
  148. package/front_end/{panels/common → ui/components/text_editor}/AiCodeGenerationTeaser.ts +10 -10
  149. package/front_end/{panels/common → ui/components/text_editor}/AiCodeGenerationUpgradeDialog.ts +5 -5
  150. package/front_end/ui/components/text_editor/text_editor.ts +4 -0
  151. package/front_end/ui/legacy/Toolbar.ts +1 -1
  152. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +40 -0
  153. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +11 -3
  154. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +270 -162
  155. package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +5 -0
  156. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +11 -16
  157. package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +5 -12
  158. package/front_end/ui/legacy/components/source_frame/JSONView.ts +8 -1
  159. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +2 -2
  160. package/front_end/ui/legacy/components/utils/Linkifier.ts +1 -0
  161. package/front_end/ui/settings/SettingUIRegistration.ts +59 -6
  162. package/front_end/ui/visual_logging/Debugging.ts +1 -5
  163. package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
  164. package/front_end/ui/visual_logging/LoggingConfig.ts +21 -0
  165. package/front_end/ui/visual_logging/visual_logging.ts +9 -0
  166. package/mcp/mcp.ts +6 -1
  167. package/package.json +1 -1
  168. package/front_end/Images/toolbarResizerVertical.png +0 -0
  169. package/front_end/emulated_devices/MotoG4-landscape.svg +0 -155
  170. package/front_end/emulated_devices/MotoG4-portrait.svg +0 -155
  171. package/front_end/emulated_devices/Nexus5X-landscape.svg +0 -19
  172. package/front_end/emulated_devices/Nexus5X-portrait.svg +0 -19
  173. package/front_end/emulated_devices/Nexus6P-landscape.svg +0 -50
  174. package/front_end/emulated_devices/Nexus6P-portrait.svg +0 -54
  175. package/front_end/emulated_devices/google-nest-hub-horizontal.png +0 -0
  176. package/front_end/emulated_devices/google-nest-hub-max-horizontal.png +0 -0
  177. package/front_end/emulated_devices/google-nexus-5-horizontal-default-1x.png +0 -0
  178. package/front_end/emulated_devices/google-nexus-5-horizontal-default-2x.png +0 -0
  179. package/front_end/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png +0 -0
  180. package/front_end/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png +0 -0
  181. package/front_end/emulated_devices/google-nexus-5-horizontal-navigation-1x.png +0 -0
  182. package/front_end/emulated_devices/google-nexus-5-horizontal-navigation-2x.png +0 -0
  183. package/front_end/emulated_devices/google-nexus-5-vertical-default-1x.png +0 -0
  184. package/front_end/emulated_devices/google-nexus-5-vertical-default-2x.png +0 -0
  185. package/front_end/emulated_devices/google-nexus-5-vertical-keyboard-1x.png +0 -0
  186. package/front_end/emulated_devices/google-nexus-5-vertical-keyboard-2x.png +0 -0
  187. package/front_end/emulated_devices/google-nexus-5-vertical-navigation-1x.png +0 -0
  188. package/front_end/emulated_devices/google-nexus-5-vertical-navigation-2x.png +0 -0
  189. package/front_end/emulated_devices/google-nexus-5x-horizontal-default-1x.png +0 -0
  190. package/front_end/emulated_devices/google-nexus-5x-horizontal-default-2x.png +0 -0
  191. package/front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png +0 -0
  192. package/front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png +0 -0
  193. package/front_end/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png +0 -0
  194. package/front_end/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png +0 -0
  195. package/front_end/emulated_devices/google-nexus-5x-vertical-default-1x.png +0 -0
  196. package/front_end/emulated_devices/google-nexus-5x-vertical-default-2x.png +0 -0
  197. package/front_end/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png +0 -0
  198. package/front_end/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png +0 -0
  199. package/front_end/emulated_devices/google-nexus-5x-vertical-navigation-1x.png +0 -0
  200. package/front_end/emulated_devices/google-nexus-5x-vertical-navigation-2x.png +0 -0
  201. package/front_end/emulated_devices/iPad-landscape.svg +0 -73
  202. package/front_end/emulated_devices/iPad-portrait.svg +0 -76
  203. package/front_end/emulated_devices/iPhone5-landscape.svg +0 -99
  204. package/front_end/emulated_devices/iPhone5-portrait.svg +0 -83
  205. package/front_end/emulated_devices/iPhone6-landscape.svg +0 -111
  206. package/front_end/emulated_devices/iPhone6-portrait.svg +0 -116
  207. package/front_end/emulated_devices/iPhone6Plus-landscape.svg +0 -118
  208. package/front_end/emulated_devices/iPhone6Plus-portrait.svg +0 -116
  209. package/front_end/emulated_devices/optimized/MotoG4-landscape.avif +0 -0
  210. package/front_end/emulated_devices/optimized/MotoG4-portrait.avif +0 -0
  211. package/front_end/emulated_devices/optimized/Nexus5X-landscape.avif +0 -0
  212. package/front_end/emulated_devices/optimized/Nexus5X-portrait.avif +0 -0
  213. package/front_end/emulated_devices/optimized/Nexus6P-landscape.avif +0 -0
  214. package/front_end/emulated_devices/optimized/Nexus6P-portrait.avif +0 -0
  215. package/front_end/emulated_devices/optimized/README.md +0 -9
  216. package/front_end/emulated_devices/optimized/google-nest-hub-horizontal.avif +0 -0
  217. package/front_end/emulated_devices/optimized/google-nest-hub-max-horizontal.avif +0 -0
  218. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-default-1x.avif +0 -0
  219. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-default-2x.avif +0 -0
  220. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-1x.avif +0 -0
  221. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-2x.avif +0 -0
  222. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-navigation-1x.avif +0 -0
  223. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-navigation-2x.avif +0 -0
  224. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-default-1x.avif +0 -0
  225. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-default-2x.avif +0 -0
  226. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-keyboard-1x.avif +0 -0
  227. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-keyboard-2x.avif +0 -0
  228. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-navigation-1x.avif +0 -0
  229. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-navigation-2x.avif +0 -0
  230. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-default-1x.avif +0 -0
  231. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-default-2x.avif +0 -0
  232. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-1x.avif +0 -0
  233. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-2x.avif +0 -0
  234. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-1x.avif +0 -0
  235. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-2x.avif +0 -0
  236. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-default-1x.avif +0 -0
  237. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-default-2x.avif +0 -0
  238. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-1x.avif +0 -0
  239. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-2x.avif +0 -0
  240. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-navigation-1x.avif +0 -0
  241. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-navigation-2x.avif +0 -0
  242. package/front_end/emulated_devices/optimized/iPad-landscape.avif +0 -0
  243. package/front_end/emulated_devices/optimized/iPad-portrait.avif +0 -0
  244. package/front_end/emulated_devices/optimized/iPhone5-landscape.avif +0 -0
  245. package/front_end/emulated_devices/optimized/iPhone5-portrait.avif +0 -0
  246. package/front_end/emulated_devices/optimized/iPhone6-landscape.avif +0 -0
  247. package/front_end/emulated_devices/optimized/iPhone6-portrait.avif +0 -0
  248. package/front_end/emulated_devices/optimized/iPhone6Plus-landscape.avif +0 -0
  249. package/front_end/emulated_devices/optimized/iPhone6Plus-portrait.avif +0 -0
  250. package/front_end/emulated_devices/optimized/optimized_images.gni +0 -53
  251. package/front_end/models/ai_assistance/agents/README.md +0 -136
  252. package/front_end/panels/mobile_throttling/MobileThrottlingSelector.ts +0 -92
  253. /package/front_end/{panels/common → ui/components/dialogs}/freDialog.css +0 -0
  254. /package/front_end/{panels/common/common.css → ui/components/dialogs/typeToAllowDialog.css} +0 -0
  255. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeCompletionDisclaimer.css +0 -0
  256. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeCompletionTeaser.css +0 -0
  257. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeGenerationTeaser.css +0 -0
  258. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeGenerationUpgradeDialog.css +0 -0
@@ -247,6 +247,18 @@ export class ResourceTreeModel extends SDKModel<EventTypes> {
247
247
  }
248
248
  }
249
249
 
250
+ navigatedWithinDocument(frameId: Protocol.Page.FrameId, url: string): void {
251
+ const frame = this.framesInternal.get(frameId);
252
+ if (!frame) {
253
+ return;
254
+ }
255
+ frame.navigatedWithinDocument(url as Platform.DevToolsPath.UrlString);
256
+ if (frame.isMainFrame()) {
257
+ this.target().setInspectedURL(frame.url);
258
+ }
259
+ this.dispatchEventToListeners(Events.FrameNavigatedWithinDocument, frame);
260
+ }
261
+
250
262
  frameDetached(frameId: Protocol.Page.FrameId, isSwap: boolean): void {
251
263
  // Do nothing unless cached resource tree is processed - it will overwrite everything.
252
264
  if (!this.#cachedResourcesProcessed) {
@@ -584,6 +596,7 @@ export enum Events {
584
596
  /* eslint-disable @typescript-eslint/naming-convention -- Used by web_tests. */
585
597
  FrameAdded = 'FrameAdded',
586
598
  FrameNavigated = 'FrameNavigated',
599
+ FrameNavigatedWithinDocument = 'FrameNavigatedWithinDocument',
587
600
  FrameDetached = 'FrameDetached',
588
601
  FrameResized = 'FrameResized',
589
602
  FrameWillNavigate = 'FrameWillNavigate',
@@ -607,6 +620,7 @@ export enum Events {
607
620
  export interface EventTypes {
608
621
  [Events.FrameAdded]: ResourceTreeFrame;
609
622
  [Events.FrameNavigated]: ResourceTreeFrame;
623
+ [Events.FrameNavigatedWithinDocument]: ResourceTreeFrame;
610
624
  [Events.FrameDetached]: {frame: ResourceTreeFrame, isSwap: boolean};
611
625
  [Events.FrameResized]: void;
612
626
  [Events.FrameWillNavigate]: ResourceTreeFrame;
@@ -736,6 +750,10 @@ export class ResourceTreeFrame {
736
750
  }
737
751
  }
738
752
 
753
+ navigatedWithinDocument(url: Platform.DevToolsPath.UrlString): void {
754
+ this.#url = url;
755
+ }
756
+
739
757
  resourceTreeModel(): ResourceTreeModel {
740
758
  return this.#model;
741
759
  }
@@ -1096,7 +1114,8 @@ export class PageDispatcher implements ProtocolProxyApi.PageDispatcher {
1096
1114
  frameStartedNavigating({}: Protocol.Page.FrameStartedNavigatingEvent): void {
1097
1115
  }
1098
1116
 
1099
- navigatedWithinDocument({}: Protocol.Page.NavigatedWithinDocumentEvent): void {
1117
+ navigatedWithinDocument({frameId, url}: Protocol.Page.NavigatedWithinDocumentEvent): void {
1118
+ this.#resourceTreeModel.navigatedWithinDocument(frameId, url);
1100
1119
  }
1101
1120
 
1102
1121
  frameResized(): void {
@@ -36,7 +36,6 @@ import * as TextUtils from '../text_utils/text_utils.js';
36
36
  import {
37
37
  COND_BREAKPOINT_SOURCE_URL,
38
38
  type DebuggerModel,
39
- Events,
40
39
  Location,
41
40
  LOGPOINT_SOURCE_URL,
42
41
  } from './DebuggerModel.js';
@@ -80,7 +79,6 @@ export class Script implements TextUtils.ContentProvider.ContentProvider, FrameA
80
79
  executionContextId: number;
81
80
  hash: string;
82
81
  readonly #isContentScript: boolean;
83
- readonly #isLiveEdit: boolean;
84
82
  sourceMapURL?: string;
85
83
  debugSymbols: Protocol.Debugger.DebugSymbols|null;
86
84
  hasSourceURL: boolean;
@@ -92,13 +90,13 @@ export class Script implements TextUtils.ContentProvider.ContentProvider, FrameA
92
90
  readonly #embedderName: Platform.DevToolsPath.UrlString|null;
93
91
  readonly isModule: boolean|null;
94
92
  readonly buildId: string|null;
95
- constructor(
96
- debuggerModel: DebuggerModel, scriptId: Protocol.Runtime.ScriptId, sourceURL: Platform.DevToolsPath.UrlString,
97
- startLine: number, startColumn: number, endLine: number, endColumn: number, executionContextId: number,
98
- hash: string, isContentScript: boolean, isLiveEdit: boolean, sourceMapURL: string|undefined,
99
- hasSourceURL: boolean, length: number, isModule: boolean|null, originStackTrace: Protocol.Runtime.StackTrace|null,
100
- codeOffset: number|null, scriptLanguage: string|null, debugSymbols: Protocol.Debugger.DebugSymbols|null,
101
- embedderName: Platform.DevToolsPath.UrlString|null, buildId: string|null) {
93
+ constructor(debuggerModel: DebuggerModel, scriptId: Protocol.Runtime.ScriptId,
94
+ sourceURL: Platform.DevToolsPath.UrlString, startLine: number, startColumn: number, endLine: number,
95
+ endColumn: number, executionContextId: number, hash: string, isContentScript: boolean,
96
+ sourceMapURL: string|undefined, hasSourceURL: boolean, length: number, isModule: boolean|null,
97
+ originStackTrace: Protocol.Runtime.StackTrace|null, codeOffset: number|null, scriptLanguage: string|null,
98
+ debugSymbols: Protocol.Debugger.DebugSymbols|null, embedderName: Platform.DevToolsPath.UrlString|null,
99
+ buildId: string|null) {
102
100
  this.debuggerModel = debuggerModel;
103
101
  this.scriptId = scriptId;
104
102
  this.sourceURL = sourceURL;
@@ -112,7 +110,6 @@ export class Script implements TextUtils.ContentProvider.ContentProvider, FrameA
112
110
  this.executionContextId = executionContextId;
113
111
  this.hash = hash;
114
112
  this.#isContentScript = isContentScript;
115
- this.#isLiveEdit = isLiveEdit;
116
113
  this.sourceMapURL = sourceMapURL;
117
114
  this.debugSymbols = debugSymbols;
118
115
  this.hasSourceURL = hasSourceURL;
@@ -175,10 +172,6 @@ export class Script implements TextUtils.ContentProvider.ContentProvider, FrameA
175
172
  return this.debuggerModel.runtimeModel().executionContext(this.executionContextId);
176
173
  }
177
174
 
178
- isLiveEdit(): boolean {
179
- return this.#isLiveEdit;
180
- }
181
-
182
175
  contentURL(): Platform.DevToolsPath.UrlString {
183
176
  return this.sourceURL;
184
177
  }
@@ -261,8 +254,8 @@ export class Script implements TextUtils.ContentProvider.ContentProvider, FrameA
261
254
  requestContentData(): Promise<TextUtils.ContentData.ContentDataOrError> {
262
255
  if (!this.#contentPromise) {
263
256
  const fileSizeToCache = 65535; // We won't bother cacheing files under 64K
264
- if (this.hash && !this.#isLiveEdit && this.contentLength > fileSizeToCache) {
265
- // For large files that aren't live edits and have a hash, we keep a content-addressed cache
257
+ if (this.hash && this.contentLength > fileSizeToCache) {
258
+ // For large files that have a hash, we keep a content-addressed cache
266
259
  // so we don't need to load multiple copies or disassemble wasm modules multiple times.
267
260
  if (!scriptCacheInstance) {
268
261
  // Initialize script cache singleton. Add a finalizer for removing keys from the map.
@@ -331,43 +324,6 @@ export class Script implements TextUtils.ContentProvider.ContentProvider, FrameA
331
324
  return TextUtils.TextUtils.performSearchInSearchMatches(matches.result || [], query, caseSensitive, isRegex);
332
325
  }
333
326
 
334
- private appendSourceURLCommentIfNeeded(source: string): string {
335
- if (!this.hasSourceURL) {
336
- return source;
337
- }
338
- return source + '\n //# sourceURL=' + this.sourceURL;
339
- }
340
-
341
- async editSource(newSource: string): Promise<{
342
- changed: boolean,
343
- status: Protocol.Debugger.SetScriptSourceResponseStatus,
344
- exceptionDetails?: Protocol.Runtime.ExceptionDetails,
345
- }> {
346
- newSource = Script.trimSourceURLComment(newSource);
347
- // We append correct #sourceURL to script for consistency only. It's not actually needed for things to work correctly.
348
- newSource = this.appendSourceURLCommentIfNeeded(newSource);
349
-
350
- const oldSource = TextUtils.ContentData.ContentData.textOr(await this.requestContentData(), null);
351
- if (oldSource === newSource) {
352
- return {changed: false, status: Protocol.Debugger.SetScriptSourceResponseStatus.Ok};
353
- }
354
- const response = await this.debuggerModel.target().debuggerAgent().invoke_setScriptSource(
355
- {scriptId: this.scriptId, scriptSource: newSource, allowTopFrameEditing: true});
356
- if (response.getError()) {
357
- // Something went seriously wrong, like the V8 inspector no longer knowing about this script without
358
- // shutting down the Debugger agent etc.
359
- throw new Error(`Script#editSource failed for script with id ${this.scriptId}: ${response.getError()}`);
360
- }
361
-
362
- if (!response.getError() && response.status === Protocol.Debugger.SetScriptSourceResponseStatus.Ok) {
363
- this.#contentPromise =
364
- Promise.resolve(new TextUtils.ContentData.ContentData(newSource, /* isBase64 */ false, 'text/javascript'));
365
- }
366
-
367
- this.debuggerModel.dispatchEventToListeners(Events.ScriptSourceWasEdited, {script: this, status: response.status});
368
- return {changed: true, status: response.status, exceptionDetails: response.exceptionDetails};
369
- }
370
-
371
327
  rawLocation(lineNumber: number, columnNumber: number): Location|null {
372
328
  if (this.containsLocation(lineNumber, columnNumber)) {
373
329
  return new Location(this.debuggerModel, this.scriptId, lineNumber, columnNumber);
@@ -122,6 +122,24 @@ export class TargetManager extends Common.ObjectWrapper.ObjectWrapper<EventTypes
122
122
  Root.DevToolsContext.globalInstance().delete(TargetManager);
123
123
  }
124
124
 
125
+ // TODO(crbug.com/542394587): Should be `Symbol.dispose`
126
+ dispose(): void {
127
+ for (const target of this.targets()) {
128
+ target.dispose('TargetManager disposed');
129
+ }
130
+ if (this.#browserTarget) {
131
+ this.#browserTarget.dispose('TargetManager disposed');
132
+ this.#browserTarget = null;
133
+ }
134
+ this.#targets.clear();
135
+ this.#observers.clear();
136
+ this.#modelObservers.clear();
137
+ this.#modelListeners.clear();
138
+ this.#scopeChangeListeners.clear();
139
+ this.#scopeTarget = null;
140
+ this.#scopedObservers = new WeakSet();
141
+ }
142
+
125
143
  onInspectedURLChange(target: Target): void {
126
144
  if (target !== this.#scopeTarget) {
127
145
  return;
@@ -501,21 +501,11 @@ export class HeapSnapshotNode implements HeapSnapshotItem {
501
501
  }
502
502
 
503
503
  #detachednessAndClassIndex(): number {
504
- const {snapshot, nodeIndex} = this;
505
- const nodeDetachednessAndClassIndexOffset = snapshot.nodeDetachednessAndClassIndexOffset;
506
- return nodeDetachednessAndClassIndexOffset !== -1 ?
507
- snapshot.nodes.getValue(nodeIndex + nodeDetachednessAndClassIndexOffset) :
508
- (snapshot.detachednessAndClassIndexArray as Uint32Array)[nodeIndex / snapshot.nodeFieldCount];
504
+ return this.snapshot.detachednessAndClassIndexArray[this.nodeIndex / this.snapshot.nodeFieldCount];
509
505
  }
510
506
 
511
507
  #setDetachednessAndClassIndex(value: number): void {
512
- const {snapshot, nodeIndex} = this;
513
- const nodeDetachednessAndClassIndexOffset = snapshot.nodeDetachednessAndClassIndexOffset;
514
- if (nodeDetachednessAndClassIndexOffset !== -1) {
515
- snapshot.nodes.setValue(nodeIndex + nodeDetachednessAndClassIndexOffset, value);
516
- } else {
517
- (snapshot.detachednessAndClassIndexArray as Uint32Array)[nodeIndex / snapshot.nodeFieldCount] = value;
518
- }
508
+ this.snapshot.detachednessAndClassIndexArray[this.nodeIndex / this.snapshot.nodeFieldCount] = value;
519
509
  }
520
510
 
521
511
  detachedness(): HeapSnapshotModel.HeapSnapshotModel.DOMLinkState {
@@ -1010,7 +1000,7 @@ export abstract class HeapSnapshot {
1010
1000
  #ignoredEdgesInRetainersView = new Set<number>();
1011
1001
  #nodeDistancesForRetainersView: Int32Array|undefined;
1012
1002
  #edgeNamesThatAreNotWeakMaps: Platform.TypedArrayUtilities.BitVector;
1013
- detachednessAndClassIndexArray?: Uint32Array;
1003
+ detachednessAndClassIndexArray!: Uint32Array;
1014
1004
  nodeNativeContextAttribution!: Int32Array;
1015
1005
  #nativeContextSizes!: HeapSnapshotModel.HeapSnapshotModel.NativeContextSizes;
1016
1006
  #nativeContextOrdinals!: number[];
@@ -1092,6 +1082,7 @@ export abstract class HeapSnapshot {
1092
1082
  this.#progress.updateStatus('Building retainers…');
1093
1083
  const resultsFromSecondWorker = this.startInitStep1InSecondThread(secondWorker);
1094
1084
  this.#progress.updateStatus('Propagating DOM state…');
1085
+ this.initDetachednessAndClassIndex();
1095
1086
  this.propagateDOMState();
1096
1087
  this.#progress.updateStatus('Calculating node flags…');
1097
1088
  this.calculateFlags();
@@ -2400,12 +2391,6 @@ export abstract class HeapSnapshot {
2400
2391
  nodeRegExpType,
2401
2392
  } = this;
2402
2393
 
2403
- // If the snapshot doesn't contain a detachedness field in each node, then
2404
- // allocate a separate array so there is somewhere to store the class index.
2405
- if (this.nodeDetachednessAndClassIndexOffset === -1) {
2406
- this.detachednessAndClassIndexArray = new Uint32Array(nodeCount);
2407
- }
2408
-
2409
2394
  // We'll add some new values to the `strings` array during the processing below.
2410
2395
  // This map lets us easily find the index for each added string.
2411
2396
  const stringTable = new Map<string, number>();
@@ -2707,6 +2692,49 @@ export abstract class HeapSnapshot {
2707
2692
  return this.#nativeContextSizes;
2708
2693
  }
2709
2694
 
2695
+ getRetainedByContextSummary(): HeapSnapshotModel.HeapSnapshotModel.RetainedByContextSummary {
2696
+ // Use the exact same implementation here as aggregateWithFilter('objectsRetainedByContexts').
2697
+ const isRetainedByContext = this.createNamedFilter('objectsRetainedByContexts');
2698
+
2699
+ let contextCount = 0;
2700
+ let retainedByContextSize = 0;
2701
+ let retainedByContextCount = 0;
2702
+ let notRetainedByContextSize = 0;
2703
+ let notRetainedByContextCount = 0;
2704
+
2705
+ const node = this.rootNode();
2706
+ const {nodes, nodeFieldCount, nodeSelfSizeOffset: selfSizeOffset} = this;
2707
+ const nodesLength = nodes.length;
2708
+
2709
+ for (let nodeIndex = 0; nodeIndex < nodesLength; nodeIndex += nodeFieldCount) {
2710
+ const selfSize = nodes.getValue(nodeIndex + selfSizeOffset);
2711
+ if (!selfSize) {
2712
+ continue;
2713
+ }
2714
+ node.nodeIndex = nodeIndex;
2715
+ if (isRetainedByContext(node)) {
2716
+ retainedByContextCount++;
2717
+ retainedByContextSize += selfSize;
2718
+ } else {
2719
+ notRetainedByContextCount++;
2720
+ notRetainedByContextSize += selfSize;
2721
+ }
2722
+
2723
+ if (this.isContextObject(node)) {
2724
+ contextCount++;
2725
+ }
2726
+ }
2727
+
2728
+ return {
2729
+ contextCount,
2730
+ retainedByContextSize,
2731
+ retainedByContextCount,
2732
+ notRetainedByContextSize,
2733
+ notRetainedByContextCount,
2734
+ totalSize: retainedByContextSize + notRetainedByContextSize,
2735
+ };
2736
+ }
2737
+
2710
2738
  nodeNativeContext(nodeIndex: number): number {
2711
2739
  const ordinal = nodeIndex / this.nodeFieldCount;
2712
2740
  const nativeContextOrdinal = this.nodeNativeContextAttribution[ordinal];
@@ -2987,6 +3015,30 @@ export abstract class HeapSnapshot {
2987
3015
  return null;
2988
3016
  }
2989
3017
 
3018
+ private initDetachednessAndClassIndex(): void {
3019
+ this.detachednessAndClassIndexArray = new Uint32Array(this.nodeCount);
3020
+ if (this.nodeDetachednessAndClassIndexOffset !== -1) {
3021
+ // Seed this array from the detachedness field of the snapshot.
3022
+ const {nodeFieldCount, nodeDetachednessAndClassIndexOffset: offset} = this;
3023
+ for (let i = 0; i < this.nodeCount; ++i) {
3024
+ this.detachednessAndClassIndexArray[i] = Number(this.nodes.getValue(i * nodeFieldCount + offset));
3025
+ }
3026
+ } else {
3027
+ // For old snapshots, treat native objects named 'Detached ...' as detached.
3028
+ const node = this.rootNode();
3029
+ const nodesLength = this.nodes.length;
3030
+ const {nodeFieldCount, nodeNativeType, nodeTypeOffset} = this;
3031
+ for (let nodeIndex = 0; nodeIndex < nodesLength; nodeIndex += nodeFieldCount) {
3032
+ if (this.nodes.getValue(nodeIndex + nodeTypeOffset) === nodeNativeType) {
3033
+ node.nodeIndex = nodeIndex;
3034
+ if (node.name().startsWith('Detached ')) {
3035
+ node.setDetachedness(HeapSnapshotModel.HeapSnapshotModel.DOMLinkState.DETACHED);
3036
+ }
3037
+ }
3038
+ }
3039
+ }
3040
+ }
3041
+
2990
3042
  /**
2991
3043
  * The phase propagates whether a node is attached or detached through the
2992
3044
  * graph and adjusts the low-level representation of nodes.
@@ -3292,11 +3344,58 @@ export abstract class HeapSnapshot {
3292
3344
  return null;
3293
3345
  }
3294
3346
 
3295
- createEdgesProvider(nodeIndex: number): HeapSnapshotEdgesProvider {
3347
+ createEdgesProvider(nodeIndex: number,
3348
+ options?: HeapSnapshotModel.HeapSnapshotModel.HeapEdgesQueryOptions): HeapSnapshotEdgesProvider {
3296
3349
  const node = this.createNode(nodeIndex);
3297
- const filter = this.containmentEdgesFilter();
3350
+ const defaultFilter = this.containmentEdgesFilter();
3351
+ const minRetainedSize = options?.minRetainedSize;
3352
+ const excludePrimitives = options?.excludePrimitives ?? false;
3353
+
3354
+ let filter: ((arg0: HeapSnapshotEdge) => boolean)|null = defaultFilter;
3355
+
3356
+ if (minRetainedSize !== undefined || excludePrimitives) {
3357
+ filter = (edge: HeapSnapshotEdge): boolean => {
3358
+ if (defaultFilter && !defaultFilter(edge)) {
3359
+ return false;
3360
+ }
3361
+ const targetNode = edge.node();
3362
+ if (minRetainedSize !== undefined && targetNode.retainedSize() < minRetainedSize) {
3363
+ return false;
3364
+ }
3365
+ if (excludePrimitives) {
3366
+ const rawType = targetNode.rawType();
3367
+ if (rawType === this.nodeNumberType) {
3368
+ return false;
3369
+ }
3370
+ if (rawType === this.nodeNativeType) {
3371
+ const targetName = targetNode.rawName();
3372
+ if (targetName === 'undefined' || targetName === 'null' || targetName === 'true' ||
3373
+ targetName === 'false') {
3374
+ return false;
3375
+ }
3376
+ }
3377
+ }
3378
+ return true;
3379
+ };
3380
+ }
3381
+
3298
3382
  const indexProvider = new HeapSnapshotEdgeIndexProvider(this);
3299
- return new HeapSnapshotEdgesProvider(this, filter, node.edges(), indexProvider);
3383
+ const provider = new HeapSnapshotEdgesProvider(this, filter, node.edges(), indexProvider);
3384
+
3385
+ if (options?.sortBy) {
3386
+ const sortBy = options.sortBy;
3387
+ let comparator: HeapSnapshotModel.HeapSnapshotModel.ComparatorConfig;
3388
+ if (sortBy === 'selfSize') {
3389
+ comparator = new HeapSnapshotModel.HeapSnapshotModel.ComparatorConfig('selfSize', false, '!edgeName', true);
3390
+ } else if (sortBy === 'name') {
3391
+ comparator = new HeapSnapshotModel.HeapSnapshotModel.ComparatorConfig('!edgeName', true, 'retainedSize', false);
3392
+ } else {
3393
+ comparator = new HeapSnapshotModel.HeapSnapshotModel.ComparatorConfig('retainedSize', false, '!edgeName', true);
3394
+ }
3395
+ provider.sortAndRewind(comparator);
3396
+ }
3397
+
3398
+ return provider;
3300
3399
  }
3301
3400
 
3302
3401
  createEdgesProviderForTest(nodeIndex: number, filter: ((arg0: HeapSnapshotEdge) => boolean)|null):
@@ -3512,6 +3611,97 @@ export abstract class HeapSnapshot {
3512
3611
  return new HeapSnapshotNodesProvider(this, this.aggregatesWithFilter(nodeFilter)[classKey].idxs);
3513
3612
  }
3514
3613
 
3614
+ queryObjects(queryOptions: HeapSnapshotModel.HeapSnapshotModel.HeapQueryOptions): HeapSnapshotNodesProvider {
3615
+ const {nodes, nodeFieldCount, retainedSizes} = this;
3616
+ const nodesLength = nodes.length;
3617
+
3618
+ const matchingIndexes: number[] = [];
3619
+
3620
+ const classNamePattern = queryOptions.className ? new RegExp(queryOptions.className, 'i') : null;
3621
+ const propertyNamePattern = queryOptions.propertyName ? new RegExp(queryOptions.propertyName, 'i') : null;
3622
+ const targetNodeType = queryOptions.nodeType ? queryOptions.nodeType.toLowerCase() : null;
3623
+
3624
+ const node = this.rootNode();
3625
+
3626
+ for (let nodeIndex = 0, ordinal = 0; nodeIndex < nodesLength; nodeIndex += nodeFieldCount, ordinal++) {
3627
+ node.nodeIndex = nodeIndex;
3628
+
3629
+ if (queryOptions.minSelfSize !== undefined && node.selfSize() < queryOptions.minSelfSize) {
3630
+ continue;
3631
+ }
3632
+ if (queryOptions.maxSelfSize !== undefined && node.selfSize() > queryOptions.maxSelfSize) {
3633
+ continue;
3634
+ }
3635
+
3636
+ const retainedSize = retainedSizes[ordinal];
3637
+ if (queryOptions.minRetainedSize !== undefined && retainedSize < queryOptions.minRetainedSize) {
3638
+ continue;
3639
+ }
3640
+ if (queryOptions.maxRetainedSize !== undefined && retainedSize > queryOptions.maxRetainedSize) {
3641
+ continue;
3642
+ }
3643
+
3644
+ if (queryOptions.isDetached !== undefined) {
3645
+ const isDetached = node.detachedness() === HeapSnapshotModel.HeapSnapshotModel.DOMLinkState.DETACHED;
3646
+ if (isDetached !== queryOptions.isDetached) {
3647
+ continue;
3648
+ }
3649
+ }
3650
+
3651
+ if (classNamePattern) {
3652
+ const name = node.name();
3653
+ if (!classNamePattern.test(name)) {
3654
+ continue;
3655
+ }
3656
+ }
3657
+
3658
+ if (targetNodeType) {
3659
+ const typeStr = node.type();
3660
+ if (typeStr.toLowerCase() !== targetNodeType) {
3661
+ continue;
3662
+ }
3663
+ }
3664
+
3665
+ if (propertyNamePattern) {
3666
+ let propMatch = false;
3667
+ for (const iter = node.edges(); iter.hasNext(); iter.next()) {
3668
+ if (propertyNamePattern.test(iter.edge.name())) {
3669
+ propMatch = true;
3670
+ break;
3671
+ }
3672
+ }
3673
+ if (!propMatch) {
3674
+ continue;
3675
+ }
3676
+ }
3677
+
3678
+ matchingIndexes.push(nodeIndex);
3679
+ }
3680
+
3681
+ const sortBy = queryOptions.sortBy ?? 'retainedSize';
3682
+ if (sortBy === 'retainedSize') {
3683
+ matchingIndexes.sort((a, b) => retainedSizes[b / nodeFieldCount] - retainedSizes[a / nodeFieldCount]);
3684
+ } else if (sortBy === 'selfSize') {
3685
+ matchingIndexes.sort((a, b) => {
3686
+ node.nodeIndex = b;
3687
+ const sizeB = node.selfSize();
3688
+ node.nodeIndex = a;
3689
+ const sizeA = node.selfSize();
3690
+ return sizeB - sizeA;
3691
+ });
3692
+ } else if (sortBy === 'id') {
3693
+ matchingIndexes.sort((a, b) => {
3694
+ node.nodeIndex = b;
3695
+ const idB = node.id();
3696
+ node.nodeIndex = a;
3697
+ const idA = node.id();
3698
+ return idA - idB;
3699
+ });
3700
+ }
3701
+
3702
+ return new HeapSnapshotNodesProvider(this, matchingIndexes);
3703
+ }
3704
+
3515
3705
  private maxJsNodeId(): number {
3516
3706
  const nodeFieldCount = this.nodeFieldCount;
3517
3707
  const nodes = this.nodes;
@@ -4196,7 +4386,7 @@ export class JSHeapSnapshot extends HeapSnapshot {
4196
4386
  continue;
4197
4387
  }
4198
4388
  node.nodeIndex = nodeIndex;
4199
- if (node.name().startsWith('Detached ')) {
4389
+ if (node.detachedness() === HeapSnapshotModel.HeapSnapshotModel.DOMLinkState.DETACHED) {
4200
4390
  this.flags[ordinal] |= flag;
4201
4391
  }
4202
4392
  }
@@ -49,6 +49,7 @@ import * as Persistence from '../../models/persistence/persistence.js';
49
49
  import * as Workspace from '../../models/workspace/workspace.js';
50
50
  import * as PanelCommon from '../../panels/common/common.js';
51
51
  import * as Snippets from '../../panels/snippets/snippets.js';
52
+ import type * as Comments from '../../ui/comments/comments.js';
52
53
  import * as Buttons from '../../ui/components/buttons/buttons.js';
53
54
  import * as Snackbar from '../../ui/components/snackbars/snackbars.js';
54
55
  import * as UIHelpers from '../../ui/helpers/helpers.js';
@@ -209,6 +210,7 @@ export class MainImpl {
209
210
  hostConfig: Root.Runtime.hostConfig,
210
211
  inspectorFrontendHost: Host.InspectorFrontendHost.InspectorFrontendHostInstance,
211
212
  supportsEmulation: this.#supportsEmulation,
213
+ initAutomaticFilesystem: true,
212
214
  };
213
215
  this.#universe = new Foundation.Universe.Universe(creationOptions);
214
216
  Root.DevToolsContext.setGlobalInstance(this.#universe.context as Root.DevToolsContext.WritableDevToolsContext);
@@ -997,3 +999,33 @@ export class ReloadActionDelegate implements UI.ActionRegistration.ActionDelegat
997
999
  return false;
998
1000
  }
999
1001
  }
1002
+
1003
+ let activeCommentManager: Comments.CommentManager.CommentManager|null = null;
1004
+ let activeOverlayWidget: Comments.CommentsOverlayWidget.CommentsOverlayWidget|null = null;
1005
+
1006
+ // Temporary for manual testing and experimentation.
1007
+ export async function comments(): Promise<Comments.CommentManager.CommentManager> {
1008
+ const Comments = await import('../../ui/comments/comments.js');
1009
+ if (!activeCommentManager || !activeOverlayWidget) {
1010
+ activeCommentManager = new Comments.CommentManager.CommentManager();
1011
+ activeCommentManager.start();
1012
+
1013
+ activeOverlayWidget = new Comments.CommentsOverlayWidget.CommentsOverlayWidget(activeCommentManager);
1014
+ activeOverlayWidget.markAsRoot();
1015
+ activeOverlayWidget.show(document.body);
1016
+ activeCommentManager.setCommentMode(true);
1017
+ return activeCommentManager;
1018
+ }
1019
+
1020
+ const newMode = !activeCommentManager.isCommentMode();
1021
+ activeCommentManager.setCommentMode(newMode);
1022
+ if (newMode) {
1023
+ activeOverlayWidget.show(document.body);
1024
+ } else {
1025
+ activeOverlayWidget.detach();
1026
+ }
1027
+ return activeCommentManager;
1028
+ }
1029
+
1030
+ // @ts-expect-error global helper for manual testing
1031
+ globalThis.comments = comments;
@@ -28,6 +28,7 @@ export interface CreationOptions {
28
28
  hostConfig: Root.Runtime.HostConfig;
29
29
  inspectorFrontendHost: Host.InspectorFrontendHostAPI.InspectorFrontendHostAPI;
30
30
  supportsEmulation: boolean;
31
+ initAutomaticFilesystem?: boolean;
31
32
  }
32
33
 
33
34
  export class Universe {
@@ -37,6 +38,7 @@ export class Universe {
37
38
  readonly context: Root.DevToolsContext.DevToolsContext;
38
39
  readonly autofillManager: AutofillManager.AutofillManager.AutofillManager;
39
40
  readonly supportsEmulation: boolean;
41
+ readonly initAutomaticFilesystem: boolean;
40
42
  readonly fileSystemWorkspaceBinding: Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding;
41
43
 
42
44
  constructor(options: CreationOptions) {
@@ -78,11 +80,17 @@ export class Universe {
78
80
  const multitargetNetworkManager = new SDK.NetworkManager.MultitargetNetworkManager(targetManager);
79
81
  context.set(SDK.NetworkManager.MultitargetNetworkManager, multitargetNetworkManager);
80
82
 
83
+ const workspace = new Workspace.Workspace.WorkspaceImpl();
84
+ context.set(Workspace.Workspace.WorkspaceImpl, workspace);
85
+
86
+ const fileManager = new Workspace.FileManager.FileManager();
87
+ context.set(Workspace.FileManager.FileManager, fileManager);
88
+
81
89
  this.supportsEmulation = options.supportsEmulation;
82
90
  let deviceModeModel = null;
83
91
  if (options.supportsEmulation) {
84
- deviceModeModel =
85
- new Emulation.DeviceModeModel.DeviceModeModel(targetManager, settings, multitargetNetworkManager);
92
+ deviceModeModel = new Emulation.DeviceModeModel.DeviceModeModel(targetManager, settings,
93
+ multitargetNetworkManager, fileManager);
86
94
  context.set(Emulation.DeviceModeModel.DeviceModeModel, deviceModeModel);
87
95
  }
88
96
 
@@ -90,15 +98,20 @@ export class Universe {
90
98
  new SDK.PageResourceLoader.PageResourceLoader(targetManager, settings, multitargetNetworkManager, null);
91
99
  context.set(SDK.PageResourceLoader.PageResourceLoader, pageResourceLoader);
92
100
 
93
- const projectSettingsModel = new ProjectSettings.ProjectSettingsModel.ProjectSettingsModel(
94
- pageResourceLoader,
95
- targetManager,
96
- );
97
- context.set(ProjectSettings.ProjectSettingsModel.ProjectSettingsModel, projectSettingsModel);
98
-
99
- const automaticFileSystemManager = new Persistence.AutomaticFileSystemManager.AutomaticFileSystemManager(
100
- options.inspectorFrontendHost, projectSettingsModel);
101
- context.set(Persistence.AutomaticFileSystemManager.AutomaticFileSystemManager, automaticFileSystemManager);
101
+ this.initAutomaticFilesystem = options.initAutomaticFilesystem ?? false;
102
+ let automaticFileSystemManager = null;
103
+ let projectSettingsModel = null;
104
+ if (this.initAutomaticFilesystem) {
105
+ projectSettingsModel = new ProjectSettings.ProjectSettingsModel.ProjectSettingsModel(
106
+ pageResourceLoader,
107
+ targetManager,
108
+ );
109
+ context.set(ProjectSettings.ProjectSettingsModel.ProjectSettingsModel, projectSettingsModel);
110
+
111
+ automaticFileSystemManager = new Persistence.AutomaticFileSystemManager.AutomaticFileSystemManager(
112
+ options.inspectorFrontendHost, projectSettingsModel);
113
+ context.set(Persistence.AutomaticFileSystemManager.AutomaticFileSystemManager, automaticFileSystemManager);
114
+ }
102
115
 
103
116
  const cpuThrottlingManager = new SDK.CPUThrottlingManager.CPUThrottlingManager(settings, targetManager);
104
117
  context.set(SDK.CPUThrottlingManager.CPUThrottlingManager, cpuThrottlingManager);
@@ -117,22 +130,18 @@ export class Universe {
117
130
  const domModelUndoStack = new SDK.DOMModel.DOMModelUndoStack();
118
131
  context.set(SDK.DOMModel.DOMModelUndoStack, domModelUndoStack);
119
132
 
120
- const workspace = new Workspace.Workspace.WorkspaceImpl();
121
- context.set(Workspace.Workspace.WorkspaceImpl, workspace);
122
-
123
- const fileManager = new Workspace.FileManager.FileManager();
124
- context.set(Workspace.FileManager.FileManager, fileManager);
125
-
126
- const automaticFileSystemWorkspaceBinding =
127
- new Persistence.AutomaticFileSystemWorkspaceBinding.AutomaticFileSystemWorkspaceBinding(
128
- automaticFileSystemManager,
129
- isolatedFileSystemManager,
130
- workspace,
131
- );
132
- context.set(
133
- Persistence.AutomaticFileSystemWorkspaceBinding.AutomaticFileSystemWorkspaceBinding,
134
- automaticFileSystemWorkspaceBinding,
135
- );
133
+ if (automaticFileSystemManager) {
134
+ const automaticFileSystemWorkspaceBinding =
135
+ new Persistence.AutomaticFileSystemWorkspaceBinding.AutomaticFileSystemWorkspaceBinding(
136
+ automaticFileSystemManager,
137
+ isolatedFileSystemManager,
138
+ workspace,
139
+ );
140
+ context.set(
141
+ Persistence.AutomaticFileSystemWorkspaceBinding.AutomaticFileSystemWorkspaceBinding,
142
+ automaticFileSystemWorkspaceBinding,
143
+ );
144
+ }
136
145
 
137
146
  this.fileSystemWorkspaceBinding =
138
147
  new Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding(isolatedFileSystemManager, workspace);
@@ -226,6 +235,11 @@ export class Universe {
226
235
  dispose(): void {
227
236
  // TODO(crbug.com/542394587): Track these in a DisposableStack.
228
237
  this.context.get(Persistence.IsolatedFileSystemManager.IsolatedFileSystemManager).dispose();
238
+ if (this.initAutomaticFilesystem) {
239
+ this.context.get(Persistence.AutomaticFileSystemManager.AutomaticFileSystemManager).dispose();
240
+ }
241
+ this.context.get(Workspace.FileManager.FileManager).dispose();
242
+ this.context.get(SDK.TargetManager.TargetManager).dispose();
229
243
  }
230
244
 
231
245
  get automaticFileSystemManager(): Persistence.AutomaticFileSystemManager.AutomaticFileSystemManager {
@@ -338,8 +352,9 @@ export class Universe {
338
352
  return this.context.get(Bindings.PresentationConsoleMessageHelper.PresentationConsoleMessageManager);
339
353
  }
340
354
 
341
- get projectSettingsModel(): ProjectSettings.ProjectSettingsModel.ProjectSettingsModel {
342
- return this.context.get(ProjectSettings.ProjectSettingsModel.ProjectSettingsModel);
355
+ get projectSettingsModel(): ProjectSettings.ProjectSettingsModel.ProjectSettingsModel|null {
356
+ return this.initAutomaticFilesystem ? this.context.get(ProjectSettings.ProjectSettingsModel.ProjectSettingsModel) :
357
+ null;
343
358
  }
344
359
 
345
360
  get settings(): Common.Settings.Settings {