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
@@ -43,7 +43,7 @@ Complex views can be broken down using helper functions defined inside `DEFAULT_
43
43
  ```ts
44
44
  // clang-format off
45
45
  const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLElement): void => {
46
- const renderHeader = (): Lit.LitTemplate => {
46
+ const renderHeader = (): LitTemplate => {
47
47
  return html`<h1>${input.title}</h1>`;
48
48
  };
49
49
  // ...
@@ -58,10 +58,13 @@ const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLElement)
58
58
 
59
59
  ### Composition
60
60
 
61
- * To render a child widget, the parent's View MUST use lit-html directive `UI.Widget.wiget`
61
+ * To render a child widget, the parent's View MUST use the lit-html directive `UI.Widget.widget`.
62
+ * **Strongly prefer the two-argument `widget(WidgetClass, {params})` form** over the single-argument factory callback `widget(element => new WidgetClass(element, ...))`. The two-argument form automatically updates properties and calls `requestUpdate()` on subsequent renders, whereas a factory callback only runs once on initial instantiation.
63
+ * If a child widget currently exposes imperative setter methods (e.g., `setStorageKey(key)` or `setStorageBucket(bucket)`) instead of public properties/setters, convert them into standard TypeScript setters (`set storageKey(key)`, `set storageBucket(bucket)`) on the child widget so it can be instantiated and updated declaratively via the two-argument `widget(WidgetClass, {params})` directive.
62
64
  * Configuration is passed via the parameters.
63
- * Properties passed from a parent MUST be declared as public fields on the child presenter class.
65
+ * Properties passed from a parent MUST be declared as public fields or setters on the child presenter class.
64
66
  * The framework automatically updates these properties and calls `requestUpdate()` on the child when the parent re-renders.
67
+ * **Pre-existing Widget Instances (`WrapperWidget`):** To render an existing `UI.Widget` instance (such as locations created by `UI.ViewManager`: `TabbedViewLocation.tabbedPane()`, `StackLocation.widget()`) declaratively without creating a custom wrapper class, use `${widget(UI.Widget.WrapperWidget, {widget: myWidgetInstance})}`. `WrapperWidget` automatically forwards constraints, handles attach/detach lifecycle, and supports dynamic widget replacement.
65
68
 
66
69
  ## Refactoring Legacy Components
67
70
 
@@ -106,7 +109,7 @@ render(html`
106
109
  **Note:** The `{host: input}` option in `render()` is generally **not required** unless you are using specific Shadow DOM patterns that necessitate it. The `@scope` strategy is the preferred method for style isolation in DevTools widgets.
107
110
 
108
111
  ### Legacy Interop & Refs
109
- * **Raw Elements:** Use `Lit.Directives.ref` to obtain a reference to a raw `HTMLElement` if needed for imperative APIs (e.g., `splitWidget.installResizer(element)`).
112
+ * **Raw Elements:** Use `Directives.ref` (from `ui/lit/lit.js`) to obtain a reference to a raw `HTMLElement` if needed for imperative APIs (e.g., `splitWidget.installResizer(element)`).
110
113
  * **Child Widgets:** Use `UI.Widget.widgetRef` to obtain the class instance of a child widget if you need to call methods on it directly (though declarative data flow is preferred).
111
114
 
112
115
  ### Dependencies
@@ -153,12 +156,12 @@ Example: `front_end/panels/my_example/MyExampleWidget.ts`.
153
156
  ```ts
154
157
  // front_end/panels/my_example/MyExampleWidget.ts
155
158
 
156
- import * as Lit from '../../ui/lit/lit.js';
159
+ import {Directives, html, render} from '../../ui/lit/lit.js';
157
160
  import * as UI from '../../ui/legacy/legacy.js';
158
161
 
159
162
  import myExampleWidgetStyles from './myExampleWidget.css.js';
160
163
 
161
- const {html, render, ref} = Lit;
164
+ const {ref} = Directives;
162
165
 
163
166
  // 1. Define Input data shape. (Assuming Child Widget configuration for completeness)
164
167
  export interface ViewInput {
@@ -241,14 +244,13 @@ Example: `front_end/panels/parent/ParentWidget.ts`. Demonstrates passing state v
241
244
  ```ts
242
245
  // front_end/panels/parent/ParentWidget.ts
243
246
 
244
- import * as Lit from '../../ui/lit/lit.js';
247
+ import {html, render} from '../../ui/lit/lit.js';
245
248
  import * as UI from '../../ui/legacy/legacy.js';
246
249
  import {MyExampleWidget} from '../my_example/MyExampleWidget.ts';
247
250
 
248
251
  import parentWidgetStyles from './parentWidgetStyles.css';
249
252
 
250
- const {html, render} = Lit;
251
- const {widgetConfig} = UI.Widget;
253
+ const {widget} = UI.Widget;
252
254
 
253
255
  interface ViewInput {
254
256
  title: string;
package/AUTHORS CHANGED
@@ -35,6 +35,7 @@ Conner Turner <cturner@zyme.xyz>
35
35
  Daniel bellfield <dnlbellfield@gmail.com>
36
36
  Danny Eldridge <me@heardanieljames.com>
37
37
  Derek Li <the.derekli@gmail.com>
38
+ DevTools AIRC Bot <devtools-airc-bot@mths-airc-433412.iam.gserviceaccount.com>
38
39
  Dmitry Kryaklin <dmkryak@gmail.com>
39
40
  Douglas Chiang <douglasdothnc@gmail.com>
40
41
  Dragonish <no.web.developer@outlook.com>
@@ -85,6 +86,7 @@ Muhammad Mahad <mahadtxt@gmail.com>
85
86
  Naoto Ono <onoto1998@gmail.com>
86
87
  Navoda Munasinha <navoda.munasinha@codimite.com>
87
88
  Nourhan Hasan <nourhan.m.hasan@gmail.com>
89
+ Omar Ramadan <omar@blockcast.net>
88
90
  Paras Awasthi <awasthiparas6@gmail.com>
89
91
  Paul Fisher <paul@pfish.zone>
90
92
  Peng Zhou <zhoupeng.1996@bytedance.com>
@@ -111,6 +113,7 @@ Simon Siefke <simon.siefke@gmail.com>
111
113
  Stephen Tsoi-A-Sue <stsoiasue@gmail.com>
112
114
  Steve Harrison <steve@steveharrison.dev>
113
115
  Sunnylost <sunnylost@gmail.com>
116
+ Sutthinon <mankhong.garden@gmail.com>
114
117
  Suyoung Jung <tdhitbtd@gmail.com>
115
118
  TaegeonKim <aksen5240@gmail.com>
116
119
  Thomas Stokes <git@tombl.dev>
package/DIR_METADATA CHANGED
@@ -17,6 +17,26 @@ agentic_review: {
17
17
  ".agents/skills/devtools-ux-writing-refactor/SKILL.md"
18
18
  ]
19
19
  }
20
+ capability_groups: {
21
+ path_expression: [
22
+ "front_end/(core|models|entrypoints|generated)/.*\\.ts",
23
+ ".*BUILD\\.gn",
24
+ ".*\\.gni"
25
+ ]
26
+ path_expression_exclusion: [".*\\.test\\.ts"]
27
+ rules: [
28
+ ".agents/rules/models-and-core/core-trace-engine-handler-invariants.md",
29
+ ".agents/rules/models-and-core/core-sdk-model-and-target-lifecycle.md",
30
+ ".agents/rules/models-and-core/core-gn-build-and-module-layering.md",
31
+ ".agents/rules/models-and-core/core-ai-agent-context-and-prompt-discipline.md",
32
+ ".agents/rules/models-and-core/core-runtime-neutrality-and-platform-utils.md",
33
+ ".agents/rules/models-and-core/core-cdp-and-extension-error-handling.md",
34
+ ".agents/rules/models-and-core/core-security-origin-and-capability-guards.md",
35
+ ".agents/rules/models-and-core/core-sourcemap-and-workspace-mapping.md",
36
+ ".agents/rules/models-and-core/core-settings-and-storage-migration.md",
37
+ ".agents/rules/models-and-core/core-trace-insight-models-and-timing-types.md"
38
+ ]
39
+ }
20
40
  capability_groups: {
21
41
  path_expression: ["front_end/(panels|ui)/.*\\.(ts|css)"]
22
42
  path_expression_exclusion: [".*\\.test\\.ts"]
@@ -24,13 +44,43 @@ agentic_review: {
24
44
  ".agents/skills/ui-widgets/SKILL.md",
25
45
  ".agents/skills/ui-eng-vision-orchestrator/SKILL.md"
26
46
  ]
47
+ rules: [
48
+ ".agents/rules/ui-and-widgets/ui-modern-component-and-encapsulation-standards.md",
49
+ ".agents/rules/ui-and-widgets/ui-type-safety-and-exhaustiveness.md",
50
+ ".agents/rules/ui-and-widgets/ui-pure-view-and-presenter-separation.md",
51
+ ".agents/rules/ui-and-widgets/ui-lit-declarative-templates-and-directives.md",
52
+ ".agents/rules/ui-and-widgets/ui-widget-dom-and-listener-lifecycle.md",
53
+ ".agents/rules/ui-and-widgets/ui-accessibility-and-semantic-html.md",
54
+ ".agents/rules/ui-and-widgets/ui-performance-and-flamechart-rendering.md",
55
+ ".agents/rules/ui-and-widgets/ui-localization-and-uistrings-hygiene.md",
56
+ ".agents/rules/ui-and-widgets/ui-reactive-widget-update-lifecycle.md",
57
+ ".agents/rules/ui-and-widgets/ui-visual-logging-instrumentation.md",
58
+ ".agents/rules/ui-and-widgets/ui-css-scoping-and-flex-layout.md",
59
+ ".agents/rules/ui-and-widgets/ui-view-output-and-callback-contracts.md",
60
+ ".agents/rules/ui-and-widgets/ui-panel-and-meta-registration.md",
61
+ ".agents/rules/ui-and-widgets/ui-weak-dom-references-and-observer-cleanup.md",
62
+ ".agents/rules/ui-and-widgets/ui-security-and-output-sanitization.md",
63
+ ".agents/rules/ui-and-widgets/ui-declarative-child-widget-composition.md",
64
+ ".agents/rules/ui-and-widgets/ui-await-update-complete-post-render.md"
65
+ ]
27
66
  }
28
67
  capability_groups: {
29
- path_expression: [".*\\.test\\.ts", "test/.*\\.ts"]
68
+ path_expression: [".*\\.test\\.ts", "test/.*\\.ts", "front_end/testing/.*\\.ts"]
30
69
  review_capability_skills: [
31
70
  ".agents/skills/devtools-testing-guidance/SKILL.md",
32
71
  ".agents/skills/foundation-test-migration/SKILL.md",
33
72
  ".agents/skills/fix-tests/SKILL.md"
34
73
  ]
74
+ rules: [
75
+ ".agents/rules/tests/test-shared-fixture-and-helper-reuse.md",
76
+ ".agents/rules/tests/test-modular-hooks-and-test-universe.md",
77
+ ".agents/rules/tests/test-deterministic-async-synchronization.md",
78
+ ".agents/rules/tests/test-strict-assertions-and-literal-expectations.md",
79
+ ".agents/rules/tests/test-view-and-presenter-isolation.md",
80
+ ".agents/rules/tests/test-public-api-and-encapsulation.md",
81
+ ".agents/rules/tests/test-single-responsibility-and-conciseness.md",
82
+ ".agents/rules/tests/test-type-safe-mocks-and-events.md",
83
+ ".agents/rules/tests/test-cleanup-mutated-globals-and-widgets.md"
84
+ ]
35
85
  }
36
86
  }
@@ -906,6 +906,34 @@ export const DEFAULT_VIEW = (input, _output, target) => {
906
906
  };
907
907
  ```
908
908
 
909
+ ### Long-press action buttons
910
+
911
+ Imperative long-press action buttons (`UI.Toolbar.Toolbar.createLongPressActionButton`) are migrated declaratively by nesting secondary `<devtools-button>` elements inside `<devtools-button ${bindToAction('...')}>`. The parent button triggers the primary action on click, and holding the button down opens a menu presenting the nested buttons:
912
+
913
+ ```typescript
914
+ export const DEFAULT_VIEW = (input, _output, target) => {
915
+ const {bindToAction} = UI.UIUtils;
916
+ render(html`
917
+ <devtools-toolbar>
918
+ <devtools-button ${bindToAction('debugger.toggle-pause')}>
919
+ <devtools-button
920
+ .iconName=${'stop'}
921
+ .variant=${Buttons.Button.Variant.TOOLBAR}
922
+ .title=${i18nString(UIStrings.terminateCurrentJavascriptCall)}
923
+ @click=${input.onTerminateExecution}>
924
+ </devtools-button>
925
+ <devtools-button
926
+ .iconName=${'play'}
927
+ .variant=${Buttons.Button.Variant.TOOLBAR}
928
+ .title=${i18nString(UIStrings.resumeWithAllPausesBlockedForMs)}
929
+ @click=${input.onLongResume}>
930
+ </devtools-button>
931
+ </devtools-button>
932
+ </devtools-toolbar>`,
933
+ target);
934
+ };
935
+ ```
936
+
909
937
  ## Binding a setting to a checkbox
910
938
 
911
939
  Use the `bindToSetting` directive to bind a boolean setting to a `<devtools-checkbox>` component.
@@ -1244,6 +1272,12 @@ export const DEFAULT_VIEW = (input, _output, target) => {
1244
1272
  };
1245
1273
  ```
1246
1274
 
1275
+ ### Pre-existing Widget Instances (`WrapperWidget`)
1276
+ When embedding pre-existing `UI.Widget` instances that are created elsewhere (such as `UI.ViewManager` locations: `TabbedViewLocation.tabbedPane()`, `StackLocation.widget()`), render them declaratively using `${widget(UI.Widget.WrapperWidget, {widget: myWidgetInstance})}` instead of creating custom wrapper widget classes. `WrapperWidget` automatically forwards constraints and manages child widget attach/detach lifecycles.
1277
+
1278
+ ### Preserving `showMode` Settings
1279
+ When migrating a `SplitWidget` that persists sidebar visibility (e.g. via `splitWidget.showModeSetting()`), bind the setting's value to the `<devtools-split-view show=${input.showMode}>` property (`Both`, `OnlyMain`, or `OnlySidebar`) to preserve user settings and layout state across sessions.
1280
+
1247
1281
  ## Migrating `UI.ARIAUtils` helpers
1248
1282
 
1249
1283
  Replace calls to `UI.ARIAUtils` helper functions with the corresponding ARIA attributes directly in the lit-html template.
package/eslint.config.mjs CHANGED
@@ -267,8 +267,7 @@ export default defineConfig([
267
267
  'error',
268
268
  {
269
269
  selector: 'ExportDefaultDeclaration',
270
- message:
271
- 'Default exports are not allowed. Use named exports instead.',
270
+ message: 'Default exports are not allowed. Use named exports instead.',
272
271
  },
273
272
  ],
274
273
  /**
@@ -309,8 +308,8 @@ export default defineConfig([
309
308
  'error',
310
309
  {
311
310
  definedTags: [
312
- 'attribute', // @attribute is used by lit-analyzer (through web-component-analyzer)
313
- 'meaning', // @meaning is used by localization
311
+ 'attribute', // @attribute is used by lit-analyzer (through web-component-analyzer)
312
+ 'meaning', // @meaning is used by localization
314
313
  ],
315
314
  },
316
315
  ],
@@ -341,11 +340,11 @@ export default defineConfig([
341
340
  parserOptions: {
342
341
  allowAutomaticSingleRunInference: true,
343
342
  project: join(
344
- import.meta.dirname,
345
- 'config',
346
- 'typescript',
347
- 'tsconfig.eslint.json',
348
- ),
343
+ import.meta.dirname,
344
+ 'config',
345
+ 'typescript',
346
+ 'tsconfig.eslint.json',
347
+ ),
349
348
  },
350
349
  },
351
350
 
@@ -588,12 +587,12 @@ export default defineConfig([
588
587
  {
589
588
  // Enforce that any import of models/trace/trace.js names the import Trace.
590
589
  modulePath: join(
591
- import.meta.dirname,
592
- 'front_end',
593
- 'models',
594
- 'trace',
595
- 'trace.js',
596
- ),
590
+ import.meta.dirname,
591
+ 'front_end',
592
+ 'models',
593
+ 'trace',
594
+ 'trace.js',
595
+ ),
597
596
  importName: 'Trace',
598
597
  },
599
598
  ],
@@ -668,6 +667,8 @@ export default defineConfig([
668
667
  ],
669
668
  '@devtools/static-custom-event-names': 'error',
670
669
  '@devtools/lit-no-attribute-quotes': 'error',
670
+ '@devtools/lit-no-non-latin1': 'error',
671
+ '@devtools/no-boolean-input-checked-attr': 'error',
671
672
  '@devtools/lit-template-result-or-nothing': 'error',
672
673
  '@devtools/inject-checkbox-styles': 'error',
673
674
  '@devtools/jslog-context-list': 'error',
@@ -792,6 +793,7 @@ export default defineConfig([
792
793
  '@devtools/prefer-url-string': 'error',
793
794
  '@devtools/trace-engine-test-timeouts': 'error',
794
795
  '@devtools/no-document-body-mutation': 'error',
796
+ '@devtools/no-manual-sinon-restore': 'error',
795
797
  // Don't update the KnownContext with test data.
796
798
  '@devtools/jslog-context-list': 'off',
797
799
  '@devtools/enforce-custom-element-definitions-location': 'off',
@@ -821,10 +823,16 @@ export default defineConfig([
821
823
  {
822
824
  name: 'Use private class members rule',
823
825
  files: [
826
+ 'front_end/core/**/*.ts',
827
+ 'front_end/models/**/*.ts',
824
828
  'front_end/panels/**/components/*.ts',
825
829
  'front_end/ui/components/**/*.ts',
826
830
  'front_end/entrypoints/**/*.ts',
827
831
  ],
832
+ ignores: [
833
+ 'front_end/core/**/*.test.ts',
834
+ 'front_end/models/**/*.test.ts',
835
+ ],
828
836
 
829
837
  rules: {
830
838
  '@devtools/prefer-private-class-members': 'error',
@@ -833,6 +841,29 @@ export default defineConfig([
833
841
  {
834
842
  name: 'Ignore private class members rule',
835
843
  files: [
844
+ 'front_end/core/common/**/*.ts',
845
+ 'front_end/core/host/**/*.ts',
846
+ 'front_end/core/platform/**/*.ts',
847
+ 'front_end/core/protocol_client/**/*.ts',
848
+ 'front_end/core/sdk/**/*.ts',
849
+ 'front_end/core/text_utils/**/*.ts',
850
+ 'front_end/models/bindings/**/*.ts',
851
+ 'front_end/models/breakpoints/**/*.ts',
852
+ 'front_end/models/computed_style/**/*.ts',
853
+ 'front_end/models/cpu_profile/**/*.ts',
854
+ 'front_end/models/elements/**/*.ts',
855
+ 'front_end/models/emulation/**/*.ts',
856
+ 'front_end/models/extensions/**/*.ts',
857
+ 'front_end/models/formatter/**/*.ts',
858
+ 'front_end/models/har/**/*.ts',
859
+ 'front_end/models/javascript_metadata/**/*.ts',
860
+ 'front_end/models/logs/**/*.ts',
861
+ 'front_end/models/persistence/**/*.ts',
862
+ 'front_end/models/source_map_scopes/**/*.ts',
863
+ 'front_end/models/trace/**/*.ts',
864
+ 'front_end/models/trace_source_maps_resolver/**/*.ts',
865
+ 'front_end/models/workspace/**/*.ts',
866
+ 'front_end/models/workspace_diff/**/*.ts',
836
867
  'front_end/panels/recorder/**/*.ts',
837
868
  'front_end/ui/components/suggestion_input/*.ts',
838
869
  ],
@@ -899,12 +930,12 @@ export default defineConfig([
899
930
  bannedImportPaths: [
900
931
  {
901
932
  bannedPath: join(
902
- import.meta.dirname,
903
- 'front_end',
904
- 'core',
905
- 'sdk',
906
- 'sdk.js',
907
- ),
933
+ import.meta.dirname,
934
+ 'front_end',
935
+ 'core',
936
+ 'sdk',
937
+ 'sdk.js',
938
+ ),
908
939
  allowTypeImports: true,
909
940
  },
910
941
  ],
@@ -963,4 +994,15 @@ export default defineConfig([
963
994
  'no-restricted-syntax': 'off',
964
995
  },
965
996
  },
997
+ {
998
+ name: 'Mocha test harness setup files',
999
+ files: [
1000
+ 'front_end/testing/test_setup.ts',
1001
+ 'test/unit/mocha-hooks.ts',
1002
+ ],
1003
+ rules: {
1004
+ // Global Mocha test harness restores Sinon stubs and timers after each test.
1005
+ '@devtools/no-manual-sinon-restore': 'off',
1006
+ },
1007
+ },
966
1008
  ]);
@@ -258,6 +258,11 @@ export class Settings {
258
258
  return setting;
259
259
  }
260
260
 
261
+ /** The event target shared by all settings. Change listeners are registered with the setting name as event type. */
262
+ get eventTargetForTest(): ObjectWrapper<GenericEvents> {
263
+ return this.#eventSupport;
264
+ }
265
+
261
266
  /**
262
267
  * Get setting via key, and create a new setting if the requested setting does not exist.
263
268
  * @param key kebab-case string ID
@@ -636,6 +636,7 @@ export enum IssueCreated {
636
636
  'GenericIssue::AutofillAndManualTextPolicyControlledFeaturesInfo' = 114,
637
637
  'GenericIssue::AutofillPolicyControlledFeatureInfo' = 115,
638
638
  'GenericIssue::ManualTextPolicyControlledFeatureInfo' = 116,
639
+ 'GenericIssue::GeolocationPromptWithoutUserGesture' = 117,
639
640
  'CorsIssue::InvalidLocalNetworkAccess' = 118,
640
641
  /* eslint-enable @typescript-eslint/naming-convention */
641
642
  MAX_VALUE = 119,
@@ -36,6 +36,7 @@ export interface HostRuntime {
36
36
  getCacheStorage(): CacheStorageLike|undefined;
37
37
  getDevicePixelRatio(): number;
38
38
  saveScreenshot(options: ScreenshotOptions): Promise<void>;
39
+ copyScreenshot(options: ScreenshotOptions): Promise<void>;
39
40
  revokeLastScreenshotUrl(): void;
40
41
  loadTextFile(url: URL): Promise<string>;
41
42
  evaluateCSS(dataValue: string|null, customExpr: string): string|null;
@@ -130,6 +130,15 @@ async function saveScreenshot(options: Api.HostRuntime.ScreenshotOptions): Promi
130
130
  link.click();
131
131
  }
132
132
 
133
+ async function copyScreenshot(options: Api.HostRuntime.ScreenshotOptions): Promise<void> {
134
+ const response = await fetch('data:image/png;base64,' + options.base64Png);
135
+ const blob = await response.blob();
136
+
137
+ await navigator.clipboard.write([
138
+ new ClipboardItem({'image/png': blob}),
139
+ ]);
140
+ }
141
+
133
142
  let cssEvaluationElement: HTMLElement|null = null;
134
143
 
135
144
  export const HOST_RUNTIME: Api.HostRuntime.HostRuntime = {
@@ -155,6 +164,7 @@ export const HOST_RUNTIME: Api.HostRuntime.HostRuntime = {
155
164
  return window.devicePixelRatio;
156
165
  },
157
166
  saveScreenshot,
167
+ copyScreenshot,
158
168
  revokeLastScreenshotUrl,
159
169
  async loadTextFile(url: URL): Promise<string> {
160
170
  const response = await fetch(url);
@@ -137,6 +137,7 @@ export const HOST_RUNTIME: Api.HostRuntime.HostRuntime = {
137
137
  return 1;
138
138
  },
139
139
  async saveScreenshot(_options: Api.HostRuntime.ScreenshotOptions): Promise<void>{},
140
+ async copyScreenshot(_options: Api.HostRuntime.ScreenshotOptions): Promise<void>{},
140
141
  revokeLastScreenshotUrl(): void{},
141
142
  async loadTextFile(url: URL): Promise<string> {
142
143
  return await Fs.promises.readFile(Url.fileURLToPath(url), 'utf-8');
@@ -27,6 +27,7 @@ import {
27
27
  EnvFunctionMatcher,
28
28
  FlexGridGridLanesMatcher,
29
29
  GridTemplateMatcher,
30
+ ImportantMatcher,
30
31
  LengthMatcher,
31
32
  LightDarkColorMatcher,
32
33
  LinearGradientMatcher,
@@ -140,6 +141,10 @@ function cleanUserAgentPayload(payload: Protocol.CSS.RuleMatch[]): Protocol.CSS.
140
141
  }
141
142
  }
142
143
 
144
+ function parseCustomHighlightName(selectorText: string): string|null {
145
+ return selectorText.match(/::highlight\(([^)]+)\)/)?.[1] ?? null;
146
+ }
147
+
143
148
  /**
144
149
  * Return a mapping of the highlight names in the specified RuleMatch to
145
150
  * the indices of selectors in that selector list with that highlight name.
@@ -164,15 +169,15 @@ function cleanUserAgentPayload(payload: Protocol.CSS.RuleMatch[]): Protocol.CSS.
164
169
  * list associated with ruleMatch. The indices correspond to the selectors in the rule
165
170
  * associated with the key's highlight name.
166
171
  */
167
- function customHighlightNamesToMatchingSelectorIndices(ruleMatch: Protocol.CSS.RuleMatch): Map<string, number[]> {
172
+ function customHighlightNamesToMatchingSelectorIndices(ruleMatch: Protocol.CSS.RuleMatch,
173
+ highlightNames: Set<string>): Map<string, number[]> {
168
174
  const highlightNamesToMatchingSelectors = new Map<string, number[]>();
169
175
 
170
176
  for (let i = 0; i < ruleMatch.matchingSelectors.length; i++) {
171
177
  const matchingSelectorIndex = ruleMatch.matchingSelectors[i];
172
178
  const selectorText = ruleMatch.rule.selectorList.selectors[matchingSelectorIndex].text;
173
- const highlightNameMatch = selectorText.match(/::highlight\((.*)\)/);
174
- if (highlightNameMatch) {
175
- const highlightName = highlightNameMatch[1];
179
+ const highlightName = parseCustomHighlightName(selectorText);
180
+ if (highlightName) {
176
181
  const selectorsForName = highlightNamesToMatchingSelectors.get(highlightName);
177
182
  if (selectorsForName) {
178
183
  selectorsForName.push(matchingSelectorIndex);
@@ -181,9 +186,36 @@ function customHighlightNamesToMatchingSelectorIndices(ruleMatch: Protocol.CSS.R
181
186
  }
182
187
  }
183
188
  }
189
+
190
+ const universalSelectors = highlightNamesToMatchingSelectors.get('*');
191
+ if (universalSelectors) {
192
+ for (const highlightName of highlightNames) {
193
+ const selectorsForName = highlightNamesToMatchingSelectors.get(highlightName) ?? [];
194
+ highlightNamesToMatchingSelectors.set(highlightName, [...selectorsForName, ...universalSelectors]);
195
+ }
196
+ }
184
197
  return highlightNamesToMatchingSelectors;
185
198
  }
186
199
 
200
+ function getCustomHighlightNames(pseudoPayload: Protocol.CSS.PseudoElementMatches[]): Set<string> {
201
+ const highlightNames = new Set<string>();
202
+ for (const entryPayload of pseudoPayload) {
203
+ if (entryPayload.pseudoType !== Protocol.DOM.PseudoType.Highlight || !entryPayload.matches) {
204
+ continue;
205
+ }
206
+ for (const ruleMatch of entryPayload.matches) {
207
+ for (const matchingSelectorIndex of ruleMatch.matchingSelectors) {
208
+ const selectorText = ruleMatch.rule.selectorList.selectors[matchingSelectorIndex].text;
209
+ const highlightName = parseCustomHighlightName(selectorText);
210
+ if (highlightName && highlightName !== '*') {
211
+ highlightNames.add(highlightName);
212
+ }
213
+ }
214
+ }
215
+ }
216
+ return highlightNames;
217
+ }
218
+
187
219
  function queryMatches(style: CSSStyleDeclaration): boolean {
188
220
  if (!style.parentRule) {
189
221
  return true;
@@ -564,13 +596,14 @@ export class CSSMatchedStyles {
564
596
  * This helper function takes a list of rule matches and generates separate NodeCascades
565
597
  * for each custom highlight name that was matched.
566
598
  */
567
- private buildSplitCustomHighlightCascades(
568
- rules: Protocol.CSS.RuleMatch[], node: DOMNode, isInherited: boolean,
569
- pseudoCascades: Map<string, NodeCascade[]>): void {
599
+ private buildSplitCustomHighlightCascades(rules: Protocol.CSS.RuleMatch[], node: DOMNode, isInherited: boolean,
600
+ highlightNames: Set<string>,
601
+ pseudoCascades: Map<string, NodeCascade[]>): void {
570
602
  const splitHighlightRules = new Map<string, CSSStyleDeclaration[]>();
571
603
 
572
604
  for (let j = rules.length - 1; j >= 0; --j) {
573
- const highlightNamesToMatchingSelectorIndices = customHighlightNamesToMatchingSelectorIndices(rules[j]);
605
+ const highlightNamesToMatchingSelectorIndices =
606
+ customHighlightNamesToMatchingSelectorIndices(rules[j], highlightNames);
574
607
 
575
608
  for (const [highlightName, matchingSelectors] of highlightNamesToMatchingSelectorIndices) {
576
609
  const pseudoRule = new CSSStyleRule(this.#cssModel, rules[j].rule);
@@ -613,6 +646,8 @@ export class CSSMatchedStyles {
613
646
 
614
647
  const pseudoCascades = new Map<Protocol.DOM.PseudoType, NodeCascade[]>();
615
648
  const customHighlightPseudoCascades = new Map<string, NodeCascade[]>();
649
+ const highlightNames = getCustomHighlightNames(
650
+ [...pseudoPayload, ...(inheritedPseudoPayload || []).flatMap(entry => entry.pseudoElements)]);
616
651
  for (let i = 0; i < pseudoPayload.length; ++i) {
617
652
  const entryPayload = pseudoPayload[i];
618
653
  // PseudoElement nodes are not created unless "content" css property is set.
@@ -621,8 +656,8 @@ export class CSSMatchedStyles {
621
656
  const rules = entryPayload.matches || [];
622
657
 
623
658
  if (entryPayload.pseudoType === Protocol.DOM.PseudoType.Highlight) {
624
- this.buildSplitCustomHighlightCascades(
625
- rules, this.#node, false /* #isInherited */, customHighlightPseudoCascades);
659
+ this.buildSplitCustomHighlightCascades(rules, this.#node, false /* #isInherited */, highlightNames,
660
+ customHighlightPseudoCascades);
626
661
  } else {
627
662
  for (let j = rules.length - 1; j >= 0; --j) {
628
663
  const pseudoRule = new CSSStyleRule(this.#cssModel, rules[j].rule);
@@ -651,8 +686,8 @@ export class CSSMatchedStyles {
651
686
  const rules = inheritedEntryPayload.matches || [];
652
687
 
653
688
  if (inheritedEntryPayload.pseudoType === Protocol.DOM.PseudoType.Highlight) {
654
- this.buildSplitCustomHighlightCascades(
655
- rules, parentNode, true /* #isInherited */, customHighlightPseudoCascades);
689
+ this.buildSplitCustomHighlightCascades(rules, parentNode, true /* #isInherited */, highlightNames,
690
+ customHighlightPseudoCascades);
656
691
  } else {
657
692
  const pseudoStyles = [];
658
693
  for (let k = rules.length - 1; k >= 0; --k) {
@@ -1490,19 +1525,23 @@ class DOMInheritanceCascade {
1490
1525
  return null;
1491
1526
  }
1492
1527
 
1493
- if (definedValue.declaration.declaration instanceof CSSProperty && definedValue.declaration.value &&
1494
- CSSMetadata.isCSSWideKeyword(definedValue.declaration.value)) {
1495
- const resolvedProperty =
1496
- this.resolveGlobalKeyword(definedValue.declaration.declaration, definedValue.declaration.value);
1528
+ while (definedValue.declaration.declaration instanceof CSSProperty && definedValue.declaration.value) {
1529
+ const value = PropertyParser
1530
+ .matchDeclaration(`--${variableName}`, definedValue.declaration.value, [new ImportantMatcher()])
1531
+ ?.getComputedPropertyValueText()
1532
+ .trim();
1533
+ if (!value || !CSSMetadata.isCSSWideKeyword(value)) {
1534
+ break;
1535
+ }
1536
+ const resolvedProperty = this.resolveGlobalKeyword(definedValue.declaration.declaration, value);
1497
1537
  if (!resolvedProperty) {
1498
1538
  return definedValue;
1499
1539
  }
1500
1540
  const declaration = new CSSValueSource(resolvedProperty);
1501
- const {value} = declaration;
1502
- if (!value) {
1541
+ if (!declaration.value) {
1503
1542
  return definedValue;
1504
1543
  }
1505
- definedValue = {declaration, value};
1544
+ definedValue = {declaration, value: declaration.value};
1506
1545
  }
1507
1546
 
1508
1547
  const ast = PropertyParser.tokenizeDeclaration(`--${variableName}`, definedValue.value);
@@ -1623,9 +1662,10 @@ class DOMInheritanceCascade {
1623
1662
  }
1624
1663
  return evaluateFallback(match.fallback, match.matching);
1625
1664
  }),
1665
+ ...(declaration ? [new ImportantMatcher()] : []),
1626
1666
  ]);
1627
1667
  const decl = PropertyParser.ASTUtils.siblings(PropertyParser.ASTUtils.declValue(matching.ast.tree));
1628
- const declText = decl.length > 0 ? matching.getComputedTextRange(decl[0], decl[decl.length - 1]) : '';
1668
+ const declText = decl.length > 0 ? matching.getComputedTextRange(decl[0], decl[decl.length - 1]).trim() : '';
1629
1669
  const hasUnresolvedSubstitutions =
1630
1670
  decl.length > 0 && matching.hasUnresolvedSubstitutionsRange(decl[0], decl[decl.length - 1]);
1631
1671
  const computedText = hasUnresolvedSubstitutions ? null : declText;
@@ -537,6 +537,24 @@ export class CSSModel extends SDKModel<EventTypes> {
537
537
  return true;
538
538
  }
539
539
 
540
+ forcePositionTryOption(node: DOMNode, index?: number): boolean {
541
+ const currentForcedIndex = node.marker<number>(PositionTryOptionMarker) ?? undefined;
542
+ if (currentForcedIndex === index) {
543
+ return false;
544
+ }
545
+ node.setMarker(PositionTryOptionMarker, index ?? null);
546
+ if (node.id === undefined) {
547
+ return false;
548
+ }
549
+ void this.agent.invoke_forcePositionTryOption({nodeId: node.id, index});
550
+ this.dispatchEventToListeners(Events.PositionTryOptionForced, node);
551
+ return true;
552
+ }
553
+
554
+ forcedPositionTryOption(node: DOMNode): number|undefined {
555
+ return node.marker<number>(PositionTryOptionMarker) ?? undefined;
556
+ }
557
+
540
558
  forcePseudoState(node: DOMNode, pseudoClass: string, enable: boolean): boolean {
541
559
  const forcedPseudoClasses = node.marker<string[]>(PseudoStateMarker) || [];
542
560
  const hasPseudoClass = forcedPseudoClasses.includes(pseudoClass);
@@ -1058,6 +1076,7 @@ export enum Events {
1058
1076
  MediaQueryResultChanged = 'MediaQueryResultChanged',
1059
1077
  ModelWasEnabled = 'ModelWasEnabled',
1060
1078
  ModelDisposed = 'ModelDisposed',
1079
+ PositionTryOptionForced = 'PositionTryOptionForced',
1061
1080
  PseudoStateForced = 'PseudoStateForced',
1062
1081
  StartingStylesStateForced = 'StartingStylesStateForced',
1063
1082
  StyleSheetAdded = 'StyleSheetAdded',
@@ -1087,6 +1106,7 @@ export interface EventTypes {
1087
1106
  [Events.MediaQueryResultChanged]: void;
1088
1107
  [Events.ModelWasEnabled]: void;
1089
1108
  [Events.ModelDisposed]: CSSModel;
1109
+ [Events.PositionTryOptionForced]: DOMNode;
1090
1110
  [Events.PseudoStateForced]: PseudoStateForcedEvent;
1091
1111
  [Events.StartingStylesStateForced]: DOMNode;
1092
1112
  [Events.StyleSheetAdded]: CSSStyleSheetHeader;
@@ -1096,6 +1116,7 @@ export interface EventTypes {
1096
1116
  }
1097
1117
 
1098
1118
  const PseudoStateMarker = 'pseudo-state-marker';
1119
+ const PositionTryOptionMarker = 'position-try-option-marker';
1099
1120
 
1100
1121
  export class Edit {
1101
1122
  styleSheetId: string;