chrome-devtools-frontend 1.0.1376716 → 1.0.1380117

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 (434) hide show
  1. package/config/gni/devtools_grd_files.gni +15 -7
  2. package/config/gni/devtools_image_files.gni +2 -0
  3. package/front_end/Images/src/animation.svg +3 -0
  4. package/front_end/Images/src/brush-2.svg +3 -0
  5. package/front_end/core/common/SettingRegistration.ts +1 -1
  6. package/front_end/core/host/AidaClient.ts +1 -0
  7. package/front_end/core/host/InspectorFrontendHost.ts +4 -0
  8. package/front_end/core/i18n/ByteUtilities.test.ts +34 -0
  9. package/front_end/core/i18n/ByteUtilities.ts +65 -0
  10. package/front_end/core/i18n/NumberFormatter.ts +75 -0
  11. package/front_end/core/i18n/i18n.ts +4 -0
  12. package/front_end/core/i18n/time-utilities.test.ts +20 -2
  13. package/front_end/core/i18n/time-utilities.ts +125 -86
  14. package/front_end/core/platform/NumberUtilities.test.ts +3 -26
  15. package/front_end/core/platform/NumberUtilities.ts +0 -20
  16. package/front_end/core/root/Runtime.ts +6 -3
  17. package/front_end/core/sdk/CPUThrottlingManager.ts +4 -0
  18. package/front_end/core/sdk/CSSContainerQuery.test.ts +10 -16
  19. package/front_end/core/sdk/CSSContainerQuery.ts +3 -15
  20. package/front_end/core/sdk/CSSMatchedStyles.test.ts +4 -0
  21. package/front_end/core/sdk/CSSMatchedStyles.ts +5 -5
  22. package/front_end/core/sdk/CSSModel.ts +18 -0
  23. package/front_end/core/sdk/CSSPropertyParser.test.ts +16 -1
  24. package/front_end/core/sdk/CSSPropertyParser.ts +2 -2
  25. package/front_end/core/sdk/sdk-meta.ts +8 -0
  26. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +3 -3
  27. package/front_end/generated/ARIAProperties.js +4 -0
  28. package/front_end/generated/InspectorBackendCommands.js +8 -6
  29. package/front_end/generated/SupportedCSSProperties.js +17 -4
  30. package/front_end/generated/protocol-mapping.d.ts +15 -1
  31. package/front_end/generated/protocol-proxy-api.d.ts +14 -1
  32. package/front_end/generated/protocol.ts +26 -2
  33. package/front_end/models/extensions/ExtensionAPI.ts +9 -1
  34. package/front_end/models/heap_snapshot_model/HeapSnapshotModel.ts +2 -0
  35. package/front_end/models/javascript_metadata/NativeFunctions.js +8 -21
  36. package/front_end/models/live-metrics/web-vitals-injected/{rollup.config.js → rollup.config.mjs} +1 -1
  37. package/front_end/models/persistence/EditFileSystemView.ts +19 -9
  38. package/front_end/models/persistence/WorkspaceSettingsTab.ts +50 -54
  39. package/front_end/models/persistence/editFileSystemView.css +35 -15
  40. package/front_end/models/persistence/workspaceSettingsTab.css +21 -87
  41. package/front_end/models/timeline_model/timeline_model.ts +0 -6
  42. package/front_end/models/trace/Processor.test.ts +18 -17
  43. package/front_end/models/trace/Processor.ts +10 -14
  44. package/front_end/models/trace/README.md +0 -1
  45. package/front_end/models/{timeline_model → trace/extras}/TimelineJSProfile.ts +19 -29
  46. package/front_end/models/{timeline_model/TimelineModelFilter.test.ts → trace/extras/TraceFilter.test.ts} +15 -17
  47. package/front_end/models/trace/extras/TraceFilter.ts +62 -0
  48. package/front_end/models/{timeline_model/TimelineProfileTree.test.ts → trace/extras/TraceTree.test.ts} +44 -43
  49. package/front_end/models/{timeline_model/TimelineProfileTree.ts → trace/extras/TraceTree.ts} +65 -59
  50. package/front_end/models/trace/extras/extras.ts +3 -0
  51. package/front_end/models/trace/handlers/AnimationHandler.ts +0 -8
  52. package/front_end/models/trace/handlers/ExtensionTraceDataHandler.ts +1 -11
  53. package/front_end/models/trace/handlers/FramesHandler.test.ts +1 -6
  54. package/front_end/models/trace/handlers/FramesHandler.ts +1 -14
  55. package/front_end/models/trace/handlers/GPUHandler.test.ts +0 -2
  56. package/front_end/models/trace/handlers/GPUHandler.ts +1 -25
  57. package/front_end/models/trace/handlers/ImagePaintingHandler.ts +3 -0
  58. package/front_end/models/trace/handlers/InitiatorsHandler.test.ts +0 -1
  59. package/front_end/models/trace/handlers/InitiatorsHandler.ts +0 -20
  60. package/front_end/models/trace/handlers/InvalidationsHandler.test.ts +0 -1
  61. package/front_end/models/trace/handlers/InvalidationsHandler.ts +0 -18
  62. package/front_end/models/trace/handlers/LargestImagePaintHandler.test.ts +2 -2
  63. package/front_end/models/trace/handlers/LargestImagePaintHandler.ts +63 -3
  64. package/front_end/models/trace/handlers/LargestTextPaintHandler.ts +3 -0
  65. package/front_end/models/trace/handlers/LayerTreeHandler.test.ts +0 -2
  66. package/front_end/models/trace/handlers/LayerTreeHandler.ts +1 -18
  67. package/front_end/models/trace/handlers/LayoutShiftsHandler.test.ts +0 -3
  68. package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +1 -20
  69. package/front_end/models/trace/handlers/MemoryHandler.test.ts +0 -1
  70. package/front_end/models/trace/handlers/MemoryHandler.ts +3 -0
  71. package/front_end/models/trace/handlers/MetaHandler.test.ts +1 -32
  72. package/front_end/models/trace/handlers/MetaHandler.ts +2 -30
  73. package/front_end/models/trace/handlers/NetworkRequestsHandler.test.ts +0 -26
  74. package/front_end/models/trace/handlers/NetworkRequestsHandler.ts +4 -23
  75. package/front_end/models/trace/handlers/PageFramesHandler.ts +3 -0
  76. package/front_end/models/trace/handlers/RendererHandler.test.ts +0 -4
  77. package/front_end/models/trace/handlers/RendererHandler.ts +1 -24
  78. package/front_end/models/trace/handlers/SamplesHandler.test.ts +0 -5
  79. package/front_end/models/trace/handlers/SamplesHandler.ts +0 -26
  80. package/front_end/models/trace/handlers/ScreenshotsHandler.test.ts +0 -1
  81. package/front_end/models/trace/handlers/SelectorStatsHandler.ts +3 -0
  82. package/front_end/models/trace/handlers/ServerTimingsHandler.ts +1 -16
  83. package/front_end/models/trace/handlers/Threads.test.ts +1 -2
  84. package/front_end/models/trace/handlers/UserInteractionsHandler.test.ts +4 -27
  85. package/front_end/models/trace/handlers/UserInteractionsHandler.ts +16 -25
  86. package/front_end/models/trace/handlers/UserTimingsHandler.ts +0 -17
  87. package/front_end/models/trace/handlers/WorkersHandler.test.ts +0 -1
  88. package/front_end/models/trace/handlers/WorkersHandler.ts +0 -23
  89. package/front_end/models/trace/handlers/types.ts +1 -8
  90. package/front_end/models/trace/insights/{CumulativeLayoutShift.test.ts → CLSCulprits.test.ts} +21 -21
  91. package/front_end/models/trace/insights/{CumulativeLayoutShift.ts → CLSCulprits.ts} +24 -5
  92. package/front_end/models/trace/insights/Common.ts +5 -55
  93. package/front_end/models/trace/insights/DocumentLatency.test.ts +2 -2
  94. package/front_end/models/trace/insights/DocumentLatency.ts +26 -6
  95. package/front_end/models/trace/insights/FontDisplay.ts +24 -5
  96. package/front_end/models/trace/insights/InteractionToNextPaint.test.ts +1 -1
  97. package/front_end/models/trace/insights/InteractionToNextPaint.ts +26 -6
  98. package/front_end/models/trace/insights/LCPDiscovery.test.ts +58 -0
  99. package/front_end/models/trace/insights/LCPDiscovery.ts +101 -0
  100. package/front_end/models/trace/insights/{LargestContentfulPaint.test.ts → LCPPhases.test.ts} +6 -28
  101. package/front_end/models/trace/insights/{LargestContentfulPaint.ts → LCPPhases.ts} +37 -38
  102. package/front_end/models/trace/insights/{InsightRunners.ts → Models.ts} +4 -3
  103. package/front_end/models/trace/insights/RenderBlocking.test.ts +1 -1
  104. package/front_end/models/trace/insights/RenderBlocking.ts +33 -28
  105. package/front_end/models/trace/insights/SlowCSSSelector.ts +26 -5
  106. package/front_end/models/trace/insights/{ThirdPartyWeb.test.ts → ThirdParties.test.ts} +3 -3
  107. package/front_end/models/trace/insights/{ThirdPartyWeb.ts → ThirdParties.ts} +24 -5
  108. package/front_end/models/trace/insights/Viewport.test.ts +1 -1
  109. package/front_end/models/trace/insights/Viewport.ts +27 -9
  110. package/front_end/models/trace/insights/insights.ts +1 -1
  111. package/front_end/models/trace/insights/types.ts +11 -9
  112. package/front_end/models/trace/types/TraceEvents.ts +51 -22
  113. package/front_end/panels/application/SharedStorageItemsView.test.ts +3 -3
  114. package/front_end/panels/application/SharedStorageItemsView.ts +5 -3
  115. package/front_end/panels/application/StorageView.ts +3 -3
  116. package/front_end/panels/application/components/StorageMetadataView.ts +1 -2
  117. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +34 -31
  118. package/front_end/panels/coverage/CoverageView.ts +3 -3
  119. package/front_end/panels/elements/ComputedStyleModel.ts +9 -2
  120. package/front_end/panels/elements/ComputedStyleWidget.test.ts +72 -0
  121. package/front_end/panels/elements/ComputedStyleWidget.ts +12 -0
  122. package/front_end/panels/elements/ElementStatePaneWidget.test.ts +84 -30
  123. package/front_end/panels/elements/ElementStatePaneWidget.ts +42 -24
  124. package/front_end/panels/elements/ElementsTreeElement.ts +24 -11
  125. package/front_end/panels/elements/MetricsSidebarPane.ts +12 -7
  126. package/front_end/panels/elements/PropertyMatchers.ts +3 -0
  127. package/front_end/panels/elements/StylePropertiesSection.ts +15 -6
  128. package/front_end/panels/elements/StylePropertyTreeElement.test.ts +3 -1
  129. package/front_end/panels/elements/StylePropertyTreeElement.ts +8 -3
  130. package/front_end/panels/elements/stylePropertiesTreeOutline.css +2 -2
  131. package/front_end/panels/explain/components/ConsoleInsight.ts +8 -18
  132. package/front_end/panels/freestyler/AiAgent.test.ts +58 -1
  133. package/front_end/panels/freestyler/AiAgent.ts +58 -3
  134. package/front_end/panels/freestyler/DrJonesFileAgent.test.ts +99 -23
  135. package/front_end/panels/freestyler/DrJonesFileAgent.ts +53 -20
  136. package/front_end/panels/freestyler/DrJonesNetworkAgent.test.ts +15 -7
  137. package/front_end/panels/freestyler/DrJonesNetworkAgent.ts +36 -15
  138. package/front_end/panels/freestyler/DrJonesPerformanceAgent.test.ts +6 -6
  139. package/front_end/panels/freestyler/DrJonesPerformanceAgent.ts +48 -8
  140. package/front_end/panels/freestyler/FreestylerAgent.test.ts +15 -14
  141. package/front_end/panels/freestyler/FreestylerAgent.ts +52 -8
  142. package/front_end/panels/freestyler/FreestylerPanel.test.ts +539 -39
  143. package/front_end/panels/freestyler/FreestylerPanel.ts +349 -215
  144. package/front_end/panels/freestyler/components/FreestylerChatUi.test.ts +126 -34
  145. package/front_end/panels/freestyler/components/FreestylerChatUi.ts +320 -268
  146. package/front_end/panels/freestyler/components/UserActionRow.ts +156 -47
  147. package/front_end/panels/freestyler/components/freestylerChatUi.css +69 -34
  148. package/front_end/panels/freestyler/components/userActionRow.css +40 -67
  149. package/front_end/panels/freestyler/freestyler-meta.ts +3 -11
  150. package/front_end/panels/issues/components/HideIssuesMenu.ts +2 -11
  151. package/front_end/panels/layer_viewer/LayerDetailsView.ts +1 -2
  152. package/front_end/panels/layer_viewer/PaintProfilerView.ts +5 -5
  153. package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +46 -0
  154. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +26 -17
  155. package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +25 -19
  156. package/front_end/panels/network/BinaryResourceView.ts +6 -7
  157. package/front_end/panels/network/EventSourceMessagesView.ts +1 -1
  158. package/front_end/panels/network/NetworkDataGridNode.ts +3 -3
  159. package/front_end/panels/network/NetworkLogView.ts +7 -8
  160. package/front_end/panels/network/RequestTimingView.test.ts +35 -1
  161. package/front_end/panels/network/RequestTimingView.ts +96 -0
  162. package/front_end/panels/network/ResourceWebSocketFrameView.ts +2 -2
  163. package/front_end/panels/network/networkTimingTable.css +2 -1
  164. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +1 -1
  165. package/front_end/panels/profiler/HeapProfileView.ts +3 -3
  166. package/front_end/panels/profiler/HeapSnapshotView.ts +2 -2
  167. package/front_end/panels/profiler/HeapTimelineOverview.ts +12 -12
  168. package/front_end/panels/profiler/IsolateSelector.ts +3 -4
  169. package/front_end/panels/profiler/ProfileFlameChartDataProvider.ts +1 -1
  170. package/front_end/panels/profiler/ProfileSidebarTreeElement.ts +7 -6
  171. package/front_end/panels/profiler/ProfileView.ts +1 -1
  172. package/front_end/panels/recorder/components/RecordingView.ts +2 -2
  173. package/front_end/panels/recorder/injected/{rollup.config.js → rollup.config.mjs} +1 -1
  174. package/front_end/panels/recorder/recorderController.css +0 -4
  175. package/front_end/panels/security/CookieReportTreeElement.ts +1 -9
  176. package/front_end/panels/security/CookieReportView.ts +120 -0
  177. package/front_end/panels/security/SecurityPanel.ts +8 -2
  178. package/front_end/panels/security/cookieReportView.css +46 -0
  179. package/front_end/panels/security/sidebar.css +1 -2
  180. package/front_end/panels/sensors/LocationsSettingsTab.ts +26 -11
  181. package/front_end/panels/sensors/locationsSettingsTab.css +18 -18
  182. package/front_end/panels/settings/AISettingsTab.ts +6 -15
  183. package/front_end/panels/settings/KeybindsSettingsTab.ts +1 -1
  184. package/front_end/panels/settings/SettingsScreen.ts +61 -56
  185. package/front_end/panels/settings/aiSettingsTab.css +3 -14
  186. package/front_end/panels/settings/components/SyncSection.ts +1 -2
  187. package/front_end/panels/settings/components/syncSection.css +0 -10
  188. package/front_end/panels/settings/frameworkIgnoreListSettingsTab.css +3 -1
  189. package/front_end/panels/settings/keybindsSettingsTab.css +7 -10
  190. package/front_end/panels/settings/settingsScreen.css +27 -125
  191. package/front_end/panels/sources/DebuggerPlugin.ts +9 -4
  192. package/front_end/panels/sources/NavigatorView.ts +11 -13
  193. package/front_end/panels/timeline/ActiveFilters.ts +3 -4
  194. package/front_end/panels/timeline/AnimationsTrackAppender.ts +1 -2
  195. package/front_end/panels/timeline/CountersGraph.ts +2 -4
  196. package/front_end/panels/timeline/EventsTimelineTreeView.ts +7 -8
  197. package/front_end/panels/timeline/README.md +2 -1
  198. package/front_end/panels/timeline/TimelineController.ts +14 -4
  199. package/front_end/panels/timeline/TimelineEventOverview.ts +3 -4
  200. package/front_end/panels/timeline/TimelineFilters.ts +3 -4
  201. package/front_end/panels/timeline/TimelineFlameChartDataProvider.test.ts +1 -1
  202. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +3 -10
  203. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +1 -2
  204. package/front_end/panels/timeline/TimelineFlameChartView.ts +21 -12
  205. package/front_end/panels/timeline/TimelineLoader.test.ts +1 -2
  206. package/front_end/panels/timeline/TimelineLoader.ts +3 -4
  207. package/front_end/panels/timeline/TimelineMiniMap.ts +10 -0
  208. package/front_end/panels/timeline/TimelinePanel.ts +20 -8
  209. package/front_end/panels/timeline/TimelineTreeView.test.ts +12 -13
  210. package/front_end/panels/timeline/TimelineTreeView.ts +35 -40
  211. package/front_end/panels/timeline/TimelineUIUtils.test.ts +2 -2
  212. package/front_end/panels/timeline/TimelineUIUtils.ts +12 -14
  213. package/front_end/panels/timeline/components/LayoutShiftDetails.ts +6 -7
  214. package/front_end/panels/timeline/components/LiveMetricsView.test.ts +3 -3
  215. package/front_end/panels/timeline/components/LiveMetricsView.ts +14 -26
  216. package/front_end/panels/timeline/components/MetricCard.test.ts +1 -1
  217. package/front_end/panels/timeline/components/MetricCard.ts +46 -0
  218. package/front_end/panels/timeline/components/NetworkRequestDetails.ts +3 -4
  219. package/front_end/panels/timeline/components/SidebarSingleInsightSet.test.ts +2 -0
  220. package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +41 -36
  221. package/front_end/panels/timeline/components/insights/CLSCulprits.ts +19 -33
  222. package/front_end/panels/timeline/components/insights/DocumentLatency.ts +29 -40
  223. package/front_end/panels/timeline/components/insights/FontDisplay.ts +17 -23
  224. package/front_end/panels/timeline/components/insights/Helpers.ts +12 -16
  225. package/front_end/panels/timeline/components/insights/InteractionToNextPaint.ts +14 -26
  226. package/front_end/panels/timeline/components/insights/LCPDiscovery.ts +25 -37
  227. package/front_end/panels/timeline/components/insights/LCPPhases.ts +20 -47
  228. package/front_end/panels/timeline/components/insights/RenderBlocking.ts +19 -28
  229. package/front_end/panels/timeline/components/insights/SidebarInsight.ts +1 -2
  230. package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +18 -31
  231. package/front_end/panels/timeline/components/insights/Table.ts +5 -3
  232. package/front_end/panels/timeline/components/insights/ThirdParties.ts +18 -25
  233. package/front_end/panels/timeline/components/insights/Viewport.ts +14 -25
  234. package/front_end/panels/timeline/components/liveMetricsView.css +5 -13
  235. package/front_end/panels/timeline/components/metricCard.css +11 -0
  236. package/front_end/panels/timeline/components/sidebarInsightsTab.css +1 -1
  237. package/front_end/panels/timeline/overlays/OverlaysImpl.test.ts +5 -5
  238. package/front_end/panels/timeline/overlays/OverlaysImpl.ts +13 -12
  239. package/front_end/panels/timeline/timelineFlameChartView.css +1 -1
  240. package/front_end/panels/timeline/utils/AICallTree.test.ts +105 -0
  241. package/front_end/panels/timeline/utils/AICallTree.ts +25 -24
  242. package/front_end/testing/EnvironmentHelpers.ts +5 -18
  243. package/front_end/testing/InsightHelpers.ts +4 -4
  244. package/front_end/testing/TraceHelpers.ts +1 -1
  245. package/front_end/third_party/puppeteer/README.chromium +2 -2
  246. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +2 -3
  247. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  248. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  249. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts +14 -3
  250. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts.map +1 -1
  251. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js +16 -2
  252. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js.map +1 -1
  253. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.d.ts +34 -5
  254. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.d.ts.map +1 -1
  255. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.js +51 -2
  256. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.js.map +1 -1
  257. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.d.ts.map +1 -1
  258. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.js +10 -8
  259. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.js.map +1 -1
  260. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts.map +1 -1
  261. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js +1 -1
  262. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js.map +1 -1
  263. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.d.ts +14 -4
  264. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.d.ts.map +1 -1
  265. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.js +57 -23
  266. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.js.map +1 -1
  267. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.d.ts +1 -1
  268. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.d.ts.map +1 -1
  269. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.js +13 -10
  270. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.js.map +1 -1
  271. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.d.ts +15 -4
  272. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.d.ts.map +1 -1
  273. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.js +55 -26
  274. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.js.map +1 -1
  275. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.d.ts +0 -8
  276. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.d.ts.map +1 -1
  277. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.js +2 -11
  278. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.js.map +1 -1
  279. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +2 -1
  280. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
  281. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js +5 -2
  282. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js.map +1 -1
  283. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts +7 -0
  284. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts.map +1 -1
  285. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js +9 -1
  286. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js.map +1 -1
  287. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.d.ts.map +1 -1
  288. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.js +5 -3
  289. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.js.map +1 -1
  290. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.d.ts +1 -1
  291. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.d.ts.map +1 -1
  292. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.js +0 -3
  293. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.js.map +1 -1
  294. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +1 -1
  295. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +1 -1
  296. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.d.ts +1 -1
  297. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.js +1 -1
  298. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  299. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  300. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  301. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  302. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  303. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.d.ts +14 -0
  304. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.d.ts.map +1 -0
  305. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.js +18 -0
  306. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.js.map +1 -0
  307. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +51 -10
  308. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +215 -97
  309. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +2 -3
  310. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  311. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  312. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts +14 -3
  313. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts.map +1 -1
  314. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js +16 -2
  315. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js.map +1 -1
  316. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts +34 -5
  317. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts.map +1 -1
  318. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.js +51 -2
  319. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.js.map +1 -1
  320. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.d.ts.map +1 -1
  321. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.js +10 -8
  322. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.js.map +1 -1
  323. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts.map +1 -1
  324. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js +1 -1
  325. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js.map +1 -1
  326. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.d.ts +14 -4
  327. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.d.ts.map +1 -1
  328. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.js +57 -23
  329. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.js.map +1 -1
  330. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.d.ts +1 -1
  331. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.d.ts.map +1 -1
  332. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.js +13 -10
  333. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.js.map +1 -1
  334. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.d.ts +15 -4
  335. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.d.ts.map +1 -1
  336. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.js +55 -26
  337. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.js.map +1 -1
  338. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.d.ts +0 -8
  339. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.d.ts.map +1 -1
  340. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.js +1 -9
  341. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.js.map +1 -1
  342. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts +2 -1
  343. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
  344. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js +5 -2
  345. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js.map +1 -1
  346. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts +7 -0
  347. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts.map +1 -1
  348. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js +7 -0
  349. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js.map +1 -1
  350. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.d.ts.map +1 -1
  351. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.js +5 -3
  352. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.js.map +1 -1
  353. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.d.ts +1 -1
  354. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.d.ts.map +1 -1
  355. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.js +0 -3
  356. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.js.map +1 -1
  357. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +1 -1
  358. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +1 -1
  359. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.d.ts +1 -1
  360. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.js +1 -1
  361. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  362. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  363. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  364. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.d.ts +14 -0
  365. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.d.ts.map +1 -0
  366. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.js +15 -0
  367. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.js.map +1 -0
  368. package/front_end/third_party/puppeteer/package/lib/types.d.ts +51 -10
  369. package/front_end/third_party/puppeteer/package/package.json +4 -4
  370. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +2 -3
  371. package/front_end/third_party/puppeteer/package/src/api/ElementHandle.ts +21 -3
  372. package/front_end/third_party/puppeteer/package/src/api/Input.ts +57 -8
  373. package/front_end/third_party/puppeteer/package/src/bidi/ElementHandle.ts +9 -7
  374. package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +1 -0
  375. package/front_end/third_party/puppeteer/package/src/bidi/Input.ts +72 -31
  376. package/front_end/third_party/puppeteer/package/src/cdp/ElementHandle.ts +14 -9
  377. package/front_end/third_party/puppeteer/package/src/cdp/Input.ts +71 -26
  378. package/front_end/third_party/puppeteer/package/src/common/CallbackRegistry.ts +1 -15
  379. package/front_end/third_party/puppeteer/package/src/common/ConsoleMessage.ts +8 -1
  380. package/front_end/third_party/puppeteer/package/src/common/Errors.ts +7 -0
  381. package/front_end/third_party/puppeteer/package/src/common/WaitTask.ts +9 -9
  382. package/front_end/third_party/puppeteer/package/src/environment.ts +1 -4
  383. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  384. package/front_end/third_party/puppeteer/package/src/generated/version.ts +1 -1
  385. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  386. package/front_end/third_party/puppeteer/package/src/util/incremental-id-generator.ts +20 -0
  387. package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +1 -0
  388. package/front_end/ui/components/buttons/Button.test.ts +14 -0
  389. package/front_end/ui/components/buttons/Button.ts +27 -4
  390. package/front_end/ui/components/cards/card.css +7 -4
  391. package/front_end/ui/components/dialogs/Dialog.ts +2 -4
  392. package/front_end/ui/components/dialogs/ShortcutDialog.ts +15 -13
  393. package/front_end/ui/components/dialogs/dialog.css +2 -6
  394. package/front_end/ui/components/dialogs/shortcutDialog.css +33 -41
  395. package/front_end/ui/components/docs/freestyler/basic.ts +6 -8
  396. package/front_end/ui/components/docs/freestyler/empty_state.ts +6 -8
  397. package/front_end/ui/components/docs/performance_panel/track_example.html +1 -1
  398. package/front_end/ui/components/markdown_view/MarkdownView.test.ts +39 -17
  399. package/front_end/ui/components/markdown_view/MarkdownView.ts +77 -14
  400. package/front_end/ui/components/markdown_view/markdownView.css +15 -0
  401. package/front_end/ui/components/settings/SettingCheckbox.ts +3 -2
  402. package/front_end/ui/legacy/ContextMenu.ts +2 -2
  403. package/front_end/ui/legacy/InplaceEditor.ts +18 -14
  404. package/front_end/ui/legacy/TabbedPane.ts +0 -14
  405. package/front_end/ui/legacy/UIUtils.ts +0 -7
  406. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +7 -2
  407. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +8 -4
  408. package/front_end/ui/legacy/components/data_grid/ViewportDataGrid.ts +20 -11
  409. package/front_end/ui/legacy/components/inline_editor/LinkSwatch.test.ts +19 -0
  410. package/front_end/ui/legacy/components/inline_editor/LinkSwatch.ts +1 -1
  411. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +1 -1
  412. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +5 -22
  413. package/front_end/ui/legacy/components/perf_ui/OverviewGrid.ts +129 -100
  414. package/front_end/ui/legacy/components/perf_ui/TimelineGrid.ts +4 -2
  415. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewCalculator.test.ts +9 -4
  416. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewCalculator.ts +6 -6
  417. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewPane.ts +22 -4
  418. package/front_end/ui/legacy/components/perf_ui/flameChart.css +0 -2
  419. package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.test.ts +49 -0
  420. package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.ts +23 -46
  421. package/front_end/ui/legacy/components/source_frame/ImageView.ts +1 -1
  422. package/front_end/ui/legacy/components/utils/ImagePreview.ts +1 -1
  423. package/front_end/ui/legacy/textPrompt.css +1 -1
  424. package/front_end/ui/legacy/toolbar.css +4 -5
  425. package/front_end/ui/visual_logging/KnownContextValues.ts +174 -0
  426. package/front_end/ui/visual_logging/LoggingConfig.ts +6 -2
  427. package/package.json +7 -6
  428. package/scripts/build/ninja/bundle.gni +3 -3
  429. package/scripts/build/{rollup.config.js → rollup.config.mjs} +4 -4
  430. package/scripts/devtools_paths.py +8 -4
  431. package/scripts/eslint_rules/tests/check_test_definitions_test.js +8 -3
  432. package/scripts/tools/update_goldens_v2.py +1 -1
  433. package/front_end/models/timeline_model/TimelineModelFilter.ts +0 -61
  434. /package/front_end/Images/{rollup.config.js → rollup.config.mjs} +0 -0
@@ -0,0 +1,72 @@
1
+ // Copyright 2023 The Chromium Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import * as SDK from '../../core/sdk/sdk.js';
6
+ import {createTarget, stubNoopSettings} from '../../testing/EnvironmentHelpers.js';
7
+ import {describeWithMockConnection} from '../../testing/MockConnection.js';
8
+ import * as UI from '../../ui/legacy/legacy.js';
9
+
10
+ import * as Elements from './elements.js';
11
+
12
+ describeWithMockConnection('ComputedStyleWidget', () => {
13
+ let target: SDK.Target.Target;
14
+ let view: Elements.ComputedStyleWidget.ComputedStyleWidget;
15
+ let trackComputedStyleUpdatesForNodeSpy: sinon.SinonSpy;
16
+
17
+ beforeEach(() => {
18
+ stubNoopSettings();
19
+ target = createTarget();
20
+ UI.Context.Context.instance().setFlavor(SDK.DOMModel.DOMNode, null);
21
+ trackComputedStyleUpdatesForNodeSpy =
22
+ sinon.spy(SDK.CSSModel.CSSModel.prototype, 'trackComputedStyleUpdatesForNode');
23
+
24
+ const cssModel = target.model(SDK.CSSModel.CSSModel);
25
+ sinon.stub(Elements.ComputedStyleModel.ComputedStyleModel.prototype, 'cssModel').returns(cssModel);
26
+ });
27
+
28
+ afterEach(() => {
29
+ view.detach();
30
+ });
31
+
32
+ it('tracks computed style updates for the node when the widget is shown', () => {
33
+ const model = target.model(SDK.DOMModel.DOMModel);
34
+ assert.exists(model);
35
+ const node = new SDK.DOMModel.DOMNode(model);
36
+ UI.Context.Context.instance().setFlavor(SDK.DOMModel.DOMNode, node);
37
+ view = new Elements.ComputedStyleWidget.ComputedStyleWidget();
38
+ view.markAsRoot();
39
+ view.show(document.body);
40
+
41
+ sinon.assert.calledWith(trackComputedStyleUpdatesForNodeSpy, node.id);
42
+ });
43
+
44
+ it('tracks computed style updates for the node when the selected node is changed', () => {
45
+ const model = target.model(SDK.DOMModel.DOMModel);
46
+ assert.exists(model);
47
+ const node = new SDK.DOMModel.DOMNode(model);
48
+ UI.Context.Context.instance().setFlavor(SDK.DOMModel.DOMNode, node);
49
+ view = new Elements.ComputedStyleWidget.ComputedStyleWidget();
50
+ view.markAsRoot();
51
+ view.show(document.body);
52
+
53
+ sinon.assert.calledWith(trackComputedStyleUpdatesForNodeSpy, node.id);
54
+ const newNode = new SDK.DOMModel.DOMNode(model);
55
+ UI.Context.Context.instance().setFlavor(SDK.DOMModel.DOMNode, newNode);
56
+
57
+ sinon.assert.calledWith(trackComputedStyleUpdatesForNodeSpy, newNode.id);
58
+ });
59
+
60
+ it('removes tracking computed style updates for the node when the widget is hidden', () => {
61
+ const model = target.model(SDK.DOMModel.DOMModel);
62
+ assert.exists(model);
63
+ const node = new SDK.DOMModel.DOMNode(model);
64
+ UI.Context.Context.instance().setFlavor(SDK.DOMModel.DOMNode, node);
65
+ view = new Elements.ComputedStyleWidget.ComputedStyleWidget();
66
+ view.markAsRoot();
67
+ view.show(document.body);
68
+ view.hideWidget();
69
+
70
+ sinon.assert.calledWith(trackComputedStyleUpdatesForNodeSpy, undefined);
71
+ });
72
+ });
@@ -291,6 +291,10 @@ export class ComputedStyleWidget extends UI.ThrottledWidget.ThrottledWidget {
291
291
  fontsWidget.show(this.contentElement);
292
292
  }
293
293
 
294
+ #handleNodeChange(event: Common.EventTarget.EventTargetEvent<SDK.DOMModel.DOMNode|null>): void {
295
+ void this.computedStyleModel.cssModel()?.trackComputedStyleUpdatesForNode(event.data?.id);
296
+ }
297
+
294
298
  override onResize(): void {
295
299
  const isNarrow = this.contentElement.offsetWidth < 260;
296
300
  this.#computedStylesTree.classList.toggle('computed-narrow', isNarrow);
@@ -299,6 +303,14 @@ export class ComputedStyleWidget extends UI.ThrottledWidget.ThrottledWidget {
299
303
  override wasShown(): void {
300
304
  super.wasShown();
301
305
  this.registerCSSFiles([computedStyleSidebarPaneStyles]);
306
+
307
+ void this.computedStyleModel.cssModel()?.trackComputedStyleUpdatesForNode(this.computedStyleModel.node()?.id);
308
+ UI.Context.Context.instance().addFlavorChangeListener(SDK.DOMModel.DOMNode, this.#handleNodeChange, this);
309
+ }
310
+
311
+ override willHide(): void {
312
+ void this.computedStyleModel.cssModel()?.trackComputedStyleUpdatesForNode(undefined);
313
+ UI.Context.Context.instance().removeFlavorChangeListener(SDK.DOMModel.DOMNode, this.#handleNodeChange, this);
302
314
  }
303
315
 
304
316
  override async doUpdate(): Promise<void> {
@@ -72,7 +72,9 @@ describeWithMockConnection('ElementStatePaneWidget', () => {
72
72
  for (const pseudoClass of pseudoClasses) {
73
73
  const div = view.contentElement.querySelector(`#${pseudoClass}`);
74
74
  assert.instanceOf(div, HTMLDivElement);
75
- assert.strictEqual(!div.hidden, expectedPseudoClasses.includes(div.id), `Wrong state for ${div.id}`);
75
+ const shouldShow = expectedPseudoClasses.includes(pseudoClass);
76
+ assert.strictEqual(
77
+ !div.hidden, shouldShow, `Checkbox for ${pseudoClass} should be ${shouldShow ? 'shown' : 'hidden'}`);
76
78
  }
77
79
  };
78
80
 
@@ -153,15 +155,13 @@ describeWithMockConnection('ElementStatePaneWidget', () => {
153
155
  await assertExpectedPseudoClasses(
154
156
  'input',
155
157
  [
156
- 'enabled',
157
158
  'disabled',
158
159
  'valid',
159
160
  'invalid',
160
161
  'user-valid',
161
162
  'user-invalid',
162
163
  'required',
163
- 'optional',
164
- 'read-write',
164
+ 'read-only',
165
165
  'placeholder-shown',
166
166
  'autofill',
167
167
  ],
@@ -171,14 +171,14 @@ describeWithMockConnection('ElementStatePaneWidget', () => {
171
171
  it('Shows the specific pseudo-classes for button', async () => {
172
172
  await assertExpectedPseudoClasses(
173
173
  'button',
174
- ['enabled', 'disabled', 'valid', 'invalid', 'read-only'],
174
+ ['disabled', 'valid', 'invalid', 'read-write'],
175
175
  );
176
176
  });
177
177
 
178
178
  it('Shows the specific pseudo-classes for fieldset', async () => {
179
179
  await assertExpectedPseudoClasses(
180
180
  'fieldset',
181
- ['enabled', 'disabled', 'valid', 'invalid', 'read-only'],
181
+ ['disabled', 'valid', 'invalid', 'read-write'],
182
182
  );
183
183
  });
184
184
 
@@ -186,45 +186,82 @@ describeWithMockConnection('ElementStatePaneWidget', () => {
186
186
  await assertExpectedPseudoClasses(
187
187
  'textarea',
188
188
  [
189
- 'enabled',
190
189
  'disabled',
191
190
  'valid',
192
191
  'invalid',
193
192
  'user-valid',
194
193
  'user-invalid',
195
194
  'required',
196
- 'optional',
197
- 'read-write',
195
+ 'read-only',
198
196
  'placeholder-shown',
199
197
  ],
200
198
  );
199
+ await assertExpectedPseudoClasses(
200
+ 'textarea',
201
+ [
202
+ 'disabled',
203
+ 'valid',
204
+ 'invalid',
205
+ 'user-valid',
206
+ 'user-invalid',
207
+ 'required',
208
+ 'read-write',
209
+ 'placeholder-shown',
210
+ ],
211
+ false, ['readonly', '']);
212
+ await assertExpectedPseudoClasses(
213
+ 'textarea',
214
+ [
215
+ 'enabled',
216
+ 'valid',
217
+ 'invalid',
218
+ 'user-valid',
219
+ 'user-invalid',
220
+ 'required',
221
+ 'read-write',
222
+ 'placeholder-shown',
223
+ ],
224
+ false, ['disabled', '']);
225
+ await assertExpectedPseudoClasses(
226
+ 'textarea',
227
+ [
228
+ 'disabled',
229
+ 'valid',
230
+ 'invalid',
231
+ 'user-valid',
232
+ 'user-invalid',
233
+ 'optional',
234
+ 'read-only',
235
+ 'placeholder-shown',
236
+ ],
237
+ false, ['required', '']);
201
238
  });
202
239
 
203
240
  it('Shows the specific pseudo-classes for select', async () => {
204
241
  await assertExpectedPseudoClasses(
205
242
  'select',
206
- ['enabled', 'disabled', 'valid', 'invalid', 'user-valid', 'user-invalid', 'required', 'optional', 'read-only'],
243
+ ['disabled', 'valid', 'invalid', 'user-valid', 'user-invalid', 'required', 'read-write'],
207
244
  );
208
245
  });
209
246
 
210
247
  it('Shows the specific pseudo-classes for option', async () => {
211
248
  await assertExpectedPseudoClasses(
212
249
  'option',
213
- ['enabled', 'disabled', 'checked', 'read-only'],
250
+ ['disabled', 'checked', 'read-write'],
214
251
  );
215
252
  });
216
253
 
217
254
  it('Shows the specific pseudo-classes for optgroup', async () => {
218
255
  await assertExpectedPseudoClasses(
219
256
  'optgroup',
220
- ['enabled', 'disabled', 'read-only'],
257
+ ['disabled', 'read-write'],
221
258
  );
222
259
  });
223
260
 
224
261
  it('Shows the specific pseudo-classes for FormAssociated', async () => {
225
262
  await assertExpectedPseudoClasses(
226
263
  'CustomFormAssociatedElement',
227
- ['enabled', 'disabled', 'valid', 'invalid'],
264
+ ['disabled', 'valid', 'invalid', 'read-write'],
228
265
  true,
229
266
  );
230
267
  });
@@ -232,55 +269,74 @@ describeWithMockConnection('ElementStatePaneWidget', () => {
232
269
  it('Shows the specific pseudo-classes for object, output and img', async () => {
233
270
  await assertExpectedPseudoClasses(
234
271
  'object',
235
- ['valid', 'invalid'],
272
+ ['valid', 'invalid', 'read-write'],
236
273
  );
237
274
 
238
275
  await assertExpectedPseudoClasses(
239
276
  'output',
240
- ['valid', 'invalid', 'read-only'],
277
+ ['valid', 'invalid', 'read-write'],
241
278
  );
242
279
 
243
280
  await assertExpectedPseudoClasses(
244
281
  'img',
245
- ['valid', 'invalid'],
282
+ ['valid', 'invalid', 'read-write'],
246
283
  );
247
284
  });
248
285
  it('Shows the specific pseudo-classes for progress', async () => {
249
286
  await assertExpectedPseudoClasses(
250
287
  'progress',
251
- ['read-only', 'indeterminate'],
288
+ ['read-write', 'indeterminate'],
252
289
  );
253
290
  });
254
291
 
255
292
  it('Shows the specific pseudo-classes for a and area with href', async () => {
256
293
  await assertExpectedPseudoClasses(
257
294
  'a',
258
- ['visited'],
295
+ ['visited', 'read-write'],
259
296
  false,
260
297
  ['href', 'www.google.com'],
261
298
  );
262
299
 
263
300
  await assertExpectedPseudoClasses(
264
- 'a',
265
- ['visited'],
301
+ 'area',
302
+ ['visited', 'read-write'],
266
303
  false,
267
304
  ['href', 'www.google.com'],
268
305
  );
269
306
  });
270
307
 
308
+ it('Shows the specific pseudo-classes for a and area without href', async () => {
309
+ await assertExpectedPseudoClasses(
310
+ 'a',
311
+ ['read-write'],
312
+ );
313
+
314
+ await assertExpectedPseudoClasses(
315
+ 'area',
316
+ ['read-write'],
317
+ );
318
+ });
319
+
320
+ it('Shows the specific pseudo-classes for contenteditable div', async () => {
321
+ await assertExpectedPseudoClasses(
322
+ 'div',
323
+ ['read-only'],
324
+ false,
325
+ ['contenteditable', ''],
326
+ );
327
+ });
328
+
271
329
  it('Shows the specific pseudo-classes for radio or checkbox inputs', async () => {
272
330
  await assertExpectedPseudoClasses(
273
331
  'input',
274
332
  [
275
- 'enabled',
276
333
  'disabled',
277
334
  'valid',
278
335
  'invalid',
279
336
  'user-valid',
280
337
  'user-invalid',
281
338
  'required',
282
- 'optional',
283
- 'read-write',
339
+ 'read-only',
284
340
  'placeholder-shown',
285
341
  'autofill',
286
342
  'checked',
@@ -292,15 +348,13 @@ describeWithMockConnection('ElementStatePaneWidget', () => {
292
348
  await assertExpectedPseudoClasses(
293
349
  'input',
294
350
  [
295
- 'enabled',
296
351
  'disabled',
297
352
  'valid',
298
353
  'invalid',
299
354
  'user-valid',
300
355
  'user-invalid',
301
356
  'required',
302
- 'optional',
303
- 'read-write',
357
+ 'read-only',
304
358
  'placeholder-shown',
305
359
  'autofill',
306
360
  'checked',
@@ -314,19 +368,19 @@ describeWithMockConnection('ElementStatePaneWidget', () => {
314
368
  it('Shows the specific pseudo-classes for datalist, label, legend and meter', async () => {
315
369
  await assertExpectedPseudoClasses(
316
370
  'datalist',
317
- ['read-only'],
371
+ ['read-write'],
318
372
  );
319
373
  await assertExpectedPseudoClasses(
320
374
  'label',
321
- ['read-only'],
375
+ ['read-write'],
322
376
  );
323
377
  await assertExpectedPseudoClasses(
324
378
  'legend',
325
- ['read-only'],
379
+ ['read-write'],
326
380
  );
327
381
  await assertExpectedPseudoClasses(
328
382
  'meter',
329
- ['read-only'],
383
+ ['read-write'],
330
384
  );
331
385
  });
332
386
  });
@@ -68,6 +68,7 @@ enum SpecificPseudoStates {
68
68
  export class ElementStatePaneWidget extends UI.Widget.Widget {
69
69
  private readonly inputs: HTMLInputElement[];
70
70
  private readonly inputStates: WeakMap<HTMLInputElement, string>;
71
+ private readonly duals: Map<SpecificPseudoStates, SpecificPseudoStates>;
71
72
  private cssModel?: SDK.CSSModel.CSSModel|null;
72
73
  private specificPseudoStateDivs: Map<SpecificPseudoStates, HTMLDivElement>;
73
74
  private specificHeader: HTMLDetailsElement;
@@ -80,6 +81,7 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
80
81
  const inputs: HTMLInputElement[] = [];
81
82
  this.inputs = inputs;
82
83
  this.inputStates = new WeakMap();
84
+ this.duals = new Map();
83
85
  const createSectionHeader = (title: string): HTMLDivElement => {
84
86
  const sectionHeaderContainer = document.createElement('div');
85
87
  sectionHeaderContainer.classList.add('section-header');
@@ -96,7 +98,12 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
96
98
  if (!state) {
97
99
  return;
98
100
  }
99
- node.domModel().cssModel().forcePseudoState(node, state, event.target.checked);
101
+ const checked = event.target.checked;
102
+ const dual = this.duals.get(state as SpecificPseudoStates);
103
+ if (checked && dual) {
104
+ node.domModel().cssModel().forcePseudoState(node, dual, false);
105
+ }
106
+ node.domModel().cssModel().forcePseudoState(node, state, checked);
100
107
  };
101
108
  const createElementStateCheckbox = (state: string): HTMLDivElement => {
102
109
  const div = document.createElement('div');
@@ -110,7 +117,10 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
110
117
  div.appendChild(label);
111
118
  return div;
112
119
  };
113
-
120
+ const setDualStateCheckboxes = (first: SpecificPseudoStates, second: SpecificPseudoStates): void => {
121
+ this.duals.set(first, second);
122
+ this.duals.set(second, first);
123
+ };
114
124
  const createEmulateFocusedPageCheckbox = (): Element => {
115
125
  const div = document.createElement('div');
116
126
  div.classList.add('page-state-checkbox');
@@ -210,6 +220,12 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
210
220
  elementSpecificContainer.appendChild(div);
211
221
  });
212
222
 
223
+ setDualStateCheckboxes(SpecificPseudoStates.VALID, SpecificPseudoStates.INVALID);
224
+ setDualStateCheckboxes(SpecificPseudoStates.USER_VALID, SpecificPseudoStates.USER_INVALID);
225
+ setDualStateCheckboxes(SpecificPseudoStates.READ_ONLY, SpecificPseudoStates.READ_WRITE);
226
+ setDualStateCheckboxes(SpecificPseudoStates.IN_RANGE, SpecificPseudoStates.OUT_OF_RANGE);
227
+ setDualStateCheckboxes(SpecificPseudoStates.ENABLED, SpecificPseudoStates.DISABLED);
228
+
213
229
  this.specificHeader = document.createElement('details');
214
230
  this.specificHeader.classList.add('specific-details');
215
231
 
@@ -287,6 +303,19 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
287
303
  return isElementOfTypes(node, ['input']) &&
288
304
  (node.getAttribute('type') === 'checkbox' || node.getAttribute('type') === 'radio');
289
305
  };
306
+ const isContentEditable = (node: SDK.DOMModel.DOMNode): boolean => {
307
+ return node.getAttribute('contenteditable') !== undefined ||
308
+ Boolean(node.parentNode && isContentEditable(node.parentNode));
309
+ };
310
+ const isDisabled = (node: SDK.DOMModel.DOMNode): boolean => {
311
+ return node.getAttribute('disabled') !== undefined;
312
+ };
313
+ const isMutable = (node: SDK.DOMModel.DOMNode): boolean => {
314
+ if (isElementOfTypes(node, ['input', 'textarea'])) {
315
+ return node.getAttribute('readonly') === undefined && !isDisabled(node);
316
+ }
317
+ return isContentEditable(node);
318
+ };
290
319
  // An autonomous custom element is called a form-associated custom element if the element is associated with a custom element definition whose form-associated field is set to true.
291
320
  // https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-element
292
321
  const isFormAssociatedCustomElement = async(node: SDK.DOMModel.DOMNode): Promise<boolean> => {
@@ -300,8 +329,8 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
300
329
 
301
330
  if (isElementOfTypes(node, ['button', 'input', 'select', 'textarea', 'optgroup', 'option', 'fieldset']) ||
302
331
  isFormAssociated) {
303
- hideSpecificCheckbox(SpecificPseudoStates.ENABLED, false);
304
- hideSpecificCheckbox(SpecificPseudoStates.DISABLED, false);
332
+ hideSpecificCheckbox(SpecificPseudoStates.ENABLED, !isDisabled(node));
333
+ hideSpecificCheckbox(SpecificPseudoStates.DISABLED, isDisabled(node));
305
334
  } else {
306
335
  hideSpecificCheckbox(SpecificPseudoStates.ENABLED, true);
307
336
  hideSpecificCheckbox(SpecificPseudoStates.DISABLED, true);
@@ -319,8 +348,13 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
319
348
  if (isElementOfTypes(node, ['input', 'select', 'textarea'])) {
320
349
  hideSpecificCheckbox(SpecificPseudoStates.USER_VALID, false);
321
350
  hideSpecificCheckbox(SpecificPseudoStates.USER_INVALID, false);
322
- hideSpecificCheckbox(SpecificPseudoStates.REQUIRED, false);
323
- hideSpecificCheckbox(SpecificPseudoStates.OPTIONAL, false);
351
+ if (node.getAttribute('required') === undefined) {
352
+ hideSpecificCheckbox(SpecificPseudoStates.REQUIRED, false);
353
+ hideSpecificCheckbox(SpecificPseudoStates.OPTIONAL, true);
354
+ } else {
355
+ hideSpecificCheckbox(SpecificPseudoStates.REQUIRED, true);
356
+ hideSpecificCheckbox(SpecificPseudoStates.OPTIONAL, false);
357
+ }
324
358
  } else {
325
359
  hideSpecificCheckbox(SpecificPseudoStates.USER_VALID, true);
326
360
  hideSpecificCheckbox(SpecificPseudoStates.USER_INVALID, true);
@@ -328,27 +362,11 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
328
362
  hideSpecificCheckbox(SpecificPseudoStates.OPTIONAL, true);
329
363
  }
330
364
 
331
- if (isElementOfTypes(node, ['input', 'textarea'])) {
332
- hideSpecificCheckbox(SpecificPseudoStates.READ_WRITE, false);
333
- } else {
365
+ if (isMutable(node)) {
334
366
  hideSpecificCheckbox(SpecificPseudoStates.READ_WRITE, true);
335
- }
336
-
337
- if (isElementOfTypes(node, [
338
- 'button',
339
- 'datalist',
340
- 'fieldset',
341
- 'label',
342
- 'legend',
343
- 'meter',
344
- 'optgroup',
345
- 'option',
346
- 'output',
347
- 'progress',
348
- 'select',
349
- ])) {
350
367
  hideSpecificCheckbox(SpecificPseudoStates.READ_ONLY, false);
351
368
  } else {
369
+ hideSpecificCheckbox(SpecificPseudoStates.READ_WRITE, false);
352
370
  hideSpecificCheckbox(SpecificPseudoStates.READ_ONLY, true);
353
371
  }
354
372
 
@@ -996,7 +996,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
996
996
  removeZeroWidthSpaceRecursive(attribute);
997
997
 
998
998
  const config = new UI.InplaceEditor.Config(
999
- this.attributeEditingCommitted.bind(this), this.editingCancelled.bind(this), attributeName || undefined);
999
+ this.attributeEditingCommitted.bind(this), this.editingCancelled.bind(this), attributeName);
1000
1000
 
1001
1001
  function postKeyDownFinishHandler(event: Event): string {
1002
1002
  UI.UIUtils.handleElementValueModifications(event, attribute);
@@ -1032,7 +1032,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1032
1032
  container.textContent = textNode.nodeValue();
1033
1033
  } // Strip the CSS or JS highlighting if present.
1034
1034
  const config = new UI.InplaceEditor.Config(
1035
- this.textNodeEditingCommitted.bind(this, textNode), this.editingCancelled.bind(this));
1035
+ this.textNodeEditingCommitted.bind(this, textNode), this.editingCancelled.bind(this), null);
1036
1036
  this.updateEditorHandles(textNodeElement, config);
1037
1037
  const componentSelection = this.listItemElement.getComponentSelection();
1038
1038
  componentSelection && componentSelection.selectAllChildren(textNodeElement);
@@ -1074,8 +1074,13 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1074
1074
  };
1075
1075
 
1076
1076
  function editingCommitted(
1077
- this: ElementsTreeElement, element: Element, newTagName: string, oldText: string, tagName: string|null,
1078
- moveDirection: string): void {
1077
+ this: ElementsTreeElement,
1078
+ element: Element,
1079
+ newTagName: string,
1080
+ oldText: string|null,
1081
+ tagName: string|null,
1082
+ moveDirection: string,
1083
+ ): void {
1079
1084
  if (!tagNameElement) {
1080
1085
  return;
1081
1086
  }
@@ -1104,7 +1109,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1104
1109
  return true;
1105
1110
  }
1106
1111
 
1107
- private updateEditorHandles<T>(element: Element, config?: UI.InplaceEditor.Config<T>): void {
1112
+ private updateEditorHandles<T>(element: Element, config: UI.InplaceEditor.Config<T>): void {
1108
1113
  const editorHandles = UI.InplaceEditor.InplaceEditor.startEditing(element, config);
1109
1114
  if (!editorHandles) {
1110
1115
  this.editing = null;
@@ -1241,7 +1246,12 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1241
1246
  }
1242
1247
 
1243
1248
  private attributeEditingCommitted(
1244
- element: Element, newText: string, oldText: string, attributeName: string, moveDirection: string): void {
1249
+ element: Element,
1250
+ newText: string,
1251
+ oldText: string|null,
1252
+ attributeName: string|null,
1253
+ moveDirection: string,
1254
+ ): void {
1245
1255
  this.editing = null;
1246
1256
 
1247
1257
  const treeOutline = this.treeOutline;
@@ -1305,7 +1315,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1305
1315
  }
1306
1316
  }
1307
1317
 
1308
- if ((attributeName.trim() || newText.trim()) && oldText !== newText) {
1318
+ if (attributeName !== null && (attributeName.trim() || newText.trim()) && oldText !== newText) {
1309
1319
  this.nodeInternal.setAttribute(attributeName, newText, moveToNextAttributeIfNeeded.bind(this));
1310
1320
  return;
1311
1321
  }
@@ -1315,7 +1325,12 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1315
1325
  }
1316
1326
 
1317
1327
  private tagNameEditingCommitted(
1318
- element: Element, newText: string, oldText: string, tagName: string|null, moveDirection: string): void {
1328
+ element: Element,
1329
+ newText: string,
1330
+ oldText: string|null,
1331
+ tagName: string|null,
1332
+ moveDirection: string,
1333
+ ): void {
1319
1334
  this.editing = null;
1320
1335
  const self = this;
1321
1336
 
@@ -2267,9 +2282,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
2267
2282
  false;
2268
2283
 
2269
2284
  const containerType = styles.get('container-type');
2270
- const contain = styles.get('contain');
2271
- const isContainer =
2272
- SDK.CSSContainerQuery.getQueryAxis(`${containerType} ${contain}`) !== SDK.CSSContainerQuery.QueryAxis.NONE;
2285
+ const isContainer = containerType && containerType !== '' && containerType !== 'normal';
2273
2286
 
2274
2287
  if (isGrid) {
2275
2288
  this.pushGridAdorner(this.tagTypeContext, isSubgrid);
@@ -428,7 +428,7 @@ export class MetricsSidebarPane extends ElementsSidebarPane {
428
428
  }
429
429
 
430
430
  private applyUserInput(
431
- element: Element, userInput: string, previousContent: string, context: {
431
+ element: Element, userInput: string, previousContent: string|null, context: {
432
432
  box: string,
433
433
  styleProperty: string,
434
434
  computedStyle: Map<string, string>,
@@ -519,12 +519,17 @@ export class MetricsSidebarPane extends ElementsSidebarPane {
519
519
  }
520
520
  }
521
521
 
522
- private editingCommitted(element: Element, userInput: string, previousContent: string, context: {
523
- box: string,
524
- styleProperty: string,
525
- computedStyle: Map<string, string>,
526
- keyDownHandler: (arg0: Event) => void,
527
- }): void {
522
+ private editingCommitted(
523
+ element: Element,
524
+ userInput: string,
525
+ previousContent: string|null,
526
+ context: {
527
+ box: string,
528
+ styleProperty: string,
529
+ computedStyle: Map<string, string>,
530
+ keyDownHandler: (arg0: Event) => void,
531
+ },
532
+ ): void {
528
533
  this.editingEnded(element, context);
529
534
  this.applyUserInput(element, userInput, previousContent, context, true);
530
535
  }
@@ -439,6 +439,9 @@ export class ShadowMatcher extends matcherBase(ShadowMatch) {
439
439
  return null;
440
440
  }
441
441
  const valueNodes = ASTUtils.siblings(ASTUtils.declValue(node));
442
+ if (valueNodes.length === 0) {
443
+ return null;
444
+ }
442
445
  const valueText = matching.ast.textRange(valueNodes[0], valueNodes[valueNodes.length - 1]);
443
446
  return new ShadowMatch(
444
447
  valueText, node, matching.ast.propertyName === 'text-shadow' ? ShadowType.TEXT_SHADOW : ShadowType.BOX_SHADOW);
@@ -1303,8 +1303,13 @@ export class StylePropertiesSection {
1303
1303
  }
1304
1304
 
1305
1305
  private async editingMediaCommitted(
1306
- query: SDK.CSSQuery.CSSQuery, element: Element, newContent: string, _oldContent: string,
1307
- _context: Context|undefined, _moveDirection: string): Promise<void> {
1306
+ query: SDK.CSSQuery.CSSQuery,
1307
+ element: Element,
1308
+ newContent: string,
1309
+ _oldContent: string|null,
1310
+ _context: Context|undefined,
1311
+ _moveDirection: string,
1312
+ ): Promise<void> {
1308
1313
  this.parentPane.setEditingStyle(false);
1309
1314
  this.editingMediaFinished(element);
1310
1315
 
@@ -1446,8 +1451,8 @@ export class StylePropertiesSection {
1446
1451
  element.textContent = textContent.replace(/\s+/g, ' ').trim();
1447
1452
  }
1448
1453
 
1449
- const config =
1450
- new UI.InplaceEditor.Config(this.editingSelectorCommitted.bind(this), this.editingSelectorCancelled.bind(this));
1454
+ const config = new UI.InplaceEditor.Config(
1455
+ this.editingSelectorCommitted.bind(this), this.editingSelectorCancelled.bind(this), undefined);
1451
1456
  UI.InplaceEditor.InplaceEditor.startEditing(this.selectorElement, config);
1452
1457
 
1453
1458
  const selection = element.getComponentSelection();
@@ -1490,8 +1495,12 @@ export class StylePropertiesSection {
1490
1495
  }
1491
1496
 
1492
1497
  editingSelectorCommitted(
1493
- element: Element, newContent: string, oldContent: string, context: Context|undefined,
1494
- moveDirection: string): void {
1498
+ element: Element,
1499
+ newContent: string,
1500
+ oldContent: string|null,
1501
+ context: Context|undefined,
1502
+ moveDirection: string,
1503
+ ): void {
1495
1504
  this.editingSelectorEnded();
1496
1505
  if (newContent) {
1497
1506
  newContent = newContent.trim();