chrome-devtools-frontend 1.0.1657855 → 1.0.1661063

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 (370) hide show
  1. package/.agents/skills/evaluate-ai-css-completion/SKILL.md +133 -0
  2. package/.agents/skills/evaluate-ai-css-completion/scripts/evaluate.js +76 -0
  3. package/.agents/skills/migrate-chromium-test/SKILL.md +15 -70
  4. package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +37 -18
  5. package/.agents/skills/version-control/SKILL.md +8 -1
  6. package/AUTHORS +1 -0
  7. package/SECURITY.md +3 -0
  8. package/docs/get_the_code.md +6 -0
  9. package/eslint.config.mjs +7 -0
  10. package/extension-api/ExtensionAPI.d.ts +88 -0
  11. package/front_end/Tests.js +6 -6
  12. package/front_end/core/common/Gzip.ts +12 -5
  13. package/front_end/core/host/AidaClient.ts +35 -9
  14. package/front_end/core/host/GdpClient.ts +10 -7
  15. package/front_end/core/host/InspectorFrontendHost.ts +1 -0
  16. package/front_end/core/host/InspectorFrontendHostStub.ts +2 -0
  17. package/front_end/core/platform/StringUtilities.ts +55 -4
  18. package/front_end/core/sdk/AccessibilityModel.snapshot.txt +17 -0
  19. package/front_end/core/sdk/AccessibilityModel.ts +132 -2
  20. package/front_end/core/sdk/CPUThrottlingManager.ts +10 -5
  21. package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +2 -5
  22. package/front_end/core/sdk/ConsoleModel.ts +5 -5
  23. package/front_end/core/sdk/DOMDebuggerModel.ts +7 -1
  24. package/front_end/core/sdk/DOMModel.ts +33 -18
  25. package/front_end/core/sdk/DebuggerModel.ts +4 -4
  26. package/front_end/core/sdk/EventBreakpointsModel.ts +2 -0
  27. package/front_end/core/sdk/FrameManager.ts +1 -0
  28. package/front_end/core/sdk/IsolateManager.ts +1 -0
  29. package/front_end/core/sdk/NetworkManager.ts +59 -11
  30. package/front_end/core/sdk/NetworkRequest.ts +38 -1
  31. package/front_end/core/sdk/OverlayModel.ts +45 -6
  32. package/front_end/core/sdk/PageResourceLoader.ts +2 -0
  33. package/front_end/core/sdk/ResourceTreeModel.ts +6 -7
  34. package/front_end/core/sdk/ScreenCaptureModel.ts +2 -2
  35. package/front_end/core/sdk/ServerTiming.ts +17 -13
  36. package/front_end/core/sdk/ServiceWorkerCacheModel.ts +4 -2
  37. package/front_end/core/sdk/ServiceWorkerManager.ts +19 -5
  38. package/front_end/core/sdk/SourceMap.ts +5 -5
  39. package/front_end/core/sdk/SourceMapManager.ts +3 -2
  40. package/front_end/core/sdk/TargetManager.ts +14 -1
  41. package/front_end/core/sdk/TraceObject.ts +4 -2
  42. package/front_end/core/sdk/sdk-meta.ts +170 -0
  43. package/front_end/design_system_tokens.css +0 -5
  44. package/front_end/entrypoints/formatter_worker/FormattedContentBuilder.ts +5 -2
  45. package/front_end/entrypoints/formatter_worker/HTMLFormatter.ts +26 -4
  46. package/front_end/entrypoints/formatter_worker/JavaScriptFormatter.ts +8 -3
  47. package/front_end/entrypoints/inspector_main/InspectorMain.ts +4 -4
  48. package/front_end/entrypoints/inspector_main/OutermostTargetSelector.ts +2 -2
  49. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +36 -37
  50. package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +15 -33
  51. package/front_end/entrypoints/js_app/js_app.ts +6 -5
  52. package/front_end/entrypoints/main/GlobalAiButton.ts +4 -4
  53. package/front_end/entrypoints/main/MainImpl.ts +20 -22
  54. package/front_end/entrypoints/main/main-meta.ts +42 -42
  55. package/front_end/entrypoints/node_app/node_app.ts +3 -2
  56. package/front_end/entrypoints/worker_app/WorkerMain.ts +1 -1
  57. package/front_end/foundation/Universe.ts +44 -1
  58. package/front_end/generated/InspectorBackendCommands.ts +2 -2
  59. package/front_end/generated/SupportedCSSProperties.js +19 -12
  60. package/front_end/generated/protocol.ts +3 -1
  61. package/front_end/models/ai_assistance/AiConversation.ts +19 -17
  62. package/front_end/models/ai_assistance/AiHistoryStorage.ts +37 -14
  63. package/front_end/models/ai_assistance/AiUtils.ts +38 -42
  64. package/front_end/models/ai_assistance/agents/AiAgent.ts +5 -1
  65. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +3 -2
  66. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +2 -1
  67. package/front_end/models/ai_assistance/agents/StorageAgent.ts +7 -5
  68. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +270 -286
  69. package/front_end/models/ai_assistance/data_formatters/UnitFormatters.ts +20 -0
  70. package/front_end/models/ai_assistance/performance/AICallTree.ts +3 -1
  71. package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +3 -2
  72. package/front_end/models/autofill_manager/AutofillManager.ts +3 -1
  73. package/front_end/models/bindings/CompilerScriptMapping.ts +7 -7
  74. package/front_end/models/bindings/ContentProviderBasedProject.ts +4 -4
  75. package/front_end/models/bindings/DebuggerLanguagePlugins.ts +5 -5
  76. package/front_end/models/bindings/DefaultScriptMapping.ts +3 -3
  77. package/front_end/models/bindings/NetworkProject.ts +5 -10
  78. package/front_end/models/bindings/PresentationConsoleMessageHelper.ts +2 -1
  79. package/front_end/models/bindings/ResourceMapping.ts +3 -4
  80. package/front_end/models/bindings/ResourceScriptMapping.ts +2 -3
  81. package/front_end/models/bindings/ResourceUtils.ts +1 -1
  82. package/front_end/models/bindings/SASSSourceMapping.ts +11 -9
  83. package/front_end/models/bindings/StylesSourceMapping.ts +3 -3
  84. package/front_end/models/bindings/TempFile.ts +8 -3
  85. package/front_end/models/emulation/EmulatedDevices.ts +389 -8
  86. package/front_end/models/extensions/ExtensionAPI.ts +116 -52
  87. package/front_end/models/extensions/LanguageExtensionEndpoint.ts +13 -12
  88. package/front_end/models/formatter/ScriptFormatter.ts +8 -11
  89. package/front_end/models/issues_manager/BounceTrackingIssue.ts +1 -1
  90. package/front_end/models/issues_manager/ClientHintIssue.ts +1 -1
  91. package/front_end/models/issues_manager/ConnectionAllowlistIssue.ts +1 -1
  92. package/front_end/models/issues_manager/ContentSecurityPolicyIssue.ts +7 -7
  93. package/front_end/models/issues_manager/CookieDeprecationMetadataIssue.ts +2 -2
  94. package/front_end/models/issues_manager/CookieIssue.ts +27 -16
  95. package/front_end/models/issues_manager/CorsIssue.ts +3 -3
  96. package/front_end/models/issues_manager/CrossOriginEmbedderPolicyIssue.ts +2 -2
  97. package/front_end/models/issues_manager/DeprecationIssue.ts +3 -3
  98. package/front_end/models/issues_manager/EmailVerificationRequestIssue.ts +1 -1
  99. package/front_end/models/issues_manager/FederatedAuthRequestIssue.ts +1 -1
  100. package/front_end/models/issues_manager/FederatedAuthUserInfoRequestIssue.ts +1 -1
  101. package/front_end/models/issues_manager/GenericIssue.ts +7 -7
  102. package/front_end/models/issues_manager/HeavyAdIssue.ts +3 -3
  103. package/front_end/models/issues_manager/Issue.ts +11 -12
  104. package/front_end/models/issues_manager/IssueAggregator.ts +0 -9
  105. package/front_end/models/issues_manager/IssueResolver.ts +2 -2
  106. package/front_end/models/issues_manager/IssuesManager.ts +136 -137
  107. package/front_end/models/issues_manager/MixedContentIssue.ts +1 -1
  108. package/front_end/models/issues_manager/PartitioningBlobURLIssue.ts +3 -3
  109. package/front_end/models/issues_manager/QuirksModeIssue.ts +1 -1
  110. package/front_end/models/issues_manager/SRIMessageSignatureIssue.ts +2 -2
  111. package/front_end/models/issues_manager/SelectivePermissionsInterventionIssue.ts +2 -2
  112. package/front_end/models/issues_manager/SharedArrayBufferIssue.ts +2 -2
  113. package/front_end/models/issues_manager/SharedDictionaryIssue.ts +1 -1
  114. package/front_end/models/issues_manager/UnencodedDigestIssue.ts +3 -3
  115. package/front_end/models/issues_manager/issues_manager.ts +0 -2
  116. package/front_end/models/javascript_metadata/NativeFunctions.js +5 -1
  117. package/front_end/models/persistence/AutomaticFileSystemWorkspaceBinding.ts +5 -0
  118. package/front_end/models/source_map_scopes/FunctionCodeResolver.ts +13 -10
  119. package/front_end/models/stack_trace/StackTraceModel.ts +3 -3
  120. package/front_end/models/text_utils/ContentData.ts +27 -0
  121. package/front_end/models/trace/helpers/SamplesIntegrator.ts +21 -5
  122. package/front_end/models/trace_source_maps_resolver/SourceMapsResolver.ts +29 -14
  123. package/front_end/models/web_mcp/WebMCPModel.ts +24 -6
  124. package/front_end/models/workspace/IgnoreListManager.ts +6 -6
  125. package/front_end/models/workspace/UISourceCode.ts +3 -3
  126. package/front_end/models/workspace/WorkspaceImpl.ts +10 -1
  127. package/front_end/models/workspace_diff/WorkspaceDiff.ts +10 -4
  128. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +25 -22
  129. package/front_end/panels/ai_assistance/ExportConversation.ts +3 -4
  130. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +3 -3
  131. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
  132. package/front_end/panels/ai_assistance/components/ChatMessage.ts +9 -1
  133. package/front_end/panels/ai_assistance/components/DisabledWidget.ts +2 -2
  134. package/front_end/panels/animation/AnimationTimeline.ts +17 -19
  135. package/front_end/panels/animation/AnimationUI.ts +5 -5
  136. package/front_end/panels/animation/animation-meta.ts +2 -2
  137. package/front_end/panels/application/ApplicationPanelSidebar.ts +4 -3
  138. package/front_end/panels/application/DeviceBoundSessionsView.ts +2 -6
  139. package/front_end/panels/application/FrameDetailsView.ts +1 -1
  140. package/front_end/panels/application/IndexedDBViews.ts +220 -266
  141. package/front_end/panels/application/OpenedWindowDetailsView.ts +1 -1
  142. package/front_end/panels/application/ResourcesPanel.ts +9 -2
  143. package/front_end/panels/application/ServiceWorkersView.ts +252 -211
  144. package/front_end/panels/application/StorageView.ts +97 -33
  145. package/front_end/panels/application/WebMCPView.ts +53 -44
  146. package/front_end/panels/application/components/AdsView.ts +201 -30
  147. package/front_end/panels/application/components/adsView.css +25 -0
  148. package/front_end/panels/application/indexedDBViews.css +38 -9
  149. package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +2 -2
  150. package/front_end/panels/application/preloading/helper/PreloadingForward.ts +2 -1
  151. package/front_end/panels/application/storageView.css +26 -9
  152. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +5 -1
  153. package/front_end/panels/browser_debugger/browser_debugger-meta.ts +8 -6
  154. package/front_end/panels/common/DOMLinkifier.ts +1 -1
  155. package/front_end/panels/common/ExtensionServer.ts +119 -14
  156. package/front_end/panels/console/ConsoleContextSelector.ts +1 -1
  157. package/front_end/panels/console/ConsolePinPane.ts +2 -2
  158. package/front_end/panels/console/ConsolePrompt.ts +2 -2
  159. package/front_end/panels/console/ConsoleView.ts +3 -2
  160. package/front_end/panels/console/PromptBuilder.ts +2 -1
  161. package/front_end/panels/console/SymbolizedErrorWidget.ts +2 -1
  162. package/front_end/panels/console_counters/WarningErrorCounter.ts +2 -2
  163. package/front_end/panels/coverage/CoverageListView.ts +28 -28
  164. package/front_end/panels/coverage/CoverageModel.ts +2 -1
  165. package/front_end/panels/coverage/CoverageView.ts +22 -22
  166. package/front_end/panels/coverage/coverage-meta.ts +5 -5
  167. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +36 -36
  168. package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +1 -1
  169. package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +2 -2
  170. package/front_end/panels/css_overview/CSSOverviewStartView.ts +6 -6
  171. package/front_end/panels/css_overview/CSSOverviewUnusedDeclarations.ts +6 -6
  172. package/front_end/panels/css_overview/css_overview-meta.ts +2 -2
  173. package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +1 -1
  174. package/front_end/panels/elements/AccessibilityTreeUtils.ts +8 -102
  175. package/front_end/panels/elements/AccessibilityTreeView.ts +163 -70
  176. package/front_end/panels/elements/ElementsPanel.ts +17 -11
  177. package/front_end/panels/elements/ElementsTreeElement.ts +4 -1
  178. package/front_end/panels/elements/ElementsTreeOutline.ts +4 -4
  179. package/front_end/panels/elements/LayoutPane.ts +1 -1
  180. package/front_end/panels/elements/MetricsSidebarPane.ts +100 -34
  181. package/front_end/panels/elements/StylePropertiesSection.ts +2 -2
  182. package/front_end/panels/elements/StylePropertyTreeElement.ts +8 -2
  183. package/front_end/panels/elements/StylesSidebarPane.ts +1 -1
  184. package/front_end/panels/elements/components/AccessibilityTreeNode.ts +7 -18
  185. package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +2 -2
  186. package/front_end/panels/elements/components/QueryContainer.ts +1 -1
  187. package/front_end/panels/emulation/DeviceModeView.ts +52 -70
  188. package/front_end/panels/issues/AffectedDirectivesView.ts +1 -1
  189. package/front_end/panels/issues/AffectedResourcesView.ts +2 -1
  190. package/front_end/panels/issues/IssueView.ts +0 -2
  191. package/front_end/panels/issues/IssuesPane.ts +1 -8
  192. package/front_end/panels/js_timeline/js_timeline-meta.ts +3 -2
  193. package/front_end/panels/layer_viewer/LayerViewHost.ts +1 -1
  194. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +3 -3
  195. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +5 -5
  196. package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +4 -4
  197. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +2 -2
  198. package/front_end/panels/linear_memory_inspector/components/LinearMemoryNavigator.ts +6 -6
  199. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +3 -3
  200. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +8 -9
  201. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplayUtils.ts +2 -2
  202. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +1 -1
  203. package/front_end/panels/linear_memory_inspector/linear_memory_inspector-meta.ts +2 -2
  204. package/front_end/panels/network/NetworkDataGridNode.ts +124 -36
  205. package/front_end/panels/network/NetworkLogView.ts +9 -1
  206. package/front_end/panels/network/NetworkLogViewColumns.ts +18 -0
  207. package/front_end/panels/network/NetworkPanel.ts +2 -1
  208. package/front_end/panels/network/RequestPayloadView.ts +68 -20
  209. package/front_end/panels/network/RequestPreviewView.ts +7 -1
  210. package/front_end/panels/network/RequestTimingView.ts +95 -127
  211. package/front_end/panels/network/components/ResponseHeaderSection.ts +1 -1
  212. package/front_end/panels/network/forward/UIFilter.ts +1 -0
  213. package/front_end/panels/network/requestPayloadView.css +10 -0
  214. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +12 -12
  215. package/front_end/panels/performance_monitor/performance_monitor-meta.ts +7 -7
  216. package/front_end/panels/profiler/HeapDetachedElementsView.ts +2 -2
  217. package/front_end/panels/profiler/HeapProfileView.ts +563 -51
  218. package/front_end/panels/profiler/HeapSnapshotView.ts +14 -9
  219. package/front_end/panels/profiler/ProfilesPanel.ts +13 -7
  220. package/front_end/panels/profiler/WritableProfileHeader.ts +152 -0
  221. package/front_end/panels/profiler/profiler.ts +2 -2
  222. package/front_end/panels/recorder/{components/ControlButton.ts → ControlButton.ts} +9 -10
  223. package/front_end/panels/recorder/{components/CreateRecordingView.ts → CreateRecordingView.ts} +59 -58
  224. package/front_end/panels/recorder/ExtensionView.ts +123 -0
  225. package/front_end/panels/recorder/RecorderController.ts +102 -92
  226. package/front_end/panels/recorder/{components/RecordingListView.ts → RecordingListView.ts} +22 -23
  227. package/front_end/panels/recorder/{components/RecordingView.ts → RecordingView.ts} +99 -96
  228. package/front_end/panels/recorder/{components/ReplaySection.ts → ReplaySection.ts} +20 -20
  229. package/front_end/panels/recorder/{components/SelectorPicker.ts → SelectorPicker.ts} +13 -13
  230. package/front_end/panels/recorder/{components/StepEditor.ts → StepEditor.ts} +367 -336
  231. package/front_end/panels/recorder/{components/StepView.ts → StepView.ts} +48 -49
  232. package/front_end/panels/recorder/{components/TimelineSection.ts → TimelineSection.ts} +2 -2
  233. package/front_end/panels/recorder/models/RecorderSettings.ts +2 -2
  234. package/front_end/panels/recorder/recorder-meta.ts +7 -7
  235. package/front_end/panels/recorder/recorder.ts +23 -1
  236. package/front_end/panels/recorder/{components/recordingView.css → recordingView.css} +1 -1
  237. package/front_end/panels/recorder/util/util.ts +113 -0
  238. package/front_end/panels/screencast/ScreencastApp.ts +1 -1
  239. package/front_end/panels/screencast/ScreencastView.ts +12 -12
  240. package/front_end/panels/search/SearchResultsPane.ts +4 -4
  241. package/front_end/panels/search/SearchView.ts +20 -20
  242. package/front_end/panels/security/SecurityModel.ts +7 -7
  243. package/front_end/panels/security/SecurityPanel.ts +99 -107
  244. package/front_end/panels/security/SecurityPanelSidebar.ts +7 -7
  245. package/front_end/panels/security/security-meta.ts +2 -2
  246. package/front_end/panels/sensors/LocationsSettingsTab.ts +19 -19
  247. package/front_end/panels/sensors/SensorsView.ts +27 -27
  248. package/front_end/panels/sensors/sensors-meta.ts +13 -167
  249. package/front_end/panels/settings/AISettingsTab.ts +98 -56
  250. package/front_end/panels/settings/EditFileSystemView.ts +2 -2
  251. package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +20 -20
  252. package/front_end/panels/settings/KeybindsSettingsTab.ts +20 -21
  253. package/front_end/panels/settings/SettingsScreen.ts +11 -11
  254. package/front_end/panels/settings/WorkspaceSettingsTab.ts +5 -5
  255. package/front_end/panels/settings/components/SyncSection.ts +12 -12
  256. package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +13 -13
  257. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +31 -31
  258. package/front_end/panels/settings/emulation/emulation-meta.ts +1 -1
  259. package/front_end/panels/settings/settings-meta.ts +14 -14
  260. package/front_end/panels/sources/InplaceFormatterEditorAction.ts +2 -2
  261. package/front_end/panels/sources/NavigatorView.ts +7 -6
  262. package/front_end/panels/sources/ScopeChainSidebarPane.ts +83 -37
  263. package/front_end/panels/sources/SourcesNavigator.ts +22 -21
  264. package/front_end/panels/sources/SourcesView.ts +10 -1
  265. package/front_end/panels/sources/TabbedEditorContainer.ts +1 -1
  266. package/front_end/panels/sources/scopeChainSidebarPane.css +12 -4
  267. package/front_end/panels/sources/sources-meta.ts +4 -4
  268. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +5 -2
  269. package/front_end/panels/timeline/IsolateSelector.ts +10 -8
  270. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +2 -1
  271. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +2 -1
  272. package/front_end/panels/timeline/TimelineFlameChartView.ts +1 -1
  273. package/front_end/panels/timeline/TimelinePanel.ts +20 -8
  274. package/front_end/panels/timeline/TimelineUIUtils.ts +149 -131
  275. package/front_end/panels/timeline/components/NetworkRequestDetails.ts +4 -2
  276. package/front_end/panels/timeline/components/NetworkRequestTooltip.ts +4 -2
  277. package/front_end/panels/timeline/components/insights/ImageRef.ts +2 -1
  278. package/front_end/panels/timeline/timeline-meta.ts +3 -2
  279. package/front_end/panels/utils/utils.ts +7 -3
  280. package/front_end/panels/web_audio/WebAudioView.ts +17 -18
  281. package/front_end/panels/web_audio/web_audio-meta.ts +3 -3
  282. package/front_end/panels/whats_new/ReleaseNoteView.ts +1 -1
  283. package/front_end/panels/whats_new/whats_new-meta.ts +11 -11
  284. package/front_end/third_party/chromium/README.chromium +1 -1
  285. package/front_end/third_party/lit/lib/async-directive.d.ts +2 -1
  286. package/front_end/third_party/lit/lib/async-directive.js +1 -1
  287. package/front_end/third_party/lit/lib/async-directive.js.map +1 -1
  288. package/front_end/third_party/lit/lib/decorators.d.ts +2 -1
  289. package/front_end/third_party/lit/lib/decorators.js.map +1 -1
  290. package/front_end/third_party/lit/lib/directive.d.ts +2 -1
  291. package/front_end/third_party/lit/lib/directive.js.map +1 -1
  292. package/front_end/third_party/lit/lib/directives.d.ts +2 -1
  293. package/front_end/third_party/lit/lib/directives.js +8 -8
  294. package/front_end/third_party/lit/lib/directives.js.map +1 -1
  295. package/front_end/third_party/lit/lib/lit.d.ts +2 -1
  296. package/front_end/third_party/lit/lib/lit.js +1 -1
  297. package/front_end/third_party/lit/lib/lit.js.map +1 -1
  298. package/front_end/third_party/lit/lib/static-html.d.ts +2 -1
  299. package/front_end/third_party/lit/lib/static-html.js +1 -1
  300. package/front_end/third_party/lit/lib/static-html.js.map +1 -1
  301. package/front_end/third_party/lit/package.json +2 -2
  302. package/front_end/third_party/lit/rebuild.sh +1 -1
  303. package/front_end/third_party/lit/src/async-directive.ts +5 -0
  304. package/front_end/ui/components/dialogs/Dialog.ts +1 -1
  305. package/front_end/ui/components/dialogs/ShortcutDialog.ts +1 -1
  306. package/front_end/ui/components/diff_view/DiffView.ts +2 -2
  307. package/front_end/ui/components/issue_counter/IssueCounter.ts +3 -3
  308. package/front_end/ui/components/issue_counter/IssueLinkIcon.ts +5 -5
  309. package/front_end/ui/components/lists/List.ts +2 -2
  310. package/front_end/ui/components/panel_feedback/PreviewToggle.ts +1 -1
  311. package/front_end/ui/components/request_link_icon/RequestLinkIcon.ts +5 -5
  312. package/front_end/ui/components/settings/SettingCheckbox.ts +1 -1
  313. package/front_end/ui/components/snackbars/Snackbar.ts +1 -1
  314. package/front_end/ui/components/survey_link/SurveyLink.ts +3 -3
  315. package/front_end/ui/components/text_editor/config.ts +2 -2
  316. package/front_end/ui/components/tree_outline/TreeOutline.ts +34 -1
  317. package/front_end/ui/legacy/ReportView.ts +5 -0
  318. package/front_end/ui/legacy/Treeoutline.ts +6 -0
  319. package/front_end/ui/legacy/View.ts +1 -1
  320. package/front_end/ui/legacy/Widget.ts +14 -15
  321. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +2 -0
  322. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +8 -3
  323. package/front_end/ui/legacy/components/data_grid/data_grid.ts +1 -0
  324. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +1 -1
  325. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +106 -38
  326. package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +7 -1
  327. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +2 -1
  328. package/front_end/ui/legacy/components/utils/ImagePreview.ts +4 -2
  329. package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +10 -1
  330. package/front_end/ui/legacy/inspectorCommon.css +5 -0
  331. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
  332. package/mcp/mcp.ts +2 -0
  333. package/package.json +4 -4
  334. package/front_end/models/issues_manager/AttributionReportingIssue.ts +0 -247
  335. package/front_end/models/issues_manager/descriptions/arInsecureContext.md +0 -7
  336. package/front_end/models/issues_manager/descriptions/arInvalidInfoHeader.md +0 -5
  337. package/front_end/models/issues_manager/descriptions/arInvalidRegisterOsSourceHeader.md +0 -5
  338. package/front_end/models/issues_manager/descriptions/arInvalidRegisterOsTriggerHeader.md +0 -5
  339. package/front_end/models/issues_manager/descriptions/arInvalidRegisterSourceHeader.md +0 -5
  340. package/front_end/models/issues_manager/descriptions/arInvalidRegisterTriggerHeader.md +0 -5
  341. package/front_end/models/issues_manager/descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md +0 -5
  342. package/front_end/models/issues_manager/descriptions/arNavigationRegistrationWithoutTransientUserActivation.md +0 -6
  343. package/front_end/models/issues_manager/descriptions/arNoRegisterOsSourceHeader.md +0 -5
  344. package/front_end/models/issues_manager/descriptions/arNoRegisterOsTriggerHeader.md +0 -5
  345. package/front_end/models/issues_manager/descriptions/arNoRegisterSourceHeader.md +0 -5
  346. package/front_end/models/issues_manager/descriptions/arNoRegisterTriggerHeader.md +0 -5
  347. package/front_end/models/issues_manager/descriptions/arNoWebOrOsSupport.md +0 -4
  348. package/front_end/models/issues_manager/descriptions/arOsSourceIgnored.md +0 -18
  349. package/front_end/models/issues_manager/descriptions/arOsTriggerIgnored.md +0 -19
  350. package/front_end/models/issues_manager/descriptions/arPermissionPolicyDisabled.md +0 -8
  351. package/front_end/models/issues_manager/descriptions/arSourceAndTriggerHeaders.md +0 -9
  352. package/front_end/models/issues_manager/descriptions/arSourceIgnored.md +0 -13
  353. package/front_end/models/issues_manager/descriptions/arTriggerIgnored.md +0 -12
  354. package/front_end/models/issues_manager/descriptions/arUntrustworthyReportingOrigin.md +0 -10
  355. package/front_end/models/issues_manager/descriptions/arWebAndOsHeaders.md +0 -11
  356. package/front_end/panels/issues/AttributionReportingIssueDetailsView.ts +0 -182
  357. package/front_end/panels/profiler/ProfileView.ts +0 -611
  358. package/front_end/panels/recorder/components/ExtensionView.ts +0 -132
  359. package/front_end/panels/recorder/components/components.ts +0 -25
  360. package/front_end/panels/recorder/components/util.ts +0 -116
  361. /package/front_end/panels/recorder/{components/controlButton.css → controlButton.css} +0 -0
  362. /package/front_end/panels/recorder/{components/createRecordingView.css → createRecordingView.css} +0 -0
  363. /package/front_end/panels/recorder/{components/extensionView.css → extensionView.css} +0 -0
  364. /package/front_end/panels/recorder/{components/recordingListView.css → recordingListView.css} +0 -0
  365. /package/front_end/panels/recorder/{components/replaySection.css → replaySection.css} +0 -0
  366. /package/front_end/panels/recorder/{components/selectorPicker.css → selectorPicker.css} +0 -0
  367. /package/front_end/panels/recorder/{components/startView.css → startView.css} +0 -0
  368. /package/front_end/panels/recorder/{components/stepEditor.css → stepEditor.css} +0 -0
  369. /package/front_end/panels/recorder/{components/stepView.css → stepView.css} +0 -0
  370. /package/front_end/panels/recorder/{components/timelineSection.css → timelineSection.css} +0 -0
@@ -496,8 +496,8 @@
496
496
 
497
497
  TestSuite.prototype.testConsoleOnNavigateBack = function() {
498
498
  function filteredMessages() {
499
- return SDK.ConsoleModel.ConsoleModel.allMessagesUnordered().filter(
500
- a => a.source !== Protocol.Log.LogEntrySource.Violation);
499
+ return SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(SDK.TargetManager.TargetManager.instance())
500
+ .filter(a => a.source !== Protocol.Log.LogEntrySource.Violation);
501
501
  }
502
502
 
503
503
  if (filteredMessages().length === 1) {
@@ -710,7 +710,7 @@
710
710
  SDK.TargetManager.TargetManager.instance().addModelListener(
711
711
  SDK.ConsoleModel.ConsoleModel, SDK.ConsoleModel.Events.MessageAdded, onConsoleMessage, this);
712
712
 
713
- const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered();
713
+ const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(SDK.TargetManager.TargetManager.instance());
714
714
  if (messages.length) {
715
715
  const text = messages[0].messageText;
716
716
  this.assertEquals('ready', text);
@@ -976,7 +976,7 @@
976
976
  TestSuite.prototype.testWindowInitializedOnNavigateBack = function() {
977
977
  const test = this;
978
978
  test.takeControl();
979
- const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered();
979
+ const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(SDK.TargetManager.TargetManager.instance());
980
980
  if (messages.length === 1) {
981
981
  checkMessages();
982
982
  } else {
@@ -985,7 +985,7 @@
985
985
  }
986
986
 
987
987
  function checkMessages() {
988
- const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered();
988
+ const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(SDK.TargetManager.TargetManager.instance());
989
989
  test.assertEquals(1, messages.length);
990
990
  test.assertTrue(messages[0].messageText.indexOf('Uncaught') === -1);
991
991
  test.releaseControl();
@@ -1062,7 +1062,7 @@
1062
1062
  };
1063
1063
 
1064
1064
  TestSuite.prototype.waitForTestResultsInConsole = function() {
1065
- const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered();
1065
+ const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(SDK.TargetManager.TargetManager.instance());
1066
1066
  for (let i = 0; i < messages.length; ++i) {
1067
1067
  const text = messages[i].messageText;
1068
1068
  if (text === 'PASS') {
@@ -38,24 +38,31 @@ export async function fileToString(file: File): Promise<string> {
38
38
  * Consider using `arrayBufferToString` instead, which can handle both gzipped and plain text buffers.
39
39
  */
40
40
  export async function decompress(gzippedBuffer: ArrayBufferLike, charset = 'utf-8'): Promise<string> {
41
- const buffer = await gzipCodec(gzippedBuffer, new DecompressionStream('gzip'));
41
+ const buffer = await decompressToBuffer(gzippedBuffer);
42
42
  const str = new TextDecoder(charset).decode(buffer);
43
43
  return str;
44
44
  }
45
45
 
46
+ export async function decompressToBuffer(gzippedBuffer: ArrayBufferLike): Promise<ArrayBuffer> {
47
+ return await gzipCodec(gzippedBuffer, new DecompressionStream('gzip'));
48
+ }
49
+
46
50
  /**
47
51
  * Decompress a deflate-encoded ArrayBuffer to a string.
48
52
  * Tries 'deflate' (zlib wrapper) first, then falls back to 'deflate-raw'.
49
53
  */
50
54
  export async function decompressDeflate(buffer: ArrayBufferLike, charset = 'utf-8'): Promise<string> {
51
- let decompressedBuffer: ArrayBuffer;
55
+ const decompressedBuffer = await decompressDeflateToBuffer(buffer);
56
+ return new TextDecoder(charset).decode(decompressedBuffer);
57
+ }
58
+
59
+ export async function decompressDeflateToBuffer(buffer: ArrayBufferLike): Promise<ArrayBuffer> {
52
60
  try {
53
- decompressedBuffer = await gzipCodec(buffer, new DecompressionStream('deflate'));
61
+ return await gzipCodec(buffer, new DecompressionStream('deflate'));
54
62
  } catch {
55
63
  // Try deflate-raw format if zlib-wrapped deflate fails.
56
- decompressedBuffer = await gzipCodec(buffer, new DecompressionStream('deflate-raw'));
64
+ return await gzipCodec(buffer, new DecompressionStream('deflate-raw'));
57
65
  }
58
- return new TextDecoder(charset).decode(decompressedBuffer);
59
66
  }
60
67
  export async function compress(str: string): Promise<ArrayBuffer> {
61
68
  const encoded = new TextEncoder().encode(str);
@@ -63,6 +63,7 @@ const AidaLanguageToMarkdown: Record<AidaInferenceLanguage, string> = {
63
63
 
64
64
  export class AidaAbortError extends Error {}
65
65
  export class AidaBlockError extends Error {}
66
+ export class AidaQuotaError extends Error {}
66
67
 
67
68
  interface AiStream {
68
69
  write: (data: string) => Promise<void>;
@@ -185,12 +186,23 @@ export class AidaClient {
185
186
  debugLog('doConversation failed with error:', JSON.stringify(err));
186
187
  if (err instanceof DispatchHttpRequestClient.DispatchHttpRequestError && err.response) {
187
188
  const result = err.response;
189
+ if (result.statusCode === 429) {
190
+ stream.fail(new AidaQuotaError('Server responded: quota exceeded'));
191
+ return;
192
+ }
188
193
  if (result.statusCode === 403) {
189
194
  stream.fail(new Error('Server responded: permission denied'));
190
195
  return;
191
196
  }
192
197
  if ('error' in result && result.error) {
193
- stream.fail(new Error(`Cannot send request: ${result.error} ${result.detail || ''}`));
198
+ const errorStr = typeof result.error === 'string' ? result.error : '';
199
+ const detailStr = typeof result.detail === 'string' ? result.detail : '';
200
+ if (errorStr.toLowerCase().includes('quota') || detailStr.toLowerCase().includes('quota')) {
201
+ stream.fail(new AidaQuotaError(
202
+ `Cannot send request: ${result.error}${result.detail ? ` ${result.detail}` : ''}`));
203
+ return;
204
+ }
205
+ stream.fail(new Error(`Cannot send request: ${result.error}${result.detail ? ` ${result.detail}` : ''}`));
194
206
  return;
195
207
  }
196
208
  if ('netErrorName' in result && result.netErrorName === 'net::ERR_TIMED_OUT') {
@@ -249,6 +261,9 @@ export class AidaClient {
249
261
  thoughtSignature: result.functionCallChunk.functionCall.thoughtSignature,
250
262
  });
251
263
  } else if ('error' in result) {
264
+ if (typeof result.error === 'string' && result.error.toLowerCase().includes('quota')) {
265
+ throw new AidaQuotaError(`Server responded: ${JSON.stringify(result)}`);
266
+ }
252
267
  throw new Error(`Server responded: ${JSON.stringify(result)}`);
253
268
  } else {
254
269
  throw new Error(`Unknown chunk result ${JSON.stringify(result)}`);
@@ -435,21 +450,32 @@ export function getClientFeatureName(feature: ClientFeature): string {
435
450
  return name;
436
451
  }
437
452
 
438
- let hostConfigTrackerInstance: HostConfigTracker|undefined;
439
-
440
453
  export class HostConfigTracker extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
441
454
  #pollTimer?: ReturnType<typeof setTimeout>;
442
455
  #aidaAvailability?: AidaAccessPreconditions;
443
456
 
444
- private constructor() {
445
- super();
457
+ static instance({forceNew}: {
458
+ forceNew: boolean,
459
+ } = {forceNew: false}): HostConfigTracker {
460
+ if (!Root.DevToolsContext.globalInstance().has(HostConfigTracker) || forceNew) {
461
+ Root.DevToolsContext.globalInstance().set(
462
+ HostConfigTracker,
463
+ new HostConfigTracker(),
464
+ );
465
+ }
466
+ return Root.DevToolsContext.globalInstance().get(HostConfigTracker);
467
+ }
468
+
469
+ dispose(): void {
470
+ clearTimeout(this.#pollTimer);
471
+ this.listeners = undefined;
446
472
  }
447
473
 
448
- static instance(): HostConfigTracker {
449
- if (!hostConfigTrackerInstance) {
450
- hostConfigTrackerInstance = new HostConfigTracker();
474
+ static removeInstance(): void {
475
+ if (Root.DevToolsContext.globalInstance().has(HostConfigTracker)) {
476
+ Root.DevToolsContext.globalInstance().get(HostConfigTracker).dispose();
477
+ Root.DevToolsContext.globalInstance().delete(HostConfigTracker);
451
478
  }
452
- return hostConfigTrackerInstance;
453
479
  }
454
480
 
455
481
  override addEventListener(eventType: Events, listener: Common.EventTarget.EventListener<EventTypes, Events>):
@@ -98,21 +98,24 @@ async function makeHttpRequest<R>(request: DispatchHttpRequestRequest): Promise<
98
98
  }
99
99
 
100
100
  const SERVICE_NAME = 'gdpService';
101
- let gdpClientInstance: GdpClient|null = null;
102
101
  export class GdpClient {
103
102
  #cachedProfilePromise?: Promise<Profile>;
104
103
  #cachedEligibilityPromise?: Promise<CheckElibigilityResponse>;
105
104
 
106
- private constructor() {
107
- }
108
-
109
105
  static instance({forceNew}: {
110
106
  forceNew: boolean,
111
107
  } = {forceNew: false}): GdpClient {
112
- if (!gdpClientInstance || forceNew) {
113
- gdpClientInstance = new GdpClient();
108
+ if (!Root.DevToolsContext.globalInstance().has(GdpClient) || forceNew) {
109
+ Root.DevToolsContext.globalInstance().set(
110
+ GdpClient,
111
+ new GdpClient(),
112
+ );
114
113
  }
115
- return gdpClientInstance;
114
+ return Root.DevToolsContext.globalInstance().get(GdpClient);
115
+ }
116
+
117
+ static removeInstance(): void {
118
+ Root.DevToolsContext.globalInstance().delete(GdpClient);
116
119
  }
117
120
 
118
121
  /**
@@ -112,6 +112,7 @@ export function isUnderTest(prefs?: Record<string, string>): boolean {
112
112
  return prefs['isUnderTest'] === 'true';
113
113
  }
114
114
  return Common.Settings.Settings.hasInstance() &&
115
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
115
116
  Common.Settings.Settings.instance().createSetting('isUnderTest', false).get();
116
117
  }
117
118
 
@@ -168,11 +168,13 @@ export class InspectorFrontendHostStub implements InspectorFrontendHostAPI {
168
168
  }
169
169
 
170
170
  openSearchResultsInNewTab(_query: string): void {
171
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
171
172
  Common.Console.Console.instance().error(
172
173
  'Search is not enabled in hosted mode. Please inspect using chrome://inspect');
173
174
  }
174
175
 
175
176
  showItemInFolder(_fileSystemPath: Platform.DevToolsPath.RawPathString): void {
177
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
176
178
  Common.Console.Console.instance().error(
177
179
  'Show item in folder is not enabled in hosted mode. Please inspect using chrome://inspect');
178
180
  }
@@ -4,6 +4,8 @@
4
4
 
5
5
  import type {Brand} from './Brand.js';
6
6
 
7
+ let graphemeSegmenter: Intl.Segmenter|null = null;
8
+
7
9
  export const escapeCharacters = (inputString: string, charsToEscape: string): string => {
8
10
  let foundChar = false;
9
11
  for (let i = 0; i < charsToEscape.length; ++i) {
@@ -48,23 +50,39 @@ const escapedReplacements = new Map([
48
50
  ['</script', '\\x3C/script'],
49
51
  ]);
50
52
 
53
+ export const escapeUnicode = (content: string): string => {
54
+ return content.replaceAll(/[\p{Format}\p{Surrogate}]/gu, match => {
55
+ return match.split('').map(char => '\\u' + toHexadecimal(char.charCodeAt(0), 4)).join('');
56
+ });
57
+ };
58
+
51
59
  export const formatAsJSLiteral = (content: string): string => {
52
- const patternsToEscape = /(\\|<(?:!--|\/?script))|(\p{Control})|(\p{Surrogate})/gu;
53
- const patternsToEscapePlusSingleQuote = /(\\|'|<(?:!--|\/?script))|(\p{Control})|(\p{Surrogate})/gu;
60
+ const patternsToEscape = /(\\|<(?:!--|\/?script))|(\p{Control}|\p{Format})|(\p{Surrogate})/giu;
61
+ const patternsToEscapePlusSingleQuote = /(\\|'|<(?:!--|\/?script))|(\p{Control}|\p{Format})|(\p{Surrogate})/giu;
54
62
  const escapePattern = (match: string, pattern: string, controlChar: string, loneSurrogate: string): string => {
55
63
  if (controlChar) {
56
64
  if (escapedReplacements.has(controlChar)) {
57
65
  // @ts-expect-error https://github.com/microsoft/TypeScript/issues/13086
58
66
  return escapedReplacements.get(controlChar);
59
67
  }
60
- const twoDigitHex = toHexadecimal(controlChar.charCodeAt(0), 2);
61
- return '\\x' + twoDigitHex;
68
+ return controlChar.split('')
69
+ .map(char => {
70
+ const charCode = char.charCodeAt(0);
71
+ if (controlChar.length === 1 && charCode <= 0xFF) {
72
+ return '\\x' + toHexadecimal(charCode, 2);
73
+ }
74
+ return '\\u' + toHexadecimal(charCode, 4);
75
+ })
76
+ .join('');
62
77
  }
63
78
  if (loneSurrogate) {
64
79
  const fourDigitHex = toHexadecimal(loneSurrogate.charCodeAt(0), 4);
65
80
  return '\\u' + fourDigitHex;
66
81
  }
67
82
  if (pattern) {
83
+ if (pattern.startsWith('<')) {
84
+ return '\\x3C' + pattern.slice(1);
85
+ }
68
86
  return escapedReplacements.get(pattern) || '';
69
87
  }
70
88
  return match;
@@ -447,6 +465,39 @@ export const trimEndWithMaxLength = (str: string, maxLength: number): string =>
447
465
  return str.slice(0, lastSegmentIndex) + ellipsis;
448
466
  };
449
467
 
468
+ /**
469
+ * Truncates a string to not exceed a maximum number of UTF-16 code units (as measured by JS `string.length`).
470
+ *
471
+ * Unlike simple character limiters, this helper is grapheme-aware and uses `Intl.Segmenter` to prevent
472
+ * slicing inside surrogate pairs (e.g. Plane 1+ characters or emojis like '𠜎' / '🥳') or combining characters
473
+ * (e.g. 'é' represented in NFD as 'e' + combining acute accent). If the limit falls in the middle of a
474
+ * grapheme cluster, the function backs off to drop the entire cluster, ensuring the result is always a valid
475
+ * Unicode string.
476
+ *
477
+ * @param str The string to truncate.
478
+ * @param maxCodeUnits The maximum allowed code unit length (must be >= 0).
479
+ * @returns The truncated string, guaranteed to be <= maxCodeUnits in length and grapheme-safe.
480
+ */
481
+ export const truncateToCodeUnitLength = (str: string, maxCodeUnits: number): string => {
482
+ if (isNaN(maxCodeUnits) || maxCodeUnits <= 0) {
483
+ return '';
484
+ }
485
+ if (str.length <= maxCodeUnits) {
486
+ return str;
487
+ }
488
+ if (!graphemeSegmenter) {
489
+ graphemeSegmenter = new Intl.Segmenter(undefined, {granularity: 'grapheme'});
490
+ }
491
+ let lastSafeIndex = 0;
492
+ for (const {index, segment} of graphemeSegmenter.segment(str)) {
493
+ if (index + segment.length > maxCodeUnits) {
494
+ break;
495
+ }
496
+ lastSafeIndex = index + segment.length;
497
+ }
498
+ return str.slice(0, lastSafeIndex);
499
+ };
500
+
450
501
  export const escapeForRegExp = (str: string): string => {
451
502
  return escapeCharacters(str, SPECIAL_REGEX_CHARACTERS);
452
503
  };
@@ -0,0 +1,17 @@
1
+ Title: AccessibilityModel axNodeToText correctly formats an accessibility node tree to text
2
+ Content:
3
+ dialog "Confirmation"
4
+ button "Submit" focusable: true
5
+ === end content
6
+
7
+ Title: AccessibilityModel axNodeToText correctly formats when the root node is ignored
8
+ Content:
9
+ Ignored
10
+ button "Submit" focusable: true
11
+ === end content
12
+
13
+ Title: AccessibilityModel axNodeToText correctly formats when a nested node is ignored
14
+ Content:
15
+ dialog "Confirmation"
16
+ button "Submit" focusable: true
17
+ === end content
@@ -3,9 +3,10 @@
3
3
  // found in the LICENSE file.
4
4
 
5
5
  import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
6
- import type * as Protocol from '../../generated/protocol.js';
6
+ import * as Protocol from '../../generated/protocol.js';
7
7
 
8
- import {DeferredDOMNode, DOMModel, type DOMNode, Events as DOMModelEvents} from './DOMModel.js';
8
+ import {DeferredDOMNode, DOMDocument, DOMModel, type DOMNode, Events as DOMModelEvents} from './DOMModel.js';
9
+ import type {FrameManager} from './FrameManager.js';
9
10
  import {SDKModel} from './SDKModel.js';
10
11
  import {Capability, type Target} from './Target.js';
11
12
 
@@ -23,6 +24,7 @@ export interface CoreOrProtocolAxProperty {
23
24
 
24
25
  export class AccessibilityNode {
25
26
  readonly #accessibilityModel: AccessibilityModel;
27
+ readonly #frameManager: FrameManager;
26
28
  readonly #id: Protocol.Accessibility.AXNodeId;
27
29
  readonly #backendDOMNodeId: Protocol.DOM.BackendNodeId|null;
28
30
  readonly #deferredDOMNode: DeferredDOMNode|null;
@@ -39,6 +41,7 @@ export class AccessibilityNode {
39
41
 
40
42
  constructor(accessibilityModel: AccessibilityModel, payload: Protocol.Accessibility.AXNode) {
41
43
  this.#accessibilityModel = accessibilityModel;
44
+ this.#frameManager = accessibilityModel.target().targetManager().getFrameManager();
42
45
 
43
46
  this.#id = payload.nodeId;
44
47
  accessibilityModel.setAXNodeForAXId(this.#id, this);
@@ -190,6 +193,63 @@ export class AccessibilityNode {
190
193
  getFrameId(): Protocol.Page.FrameId|null {
191
194
  return this.#frameId || this.parentNode()?.getFrameId() || null;
192
195
  }
196
+
197
+ isLeafNode(): boolean {
198
+ return this.numChildren() === 0 && this.role()?.value !== 'Iframe';
199
+ }
200
+
201
+ getNodeId(): string {
202
+ return this.getFrameId() + '#' + this.id();
203
+ }
204
+
205
+ async getChildren(): Promise<AccessibilityNode[]> {
206
+ if (this.role()?.value === 'Iframe') {
207
+ const domNode = await this.deferredDOMNode()?.resolvePromise();
208
+ if (!domNode) {
209
+ throw new Error('Could not find corresponding DOMNode');
210
+ }
211
+ const frameId = domNode.frameOwnerFrameId();
212
+ if (!frameId) {
213
+ throw new Error('No owner frameId on iframe node');
214
+ }
215
+ const localRoot = await getRootNode(frameId, this.#frameManager);
216
+ return [localRoot];
217
+ }
218
+ return await this.accessibilityModel().requestAXChildren(this.id(), this.getFrameId() || undefined);
219
+ }
220
+
221
+ async axNodeToText(depth = 0): Promise<string> {
222
+ const indent = ' '.repeat(depth);
223
+ const role = this.role()?.value || '';
224
+ const name = this.name()?.value || '';
225
+ const properties = this.properties() || [];
226
+ const ignored = this.ignored();
227
+ let childDepth = depth + 1;
228
+
229
+ const lines = [];
230
+ if (ignored) {
231
+ if (depth === 0) {
232
+ lines.push('Ignored\n');
233
+ } else {
234
+ childDepth = depth;
235
+ }
236
+ } else {
237
+ let line = `${indent}${role} "${name}"`;
238
+ for (const prop of properties) {
239
+ if (prop.value && isPrintableType(prop.value.type)) {
240
+ line += ` ${prop.name}: ${prop.value.value}`;
241
+ }
242
+ }
243
+ lines.push(line + '\n');
244
+ }
245
+
246
+ const children = await this.getChildren();
247
+ for (const child of children) {
248
+ lines.push(await child.axNodeToText(childDepth));
249
+ }
250
+
251
+ return lines.join('');
252
+ }
193
253
  }
194
254
 
195
255
  export const enum Events {
@@ -363,3 +423,73 @@ export class AccessibilityModel extends SDKModel<EventTypes> implements Protocol
363
423
  }
364
424
 
365
425
  SDKModel.register(AccessibilityModel, {capabilities: Capability.DOM, autostart: false});
426
+
427
+ function getModel(frameId: Protocol.Page.FrameId, frameManager: FrameManager): AccessibilityModel {
428
+ const frame = frameManager.getFrame(frameId);
429
+ const model = frame?.resourceTreeModel().target().model(AccessibilityModel);
430
+ if (!model) {
431
+ throw new Error('Could not instantiate model for frameId');
432
+ }
433
+ return model;
434
+ }
435
+
436
+ export async function getRootNode(frameId: Protocol.Page.FrameId,
437
+ frameManager: FrameManager): Promise<AccessibilityNode> {
438
+ const model = getModel(frameId, frameManager);
439
+ const root = await model.requestRootNode(frameId);
440
+ if (!root) {
441
+ throw new Error('No accessibility root for frame');
442
+ }
443
+ return root;
444
+ }
445
+
446
+ function getFrameIdForNodeOrDocument(node: DOMNode): Protocol.Page.FrameId {
447
+ let frameId;
448
+ if (node instanceof DOMDocument) {
449
+ frameId = node.body?.frameId();
450
+ } else {
451
+ frameId = node.frameId();
452
+ }
453
+ if (!frameId) {
454
+ throw new Error('No frameId for DOM node');
455
+ }
456
+ return frameId;
457
+ }
458
+
459
+ export async function getNodeAndAncestorsFromDOMNode(domNode: DOMNode): Promise<AccessibilityNode[]> {
460
+ const frameManager = domNode.domModel().target().targetManager().getFrameManager();
461
+ let frameId = getFrameIdForNodeOrDocument(domNode);
462
+ const model = getModel(frameId, frameManager);
463
+ const result = await model.requestAndLoadSubTreeToNode(domNode);
464
+ if (!result) {
465
+ throw new Error('Could not retrieve accessibility node for inspected DOM node');
466
+ }
467
+
468
+ const outermostFrameId = frameManager.getOutermostFrame()?.id;
469
+ if (!outermostFrameId) {
470
+ return result;
471
+ }
472
+ while (frameId !== outermostFrameId) {
473
+ const node = await frameManager.getFrame(frameId)?.getOwnerDOMNodeOrDocument();
474
+ if (!node) {
475
+ break;
476
+ }
477
+ frameId = getFrameIdForNodeOrDocument(node);
478
+ const model = getModel(frameId, frameManager);
479
+ const ancestors = await model.requestAndLoadSubTreeToNode(node);
480
+ result.push(...ancestors || []);
481
+ }
482
+ return result;
483
+ }
484
+
485
+ export function isPrintableType(valueType: Protocol.Accessibility.AXValueType): boolean {
486
+ switch (valueType) {
487
+ case Protocol.Accessibility.AXValueType.Boolean:
488
+ case Protocol.Accessibility.AXValueType.BooleanOrUndefined:
489
+ case Protocol.Accessibility.AXValueType.String:
490
+ case Protocol.Accessibility.AXValueType.Number:
491
+ return true;
492
+ default:
493
+ return false;
494
+ }
495
+ }
@@ -19,7 +19,10 @@ export class CPUThrottlingManager extends Common.ObjectWrapper.ObjectWrapper<Eve
19
19
  super();
20
20
  this.#targetManager = targetManager;
21
21
  this.#cpuThrottlingRate = 1; // No throttling
22
- targetManager.observeModels(EmulationModel, this);
22
+ }
23
+
24
+ initialize(): void {
25
+ this.#targetManager.observeModels(EmulationModel, this);
23
26
  }
24
27
 
25
28
  static instance(opts: {
@@ -29,10 +32,12 @@ export class CPUThrottlingManager extends Common.ObjectWrapper.ObjectWrapper<Eve
29
32
  } = {forceNew: null}): CPUThrottlingManager {
30
33
  const {forceNew} = opts;
31
34
  if (!Root.DevToolsContext.globalInstance().has(CPUThrottlingManager) || forceNew) {
32
- Root.DevToolsContext.globalInstance().set(
33
- CPUThrottlingManager,
34
- new CPUThrottlingManager(opts.settings ?? Common.Settings.Settings.instance(),
35
- opts.targetManager ?? TargetManager.instance()));
35
+ /* eslint-disable @devtools/no-instance-of-migrated-singletons */
36
+ const manager = new CPUThrottlingManager(opts.settings ?? Common.Settings.Settings.instance(),
37
+ opts.targetManager ?? TargetManager.instance());
38
+ /* eslint-enable @devtools/no-instance-of-migrated-singletons */
39
+ manager.initialize();
40
+ Root.DevToolsContext.globalInstance().set(CPUThrottlingManager, manager);
36
41
  }
37
42
 
38
43
  return Root.DevToolsContext.globalInstance().get(CPUThrottlingManager);
@@ -7,7 +7,7 @@ import type * as Common from '../common/common.js';
7
7
  import * as i18n from '../i18n/i18n.js';
8
8
  import type * as Platform from '../platform/platform.js';
9
9
 
10
- import {PageResourceLoader, type PageResourceLoadInitiator} from './PageResourceLoader.js';
10
+ import type {PageResourceLoader, PageResourceLoadInitiator} from './PageResourceLoader.js';
11
11
 
12
12
  const UIStrings = {
13
13
  /**
@@ -28,10 +28,7 @@ export class CompilerSourceMappingContentProvider implements TextUtils.ContentPr
28
28
  readonly #pageResourceLoader: PageResourceLoader;
29
29
 
30
30
  constructor(sourceURL: Platform.DevToolsPath.UrlString, contentType: Common.ResourceType.ResourceType,
31
- initiator: PageResourceLoadInitiator,
32
- pageResourceLoader: PageResourceLoader = initiator.target ?
33
- initiator.target.targetManager().context.get(PageResourceLoader) :
34
- PageResourceLoader.instance()) {
31
+ initiator: PageResourceLoadInitiator, pageResourceLoader: PageResourceLoader) {
35
32
  this.#sourceURL = sourceURL;
36
33
  this.#contentType = contentType;
37
34
  this.#initiator = initiator;
@@ -35,7 +35,7 @@ import {
35
35
  } from './RuntimeModel.js';
36
36
  import {SDKModel} from './SDKModel.js';
37
37
  import {Capability, type Target, Type} from './Target.js';
38
- import {TargetManager} from './TargetManager.js';
38
+ import type {TargetManager} from './TargetManager.js';
39
39
 
40
40
  export {FrontendMessageType} from './ConsoleModelTypes.js';
41
41
 
@@ -357,7 +357,7 @@ export class ConsoleModel extends SDKModel<EventTypes> {
357
357
  }
358
358
 
359
359
  // messages[] are not ordered by timestamp.
360
- static allMessagesUnordered(targetManager: TargetManager = TargetManager.instance()): ConsoleMessage[] {
360
+ static allMessagesUnordered(targetManager: TargetManager): ConsoleMessage[] {
361
361
  const messages = [];
362
362
  for (const target of targetManager.targets()) {
363
363
  const targetMessages = target.model(ConsoleModel)?.messages() || [];
@@ -366,7 +366,7 @@ export class ConsoleModel extends SDKModel<EventTypes> {
366
366
  return messages;
367
367
  }
368
368
 
369
- static requestClearMessages(targetManager: TargetManager = TargetManager.instance()): void {
369
+ static requestClearMessages(targetManager: TargetManager): void {
370
370
  for (const logModel of targetManager.models(LogModel)) {
371
371
  logModel.requestClear();
372
372
  }
@@ -394,7 +394,7 @@ export class ConsoleModel extends SDKModel<EventTypes> {
394
394
  return this.#errors;
395
395
  }
396
396
 
397
- static allErrors(targetManager: TargetManager = TargetManager.instance()): number {
397
+ static allErrors(targetManager: TargetManager): number {
398
398
  let errors = 0;
399
399
  for (const target of targetManager.targets()) {
400
400
  errors += target.model(ConsoleModel)?.errors() || 0;
@@ -406,7 +406,7 @@ export class ConsoleModel extends SDKModel<EventTypes> {
406
406
  return this.#warnings;
407
407
  }
408
408
 
409
- static allWarnings(targetManager: TargetManager = TargetManager.instance()): number {
409
+ static allWarnings(targetManager: TargetManager): number {
410
410
  let warnings = 0;
411
411
  for (const target of targetManager.targets()) {
412
412
  warnings += target.model(ConsoleModel)?.warnings() || 0;
@@ -537,6 +537,7 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
537
537
  readonly #eventListenerBreakpoints: DOMEventListenerBreakpoint[] = [];
538
538
  readonly #targetManager: TargetManager;
539
539
 
540
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
540
541
  constructor(targetManager: TargetManager = TargetManager.instance()) {
541
542
  this.#targetManager = targetManager;
542
543
  this.#xhrBreakpointsSetting = this.#targetManager.settings.createLocalSetting('xhr-breakpoints', []);
@@ -661,7 +662,9 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
661
662
  this.createEventListenerBreakpoints(
662
663
  Category.XHR, ['readystatechange', 'load', 'loadstart', 'loadend', 'abort', 'error', 'progress', 'timeout'],
663
664
  ['xmlhttprequest', 'xmlhttprequestupload']);
665
+ }
664
666
 
667
+ initialize(): void {
665
668
  this.#targetManager.observeModels(DOMDebuggerModel, this);
666
669
  }
667
670
 
@@ -671,9 +674,12 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
671
674
  } = {forceNew: null}): DOMDebuggerManager {
672
675
  const {forceNew, targetManager} = opts;
673
676
  if (!Root.DevToolsContext.globalInstance().has(DOMDebuggerManager) || forceNew) {
677
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
678
+ const manager = new DOMDebuggerManager(targetManager ?? TargetManager.instance());
679
+ manager.initialize();
674
680
  Root.DevToolsContext.globalInstance().set(
675
681
  DOMDebuggerManager,
676
- new DOMDebuggerManager(targetManager ?? TargetManager.instance()),
682
+ manager,
677
683
  );
678
684
  }
679
685