chrome-devtools-frontend 1.0.1717196 → 1.0.1721762

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 (381) hide show
  1. package/.agents/rules/models-and-core/core-ai-agent-context-and-prompt-discipline.md +29 -0
  2. package/.agents/rules/models-and-core/core-cdp-and-extension-error-handling.md +34 -0
  3. package/.agents/rules/models-and-core/core-gn-build-and-module-layering.md +23 -0
  4. package/.agents/rules/models-and-core/core-runtime-neutrality-and-platform-utils.md +28 -0
  5. package/.agents/rules/models-and-core/core-sdk-model-and-target-lifecycle.md +35 -0
  6. package/.agents/rules/models-and-core/core-security-origin-and-capability-guards.md +33 -0
  7. package/.agents/rules/models-and-core/core-settings-and-storage-migration.md +31 -0
  8. package/.agents/rules/models-and-core/core-sourcemap-and-workspace-mapping.md +28 -0
  9. package/.agents/rules/models-and-core/core-trace-engine-handler-invariants.md +32 -0
  10. package/.agents/rules/models-and-core/core-trace-insight-models-and-timing-types.md +28 -0
  11. package/.agents/rules/tests/test-cleanup-mutated-globals-and-widgets.md +40 -0
  12. package/.agents/rules/tests/test-deterministic-async-synchronization.md +30 -0
  13. package/.agents/rules/tests/test-modular-hooks-and-test-universe.md +38 -0
  14. package/.agents/rules/tests/test-public-api-and-encapsulation.md +30 -0
  15. package/.agents/rules/tests/test-shared-fixture-and-helper-reuse.md +29 -0
  16. package/.agents/rules/tests/test-single-responsibility-and-conciseness.md +37 -0
  17. package/.agents/rules/tests/test-strict-assertions-and-literal-expectations.md +31 -0
  18. package/.agents/rules/tests/test-type-safe-mocks-and-events.md +30 -0
  19. package/.agents/rules/tests/test-view-and-presenter-isolation.md +32 -0
  20. package/.agents/rules/ui-and-widgets/ui-accessibility-and-semantic-html.md +32 -0
  21. package/.agents/rules/ui-and-widgets/ui-await-update-complete-post-render.md +30 -0
  22. package/.agents/rules/ui-and-widgets/ui-css-scoping-and-flex-layout.md +27 -0
  23. package/.agents/rules/ui-and-widgets/ui-declarative-child-widget-composition.md +29 -0
  24. package/.agents/rules/ui-and-widgets/ui-lit-declarative-templates-and-directives.md +33 -0
  25. package/.agents/rules/ui-and-widgets/ui-localization-and-uistrings-hygiene.md +36 -0
  26. package/.agents/rules/ui-and-widgets/ui-modern-component-and-encapsulation-standards.md +32 -0
  27. package/.agents/rules/ui-and-widgets/ui-panel-and-meta-registration.md +35 -0
  28. package/.agents/rules/ui-and-widgets/ui-performance-and-flamechart-rendering.md +34 -0
  29. package/.agents/rules/ui-and-widgets/ui-pure-view-and-presenter-separation.md +31 -0
  30. package/.agents/rules/ui-and-widgets/ui-reactive-widget-update-lifecycle.md +34 -0
  31. package/.agents/rules/ui-and-widgets/ui-security-and-output-sanitization.md +28 -0
  32. package/.agents/rules/ui-and-widgets/ui-type-safety-and-exhaustiveness.md +37 -0
  33. package/.agents/rules/ui-and-widgets/ui-view-output-and-callback-contracts.md +35 -0
  34. package/.agents/rules/ui-and-widgets/ui-visual-logging-instrumentation.md +29 -0
  35. package/.agents/rules/ui-and-widgets/ui-weak-dom-references-and-observer-cleanup.md +29 -0
  36. package/.agents/rules/ui-and-widgets/ui-widget-dom-and-listener-lifecycle.md +38 -0
  37. package/.agents/skills/code-review/SKILL.md +3 -0
  38. package/.agents/skills/devtools-testing-guidance/SKILL.md +5 -2
  39. package/.agents/skills/review-models-core/SKILL.md +73 -0
  40. package/.agents/skills/review-tests/SKILL.md +67 -0
  41. package/.agents/skills/review-ui-widgets/SKILL.md +115 -0
  42. package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +73 -9
  43. package/.agents/skills/ui-eng-vision-logic-consolidator/SKILL.md +27 -3
  44. package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +32 -2
  45. package/.agents/skills/ui-eng-vision-test-scaffolder/SKILL.md +37 -7
  46. package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +6 -5
  47. package/.agents/skills/ui-widgets/SKILL.md +11 -9
  48. package/AUTHORS +3 -0
  49. package/DIR_METADATA +51 -1
  50. package/docs/ui_engineering.md +34 -0
  51. package/eslint.config.mjs +63 -21
  52. package/front_end/core/common/Settings.ts +5 -0
  53. package/front_end/core/host/UserMetricsEnums.ts +1 -0
  54. package/front_end/core/platform/api/HostRuntime.ts +1 -0
  55. package/front_end/core/platform/browser/HostRuntime.ts +10 -0
  56. package/front_end/core/platform/node/HostRuntime.ts +1 -0
  57. package/front_end/core/sdk/CSSMatchedStyles.ts +60 -20
  58. package/front_end/core/sdk/CSSModel.ts +21 -0
  59. package/front_end/core/sdk/CSSProperty.ts +2 -2
  60. package/front_end/core/sdk/CSSPropertyParser.ts +11 -2
  61. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +28 -9
  62. package/front_end/core/sdk/DOMModel.ts +1 -1
  63. package/front_end/core/sdk/DebuggerModel.ts +3 -0
  64. package/front_end/core/sdk/EmulationModel.ts +40 -39
  65. package/front_end/core/sdk/NetworkManager.ts +10 -3
  66. package/front_end/core/sdk/NetworkRequest.ts +21 -0
  67. package/front_end/core/sdk/OverlayModel.ts +2 -8
  68. package/front_end/core/sdk/PrivateVerificationTokensModel.ts +79 -0
  69. package/front_end/core/sdk/RuntimeModel.ts +8 -3
  70. package/front_end/core/sdk/SecurityOrigin.ts +1 -1
  71. package/front_end/core/sdk/SourceMapCache.ts +20 -15
  72. package/front_end/core/sdk/SourceMapManager.ts +28 -9
  73. package/front_end/core/sdk/TargetManager.ts +7 -4
  74. package/front_end/core/sdk/WebAuthnModel.ts +11 -2
  75. package/front_end/core/sdk/sdk.ts +2 -0
  76. package/front_end/devtools_compatibility.js +1 -0
  77. package/front_end/entrypoints/inspector_main/InspectorMain.ts +0 -2
  78. package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +10 -0
  79. package/front_end/entrypoints/main/GlobalAiButton.ts +1 -1
  80. package/front_end/entrypoints/main/MainImpl.ts +5 -2
  81. package/front_end/foundation/Universe.ts +1 -1
  82. package/front_end/generated/Deprecation.ts +4 -7
  83. package/front_end/generated/InspectorBackendCommands.ts +4 -4
  84. package/front_end/generated/SupportedCSSProperties.ts +89 -17
  85. package/front_end/generated/protocol-mapping.d.ts +1 -0
  86. package/front_end/generated/protocol-proxy-api.d.ts +1 -0
  87. package/front_end/generated/protocol.ts +6 -3
  88. package/front_end/models/{ai_assistance → ai-utils}/AiHistoryStorage.ts +6 -5
  89. package/front_end/models/{ai_assistance → ai-utils}/AiUtils.ts +14 -2
  90. package/front_end/models/{ai_assistance → ai-utils}/BuiltInAi.ts +1 -1
  91. package/front_end/models/ai-utils/ai-utils.ts +17 -0
  92. package/front_end/models/ai_assistance/AiAgent2.ts +14 -6
  93. package/front_end/models/ai_assistance/AiConversation.ts +37 -24
  94. package/front_end/models/ai_assistance/AlwaysAllowedTools.ts +107 -0
  95. package/front_end/models/ai_assistance/ConversationSummary.ts +2 -1
  96. package/front_end/models/ai_assistance/PerformanceAnnotations.ts +3 -1
  97. package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +12 -5
  98. package/front_end/models/ai_assistance/agents/AiAgent.ts +261 -127
  99. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +12 -6
  100. package/front_end/models/ai_assistance/agents/ExecuteJavascript.ts +3 -1
  101. package/front_end/models/ai_assistance/agents/PerformanceAgent.snapshot.txt +1 -1
  102. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +3 -1
  103. package/front_end/models/ai_assistance/ai_assistance.ts +9 -10
  104. package/front_end/models/ai_assistance/data_formatters/FileFormatter.ts +27 -6
  105. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +2 -9
  106. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +3 -3
  107. package/front_end/models/ai_assistance/skills/sources.md +3 -1
  108. package/front_end/models/ai_assistance/tools/ExecuteJavaScript.ts +1 -0
  109. package/front_end/models/ai_assistance/tools/GetCookieValues.ts +1 -0
  110. package/front_end/models/ai_assistance/tools/GetInsightDetails.ts +3 -1
  111. package/front_end/models/ai_assistance/tools/GetSourceContent.ts +46 -4
  112. package/front_end/models/ai_assistance/tools/GetStorageValues.ts +1 -0
  113. package/front_end/models/ai_assistance/tools/RunLighthouse.ts +6 -3
  114. package/front_end/models/ai_assistance/tools/Tool.ts +11 -1
  115. package/front_end/models/bindings/CompilerScriptMapping.ts +40 -8
  116. package/front_end/models/bindings/ResourceScriptMapping.ts +1 -1
  117. package/front_end/models/breakpoints/BreakpointManager.ts +0 -4
  118. package/front_end/models/change_tracker/ChangeTracker.ts +2 -0
  119. package/front_end/models/comment_manager/CommentManager.ts +12 -0
  120. package/front_end/models/comment_manager/CommentThread.ts +34 -1
  121. package/front_end/models/computed_style/ComputedStyleModel.ts +1 -0
  122. package/front_end/models/elements/ChangeTrackingUtils.ts +37 -0
  123. package/front_end/models/elements/DOMChanges.ts +24 -36
  124. package/front_end/models/elements/StyleChanges.ts +97 -0
  125. package/front_end/models/elements/elements.ts +4 -0
  126. package/front_end/models/emulation/DeviceModeModel.ts +19 -0
  127. package/front_end/models/issues_manager/GenericIssue.ts +18 -0
  128. package/front_end/models/issues_manager/descriptions/genericGeolocationPromptWithoutUserGesture.md +5 -0
  129. package/front_end/models/javascript_metadata/NativeFunctions.ts +11 -5
  130. package/front_end/models/lighthouse/RunTypes.ts +16 -0
  131. package/front_end/models/stack_trace/StackTraceModel.ts +24 -3
  132. package/front_end/models/trace/EventsSerializer.ts +35 -2
  133. package/front_end/models/trace/extras/TraceTree.ts +2 -7
  134. package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +17 -21
  135. package/front_end/models/trace/helpers/SyntheticEvents.ts +4 -2
  136. package/front_end/models/trace/helpers/Timing.ts +11 -22
  137. package/front_end/models/trace/lantern/core/NetworkAnalyzer.ts +12 -8
  138. package/front_end/models/trace/types/File.ts +20 -3
  139. package/front_end/models/trace/types/TraceEvents.ts +8 -3
  140. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +37 -2
  141. package/front_end/panels/ai_assistance/README.md +4 -2
  142. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +1 -1
  143. package/front_end/panels/ai_assistance/ai_assistance.ts +2 -0
  144. package/front_end/panels/ai_assistance/components/ChatInput.ts +5 -43
  145. package/front_end/panels/ai_assistance/components/ChatMessage.ts +52 -147
  146. package/front_end/panels/ai_assistance/components/ChatView.ts +28 -3
  147. package/front_end/panels/ai_assistance/components/PermissionPrompt.ts +151 -0
  148. package/front_end/panels/ai_assistance/components/RelevantDataDisclaimer.ts +73 -0
  149. package/front_end/panels/ai_assistance/components/chatInput.css +0 -59
  150. package/front_end/panels/ai_assistance/components/chatMessage.css +0 -47
  151. package/front_end/panels/ai_assistance/components/chatView.css +5 -30
  152. package/front_end/panels/ai_assistance/components/permissionPrompt.css +55 -0
  153. package/front_end/panels/ai_assistance/components/relevantDataDisclaimer.css +35 -0
  154. package/front_end/panels/application/AppManifestView.ts +1 -4
  155. package/front_end/panels/application/ApplicationPanelSidebar.ts +3 -7
  156. package/front_end/panels/application/BackgroundServiceView.ts +8 -8
  157. package/front_end/panels/application/IndexedDBViews.ts +102 -73
  158. package/front_end/panels/application/OpenedWindowDetailsView.ts +167 -130
  159. package/front_end/panels/application/ServiceWorkerCacheViews.ts +288 -346
  160. package/front_end/panels/application/StorageBucketsTreeElement.ts +22 -27
  161. package/front_end/panels/application/StorageItemsToolbar.ts +2 -2
  162. package/front_end/panels/application/components/StorageMetadataView.ts +207 -160
  163. package/front_end/panels/application/openedWindowDetailsView.css +7 -30
  164. package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +1 -1
  165. package/front_end/panels/changes/changesView.css +0 -6
  166. package/front_end/panels/comments/CommentsPane.ts +7 -3
  167. package/front_end/panels/comments/comments-meta.ts +1 -1
  168. package/front_end/panels/common/CommentThreadWidget.ts +67 -25
  169. package/front_end/panels/common/CommentsOverlayWidget.ts +13 -0
  170. package/front_end/panels/console/ConsoleInsightTeaser.ts +5 -1
  171. package/front_end/panels/console/ConsolePinPane.ts +1 -1
  172. package/front_end/panels/console/ConsoleView.ts +1 -0
  173. package/front_end/panels/elements/CSSValueTraceView.ts +5 -5
  174. package/front_end/panels/elements/ColorSwatchPopoverIcon.ts +14 -6
  175. package/front_end/panels/elements/ComputedStyleWidget.ts +14 -5
  176. package/front_end/panels/elements/DOMTreeElementWidget.ts +2 -2
  177. package/front_end/panels/elements/DOMTreeWidget.ts +7 -3
  178. package/front_end/panels/elements/EventListenersWidget.ts +1 -1
  179. package/front_end/panels/elements/LayersWidget.ts +1 -1
  180. package/front_end/panels/elements/PropertyRenderer.ts +178 -10
  181. package/front_end/panels/elements/StandaloneStylesContainer.ts +33 -6
  182. package/front_end/panels/elements/StylePropertiesSection.ts +1 -0
  183. package/front_end/panels/elements/StylePropertyTreeElement.ts +295 -116
  184. package/front_end/panels/elements/StylesContainer.ts +2 -0
  185. package/front_end/panels/elements/StylesSidebarPane.ts +34 -16
  186. package/front_end/panels/elements/components/QueryContainer.ts +1 -1
  187. package/front_end/panels/elements/elementStatePaneWidget.css +1 -1
  188. package/front_end/panels/elements/stylePropertiesTreeOutline.css +7 -2
  189. package/front_end/panels/elements/stylesSidebarPane.css +4 -0
  190. package/front_end/panels/emulation/DeviceModeToolbar.ts +57 -25
  191. package/front_end/panels/emulation/DeviceModeView.ts +27 -1
  192. package/front_end/panels/emulation/InspectedPagePlaceholder.ts +6 -0
  193. package/front_end/panels/emulation/MediaQueryInspector.ts +14 -4
  194. package/front_end/panels/emulation/deviceModeView.css +3 -3
  195. package/front_end/panels/explain/components/ConsoleInsight.ts +2 -3
  196. package/front_end/panels/explain/explain-meta.ts +1 -1
  197. package/front_end/panels/issues/AffectedMetadataAllowedSitesView.ts +67 -34
  198. package/front_end/panels/issues/issues.ts +2 -0
  199. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +7 -3
  200. package/front_end/panels/lighthouse/LighthouseController.ts +29 -22
  201. package/front_end/panels/lighthouse/LighthousePanel.ts +5 -6
  202. package/front_end/panels/lighthouse/LighthouseProtocolService.ts +24 -16
  203. package/front_end/panels/media/PlayerMessagesView.ts +1 -1
  204. package/front_end/panels/mobile_throttling/CPUThrottlingSelector.ts +1 -1
  205. package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +45 -15
  206. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +3 -3
  207. package/front_end/panels/network/BinaryResourceView.ts +54 -50
  208. package/front_end/panels/network/RequestHeadersView.ts +6 -2
  209. package/front_end/panels/network/RequestPreviewView.ts +28 -5
  210. package/front_end/panels/network/ResourceWebSocketFrameView.ts +1 -0
  211. package/front_end/panels/network/components/EditableSpan.ts +11 -30
  212. package/front_end/panels/network/components/HeaderSectionRow.ts +2 -2
  213. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +10 -6
  214. package/front_end/panels/profiler/HeapDetachedElementsView.ts +112 -22
  215. package/front_end/panels/profiler/HeapProfileView.ts +3 -3
  216. package/front_end/panels/profiler/HeapSnapshotView.ts +12 -2
  217. package/front_end/panels/profiler/HeapTimelineOverview.ts +16 -2
  218. package/front_end/panels/profiler/profiler.ts +0 -2
  219. package/front_end/panels/protocol_monitor/JSONEditor.ts +1 -1
  220. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +1 -1
  221. package/front_end/panels/recorder/CreateRecordingView.ts +1 -1
  222. package/front_end/panels/recorder/RecordingView.ts +3 -3
  223. package/front_end/panels/recorder/ReplaySection.ts +1 -1
  224. package/front_end/panels/screencast/ScreencastApp.ts +83 -57
  225. package/front_end/panels/screencast/ScreencastView.ts +76 -45
  226. package/front_end/panels/screencast/screencastView.css +1 -1
  227. package/front_end/panels/settings/AISettingsTab.ts +107 -4
  228. package/front_end/panels/settings/aiSettingsTab.css +53 -0
  229. package/front_end/panels/settings/settings-meta.ts +1 -1
  230. package/front_end/panels/settings/settingsScreen.css +0 -4
  231. package/front_end/panels/sources/BreakpointEditDialog.ts +3 -6
  232. package/front_end/panels/sources/BreakpointsView.ts +2 -2
  233. package/front_end/panels/sources/DebuggerPlugin.ts +7 -0
  234. package/front_end/panels/sources/NavigatorView.ts +61 -18
  235. package/front_end/panels/sources/SourcesNavigator.ts +22 -7
  236. package/front_end/panels/sources/SourcesPanel.ts +1 -0
  237. package/front_end/panels/timeline/CountersGraph.ts +1 -1
  238. package/front_end/panels/timeline/README.md +12 -0
  239. package/front_end/panels/timeline/StatusDialog.ts +1 -1
  240. package/front_end/panels/timeline/ThirdPartyTreeView.ts +1 -3
  241. package/front_end/panels/timeline/TimelineCommentController.ts +346 -0
  242. package/front_end/panels/timeline/TimelineDetailsView.ts +24 -1
  243. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +34 -30
  244. package/front_end/panels/timeline/TimelineFlameChartView.ts +24 -10
  245. package/front_end/panels/timeline/TimelinePanel.ts +12 -5
  246. package/front_end/panels/timeline/TimelineTreeView.ts +28 -6
  247. package/front_end/panels/timeline/components/LiveMetricsView.ts +1 -1
  248. package/front_end/panels/timeline/components/fieldSettingsDialog.css +2 -2
  249. package/front_end/panels/timeline/components/insights/baseInsightComponent.css +1 -1
  250. package/front_end/panels/timeline/overlays/components/entriesLinkOverlay.css +2 -2
  251. package/front_end/panels/timeline/overlays/components/entryLabelOverlay.css +9 -9
  252. package/front_end/panels/timeline/timeline-meta.ts +2 -2
  253. package/front_end/panels/timeline/timeline.ts +4 -0
  254. package/front_end/panels/timeline/timelineFlamechartPopover.css +2 -2
  255. package/front_end/panels/timeline/timelinePanel.css +2 -2
  256. package/front_end/panels/timeline/utils/EntryNodes.ts +1 -1
  257. package/front_end/panels/web_audio/WebAudioView.ts +7 -4
  258. package/front_end/third_party/chromium/README.chromium +1 -1
  259. package/front_end/third_party/codemirror.next/chunk/angular.js +1 -1
  260. package/front_end/third_party/codemirror.next/chunk/angular.js.map +1 -1
  261. package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
  262. package/front_end/third_party/codemirror.next/chunk/codemirror.js.map +1 -1
  263. package/front_end/third_party/codemirror.next/chunk/cpp.js +1 -1
  264. package/front_end/third_party/codemirror.next/chunk/cpp.js.map +1 -1
  265. package/front_end/third_party/codemirror.next/chunk/java.js +1 -1
  266. package/front_end/third_party/codemirror.next/chunk/java.js.map +1 -1
  267. package/front_end/third_party/codemirror.next/chunk/less.js +1 -1
  268. package/front_end/third_party/codemirror.next/chunk/less.js.map +1 -1
  269. package/front_end/third_party/codemirror.next/chunk/markdown.js +1 -1
  270. package/front_end/third_party/codemirror.next/chunk/markdown.js.map +1 -1
  271. package/front_end/third_party/codemirror.next/chunk/php.js +1 -1
  272. package/front_end/third_party/codemirror.next/chunk/php.js.map +1 -1
  273. package/front_end/third_party/codemirror.next/chunk/python.js +1 -1
  274. package/front_end/third_party/codemirror.next/chunk/python.js.map +1 -1
  275. package/front_end/third_party/codemirror.next/chunk/sass.js +1 -1
  276. package/front_end/third_party/codemirror.next/chunk/sass.js.map +1 -1
  277. package/front_end/third_party/codemirror.next/chunk/svelte.js +1 -1
  278. package/front_end/third_party/codemirror.next/chunk/svelte.js.map +1 -1
  279. package/front_end/third_party/codemirror.next/chunk/vue.js +1 -1
  280. package/front_end/third_party/codemirror.next/chunk/vue.js.map +1 -1
  281. package/front_end/third_party/codemirror.next/chunk/wast.js +1 -1
  282. package/front_end/third_party/codemirror.next/chunk/wast.js.map +1 -1
  283. package/front_end/third_party/codemirror.next/chunk/xml.js +1 -1
  284. package/front_end/third_party/codemirror.next/chunk/xml.js.map +1 -1
  285. package/front_end/third_party/codemirror.next/codemirror.next.js +1 -1
  286. package/front_end/third_party/codemirror.next/rollup.config.mjs +1 -1
  287. package/front_end/third_party/puppeteer/README.chromium +2 -2
  288. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +42 -12
  289. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +154 -26
  290. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.d.ts +47 -7
  291. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.d.ts.map +1 -1
  292. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.js +56 -4
  293. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.js.map +1 -1
  294. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +6 -4
  295. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  296. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +5 -2
  297. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  298. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPRequest.d.ts +3 -3
  299. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
  300. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPRequest.js.map +1 -1
  301. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts +2 -1
  302. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts.map +1 -1
  303. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js +23 -11
  304. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js.map +1 -1
  305. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.d.ts +3 -3
  306. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
  307. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.js +1 -2
  308. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.js.map +1 -1
  309. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.d.ts +13 -7
  310. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
  311. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.js +26 -11
  312. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.js.map +1 -1
  313. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts +2 -1
  314. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts.map +1 -1
  315. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js.map +1 -1
  316. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.d.ts.map +1 -1
  317. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js +69 -13
  318. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js.map +1 -1
  319. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts +10 -0
  320. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  321. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  322. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  323. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js.map +1 -1
  324. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  325. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  326. package/front_end/third_party/puppeteer/package/lib/types.d.ts +42 -12
  327. package/front_end/third_party/puppeteer/package/package.json +4 -4
  328. package/front_end/third_party/puppeteer/package/src/api/HTTPRequest.ts +103 -11
  329. package/front_end/third_party/puppeteer/package/src/api/Page.ts +11 -6
  330. package/front_end/third_party/puppeteer/package/src/bidi/HTTPRequest.ts +4 -4
  331. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +26 -14
  332. package/front_end/third_party/puppeteer/package/src/cdp/HTTPRequest.ts +7 -7
  333. package/front_end/third_party/puppeteer/package/src/cdp/NetworkManager.ts +40 -18
  334. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +2 -3
  335. package/front_end/third_party/puppeteer/package/src/cdp/TargetManager.ts +87 -14
  336. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +10 -0
  337. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  338. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  339. package/front_end/tsconfig.json +1 -1
  340. package/front_end/ui/comments/CommentAnchorResolver.ts +1 -1
  341. package/front_end/ui/components/buttons/Button.ts +29 -18
  342. package/front_end/ui/components/code_highlighter/CodeHighlighter.ts +1 -1
  343. package/front_end/ui/components/dialogs/TypeToAllowDialog.ts +94 -39
  344. package/front_end/ui/components/dialogs/dialog.css +1 -1
  345. package/front_end/ui/components/menus/menuItem.css +11 -0
  346. package/front_end/ui/components/text_editor/AccessiblePlaceholder.ts +1 -1
  347. package/front_end/ui/components/text_editor/AiCodeCompletionTeaser.ts +1 -1
  348. package/front_end/ui/components/text_editor/config.ts +2 -1
  349. package/front_end/ui/components/text_editor/javascript.ts +2 -1
  350. package/front_end/ui/legacy/InspectorView.ts +4 -2
  351. package/front_end/ui/legacy/SplitWidget.ts +23 -24
  352. package/front_end/ui/legacy/TabbedPane.ts +9 -1
  353. package/front_end/ui/legacy/UIUtils.ts +60 -40
  354. package/front_end/ui/legacy/components/color_picker/spectrum.css +2 -2
  355. package/front_end/ui/legacy/components/data_grid/dataGrid.css +9 -0
  356. package/front_end/ui/legacy/components/inline_editor/CSSAngle.ts +0 -1
  357. package/front_end/ui/legacy/components/inline_editor/cssShadowEditor.css +5 -7
  358. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +1 -1
  359. package/front_end/ui/legacy/components/perf_ui/PieChart.ts +11 -0
  360. package/front_end/ui/legacy/components/perf_ui/chartViewport.css +4 -4
  361. package/front_end/ui/legacy/components/quick_open/filteredListWidget.css +6 -0
  362. package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +1 -1
  363. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +38 -13
  364. package/front_end/ui/legacy/dropTarget.css +1 -1
  365. package/front_end/ui/legacy/statusBar.css +7 -0
  366. package/front_end/ui/legacy/tabbedPane.css +0 -7
  367. package/front_end/ui/visual_logging/KnownContextValues.ts +55 -0
  368. package/inspector_overlay/main.ts +2 -15
  369. package/inspector_overlay/tool_persistent.ts +0 -14
  370. package/mcp/mcp.ts +3 -0
  371. package/package.json +1 -1
  372. package/.agents/skills/devtools-ux-writing-refactor/SKILL.md +0 -142
  373. package/front_end/panels/ai_assistance/components/StylingAgentMarkdownRenderer.ts +0 -178
  374. package/front_end/panels/profiler/HeapDetachedElementsDataGrid.ts +0 -147
  375. package/front_end/panels/profiler/heapDetachedElementsDataGrid.css +0 -14
  376. package/front_end/ui/components/legacy_wrapper/LegacyWrapper.ts +0 -62
  377. package/front_end/ui/components/legacy_wrapper/legacy_wrapper.ts +0 -8
  378. package/inspector_overlay/tool_green_dev_anchors.css +0 -54
  379. package/inspector_overlay/tool_green_dev_anchors.ts +0 -164
  380. /package/front_end/models/{ai_assistance → ai-utils}/AiSetting.ts +0 -0
  381. /package/front_end/models/{ai_assistance → ai-utils}/debug.ts +0 -0
@@ -18,7 +18,7 @@ import {
18
18
  type Matcher,
19
19
  stripComments,
20
20
  } from './CSSPropertyParser.js';
21
- import {CSSWideKeywordMatcher} from './CSSPropertyParserMatchers.js';
21
+ import {CSSWideKeywordMatcher, ImportantMatcher} from './CSSPropertyParserMatchers.js';
22
22
  import type {CSSStyleDeclaration} from './CSSStyleDeclaration.js';
23
23
  import {textEditorIndentSettingDescriptor} from './SDKSettings.js';
24
24
 
@@ -114,7 +114,7 @@ export class CSSProperty extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
114
114
  #matchers(matchedStyles: CSSMatchedStyles, computedStyles: Map<string, string>|null): Array<Matcher<Match>> {
115
115
  const matchers = matchedStyles.propertyMatchers(this.ownerStyle, computedStyles);
116
116
 
117
- matchers.push(new CSSWideKeywordMatcher(this, matchedStyles));
117
+ matchers.push(new CSSWideKeywordMatcher(this, matchedStyles), new ImportantMatcher());
118
118
  return matchers;
119
119
  }
120
120
 
@@ -341,7 +341,7 @@ class ComputedTextChunk {
341
341
  * original and computed slices as required.
342
342
  **/
343
343
  export class ComputedText {
344
- readonly #chunks: ComputedTextChunk[] = [];
344
+ #chunks: ComputedTextChunk[] = [];
345
345
  readonly text: string;
346
346
  readonly #topLevelValueCounts = new Map<string, number>();
347
347
 
@@ -356,6 +356,7 @@ export class ComputedText {
356
356
  }
357
357
 
358
358
  get chunkCount(): number {
359
+ this.#sortIfNecessary();
359
360
  return this.#chunks.length;
360
361
  }
361
362
 
@@ -363,6 +364,14 @@ export class ComputedText {
363
364
  if (this.#sorted) {
364
365
  return;
365
366
  }
367
+ // A match that was pushed more than once is superseded by its last push.
368
+ const lastPush = new Map<Match, ComputedTextChunk>();
369
+ for (const chunk of this.#chunks) {
370
+ lastPush.set(chunk.match, chunk);
371
+ }
372
+ if (lastPush.size < this.#chunks.length) {
373
+ this.#chunks = this.#chunks.filter(chunk => lastPush.get(chunk.match) === chunk);
374
+ }
366
375
  // Sort intervals by offset, with longer intervals first if the offset is identical.
367
376
  this.#chunks.sort((a, b) => {
368
377
  if (a.offset < b.offset) {
@@ -383,7 +392,7 @@ export class ComputedText {
383
392
  }
384
393
 
385
394
  // Add another substitutable match. The match will either be appended to the list of existing matches or it will
386
- // be substituted for the last match(es) if it encompasses them.
395
+ // be substituted for the last match(es) if it encompasses them. Pushing a match again supersedes its earlier push.
387
396
  push(match: Match, offset: number): void {
388
397
  function hasComputedText(match: Match): match is MatchWithComputedText {
389
398
  return Boolean(match.computedText);
@@ -360,6 +360,19 @@ export class TextMatcher extends TextMatcherBase {
360
360
  }
361
361
  }
362
362
 
363
+ export class ImportantMatch extends TextMatch {
364
+ override computedText = (): string => '';
365
+ }
366
+
367
+ const ImportantMatcherBase: MatcherClass<ImportantMatch> = matcherBase(ImportantMatch);
368
+ // clang-format off
369
+ export class ImportantMatcher extends ImportantMatcherBase {
370
+ // clang-format on
371
+ override matches(node: CodeMirror.SyntaxNode, matching: BottomUpTreeMatching): ImportantMatch|null {
372
+ return node.name === 'Important' ? new ImportantMatch(matching.ast.text(node), node) : null;
373
+ }
374
+ }
375
+
363
376
  export class AngleMatch implements Match {
364
377
  constructor(readonly text: string, readonly node: CodeMirror.SyntaxNode) {
365
378
  }
@@ -1167,14 +1180,15 @@ export class FlexGridGridLanesMatcher extends FlexGridGridLanesMatcherBase {
1167
1180
  .map(node => matching.getComputedText(node).trim())
1168
1181
  .filter(value => value);
1169
1182
  const text = values.join(' ');
1183
+ const valueText = matching.ast.textRange(valueNodes[0], valueNodes[valueNodes.length - 1]);
1170
1184
  if (FlexGridGridLanesMatcher.FLEX.includes(text)) {
1171
- return new FlexGridGridLanesMatch(matching.ast.text(node), node, LayoutType.FLEX);
1185
+ return new FlexGridGridLanesMatch(valueText, node, LayoutType.FLEX);
1172
1186
  }
1173
1187
  if (FlexGridGridLanesMatcher.GRID.includes(text)) {
1174
- return new FlexGridGridLanesMatch(matching.ast.text(node), node, LayoutType.GRID);
1188
+ return new FlexGridGridLanesMatch(valueText, node, LayoutType.GRID);
1175
1189
  }
1176
1190
  if (FlexGridGridLanesMatcher.GRID_LANES.includes(text)) {
1177
- return new FlexGridGridLanesMatch(matching.ast.text(node), node, LayoutType.GRID_LANES);
1191
+ return new FlexGridGridLanesMatch(valueText, node, LayoutType.GRID_LANES);
1178
1192
  }
1179
1193
  return null;
1180
1194
  }
@@ -1360,7 +1374,11 @@ export class CSSWideKeywordMatch implements Match {
1360
1374
  return this.matchedStyles.resolveGlobalKeyword(this.property, this.text);
1361
1375
  }
1362
1376
  computedText?(): string|null {
1363
- return this.resolveProperty()?.value ?? null;
1377
+ return this.resolveProperty()
1378
+ ?.declaration.parseValue(this.matchedStyles, null)
1379
+ ?.getComputedPropertyValueText()
1380
+ .trim() ??
1381
+ null;
1364
1382
  }
1365
1383
  }
1366
1384
 
@@ -1379,6 +1397,7 @@ export class CSSWideKeywordMatcher extends CSSWideKeywordMatcherBase {
1379
1397
  }
1380
1398
 
1381
1399
  if (Array.from(ASTUtils.stripComments(ASTUtils.siblings(ASTUtils.declValue(parentNode))))
1400
+ .filter(child => child.name !== 'Important')
1382
1401
  .some(child => !ASTUtils.equals(child, node))) {
1383
1402
  return null;
1384
1403
  }
@@ -1416,18 +1435,17 @@ export class PositionTryMatcher extends PositionTryMatcherBase {
1416
1435
  let preamble: CodeMirror.SyntaxNode[] = [];
1417
1436
  const valueNodes = ASTUtils.siblings(ASTUtils.declValue(node));
1418
1437
  const fallbacks = ASTUtils.split(valueNodes);
1419
- if (matching.ast.propertyName === LinkableNameProperties.POSITION_TRY) {
1420
1438
  for (const [i, n] of fallbacks[0].entries()) {
1421
1439
  const computedText = matching.getComputedText(n);
1422
1440
  if (CSSMetadata.isCSSWideKeyword(computedText)) {
1423
1441
  return null;
1424
1442
  }
1425
- if (CSSMetadata.isPositionTryOrderKeyword(computedText)) {
1443
+ if (matching.ast.propertyName === LinkableNameProperties.POSITION_TRY &&
1444
+ CSSMetadata.isPositionTryOrderKeyword(computedText)) {
1426
1445
  preamble = fallbacks[0].splice(0, i + 1);
1427
1446
  break;
1428
1447
  }
1429
1448
  }
1430
- }
1431
1449
 
1432
1450
  const valueText = matching.ast.textRange(valueNodes[0], valueNodes[valueNodes.length - 1]);
1433
1451
  return new PositionTryMatch(valueText, node, preamble, fallbacks);
@@ -1493,10 +1511,11 @@ export class PositionAreaMatcher extends PositionAreaMatcherBase {
1493
1511
  if (valueNodes.length === 0) {
1494
1512
  return null;
1495
1513
  }
1496
- const valueText = matching.getComputedTextRange(valueNodes[0], valueNodes[valueNodes.length - 1]);
1497
- if (CSSMetadata.isCSSWideKeyword(valueText)) {
1514
+ const computedText = matching.getComputedTextRange(valueNodes[0], valueNodes[valueNodes.length - 1]).trim();
1515
+ if (CSSMetadata.isCSSWideKeyword(computedText)) {
1498
1516
  return null;
1499
1517
  }
1518
+ const valueText = matching.ast.textRange(valueNodes[0], valueNodes[valueNodes.length - 1]);
1500
1519
  return new PositionAreaMatch(valueText, node);
1501
1520
  }
1502
1521
  }
@@ -1188,7 +1188,7 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
1188
1188
  }
1189
1189
 
1190
1190
  marker<T>(name: string): T|null {
1191
- return this.#markers.get(name) as T || null;
1191
+ return (this.#markers.get(name) as T) ?? null;
1192
1192
  }
1193
1193
 
1194
1194
  getMarkerKeysForTest(): string[] {
@@ -959,6 +959,9 @@ export class DebuggerModel extends SDKModel<EventTypes> {
959
959
  this.#disableAsyncStackTracesSetting.removeChangeListener(this.asyncStackTracesStateChanged, this);
960
960
  this.#breakpointsActiveSetting.removeChangeListener(this.breakpointsActiveChanged, this);
961
961
  this.#jsSourceMapsEnabledSetting.removeChangeListener(this.jsSourceMapsStateChanged, this);
962
+ // Drop all scripts and their source maps, so they don't outlive the target in case something
963
+ // still holds on to this model (e.g. a console message with "Preserve log" enabled).
964
+ this.reset();
962
965
  }
963
966
 
964
967
  override async suspendModel(): Promise<void> {
@@ -4,7 +4,7 @@
4
4
 
5
5
  import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
6
6
  import * as Protocol from '../../generated/protocol.js';
7
- import type * as Common from '../common/common.js';
7
+ import * as Common from '../common/common.js';
8
8
 
9
9
  import {CSSModel} from './CSSModel.js';
10
10
  import type {MultitargetNetworkManager} from './NetworkManager.js';
@@ -59,7 +59,7 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
59
59
  #screenOrientationLocked: boolean;
60
60
  #lockedOrientation: Protocol.Emulation.ScreenOrientation|null;
61
61
  readonly #dataSaverSetting: Common.Settings.Setting<DataSaverOverride>;
62
- readonly #dataSaverChangeListener: () => void;
62
+ readonly #settingListeners: Common.EventTarget.EventDescriptor[] = [];
63
63
 
64
64
  constructor(target: Target) {
65
65
  super(target);
@@ -78,22 +78,22 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
78
78
 
79
79
  const settings = this.target().targetManager().settings;
80
80
  const disableJavascriptSetting = settings.resolve(javaScriptDisabledSettingDescriptor);
81
- disableJavascriptSetting.addChangeListener(
81
+ this.#settingListeners.push(disableJavascriptSetting.addChangeListener(
82
82
  async () =>
83
- await this.#emulationAgent.invoke_setScriptExecutionDisabled({value: disableJavascriptSetting.get()}));
83
+ await this.#emulationAgent.invoke_setScriptExecutionDisabled({value: disableJavascriptSetting.get()})));
84
84
  if (disableJavascriptSetting.get()) {
85
85
  void this.#emulationAgent.invoke_setScriptExecutionDisabled({value: true});
86
86
  }
87
87
 
88
88
  const touchSetting = settings.resolve(touchSettingDescriptor);
89
- touchSetting.addChangeListener(() => {
89
+ this.#settingListeners.push(touchSetting.addChangeListener(() => {
90
90
  const settingValue = touchSetting.get();
91
91
 
92
92
  void this.overrideEmulateTouch(settingValue === 'force');
93
- });
93
+ }));
94
94
 
95
95
  const idleDetectionSetting = settings.resolve(idleDetectionSettingDescriptor);
96
- idleDetectionSetting.addChangeListener(async () => {
96
+ this.#settingListeners.push(idleDetectionSetting.addChangeListener(async () => {
97
97
  const settingValue = idleDetectionSetting.get();
98
98
  if (settingValue === 'none') {
99
99
  await this.clearIdleOverride();
@@ -105,10 +105,10 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
105
105
  isScreenUnlocked: boolean,
106
106
  });
107
107
  await this.setIdleOverride(emulationParams);
108
- });
108
+ }));
109
109
 
110
110
  const cpuPressureDetectionSetting = settings.resolve(cpuPressureSettingDescriptor);
111
- cpuPressureDetectionSetting.addChangeListener(async () => {
111
+ this.#settingListeners.push(cpuPressureDetectionSetting.addChangeListener(async () => {
112
112
  const settingValue = cpuPressureDetectionSetting.get();
113
113
 
114
114
  if (settingValue === 'none') {
@@ -123,7 +123,7 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
123
123
  }
124
124
 
125
125
  await this.setPressureStateOverride(settingValue);
126
- });
126
+ }));
127
127
 
128
128
  const mediaTypeSetting = settings.resolve(emulatedCSSMediaSettingDescriptor);
129
129
  const mediaFeatureColorGamutSetting = settings.resolve(emulatedCSSMediaFeatureColorGamutSettingDescriptor);
@@ -152,67 +152,69 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
152
152
  ['prefers-reduced-motion', mediaFeaturePrefersReducedMotionSetting.get()],
153
153
  ['prefers-reduced-transparency', mediaFeaturePrefersReducedTransparencySetting.get()],
154
154
  ]);
155
- mediaTypeSetting.addChangeListener(() => {
155
+ this.#settingListeners.push(mediaTypeSetting.addChangeListener(() => {
156
156
  this.#mediaConfiguration.set('type', mediaTypeSetting.get());
157
157
  void this.updateCssMedia();
158
- });
159
- mediaFeatureColorGamutSetting.addChangeListener(() => {
158
+ }));
159
+ this.#settingListeners.push(mediaFeatureColorGamutSetting.addChangeListener(() => {
160
160
  this.#mediaConfiguration.set('color-gamut', mediaFeatureColorGamutSetting.get());
161
161
  void this.updateCssMedia();
162
- });
163
- mediaFeaturePrefersColorSchemeSetting.addChangeListener(() => {
162
+ }));
163
+ this.#settingListeners.push(mediaFeaturePrefersColorSchemeSetting.addChangeListener(() => {
164
164
  this.#mediaConfiguration.set('prefers-color-scheme', mediaFeaturePrefersColorSchemeSetting.get());
165
165
  void this.updateCssMedia();
166
- });
167
- mediaFeatureForcedColorsSetting.addChangeListener(() => {
166
+ }));
167
+ this.#settingListeners.push(mediaFeatureForcedColorsSetting.addChangeListener(() => {
168
168
  this.#mediaConfiguration.set('forced-colors', mediaFeatureForcedColorsSetting.get());
169
169
  void this.updateCssMedia();
170
- });
171
- mediaFeaturePrefersContrastSetting.addChangeListener(() => {
170
+ }));
171
+ this.#settingListeners.push(mediaFeaturePrefersContrastSetting.addChangeListener(() => {
172
172
  this.#mediaConfiguration.set('prefers-contrast', mediaFeaturePrefersContrastSetting.get());
173
173
  void this.updateCssMedia();
174
- });
175
- mediaFeaturePrefersReducedDataSetting.addChangeListener(() => {
174
+ }));
175
+ this.#settingListeners.push(mediaFeaturePrefersReducedDataSetting.addChangeListener(() => {
176
176
  this.#mediaConfiguration.set('prefers-reduced-data', mediaFeaturePrefersReducedDataSetting.get());
177
177
  void this.updateCssMedia();
178
- });
179
- mediaFeaturePrefersReducedMotionSetting.addChangeListener(() => {
178
+ }));
179
+ this.#settingListeners.push(mediaFeaturePrefersReducedMotionSetting.addChangeListener(() => {
180
180
  this.#mediaConfiguration.set('prefers-reduced-motion', mediaFeaturePrefersReducedMotionSetting.get());
181
181
  void this.updateCssMedia();
182
- });
183
- mediaFeaturePrefersReducedTransparencySetting.addChangeListener(() => {
182
+ }));
183
+ this.#settingListeners.push(mediaFeaturePrefersReducedTransparencySetting.addChangeListener(() => {
184
184
  this.#mediaConfiguration.set('prefers-reduced-transparency', mediaFeaturePrefersReducedTransparencySetting.get());
185
185
  void this.updateCssMedia();
186
- });
186
+ }));
187
187
  void this.updateCssMedia();
188
188
 
189
189
  const autoDarkModeSetting = settings.resolve(emulateAutoDarkModeSettingDescriptor);
190
- autoDarkModeSetting.addChangeListener(() => {
190
+ this.#settingListeners.push(autoDarkModeSetting.addChangeListener(() => {
191
191
  const enabled = autoDarkModeSetting.get();
192
192
  mediaFeaturePrefersColorSchemeSetting.set(enabled ? 'dark' : '');
193
193
  void this.emulateAutoDarkMode(enabled);
194
- });
194
+ }));
195
195
  if (autoDarkModeSetting.get()) {
196
196
  mediaFeaturePrefersColorSchemeSetting.set('dark');
197
197
  void this.emulateAutoDarkMode(true);
198
198
  }
199
199
 
200
200
  const visionDeficiencySetting = settings.resolve(emulatedVisionDeficiencySettingDescriptor);
201
- visionDeficiencySetting.addChangeListener(() => this.emulateVisionDeficiency(visionDeficiencySetting.get()));
201
+ this.#settingListeners.push(
202
+ visionDeficiencySetting.addChangeListener(() => this.emulateVisionDeficiency(visionDeficiencySetting.get())));
202
203
  if (visionDeficiencySetting.get()) {
203
204
  void this.emulateVisionDeficiency(visionDeficiencySetting.get());
204
205
  }
205
206
 
206
207
  const osTextScaleSetting = settings.resolve(emulatedOSTextScaleSettingDescriptor);
207
- osTextScaleSetting.addChangeListener(() => {
208
+ this.#settingListeners.push(osTextScaleSetting.addChangeListener(() => {
208
209
  void this.emulateOSTextScale(parseFloat(osTextScaleSetting.get()) || undefined);
209
- });
210
+ }));
210
211
  if (osTextScaleSetting.get()) {
211
212
  void this.emulateOSTextScale(parseFloat(osTextScaleSetting.get()) || undefined);
212
213
  }
213
214
 
214
215
  const localFontsDisabledSetting = settings.resolve(localFontsDisabledSettingDescriptor);
215
- localFontsDisabledSetting.addChangeListener(() => this.setLocalFontsDisabled(localFontsDisabledSetting.get()));
216
+ this.#settingListeners.push(
217
+ localFontsDisabledSetting.addChangeListener(() => this.setLocalFontsDisabled(localFontsDisabledSetting.get())));
216
218
  if (localFontsDisabledSetting.get()) {
217
219
  this.setLocalFontsDisabled(localFontsDisabledSetting.get());
218
220
  }
@@ -235,19 +237,18 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
235
237
  this.setDisabledImageTypes(types);
236
238
  };
237
239
 
238
- avifFormatDisabledSetting.addChangeListener(updateDisabledImageFormats);
239
- jpegXlFormatDisabledSetting.addChangeListener(updateDisabledImageFormats);
240
- webpFormatDisabledSetting.addChangeListener(updateDisabledImageFormats);
240
+ this.#settingListeners.push(avifFormatDisabledSetting.addChangeListener(updateDisabledImageFormats));
241
+ this.#settingListeners.push(jpegXlFormatDisabledSetting.addChangeListener(updateDisabledImageFormats));
242
+ this.#settingListeners.push(webpFormatDisabledSetting.addChangeListener(updateDisabledImageFormats));
241
243
 
242
244
  if (avifFormatDisabledSetting.get() || jpegXlFormatDisabledSetting.get() || webpFormatDisabledSetting.get()) {
243
245
  updateDisabledImageFormats();
244
246
  }
245
247
 
246
248
  this.#dataSaverSetting = settings.resolve(dataSaverSettingDescriptor);
247
- this.#dataSaverChangeListener = () => {
249
+ this.#settingListeners.push(this.#dataSaverSetting.addChangeListener(() => {
248
250
  void this.setDataSaverOverride(this.#dataSaverSetting.get());
249
- };
250
- this.#dataSaverSetting.addChangeListener(this.#dataSaverChangeListener, this);
251
+ }));
251
252
  if (this.#dataSaverSetting.get() !== DataSaverOverride.UNSET) {
252
253
  void this.setDataSaverOverride(this.#dataSaverSetting.get());
253
254
  }
@@ -266,7 +267,7 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
266
267
 
267
268
  override dispose(): void {
268
269
  super.dispose();
269
- this.#dataSaverSetting.removeChangeListener(this.#dataSaverChangeListener, this);
270
+ Common.EventTarget.removeEventListeners(this.#settingListeners);
270
271
  }
271
272
 
272
273
  setTouchEmulationAllowed(touchEmulationAllowed: boolean): void {
@@ -563,6 +563,7 @@ export class NetworkManager extends SDKModel<EventTypes> {
563
563
  const settings = this.target().targetManager().settings;
564
564
  settings.resolve(cacheDisabledSettingDescriptor).removeChangeListener(this.cacheDisabledSettingChanged, this);
565
565
  settings.resolve(preserveNetworkLogSettingDescriptor).removeChangeListener(this.preserveLogChanged, this);
566
+ this.#bypassServiceWorkerSetting.removeChangeListener(this.bypassServiceWorkerChanged, this);
566
567
  }
567
568
 
568
569
  private bypassServiceWorkerChanged(): void {
@@ -762,6 +763,11 @@ export class FetchDispatcher implements ProtocolProxyApi.FetchDispatcher {
762
763
  }
763
764
  }
764
765
 
766
+ function multicastMembership(event: Pick<Protocol.Network.DirectUDPSocketJoinedMulticastGroupEvent, 'IPAddress'>&
767
+ {sourceAddress?: string}): string {
768
+ return event.sourceAddress ? `${event.IPAddress}@${event.sourceAddress}` : event.IPAddress;
769
+ }
770
+
765
771
  export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher {
766
772
  readonly #manager: NetworkManager;
767
773
  readonly #multitargetNetworkManager: MultitargetNetworkManager;
@@ -1742,8 +1748,9 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher {
1742
1748
  if (!networkRequest.directSocketInfo.joinedMulticastGroups) {
1743
1749
  networkRequest.directSocketInfo.joinedMulticastGroups = new Set();
1744
1750
  }
1745
- if (!networkRequest.directSocketInfo.joinedMulticastGroups.has(event.IPAddress)) {
1746
- networkRequest.directSocketInfo.joinedMulticastGroups.add(event.IPAddress);
1751
+ const membership = multicastMembership(event);
1752
+ if (!networkRequest.directSocketInfo.joinedMulticastGroups.has(membership)) {
1753
+ networkRequest.directSocketInfo.joinedMulticastGroups.add(membership);
1747
1754
  this.updateNetworkRequest(networkRequest);
1748
1755
  }
1749
1756
  }
@@ -1753,7 +1760,7 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher {
1753
1760
  if (!networkRequest?.directSocketInfo?.joinedMulticastGroups) {
1754
1761
  return;
1755
1762
  }
1756
- if (networkRequest.directSocketInfo.joinedMulticastGroups.delete(event.IPAddress)) {
1763
+ if (networkRequest.directSocketInfo.joinedMulticastGroups.delete(multicastMembership(event))) {
1757
1764
  this.updateNetworkRequest(networkRequest);
1758
1765
  }
1759
1766
  }
@@ -1506,6 +1506,27 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper<EventType
1506
1506
  return this.#contentData;
1507
1507
  }
1508
1508
 
1509
+ /**
1510
+ * Returns the response body without waiting for the request to finish loading.
1511
+ *
1512
+ * `requestContentData()` waits for `FINISHED_LOADING` when the request has no
1513
+ * content data provider. Some requests never finish: Chrome does not send
1514
+ * `loadingFinished` for a `Cache-Control: no-store` fetch() whose body the page
1515
+ * never reads, and synthetic requests without a provider are never finished at all.
1516
+ * Callers that must not block, such as AI context building, use this method instead.
1517
+ *
1518
+ * Requests with a content data provider (Local Overrides, Cache Storage, HAR
1519
+ * imports) resolve even when they have not finished.
1520
+ */
1521
+ requestContentDataIfAvailable(): Promise<TextUtils.ContentData.ContentDataOrError> {
1522
+ // A content data provider returns the body without waiting for the request
1523
+ // to finish, so only requests without a content data provider can block.
1524
+ if (!this.finished && !this.#contentDataProvider) {
1525
+ return Promise.resolve({error: 'Request has not finished loading'});
1526
+ }
1527
+ return this.requestContentData();
1528
+ }
1529
+
1509
1530
  setContentDataProvider(
1510
1531
  dataProvider: () => Promise<TextUtils.ContentData.ContentDataOrError>,
1511
1532
  ): void {
@@ -887,12 +887,10 @@ export class OverlayModel extends SDKModel<EventTypes> implements ProtocolProxyA
887
887
  return await this.#windowControls.initializeStyleSheetText(url);
888
888
  }
889
889
 
890
- inspectPanelShowRequested({backendNodeId}: Protocol.Overlay.InspectPanelShowRequestedEvent): void {
891
- this.dispatchEventToListeners(Events.INSPECT_PANEL_SHOW_REQUESTED, backendNodeId);
890
+ inspectPanelShowRequested(_event: Protocol.Overlay.InspectPanelShowRequestedEvent): void {
892
891
  }
893
892
 
894
- inspectedElementWindowRestored({backendNodeId}: Protocol.Overlay.InspectedElementWindowRestoredEvent): void {
895
- this.dispatchEventToListeners(Events.INSPECTED_ELEMENT_WINDOW_RESTORED, backendNodeId);
893
+ inspectedElementWindowRestored(_event: Protocol.Overlay.InspectedElementWindowRestoredEvent): void {
896
894
  }
897
895
  }
898
896
 
@@ -1028,8 +1026,6 @@ export const enum Events {
1028
1026
  PERSISTENT_FLEX_CONTAINER_OVERLAY_STATE_CHANGED = 'PersistentFlexContainerOverlayStateChanged',
1029
1027
  PERSISTENT_SCROLL_SNAP_OVERLAY_STATE_CHANGED = 'PersistentScrollSnapOverlayStateChanged',
1030
1028
  PERSISTENT_CONTAINER_QUERY_OVERLAY_STATE_CHANGED = 'PersistentContainerQueryOverlayStateChanged',
1031
- INSPECT_PANEL_SHOW_REQUESTED = 'InspectPanelShowRequested',
1032
- INSPECTED_ELEMENT_WINDOW_RESTORED = 'InspectedElementWindowRestored',
1033
1029
  }
1034
1030
 
1035
1031
  export interface ChangedNodeId {
@@ -1046,8 +1042,6 @@ export interface EventTypes {
1046
1042
  [Events.PERSISTENT_FLEX_CONTAINER_OVERLAY_STATE_CHANGED]: ChangedNodeId;
1047
1043
  [Events.PERSISTENT_SCROLL_SNAP_OVERLAY_STATE_CHANGED]: ChangedNodeId;
1048
1044
  [Events.PERSISTENT_CONTAINER_QUERY_OVERLAY_STATE_CHANGED]: ChangedNodeId;
1049
- [Events.INSPECT_PANEL_SHOW_REQUESTED]: number;
1050
- [Events.INSPECTED_ELEMENT_WINDOW_RESTORED]: number;
1051
1045
  }
1052
1046
 
1053
1047
  export interface Highlighter {
@@ -0,0 +1,79 @@
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 type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
6
+ import type * as Protocol from '../../generated/protocol.js';
7
+
8
+ import {SDKModel} from './SDKModel.js';
9
+ import {Capability, type Target} from './Target.js';
10
+
11
+ export class PrivateVerificationTokensModel extends SDKModel<EventTypes> implements ProtocolProxyApi.StorageDispatcher {
12
+ readonly #storageAgent: ProtocolProxyApi.StorageApi;
13
+
14
+ constructor(target: Target) {
15
+ super(target);
16
+ target.registerStorageDispatcher(this);
17
+ this.#storageAgent = target.storageAgent();
18
+ }
19
+
20
+ setTracking(enable: boolean): void {
21
+ void this.#storageAgent.invoke_setPrivateVerificationTokensTracking({enable});
22
+ }
23
+
24
+ async getTokens(): Promise<Protocol.Storage.PrivateVerificationToken[]> {
25
+ const response = await this.#storageAgent.invoke_getPrivateVerificationTokens();
26
+ if (response.getError()) {
27
+ return [];
28
+ }
29
+ return response.tokens ?? [];
30
+ }
31
+
32
+ async getIssuerConfigs(): Promise<Protocol.Storage.PrivateVerificationTokensIssuerConfig[]> {
33
+ const response = await this.#storageAgent.invoke_getPrivateVerificationTokensIssuerConfigs();
34
+ if (response.getError()) {
35
+ return [];
36
+ }
37
+ return response.configs ?? [];
38
+ }
39
+
40
+ async clearTokens(issuerOrigin: string): Promise<void> {
41
+ await this.#storageAgent.invoke_clearPrivateVerificationTokens({issuerOrigin});
42
+ }
43
+
44
+ async deleteToken(tokenId: string): Promise<void> {
45
+ await this.#storageAgent.invoke_deletePrivateVerificationToken({tokenId});
46
+ }
47
+
48
+ privateVerificationTokensUpdated(): void {
49
+ this.dispatchEventToListeners(Events.TOKENS_UPDATED);
50
+ }
51
+
52
+ cacheStorageContentUpdated(_event: Protocol.Storage.CacheStorageContentUpdatedEvent): void {
53
+ }
54
+
55
+ cacheStorageListUpdated(_event: Protocol.Storage.CacheStorageListUpdatedEvent): void {
56
+ }
57
+
58
+ indexedDBContentUpdated(_event: Protocol.Storage.IndexedDBContentUpdatedEvent): void {
59
+ }
60
+
61
+ indexedDBListUpdated(_event: Protocol.Storage.IndexedDBListUpdatedEvent): void {
62
+ }
63
+
64
+ storageBucketCreatedOrUpdated(_event: Protocol.Storage.StorageBucketCreatedOrUpdatedEvent): void {
65
+ }
66
+
67
+ storageBucketDeleted(_event: Protocol.Storage.StorageBucketDeletedEvent): void {
68
+ }
69
+ }
70
+
71
+ SDKModel.register(PrivateVerificationTokensModel, {capabilities: Capability.STORAGE, autostart: false});
72
+
73
+ export const enum Events {
74
+ TOKENS_UPDATED = 'TokensUpdated',
75
+ }
76
+
77
+ export interface EventTypes {
78
+ [Events.TOKENS_UPDATED]: void;
79
+ }
@@ -27,6 +27,7 @@ export class RuntimeModel extends SDKModel<EventTypes> {
27
27
  readonly agent: ProtocolProxyApi.RuntimeApi;
28
28
  readonly #executionContextById = new Map<number, ExecutionContext>();
29
29
  #executionContextComparator: (arg0: ExecutionContext, arg1: ExecutionContext) => number = ExecutionContext.comparator;
30
+ readonly #customFormattersSetting: Common.Settings.Setting<boolean>;
30
31
  constructor(target: Target) {
31
32
  super(target);
32
33
 
@@ -34,13 +35,17 @@ export class RuntimeModel extends SDKModel<EventTypes> {
34
35
  this.target().registerRuntimeDispatcher(new RuntimeDispatcher(this));
35
36
  void this.agent.invoke_enable();
36
37
 
37
- const customFormattersSetting =
38
+ this.#customFormattersSetting =
38
39
  this.target().targetManager().context.get(Common.Settings.Settings).resolve(customFormattersSettingDescriptor);
39
- if (customFormattersSetting.get()) {
40
+ if (this.#customFormattersSetting.get()) {
40
41
  void this.agent.invoke_setCustomObjectFormatterEnabled({enabled: true});
41
42
  }
42
43
 
43
- customFormattersSetting.addChangeListener(this.customFormattersStateChanged.bind(this));
44
+ this.#customFormattersSetting.addChangeListener(this.customFormattersStateChanged, this);
45
+ }
46
+
47
+ override dispose(): void {
48
+ this.#customFormattersSetting.removeChangeListener(this.customFormattersStateChanged, this);
44
49
  }
45
50
 
46
51
  static isSideEffectFailure(response: Protocol.Runtime.EvaluateResponse|EvaluationResult): boolean {
@@ -113,7 +113,7 @@ export class SecurityOrigin {
113
113
 
114
114
  if (rawUrl.toLowerCase().startsWith('file://')) {
115
115
  const parsed = Common.ParsedURL.ParsedURL.fromString(rawUrl as Platform.DevToolsPath.UrlString);
116
- if (!parsed) {
116
+ if (!parsed || parsed.path === '/') {
117
117
  return SecurityOrigin.createUniqueOpaque();
118
118
  }
119
119
  const authority = parsed.host + (parsed.port ? ':' + parsed.port : '');