chrome-devtools-frontend 1.0.1690116 → 1.0.1695017

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 (421) hide show
  1. package/.agents/skills/devtools-model-management/SKILL.md +3 -3
  2. package/.agents/skills/foundation-test-migration/SKILL.md +2 -2
  3. package/.agents/skills/merging-devtools-module/SKILL.md +5 -5
  4. package/AUTHORS +3 -0
  5. package/config/typescript/tsconfig.base.json +1 -0
  6. package/docs/get_the_code.md +4 -9
  7. package/front_end/Images/src/comment-mode-cursor.svg +23 -0
  8. package/front_end/Tests.js +1 -1
  9. package/front_end/application_tokens.css +5 -0
  10. package/front_end/core/common/ColorConverter.ts +3 -3
  11. package/front_end/core/host/UserMetrics.ts +27 -0
  12. package/front_end/core/protocol_client/DevToolsCDPConnection.ts +0 -46
  13. package/front_end/core/protocol_client/InspectorBackend.ts +6 -6
  14. package/front_end/core/root/Runtime.ts +1 -0
  15. package/front_end/core/sdk/CSSLocation.ts +32 -0
  16. package/front_end/core/sdk/CSSModel.ts +2 -22
  17. package/front_end/core/sdk/CSSQuery.ts +2 -1
  18. package/front_end/core/sdk/CSSRule.ts +29 -0
  19. package/front_end/core/sdk/DebuggerModel.ts +5 -1
  20. package/front_end/core/sdk/NetworkManager.ts +2 -0
  21. package/front_end/core/sdk/NetworkRequest.ts +63 -4
  22. package/front_end/core/sdk/NetworkRequestAccess.ts +191 -0
  23. package/front_end/core/sdk/ResourceTreeModel.ts +72 -23
  24. package/front_end/core/sdk/SecurityOrigin.ts +97 -12
  25. package/front_end/core/sdk/Target.ts +18 -0
  26. package/front_end/core/sdk/sdk.ts +4 -0
  27. package/front_end/entrypoints/main/MainImpl.ts +8 -1
  28. package/front_end/foundation/Universe.ts +14 -11
  29. package/front_end/generated/Deprecation.ts +8 -0
  30. package/front_end/generated/InspectorBackendCommands.ts +9 -8
  31. package/front_end/generated/SupportedCSSProperties.ts +14 -4
  32. package/front_end/generated/protocol.ts +24 -0
  33. package/front_end/models/ai_assistance/AiAgent2.ts +46 -10
  34. package/front_end/models/ai_assistance/AiConversation.ts +35 -24
  35. package/front_end/models/ai_assistance/README.md +5 -3
  36. package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +1 -0
  37. package/front_end/models/ai_assistance/agents/AiAgent.ts +28 -34
  38. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +13 -17
  39. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +5 -3
  40. package/front_end/models/ai_assistance/agents/StorageAgent.ts +16 -10
  41. package/front_end/models/ai_assistance/agents/StylingAgent.ts +3 -4
  42. package/front_end/models/ai_assistance/ai_assistance.ts +0 -2
  43. package/front_end/models/ai_assistance/contexts/AccessibilityContext.ts +11 -2
  44. package/front_end/models/ai_assistance/contexts/DOMNodeContext.ts +17 -5
  45. package/front_end/models/ai_assistance/contexts/FileContext.ts +13 -6
  46. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +52 -25
  47. package/front_end/models/ai_assistance/contexts/RequestContext.ts +18 -34
  48. package/front_end/models/ai_assistance/contexts/StorageContext.ts +14 -3
  49. package/front_end/models/ai_assistance/data_formatters/FileFormatter.ts +2 -5
  50. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +135 -58
  51. package/front_end/models/ai_assistance/tools/CookieUtils.ts +25 -35
  52. package/front_end/models/ai_assistance/tools/DOMStorageUtils.ts +6 -3
  53. package/front_end/models/ai_assistance/tools/ExecuteJavaScript.ts +9 -2
  54. package/front_end/models/ai_assistance/tools/GetCookieValues.ts +1 -1
  55. package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +3 -2
  56. package/front_end/models/ai_assistance/tools/GetFunctionCode.ts +3 -5
  57. package/front_end/models/ai_assistance/tools/GetInsightDetails.ts +1 -1
  58. package/front_end/models/ai_assistance/tools/GetNetworkRequestDetails.ts +8 -11
  59. package/front_end/models/ai_assistance/tools/GetResourceContent.ts +2 -4
  60. package/front_end/models/ai_assistance/tools/GetSourceContent.ts +6 -13
  61. package/front_end/models/ai_assistance/tools/GetStorageBreakdown.ts +1 -1
  62. package/front_end/models/ai_assistance/tools/GetStorageValues.ts +9 -9
  63. package/front_end/models/ai_assistance/tools/GetStyles.ts +3 -2
  64. package/front_end/models/ai_assistance/tools/ListCookies.ts +1 -1
  65. package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +6 -14
  66. package/front_end/models/ai_assistance/tools/ListPageOrigins.ts +10 -15
  67. package/front_end/models/ai_assistance/tools/ListSources.ts +5 -7
  68. package/front_end/models/ai_assistance/tools/ListStorageKeys.ts +9 -9
  69. package/front_end/models/ai_assistance/tools/README.md +4 -2
  70. package/front_end/models/ai_assistance/tools/ResolveDevtoolsNodePath.ts +3 -2
  71. package/front_end/models/ai_assistance/tools/Tool.ts +27 -3
  72. package/front_end/models/comment_manager/CD4ABridge.ts +128 -0
  73. package/front_end/models/comment_manager/CommentManager.ts +50 -8
  74. package/front_end/models/comment_manager/comment_manager.ts +2 -0
  75. package/front_end/models/emulation/DeviceModeModel.ts +37 -47
  76. package/front_end/models/javascript_metadata/NativeFunctions.ts +9 -1
  77. package/front_end/models/live-metrics/web-vitals-injected/README.md +1 -1
  78. package/front_end/models/source_map_scopes/NamesResolver.ts +9 -7
  79. package/front_end/models/trace/ModelImpl.ts +2 -0
  80. package/front_end/models/trace/Processor.ts +6 -4
  81. package/front_end/models/trace/handlers/LayerTreeHandler.ts +3 -3
  82. package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +1 -1
  83. package/front_end/models/trace/helpers/SyntheticEvents.ts +23 -1
  84. package/front_end/models/trace/types/Configuration.ts +7 -0
  85. package/front_end/models/trace/types/TraceEvents.ts +20 -4
  86. package/front_end/panels/accessibility/ARIAAttributesView.ts +3 -0
  87. package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingListView.ts +177 -0
  88. package/front_end/panels/accessibility/accessibility.ts +2 -0
  89. package/front_end/panels/accessibility/accessibilityAnnouncementRecordingListView.css +33 -0
  90. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +25 -15
  91. package/front_end/panels/ai_assistance/components/ChatMessage.ts +6 -35
  92. package/front_end/panels/ai_assistance/components/DisabledWidget.ts +4 -3
  93. package/front_end/panels/ai_assistance/components/chatMessage.css +3 -1
  94. package/front_end/panels/animation/AnimationTimeline.ts +1 -0
  95. package/front_end/panels/application/CrashReportContextView.ts +0 -1
  96. package/front_end/panels/application/FrameDetailsView.ts +5 -4
  97. package/front_end/panels/application/IndexedDBViews.ts +4 -4
  98. package/front_end/panels/application/components/BackForwardCacheView.ts +1 -1
  99. package/front_end/panels/application/components/EndpointsGrid.ts +2 -1
  100. package/front_end/panels/application/components/PermissionsPolicySection.ts +1 -1
  101. package/front_end/panels/application/components/ServiceWorkerRouterView.ts +1 -1
  102. package/front_end/panels/application/components/TrustTokensView.ts +1 -1
  103. package/front_end/panels/application/indexedDBViews.css +0 -14
  104. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +2 -1
  105. package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +2 -1
  106. package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +1 -1
  107. package/front_end/panels/common/CPUThrottlingOption.ts +12 -6
  108. package/front_end/panels/common/DOMLinkifier.ts +1 -1
  109. package/front_end/panels/common/ExtensionView.ts +2 -1
  110. package/front_end/panels/console/ConsoleContextSelector.ts +12 -5
  111. package/front_end/panels/console/ConsolePinPane.ts +4 -2
  112. package/front_end/panels/console/ConsoleSidebar.ts +6 -2
  113. package/front_end/panels/console/ConsoleViewMessage.ts +12 -8
  114. package/front_end/panels/console/PromptBuilder.ts +1 -1
  115. package/front_end/panels/coverage/CoverageListView.ts +1 -1
  116. package/front_end/panels/coverage/CoverageModel.ts +6 -4
  117. package/front_end/panels/coverage/coverageView.css +8 -8
  118. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +13 -14
  119. package/front_end/panels/css_overview/CSSOverviewPanel.ts +3 -3
  120. package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +2 -2
  121. package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +3 -3
  122. package/front_end/panels/css_overview/CSSOverviewStartView.ts +3 -3
  123. package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +1 -1
  124. package/front_end/panels/developer_resources/developerResourcesView.css +3 -3
  125. package/front_end/panels/elements/ComputedStyleWidget.ts +1 -1
  126. package/front_end/panels/elements/ElementsTreeElement.ts +43 -15
  127. package/front_end/panels/elements/ElementsTreeOutline.ts +185 -109
  128. package/front_end/panels/elements/MetricsSidebarPane.ts +1 -1
  129. package/front_end/panels/elements/PropertyNameCategories.ts +1 -1
  130. package/front_end/panels/elements/ShortcutTreeElement.ts +6 -1
  131. package/front_end/panels/elements/StandaloneStylesContainer.ts +1 -1
  132. package/front_end/panels/elements/StylePropertiesSection.ts +2 -35
  133. package/front_end/panels/elements/StylesSidebarPane.ts +3 -2
  134. package/front_end/panels/elements/components/CSSPropertyIconResolver.ts +5 -4
  135. package/front_end/panels/elements/components/StylePropertyEditor.ts +161 -148
  136. package/front_end/panels/elements/components/computedStyleProperty.css +5 -5
  137. package/front_end/panels/elements/components/computedStyleTrace.css +5 -5
  138. package/front_end/panels/elements/components/cssHintDetailsView.css +1 -1
  139. package/front_end/panels/elements/components/cssPropertyDocsView.css +3 -3
  140. package/front_end/panels/elements/components/cssVariableValueView.css +4 -4
  141. package/front_end/panels/elements/components/elementsBreadcrumbs.css +3 -3
  142. package/front_end/panels/elements/components/elementsTreeExpandButton.css +5 -5
  143. package/front_end/panels/elements/components/queryContainer.css +2 -2
  144. package/front_end/panels/elements/elementsTreeOutline.css +20 -4
  145. package/front_end/panels/emulation/MediaQueryInspector.ts +2 -1
  146. package/front_end/panels/event_listeners/eventListenersView.css +1 -1
  147. package/front_end/panels/issues/AffectedElementsView.ts +3 -0
  148. package/front_end/panels/issues/AffectedLazyLoadImagesView.ts +1 -1
  149. package/front_end/panels/issues/issues.ts +2 -0
  150. package/front_end/panels/layer_viewer/LayerDetailsView.ts +12 -10
  151. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +1 -0
  152. package/front_end/panels/layer_viewer/Layers3DView.ts +13 -11
  153. package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +1 -1
  154. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspectorUtils.ts +2 -2
  155. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplayUtils.ts +1 -1
  156. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +1 -1
  157. package/front_end/panels/linear_memory_inspector/components/linearMemoryHighlightChipList.css +11 -11
  158. package/front_end/panels/linear_memory_inspector/components/linearMemoryInspector.css +2 -2
  159. package/front_end/panels/linear_memory_inspector/components/linearMemoryNavigator.css +1 -1
  160. package/front_end/panels/linear_memory_inspector/components/linearMemoryValueInterpreter.css +5 -5
  161. package/front_end/panels/linear_memory_inspector/components/linearMemoryViewer.css +6 -6
  162. package/front_end/panels/linear_memory_inspector/components/valueInterpreterDisplay.css +6 -6
  163. package/front_end/panels/linear_memory_inspector/components/valueInterpreterSettings.css +2 -2
  164. package/front_end/panels/media/PlayerPropertiesView.ts +1 -1
  165. package/front_end/panels/media/TickingFlameChart.ts +3 -2
  166. package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +2 -1
  167. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +1 -1
  168. package/front_end/panels/mobile_throttling/ThrottlingPresets.ts +2 -1
  169. package/front_end/panels/network/NetworkDataGridNode.ts +11 -9
  170. package/front_end/panels/network/NetworkLogView.ts +4 -1
  171. package/front_end/panels/network/NetworkLogViewColumns.ts +5 -2
  172. package/front_end/panels/network/RequestConditionsDrawer.ts +2 -2
  173. package/front_end/panels/network/RequestHeadersView.ts +47 -11
  174. package/front_end/panels/network/RequestPayloadView.ts +1 -1
  175. package/front_end/panels/network/RequestResponseView.ts +1 -1
  176. package/front_end/panels/network/RequestTimingView.ts +1 -1
  177. package/front_end/panels/network/ShowMoreDetailsWidget.ts +1 -1
  178. package/front_end/panels/network/components/RequestHeadersView.css +12 -0
  179. package/front_end/panels/network/components/ResponseHeaderSection.ts +1 -1
  180. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +3 -3
  181. package/front_end/panels/profiler/HeapProfileView.ts +1 -1
  182. package/front_end/panels/profiler/HeapSnapshotGridNodes.ts +1 -1
  183. package/front_end/panels/protocol_monitor/JSONEditor.ts +1 -1
  184. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +3 -3
  185. package/front_end/panels/recorder/RecordingListView.ts +0 -6
  186. package/front_end/panels/recorder/RecordingView.ts +0 -6
  187. package/front_end/panels/recorder/controlButton.css +10 -10
  188. package/front_end/panels/recorder/startView.css +1 -1
  189. package/front_end/panels/screencast/ScreencastView.ts +4 -2
  190. package/front_end/panels/search/SearchView.ts +1 -1
  191. package/front_end/panels/security/SecurityPanel.ts +46 -35
  192. package/front_end/panels/sources/BreakpointEditDialog.ts +1 -1
  193. package/front_end/panels/sources/CallStackSidebarPane.ts +1 -1
  194. package/front_end/panels/sources/DebuggerPausedMessage.ts +8 -6
  195. package/front_end/panels/sources/ProfilePlugin.ts +2 -1
  196. package/front_end/panels/sources/ScopeChainSidebarPane.ts +1 -1
  197. package/front_end/panels/timeline/IsolateSelector.ts +1 -1
  198. package/front_end/panels/timeline/LayoutShiftsTrackAppender.ts +1 -1
  199. package/front_end/panels/timeline/NetworkTrackAppender.ts +1 -1
  200. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +1 -1
  201. package/front_end/panels/timeline/TimelineFlameChartView.ts +0 -32
  202. package/front_end/panels/timeline/TimelineHistoryManager.ts +1 -1
  203. package/front_end/panels/timeline/TimelinePaintProfilerView.ts +7 -3
  204. package/front_end/panels/timeline/TimelinePanel.ts +3 -20
  205. package/front_end/panels/timeline/TimelineTreeView.ts +1 -1
  206. package/front_end/panels/timeline/TimelineUIUtils.ts +4 -4
  207. package/front_end/panels/timeline/components/LayoutShiftDetails.ts +4 -3
  208. package/front_end/panels/timeline/components/LiveMetricsView.ts +1 -1
  209. package/front_end/panels/timeline/components/NetworkRequestDetails.ts +25 -24
  210. package/front_end/panels/timeline/components/RelatedInsightChips.ts +4 -3
  211. package/front_end/panels/timeline/components/Sidebar.ts +1 -1
  212. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +4 -3
  213. package/front_end/panels/timeline/components/cwvMetrics.css +2 -2
  214. package/front_end/panels/timeline/components/insights/checklist.css +1 -1
  215. package/front_end/panels/timeline/components/insights/table.css +3 -3
  216. package/front_end/panels/timeline/overlays/components/entriesLinkOverlay.css +4 -4
  217. package/front_end/panels/timeline/overlays/components/entryLabelOverlay.css +4 -4
  218. package/front_end/panels/timeline/overlays/components/timeRangeOverlay.css +2 -2
  219. package/front_end/panels/timeline/overlays/components/timespanBreakdownOverlay.css +4 -4
  220. package/front_end/panels/timeline/timelinePanel.css +0 -74
  221. package/front_end/panels/timeline/utils/Helpers.ts +1 -1
  222. package/front_end/panels/timeline/utils/ImageCache.ts +5 -3
  223. package/front_end/panels/web_audio/WebAudioView.ts +3 -3
  224. package/front_end/panels/web_audio/webAudio.css +5 -5
  225. package/front_end/panels/webauthn/WebauthnPane.ts +5 -11
  226. package/front_end/third_party/acorn/acorn.ts +3 -3
  227. package/front_end/third_party/chromium/README.chromium +1 -1
  228. package/front_end/third_party/chromium/ahem/ahem.d.ts +1 -0
  229. package/front_end/third_party/csp_evaluator/package/csp.ts +4 -4
  230. package/front_end/third_party/csp_evaluator/package/parser.ts +3 -1
  231. package/front_end/third_party/csp_evaluator/package/tsconfig.json +1 -0
  232. package/front_end/third_party/csp_evaluator/package/utils.ts +1 -1
  233. package/front_end/third_party/diff/DiffWrapper.ts +1 -8
  234. package/front_end/third_party/diff/diff_match_patch.d.ts +10 -0
  235. package/front_end/third_party/json5/json5.ts +2 -2
  236. package/front_end/third_party/puppeteer/README.chromium +2 -2
  237. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +183 -4
  238. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +708 -122
  239. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +85 -3
  240. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  241. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +84 -11
  242. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  243. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.d.ts +75 -0
  244. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.d.ts.map +1 -0
  245. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.js +102 -0
  246. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.js.map +1 -0
  247. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.d.ts +1 -0
  248. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.d.ts.map +1 -1
  249. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.js +1 -0
  250. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.js.map +1 -1
  251. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts +6 -1
  252. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts.map +1 -1
  253. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js +7 -0
  254. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js.map +1 -1
  255. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.d.ts +31 -0
  256. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.d.ts.map +1 -0
  257. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.js +138 -0
  258. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.js.map +1 -0
  259. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.d.ts +1 -0
  260. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.d.ts.map +1 -1
  261. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.js +1 -0
  262. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.js.map +1 -1
  263. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.d.ts +6 -0
  264. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  265. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.js +23 -0
  266. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  267. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts +6 -1
  268. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts.map +1 -1
  269. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js +7 -0
  270. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js.map +1 -1
  271. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.d.ts +31 -0
  272. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.d.ts.map +1 -0
  273. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.js +131 -0
  274. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.js.map +1 -0
  275. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.d.ts +1 -0
  276. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.d.ts.map +1 -1
  277. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.js +1 -0
  278. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.js.map +1 -1
  279. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js +7 -4
  280. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js.map +1 -1
  281. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.d.ts +4 -1
  282. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.d.ts.map +1 -1
  283. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js +5 -1
  284. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js.map +1 -1
  285. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts +42 -0
  286. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  287. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.d.ts +2 -2
  288. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.d.ts.map +1 -1
  289. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.js +265 -1
  290. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.js.map +1 -1
  291. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts +4 -0
  292. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  293. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +24 -3
  294. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
  295. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.d.ts +23 -2
  296. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.d.ts.map +1 -1
  297. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js +49 -3
  298. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js.map +1 -1
  299. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  300. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  301. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  302. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts.map +1 -1
  303. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  304. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js.map +1 -1
  305. package/front_end/third_party/puppeteer/package/lib/types.d.ts +183 -4
  306. package/front_end/third_party/puppeteer/package/package.json +4 -4
  307. package/front_end/third_party/puppeteer/package/src/api/Page.ts +143 -11
  308. package/front_end/third_party/puppeteer/package/src/api/ScreenRecording.ts +145 -0
  309. package/front_end/third_party/puppeteer/package/src/api/api.ts +1 -0
  310. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +11 -0
  311. package/front_end/third_party/puppeteer/package/src/bidi/ScreenRecording.ts +106 -0
  312. package/front_end/third_party/puppeteer/package/src/bidi/bidi.ts +1 -0
  313. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +41 -0
  314. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +11 -0
  315. package/front_end/third_party/puppeteer/package/src/cdp/ScreenRecording.ts +101 -0
  316. package/front_end/third_party/puppeteer/package/src/cdp/cdp.ts +1 -0
  317. package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +17 -9
  318. package/front_end/third_party/puppeteer/package/src/common/BrowserWebSocketTransport.ts +4 -0
  319. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +46 -0
  320. package/front_end/third_party/puppeteer/package/src/common/Device.ts +287 -1
  321. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +30 -1
  322. package/front_end/third_party/puppeteer/package/src/node/NodeWebSocketTransport.ts +73 -2
  323. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  324. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  325. package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +3 -0
  326. package/front_end/tsconfig.json +1 -2
  327. package/front_end/ui/comments/CommentAnchorResolver.ts +8 -3
  328. package/front_end/ui/comments/CommentOverlayManager.ts +53 -12
  329. package/front_end/ui/comments/CommentsOverlayWidget.ts +3 -3
  330. package/front_end/ui/comments/CommentsStatusBarPill.ts +96 -0
  331. package/front_end/ui/comments/comments-meta.ts +21 -0
  332. package/front_end/ui/comments/comments.ts +2 -0
  333. package/front_end/ui/comments/commentsOverlay.css +22 -3
  334. package/front_end/ui/components/buttons/floatingButton.css +25 -0
  335. package/front_end/ui/components/markdown_view/MarkdownView.ts +31 -1
  336. package/front_end/ui/components/srgb_overlay/SrgbOverlay.ts +1 -1
  337. package/front_end/ui/components/suggestion_input/SuggestionInput.ts +45 -25
  338. package/front_end/ui/kit/icons/Icon.ts +0 -1
  339. package/front_end/ui/kit/link/Link.ts +8 -1
  340. package/front_end/ui/legacy/ContextMenu.ts +2 -2
  341. package/front_end/ui/legacy/DropTarget.ts +6 -1
  342. package/front_end/ui/legacy/EmptyWidget.ts +1 -1
  343. package/front_end/ui/legacy/GlassPane.ts +1 -1
  344. package/front_end/ui/legacy/InspectorView.ts +17 -1
  345. package/front_end/ui/legacy/ShortcutRegistry.ts +2 -2
  346. package/front_end/ui/legacy/SplitWidget.ts +18 -3
  347. package/front_end/ui/legacy/StackedPane.ts +1 -1
  348. package/front_end/ui/legacy/StatusBar.ts +78 -0
  349. package/front_end/ui/legacy/TargetCrashedScreen.ts +1 -1
  350. package/front_end/ui/legacy/TextPrompt.ts +2 -1
  351. package/front_end/ui/legacy/Toolbar.ts +5 -1
  352. package/front_end/ui/legacy/Treeoutline.ts +91 -48
  353. package/front_end/ui/legacy/UIUtils.ts +8 -4
  354. package/front_end/ui/legacy/ViewManager.ts +1 -1
  355. package/front_end/ui/legacy/ViewRegistration.ts +1 -0
  356. package/front_end/ui/legacy/Widget.ts +1 -1
  357. package/front_end/ui/legacy/components/color_picker/Spectrum.ts +7 -1
  358. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +1 -1
  359. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +3 -2
  360. package/front_end/ui/legacy/components/data_grid/dataGrid.css +23 -23
  361. package/front_end/ui/legacy/components/inline_editor/AnimationTimingModel.ts +1 -1
  362. package/front_end/ui/legacy/components/inline_editor/BezierEditor.ts +48 -44
  363. package/front_end/ui/legacy/components/inline_editor/CSSAngleUtils.ts +1 -1
  364. package/front_end/ui/legacy/components/inline_editor/PositionAreaEditor.docs.ts +83 -0
  365. package/front_end/ui/legacy/components/inline_editor/PositionAreaEditor.ts +600 -0
  366. package/front_end/ui/legacy/components/inline_editor/animationNameSwatch.css +1 -1
  367. package/front_end/ui/legacy/components/inline_editor/colorMixSwatch.css +4 -4
  368. package/front_end/ui/legacy/components/inline_editor/cssAngleSwatch.css +3 -3
  369. package/front_end/ui/legacy/components/inline_editor/inline_editor.ts +2 -0
  370. package/front_end/ui/legacy/components/inline_editor/linkSwatch.css +1 -1
  371. package/front_end/ui/legacy/components/inline_editor/positionAreaEditor.css +154 -0
  372. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +224 -127
  373. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +10 -7
  374. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +25 -106
  375. package/front_end/ui/legacy/components/object_ui/customPreviewComponent.css +7 -3
  376. package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +1 -1
  377. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +0 -66
  378. package/front_end/ui/legacy/components/perf_ui/perf_ui.ts +0 -2
  379. package/front_end/ui/legacy/components/perf_ui/pieChart.css +7 -5
  380. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +8 -5
  381. package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +1 -1
  382. package/front_end/ui/legacy/components/utils/Linkifier.ts +5 -5
  383. package/front_end/ui/legacy/inspectorCommon.css +41 -6
  384. package/front_end/ui/legacy/legacy.ts +2 -0
  385. package/front_end/ui/legacy/statusBar.css +18 -0
  386. package/front_end/ui/visual_logging/Debugging.ts +2 -1
  387. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -1
  388. package/front_end/ui/visual_logging/LoggingDriver.ts +3 -3
  389. package/front_end/ui/visual_logging/LoggingEvents.ts +5 -5
  390. package/front_end/ui/visual_logging/LoggingState.ts +1 -1
  391. package/front_end/ui/visual_logging/visual_logging.ts +67 -56
  392. package/inspector_overlay/main.ts +8 -8
  393. package/mcp/mcp.ts +5 -0
  394. package/package.json +2 -8
  395. package/front_end/Images/generate-css-vars.js +0 -52
  396. package/front_end/Images/rollup.config.mjs +0 -36
  397. package/front_end/models/ai_assistance/AiOrigins.ts +0 -107
  398. package/front_end/models/live-metrics/web-vitals-injected/rollup.config.mjs +0 -20
  399. package/front_end/panels/recorder/injected/rollup.config.mjs +0 -20
  400. package/front_end/panels/timeline/EasterEgg.d.ts +0 -6
  401. package/front_end/panels/timeline/easter-egg-tsconfig.json +0 -8
  402. package/front_end/panels/timeline/enable-easter-egg.js +0 -20
  403. package/front_end/third_party/acorn/acorn-tsconfig.json +0 -12
  404. package/front_end/third_party/acorn/estree-tsconfig.json +0 -8
  405. package/front_end/third_party/chromium/client-variations/client-variations-tsconfig.json +0 -8
  406. package/front_end/third_party/codemirror/codemirror-legacy-types-tsconfig.json +0 -8
  407. package/front_end/third_party/codemirror/codemirror-tsconfig.json +0 -15
  408. package/front_end/third_party/codemirror.next/bundle-tsconfig.json +0 -24
  409. package/front_end/third_party/intl-messageformat/intl-messageformat-tsconfig.json +0 -16
  410. package/front_end/third_party/json5/json5-tsconfig.json +0 -8
  411. package/front_end/third_party/legacy-javascript/legacy-javascript-tsconfig.json +0 -8
  412. package/front_end/third_party/lighthouse/lighthouse-tsconfig.json +0 -11
  413. package/front_end/third_party/lighthouse/report/bundle-tsconfig.json +0 -8
  414. package/front_end/third_party/lit/lit-tsconfig.json +0 -15
  415. package/front_end/third_party/marked/marked-tsconfig.json +0 -8
  416. package/front_end/third_party/puppeteer-replay/puppeteer-replay-tsconfig.json +0 -8
  417. package/front_end/third_party/third-party-web/third-party-web-tsconfig.json +0 -8
  418. package/front_end/third_party/wasmparser/wasmparser-tsconfig.json +0 -9
  419. package/front_end/third_party/web-vitals/web-vitals-tsconfig.json +0 -47
  420. package/front_end/ui/legacy/components/perf_ui/BrickBreaker.ts +0 -606
  421. package/inspector_overlay/loadCSS.rollup.js +0 -29
@@ -0,0 +1,128 @@
1
+ // Copyright 2026 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import * as Common from '../../core/common/common.js';
6
+ import * as Host from '../../core/host/host.js';
7
+ import * as SDK from '../../core/sdk/sdk.js';
8
+ import type * as Protocol from '../../generated/protocol.js';
9
+ import type * as Logs from '../logs/logs.js';
10
+
11
+ import * as CommentManager from './CommentManager.js';
12
+
13
+ export interface CommentThread {
14
+ id: string;
15
+ text: string;
16
+ networkRequestId?: string;
17
+ backendNodeId?: number;
18
+ editor?: CommentManager.EditorAnchorSignature;
19
+ }
20
+
21
+ export interface RevealTarget {
22
+ networkRequestId?: string;
23
+ backendNodeId?: number;
24
+ }
25
+
26
+ export const enum Events {
27
+ COMMENT_THREADS_CHANGED = 'CommentThreadsChanged',
28
+ }
29
+
30
+ export interface EventTypes {
31
+ [Events.COMMENT_THREADS_CHANGED]: void;
32
+ }
33
+
34
+ /**
35
+ * Headless model bridge connecting DevTools comments subsystem to CD4A.
36
+ * Provides serialization, transmission state tracking, and element reveal capabilities.
37
+ */
38
+ export class CD4ABridge extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
39
+ readonly #commentManager: CommentManager.CommentManager;
40
+ readonly #targetManager?: SDK.TargetManager.TargetManager;
41
+ readonly #networkLog?: Logs.NetworkLog.NetworkLog;
42
+ readonly #inspectorFrontendHost: Host.InspectorFrontendHostAPI.InspectorFrontendHostAPI;
43
+ readonly #eventListeners: Common.EventTarget.EventDescriptor[];
44
+
45
+ constructor(
46
+ commentManager: CommentManager.CommentManager,
47
+ targetManager?: SDK.TargetManager.TargetManager,
48
+ networkLog?: Logs.NetworkLog.NetworkLog,
49
+ inspectorFrontendHost: Host.InspectorFrontendHostAPI.InspectorFrontendHostAPI =
50
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance,
51
+ ) {
52
+ super();
53
+ this.#commentManager = commentManager;
54
+ this.#targetManager = targetManager;
55
+ this.#networkLog = networkLog;
56
+ this.#inspectorFrontendHost = inspectorFrontendHost;
57
+
58
+ this.#eventListeners = [
59
+ this.#commentManager.addEventListener(
60
+ CommentManager.Events.COMMENT_THREADS_CHANGED,
61
+ () => {
62
+ this.dispatchEventToListeners(Events.COMMENT_THREADS_CHANGED);
63
+ },
64
+ ),
65
+ ];
66
+ }
67
+
68
+ dispose(): void {
69
+ Common.EventTarget.removeEventListeners(this.#eventListeners);
70
+ }
71
+
72
+ getCommentThreads(): CommentThread[] {
73
+ const threads = this.#commentManager.takeComments();
74
+ return threads.map(thread => {
75
+ const threadPayload: CommentThread = {
76
+ id: thread.id,
77
+ text: thread.comments[0]?.text ?? '',
78
+ };
79
+ if (thread.anchor.networkRequestId) {
80
+ threadPayload.networkRequestId = thread.anchor.networkRequestId;
81
+ }
82
+ if (thread.anchor.node) {
83
+ threadPayload.backendNodeId = thread.anchor.node.backendNodeId;
84
+ }
85
+ if (thread.anchor.editor) {
86
+ threadPayload.editor = thread.anchor.editor;
87
+ }
88
+ return threadPayload;
89
+ });
90
+ }
91
+
92
+ takeComments(): CommentThread[] {
93
+ return this.getCommentThreads();
94
+ }
95
+
96
+ resolveCommentThread(threadId: string, replyText?: string): boolean {
97
+ return this.#commentManager.resolveCommentThread(threadId, replyText);
98
+ }
99
+
100
+ async reveal(panelName: string, target?: RevealTarget): Promise<void> {
101
+ if (panelName) {
102
+ this.#inspectorFrontendHost.events.dispatchEventToListeners(
103
+ Host.InspectorFrontendHostAPI.Events.ShowPanel,
104
+ panelName,
105
+ );
106
+ }
107
+
108
+ if (target?.networkRequestId && this.#networkLog) {
109
+ const [request] = this.#networkLog.requestsForId(target.networkRequestId);
110
+ if (request) {
111
+ await Common.Revealer.reveal(request);
112
+ }
113
+ }
114
+
115
+ if (target?.backendNodeId !== undefined && this.#targetManager) {
116
+ const primaryTarget = this.#targetManager.primaryPageTarget();
117
+ const domModel = primaryTarget?.model(SDK.DOMModel.DOMModel);
118
+ if (domModel) {
119
+ const cdpNodeId = target.backendNodeId as Protocol.DOM.BackendNodeId;
120
+ const nodeMap = await domModel.pushNodesByBackendIdsToFrontend(new Set([cdpNodeId]));
121
+ const node = nodeMap?.get(cdpNodeId);
122
+ if (node) {
123
+ await Common.Revealer.reveal(node);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
@@ -11,6 +11,13 @@ export interface EditorAnchorSignature {
11
11
  filePath?: string;
12
12
  }
13
13
 
14
+ export interface DOMNodeAnchorSignature {
15
+ /** Backend NodeId for DOM nodes (`data-backend-node-id`) */
16
+ backendNodeId: number;
17
+ /** Target ID associated with the DOM node (`data-target-id`) */
18
+ targetId: string;
19
+ }
20
+
14
21
  export interface CommentAnchorSignature {
15
22
  /** Visual logging tree path, e.g. "Panel: elements > Pane: styles > TreeOutline > TreeItem: color" */
16
23
  vePath: string;
@@ -22,8 +29,8 @@ export interface CommentAnchorSignature {
22
29
  siblingIndex?: number;
23
30
  /** Optional backend RequestId for Network panel elements (`data-network-request-id`) */
24
31
  networkRequestId?: string;
25
- /** Optional backend NodeId for Elements panel DOM nodes (`data-backend-node-id`) */
26
- backendNodeId?: number;
32
+ /** Optional DOM node identifiers (`data-backend-node-id`, `data-target-id`) */
33
+ node?: DOMNodeAnchorSignature;
27
34
  /** Optional editor anchor coordinates for CodeMirror text editors */
28
35
  editor?: EditorAnchorSignature;
29
36
  }
@@ -39,7 +46,9 @@ export interface CommentThread {
39
46
  anchor: CommentAnchorSignature;
40
47
  comments: Comment[];
41
48
  status: 'ACTIVE'|'RESOLVED';
49
+ transmitted?: boolean;
42
50
  changes?: Array<Record<string, unknown>>;
51
+ index: number;
43
52
  }
44
53
 
45
54
  export const enum Events {
@@ -78,17 +87,21 @@ export class CommentManager extends Common.ObjectWrapper.ObjectWrapper<EventType
78
87
  author: 'DEVELOPER'|'AGENT' = 'DEVELOPER',
79
88
  changes?: Array<Record<string, unknown>>,
80
89
  ): CommentThread {
81
- const id = `comment-${this.#nextId++}`;
90
+ const index = this.#nextId++;
91
+ const id = `comment-${index}`;
92
+ const comment: Comment = {
93
+ author,
94
+ text,
95
+ timestamp: Date.now(),
96
+ };
82
97
  const thread: CommentThread = {
83
98
  id,
84
99
  anchor,
85
- comments: [{
86
- author,
87
- text,
88
- timestamp: Date.now(),
89
- }],
100
+ comments: [comment],
90
101
  status: 'ACTIVE',
102
+ transmitted: false,
91
103
  changes,
104
+ index,
92
105
  };
93
106
 
94
107
  this.#commentThreads.set(id, thread);
@@ -104,6 +117,35 @@ export class CommentManager extends Common.ObjectWrapper.ObjectWrapper<EventType
104
117
  return Array.from(this.#commentThreads.values());
105
118
  }
106
119
 
120
+ takeComments(): CommentThread[] {
121
+ const threads: CommentThread[] = [];
122
+ for (const thread of this.#commentThreads.values()) {
123
+ if (!thread.transmitted) {
124
+ thread.transmitted = true;
125
+ threads.push(thread);
126
+ }
127
+ }
128
+ return threads;
129
+ }
130
+
131
+ resolveCommentThread(threadId: string, replyText?: string): boolean {
132
+ const thread = this.#commentThreads.get(threadId);
133
+ if (!thread) {
134
+ return false;
135
+ }
136
+ if (replyText && replyText.trim().length > 0) {
137
+ const comment: Comment = {
138
+ author: 'AGENT',
139
+ text: replyText.trim(),
140
+ timestamp: Date.now(),
141
+ };
142
+ thread.comments.push(comment);
143
+ }
144
+ thread.status = 'RESOLVED';
145
+ this.dispatchEventToListeners(Events.COMMENT_THREADS_CHANGED, this.getCommentThreads());
146
+ return true;
147
+ }
148
+
107
149
  removeCommentThread(id: string): void {
108
150
  if (!this.#commentThreads.has(id)) {
109
151
  return;
@@ -2,8 +2,10 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
+ import * as CD4ABridge from './CD4ABridge.js';
5
6
  import * as CommentManager from './CommentManager.js';
6
7
 
7
8
  export {
9
+ CD4ABridge,
8
10
  CommentManager,
9
11
  };
@@ -8,10 +8,8 @@ import * as i18n from '../../core/i18n/i18n.js';
8
8
  import * as Platform from '../../core/platform/platform.js';
9
9
  import * as Root from '../../core/root/root.js';
10
10
  import * as SDK from '../../core/sdk/sdk.js';
11
- import * as TextUtils from '../../core/text_utils/text_utils.js';
12
11
  import * as Protocol from '../../generated/protocol.js';
13
12
  import * as Geometry from '../geometry/geometry.js';
14
- import * as Workspace from '../workspace/workspace.js';
15
13
 
16
14
  import {
17
15
  type Cutout,
@@ -128,19 +126,17 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
128
126
  readonly #targetManager: SDK.TargetManager.TargetManager;
129
127
  readonly #settings: Common.Settings.Settings;
130
128
  readonly #multitargetNetworkManager: SDK.NetworkManager.MultitargetNetworkManager;
131
- readonly #fileManager: Workspace.FileManager.FileManager;
129
+ #lastScreenshotBlobUrl: string|null = null;
132
130
 
133
131
  constructor(
134
132
  targetManager: SDK.TargetManager.TargetManager,
135
133
  settings: Common.Settings.Settings,
136
134
  multitargetNetworkManager: SDK.NetworkManager.MultitargetNetworkManager,
137
- fileManager: Workspace.FileManager.FileManager,
138
135
  ) {
139
136
  super();
140
137
  this.#targetManager = targetManager;
141
138
  this.#settings = settings;
142
139
  this.#multitargetNetworkManager = multitargetNetworkManager;
143
- this.#fileManager = fileManager;
144
140
  this.#screenRect = new Rect(0, 0, 1, 1);
145
141
  this.#visiblePageRect = new Rect(0, 0, 1, 1);
146
142
  this.#availableSize = new Geometry.Size(1, 1);
@@ -209,8 +205,6 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
209
205
  Common.Settings.Settings.instance(),
210
206
  // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
211
207
  SDK.NetworkManager.MultitargetNetworkManager.instance(),
212
- // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
213
- Workspace.FileManager.FileManager.instance(),
214
208
  ));
215
209
  }
216
210
 
@@ -241,6 +235,7 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
241
235
 
242
236
  dispose(): void {
243
237
  this.#targetManager.unobserveModels(SDK.EmulationModel.EmulationModel, this);
238
+ this.#revokeLastScreenshotBlobUrl();
244
239
  }
245
240
 
246
241
  static widthValidator(value: string): {
@@ -357,6 +352,8 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
357
352
 
358
353
  if (type !== Type.None) {
359
354
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.DeviceModeEnabled);
355
+ } else {
356
+ this.#revokeLastScreenshotBlobUrl();
360
357
  }
361
358
  this.calculateAndEmulate(resetPageScaleFactor);
362
359
  }
@@ -499,7 +496,7 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
499
496
  const resourceTreeModel = emulationModel.target().model(SDK.ResourceTreeModel.ResourceTreeModel);
500
497
  if (resourceTreeModel) {
501
498
  resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.FrameResized, this.onFrameChange, this);
502
- resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.FrameNavigated, this.onFrameChange, this);
499
+ resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.FrameNavigated, this.onFrameNavigated, this);
503
500
  }
504
501
  } else {
505
502
  void emulationModel.emulateTouch(this.#touchEnabled, this.#touchMobile);
@@ -511,8 +508,14 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
511
508
  emulationModel.removeEventListener(
512
509
  SDK.EmulationModel.EmulationModelEvents.SCREEN_ORIENTATION_LOCK_CHANGED, this.onScreenOrientationLockChanged,
513
510
  this);
511
+ const resourceTreeModel = emulationModel.target().model(SDK.ResourceTreeModel.ResourceTreeModel);
512
+ if (resourceTreeModel) {
513
+ resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.FrameResized, this.onFrameChange, this);
514
+ resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.FrameNavigated, this.onFrameNavigated, this);
515
+ }
514
516
  this.#emulationModel = null;
515
517
  this.#screenOrientationLocked = false;
518
+ this.#revokeLastScreenshotBlobUrl();
516
519
  this.dispatchEventToListeners(Events.UPDATED);
517
520
  }
518
521
  }
@@ -530,6 +533,13 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
530
533
  this.showDeviceOverlaysIfApplicable(overlayModel);
531
534
  }
532
535
 
536
+ private onFrameNavigated(event: Common.EventTarget.EventTargetEvent<SDK.ResourceTreeModel.ResourceTreeFrame>): void {
537
+ if (event.data.isMainFrame()) {
538
+ this.#revokeLastScreenshotBlobUrl();
539
+ }
540
+ this.onFrameChange();
541
+ }
542
+
533
543
  private onScreenOrientationLockChanged(
534
544
  event: Common.EventTarget.EventTargetEvent<SDK.EmulationModel.ScreenOrientationLockChangedEvent>): void {
535
545
  this.#screenOrientationLocked = event.data.locked;
@@ -934,54 +944,34 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
934
944
  });
935
945
  }
936
946
 
937
- private async saveScreenshot(canvas: OffscreenCanvas): Promise<void> {
947
+ async saveScreenshot(canvas: OffscreenCanvas): Promise<void> {
938
948
  const url = this.inspectedURL();
939
- let baseName = '';
949
+ let fileName = '';
940
950
  if (url) {
941
- const parsedURL = Common.ParsedURL.ParsedURL.fromString(url);
942
- if (parsedURL) {
943
- const host = parsedURL.host;
944
- const path = parsedURL.path.replace(/^\/+/, '').replace(/\/+$/, '');
945
- baseName = host;
946
- if (path) {
947
- baseName += '-' + path.replaceAll('/', '-');
948
- }
949
- baseName = baseName.replace(/[^a-z0-9._-]/gi, '_');
950
- }
951
- }
952
-
953
- if (!baseName) {
954
- baseName = 'screenshot';
951
+ const withoutFragment = Platform.StringUtilities.removeURLFragment(url);
952
+ fileName = Platform.StringUtilities.trimURL(withoutFragment);
955
953
  }
956
954
 
957
- let suffix = '';
958
955
  const device = this.device();
959
956
  if (device && this.type() === Type.Device) {
960
- suffix += `(${device.title})`;
957
+ fileName += `(${device.title})`;
961
958
  }
962
- suffix += '.png';
963
-
964
- // The Windows save dialog / Chrome wrapper limits the suggested filename
965
- // to 63 characters (due to a 64-byte null-terminated buffer).
966
- // Capping the total filename length at 63 avoids truncation of the extension.
967
- const maxBaseNameLength = Math.max(0, 63 - suffix.length);
968
- baseName = Platform.StringUtilities.truncateToCodeUnitLength(baseName, maxBaseNameLength);
959
+ this.#revokeLastScreenshotBlobUrl();
960
+ /* eslint-disable-next-line @devtools/no-imperative-dom-api */
961
+ const link = document.createElement('a');
962
+ link.download = fileName + '.png';
963
+ const blob = await canvas.convertToBlob({type: 'image/png'});
964
+ const blobUrl = URL.createObjectURL(blob);
965
+ this.#lastScreenshotBlobUrl = blobUrl;
966
+ link.href = blobUrl;
967
+ link.click();
968
+ }
969
969
 
970
- let fileName = baseName + suffix;
971
- if (fileName.length > 63) {
972
- fileName = Platform.StringUtilities.truncateToCodeUnitLength(fileName, 59) + '.png';
970
+ #revokeLastScreenshotBlobUrl(): void {
971
+ if (this.#lastScreenshotBlobUrl) {
972
+ URL.revokeObjectURL(this.#lastScreenshotBlobUrl);
973
+ this.#lastScreenshotBlobUrl = null;
973
974
  }
974
- const blob = await canvas.convertToBlob({type: 'image/png'});
975
- const dataUrl = await new Promise<string>((resolve, reject) => {
976
- const reader = new FileReader();
977
- reader.onloadend = () => resolve(reader.result as string);
978
- reader.onerror = reject;
979
- reader.readAsDataURL(blob);
980
- });
981
- const base64 = dataUrl.slice(dataUrl.indexOf(',') + 1);
982
- const contentData = new TextUtils.ContentData.ContentData(base64, /* isBase64=*/ true, 'image/png');
983
- await this.#fileManager.save(fileName as Platform.DevToolsPath.RawPathString, contentData, /* forceSaveAs=*/ true);
984
- this.#fileManager.close(fileName as Platform.DevToolsPath.RawPathString);
985
975
  }
986
976
 
987
977
  private applyTouch(touchEnabled: boolean, mobile: boolean): void {
@@ -6662,7 +6662,7 @@ export const NativeFunctions: readonly NativeFunctionValue[] = [
6662
6662
  },
6663
6663
  {
6664
6664
  name: "WebSocket",
6665
- signatures: [["url","?protocols"]]
6665
+ signatures: [["url","?protocolsOrOptions"]]
6666
6666
  },
6667
6667
  {
6668
6668
  name: "WebSocketError",
@@ -6812,6 +6812,10 @@ export const NativeFunctions: readonly NativeFunctionValue[] = [
6812
6812
  name: "provokingVertexWEBGL",
6813
6813
  signatures: [["provokeMode"]]
6814
6814
  },
6815
+ {
6816
+ name: "drawingBufferToneMapping",
6817
+ signatures: [["?toneMapping"]]
6818
+ },
6815
6819
  {
6816
6820
  name: "texElementImage2D",
6817
6821
  signatures: [["target","internalformat","element","?config"]]
@@ -8734,6 +8738,10 @@ export const NativeFunctions: readonly NativeFunctionValue[] = [
8734
8738
  name: "CanvasPaintEvent",
8735
8739
  signatures: [["type","?eventInitDict"]]
8736
8740
  },
8741
+ {
8742
+ name: "ElementGeometryUpdateEvent",
8743
+ signatures: [["type","?eventInitDict"]]
8744
+ },
8737
8745
  {
8738
8746
  name: "captureElementImage",
8739
8747
  signatures: [["element"]]
@@ -2,4 +2,4 @@
2
2
 
3
3
  [`web-vitals`](https://github.com/GoogleChrome/web-vitals) is a Google-maintained library that measures CWV metrics using their canonical definition. We use it to ensure we are using consistent implementations for measuring CWV across Google. It can also measure performance metrics of the current page *after* the they happen (See [`PerformanceObserver` buffered setting](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver/observe#buffered)). See [go/cpq:rpp-metric-observations](http://go/cpq:rpp-metric-observations) for more information.
4
4
 
5
- The web-vitals library needs to be run in the target page (although it can be used in an isolated execution context). We therefore need to create a JS binary that can be injected via `Page.evaluate`/`Page.addScriptToEvaluateOnNewDocument`. See `BUILD.gn` and `rollup.config.mjs` for how we bundle the JS binary.
5
+ The web-vitals library needs to be run in the target page (although it can be used in an isolated execution context). We therefore need to create a JS binary that can be injected via `Page.evaluate`/`Page.addScriptToEvaluateOnNewDocument`. See `BUILD.gn` for how we bundle the JS binary.
@@ -385,11 +385,12 @@ export const resolveScopeChain =
385
385
  // 2) We have a chrome feature flag.
386
386
 
387
387
  if (callFrame.script.isWasm()) {
388
- return callFrame.scopeChain();
388
+ return callFrame.scopeChain().filter(scope => !scope.empty());
389
389
  }
390
390
  const thisObject = await resolveThisObject(callFrame, debuggerWorkspaceBinding);
391
- return callFrame.scopeChain().map(
392
- scope => new ScopeWithSourceMappedVariables(scope, thisObject, debuggerWorkspaceBinding));
391
+ const scopes = callFrame.scopeChain().filter(scope => !scope.empty() ||
392
+ scope.type() === Protocol.Debugger.ScopeType.Local);
393
+ return scopes.map(scope => new ScopeWithSourceMappedVariables(scope, thisObject, debuggerWorkspaceBinding));
393
394
  };
394
395
 
395
396
  /**
@@ -411,7 +412,7 @@ export const allVariablesInCallFrame = async(
411
412
  return cachedMap;
412
413
  }
413
414
 
414
- const scopeChain = callFrame.scopeChain();
415
+ const scopeChain = callFrame.scopeChain().filter(scope => !scope.empty());
415
416
  const nameMappings =
416
417
  await Promise.all(scopeChain.map(scope => resolveDebuggerScope(scope, debuggerWorkspaceBinding)));
417
418
  const reverseMapping = new Map<string, string|null>();
@@ -485,12 +486,13 @@ export const resolveThisObject = async(
485
486
  callFrame: SDK.DebuggerModel.CallFrame,
486
487
  debuggerWorkspaceBinding:
487
488
  Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding): Promise<SDK.RemoteObject.RemoteObject|null> => {
488
- const scopeChain = callFrame.scopeChain();
489
- if (scopeChain.length === 0) {
489
+ const innermostScope =
490
+ callFrame.scopeChain().find(scope => !scope.empty() || scope.type() === Protocol.Debugger.ScopeType.Local);
491
+ if (!innermostScope) {
490
492
  return callFrame.thisObject();
491
493
  }
492
494
 
493
- const {thisMapping} = await resolveDebuggerScope(scopeChain[0], debuggerWorkspaceBinding);
495
+ const {thisMapping} = await resolveDebuggerScope(innermostScope, debuggerWorkspaceBinding);
494
496
  if (!thisMapping) {
495
497
  return callFrame.thisObject();
496
498
  }
@@ -110,6 +110,8 @@ export class Model extends EventTarget {
110
110
  }
111
111
  const file = this.#storeAndCreateParsedTraceFile(
112
112
  syntheticEventsManager, traceEvents, metadata, this.#processor.data, this.#processor.insights);
113
+ // Reclaim memory used by the temporary event-to-index lookup map now that trace parsing is complete.
114
+ syntheticEventsManager.clearRegistrationIndex();
113
115
  // We only push the file onto this.#traces here once we know it's valid
114
116
  // and there's been no errors in the parsing.
115
117
  this.#traces.push(file);
@@ -208,7 +208,7 @@ export class TraceProcessor extends EventTarget {
208
208
  // Handle each event.
209
209
  for (let i = 0; i < traceEvents.length; ++i) {
210
210
  // Every so often we take a break just to render.
211
- if (i % eventsPerChunk === 0 && i) {
211
+ if (options.yieldToMain !== false && i % eventsPerChunk === 0 && i) {
212
212
  // Take the opportunity to provide status update events.
213
213
  const percent = calculateProgress(i / traceEvents.length, ProgressPhase.HANDLE_EVENT);
214
214
  this.dispatchEvent(new TraceParseProgressEvent({percent}));
@@ -233,9 +233,11 @@ export class TraceProcessor extends EventTarget {
233
233
  const [name, handler] = sortedHandlers[i];
234
234
  if (handler.finalize) {
235
235
  options.logger?.start(`parse:${name}:finalize`);
236
- // Yield to the UI because finalize() calls can be expensive
237
- // TODO(jacktfranklin): consider using `scheduler.yield()` or `scheduler.postTask(() => {}, {priority: 'user-blocking'})`
238
- await new Promise(resolve => setTimeout(resolve, 0));
236
+ if (options.yieldToMain !== false) {
237
+ // Yield to the UI because finalize() calls can be expensive
238
+ // TODO(jacktfranklin): consider using `scheduler.yield()` or `scheduler.postTask(() => {}, {priority: 'user-blocking'})`
239
+ await new Promise(resolve => setTimeout(resolve, 0));
240
+ }
239
241
  await handler.finalize(finalizeOptions);
240
242
  options.logger?.end(`parse:${name}:finalize`);
241
243
  }
@@ -62,9 +62,9 @@ export async function finalize(): Promise<void> {
62
62
  updateLayerEvents.push(event);
63
63
  } else if (Types.Events.isPaint(event)) {
64
64
  if (!event.args.data.layerId) {
65
- // Note that this check purposefully includes excluding an event with a layerId of 0.
66
- // 0 indicates that this paint was for a subframe - we do not want these
67
- // as we only care about paints for top level frames.
65
+ // A layerId of 0 means that this event cannot be associated with a
66
+ // compositor layer. This includes modern Paint duration events and
67
+ // older Paint events for subframes.
68
68
  continue;
69
69
  }
70
70
  paintEvents.push(event);
@@ -37,7 +37,7 @@ import type {HandlerName} from './types.js';
37
37
  // score for the given recording, and almost certainly not the
38
38
  // navigation-to-unload CLS score.
39
39
 
40
- interface LayoutShiftsData {
40
+ export interface LayoutShiftsData {
41
41
  clusters: readonly Types.Events.SyntheticLayoutShiftCluster[];
42
42
  sessionMaxScore: number;
43
43
  // The session window which contains the SessionMaxScore
@@ -54,13 +54,35 @@ export class SyntheticEventsManager {
54
54
  this.#rawTraceEvents = rawEvents;
55
55
  }
56
56
 
57
+ #rawEventIndexes: Map<Types.Events.Event, number>|null = null;
58
+
59
+ #getRawEventIndex(event: Types.Events.Event): number {
60
+ if (!this.#rawEventIndexes) {
61
+ this.#rawEventIndexes = new Map();
62
+ for (let i = 0; i < this.#rawTraceEvents.length; i++) {
63
+ this.#rawEventIndexes.set(this.#rawTraceEvents[i], i);
64
+ }
65
+ }
66
+ return this.#rawEventIndexes.get(event) ?? -1;
67
+ }
68
+
69
+ /**
70
+ * Clears the transient raw event index map.
71
+ * During trace parsing, this map provides O(1) lookups for registering synthetic events.
72
+ * Once parsing is complete, queries look up synthetic events exclusively by index in
73
+ * `#syntheticTraces`, so this map is discarded to reclaim memory.
74
+ */
75
+ clearRegistrationIndex(): void {
76
+ this.#rawEventIndexes = null;
77
+ }
78
+
57
79
  /**
58
80
  * Registers and returns a branded synthetic event. Synthetic events need to
59
81
  * be created with this method to ensure they are registered and made
60
82
  * available to load events using serialized keys.
61
83
  */
62
84
  #registerSyntheticEvent<T extends Types.Events.SyntheticBased>(syntheticEvent: Omit<T, '_tag'>): T {
63
- const rawIndex = this.#rawTraceEvents.indexOf(syntheticEvent.rawSourceEvent);
85
+ const rawIndex = this.#getRawEventIndex(syntheticEvent.rawSourceEvent);
64
86
  if (rawIndex < 0) {
65
87
  throw new Error('Attempted to register a synthetic event paired to an unknown raw event.');
66
88
  }
@@ -73,6 +73,13 @@ export interface ParseOptions {
73
73
  * @default false
74
74
  */
75
75
  isFreshRecording?: boolean;
76
+ /**
77
+ * Whether the processor should yield to the main thread during parsing to keep the UI responsive.
78
+ * This should always remain enabled in production to prevent blocking the UI, but can be disabled
79
+ * in unit tests to speed up test execution.
80
+ * @default true
81
+ */
82
+ yieldToMain?: boolean;
76
83
  /**
77
84
  * If the trace is a CPU Profile rather than a Chrome tracing trace.
78
85
  * @default false
@@ -2628,8 +2628,8 @@ export function isUpdateLayer(event: Event): event is UpdateLayer {
2628
2628
  return event.name === Name.UPDATE_LAYER;
2629
2629
  }
2630
2630
 
2631
- export interface DisplayItemListSnapshot extends Event {
2632
- name: Name.DISPLAY_ITEM_LIST_SNAPSHOT;
2631
+ export interface LegacyDisplayItemListSnapshot extends Event {
2632
+ name: Name.LEGACY_DISPLAY_ITEM_LIST_SNAPSHOT;
2633
2633
  ph: Phase.OBJECT_SNAPSHOT;
2634
2634
  id2: {
2635
2635
  local?: string,
@@ -2638,14 +2638,29 @@ export interface DisplayItemListSnapshot extends Event {
2638
2638
  snapshot: {
2639
2639
  skp64: string,
2640
2640
  params?: {
2641
+ layer_rect: [number, number, number, number],
2642
+ },
2643
+ },
2644
+ };
2645
+ }
2641
2646
 
2647
+ export interface InstantDisplayItemListSnapshot extends Instant {
2648
+ name: Name.DISPLAY_ITEM_LIST_SNAPSHOT;
2649
+ args: Args&{
2650
+ snapshot: {
2651
+ skp64: string,
2652
+ params?: {
2642
2653
  layer_rect: [number, number, number, number],
2643
2654
  },
2644
2655
  },
2645
2656
  };
2646
2657
  }
2658
+
2659
+ export type DisplayItemListSnapshot = LegacyDisplayItemListSnapshot|InstantDisplayItemListSnapshot;
2660
+
2647
2661
  export function isDisplayListItemListSnapshot(event: Event): event is DisplayItemListSnapshot {
2648
- return event.name === Name.DISPLAY_ITEM_LIST_SNAPSHOT;
2662
+ return (event.name === Name.LEGACY_DISPLAY_ITEM_LIST_SNAPSHOT && event.ph === Phase.OBJECT_SNAPSHOT) ||
2663
+ (event.name === Name.DISPLAY_ITEM_LIST_SNAPSHOT && event.ph === Phase.INSTANT);
2649
2664
  }
2650
2665
 
2651
2666
  export interface LayerTreeHostImplSnapshot extends Event {
@@ -3246,7 +3261,8 @@ export const enum Name {
3246
3261
  LAZY_PIXEL_REF = 'LazyPixelRef',
3247
3262
  LAYER_TREE_HOST_IMPL_SNAPSHOT = 'cc::LayerTreeHostImpl',
3248
3263
  PICTURE_SNAPSHOT = 'cc::Picture',
3249
- DISPLAY_ITEM_LIST_SNAPSHOT = 'cc::DisplayItemList',
3264
+ LEGACY_DISPLAY_ITEM_LIST_SNAPSHOT = 'cc::DisplayItemList',
3265
+ DISPLAY_ITEM_LIST_SNAPSHOT = 'cc::DisplayItemList:snapshot',
3250
3266
  INPUT_LATENCY_MOUSE_MOVE = 'InputLatency::MouseMove',
3251
3267
  INPUT_LATENCY_MOUSE_WHEEL = 'InputLatency::MouseWheel',
3252
3268
  IMPL_SIDE_FLING = 'InputHandlerProxy::HandleGestureFling::started',