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
@@ -6,6 +6,7 @@ import * as Common from '../../core/common/common.js';
6
6
  import * as Host from '../../core/host/host.js';
7
7
  import * as i18n from '../../core/i18n/i18n.js';
8
8
  import * as Platform from '../../core/platform/platform.js';
9
+ import * as Root from '../../core/root/root.js';
9
10
 
10
11
  import type {FilesChangedData} from './FileSystemWorkspaceBinding.js';
11
12
  import {IsolatedFileSystem} from './IsolatedFileSystem.js';
@@ -24,7 +25,6 @@ const UIStrings = {
24
25
  } as const;
25
26
  const str_ = i18n.i18n.registerUIStrings('models/persistence/IsolatedFileSystemManager.ts', UIStrings);
26
27
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
27
- let isolatedFileSystemManagerInstance: IsolatedFileSystemManager|null;
28
28
 
29
29
  export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
30
30
  readonly #fileSystems: Map<Platform.DevToolsPath.UrlString, PlatformFileSystem>;
@@ -33,8 +33,12 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
33
33
  readonly #workspaceFolderExcludePatternSetting: Common.Settings.RegExpSetting;
34
34
  private fileSystemRequestResolve: ((arg0: IsolatedFileSystem|null) => void)|null;
35
35
  private readonly fileSystemsLoadedPromise: Promise<IsolatedFileSystem[]>;
36
- private constructor() {
36
+ readonly #settings: Common.Settings.Settings;
37
+ readonly #console: Common.Console.Console;
38
+ constructor(settings: Common.Settings.Settings, console: Common.Console.Console) {
37
39
  super();
40
+ this.#settings = settings;
41
+ this.#console = console;
38
42
 
39
43
  this.#fileSystems = new Map();
40
44
  this.callbacks = new Map();
@@ -90,24 +94,31 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
90
94
  defaultExcludedFolders = defaultExcludedFolders.concat(defaultLinuxExcludedFolders);
91
95
  }
92
96
  const defaultExcludedFoldersPattern = defaultExcludedFolders.join('|');
93
- this.#workspaceFolderExcludePatternSetting = Common.Settings.Settings.instance().createRegExpSetting(
97
+ this.#workspaceFolderExcludePatternSetting = this.#settings.createRegExpSetting(
94
98
  'workspace-folder-exclude-pattern', defaultExcludedFoldersPattern, Host.Platform.isWin() ? 'i' : '');
95
99
 
96
100
  this.fileSystemRequestResolve = null;
97
101
  this.fileSystemsLoadedPromise = this.requestFileSystems();
98
102
  }
99
103
 
100
- static instance(opts: {forceNew: boolean|null} = {forceNew: null}): IsolatedFileSystemManager {
101
- const {forceNew} = opts;
102
- if (!isolatedFileSystemManagerInstance || forceNew) {
103
- isolatedFileSystemManagerInstance = new IsolatedFileSystemManager();
104
+ static instance(opts: {
105
+ forceNew?: boolean|null,
106
+ settings?: Common.Settings.Settings|null,
107
+ console?: Common.Console.Console|null,
108
+ } = {}): IsolatedFileSystemManager {
109
+ const forceNew = opts.forceNew ?? null;
110
+ const settings = opts.settings ?? Common.Settings.Settings.instance();
111
+ const console = opts.console ?? Common.Console.Console.instance();
112
+ if (!Root.DevToolsContext.globalInstance().has(IsolatedFileSystemManager) || forceNew) {
113
+ const instance = new IsolatedFileSystemManager(settings, console);
114
+ Root.DevToolsContext.globalInstance().set(IsolatedFileSystemManager, instance);
104
115
  }
105
116
 
106
- return isolatedFileSystemManagerInstance;
117
+ return Root.DevToolsContext.globalInstance().get(IsolatedFileSystemManager);
107
118
  }
108
119
 
109
120
  static removeInstance(): void {
110
- isolatedFileSystemManagerInstance = null;
121
+ Root.DevToolsContext.globalInstance().delete(IsolatedFileSystemManager);
111
122
  }
112
123
 
113
124
  private requestFileSystems(): Promise<IsolatedFileSystem[]> {
@@ -160,7 +171,7 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
160
171
  const fileSystemURL = Common.ParsedURL.ParsedURL.rawPathToUrlString(fileSystem.fileSystemPath);
161
172
  const promise = IsolatedFileSystem.create(
162
173
  this, fileSystemURL, embedderPath, hostFileSystemTypeToPlatformFileSystemType(fileSystem.type),
163
- fileSystem.fileSystemName, fileSystem.rootURL, fileSystem.type === 'automatic');
174
+ fileSystem.fileSystemName, fileSystem.rootURL, fileSystem.type === 'automatic', this.#settings);
164
175
  return promise.then(storeFileSystem.bind(this));
165
176
 
166
177
  function storeFileSystem(this: IsolatedFileSystemManager, fileSystem: IsolatedFileSystem|null): IsolatedFileSystem|
@@ -188,7 +199,7 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
188
199
  const {errorMessage, fileSystem} = event.data;
189
200
  if (errorMessage) {
190
201
  if (errorMessage !== '<selection cancelled>' && errorMessage !== '<permission denied>') {
191
- Common.Console.Console.instance().error(i18nString(UIStrings.unableToAddFilesystemS, {PH1: errorMessage}));
202
+ this.#console.error(i18nString(UIStrings.unableToAddFilesystemS, {PH1: errorMessage}));
192
203
  }
193
204
  if (!this.fileSystemRequestResolve) {
194
205
  return;
@@ -5,6 +5,7 @@
5
5
  import * as Common from '../../core/common/common.js';
6
6
  import * as Host from '../../core/host/host.js';
7
7
  import * as Platform from '../../core/platform/platform.js';
8
+ import * as Root from '../../core/root/root.js';
8
9
  import * as SDK from '../../core/sdk/sdk.js';
9
10
  import * as Protocol from '../../generated/protocol.js';
10
11
  import * as Breakpoints from '../breakpoints/breakpoints.js';
@@ -15,8 +16,6 @@ import {type FileSystem, FileSystemWorkspaceBinding} from './FileSystemWorkspace
15
16
  import {IsolatedFileSystemManager} from './IsolatedFileSystemManager.js';
16
17
  import {PersistenceBinding, PersistenceImpl} from './PersistenceImpl.js';
17
18
 
18
- let networkPersistenceManagerInstance: NetworkPersistenceManager|null;
19
-
20
19
  const forbiddenUrls = ['chromewebstore.google.com', 'chrome.google.com'];
21
20
 
22
21
  export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrapper<EventTypes> implements
@@ -24,8 +23,14 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
24
23
  #bindings = new WeakMap<Workspace.UISourceCode.UISourceCode, PersistenceBinding>();
25
24
  readonly #originalResponseContentPromises = new WeakMap<Workspace.UISourceCode.UISourceCode, Promise<string|null>>();
26
25
  #savingForOverrides = new WeakSet<Workspace.UISourceCode.UISourceCode>();
27
- #enabledSetting = Common.Settings.Settings.instance().moduleSetting<boolean>('persistence-network-overrides-enabled');
26
+ readonly #enabledSetting: Common.Settings.Setting<boolean>;
28
27
  readonly #workspace: Workspace.Workspace.WorkspaceImpl;
28
+ readonly #persistence: PersistenceImpl;
29
+ readonly #breakpointManager: Breakpoints.BreakpointManager.BreakpointManager;
30
+ readonly #targetManager: SDK.TargetManager.TargetManager;
31
+ readonly #settings: Common.Settings.Settings;
32
+ readonly #isolatedFileSystemManager: IsolatedFileSystemManager;
33
+ readonly #multitargetNetworkManager: SDK.NetworkManager.MultitargetNetworkManager;
29
34
  readonly #networkUISourceCodeForEncodedPath =
30
35
  new Map<Platform.DevToolsPath.EncodedPathString, Workspace.UISourceCode.UISourceCode>();
31
36
  readonly #interceptionHandlerBound: (interceptedRequest: SDK.NetworkManager.InterceptedRequest) => Promise<void>;
@@ -39,12 +44,27 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
39
44
  readonly #eventDispatchThrottler = new Common.Throttler.Throttler(50);
40
45
  #headerOverridesForEventDispatch = new Set<Workspace.UISourceCode.UISourceCode>();
41
46
 
42
- private constructor(workspace: Workspace.Workspace.WorkspaceImpl) {
47
+ constructor(
48
+ workspace: Workspace.Workspace.WorkspaceImpl,
49
+ persistence: PersistenceImpl,
50
+ breakpointManager: Breakpoints.BreakpointManager.BreakpointManager,
51
+ targetManager: SDK.TargetManager.TargetManager,
52
+ settings: Common.Settings.Settings,
53
+ isolatedFileSystemManager: IsolatedFileSystemManager,
54
+ multitargetNetworkManager: SDK.NetworkManager.MultitargetNetworkManager,
55
+ ) {
43
56
  super();
44
57
 
45
- this.#enabledSetting.addChangeListener(this.enabledChanged, this);
46
-
47
58
  this.#workspace = workspace;
59
+ this.#persistence = persistence;
60
+ this.#breakpointManager = breakpointManager;
61
+ this.#targetManager = targetManager;
62
+ this.#settings = settings;
63
+ this.#isolatedFileSystemManager = isolatedFileSystemManager;
64
+ this.#multitargetNetworkManager = multitargetNetworkManager;
65
+
66
+ this.#enabledSetting = this.#settings.moduleSetting<boolean>('persistence-network-overrides-enabled');
67
+ this.#enabledSetting.addChangeListener(this.enabledChanged, this);
48
68
 
49
69
  this.#interceptionHandlerBound = this.interceptionHandler.bind(this);
50
70
 
@@ -55,13 +75,12 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
55
75
  void this.onProjectRemoved(event.data);
56
76
  });
57
77
 
58
- PersistenceImpl.instance().addNetworkInterceptor(this.canHandleNetworkUISourceCode.bind(this));
59
- Breakpoints.BreakpointManager.BreakpointManager.instance().addUpdateBindingsCallback(
60
- this.networkUISourceCodeAdded.bind(this));
78
+ this.#persistence.addNetworkInterceptor(this.canHandleNetworkUISourceCode.bind(this));
79
+ this.#breakpointManager.addUpdateBindingsCallback(this.networkUISourceCodeAdded.bind(this));
61
80
 
62
81
  void this.enabledChanged();
63
82
 
64
- SDK.TargetManager.TargetManager.instance().observeTargets(this);
83
+ this.#targetManager.observeTargets(this);
65
84
  }
66
85
 
67
86
  targetAdded(): void {
@@ -76,14 +95,29 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
76
95
  workspace: Workspace.Workspace.WorkspaceImpl|null,
77
96
  } = {forceNew: null, workspace: null}): NetworkPersistenceManager {
78
97
  const {forceNew, workspace} = opts;
79
- if (!networkPersistenceManagerInstance || forceNew) {
98
+ if (!Root.DevToolsContext.globalInstance().has(NetworkPersistenceManager) || forceNew) {
80
99
  if (!workspace) {
81
100
  throw new Error('Missing workspace for NetworkPersistenceManager');
82
101
  }
83
- networkPersistenceManagerInstance = new NetworkPersistenceManager(workspace);
102
+ Root.DevToolsContext.globalInstance().set(
103
+ NetworkPersistenceManager,
104
+ new NetworkPersistenceManager(
105
+ workspace,
106
+ PersistenceImpl.instance(),
107
+ Breakpoints.BreakpointManager.BreakpointManager.instance(),
108
+ SDK.TargetManager.TargetManager.instance(),
109
+ Common.Settings.Settings.instance(),
110
+ IsolatedFileSystemManager.instance(),
111
+ SDK.NetworkManager.MultitargetNetworkManager.instance(),
112
+ ),
113
+ );
84
114
  }
85
115
 
86
- return networkPersistenceManagerInstance;
116
+ return Root.DevToolsContext.globalInstance().get(NetworkPersistenceManager);
117
+ }
118
+
119
+ static removeInstance(): void {
120
+ Root.DevToolsContext.globalInstance().delete(NetworkPersistenceManager);
87
121
  }
88
122
 
89
123
  active(): boolean {
@@ -111,24 +145,20 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
111
145
  if (this.#enabled) {
112
146
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.PersistenceNetworkOverridesEnabled);
113
147
  this.#eventDescriptors = [
114
- Workspace.Workspace.WorkspaceImpl.instance().addEventListener(
115
- Workspace.Workspace.Events.UISourceCodeRenamed,
116
- event => {
117
- void this.uiSourceCodeRenamedListener(event);
118
- }),
119
- Workspace.Workspace.WorkspaceImpl.instance().addEventListener(
120
- Workspace.Workspace.Events.UISourceCodeAdded,
121
- event => {
122
- void this.uiSourceCodeAdded(event);
123
- }),
124
- Workspace.Workspace.WorkspaceImpl.instance().addEventListener(
125
- Workspace.Workspace.Events.UISourceCodeRemoved,
126
- event => {
127
- void this.uiSourceCodeRemovedListener(event);
128
- }),
129
- Workspace.Workspace.WorkspaceImpl.instance().addEventListener(
130
- Workspace.Workspace.Events.WorkingCopyCommitted,
131
- event => this.onUISourceCodeWorkingCopyCommitted(event.data.uiSourceCode)),
148
+ this.#workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeRenamed,
149
+ event => {
150
+ void this.uiSourceCodeRenamedListener(event);
151
+ }),
152
+ this.#workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeAdded,
153
+ event => {
154
+ void this.uiSourceCodeAdded(event);
155
+ }),
156
+ this.#workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeRemoved,
157
+ event => {
158
+ void this.uiSourceCodeRemovedListener(event);
159
+ }),
160
+ this.#workspace.addEventListener(Workspace.Workspace.Events.WorkingCopyCommitted,
161
+ event => this.onUISourceCodeWorkingCopyCommitted(event.data.uiSourceCode)),
132
162
  ];
133
163
  await this.updateActiveProject();
134
164
  } else {
@@ -158,8 +188,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
158
188
 
159
189
  private async updateActiveProject(): Promise<void> {
160
190
  const wasActive = this.#active;
161
- this.#active =
162
- Boolean(this.#enabledSetting.get() && SDK.TargetManager.TargetManager.instance().rootTarget() && this.#project);
191
+ this.#active = Boolean(this.#enabledSetting.get() && this.#targetManager.rootTarget() && this.#project);
163
192
  if (this.#active === wasActive) {
164
193
  return;
165
194
  }
@@ -178,7 +207,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
178
207
  [...this.#project.uiSourceCodes()].map(uiSourceCode => this.filesystemUISourceCodeRemoved(uiSourceCode)));
179
208
  this.#networkUISourceCodeForEncodedPath.clear();
180
209
  }
181
- PersistenceImpl.instance().refreshAutomapping();
210
+ this.#persistence.refreshAutomapping();
182
211
  }
183
212
 
184
213
  encodedPathFromUrl(url: Platform.DevToolsPath.UrlString, ignoreInactive?: boolean):
@@ -270,7 +299,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
270
299
  const folderUrlFromRequest =
271
300
  Common.ParsedURL.ParsedURL.substring(fileUrlFromRequest, 0, fileUrlFromRequest.lastIndexOf('/'));
272
301
  const headersFileUrl = Common.ParsedURL.ParsedURL.concatenate(folderUrlFromRequest, '/', HEADERS_FILENAME);
273
- return Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodeForURL(headersFileUrl);
302
+ return this.#workspace.uiSourceCodeForURL(headersFileUrl);
274
303
  }
275
304
 
276
305
  async getOrCreateHeadersUISourceCodeFromUrl(url: Platform.DevToolsPath.UrlString):
@@ -315,7 +344,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
315
344
  #innerUnbind(binding: PersistenceBinding): Promise<void> {
316
345
  this.#bindings.delete(binding.network);
317
346
  this.#bindings.delete(binding.fileSystem);
318
- return PersistenceImpl.instance().removeBinding(binding);
347
+ return this.#persistence.removeBinding(binding);
319
348
  }
320
349
 
321
350
  async #bind(
@@ -352,12 +381,12 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
352
381
  const binding = new PersistenceBinding(networkUISourceCode, fileSystemUISourceCode);
353
382
  this.#bindings.set(networkUISourceCode, binding);
354
383
  this.#bindings.set(fileSystemUISourceCode, binding);
355
- await PersistenceImpl.instance().addBinding(binding);
384
+ await this.#persistence.addBinding(binding);
356
385
  const uiSourceCodeOfTruth =
357
386
  this.#savingForOverrides.has(networkUISourceCode) ? networkUISourceCode : fileSystemUISourceCode;
358
387
  const contentDataOrError = await uiSourceCodeOfTruth.requestContentData();
359
388
  const {content, isEncoded} = TextUtils.ContentData.ContentData.asDeferredContent(contentDataOrError);
360
- PersistenceImpl.instance().syncContent(uiSourceCodeOfTruth, content || '', isEncoded);
389
+ this.#persistence.syncContent(uiSourceCodeOfTruth, content || '', isEncoded);
361
390
  }
362
391
 
363
392
  private onUISourceCodeWorkingCopyCommitted(uiSourceCode: Workspace.UISourceCode.UISourceCode): void {
@@ -398,7 +427,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
398
427
  if (this.#shouldPromptSaveForOverridesDialog(uiSourceCode)) {
399
428
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.OverrideContentContextMenuSetup);
400
429
  await new Promise<void>(resolve => this.dispatchEventToListeners(Events.LOCAL_OVERRIDES_REQUESTED, resolve));
401
- await IsolatedFileSystemManager.instance().addFileSystem('overrides');
430
+ await this.#isolatedFileSystemManager.addFileSystem('overrides');
402
431
  }
403
432
 
404
433
  if (!this.project()) {
@@ -683,8 +712,8 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
683
712
  async #innerUpdateInterceptionPatterns(): Promise<void> {
684
713
  this.#headerOverridesMap.clear();
685
714
  if (!this.#active || !this.#project) {
686
- return await SDK.NetworkManager.MultitargetNetworkManager.instance().setInterceptionHandlerForPatterns(
687
- [], this.#interceptionHandlerBound);
715
+ return await this.#multitargetNetworkManager.setInterceptionHandlerForPatterns([],
716
+ this.#interceptionHandlerBound);
688
717
  }
689
718
  let patterns = new Set<string>();
690
719
  for (const uiSourceCode of this.#project.uiSourceCodes()) {
@@ -713,9 +742,9 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
713
742
  }
714
743
  }
715
744
 
716
- return await SDK.NetworkManager.MultitargetNetworkManager.instance().setInterceptionHandlerForPatterns(
717
- Array.from(patterns).map(
718
- pattern => ({urlPattern: pattern, requestStage: Protocol.Fetch.RequestStage.Response})),
745
+ return await this.#multitargetNetworkManager.setInterceptionHandlerForPatterns(
746
+ Array.from(patterns).map(pattern =>
747
+ ({urlPattern: pattern, requestStage: Protocol.Fetch.RequestStage.Response})),
719
748
  this.#interceptionHandlerBound);
720
749
  }
721
750
 
@@ -5,6 +5,7 @@
5
5
  import * as Common from '../../core/common/common.js';
6
6
  import * as Host from '../../core/host/host.js';
7
7
  import * as Platform from '../../core/platform/platform.js';
8
+ import * as Root from '../../core/root/root.js';
8
9
  import * as SDK from '../../core/sdk/sdk.js';
9
10
  import * as Bindings from '../bindings/bindings.js';
10
11
  import * as BreakpointManager from '../breakpoints/breakpoints.js';
@@ -13,8 +14,6 @@ import * as Workspace from '../workspace/workspace.js';
13
14
 
14
15
  import {Automapping, type AutomappingStatus} from './Automapping.js';
15
16
 
16
- let persistenceInstance: PersistenceImpl;
17
-
18
17
  export class PersistenceImpl extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
19
18
  readonly #workspace: Workspace.Workspace.WorkspaceImpl;
20
19
  readonly #breakpointManager: BreakpointManager.BreakpointManager.BreakpointManager;
@@ -40,14 +39,14 @@ export class PersistenceImpl extends Common.ObjectWrapper.ObjectWrapper<EventTyp
40
39
  breakpointManager: BreakpointManager.BreakpointManager.BreakpointManager|null,
41
40
  } = {forceNew: null, workspace: null, breakpointManager: null}): PersistenceImpl {
42
41
  const {forceNew, workspace, breakpointManager} = opts;
43
- if (!persistenceInstance || forceNew) {
42
+ if (!Root.DevToolsContext.globalInstance().has(PersistenceImpl) || forceNew) {
44
43
  if (!workspace || !breakpointManager) {
45
44
  throw new Error('Missing arguments for workspace');
46
45
  }
47
- persistenceInstance = new PersistenceImpl(workspace, breakpointManager);
46
+ Root.DevToolsContext.globalInstance().set(PersistenceImpl, new PersistenceImpl(workspace, breakpointManager));
48
47
  }
49
48
 
50
- return persistenceInstance;
49
+ return Root.DevToolsContext.globalInstance().get(PersistenceImpl);
51
50
  }
52
51
 
53
52
  addNetworkInterceptor(interceptor: (arg0: Workspace.UISourceCode.UISourceCode) => boolean): void {
@@ -4,7 +4,7 @@
4
4
 
5
5
  import * as Common from '../../core/common/common.js';
6
6
  import * as Platform from '../../core/platform/platform.js';
7
- import type * as Root from '../../core/root/root.js';
7
+ import * as Root from '../../core/root/root.js';
8
8
  import * as SDK from '../../core/sdk/sdk.js';
9
9
 
10
10
  /** The security origin for all DevTools (front-end) resources. */
@@ -72,8 +72,6 @@ export type ProjectSettingsAvailability = 'available'|'unavailable';
72
72
  const EMPTY_PROJECT_SETTINGS: ProjectSettings = Object.freeze({});
73
73
  const IDLE_PROMISE: Promise<void> = Promise.resolve();
74
74
 
75
- let projectSettingsModelInstance: ProjectSettingsModel|undefined;
76
-
77
75
  export class ProjectSettingsModel extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
78
76
  readonly #pageResourceLoader: SDK.PageResourceLoader.PageResourceLoader;
79
77
  readonly #targetManager: SDK.TargetManager.TargetManager;
@@ -108,7 +106,7 @@ export class ProjectSettingsModel extends Common.ObjectWrapper.ObjectWrapper<Eve
108
106
  return this.#promise.then(() => this.#projectSettings);
109
107
  }
110
108
 
111
- private constructor(
109
+ constructor(
112
110
  hostConfig: Root.Runtime.HostConfig,
113
111
  pageResourceLoader: SDK.PageResourceLoader.PageResourceLoader,
114
112
  targetManager: SDK.TargetManager.TargetManager,
@@ -140,24 +138,27 @@ export class ProjectSettingsModel extends Common.ObjectWrapper.ObjectWrapper<Eve
140
138
  pageResourceLoader: SDK.PageResourceLoader.PageResourceLoader|null,
141
139
  targetManager: SDK.TargetManager.TargetManager|null,
142
140
  }): ProjectSettingsModel {
143
- if (!projectSettingsModelInstance || forceNew) {
141
+ if (!Root.DevToolsContext.globalInstance().has(ProjectSettingsModel) || forceNew) {
144
142
  if (!hostConfig || !pageResourceLoader || !targetManager) {
145
143
  throw new Error(
146
144
  'Unable to create ProjectSettingsModel: ' +
147
145
  'hostConfig, pageResourceLoader, and targetManager must be provided');
148
146
  }
149
- projectSettingsModelInstance = new ProjectSettingsModel(hostConfig, pageResourceLoader, targetManager);
147
+ Root.DevToolsContext.globalInstance().set(
148
+ ProjectSettingsModel,
149
+ new ProjectSettingsModel(hostConfig, pageResourceLoader, targetManager),
150
+ );
150
151
  }
151
- return projectSettingsModelInstance;
152
+ return Root.DevToolsContext.globalInstance().get(ProjectSettingsModel);
152
153
  }
153
154
 
154
155
  /**
155
- * Clears the `ProjectSettingsModel` singleton (if any).
156
+ * Clears the `ProjectSettingsModel` singleton (if any);
156
157
  */
157
158
  static removeInstance(): void {
158
- if (projectSettingsModelInstance) {
159
- projectSettingsModelInstance.#dispose();
160
- projectSettingsModelInstance = undefined;
159
+ if (Root.DevToolsContext.globalInstance().has(ProjectSettingsModel)) {
160
+ Root.DevToolsContext.globalInstance().get(ProjectSettingsModel).#dispose();
161
+ Root.DevToolsContext.globalInstance().delete(ProjectSettingsModel);
161
162
  }
162
163
  }
163
164
 
@@ -118,7 +118,7 @@ export class EntityMapper {
118
118
  const sourceLocationEvents: Types.Events.Event[] = [];
119
119
  // The events that don't match the source location, but that we should keep mapped to its current entity.
120
120
  const unrelatedEvents: Types.Events.Event[] = [];
121
- currentEntityEvents?.forEach(e => {
121
+ currentEntityEvents?.forEach((e: Types.Events.Event) => {
122
122
  const cf = Helpers.Trace.getStackTraceTopCallFrameInEventPayload(e);
123
123
 
124
124
  const matchesCallFrame = cf && Helpers.Trace.isMatchingCallFrame(cf, callFrame);
@@ -7,21 +7,14 @@ import * as Types from '../types/types.js';
7
7
 
8
8
  import type {HandlerName} from './types.js';
9
9
 
10
- // Each thread contains events. Events indicate the thread and process IDs, which are
11
- // used to store the event in the correct process thread entry below.
12
- let unpairedAsyncEvents: Types.Events.PipelineReporter[] = [];
13
-
14
10
  let legacyScreenshotEvents: Types.Events.LegacyScreenshot[] = [];
15
11
  let modernScreenshotEvents: Types.Events.Screenshot[] = [];
16
12
  let syntheticScreenshots: Types.Events.LegacySyntheticScreenshot[] = [];
17
- let frameSequenceToTs: Record<string, Types.Timing.Micro> = {};
18
13
 
19
14
  export function reset(): void {
20
- unpairedAsyncEvents = [];
21
15
  legacyScreenshotEvents = [];
22
16
  syntheticScreenshots = [];
23
17
  modernScreenshotEvents = [];
24
- frameSequenceToTs = {};
25
18
  }
26
19
 
27
20
  export function handleEvent(event: Types.Events.Event): void {
@@ -29,39 +22,26 @@ export function handleEvent(event: Types.Events.Event): void {
29
22
  legacyScreenshotEvents.push(event);
30
23
  } else if (Types.Events.isScreenshot(event)) {
31
24
  modernScreenshotEvents.push(event);
32
- } else if (Types.Events.isPipelineReporter(event)) {
33
- unpairedAsyncEvents.push(event);
34
25
  }
35
26
  }
36
27
 
37
28
  export async function finalize(): Promise<void> {
38
- const pipelineReporterEvents = Helpers.Trace.createMatchedSortedSyntheticEvents(unpairedAsyncEvents);
39
-
40
- frameSequenceToTs = Object.fromEntries(pipelineReporterEvents.map(evt => {
41
- const args = evt.args.data.beginEvent.args;
42
- const frameReporter = 'frame_reporter' in args ? args.frame_reporter : args.chrome_frame_reporter;
43
- const frameSequenceId = frameReporter.frame_sequence;
44
- const presentationTs = Types.Timing.Micro(evt.ts + evt.dur);
45
- return [frameSequenceId, presentationTs];
46
- }));
47
-
48
29
  for (const snapshotEvent of legacyScreenshotEvents) {
49
30
  const {cat, name, ph, pid, tid} = snapshotEvent;
50
- const syntheticEvent = Helpers.SyntheticEvents.SyntheticEventsManager.registerSyntheticEvent<
51
- Types.Events.LegacySyntheticScreenshot>({
52
- rawSourceEvent: snapshotEvent,
53
- cat,
54
- name,
55
- ph,
56
- pid,
57
- tid,
58
- // TODO(paulirish, crbug.com/41363012): investigate why getPresentationTimestamp(snapshotEvent) seems less accurate. Resolve screenshot timing inaccuracy.
59
- // `getPresentationTimestamp(snapshotEvent) - snapshotEvent.ts` is how many microsec the screenshot should be adjusted to the right/later
60
- ts: snapshotEvent.ts,
61
- args: {
62
- dataUri: `data:image/jpg;base64,${snapshotEvent.args.snapshot}`,
63
- },
64
- });
31
+ const syntheticEvent =
32
+ Helpers.SyntheticEvents.SyntheticEventsManager.registerSyntheticEvent<Types.Events.LegacySyntheticScreenshot>({
33
+ rawSourceEvent: snapshotEvent,
34
+ cat,
35
+ name,
36
+ ph,
37
+ pid,
38
+ tid,
39
+ // TODO(paulirish, crbug.com/41363012): fix snapshot timestamps.
40
+ ts: snapshotEvent.ts,
41
+ args: {
42
+ dataUri: `data:image/jpg;base64,${snapshotEvent.args.snapshot}`,
43
+ },
44
+ });
65
45
  syntheticScreenshots.push(syntheticEvent);
66
46
  }
67
47
  }
@@ -73,31 +53,6 @@ export function screenshotImageDataUri(event: Types.Events.LegacySyntheticScreen
73
53
  return `data:image/jpg;base64,${event.args.snapshot}`;
74
54
  }
75
55
 
76
- /**
77
- * Correct the screenshot timestamps
78
- * The screenshot 'snapshot object' trace event has the "frame sequence number" attached as an ID.
79
- * We match that up with the "PipelineReporter" trace events as they terminate at presentation.
80
- * Presentation == when the pixels hit the screen. AKA Swap on the GPU
81
- */
82
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
83
- function getPresentationTimestamp(screenshotEvent: Types.Events.LegacyScreenshot): Types.Timing.Micro {
84
- const frameSequence = parseInt(screenshotEvent.id, 16);
85
- // If it's 1, then it's an old trace (before https://crrev.com/c/4957973) and cannot be corrected.
86
- if (frameSequence === 1) {
87
- return screenshotEvent.ts;
88
- }
89
- // The screenshot trace event's `ts` reflects the "expected display time" which is ESTIMATE.
90
- // It is set by the compositor frame sink from the `expected_display_time`, which is based on a previously known
91
- // frame start PLUS the vsync interval (eg 16.6ms)
92
- const updatedTs = frameSequenceToTs[frameSequence];
93
- // Do we always find a match? No...
94
- // We generally don't match the very first screenshot and, sometimes, the last
95
- // The very first screenshot is requested immediately (even if nothing is painting). As a result there's no compositor
96
- // instrumentation running alongside.
97
- // The last one is sometimes missing as because the trace terminates right before the associated PipelineReporter is emitted.
98
- return updatedTs ?? screenshotEvent.ts;
99
- }
100
-
101
56
  export interface Data {
102
57
  // These are nullable because in January 2025 a CL in Chromium
103
58
  // crrev.com/c/6197645 landed which changed the format of screenshots. For a