chrome-devtools-frontend 1.0.1662289 → 1.0.1664496

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 (319) hide show
  1. package/.agents/skills/{creating-a-model → devtools-model-management}/SKILL.md +0 -1
  2. package/.agents/skills/devtools-unicode-escaping/SKILL.md +64 -0
  3. package/.agents/skills/devtools-ux-writing-refactor/SKILL.md +2 -1
  4. package/.agents/skills/fixing-skipped-tests/SKILL.md +3 -3
  5. package/.agents/skills/merging-devtools-module/SKILL.md +1 -1
  6. package/.agents/skills/migrate-chromium-test/SKILL.md +32 -6
  7. package/.agents/skills/repro-flaky-tests/SKILL.md +71 -31
  8. package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +1 -0
  9. package/docs/ui_engineering.md +2 -0
  10. package/eslint.config.mjs +1 -0
  11. package/front_end/core/common/SettingRegistration.ts +0 -5
  12. package/front_end/core/common/Settings.ts +144 -3
  13. package/front_end/core/platform/StringUtilities.ts +38 -6
  14. package/front_end/core/protocol_client/PuppeteerDevToolsConnection.ts +112 -0
  15. package/front_end/core/sdk/CPUProfilerModel.ts +21 -13
  16. package/front_end/core/sdk/CSSContainerQuery.ts +1 -1
  17. package/front_end/core/sdk/CSSLayer.ts +1 -1
  18. package/front_end/core/sdk/CSSMedia.ts +1 -1
  19. package/front_end/core/sdk/CSSModel.ts +1 -1
  20. package/front_end/core/sdk/CSSNavigation.ts +1 -1
  21. package/front_end/core/sdk/CSSProperty.ts +1 -1
  22. package/front_end/core/sdk/CSSQuery.ts +1 -1
  23. package/front_end/core/sdk/CSSRule.ts +1 -1
  24. package/front_end/core/sdk/CSSScope.ts +1 -1
  25. package/front_end/core/sdk/CSSStartingStyle.ts +1 -1
  26. package/front_end/core/sdk/CSSStyleDeclaration.ts +1 -1
  27. package/front_end/core/sdk/CSSStyleSheetHeader.ts +1 -1
  28. package/front_end/core/sdk/CSSSupports.ts +1 -1
  29. package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +1 -1
  30. package/front_end/core/sdk/NetworkManager.ts +1 -1
  31. package/front_end/core/sdk/NetworkRequest.ts +7 -7
  32. package/front_end/core/sdk/Resource.ts +1 -1
  33. package/front_end/core/sdk/ScopeTreeCache.ts +1 -1
  34. package/front_end/core/sdk/Script.ts +1 -1
  35. package/front_end/core/sdk/ServerSentEvents.ts +1 -1
  36. package/front_end/core/sdk/ServiceWorkerCacheModel.ts +0 -10
  37. package/front_end/core/sdk/SourceMap.ts +1 -1
  38. package/front_end/core/sdk/SourceMapScopesInfo.ts +1 -1
  39. package/front_end/core/sdk/StorageBucketsModel.ts +0 -10
  40. package/front_end/core/sdk/sdk-meta.ts +3 -4
  41. package/front_end/{models → core}/text_utils/ContentProvider.ts +4 -6
  42. package/front_end/{models → core}/text_utils/StaticContentProvider.ts +4 -6
  43. package/front_end/{models → core}/text_utils/StreamingContentData.ts +1 -2
  44. package/front_end/{models → core}/text_utils/TextRange.ts +6 -3
  45. package/front_end/{models → core}/text_utils/TextUtils.ts +7 -7
  46. package/front_end/{models → core}/text_utils/WasmDisassembly.ts +2 -2
  47. package/front_end/core/text_utils/text_utils.ts +27 -0
  48. package/front_end/entrypoints/formatter_worker/AcornTokenizer.ts +1 -1
  49. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshotLoader.ts +1 -1
  50. package/front_end/entrypoints/inspector_main/OutermostTargetSelector.ts +0 -13
  51. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +8 -3
  52. package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +3 -3
  53. package/front_end/entrypoints/main/MainImpl.ts +21 -3
  54. package/front_end/foundation/Universe.ts +16 -0
  55. package/front_end/generated/InspectorBackendCommands.ts +2 -14
  56. package/front_end/generated/protocol-mapping.d.ts +0 -53
  57. package/front_end/generated/protocol-proxy-api.d.ts +0 -46
  58. package/front_end/generated/protocol.ts +0 -148
  59. package/front_end/models/ai_assistance/AgentProject.ts +1 -1
  60. package/front_end/models/ai_assistance/AiAgent2.ts +3 -3
  61. package/front_end/models/ai_assistance/AiConversation.ts +21 -10
  62. package/front_end/models/ai_assistance/AiHistoryStorage.ts +21 -10
  63. package/front_end/models/ai_assistance/ChangeManager.ts +2 -2
  64. package/front_end/models/ai_assistance/ExtensionScope.ts +6 -2
  65. package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +4 -7
  66. package/front_end/models/ai_assistance/agents/AiAgent.ts +9 -2
  67. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +19 -11
  68. package/front_end/models/ai_assistance/agents/PerformanceAgent.snapshot.txt +2 -2
  69. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +23 -10
  70. package/front_end/models/ai_assistance/agents/StorageAgent.ts +19 -18
  71. package/front_end/models/ai_assistance/agents/StylingAgent.ts +3 -4
  72. package/front_end/models/ai_assistance/contexts/FileContext.ts +7 -3
  73. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +39 -11
  74. package/front_end/models/ai_assistance/data_formatters/FileFormatter.ts +6 -3
  75. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +1 -1
  76. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +4 -4
  77. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +8 -8
  78. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +76 -3
  79. package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +11 -1
  80. package/front_end/models/badges/AiExplorerBadge.ts +8 -3
  81. package/front_end/models/badges/Badge.ts +1 -0
  82. package/front_end/models/badges/UserBadges.ts +43 -23
  83. package/front_end/models/bindings/CompilerScriptMapping.ts +1 -1
  84. package/front_end/models/bindings/ContentProviderBasedProject.ts +1 -1
  85. package/front_end/models/bindings/DebuggerLanguagePlugins.ts +2 -2
  86. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +1 -1
  87. package/front_end/models/bindings/DefaultScriptMapping.ts +1 -1
  88. package/front_end/models/bindings/FileUtils.ts +1 -1
  89. package/front_end/models/bindings/NetworkProject.ts +16 -4
  90. package/front_end/models/bindings/PresentationConsoleMessageHelper.ts +7 -10
  91. package/front_end/models/bindings/ResourceMapping.ts +1 -1
  92. package/front_end/models/bindings/ResourceScriptMapping.ts +1 -1
  93. package/front_end/models/bindings/SASSSourceMapping.ts +1 -1
  94. package/front_end/models/bindings/StylesSourceMapping.ts +1 -1
  95. package/front_end/models/breakpoints/BreakpointManager.ts +1 -1
  96. package/front_end/models/crux-manager/CrUXManager.ts +1 -1
  97. package/front_end/models/emulation/DeviceModeModel.ts +67 -5
  98. package/front_end/models/emulation/EmulatedDevices.ts +3 -2
  99. package/front_end/models/extensions/RecorderPluginManager.ts +10 -6
  100. package/front_end/models/har/Importer.ts +1 -1
  101. package/front_end/models/har/Log.snapshot.txt +193 -0
  102. package/front_end/models/har/Log.ts +3 -2
  103. package/front_end/models/har/Writer.ts +1 -1
  104. package/front_end/models/issues_manager/IssueAggregator.ts +9 -0
  105. package/front_end/models/issues_manager/IssuesManager.ts +5 -0
  106. package/front_end/models/issues_manager/LazyLoadImageIssue.ts +76 -0
  107. package/front_end/models/issues_manager/descriptions/lazyLoadImageZeroSize.md +7 -0
  108. package/front_end/models/issues_manager/issues_manager.ts +2 -0
  109. package/front_end/models/javascript_metadata/NativeFunctions.js +9 -10
  110. package/front_end/models/live-metrics/LiveMetrics.ts +2 -3
  111. package/front_end/models/logs/NetworkLog.ts +4 -3
  112. package/front_end/models/logs/logs-meta.ts +3 -3
  113. package/front_end/models/network_time_calculator/NetworkTimeCalculator.ts +4 -4
  114. package/front_end/models/persistence/Automapping.ts +1 -1
  115. package/front_end/models/persistence/AutomaticFileSystemWorkspaceBinding.ts +2 -2
  116. package/front_end/models/persistence/FileSystemWorkspaceBinding.ts +1 -1
  117. package/front_end/models/persistence/IsolatedFileSystem.ts +2 -2
  118. package/front_end/models/persistence/NetworkPersistenceManager.ts +1 -1
  119. package/front_end/models/persistence/PersistenceImpl.ts +1 -1
  120. package/front_end/models/persistence/PlatformFileSystem.ts +1 -1
  121. package/front_end/models/source_map_scopes/FunctionCodeResolver.ts +8 -6
  122. package/front_end/models/source_map_scopes/NamesResolver.ts +37 -31
  123. package/front_end/models/stack_trace/StackTrace.ts +17 -0
  124. package/front_end/models/text_utils/text_utils.ts +2 -24
  125. package/front_end/models/trace/insights/ImageDelivery.ts +2 -2
  126. package/front_end/models/trace/insights/LegacyJavaScript.ts +1 -1
  127. package/front_end/models/trace/insights/RenderBlocking.ts +1 -1
  128. package/front_end/models/trace/insights/ThirdParties.ts +1 -1
  129. package/front_end/models/workspace/FileManager.ts +1 -1
  130. package/front_end/models/workspace/UISourceCode.ts +1 -1
  131. package/front_end/models/workspace/WorkspaceImpl.ts +1 -1
  132. package/front_end/models/workspace_diff/WorkspaceDiff.ts +1 -1
  133. package/front_end/panels/accessibility/AccessibilityNodeView.ts +1 -1
  134. package/front_end/panels/accessibility/AccessibilityStrings.ts +2 -2
  135. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +1 -1
  136. package/front_end/panels/ai_assistance/ExportConversation.ts +1 -1
  137. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +1 -1
  138. package/front_end/panels/ai_assistance/components/ChatMessage.ts +1 -1
  139. package/front_end/panels/application/AppManifestView.ts +4 -4
  140. package/front_end/panels/application/ApplicationPanelSidebar.ts +1 -2
  141. package/front_end/panels/application/CrashReportContextView.ts +1 -1
  142. package/front_end/panels/application/DOMStorageItemsView.ts +1 -1
  143. package/front_end/panels/application/DeviceBoundSessionsView.ts +4 -4
  144. package/front_end/panels/application/ExtensionStorageItemsView.ts +1 -1
  145. package/front_end/panels/application/FrameDetailsView.ts +1 -1
  146. package/front_end/panels/application/IndexedDBModel.ts +0 -10
  147. package/front_end/panels/application/IndexedDBViews.ts +240 -164
  148. package/front_end/panels/application/ServiceWorkerCacheTreeElement.ts +12 -2
  149. package/front_end/panels/application/ServiceWorkerCacheViews.ts +1 -1
  150. package/front_end/panels/application/SharedStorageModel.ts +0 -10
  151. package/front_end/panels/application/application.ts +2 -0
  152. package/front_end/panels/application/components/AdsView.ts +23 -0
  153. package/front_end/panels/application/components/BackForwardCacheView.ts +21 -5
  154. package/front_end/panels/application/components/CrashReportContextGrid.ts +1 -1
  155. package/front_end/panels/application/components/SharedStorageAccessGrid.ts +1 -1
  156. package/front_end/panels/application/components/TrustTokensView.ts +2 -2
  157. package/front_end/panels/application/components/adsView.css +21 -1
  158. package/front_end/panels/application/indexedDBViews.css +1 -1
  159. package/front_end/panels/application/preloading/PreloadingView.ts +1 -1
  160. package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +2 -2
  161. package/front_end/panels/application/preloading/components/PreloadingString.ts +2 -2
  162. package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +4 -4
  163. package/front_end/panels/autofill/AutofillView.ts +1 -1
  164. package/front_end/panels/common/AiCodeCompletionTeaser.ts +1 -1
  165. package/front_end/panels/common/ExtensionServer.ts +1 -1
  166. package/front_end/panels/console/ConsoleFilter.ts +1 -1
  167. package/front_end/panels/console/ConsoleSidebar.ts +1 -1
  168. package/front_end/panels/console/ConsoleView.ts +1 -1
  169. package/front_end/panels/console/ConsoleViewMessage.ts +1 -1
  170. package/front_end/panels/console/PromptBuilder.ts +1 -1
  171. package/front_end/panels/coverage/CoverageDecorationManager.ts +9 -1
  172. package/front_end/panels/coverage/CoverageModel.ts +1 -1
  173. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +1 -1
  174. package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +1 -1
  175. package/front_end/panels/developer_resources/DeveloperResourcesView.ts +1 -1
  176. package/front_end/panels/elements/AccessibilityTreeView.ts +38 -3
  177. package/front_end/panels/elements/AdoptedStyleSheetTreeElement.ts +1 -1
  178. package/front_end/panels/elements/ElementIssueUtils.ts +2 -2
  179. package/front_end/panels/elements/ElementsTreeElement.ts +10 -3
  180. package/front_end/panels/elements/StandaloneStylesContainer.ts +1 -1
  181. package/front_end/panels/elements/StylePropertiesSection.ts +1 -1
  182. package/front_end/panels/elements/StylePropertyTreeElement.ts +1 -1
  183. package/front_end/panels/elements/StylesAiCodeCompletionProvider.ts +1 -1
  184. package/front_end/panels/elements/StylesContainer.ts +1 -1
  185. package/front_end/panels/elements/StylesSidebarPane.ts +1 -1
  186. package/front_end/panels/elements/components/CSSPropertyDocsView.ts +1 -1
  187. package/front_end/panels/explain/components/ConsoleInsight.ts +2 -2
  188. package/front_end/panels/issues/AffectedLazyLoadImagesView.ts +76 -0
  189. package/front_end/panels/issues/AffectedResourcesView.ts +1 -1
  190. package/front_end/panels/issues/CorsIssueDetailsView.ts +1 -1
  191. package/front_end/panels/issues/IssueView.ts +2 -0
  192. package/front_end/panels/issues/issues.ts +2 -0
  193. package/front_end/panels/layer_viewer/Layers3DView.ts +1 -1
  194. package/front_end/panels/lighthouse/LighthouseController.ts +5 -0
  195. package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +1 -1
  196. package/front_end/panels/network/BinaryResourceView.ts +1 -1
  197. package/front_end/panels/network/NetworkDataGridNode.ts +72 -8
  198. package/front_end/panels/network/NetworkLogView.ts +1 -1
  199. package/front_end/panels/network/NetworkLogViewColumns.ts +6 -6
  200. package/front_end/panels/network/NetworkPanel.ts +4 -4
  201. package/front_end/panels/network/NetworkSearchScope.ts +1 -1
  202. package/front_end/panels/network/RequestConditionsDrawer.ts +1 -1
  203. package/front_end/panels/network/RequestHTMLView.ts +1 -1
  204. package/front_end/panels/network/RequestInitiatorView.ts +24 -2
  205. package/front_end/panels/network/RequestPayloadView.ts +1 -1
  206. package/front_end/panels/network/RequestPreviewView.ts +1 -1
  207. package/front_end/panels/network/RequestResponseView.ts +1 -1
  208. package/front_end/panels/network/ResourceChunkView.ts +1 -1
  209. package/front_end/panels/network/ResourceDirectSocketChunkView.ts +1 -1
  210. package/front_end/panels/network/ResourceWebSocketFrameView.ts +1 -1
  211. package/front_end/panels/network/components/ResponseHeaderSection.ts +1 -1
  212. package/front_end/panels/network/forward/UIRequestLocation.ts +1 -1
  213. package/front_end/panels/network/network-meta.ts +3 -3
  214. package/front_end/panels/network/networkLogView.css +5 -0
  215. package/front_end/panels/network/requestInitiatorViewTree.css +5 -0
  216. package/front_end/panels/profiler/HeapProfileView.ts +200 -81
  217. package/front_end/panels/profiler/HeapSnapshotView.ts +1 -1
  218. package/front_end/panels/profiler/ProfileDataGrid.ts +12 -8
  219. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +1 -1
  220. package/front_end/panels/recorder/README.md +1 -2
  221. package/front_end/panels/recorder/RecorderPanel.ts +1861 -17
  222. package/front_end/panels/recorder/RecordingListView.ts +8 -37
  223. package/front_end/panels/recorder/RecordingView.ts +54 -27
  224. package/front_end/panels/recorder/SelectorPicker.ts +0 -13
  225. package/front_end/panels/recorder/StepEditor.ts +6 -14
  226. package/front_end/panels/recorder/StepView.ts +36 -105
  227. package/front_end/panels/recorder/recorder.ts +0 -2
  228. package/front_end/panels/search/SearchResultsPane.ts +1 -1
  229. package/front_end/panels/security/SecurityPanel.ts +3 -3
  230. package/front_end/panels/settings/AISettingsTab.ts +17 -4
  231. package/front_end/panels/settings/components/SyncSection.ts +4 -4
  232. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +3 -3
  233. package/front_end/panels/snippets/ScriptSnippetFileSystem.ts +1 -1
  234. package/front_end/panels/sources/BreakpointsView.ts +1 -1
  235. package/front_end/panels/sources/CoveragePlugin.ts +1 -1
  236. package/front_end/panels/sources/DebuggerPlugin.ts +4 -4
  237. package/front_end/panels/sources/FilteredUISourceCodeListProvider.ts +27 -3
  238. package/front_end/panels/sources/NavigatorView.ts +1 -1
  239. package/front_end/panels/sources/PersistenceActions.ts +1 -1
  240. package/front_end/panels/sources/SourcesNavigator.ts +1 -1
  241. package/front_end/panels/sources/SourcesSearchScope.ts +1 -1
  242. package/front_end/panels/sources/TabbedEditorContainer.ts +3 -3
  243. package/front_end/panels/sources/UISourceCodeFrame.ts +1 -1
  244. package/front_end/panels/sources/components/HeadersView.ts +1 -1
  245. package/front_end/panels/sources/filteredUISourceCodeListProvider.css +12 -1
  246. package/front_end/panels/sources/sources-meta.ts +1 -1
  247. package/front_end/panels/timeline/StatusDialog.ts +1 -1
  248. package/front_end/panels/timeline/TimelineController.ts +24 -3
  249. package/front_end/panels/timeline/TimelinePanel.ts +116 -25
  250. package/front_end/panels/timeline/TimelineSelectorStatsView.ts +2 -2
  251. package/front_end/panels/timeline/TimelineUIUtils.ts +1 -1
  252. package/front_end/panels/timeline/components/CWVMetrics.ts +1 -1
  253. package/front_end/panels/timeline/components/IgnoreListSetting.ts +1 -1
  254. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +2 -2
  255. package/front_end/panels/timeline/timeline-meta.ts +13 -0
  256. package/front_end/services/tracing/TracingManager.ts +27 -2
  257. package/front_end/third_party/chromium/README.chromium +1 -1
  258. package/front_end/third_party/lighthouse/README.chromium +2 -2
  259. package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +1418 -1413
  260. package/front_end/third_party/lighthouse/locales/en-US.json +12 -6
  261. package/front_end/third_party/lighthouse/locales/en-XL.json +12 -6
  262. package/front_end/third_party/lighthouse/report-assets/report-generator.mjs +1 -1
  263. package/front_end/third_party/puppeteer/puppeteer.ts +20 -1
  264. package/front_end/ui/components/highlighting/HighlightElement.ts +4 -1
  265. package/front_end/ui/components/highlighting/HighlightManager.ts +1 -1
  266. package/front_end/ui/components/highlighting/MarkupHighlight.ts +1 -1
  267. package/front_end/ui/components/markdown_view/MarkdownView.ts +46 -2
  268. package/front_end/ui/components/markdown_view/markdownView.css +23 -0
  269. package/front_end/ui/components/spinners/Spinner.ts +29 -32
  270. package/front_end/ui/components/spinners/spinner.css +32 -84
  271. package/front_end/ui/components/text_editor/config.ts +1 -1
  272. package/front_end/ui/components/tree_outline/TreeOutline.ts +7 -1
  273. package/front_end/ui/legacy/Infobar.ts +1 -1
  274. package/front_end/ui/legacy/InspectorView.ts +12 -7
  275. package/front_end/ui/legacy/SuggestBox.ts +1 -1
  276. package/front_end/ui/legacy/TextPrompt.ts +1 -1
  277. package/front_end/ui/legacy/Toolbar.ts +5 -2
  278. package/front_end/ui/legacy/Treeoutline.ts +40 -13
  279. package/front_end/ui/legacy/UIUtils.ts +25 -10
  280. package/front_end/ui/legacy/Widget.ts +17 -10
  281. package/front_end/ui/legacy/components/color_picker/Spectrum.ts +1 -1
  282. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +37 -8
  283. package/front_end/ui/legacy/components/data_grid/ViewportDataGrid.ts +1 -1
  284. package/front_end/ui/legacy/components/data_grid/dataGrid.css +1 -1
  285. package/front_end/ui/legacy/components/inline_editor/AnimationTimingUI.ts +27 -13
  286. package/front_end/ui/legacy/components/inline_editor/BezierEditor.ts +5 -2
  287. package/front_end/ui/legacy/components/inline_editor/CSSLinearEasingModel.ts +23 -0
  288. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +223 -121
  289. package/front_end/ui/legacy/components/object_ui/RemoteObjectPreviewFormatter.ts +1 -1
  290. package/front_end/ui/legacy/components/object_ui/objectValue.css +2 -1
  291. package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +1 -1
  292. package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.ts +1 -1
  293. package/front_end/ui/legacy/components/source_frame/FontView.ts +1 -1
  294. package/front_end/ui/legacy/components/source_frame/ImageView.ts +1 -1
  295. package/front_end/ui/legacy/components/source_frame/JSONView.ts +105 -115
  296. package/front_end/ui/legacy/components/source_frame/PreviewFactory.ts +1 -1
  297. package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +1 -1
  298. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +3 -3
  299. package/front_end/ui/legacy/components/source_frame/StreamingContentHexView.ts +1 -1
  300. package/front_end/ui/legacy/components/source_frame/XMLView.ts +5 -1
  301. package/front_end/ui/legacy/components/source_frame/jsonView.css +4 -0
  302. package/front_end/ui/legacy/components/utils/Linkifier.ts +1 -1
  303. package/front_end/ui/legacy/inspectorCommon.css +10 -6
  304. package/front_end/ui/lit/lit.ts +1 -0
  305. package/front_end/ui/lit/render.ts +44 -10
  306. package/front_end/ui/lit/strip-whitespace.ts +23 -2
  307. package/front_end/ui/settings/SettingUIRegistration.ts +105 -0
  308. package/front_end/ui/settings/settings.ts +9 -0
  309. package/front_end/ui/visual_logging/KnownContextValues.ts +13 -0
  310. package/mcp/mcp.ts +1 -0
  311. package/package.json +1 -1
  312. package/front_end/panels/recorder/RecorderController.ts +0 -1759
  313. /package/.agents/skills/{verification → devtools-verification}/SKILL.md +0 -0
  314. /package/front_end/{models → core}/text_utils/CodeMirrorUtils.ts +0 -0
  315. /package/front_end/{models → core}/text_utils/ContentData.ts +0 -0
  316. /package/front_end/{models → core}/text_utils/Text.ts +0 -0
  317. /package/front_end/{models → core}/text_utils/TextCursor.ts +0 -0
  318. /package/front_end/{models → core}/text_utils/TextUtils.snapshot.txt +0 -0
  319. /package/front_end/panels/recorder/{recorderController.css → recorderPanel.css} +0 -0
@@ -159,13 +159,13 @@ const UIStrings = {
159
159
  */
160
160
  noEvents: 'No events have been logged yet.',
161
161
  /**
162
- *@description Text to preserve the log of events after refreshing.
162
+ *@description Text to keep the log of events after refreshing.
163
163
  */
164
- preserveLog: 'Preserve log',
164
+ preserveLog: 'Keep log',
165
165
  /**
166
- *@description Tooltip text that appears on the preserve log setting when hovering over it.
166
+ *@description Tooltip text that appears on the keep log setting when hovering over it.
167
167
  */
168
- doNotClearLogOnPageReload: 'Do not clear log on page reload/navigation.',
168
+ doNotClearLogOnPageReload: 'Don’t clear log on page reload/navigation',
169
169
  /**
170
170
  *@description Label for the ID of a session.
171
171
  */
@@ -31,8 +31,8 @@
31
31
  import * as Common from '../../core/common/common.js';
32
32
  import * as i18n from '../../core/i18n/i18n.js';
33
33
  import type * as Platform from '../../core/platform/platform.js';
34
+ import * as TextUtils from '../../core/text_utils/text_utils.js';
34
35
  import * as Protocol from '../../generated/protocol.js';
35
- import * as TextUtils from '../../models/text_utils/text_utils.js';
36
36
  import * as JSON5 from '../../third_party/json5/json5.js';
37
37
  import * as SourceFrame from '../../ui/legacy/components/source_frame/source_frame.js';
38
38
  import * as UI from '../../ui/legacy/legacy.js';
@@ -139,7 +139,7 @@ const UIStrings = {
139
139
  /**
140
140
  * @description Explanatory text in the Frame Details view
141
141
  */
142
- theFramesSchemeIsInsecure: 'The frame\'s scheme is insecure',
142
+ theFramesSchemeIsInsecure: 'The frames scheme is insecure',
143
143
  /**
144
144
  * @description This label specifies the server endpoints to which the server is reporting errors
145
145
  *and warnings through the Report-to API. Following this label will be the URL of the server.
@@ -423,16 +423,6 @@ export class IndexedDBModel extends SDK.SDKModel.SDKModel<EventTypes> implements
423
423
  cacheStorageContentUpdated(_event: Protocol.Storage.CacheStorageContentUpdatedEvent): void {
424
424
  }
425
425
 
426
- interestGroupAccessed(_event: Protocol.Storage.InterestGroupAccessedEvent): void {
427
- }
428
-
429
- interestGroupAuctionEventOccurred(_event: Protocol.Storage.InterestGroupAuctionEventOccurredEvent): void {
430
- }
431
-
432
- interestGroupAuctionNetworkRequestCreated(_event: Protocol.Storage.InterestGroupAuctionNetworkRequestCreatedEvent):
433
- void {
434
- }
435
-
436
426
  sharedStorageAccessed(_event: Protocol.Storage.SharedStorageAccessedEvent): void {
437
427
  }
438
428
 
@@ -1,7 +1,6 @@
1
1
  // Copyright 2012 The Chromium Authors
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
- /* eslint-disable @devtools/no-imperative-dom-api */
5
4
 
6
5
  import '../../ui/components/report_view/report_view.js';
7
6
  import '../../ui/legacy/legacy.js';
@@ -234,6 +233,178 @@ declare global {
234
233
  'devtools-idb-database-view': IDBDatabaseView;
235
234
  }
236
235
  }
236
+ export interface IndexedDBDataViewInput {
237
+ isIndex: boolean;
238
+ index: Index|null;
239
+ objectStore: ObjectStore;
240
+ entries: Entry[];
241
+ skipCount: number;
242
+ selectedRowNumber: number;
243
+ clearButtonEnabled: boolean;
244
+ hasMore: boolean;
245
+ keyFilter: string;
246
+ needsRefreshVisible: boolean;
247
+ metadata: ObjectStoreMetadata|null;
248
+
249
+ refreshButtonClicked: () => void;
250
+ clearButtonClicked: () => Promise<void>;
251
+ deleteButtonClicked: () => Promise<void>;
252
+ pageBackButtonClicked: () => void;
253
+ pageForwardButtonClicked: () => void;
254
+ onKeyFilterChange: (value: string) => void;
255
+ onRowSelected: (rowNumber: number) => void;
256
+ deleteEntry: (entry: Entry) => Promise<void>;
257
+ populateContextMenu: (e: CustomEvent<UI.ContextMenu.ContextMenu>, entry: Entry) => void;
258
+ }
259
+
260
+ const renderKeyPathString = (keyPathString: string): LitTemplate => {
261
+ return html`"<span class="source-code indexed-db-key-path">${keyPathString}</span>"`;
262
+ };
263
+
264
+ const renderKeyColumnHeader = (prefix: string, keyPath: string|string[]|null|undefined): LitTemplate => {
265
+ if (keyPath === undefined || keyPath === null || keyPath === '') {
266
+ return html`${prefix}`;
267
+ }
268
+ return html`
269
+ ${prefix} (${i18nString(UIStrings.keyPath)}${
270
+ Array.isArray(keyPath) ?
271
+ html`[${keyPath.map((path, i) => html`${i > 0 ? ', ' : ''}${renderKeyPathString(path)}`)}]` :
272
+ renderKeyPathString(keyPath)})`;
273
+ };
274
+
275
+ const renderDataGrid = (input: IndexedDBDataViewInput): LitTemplate => {
276
+ const keyPath = input.isIndex && input.index ? input.index.keyPath : input.objectStore.keyPath;
277
+ // clang-format off
278
+ return html`<devtools-data-grid striped style="flex: auto;" name=${i18nString(UIStrings.indexedDb)} .template=${html`
279
+ <style>${indexedDBViewsStyles}</style>
280
+ <table>
281
+ <tr>
282
+ <th id="number" fixed width="50px">#</th>
283
+ <th id="key">${renderKeyColumnHeader(i18nString(UIStrings.keyString), keyPath)}</th>
284
+ ${input.isIndex ? html`<th id="primary-key">${renderKeyColumnHeader(i18nString(UIStrings.primaryKey), input.objectStore.keyPath)}</th>` : nothing}
285
+ <th id="value">${i18nString(UIStrings.valueString)}</th>
286
+ </tr>
287
+ ${repeat(input.entries, (_entry, index) => index, (entry, index) => html`
288
+ <tr ?selected=${index + input.skipCount === input.selectedRowNumber}
289
+ @select=${() => input.onRowSelected(index + input.skipCount)}
290
+ @delete=${() => input.deleteEntry(entry)}
291
+ @contextmenu=${(e: CustomEvent<UI.ContextMenu.ContextMenu>) => input.populateContextMenu(e, entry)}>
292
+ <td>${index + input.skipCount}</td>
293
+ <td>${widget(ObjectPropertiesSectionWidget, {value: entry.key})}</td>
294
+ ${input.isIndex ? html`<td>${widget(ObjectPropertiesSectionWidget, {value: entry.primaryKey})}</td>` : nothing}
295
+ <td class="value-column">${widget(ObjectPropertiesSectionWidget, {value: entry.value})}</td>
296
+ </tr>`
297
+ )}
298
+ </table>`}>
299
+ </devtools-data-grid>`;
300
+ // clang-format on
301
+ };
302
+
303
+ const renderToolbar = (input: IndexedDBDataViewInput): LitTemplate => {
304
+ // clang-format off
305
+ return html`
306
+ <devtools-toolbar class="data-view-toolbar" jslog=${VisualLogging.toolbar()}>
307
+ <devtools-button
308
+ class="toolbar-button"
309
+ .iconName=${'refresh'}
310
+ .title=${i18nString(UIStrings.refresh)}
311
+ jslog=${VisualLogging.action('refresh').track({click: true})}
312
+ @click=${input.refreshButtonClicked}
313
+ .variant=${Buttons.Button.Variant.TOOLBAR}
314
+ ></devtools-button>
315
+ <devtools-button
316
+ class="toolbar-button"
317
+ .iconName=${'clear'}
318
+ .title=${i18nString(UIStrings.clearObjectStore)}
319
+ jslog=${VisualLogging.action('clear-all').track({click: true})}
320
+ @click=${input.clearButtonClicked}
321
+ .disabled=${input.isIndex || !input.clearButtonEnabled}
322
+ .variant=${Buttons.Button.Variant.TOOLBAR}>
323
+ </devtools-button>
324
+ <devtools-button
325
+ class="toolbar-button"
326
+ .iconName=${'bin'}
327
+ .title=${i18nString(UIStrings.deleteSelected)}
328
+ jslog=${VisualLogging.action('delete-selected').track({click: true})}
329
+ @click=${input.deleteButtonClicked}
330
+ .disabled=${input.selectedRowNumber < 0 || input.entries.length === 0}
331
+ .variant=${Buttons.Button.Variant.TOOLBAR}>
332
+ </devtools-button>
333
+
334
+ <div class="toolbar-divider"></div>
335
+
336
+ <devtools-button
337
+ class="toolbar-button"
338
+ .iconName=${'triangle-left'}
339
+ .title=${i18nString(UIStrings.showPreviousPage)}
340
+ .disabled=${input.skipCount <= 0}
341
+ @click=${input.pageBackButtonClicked}
342
+ .variant=${Buttons.Button.Variant.TOOLBAR}>
343
+ </devtools-button>
344
+ <devtools-button
345
+ class="toolbar-button"
346
+ .iconName=${'triangle-right'}
347
+ .title=${i18nString(UIStrings.showNextPage)}
348
+ .disabled=${!input.hasMore}
349
+ @click=${input.pageForwardButtonClicked}
350
+ .variant=${Buttons.Button.Variant.TOOLBAR}>
351
+ </devtools-button>
352
+
353
+ <devtools-toolbar-input
354
+ type="filter"
355
+ placeholder=${i18nString(UIStrings.filterByKey)}
356
+ class="key-filter-input"
357
+ .value=${input.keyFilter}
358
+ @change=${(e: CustomEvent<string>) => {
359
+ input.onKeyFilterChange(e.detail);
360
+ }}>
361
+ </devtools-toolbar-input>
362
+
363
+ ${input.needsRefreshVisible ? html`
364
+ <div class="toolbar-divider"></div>
365
+ <div class="toolbar-item stale-data-warning" title=${
366
+ i18nString(
367
+ UIStrings
368
+ .someEntriesMayHaveBeenModified)}>
369
+ <devtools-icon name="warning" class="warning-icon"></devtools-icon>
370
+ <span>${i18nString(UIStrings.dataMayBeStale)}</span>
371
+ </div>
372
+ ` : nothing}
373
+ </devtools-toolbar>`;
374
+ // clang-format on
375
+ };
376
+
377
+ const renderSummaryBar = (input: IndexedDBDataViewInput): LitTemplate => {
378
+ const metadata = input.metadata;
379
+ if (!metadata) {
380
+ return nothing;
381
+ }
382
+ // clang-format off
383
+ return html`
384
+ <div class="object-store-summary-bar">
385
+ <span>${i18nString(UIStrings.totalEntriesS, { PH1: String(metadata.entriesCount)})}</span>
386
+ ${input.objectStore.autoIncrement ? html`
387
+ <span class="separator">\u2758</span>
388
+ <span>${i18nString(UIStrings.keyGeneratorValueS, {PH1: String(metadata.keyGeneratorValue)})}</span>`
389
+ : nothing}
390
+ </div>`;
391
+ // clang-format on
392
+ };
393
+
394
+ export type IDBDataViewView = (input: IndexedDBDataViewInput, output: undefined, target: HTMLElement) => void;
395
+
396
+ // clang-format off
397
+ export const IDB_DATA_VIEW_DEFAULT_VIEW: IDBDataViewView = (input, _output, target) => {
398
+ render(html`
399
+ ${renderToolbar(input)}
400
+ <div class="data-grid-container">
401
+ ${renderDataGrid(input)}
402
+ </div>
403
+ ${renderSummaryBar(input)}
404
+ `, target, {container: {classes: ['indexed-db-data-view', 'storage-view']}});
405
+ };
406
+ // clang-format on
407
+
237
408
  export class IDBDataView extends UI.View.SimpleView {
238
409
  private readonly model: IndexedDBModel;
239
410
  private readonly databaseId: DatabaseId;
@@ -259,14 +430,16 @@ export class IDBDataView extends UI.View.SimpleView {
259
430
  // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
260
431
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
261
432
  private lastKey?: any;
433
+ readonly #view: IDBDataViewView;
262
434
 
263
435
  constructor(model: IndexedDBModel, databaseId: DatabaseId, objectStore: ObjectStore, index: Index|null,
264
- refreshObjectStoreCallback: () => void) {
436
+ refreshObjectStoreCallback: () => void, view = IDB_DATA_VIEW_DEFAULT_VIEW) {
265
437
  super({
266
438
  title: i18nString(UIStrings.idb),
267
439
  viewId: 'idb',
268
440
  jslog: `${VisualLogging.pane('indexed-db-data-view')}`,
269
441
  });
442
+ this.#view = view;
270
443
  this.registerRequiredCSS(indexedDBViewsStyles);
271
444
  this.registerRequiredCSS(DataGrid.dataGridStyles);
272
445
 
@@ -275,8 +448,6 @@ export class IDBDataView extends UI.View.SimpleView {
275
448
  this.isIndex = Boolean(index);
276
449
  this.refreshObjectStoreCallback = refreshObjectStoreCallback;
277
450
 
278
- this.element.classList.add('indexed-db-data-view', 'storage-view');
279
-
280
451
  this.clearingObjectStore = false;
281
452
 
282
453
  this.pageSize = 50;
@@ -286,124 +457,6 @@ export class IDBDataView extends UI.View.SimpleView {
286
457
  this.update(objectStore, index);
287
458
  }
288
459
 
289
- private renderDataGrid(): LitTemplate {
290
- const keyPath = this.isIndex && this.index ? this.index.keyPath : this.objectStore.keyPath;
291
- // clang-format off
292
- return html`<devtools-data-grid striped style="flex: auto;" name=${i18nString(UIStrings.indexedDb)} .template=${html`
293
- <style>${indexedDBViewsStyles}</style>
294
- <table>
295
- <tr>
296
- <th id="number" fixed width="50px">#</th>
297
- <th id="key">${this.renderKeyColumnHeader(i18nString(UIStrings.keyString), keyPath)}</th>
298
- ${this.isIndex ? html`<th id="primary-key">${this.renderKeyColumnHeader(i18nString(UIStrings.primaryKey), this.objectStore.keyPath)}</th>` : nothing}
299
- <th id="value">${i18nString(UIStrings.valueString)}</th>
300
- </tr>
301
- ${repeat(this.entries, (_entry, index) => index, (entry, index) => html`
302
- <tr ?selected=${index + this.skipCount === this.#selectedRowNumber}
303
- @select=${() => this.onRowSelected(index + this.skipCount)}
304
- @delete=${() => this.deleteEntry(entry)}
305
- @contextmenu=${(e: CustomEvent<UI.ContextMenu.ContextMenu>) => this.populateContextMenu(e, entry)}>
306
- <td>${index + this.skipCount}</td>
307
- <td>${widget(ObjectPropertiesSectionWidget, {value: entry.key})}</td>
308
- ${this.isIndex ? html`<td>${widget(ObjectPropertiesSectionWidget, {value: entry.primaryKey})}</td>` : nothing}
309
- <td class="value-column">${widget(ObjectPropertiesSectionWidget, {value: entry.value})}</td>
310
- </tr>`
311
- )}
312
- </table>`}>
313
- </devtools-data-grid>`;
314
- // clang-format on
315
- }
316
-
317
- private renderKeyColumnHeader(prefix: string, keyPath: string|string[]|null|undefined): LitTemplate {
318
- if (keyPath === undefined || keyPath === null || keyPath === '') {
319
- return html`${prefix}`;
320
- }
321
- return html`
322
- ${prefix} (${i18nString(UIStrings.keyPath)}${
323
- Array.isArray(keyPath) ?
324
- html`[${keyPath.map((path, i) => html`${i > 0 ? ', ' : ''}${this.renderKeyPathString(path)}`)}]` :
325
- this.renderKeyPathString(keyPath)})`;
326
- }
327
-
328
- private renderKeyPathString(keyPathString: string): LitTemplate {
329
- return html`"<span class="source-code indexed-db-key-path">${keyPathString}</span>"`;
330
- }
331
-
332
- private renderToolbar(): LitTemplate {
333
- // clang-format off
334
- return html`
335
- <devtools-toolbar class="data-view-toolbar" jslog=${VisualLogging.toolbar()}>
336
- <devtools-button
337
- class="toolbar-button"
338
- .iconName=${'refresh'}
339
- .title=${i18nString(UIStrings.refresh)}
340
- jslog=${VisualLogging.action('refresh').track({click: true})}
341
- @click=${() => this.refreshButtonClicked()}
342
- .variant=${Buttons.Button.Variant.TOOLBAR}
343
- ></devtools-button>
344
- <devtools-button
345
- class="toolbar-button"
346
- .iconName=${'clear'}
347
- .title=${i18nString(UIStrings.clearObjectStore)}
348
- jslog=${VisualLogging.action('clear-all').track({click: true})}
349
- @click=${() => this.clearButtonClicked()}
350
- .disabled=${this.isIndex || !this.#clearButtonEnabled}
351
- .variant=${Buttons.Button.Variant.TOOLBAR}>
352
- </devtools-button>
353
- <devtools-button
354
- class="toolbar-button"
355
- .iconName=${'bin'}
356
- .title=${i18nString(UIStrings.deleteSelected)}
357
- jslog=${VisualLogging.action('delete-selected').track({click: true})}
358
- @click=${() => this.deleteButtonClicked()}
359
- .disabled=${this.#selectedRowNumber < 0 || this.entries.length === 0}
360
- .variant=${Buttons.Button.Variant.TOOLBAR}>
361
- </devtools-button>
362
-
363
- <div class="toolbar-divider"></div>
364
-
365
- <devtools-button
366
- class="toolbar-button"
367
- .iconName=${'triangle-left'}
368
- .title=${i18nString(UIStrings.showPreviousPage)}
369
- .disabled=${this.skipCount <= 0}
370
- @click=${() => this.pageBackButtonClicked()}
371
- .variant=${Buttons.Button.Variant.TOOLBAR}>
372
- </devtools-button>
373
- <devtools-button
374
- class="toolbar-button"
375
- .iconName=${'triangle-right'}
376
- .title=${i18nString(UIStrings.showNextPage)}
377
- .disabled=${!this.#hasMore}
378
- @click=${() => this.pageForwardButtonClicked()}
379
- .variant=${Buttons.Button.Variant.TOOLBAR}>
380
- </devtools-button>
381
-
382
- <devtools-toolbar-input
383
- type="filter"
384
- placeholder=${i18nString(UIStrings.filterByKey)}
385
- class="key-filter-input"
386
- .value=${this.#keyFilter}
387
- @change=${(e: CustomEvent<string>) => {
388
- this.#keyFilter = e.detail;
389
- this.updateData(false);
390
- }}>
391
- </devtools-toolbar-input>
392
-
393
- ${this.#needsRefreshVisible ? html`
394
- <div class="toolbar-divider"></div>
395
- <div class="toolbar-item stale-data-warning" title=${
396
- i18nString(
397
- UIStrings
398
- .someEntriesMayHaveBeenModified)}>
399
- <devtools-icon name="warning" class="warning-icon"></devtools-icon>
400
- <span>${i18nString(UIStrings.dataMayBeStale)}</span>
401
- </div>
402
- ` : nothing}
403
- </devtools-toolbar>`;
404
- // clang-format on
405
- }
406
-
407
460
  private pageBackButtonClicked(): void {
408
461
  this.skipCount = Math.max(0, this.skipCount - this.pageSize);
409
462
  this.updateData(false);
@@ -519,23 +572,6 @@ export class IDBDataView extends UI.View.SimpleView {
519
572
  });
520
573
  }
521
574
 
522
- private renderSummaryBar(): LitTemplate {
523
- const metadata = this.#metadata;
524
- if (!metadata) {
525
- return nothing;
526
- }
527
- // clang-format off
528
- return html`
529
- <div class="object-store-summary-bar">
530
- <span>${i18nString(UIStrings.totalEntriesS, { PH1: String(metadata.entriesCount)})}</span>
531
- ${this.objectStore.autoIncrement ? html`
532
- <span class="separator">\u2758</span>
533
- <span>${i18nString(UIStrings.keyGeneratorValueS, {PH1: String(metadata.keyGeneratorValue)})}</span>`
534
- : nothing}
535
- </div>`;
536
- // clang-format on
537
- }
538
-
539
575
  private updatedDataForTests(): void {
540
576
  // Sniffed in tests.
541
577
  }
@@ -548,6 +584,8 @@ export class IDBDataView extends UI.View.SimpleView {
548
584
  const ok =
549
585
  await UI.UIUtils.ConfirmDialog.show(i18nString(UIStrings.objectStoreWillBeCleared),
550
586
  i18nString(UIStrings.confirmClearObjectStore, {PH1: this.objectStore.name}),
587
+ // TODO(b/407750537): Fix the linter false positive
588
+ // eslint-disable-next-line @devtools/no-imperative-dom-api
551
589
  this.element, {jslogContext: 'clear-object-store-confirmation'});
552
590
  if (ok) {
553
591
  this.#clearButtonEnabled = false;
@@ -622,22 +660,72 @@ export class IDBDataView extends UI.View.SimpleView {
622
660
  }
623
661
 
624
662
  override performUpdate(): void {
625
- // clang-format off
626
- // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
627
- render(html`
628
- ${this.renderToolbar()}
629
- <div class="data-grid-container">
630
- ${this.renderDataGrid()}
631
- </div>
632
- ${this.renderSummaryBar()}
633
- `, this.element);
634
- // clang-format on
663
+ this.#view({
664
+ isIndex: this.isIndex,
665
+ index: this.index,
666
+ objectStore: this.objectStore,
667
+ entries: this.entries,
668
+ skipCount: this.skipCount,
669
+ selectedRowNumber: this.#selectedRowNumber,
670
+ clearButtonEnabled: this.#clearButtonEnabled,
671
+ hasMore: this.#hasMore,
672
+ keyFilter: this.#keyFilter,
673
+ needsRefreshVisible: this.#needsRefreshVisible,
674
+ metadata: this.#metadata,
675
+ refreshButtonClicked: this.refreshButtonClicked.bind(this),
676
+ clearButtonClicked: this.clearButtonClicked.bind(this),
677
+ deleteButtonClicked: this.deleteButtonClicked.bind(this),
678
+ pageBackButtonClicked: this.pageBackButtonClicked.bind(this),
679
+ pageForwardButtonClicked: this.pageForwardButtonClicked.bind(this),
680
+ onKeyFilterChange: (value: string) => {
681
+ this.#keyFilter = value;
682
+ this.updateData(false);
683
+ },
684
+ onRowSelected: this.onRowSelected.bind(this),
685
+ deleteEntry: this.deleteEntry.bind(this),
686
+ populateContextMenu: this.populateContextMenu.bind(this),
687
+ },
688
+ undefined, this.element);
635
689
  }
636
690
  }
637
691
 
692
+ interface ObjectPropertiesSectionWidgetInput {
693
+ value: SDK.RemoteObject.RemoteObject|null;
694
+ }
695
+
696
+ interface ObjectPropertiesSectionWidgetOutput {
697
+ objectPropSection: ObjectUI.ObjectPropertiesSection.ObjectPropertiesSection|null;
698
+ }
699
+
700
+ type ObjectPropertiesSectionWidgetView = (
701
+ input: ObjectPropertiesSectionWidgetInput,
702
+ output: ObjectPropertiesSectionWidgetOutput,
703
+ target: HTMLElement,
704
+ ) => void;
705
+
706
+ const OBJECT_PROPERTIES_SECTION_WIDGET_DEFAULT_VIEW: ObjectPropertiesSectionWidgetView = (input, output, target) => {
707
+ if (!input.value) {
708
+ output.objectPropSection = null;
709
+ render(nothing, target);
710
+ return;
711
+ }
712
+ const objectPropSection = ObjectUI.ObjectPropertiesSection.ObjectPropertiesSection.defaultObjectPropertiesSection(
713
+ input.value, undefined /* linkifier */, true /* skipProto */, true /* readOnly */);
714
+ output.objectPropSection = objectPropSection;
715
+
716
+ const element = input.value.hasChildren ? objectPropSection.element : objectPropSection.titleElement;
717
+ render(html`${element}`, target);
718
+ };
719
+
638
720
  class ObjectPropertiesSectionWidget extends UI.Widget.Widget {
639
721
  #value: SDK.RemoteObject.RemoteObject|null = null;
640
722
  #objectPropSection: ObjectUI.ObjectPropertiesSection.ObjectPropertiesSection|null = null;
723
+ readonly #view: ObjectPropertiesSectionWidgetView;
724
+
725
+ constructor(element?: HTMLElement, view = OBJECT_PROPERTIES_SECTION_WIDGET_DEFAULT_VIEW) {
726
+ super(element);
727
+ this.#view = view;
728
+ }
641
729
 
642
730
  set value(value: SDK.RemoteObject.RemoteObject|null) {
643
731
  if (this.#value === value) {
@@ -652,20 +740,8 @@ class ObjectPropertiesSectionWidget extends UI.Widget.Widget {
652
740
  }
653
741
 
654
742
  override performUpdate(): void {
655
- const value = this.#value;
656
- if (!value) {
657
- this.contentElement.removeChildren();
658
- this.#objectPropSection = null;
659
- return;
660
- }
661
- this.contentElement.removeChildren();
662
- this.#objectPropSection = ObjectUI.ObjectPropertiesSection.ObjectPropertiesSection.defaultObjectPropertiesSection(
663
- value, undefined /* linkifier */, true /* skipProto */, true /* readOnly */);
664
-
665
- if (value.hasChildren) {
666
- this.contentElement.appendChild(this.#objectPropSection.element);
667
- } else {
668
- this.contentElement.appendChild(this.#objectPropSection.titleElement);
669
- }
743
+ const output: ObjectPropertiesSectionWidgetOutput = {objectPropSection: null};
744
+ this.#view({value: this.#value}, output, this.contentElement);
745
+ this.#objectPropSection = output.objectPropSection;
670
746
  }
671
747
  }
@@ -41,6 +41,8 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
41
41
  export class ServiceWorkerCacheTreeElement extends ExpandableApplicationPanelTreeElement {
42
42
  private swCacheModels: Set<SDK.ServiceWorkerCacheModel.ServiceWorkerCacheModel>;
43
43
  private swCacheTreeElements: Set<SWCacheTreeElement>;
44
+ private swCacheModelObserver?:
45
+ SDK.TargetManager.SDKModelObserver<SDK.ServiceWorkerCacheModel.ServiceWorkerCacheModel>;
44
46
  private storageBucket?: Protocol.Storage.StorageBucket;
45
47
 
46
48
  constructor(resourcesPanel: ResourcesPanel, storageBucket?: Protocol.Storage.StorageBucket) {
@@ -53,17 +55,25 @@ export class ServiceWorkerCacheTreeElement extends ExpandableApplicationPanelTre
53
55
  this.swCacheModels = new Set();
54
56
  this.swCacheTreeElements = new Set();
55
57
  this.storageBucket = storageBucket;
58
+ this.initialize();
56
59
  }
57
60
 
58
61
  initialize(): void {
62
+ this.removeChildren();
59
63
  this.swCacheModels.clear();
60
64
  this.swCacheTreeElements.clear();
61
- SDK.TargetManager.TargetManager.instance().observeModels(SDK.ServiceWorkerCacheModel.ServiceWorkerCacheModel, {
65
+ if (this.swCacheModelObserver) {
66
+ SDK.TargetManager.TargetManager.instance().unobserveModels(SDK.ServiceWorkerCacheModel.ServiceWorkerCacheModel,
67
+ this.swCacheModelObserver);
68
+ }
69
+ this.swCacheModelObserver = {
62
70
  modelAdded: (model: SDK.ServiceWorkerCacheModel.ServiceWorkerCacheModel) =>
63
71
  this.serviceWorkerCacheModelAdded(model),
64
72
  modelRemoved: (model: SDK.ServiceWorkerCacheModel.ServiceWorkerCacheModel) =>
65
73
  this.serviceWorkerCacheModelRemoved(model),
66
- });
74
+ };
75
+ SDK.TargetManager.TargetManager.instance().observeModels(SDK.ServiceWorkerCacheModel.ServiceWorkerCacheModel,
76
+ this.swCacheModelObserver, {scoped: true});
67
77
  }
68
78
 
69
79
  override onattach(): void {
@@ -9,8 +9,8 @@ import * as Common from '../../core/common/common.js';
9
9
  import * as i18n from '../../core/i18n/i18n.js';
10
10
  import * as Platform from '../../core/platform/platform.js';
11
11
  import * as SDK from '../../core/sdk/sdk.js';
12
+ import * as TextUtils from '../../core/text_utils/text_utils.js';
12
13
  import type * as Protocol from '../../generated/protocol.js';
13
- import * as TextUtils from '../../models/text_utils/text_utils.js';
14
14
  import * as DataGrid from '../../ui/legacy/components/data_grid/data_grid.js';
15
15
  import * as UI from '../../ui/legacy/legacy.js';
16
16
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
@@ -227,16 +227,6 @@ export class SharedStorageModel extends SDK.SDKModel.SDKModel<EventTypes> implem
227
227
  cacheStorageContentUpdated(_event: Protocol.Storage.CacheStorageContentUpdatedEvent): void {
228
228
  }
229
229
 
230
- interestGroupAccessed(_event: Protocol.Storage.InterestGroupAccessedEvent): void {
231
- }
232
-
233
- interestGroupAuctionEventOccurred(_event: Protocol.Storage.InterestGroupAuctionEventOccurredEvent): void {
234
- }
235
-
236
- interestGroupAuctionNetworkRequestCreated(_event: Protocol.Storage.InterestGroupAuctionNetworkRequestCreatedEvent):
237
- void {
238
- }
239
-
240
230
  storageBucketCreatedOrUpdated(_event: Protocol.Storage.StorageBucketCreatedOrUpdatedEvent): void {
241
231
  }
242
232
 
@@ -26,6 +26,7 @@ import * as PreloadingTreeElement from './PreloadingTreeElement.js';
26
26
  import * as ReportingApiTreeElement from './ReportingApiTreeElement.js';
27
27
  import * as ReportingApiView from './ReportingApiView.js';
28
28
  import * as ResourcesPanel from './ResourcesPanel.js';
29
+ import * as ServiceWorkerCacheTreeElement from './ServiceWorkerCacheTreeElement.js';
29
30
  import * as ServiceWorkerCacheViews from './ServiceWorkerCacheViews.js';
30
31
  import * as ServiceWorkersView from './ServiceWorkersView.js';
31
32
  import * as ServiceWorkerUpdateCycleView from './ServiceWorkerUpdateCycleView.js';
@@ -67,6 +68,7 @@ export {
67
68
  ReportingApiTreeElement,
68
69
  ReportingApiView,
69
70
  ResourcesPanel,
71
+ ServiceWorkerCacheTreeElement,
70
72
  ServiceWorkerCacheViews,
71
73
  ServiceWorkersView,
72
74
  ServiceWorkerUpdateCycleView,
@@ -4,6 +4,7 @@
4
4
 
5
5
  import '../../../ui/legacy/components/data_grid/data_grid.js';
6
6
 
7
+ import * as Common from '../../../core/common/common.js';
7
8
  import * as i18n from '../../../core/i18n/i18n.js';
8
9
  import * as SDK from '../../../core/sdk/sdk.js';
9
10
  import type * as Protocol from '../../../generated/protocol.js';
@@ -14,6 +15,7 @@ import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
14
15
  import adsViewStyles from './adsView.css.js';
15
16
 
16
17
  const {html} = Lit;
18
+ const {bindToSetting} = UI.UIUtils;
17
19
 
18
20
  const UIStrings = {
19
21
  /**
@@ -74,6 +76,19 @@ const UIStrings = {
74
76
  * @description Accessible name for the ad iframes table.
75
77
  */
76
78
  adIframes: 'Ad iframes',
79
+ /**
80
+ * @description Title for the settings section.
81
+ */
82
+ settings: 'Settings',
83
+ /**
84
+ * @description The name of a checkbox setting. This setting highlights the
85
+ * rendering elements for ads that are found on the page.
86
+ */
87
+ highlightAds: 'Highlight ads',
88
+ /**
89
+ * @description Explanation text for the 'Highlight ads' setting.
90
+ */
91
+ highlightsElementsRedDetectedToBe: 'Highlights elements (red) detected to be ads.',
77
92
  } as const;
78
93
 
79
94
  const str_ = i18n.i18n.registerUIStrings('panels/application/components/AdsView.ts', UIStrings);
@@ -206,6 +221,14 @@ const DEFAULT_VIEW: View = (input, output, target) => {
206
221
  </table>
207
222
  </devtools-data-grid>
208
223
  </div>
224
+ <div class="settings-title">${i18nString(UIStrings.settings)}</div>
225
+ <devtools-checkbox class="setting-container"
226
+ ${bindToSetting(Common.Settings.Settings.instance().moduleSetting('show-ad-highlights'))}>
227
+ <div class="setting-text-container">
228
+ <div class="setting-label">${i18nString(UIStrings.highlightAds)}</div>
229
+ <div class="setting-explanation">${i18nString(UIStrings.highlightsElementsRedDetectedToBe)}</div>
230
+ </div>
231
+ </devtools-checkbox>
209
232
  </div>
210
233
  `, target);
211
234
  // clang-format on