chrome-devtools-frontend 1.0.1652307 → 1.0.1656291

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 (267) hide show
  1. package/.agents/skills/fixing-skipped-tests/SKILL.md +32 -0
  2. package/.agents/skills/migrate-chromium-test/SKILL.md +144 -0
  3. package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +116 -0
  4. package/.agents/skills/ui-eng-vision-logic-consolidator/SKILL.md +82 -0
  5. package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +123 -0
  6. package/.agents/skills/ui-eng-vision-test-scaffolder/SKILL.md +125 -0
  7. package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +75 -0
  8. package/AUTHORS +1 -0
  9. package/config/owner/COMMON_OWNERS +0 -4
  10. package/docs/get_the_code.md +1 -2
  11. package/docs/playbook.md +1 -1
  12. package/docs/ui_engineering.md +3 -1
  13. package/eslint.config.mjs +0 -5
  14. package/front_end/Tests.js +1 -0
  15. package/front_end/core/common/Settings.ts +47 -30
  16. package/front_end/core/sdk/CPUThrottlingManager.ts +23 -167
  17. package/front_end/core/sdk/CSSMetadata.ts +23 -0
  18. package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +8 -4
  19. package/front_end/core/sdk/ConsoleModel.ts +13 -11
  20. package/front_end/core/sdk/DOMDebuggerModel.ts +11 -5
  21. package/front_end/core/sdk/DOMModel.ts +4 -0
  22. package/front_end/core/sdk/EmulationModel.ts +4 -0
  23. package/front_end/core/sdk/EventBreakpointsModel.ts +9 -5
  24. package/front_end/core/sdk/IsolateManager.ts +6 -6
  25. package/front_end/core/sdk/ResourceTreeModel.ts +8 -5
  26. package/front_end/core/sdk/TargetManager.ts +17 -0
  27. package/front_end/entrypoints/devtools_app/devtools_app.ts +0 -1
  28. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +459 -74
  29. package/front_end/entrypoints/main/MainImpl.ts +12 -42
  30. package/front_end/foundation/Universe.ts +116 -3
  31. package/front_end/generated/InspectorBackendCommands.ts +11 -6
  32. package/front_end/generated/SupportedCSSProperties.js +124 -34
  33. package/front_end/generated/protocol-mapping.d.ts +8 -0
  34. package/front_end/generated/protocol-proxy-api.d.ts +15 -0
  35. package/front_end/generated/protocol.ts +94 -1
  36. package/front_end/models/ai_assistance/AiConversation.ts +2 -7
  37. package/front_end/models/ai_assistance/README.md +4 -3
  38. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -1
  39. package/front_end/models/ai_assistance/agents/NetworkAgent.snapshot.txt +1 -1
  40. package/front_end/models/ai_assistance/agents/PerformanceAgent.snapshot.txt +2 -2
  41. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +13 -320
  42. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +0 -24
  43. package/front_end/models/ai_assistance/agents/StylingAgent.ts +2 -358
  44. package/front_end/models/ai_assistance/ai_assistance.ts +6 -8
  45. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +295 -0
  46. package/front_end/models/ai_assistance/contexts/RequestContext.snapshot.txt +0 -1
  47. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +0 -2
  48. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +10 -10
  49. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +12 -11
  50. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +6 -6
  51. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -14
  52. package/front_end/models/ai_assistance/skills/accessibility.md +4 -2
  53. package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +142 -0
  54. package/front_end/models/ai_assistance/tools/GetStyles.ts +1 -1
  55. package/front_end/models/ai_assistance/tools/README.md +21 -1
  56. package/front_end/models/ai_assistance/tools/{ResolveLighthousePath.ts → ResolveDevtoolsNodePath.ts} +18 -17
  57. package/front_end/models/ai_assistance/tools/Tool.ts +6 -1
  58. package/front_end/models/ai_assistance/tools/ToolRegistry.ts +4 -2
  59. package/front_end/models/autofill_manager/AutofillManager.ts +6 -15
  60. package/front_end/models/bindings/NetworkProject.ts +4 -8
  61. package/front_end/models/breakpoints/BreakpointManager.ts +9 -9
  62. package/front_end/models/emulation/DeviceModeModel.ts +24 -0
  63. package/front_end/models/emulation/EmulatedDevices.ts +108 -0
  64. package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +36 -0
  65. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +8 -0
  66. package/front_end/models/issues_manager/IssuesManager.ts +10 -6
  67. package/front_end/models/javascript_metadata/JavaScriptMetadata.ts +4 -5
  68. package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
  69. package/front_end/models/live-metrics/LiveMetrics.ts +6 -6
  70. package/front_end/models/live-metrics/web-vitals-injected/spec/spec.ts +5 -5
  71. package/front_end/models/live-metrics/web-vitals-injected/web-vitals-injected.ts +3 -3
  72. package/front_end/models/logs/LogManager.ts +25 -10
  73. package/front_end/models/logs/NetworkLog.ts +24 -19
  74. package/front_end/models/persistence/AutomaticFileSystemManager.ts +14 -13
  75. package/front_end/models/persistence/AutomaticFileSystemWorkspaceBinding.ts +26 -14
  76. package/front_end/models/persistence/IsolatedFileSystem.ts +9 -11
  77. package/front_end/models/persistence/IsolatedFileSystemManager.ts +22 -11
  78. package/front_end/models/persistence/NetworkPersistenceManager.ts +73 -44
  79. package/front_end/models/persistence/PersistenceImpl.ts +4 -5
  80. package/front_end/models/project_settings/ProjectSettingsModel.ts +12 -11
  81. package/front_end/models/trace/EntityMapper.ts +1 -1
  82. package/front_end/models/trace/handlers/ScreenshotsHandler.ts +14 -59
  83. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +12 -38
  84. package/front_end/panels/ai_assistance/ExportConversation.ts +4 -1
  85. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
  86. package/front_end/panels/application/DeviceBoundSessionsView.ts +15 -3
  87. package/front_end/panels/application/FrameDetailsView.ts +2 -1
  88. package/front_end/panels/application/IndexedDBViews.ts +38 -36
  89. package/front_end/panels/application/ServiceWorkersView.ts +23 -16
  90. package/front_end/panels/application/components/AdsView.ts +4 -0
  91. package/front_end/panels/autofill/AutofillView.ts +1 -1
  92. package/front_end/panels/autofill/autofill-meta.ts +3 -2
  93. package/front_end/panels/common/CPUThrottlingOption.ts +142 -0
  94. package/front_end/panels/common/ThrottlingUtils.ts +9 -4
  95. package/front_end/panels/common/common.ts +1 -1
  96. package/front_end/panels/console/ConsoleViewMessage.ts +45 -0
  97. package/front_end/panels/elements/AccessibilityTreeUtils.ts +26 -15
  98. package/front_end/panels/elements/AccessibilityTreeView.ts +12 -9
  99. package/front_end/panels/elements/ElementsPanel.ts +0 -74
  100. package/front_end/panels/elements/ElementsTreeOutline.ts +5 -4
  101. package/front_end/panels/emulation/DeviceModeToolbar.ts +46 -45
  102. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +118 -68
  103. package/front_end/panels/layer_viewer/Layers3DView.ts +1 -1
  104. package/front_end/panels/layer_viewer/layerTreeOutline.css +20 -13
  105. package/front_end/panels/layers/LayersPanel.ts +1 -1
  106. package/front_end/panels/mobile_throttling/CalibrationController.ts +6 -5
  107. package/front_end/panels/mobile_throttling/MobileThrottlingSelector.ts +1 -1
  108. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +40 -13
  109. package/front_end/panels/mobile_throttling/ThrottlingPresets.ts +13 -17
  110. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +79 -30
  111. package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +5 -0
  112. package/front_end/panels/network/LinkPreloadGenerator.ts +101 -0
  113. package/front_end/panels/network/NetworkLogView.ts +28 -9
  114. package/front_end/panels/network/NetworkPanel.ts +1 -63
  115. package/front_end/panels/network/RequestInitiatorView.ts +29 -4
  116. package/front_end/panels/network/components/HeaderSectionRow.css +9 -7
  117. package/front_end/panels/network/components/HeaderSectionRow.ts +20 -1
  118. package/front_end/panels/network/components/RequestHeaderSection.css +5 -3
  119. package/front_end/panels/network/components/RequestHeaderSection.ts +1 -2
  120. package/front_end/panels/network/components/RequestHeadersView.css +1 -1
  121. package/front_end/panels/network/network.ts +2 -0
  122. package/front_end/panels/profiler/HeapSnapshotView.ts +121 -33
  123. package/front_end/panels/profiler/ModuleUIStrings.ts +4 -0
  124. package/front_end/panels/security/SecurityPanel.ts +36 -23
  125. package/front_end/panels/settings/SettingsScreen.ts +18 -103
  126. package/front_end/panels/settings/settings-meta.ts +0 -24
  127. package/front_end/panels/timeline/TimelineController.ts +3 -2
  128. package/front_end/panels/timeline/TimelineHistoryManager.ts +38 -37
  129. package/front_end/panels/timeline/TimelinePanel.ts +52 -11
  130. package/front_end/panels/timeline/components/CPUThrottlingSelector.ts +20 -18
  131. package/front_end/panels/timeline/components/LiveMetricsView.ts +38 -38
  132. package/front_end/panels/timeline/components/MetricCard.ts +18 -18
  133. package/front_end/panels/timeline/components/liveMetricsView.css +6 -6
  134. package/front_end/panels/timeline/components/metricCard.css +4 -4
  135. package/front_end/panels/timeline/timelineFlamechartPopover.css +2 -0
  136. package/front_end/panels/utils/utils.ts +25 -24
  137. package/front_end/panels/whats_new/ReleaseNoteText.ts +3 -3
  138. package/front_end/panels/whats_new/resources/WNDT.md +1 -1
  139. package/front_end/third_party/chromium/README.chromium +1 -1
  140. package/front_end/third_party/puppeteer/README.chromium +2 -2
  141. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +34 -55
  142. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +96 -83
  143. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +10 -1
  144. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
  146. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/CDPSession.d.ts.map +1 -1
  150. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/CDPSession.js.map +1 -1
  151. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.d.ts +3 -2
  152. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.d.ts.map +1 -1
  153. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.js.map +1 -1
  154. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts.map +1 -1
  155. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js.map +1 -1
  156. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Target.d.ts +1 -1
  157. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Target.js +1 -1
  158. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.d.ts.map +1 -1
  159. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.js.map +1 -1
  160. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  161. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js +2 -1
  162. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js.map +1 -1
  163. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Realm.d.ts.map +1 -1
  164. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Realm.js.map +1 -1
  165. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts +2 -2
  166. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
  167. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +5 -2
  168. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
  169. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js +1 -1
  170. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js.map +1 -1
  171. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.d.ts.map +1 -1
  172. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js +23 -13
  173. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js.map +1 -1
  174. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.d.ts.map +1 -1
  175. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.js +4 -1
  176. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.js.map +1 -1
  177. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Input.js +1 -1
  178. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/LifecycleWatcher.d.ts.map +1 -1
  179. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/LifecycleWatcher.js.map +1 -1
  180. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.d.ts.map +1 -1
  181. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.js.map +1 -1
  182. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts +3 -41
  183. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts.map +1 -1
  184. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.js.map +1 -1
  185. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  186. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  187. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +4 -2
  188. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
  189. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/LaunchOptions.d.ts +5 -0
  190. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/LaunchOptions.d.ts.map +1 -1
  191. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +1 -1
  192. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +1 -1
  193. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.d.ts +1 -1
  194. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.d.ts.map +1 -1
  195. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.js +5 -5
  196. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.js.map +1 -1
  197. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  198. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  199. package/front_end/third_party/puppeteer/package/lib/types.d.ts +34 -55
  200. package/front_end/third_party/puppeteer/package/package.json +4 -4
  201. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +13 -1
  202. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +2 -3
  203. package/front_end/third_party/puppeteer/package/src/api/CDPSession.ts +3 -1
  204. package/front_end/third_party/puppeteer/package/src/api/HTTPResponse.ts +3 -2
  205. package/front_end/third_party/puppeteer/package/src/api/Realm.ts +1 -2
  206. package/front_end/third_party/puppeteer/package/src/api/Target.ts +1 -1
  207. package/front_end/third_party/puppeteer/package/src/api/locators/locators.ts +1 -2
  208. package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +3 -1
  209. package/front_end/third_party/puppeteer/package/src/bidi/core/Realm.ts +1 -3
  210. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +13 -3
  211. package/front_end/third_party/puppeteer/package/src/cdp/Frame.ts +1 -1
  212. package/front_end/third_party/puppeteer/package/src/cdp/FrameManager.ts +24 -13
  213. package/front_end/third_party/puppeteer/package/src/cdp/HTTPResponse.ts +4 -1
  214. package/front_end/third_party/puppeteer/package/src/cdp/Input.ts +1 -1
  215. package/front_end/third_party/puppeteer/package/src/cdp/LifecycleWatcher.ts +1 -4
  216. package/front_end/third_party/puppeteer/package/src/cdp/Target.ts +2 -4
  217. package/front_end/third_party/puppeteer/package/src/cdp/WebMCP.ts +7 -76
  218. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +1 -4
  219. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +4 -1
  220. package/front_end/third_party/puppeteer/package/src/node/LaunchOptions.ts +5 -0
  221. package/front_end/third_party/puppeteer/package/src/revisions.ts +1 -1
  222. package/front_end/third_party/puppeteer/package/src/util/httpUtils.ts +5 -5
  223. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  224. package/front_end/third_party/puppeteer/third_party/parsel/README.chromium +1 -1
  225. package/front_end/ui/components/dialogs/Dialog.ts +3 -0
  226. package/front_end/ui/components/markdown_view/MarkdownLinksMap.ts +0 -7
  227. package/front_end/ui/helpers/OpenInNewTab.ts +15 -7
  228. package/front_end/ui/legacy/InspectorDrawerView.ts +7 -5
  229. package/front_end/ui/legacy/ListWidget.ts +12 -0
  230. package/front_end/ui/legacy/SplitWidget.ts +12 -11
  231. package/front_end/ui/legacy/TabbedPane.ts +1 -108
  232. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +9 -0
  233. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +192 -139
  234. package/front_end/ui/legacy/components/data_grid/DataGridExporter.ts +89 -0
  235. package/front_end/ui/legacy/components/data_grid/dataGrid.css +10 -0
  236. package/front_end/ui/legacy/components/data_grid/data_grid.ts +3 -1
  237. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +8 -1
  238. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +110 -17
  239. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +89 -40
  240. package/front_end/ui/legacy/treeoutline.css +1 -1
  241. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
  242. package/package.json +4 -3
  243. package/front_end/Images/navigationControls.png +0 -0
  244. package/front_end/Images/navigationControls_2x.png +0 -0
  245. package/front_end/Images/popoverArrows.png +0 -0
  246. package/front_end/entrypoints/greendev_floaty/FloatyEntrypoint.ts +0 -746
  247. package/front_end/entrypoints/greendev_floaty/floaty.css +0 -301
  248. package/front_end/entrypoints/greendev_floaty/floaty.html +0 -38
  249. package/front_end/entrypoints/greendev_floaty/greendev_floaty.ts +0 -415
  250. package/front_end/models/ai_assistance/agents/GreenDevAgent.ts +0 -834
  251. package/front_end/models/ai_assistance/agents/GreenDevAgentAntigravityCliSocketClient.ts +0 -53
  252. package/front_end/models/ai_assistance/agents/GreenDevAgentGeminiCliSocketClient.ts +0 -117
  253. package/front_end/models/annotations/AnnotationRepository.ts +0 -238
  254. package/front_end/models/annotations/AnnotationType.ts +0 -10
  255. package/front_end/models/annotations/README.md +0 -7
  256. package/front_end/models/annotations/annotations.ts +0 -6
  257. package/front_end/models/greendev/Prototypes.ts +0 -68
  258. package/front_end/models/greendev/README.md +0 -5
  259. package/front_end/models/greendev/greendev.ts +0 -5
  260. package/front_end/panels/common/Annotation.ts +0 -184
  261. package/front_end/panels/common/AnnotationManager.ts +0 -208
  262. package/front_end/panels/common/annotation.css +0 -40
  263. package/front_end/panels/greendev/GreenDevPanel.css +0 -282
  264. package/front_end/panels/greendev/GreenDevPanel.ts +0 -364
  265. package/front_end/panels/greendev/GreenDevShared.ts +0 -13
  266. package/front_end/panels/greendev/greendev-meta.ts +0 -52
  267. package/front_end/panels/greendev/greendev.ts +0 -9
@@ -5,8 +5,14 @@
5
5
  import * as SDK from '../../core/sdk/sdk.js';
6
6
  import * as CrUXManager from '../../models/crux-manager/crux-manager.js';
7
7
 
8
+ import {
9
+ CalibratedMidTierMobileThrottlingOption,
10
+ type CPUThrottlingOption,
11
+ MidTierThrottlingOption,
12
+ } from './CPUThrottlingOption.js';
13
+
8
14
  export interface ThrottlingRecommendations {
9
- cpuOption: SDK.CPUThrottlingManager.CPUThrottlingOption|null;
15
+ cpuOption: CPUThrottlingOption|null;
10
16
  networkConditions: SDK.NetworkManager.Conditions|null;
11
17
  }
12
18
 
@@ -18,10 +24,9 @@ export function getThrottlingRecommendations(): ThrottlingRecommendations {
18
24
  const cruxManager = CrUXManager.CrUXManager.instance();
19
25
  const roundTripTimeMetricData = cruxManager.getSelectedFieldMetricData('round_trip_time');
20
26
 
21
- let cpuOption: SDK.CPUThrottlingManager.CPUThrottlingOption =
22
- SDK.CPUThrottlingManager.CalibratedMidTierMobileThrottlingOption;
27
+ let cpuOption: CPUThrottlingOption = CalibratedMidTierMobileThrottlingOption;
23
28
  if (cpuOption.rate() === 0) {
24
- cpuOption = SDK.CPUThrottlingManager.MidTierThrottlingOption;
29
+ cpuOption = MidTierThrottlingOption;
25
30
  }
26
31
 
27
32
  const networkConditions = getRecommendedNetworkConditions(roundTripTimeMetricData);
@@ -97,13 +97,13 @@ export class TypeToAllowDialog {
97
97
  export {AiCodeCompletionTeaser} from './AiCodeCompletionTeaser.js';
98
98
  export * as AiCodeGenerationTeaser from './AiCodeGenerationTeaser.js';
99
99
  export {AiCodeGenerationUpgradeDialog} from './AiCodeGenerationUpgradeDialog.js';
100
- export {AnnotationManager} from './AnnotationManager.js';
101
100
  export {FreDialog} from './FreDialog.js';
102
101
  export {GdpSignUpDialog} from './GdpSignUpDialog.js';
103
102
  export {GeminiRebrandPromoDialog} from './GeminiRebrandPromoDialog.js';
104
103
  export {AiCodeCompletionDisclaimer} from './AiCodeCompletionDisclaimer.js';
105
104
  export * as AiCodeCompletionSummaryToolbar from './AiCodeCompletionSummaryToolbar.js';
106
105
  export * from './BadgeNotification.js';
106
+ export * as CPUThrottlingOption from './CPUThrottlingOption.js';
107
107
  export * as ExtensionPanel from './ExtensionPanel.js';
108
108
  export * as ExtensionServer from './ExtensionServer.js';
109
109
  export * as ExtensionView from './ExtensionView.js';
@@ -225,6 +225,18 @@ const UIStrings = {
225
225
  * @description Element title in Object Properties Section
226
226
  */
227
227
  invokePropertyGetter: 'Invoke property getter',
228
+ /**
229
+ * @description Context menu item to copy table data
230
+ */
231
+ copyTableAs: 'Copy table as',
232
+ /**
233
+ * @description Submenu item to copy table as Markdown
234
+ */
235
+ copyAsMarkdown: 'Copy as Markdown',
236
+ /**
237
+ * @description Submenu item to copy table as CSV
238
+ */
239
+ copyAsCsv: 'Copy as CSV',
228
240
  } as const;
229
241
  const str_ = i18n.i18n.registerUIStrings('panels/console/ConsoleViewMessage.ts', UIStrings);
230
242
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -2180,6 +2192,7 @@ export class ConsoleTableMessageView extends ConsoleViewMessage {
2180
2192
  if (this.dataGrid) {
2181
2193
  this.dataGrid.setStriped(true);
2182
2194
  this.dataGrid.setFocusable(false);
2195
+ this.dataGrid.setTableContextMenuCallback(this.populateTableContextMenu.bind(this));
2183
2196
 
2184
2197
  const formattedResult = document.createElement('span');
2185
2198
  formattedResult.classList.add('console-message-text');
@@ -2205,6 +2218,38 @@ export class ConsoleTableMessageView extends ConsoleViewMessage {
2205
2218
  }
2206
2219
  return defaultConsoleRowHeight;
2207
2220
  }
2221
+
2222
+ private populateTableContextMenu(contextMenu: UI.ContextMenu.ContextMenu): void {
2223
+ const copySubMenu = contextMenu.clipboardSection().appendSubMenuItem(i18nString(UIStrings.copyTableAs));
2224
+ copySubMenu.defaultSection().appendItem(i18nString(UIStrings.copyAsMarkdown), this.copyTableAsMarkdown.bind(this),
2225
+ {jslogContext: 'copy-as-markdown'});
2226
+ copySubMenu.defaultSection().appendItem(i18nString(UIStrings.copyAsCsv), this.copyTableAsCSV.bind(this),
2227
+ {jslogContext: 'copy-as-csv'});
2228
+ }
2229
+
2230
+ private copyTableAsMarkdown(): void {
2231
+ if (!this.dataGrid) {
2232
+ return;
2233
+ }
2234
+ const markdown = DataGrid.DataGridExporter.exportToMarkdown(this.dataGrid);
2235
+ UI.UIUtils.copyTextToClipboard(markdown);
2236
+ }
2237
+
2238
+ private copyTableAsCSV(): void {
2239
+ if (!this.dataGrid) {
2240
+ return;
2241
+ }
2242
+ const csv = DataGrid.DataGridExporter.exportToCSV(this.dataGrid);
2243
+ UI.UIUtils.copyTextToClipboard(csv);
2244
+ }
2245
+
2246
+ getDataGridForTest(): DataGrid.SortableDataGrid.SortableDataGrid<unknown>|null {
2247
+ return this.dataGrid;
2248
+ }
2249
+
2250
+ populateTableContextMenuForTest(contextMenu: UI.ContextMenu.ContextMenu): void {
2251
+ this.populateTableContextMenu(contextMenu);
2252
+ }
2208
2253
  }
2209
2254
 
2210
2255
  /**
@@ -18,8 +18,10 @@ function isLeafNode(node: SDK.AccessibilityModel.AccessibilityNode): boolean {
18
18
  return node.numChildren() === 0 && node.role()?.value !== 'Iframe';
19
19
  }
20
20
 
21
- function getModel(frameId: Protocol.Page.FrameId): SDK.AccessibilityModel.AccessibilityModel {
22
- const frame = SDK.FrameManager.FrameManager.instance().getFrame(frameId);
21
+ function getModel(frameId: Protocol.Page.FrameId,
22
+ frameManager: SDK.FrameManager.FrameManager =
23
+ SDK.FrameManager.FrameManager.instance()): SDK.AccessibilityModel.AccessibilityModel {
24
+ const frame = frameManager.getFrame(frameId);
23
25
  const model = frame?.resourceTreeModel().target().model(SDK.AccessibilityModel.AccessibilityModel);
24
26
  if (!model) {
25
27
  throw new Error('Could not instantiate model for frameId');
@@ -27,8 +29,11 @@ function getModel(frameId: Protocol.Page.FrameId): SDK.AccessibilityModel.Access
27
29
  return model;
28
30
  }
29
31
 
30
- export async function getRootNode(frameId: Protocol.Page.FrameId): Promise<SDK.AccessibilityModel.AccessibilityNode> {
31
- const model = getModel(frameId);
32
+ export async function getRootNode(
33
+ frameId: Protocol.Page.FrameId,
34
+ frameManager: SDK.FrameManager.FrameManager =
35
+ SDK.FrameManager.FrameManager.instance()): Promise<SDK.AccessibilityModel.AccessibilityNode> {
36
+ const model = getModel(frameId, frameManager);
32
37
  const root = await model.requestRootNode(frameId);
33
38
  if (!root) {
34
39
  throw new Error('No accessibility root for frame');
@@ -49,33 +54,36 @@ function getFrameIdForNodeOrDocument(node: SDK.DOMModel.DOMNode): Protocol.Page.
49
54
  return frameId;
50
55
  }
51
56
 
52
- export async function getNodeAndAncestorsFromDOMNode(domNode: SDK.DOMModel.DOMNode):
53
- Promise<SDK.AccessibilityModel.AccessibilityNode[]> {
57
+ export async function getNodeAndAncestorsFromDOMNode(
58
+ domNode: SDK.DOMModel.DOMNode,
59
+ frameManager: SDK.FrameManager.FrameManager =
60
+ SDK.FrameManager.FrameManager.instance()): Promise<SDK.AccessibilityModel.AccessibilityNode[]> {
54
61
  let frameId = getFrameIdForNodeOrDocument(domNode);
55
- const model = getModel(frameId);
62
+ const model = getModel(frameId, frameManager);
56
63
  const result = await model.requestAndLoadSubTreeToNode(domNode);
57
64
  if (!result) {
58
65
  throw new Error('Could not retrieve accessibility node for inspected DOM node');
59
66
  }
60
67
 
61
- const outermostFrameId = SDK.FrameManager.FrameManager.instance().getOutermostFrame()?.id;
68
+ const outermostFrameId = frameManager.getOutermostFrame()?.id;
62
69
  if (!outermostFrameId) {
63
70
  return result;
64
71
  }
65
72
  while (frameId !== outermostFrameId) {
66
- const node = await SDK.FrameManager.FrameManager.instance().getFrame(frameId)?.getOwnerDOMNodeOrDocument();
73
+ const node = await frameManager.getFrame(frameId)?.getOwnerDOMNodeOrDocument();
67
74
  if (!node) {
68
75
  break;
69
76
  }
70
77
  frameId = getFrameIdForNodeOrDocument(node);
71
- const model = getModel(frameId);
78
+ const model = getModel(frameId, frameManager);
72
79
  const ancestors = await model.requestAndLoadSubTreeToNode(node);
73
80
  result.push(...ancestors || []);
74
81
  }
75
82
  return result;
76
83
  }
77
84
 
78
- async function getChildren(node: SDK.AccessibilityModel.AccessibilityNode):
85
+ async function getChildren(node: SDK.AccessibilityModel.AccessibilityNode,
86
+ frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance()):
79
87
  Promise<SDK.AccessibilityModel.AccessibilityNode[]> {
80
88
  if (node.role()?.value === 'Iframe') {
81
89
  const domNode = await node.deferredDOMNode()?.resolvePromise();
@@ -86,13 +94,15 @@ async function getChildren(node: SDK.AccessibilityModel.AccessibilityNode):
86
94
  if (!frameId) {
87
95
  throw new Error('No owner frameId on iframe node');
88
96
  }
89
- const localRoot = await getRootNode(frameId);
97
+ const localRoot = await getRootNode(frameId, frameManager);
90
98
  return [localRoot];
91
99
  }
92
100
  return await node.accessibilityModel().requestAXChildren(node.id(), node.getFrameId() || undefined);
93
101
  }
94
102
 
95
- export async function sdkNodeToAXTreeNodes(sdkNode: SDK.AccessibilityModel.AccessibilityNode): Promise<AXTreeNode[]> {
103
+ export async function sdkNodeToAXTreeNodes(
104
+ sdkNode: SDK.AccessibilityModel.AccessibilityNode,
105
+ frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance()): Promise<AXTreeNode[]> {
96
106
  const treeNodeData = sdkNode;
97
107
  if (isLeafNode(sdkNode)) {
98
108
  return [{
@@ -104,8 +114,9 @@ export async function sdkNodeToAXTreeNodes(sdkNode: SDK.AccessibilityModel.Acces
104
114
  return [{
105
115
  treeNodeData,
106
116
  children: async () => {
107
- const childNodes = await getChildren(sdkNode);
108
- const childTreeNodes = await Promise.all(childNodes.map(childNode => sdkNodeToAXTreeNodes(childNode)));
117
+ const childNodes = await getChildren(sdkNode, frameManager);
118
+ const childTreeNodes =
119
+ await Promise.all(childNodes.map(childNode => sdkNodeToAXTreeNodes(childNode, frameManager)));
109
120
  return childTreeNodes.flat(1);
110
121
  },
111
122
  id: getNodeId(sdkNode),
@@ -19,11 +19,14 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
19
19
  private inspectedDOMNode: SDK.DOMModel.DOMNode|null = null;
20
20
  private root: SDK.AccessibilityModel.AccessibilityNode|null = null;
21
21
 
22
- constructor(
23
- accessibilityTreeComponent: TreeOutline.TreeOutline.TreeOutline<AccessibilityTreeUtils.AXTreeNodeData>) {
22
+ readonly #frameManager: SDK.FrameManager.FrameManager;
23
+
24
+ constructor(accessibilityTreeComponent: TreeOutline.TreeOutline.TreeOutline<AccessibilityTreeUtils.AXTreeNodeData>,
25
+ frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance()) {
24
26
  super();
25
27
  this.registerRequiredCSS(accessibilityTreeViewStyles);
26
28
  this.accessibilityTreeComponent = accessibilityTreeComponent;
29
+ this.#frameManager = frameManager;
27
30
 
28
31
  const container = this.contentElement.createChild('div');
29
32
 
@@ -75,11 +78,11 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
75
78
 
76
79
  async refreshAccessibilityTree(): Promise<void> {
77
80
  if (!this.root) {
78
- const frameId = SDK.FrameManager.FrameManager.instance().getOutermostFrame()?.id;
81
+ const frameId = this.#frameManager.getOutermostFrame()?.id;
79
82
  if (!frameId) {
80
83
  throw new Error('No top frame');
81
84
  }
82
- this.root = await AccessibilityTreeUtils.getRootNode(frameId);
85
+ this.root = await AccessibilityTreeUtils.getRootNode(frameId, this.#frameManager);
83
86
  if (!this.root) {
84
87
  throw new Error('No root');
85
88
  }
@@ -90,15 +93,15 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
90
93
 
91
94
  async renderTree(): Promise<void> {
92
95
  if (!this.root) {
93
- const frameId = SDK.FrameManager.FrameManager.instance().getOutermostFrame()?.id;
96
+ const frameId = this.#frameManager.getOutermostFrame()?.id;
94
97
  if (frameId) {
95
- this.root = await AccessibilityTreeUtils.getRootNode(frameId);
98
+ this.root = await AccessibilityTreeUtils.getRootNode(frameId, this.#frameManager);
96
99
  }
97
100
  }
98
101
  if (!this.root) {
99
102
  return;
100
103
  }
101
- const treeData = await AccessibilityTreeUtils.sdkNodeToAXTreeNodes(this.root);
104
+ const treeData = await AccessibilityTreeUtils.sdkNodeToAXTreeNodes(this.root, this.#frameManager);
102
105
  this.accessibilityTreeComponent.data = {
103
106
  defaultRenderer: AccessibilityTreeUtils.accessibilityNodeRenderer,
104
107
  tree: treeData,
@@ -113,7 +116,7 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
113
116
  // Given a selected DOM node, asks the model to load the missing subtree from the root to the
114
117
  // selected node and then re-renders the tree.
115
118
  async loadSubTreeIntoAccessibilityModel(selectedNode: SDK.DOMModel.DOMNode): Promise<void> {
116
- const ancestors = await AccessibilityTreeUtils.getNodeAndAncestorsFromDOMNode(selectedNode);
119
+ const ancestors = await AccessibilityTreeUtils.getNodeAndAncestorsFromDOMNode(selectedNode, this.#frameManager);
117
120
  const inspectedAXNode = ancestors.find(node => node.backendDOMNodeId() === selectedNode.backendNodeId());
118
121
  if (!inspectedAXNode) {
119
122
  return;
@@ -160,7 +163,7 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
160
163
  void this.renderTree();
161
164
  return;
162
165
  }
163
- const outermostFrameId = SDK.FrameManager.FrameManager.instance().getOutermostFrame()?.id;
166
+ const outermostFrameId = this.#frameManager.getOutermostFrame()?.id;
164
167
  if (data.root?.getFrameId() !== outermostFrameId) {
165
168
  void this.renderTree();
166
169
  return;
@@ -40,7 +40,6 @@ import * as Platform from '../../core/platform/platform.js';
40
40
  import * as Root from '../../core/root/root.js';
41
41
  import * as SDK from '../../core/sdk/sdk.js';
42
42
  import type * as Protocol from '../../generated/protocol.js';
43
- import * as Annotations from '../../models/annotations/annotations.js';
44
43
  import * as ComputedStyle from '../../models/computed_style/computed_style.js';
45
44
  import * as PanelCommon from '../../panels/common/common.js';
46
45
  import type * as Adorners from '../../ui/components/adorners/adorners.js';
@@ -307,8 +306,6 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
307
306
  this.#domTreeWidget.onSelectedNodeChanged = this.selectedNodeChanged.bind(this);
308
307
  this.#domTreeWidget.onElementsTreeUpdated = this.updateBreadcrumbIfNeeded.bind(this);
309
308
  this.#domTreeWidget.onDocumentUpdated = this.documentUpdated.bind(this);
310
- this.#domTreeWidget.onElementExpanded = this.handleElementExpanded.bind(this);
311
- this.#domTreeWidget.onElementCollapsed = this.handleElementCollapsed.bind(this);
312
309
  this.#domTreeWidget.setWordWrap(Common.Settings.Settings.instance().moduleSetting('dom-word-wrap').get());
313
310
 
314
311
  SDK.TargetManager.TargetManager.instance().observeModels(SDK.DOMModel.DOMModel, this, {scoped: true});
@@ -319,11 +316,6 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
319
316
  .addChangeListener(this.showUAShadowDOMChanged.bind(this));
320
317
  PanelCommon.ExtensionServer.ExtensionServer.instance().addEventListener(
321
318
  PanelCommon.ExtensionServer.Events.SidebarPaneAdded, this.extensionSidebarPaneAdded, this);
322
-
323
- if (Annotations.AnnotationRepository.annotationsEnabled()) {
324
- PanelCommon.AnnotationManager.instance().initializePlacementForAnnotationType(
325
- Annotations.AnnotationType.ELEMENT_NODE, this.resolveInitialState.bind(this), this.#domTreeWidget.element);
326
- }
327
319
  }
328
320
 
329
321
  // This is a debounced method because the user might be navigated from Styles tab to Computed Style tab and vice versa.
@@ -353,18 +345,6 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
353
345
  }
354
346
  }
355
347
 
356
- private handleElementExpanded(): void {
357
- if (Annotations.AnnotationRepository.annotationsEnabled()) {
358
- void PanelCommon.AnnotationManager.instance().resolveAnnotationsOfType(Annotations.AnnotationType.ELEMENT_NODE);
359
- }
360
- }
361
-
362
- private handleElementCollapsed(): void {
363
- if (Annotations.AnnotationRepository.annotationsEnabled()) {
364
- void PanelCommon.AnnotationManager.instance().resolveAnnotationsOfType(Annotations.AnnotationType.ELEMENT_NODE);
365
- }
366
- }
367
-
368
348
  private showAccessibilityTree(): void {
369
349
  if (this.accessibilityTreeView) {
370
350
  this.splitWidget.setMainWidget(this.accessibilityTreeView);
@@ -511,10 +491,6 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
511
491
  UI.Context.Context.instance().setFlavor(ElementsPanel, this);
512
492
  this.#domTreeWidget.show(this.domTreeContainer);
513
493
  this.evaluateTrackingComputedStyleUpdatesForNode();
514
-
515
- if (Annotations.AnnotationRepository.annotationsEnabled()) {
516
- void PanelCommon.AnnotationManager.instance().resolveAnnotationsOfType(Annotations.AnnotationType.ELEMENT_NODE);
517
- }
518
494
  }
519
495
 
520
496
  override willHide(): void {
@@ -1321,56 +1297,6 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
1321
1297
  this.#domTreeWidget.copyStyles(node);
1322
1298
  }
1323
1299
 
1324
- async resolveInitialState(
1325
- parentElement: Element, reveal: boolean, lookupId: string,
1326
- anchor?: SDK.DOMModel.DOMNode|SDK.NetworkRequest.NetworkRequest): Promise<{x: number, y: number}|null> {
1327
- if (!this.isShowing()) {
1328
- return null;
1329
- }
1330
-
1331
- if (!anchor) {
1332
- const backendNodeId = Number(lookupId) as Protocol.DOM.BackendNodeId;
1333
- if (isNaN(backendNodeId)) {
1334
- return null;
1335
- }
1336
- const rootDOMNode = this.#domTreeWidget.rootDOMNode;
1337
- if (!rootDOMNode) {
1338
- return null;
1339
- }
1340
- const domModel = rootDOMNode.domModel();
1341
- const nodes = await domModel.pushNodesByBackendIdsToFrontend(new Set([backendNodeId]));
1342
- if (!nodes) {
1343
- return null;
1344
- }
1345
- const foundNode = nodes.get(backendNodeId);
1346
- if (!foundNode) {
1347
- return null;
1348
- }
1349
- anchor = foundNode;
1350
- }
1351
-
1352
- const element = this.#domTreeWidget.treeElementForNode(anchor as SDK.DOMModel.DOMNode);
1353
- if (!element) {
1354
- return null;
1355
- }
1356
-
1357
- if (reveal) {
1358
- // The node must have been revealed in order to calculate its position.
1359
- await Common.Revealer.reveal(anchor);
1360
- }
1361
-
1362
- // The tree element element starts at the top-left of the expand/collapse arrow). We
1363
- // want to aim for the tagname instead.
1364
- const offsetToTagName = 22;
1365
- const yPadding = 5;
1366
-
1367
- const targetRect = element.listItemElement.getBoundingClientRect();
1368
- const parentRect = parentElement.getBoundingClientRect();
1369
- const relativeX = targetRect.x - parentRect.x + offsetToTagName;
1370
- const relativeY = targetRect.y - parentRect.y + yPadding;
1371
- return {x: relativeX, y: relativeY};
1372
- }
1373
-
1374
1300
  protected static firstInspectElementCompletedForTest = function(): void {};
1375
1301
  protected static firstInspectElementNodeNameForTest = '';
1376
1302
  }
@@ -235,8 +235,6 @@ export class DOMTreeWidget extends UI.Widget.Widget {
235
235
  Common.EventTarget.EventTargetEvent<{node: SDK.DOMModel.DOMNode | null, focus: boolean}>) => void = () => {};
236
236
  onElementsTreeUpdated: (event: Common.EventTarget.EventTargetEvent<SDK.DOMModel.DOMNode[]>) => void = () => {};
237
237
  onDocumentUpdated: (domModel: SDK.DOMModel.DOMModel) => void = () => {};
238
- onElementExpanded: () => void = () => {};
239
- onElementCollapsed: () => void = () => {};
240
238
 
241
239
  #maxTreeDepth?: number;
242
240
  #enableContextMenu = true;
@@ -455,11 +453,9 @@ export class DOMTreeWidget extends UI.Widget.Widget {
455
453
  },
456
454
  onElementCollapsed: () => {
457
455
  this.#clearHighlightedNode();
458
- this.onElementCollapsed();
459
456
  },
460
457
  onElementExpanded: () => {
461
458
  this.#clearHighlightedNode();
462
- this.onElementExpanded();
463
459
  },
464
460
  },
465
461
  this.#viewOutput, this.contentElement);
@@ -2136,6 +2132,11 @@ export class ElementsTreeOutline extends
2136
2132
  visibleChildren.push(pickerIconPseudoElement);
2137
2133
  }
2138
2134
 
2135
+ const interestButtonPseudoElement = node.interestButtonPseudoElement();
2136
+ if (interestButtonPseudoElement) {
2137
+ visibleChildren.push(interestButtonPseudoElement);
2138
+ }
2139
+
2139
2140
  const backdropPseudoElement = node.backdropPseudoElement();
2140
2141
  if (backdropPseudoElement) {
2141
2142
  visibleChildren.push(backdropPseudoElement);
@@ -108,16 +108,9 @@ const UIStrings = {
108
108
  moreOptions: 'More options',
109
109
  /**
110
110
  * @description A menu item in the drop-down box that allows the user to select the zoom level.
111
- * Labels the value which corresponds to the 'fit to window' zoom level, represented by the
112
- * placeholder, which is a number. In the Device Mode Toolbar.
113
- * @example {30.0} PH1
114
- */
115
- fitToWindowPercentage: '{PH1}% (fit to window)',
116
- /**
117
- * @description A checkbox setting that appears in the context menu for the zoom level, in the
118
- * Device Mode Toolbar.
111
+ * Labels the option to automatically fit the preview to the available window space. In the Device Mode Toolbar.
119
112
  */
120
- autoadjustZoom: 'Auto-adjust zoom',
113
+ fitToWindow: 'Fit to window',
121
114
  /**
122
115
  * @description A menu item in the drop-down box that allows the user to select the device pixel
123
116
  * ratio. Labels the default value which varies between device types, represented by the
@@ -236,7 +229,6 @@ const str_ = i18n.i18n.registerUIStrings('panels/emulation/DeviceModeToolbar.ts'
236
229
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
237
230
  const {ifDefined, live} = Directives;
238
231
  const {widget} = UI.Widget;
239
- const {bindToSetting} = UI.UIUtils;
240
232
 
241
233
  export interface DeviceModeOption {
242
234
  device: EmulationModel.EmulatedDevices.EmulatedDevice;
@@ -359,17 +351,11 @@ export const DEFAULT_VIEW: View = (input, _output, target) => {
359
351
  title=${i18nString(UIStrings.zoom)}
360
352
  aria-label=${i18nString(UIStrings.zoom)}
361
353
  @change=${input.onScaleChange}
362
- .value=${String(input.scaleOptions.find(o => o.selected)?.value || '')}
354
+ .value=${String(input.scaleOptions.find(o => o.selected)?.value ?? '')}
363
355
  jslog=${VisualLogging.dropDown().track({change: true}).context('scale')}>
364
356
  ${input.scaleOptions.map(o => html`<option value=${o.value} ?selected=${o.selected} jslog=${VisualLogging.item(o.jslogContext).track({click: true})}>${o.title}</option>`)}
365
357
  </select>
366
358
 
367
- <devtools-button .data=${{variant: Buttons.Button.Variant.TOOLBAR, iconName: 'center-focus-weak',
368
- toggledIconName: 'center-focus-weak', toggleType: Buttons.Button.ToggleType.PRIMARY} as Buttons.Button.ButtonData}
369
- class="toolbar-button" title=${i18nString(UIStrings.autoadjustZoom)}
370
- ${bindToSetting(input.autoAdjustScaleSetting)}>
371
- </devtools-button>
372
-
373
359
  <div class="device-mode-empty-toolbar-element"></div>
374
360
 
375
361
  ${input.showDeviceScaleFactorSetting.get() ? html`
@@ -381,7 +367,7 @@ export const DEFAULT_VIEW: View = (input, _output, target) => {
381
367
  title=${i18nString(UIStrings.devicePixelRatio)}
382
368
  aria-label=${i18nString(UIStrings.devicePixelRatio)}
383
369
  @change=${input.onDeviceScaleChange}
384
- .value=${String(input.dprOptions.find(o => o.selected)?.value || '')}
370
+ .value=${String(input.dprOptions.find(o => o.selected)?.value ?? '')}
385
371
  jslog=${VisualLogging.dropDown().track({change: true}).context('device-pixel-ratio')}
386
372
  ?disabled=${!input.isResponsive}>
387
373
  ${input.dprOptions.map(o => html`<option value=${o.value} ?selected=${o.selected} jslog=${VisualLogging.item(o.jslogContext).track({click: true})}>${o.title}</option>`)}
@@ -488,6 +474,7 @@ export class DeviceModeToolbar extends UI.Widget.Widget {
488
474
 
489
475
  this.autoAdjustScaleSetting =
490
476
  Common.Settings.Settings.instance().createSetting('emulation.auto-adjust-scale', true);
477
+ this.autoAdjustScaleSetting.addChangeListener(this.requestUpdate, this);
491
478
 
492
479
  this.lastMode = new Map();
493
480
 
@@ -665,39 +652,53 @@ export class DeviceModeToolbar extends UI.Widget.Widget {
665
652
 
666
653
  private getScaleOptions(): Array<{title: string, value: number, selected: boolean, jslogContext: string}> {
667
654
  const values = [0.5, 0.75, 1, 1.25, 1.5, 2];
668
- let fitValue: number|null = null;
669
- if (this.model.type() === EmulationModel.DeviceModeModel.Type.Device) {
670
- fitValue = this.model.fitScale();
671
- const fitValuePct = (fitValue * 100).toFixed(0);
672
- let found = false;
673
- for (let i = 0; i < values.length; ++i) {
674
- if ((values[i] * 100).toFixed(0) === fitValuePct) {
675
- found = true;
676
- values[i] = fitValue;
677
- break;
678
- }
679
- }
680
- if (!found) {
681
- values.push(fitValue);
682
- values.sort((a, b) => a - b);
683
- }
655
+ const isAutoAdjusting = this.autoAdjustScaleSetting.get();
656
+ const currentScale = this.model.scaleSetting().get();
657
+
658
+ if (!isAutoAdjusting && !values.includes(currentScale)) {
659
+ values.push(currentScale);
660
+ values.sort((a, b) => a - b);
684
661
  }
685
662
 
686
- const currentScale = this.model.scaleSetting().get();
687
- return values.map(value => {
688
- let title = (value * 100).toFixed(0) + '%';
689
- let jslogContext = title;
690
- if (value === fitValue) {
691
- title = i18nString(UIStrings.fitToWindowPercentage, {PH1: (value * 100).toFixed(0)});
692
- jslogContext = 'fit-to-window';
693
- }
694
- return {title, value, selected: currentScale === value, jslogContext};
695
- });
663
+ const options: Array<{title: string, value: number, selected: boolean, jslogContext: string}> = [
664
+ {
665
+ title: i18nString(UIStrings.fitToWindow),
666
+ value: 0,
667
+ selected: isAutoAdjusting,
668
+ jslogContext: 'fit-to-window',
669
+ },
670
+ ];
671
+
672
+ for (const value of values) {
673
+ const title = (value * 100).toFixed(0) + '%';
674
+ options.push({
675
+ title,
676
+ value,
677
+ selected: !isAutoAdjusting && currentScale === value,
678
+ jslogContext: title,
679
+ });
680
+ }
681
+ return options;
696
682
  }
697
683
 
698
684
  private onScaleChange(event: Event): void {
699
685
  const value = Number((event.target as HTMLSelectElement).value);
700
- this.model.scaleSetting().set(value);
686
+ if (value === 0) {
687
+ this.autoAdjustScaleSetting.set(true);
688
+ if (this.model.type() === EmulationModel.DeviceModeModel.Type.Responsive) {
689
+ const appliedSize = this.model.appliedDeviceSize();
690
+ this.model.setSizeAndScaleToFit(appliedSize.width, appliedSize.height);
691
+ } else {
692
+ const device = this.model.device();
693
+ const mode = this.model.mode();
694
+ if (device && mode) {
695
+ this.model.emulate(EmulationModel.DeviceModeModel.Type.Device, device, mode, undefined);
696
+ }
697
+ }
698
+ } else {
699
+ this.autoAdjustScaleSetting.set(false);
700
+ this.model.scaleSetting().set(value);
701
+ }
701
702
  }
702
703
 
703
704
  private getDeviceScaleFactorOptions():