chrome-devtools-mcp 0.0.1 → 0.0.2

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 (354) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +196 -0
  3. package/build/node_modules/chrome-devtools-frontend/LICENSE +27 -0
  4. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/App.js +4 -0
  5. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/AppProvider.js +17 -0
  6. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Base64.js +43 -0
  7. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/CharacterIdMap.js +27 -0
  8. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Color.js +2029 -0
  9. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorConverter.js +330 -0
  10. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorUtils.js +221 -0
  11. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Console.js +86 -0
  12. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Debouncer.js +14 -0
  13. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/EventTarget.js +14 -0
  14. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Gzip.js +64 -0
  15. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/JavaScriptMetaData.js +4 -0
  16. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Lazy.js +29 -0
  17. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Linkifier.js +34 -0
  18. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/MapWithDefault.js +20 -0
  19. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Mutex.js +49 -0
  20. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Object.js +86 -0
  21. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +459 -0
  22. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Progress.js +137 -0
  23. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/QueryParamHandler.js +4 -0
  24. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResolverBase.js +69 -0
  25. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResourceType.js +506 -0
  26. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ReturnToPanel.js +13 -0
  27. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Revealer.js +159 -0
  28. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Runnable.js +24 -0
  29. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SegmentedRange.js +79 -0
  30. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SettingRegistration.js +164 -0
  31. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Settings.js +1281 -0
  32. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SimpleHistoryManager.js +97 -0
  33. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/StringOutputStream.js +17 -0
  34. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/TextDictionary.js +40 -0
  35. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Throttler.js +71 -0
  36. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Trie.js +127 -0
  37. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Worker.js +44 -0
  38. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/common.js +44 -0
  39. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/AidaClient.js +415 -0
  40. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/GdpClient.js +161 -0
  41. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHost.js +510 -0
  42. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostAPI.js +66 -0
  43. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/Platform.js +59 -0
  44. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +232 -0
  45. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +953 -0
  46. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/host.js +12 -0
  47. package/build/node_modules/chrome-devtools-frontend/front_end/core/i18n/i18n.js +9 -0
  48. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +199 -0
  49. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Brand.js +4 -0
  50. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Constructor.js +4 -0
  51. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DOMUtilities.js +122 -0
  52. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DateUtilities.js +13 -0
  53. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DevToolsPath.js +27 -0
  54. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/KeyboardUtilities.js +21 -0
  55. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/MapUtilities.js +79 -0
  56. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/MimeType.js +143 -0
  57. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/NumberUtilities.js +72 -0
  58. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +536 -0
  59. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Timing.js +9 -0
  60. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/TypedArrayUtilities.js +157 -0
  61. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/TypescriptUtilities.js +24 -0
  62. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/UIString.js +4 -0
  63. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/UserVisibleError.js +22 -0
  64. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/platform.js +26 -0
  65. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +800 -0
  66. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/NodeURL.js +31 -0
  67. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/protocol_client.js +13 -0
  68. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/Runtime.js +1 -0
  69. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/root.js +5 -0
  70. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AccessibilityModel.js +281 -0
  71. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +846 -0
  72. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AutofillModel.js +155 -0
  73. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUProfilerModel.js +99 -0
  74. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUThrottlingManager.js +220 -0
  75. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSContainerQuery.js +98 -0
  76. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSFontFace.js +31 -0
  77. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSLayer.js +22 -0
  78. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +1279 -0
  79. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMedia.js +100 -0
  80. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +1518 -0
  81. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +902 -0
  82. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +315 -0
  83. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParser.js +572 -0
  84. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +1316 -0
  85. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSQuery.js +53 -0
  86. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSRule.js +361 -0
  87. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSScope.js +22 -0
  88. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleDeclaration.js +275 -0
  89. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleSheetHeader.js +166 -0
  90. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSSupports.js +24 -0
  91. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CategorizedBreakpoint.js +29 -0
  92. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ChildTargetManager.js +232 -0
  93. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CompilerSourceMappingContentProvider.js +47 -0
  94. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Connections.js +242 -0
  95. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +629 -0
  96. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModelTypes.js +14 -0
  97. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Cookie.js +241 -0
  98. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CookieModel.js +198 -0
  99. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CookieParser.js +163 -0
  100. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMDebuggerModel.js +597 -0
  101. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +1610 -0
  102. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +1231 -0
  103. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EmulationModel.js +527 -0
  104. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EnhancedTracesParser.js +346 -0
  105. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EventBreakpointsModel.js +125 -0
  106. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/FrameAssociated.js +4 -0
  107. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/FrameManager.js +199 -0
  108. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HeapProfilerModel.js +130 -0
  109. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HttpReasonPhraseStrings.js +73 -0
  110. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IOModel.js +83 -0
  111. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IsolateManager.js +208 -0
  112. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IssuesModel.js +41 -0
  113. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/LayerTreeBase.js +95 -0
  114. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/LogModel.js +34 -0
  115. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +1915 -0
  116. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +1660 -0
  117. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayColorGenerator.js +48 -0
  118. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayModel.js +765 -0
  119. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayPersistentHighlighter.js +384 -0
  120. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageLoad.js +25 -0
  121. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js +300 -0
  122. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PaintProfiler.js +67 -0
  123. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PerformanceMetricsModel.js +62 -0
  124. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PreloadingModel.js +563 -0
  125. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +292 -0
  126. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingObject.js +4 -0
  127. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RemoteObject.js +905 -0
  128. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Resource.js +163 -0
  129. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +922 -0
  130. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RuntimeModel.js +535 -0
  131. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SDKModel.js +45 -0
  132. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScreenCaptureModel.js +174 -0
  133. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Script.js +395 -0
  134. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SecurityOriginManager.js +54 -0
  135. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEvents.js +67 -0
  136. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEventsProtocol.js +110 -0
  137. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerTiming.js +216 -0
  138. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServiceWorkerCacheModel.js +271 -0
  139. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServiceWorkerManager.js +511 -0
  140. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +678 -0
  141. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapCache.js +41 -0
  142. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapFunctionRanges.js +132 -0
  143. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +189 -0
  144. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopeChainEntry.js +156 -0
  145. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +276 -0
  146. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/StorageBucketsModel.js +143 -0
  147. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/StorageKeyManager.js +53 -0
  148. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +262 -0
  149. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +382 -0
  150. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TraceObject.js +49 -0
  151. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/WebAuthnModel.js +66 -0
  152. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk-meta.js +1117 -0
  153. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk.js +89 -0
  154. package/build/node_modules/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1513 -0
  155. package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +339 -0
  156. package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +1558 -0
  157. package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +7473 -0
  158. package/build/node_modules/chrome-devtools-frontend/front_end/generated/protocol.js +4 -0
  159. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +260 -0
  160. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +1096 -0
  161. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/UnitFormatters.js +130 -0
  162. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/CPUProfileDataModel.js +514 -0
  163. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/ProfileTreeModel.js +90 -0
  164. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/cpu_profile.js +6 -0
  165. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/LogManager.js +67 -0
  166. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/NetworkLog.js +494 -0
  167. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/RequestResolver.js +49 -0
  168. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/logs-meta.js +73 -0
  169. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/logs.js +7 -0
  170. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/Calculator.js +4 -0
  171. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/NetworkTimeCalculator.js +256 -0
  172. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/RequestTimeRanges.js +120 -0
  173. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/network_time_calculator.js +6 -0
  174. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/CodeMirrorUtils.js +32 -0
  175. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/ContentData.js +173 -0
  176. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/ContentProvider.js +30 -0
  177. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/StaticContentProvider.js +32 -0
  178. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/StreamingContentData.js +79 -0
  179. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/Text.js +69 -0
  180. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextCursor.js +35 -0
  181. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextRange.js +231 -0
  182. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextUtils.js +332 -0
  183. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/WasmDisassembly.js +68 -0
  184. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/text_utils.js +14 -0
  185. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EntityMapper.js +122 -0
  186. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +81 -0
  187. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +370 -0
  188. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +171 -0
  189. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Name.js +114 -0
  190. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Processor.js +547 -0
  191. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Styles.js +815 -0
  192. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/FilmStrip.js +44 -0
  193. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/MainThreadActivity.js +76 -0
  194. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/ScriptDuplication.js +162 -0
  195. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/StackTraceForEvent.js +191 -0
  196. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/ThirdParties.js +118 -0
  197. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceFilter.js +50 -0
  198. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +592 -0
  199. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/extras.js +10 -0
  200. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AnimationFramesHandler.js +109 -0
  201. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AnimationHandler.js +26 -0
  202. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AsyncJSCallsHandler.js +187 -0
  203. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AuctionWorkletsHandler.js +162 -0
  204. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/DOMStatsHandler.js +21 -0
  205. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ExtensionTraceDataHandler.js +263 -0
  206. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FlowsHandler.js +148 -0
  207. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FramesHandler.js +483 -0
  208. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/GPUHandler.js +35 -0
  209. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ImagePaintingHandler.js +147 -0
  210. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/InitiatorsHandler.js +180 -0
  211. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/InvalidationsHandler.js +126 -0
  212. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestImagePaintHandler.js +85 -0
  213. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestTextPaintHandler.js +27 -0
  214. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayerTreeHandler.js +103 -0
  215. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +446 -0
  216. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MemoryHandler.js +21 -0
  217. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +400 -0
  218. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ModelHandlers.js +33 -0
  219. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +540 -0
  220. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageFramesHandler.js +42 -0
  221. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageLoadMetricsHandler.js +349 -0
  222. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/RendererHandler.js +346 -0
  223. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SamplesHandler.js +207 -0
  224. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScreenshotsHandler.js +98 -0
  225. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScriptsHandler.js +251 -0
  226. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SelectorStatsHandler.js +71 -0
  227. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/Threads.js +101 -0
  228. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserInteractionsHandler.js +297 -0
  229. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserTimingsHandler.js +184 -0
  230. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/WarningsHandler.js +134 -0
  231. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/WorkersHandler.js +33 -0
  232. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/handlers.js +7 -0
  233. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/helpers.js +163 -0
  234. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/types.js +1 -0
  235. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Extensions.js +41 -0
  236. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Network.js +102 -0
  237. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/SamplesIntegrator.js +493 -0
  238. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/SyntheticEvents.js +74 -0
  239. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +184 -0
  240. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +744 -0
  241. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/TreeHelpers.js +254 -0
  242. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/helpers.js +10 -0
  243. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/CLSCulprits.js +488 -0
  244. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Cache.js +208 -0
  245. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Common.js +340 -0
  246. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DOMSize.js +180 -0
  247. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DocumentLatency.js +256 -0
  248. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DuplicatedJavaScript.js +89 -0
  249. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/FontDisplay.js +81 -0
  250. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ForcedReflow.js +160 -0
  251. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/INPBreakdown.js +117 -0
  252. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ImageDelivery.js +262 -0
  253. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +188 -0
  254. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +182 -0
  255. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LegacyJavaScript.js +88 -0
  256. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Models.js +21 -0
  257. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ModernHTTP.js +199 -0
  258. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +544 -0
  259. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +191 -0
  260. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/SlowCSSSelector.js +135 -0
  261. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Statistics.js +92 -0
  262. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ThirdParties.js +97 -0
  263. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Viewport.js +101 -0
  264. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/insights.js +9 -0
  265. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/types.js +18 -0
  266. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/LanternError.js +6 -0
  267. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/NetworkAnalyzer.js +488 -0
  268. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/core.js +5 -0
  269. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/BaseNode.js +276 -0
  270. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/CPUNode.js +63 -0
  271. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/NetworkNode.js +82 -0
  272. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/PageDependencyGraph.js +551 -0
  273. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/graph.js +7 -0
  274. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/lantern.js +9 -0
  275. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/FirstContentfulPaint.js +136 -0
  276. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/Interactive.js +67 -0
  277. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/LargestContentfulPaint.js +68 -0
  278. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/MaxPotentialFID.js +48 -0
  279. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/Metric.js +68 -0
  280. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/SpeedIndex.js +101 -0
  281. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/TBTUtils.js +64 -0
  282. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/TotalBlockingTime.js +78 -0
  283. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/metrics.js +11 -0
  284. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/ConnectionPool.js +115 -0
  285. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/Constants.js +42 -0
  286. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/DNSCache.js +47 -0
  287. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/SimulationTimingMap.js +134 -0
  288. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/Simulator.js +450 -0
  289. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/TCPConnection.js +154 -0
  290. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/simulation.js +9 -0
  291. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/types/Lantern.js +24 -0
  292. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/types/types.js +4 -0
  293. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/trace.js +17 -0
  294. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Configuration.js +18 -0
  295. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Extensions.js +37 -0
  296. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/File.js +57 -0
  297. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Overlays.js +4 -0
  298. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Timing.js +15 -0
  299. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +565 -0
  300. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/types.js +9 -0
  301. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/codemirror.next/codemirror.next.js +1 -0
  302. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/LICENSE +202 -0
  303. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/legacy-javascript.js +38 -0
  304. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/lib/legacy-javascript.js +944 -0
  305. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/LICENSE +26 -0
  306. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/builder/builder.js +196 -0
  307. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/builder/safe_builder.js +226 -0
  308. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/codec.js +4 -0
  309. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +394 -0
  310. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encode.js +24 -0
  311. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +283 -0
  312. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/mod.js +7 -0
  313. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/util.js +9 -0
  314. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/vlq.js +84 -0
  315. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/source-map-scopes-codec.js +4 -0
  316. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/LICENSE +20 -0
  317. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/lib/nostats-subset.js +148 -0
  318. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/httparchive-nostats-subset.js +2 -0
  319. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/httparchive-subset.js +2 -0
  320. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.js +118 -0
  321. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.test.js +40 -0
  322. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/entities.test.js +26 -0
  323. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/index.js +4 -0
  324. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/index.test.js +215 -0
  325. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.js +4 -0
  326. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/httparchive.js +4 -0
  327. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/nostats.js +4 -0
  328. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/nostats-subset.js +2 -0
  329. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/third-party-web.js +8 -0
  330. package/build/src/McpContext.js +204 -0
  331. package/build/src/McpResponse.js +178 -0
  332. package/build/src/Mutex.js +40 -0
  333. package/build/src/PageCollector.js +68 -0
  334. package/build/src/browser.js +105 -0
  335. package/build/src/formatters/consoleFormatter.js +71 -0
  336. package/build/src/formatters/networkFormatter.js +34 -0
  337. package/build/src/formatters/snapshotFormatter.js +75 -0
  338. package/build/src/index.js +206 -0
  339. package/build/src/logger.js +26 -0
  340. package/build/src/tools/ToolDefinition.js +8 -0
  341. package/build/src/tools/categories.js +14 -0
  342. package/build/src/tools/console.js +19 -0
  343. package/build/src/tools/emulation.js +61 -0
  344. package/build/src/tools/input.js +202 -0
  345. package/build/src/tools/network.js +35 -0
  346. package/build/src/tools/pages.js +181 -0
  347. package/build/src/tools/performance.js +116 -0
  348. package/build/src/tools/screenshot.js +65 -0
  349. package/build/src/tools/script.js +35 -0
  350. package/build/src/tools/snapshot.js +42 -0
  351. package/build/src/trace-processing/parse.js +73 -0
  352. package/build/src/waitForHelpers.js +109 -0
  353. package/package.json +53 -6
  354. package/README +0 -1
@@ -0,0 +1,1281 @@
1
+ // Copyright 2009 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+ import * as Platform from '../platform/platform.js';
5
+ import * as Root from '../root/root.js';
6
+ import { Console } from './Console.js';
7
+ import { ObjectWrapper } from './Object.js';
8
+ import { getLocalizedSettingsCategory, getRegisteredSettings as getRegisteredSettingsInternal, maybeRemoveSettingExtension, registerSettingExtension, registerSettingsForTest, resetSettings, } from './SettingRegistration.js';
9
+ let settingsInstance;
10
+ export class Settings {
11
+ syncedStorage;
12
+ globalStorage;
13
+ localStorage;
14
+ #sessionStorage = new SettingsStorage({});
15
+ settingNameSet = new Set();
16
+ orderValuesBySettingCategory = new Map();
17
+ #eventSupport = new ObjectWrapper();
18
+ #registry = new Map();
19
+ moduleSettings = new Map();
20
+ #logSettingAccess;
21
+ constructor(syncedStorage, globalStorage, localStorage, logSettingAccess) {
22
+ this.syncedStorage = syncedStorage;
23
+ this.globalStorage = globalStorage;
24
+ this.localStorage = localStorage;
25
+ this.#logSettingAccess = logSettingAccess;
26
+ for (const registration of this.getRegisteredSettings()) {
27
+ const { settingName, defaultValue, storageType } = registration;
28
+ const isRegex = registration.settingType === "regex" /* SettingType.REGEX */;
29
+ const evaluatedDefaultValue = typeof defaultValue === 'function' ? defaultValue(Root.Runtime.hostConfig) : defaultValue;
30
+ const setting = isRegex && typeof evaluatedDefaultValue === 'string' ?
31
+ this.createRegExpSetting(settingName, evaluatedDefaultValue, undefined, storageType) :
32
+ this.createSetting(settingName, evaluatedDefaultValue, storageType);
33
+ setting.setTitleFunction(registration.title);
34
+ if (registration.userActionCondition) {
35
+ setting.setRequiresUserAction(Boolean(Root.Runtime.Runtime.queryParam(registration.userActionCondition)));
36
+ }
37
+ setting.setRegistration(registration);
38
+ this.registerModuleSetting(setting);
39
+ }
40
+ }
41
+ getRegisteredSettings() {
42
+ return getRegisteredSettingsInternal();
43
+ }
44
+ static hasInstance() {
45
+ return typeof settingsInstance !== 'undefined';
46
+ }
47
+ static instance(opts = { forceNew: null, syncedStorage: null, globalStorage: null, localStorage: null }) {
48
+ const { forceNew, syncedStorage, globalStorage, localStorage, logSettingAccess } = opts;
49
+ if (!settingsInstance || forceNew) {
50
+ if (!syncedStorage || !globalStorage || !localStorage) {
51
+ throw new Error(`Unable to create settings: global and local storage must be provided: ${new Error().stack}`);
52
+ }
53
+ settingsInstance = new Settings(syncedStorage, globalStorage, localStorage, logSettingAccess);
54
+ }
55
+ return settingsInstance;
56
+ }
57
+ static removeInstance() {
58
+ settingsInstance = undefined;
59
+ }
60
+ registerModuleSetting(setting) {
61
+ const settingName = setting.name;
62
+ const category = setting.category();
63
+ const order = setting.order();
64
+ if (this.settingNameSet.has(settingName)) {
65
+ throw new Error(`Duplicate Setting name '${settingName}'`);
66
+ }
67
+ if (category && order) {
68
+ const orderValues = this.orderValuesBySettingCategory.get(category) || new Set();
69
+ if (orderValues.has(order)) {
70
+ throw new Error(`Duplicate order value '${order}' for settings category '${category}'`);
71
+ }
72
+ orderValues.add(order);
73
+ this.orderValuesBySettingCategory.set(category, orderValues);
74
+ }
75
+ this.settingNameSet.add(settingName);
76
+ this.moduleSettings.set(setting.name, setting);
77
+ }
78
+ static normalizeSettingName(name) {
79
+ if ([
80
+ VersionController.GLOBAL_VERSION_SETTING_NAME,
81
+ VersionController.SYNCED_VERSION_SETTING_NAME,
82
+ VersionController.LOCAL_VERSION_SETTING_NAME,
83
+ 'currentDockState',
84
+ 'isUnderTest',
85
+ ].includes(name)) {
86
+ return name;
87
+ }
88
+ return Platform.StringUtilities.toKebabCase(name);
89
+ }
90
+ /**
91
+ * Prefer a module setting if this setting is one that you might not want to
92
+ * surface to the user to control themselves. Examples of these are settings
93
+ * to store UI state such as how a user choses to position a split widget or
94
+ * which panel they last opened.
95
+ * If you are creating a setting that you expect the user to control, and
96
+ * sync, prefer {@see createSetting}
97
+ */
98
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
99
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
+ moduleSetting(settingName) {
101
+ const setting = this.moduleSettings.get(settingName);
102
+ if (!setting) {
103
+ throw new Error('No setting registered: ' + settingName);
104
+ }
105
+ return setting;
106
+ }
107
+ settingForTest(settingName) {
108
+ const setting = this.#registry.get(settingName);
109
+ if (!setting) {
110
+ throw new Error('No setting registered: ' + settingName);
111
+ }
112
+ return setting;
113
+ }
114
+ /**
115
+ * Get setting via key, and create a new setting if the requested setting does not exist.
116
+ * @param key kebab-case string ID
117
+ * @param defaultValue
118
+ * @param storageType If not specified, SettingStorageType.GLOBAL is used.
119
+ */
120
+ createSetting(key, defaultValue, storageType) {
121
+ const storage = this.storageFromType(storageType);
122
+ let setting = this.#registry.get(key);
123
+ if (!setting) {
124
+ setting = new Setting(key, defaultValue, this.#eventSupport, storage, this.#logSettingAccess);
125
+ this.#registry.set(key, setting);
126
+ }
127
+ return setting;
128
+ }
129
+ createLocalSetting(key, defaultValue) {
130
+ return this.createSetting(key, defaultValue, "Local" /* SettingStorageType.LOCAL */);
131
+ }
132
+ createRegExpSetting(key, defaultValue, regexFlags, storageType) {
133
+ if (!this.#registry.get(key)) {
134
+ this.#registry.set(key, new RegExpSetting(key, defaultValue, this.#eventSupport, this.storageFromType(storageType), regexFlags, this.#logSettingAccess));
135
+ }
136
+ return this.#registry.get(key);
137
+ }
138
+ clearAll() {
139
+ this.globalStorage.removeAll();
140
+ this.syncedStorage.removeAll();
141
+ this.localStorage.removeAll();
142
+ new VersionController().resetToCurrent();
143
+ }
144
+ storageFromType(storageType) {
145
+ switch (storageType) {
146
+ case "Local" /* SettingStorageType.LOCAL */:
147
+ return this.localStorage;
148
+ case "Session" /* SettingStorageType.SESSION */:
149
+ return this.#sessionStorage;
150
+ case "Global" /* SettingStorageType.GLOBAL */:
151
+ return this.globalStorage;
152
+ case "Synced" /* SettingStorageType.SYNCED */:
153
+ return this.syncedStorage;
154
+ }
155
+ return this.globalStorage;
156
+ }
157
+ getRegistry() {
158
+ return this.#registry;
159
+ }
160
+ }
161
+ export const NOOP_STORAGE = {
162
+ register: () => { },
163
+ set: () => { },
164
+ get: () => Promise.resolve(''),
165
+ remove: () => { },
166
+ clear: () => { },
167
+ };
168
+ export class SettingsStorage {
169
+ object;
170
+ backingStore;
171
+ storagePrefix;
172
+ constructor(object, backingStore = NOOP_STORAGE, storagePrefix = '') {
173
+ this.object = object;
174
+ this.backingStore = backingStore;
175
+ this.storagePrefix = storagePrefix;
176
+ }
177
+ register(name) {
178
+ name = this.storagePrefix + name;
179
+ this.backingStore.register(name);
180
+ }
181
+ set(name, value) {
182
+ name = this.storagePrefix + name;
183
+ this.object[name] = value;
184
+ this.backingStore.set(name, value);
185
+ }
186
+ has(name) {
187
+ name = this.storagePrefix + name;
188
+ return name in this.object;
189
+ }
190
+ get(name) {
191
+ name = this.storagePrefix + name;
192
+ return this.object[name];
193
+ }
194
+ async forceGet(originalName) {
195
+ const name = this.storagePrefix + originalName;
196
+ const value = await this.backingStore.get(name);
197
+ if (value && value !== this.object[name]) {
198
+ this.set(originalName, value);
199
+ }
200
+ else if (!value) {
201
+ this.remove(originalName);
202
+ }
203
+ return value;
204
+ }
205
+ remove(name) {
206
+ name = this.storagePrefix + name;
207
+ delete this.object[name];
208
+ this.backingStore.remove(name);
209
+ }
210
+ removeAll() {
211
+ this.object = {};
212
+ this.backingStore.clear();
213
+ }
214
+ keys() {
215
+ return Object.keys(this.object);
216
+ }
217
+ dumpSizes() {
218
+ Console.instance().log('Ten largest settings: ');
219
+ // @ts-expect-error __proto__ optimization
220
+ const sizes = { __proto__: null };
221
+ for (const key in this.object) {
222
+ sizes[key] = this.object[key].length;
223
+ }
224
+ const keys = Object.keys(sizes);
225
+ function comparator(key1, key2) {
226
+ return sizes[key2] - sizes[key1];
227
+ }
228
+ keys.sort(comparator);
229
+ for (let i = 0; i < 10 && i < keys.length; ++i) {
230
+ Console.instance().log('Setting: \'' + keys[i] + '\', size: ' + sizes[keys[i]]);
231
+ }
232
+ }
233
+ }
234
+ function removeSetting(setting) {
235
+ const name = setting.name;
236
+ const settings = Settings.instance();
237
+ settings.getRegistry().delete(name);
238
+ settings.moduleSettings.delete(name);
239
+ setting.storage.remove(name);
240
+ }
241
+ export class Deprecation {
242
+ disabled;
243
+ warning;
244
+ experiment;
245
+ constructor({ deprecationNotice }) {
246
+ if (!deprecationNotice) {
247
+ throw new Error('Cannot create deprecation info for a non-deprecated setting');
248
+ }
249
+ this.disabled = deprecationNotice.disabled;
250
+ this.warning = deprecationNotice.warning();
251
+ this.experiment = deprecationNotice.experiment ?
252
+ Root.Runtime.experiments.allConfigurableExperiments().find(e => e.name === deprecationNotice.experiment) :
253
+ undefined;
254
+ }
255
+ }
256
+ export class Setting {
257
+ name;
258
+ defaultValue;
259
+ eventSupport;
260
+ storage;
261
+ #titleFunction;
262
+ #title;
263
+ #registration = null;
264
+ #requiresUserAction;
265
+ #value;
266
+ // TODO(crbug.com/1172300) Type cannot be inferred without changes to consumers. See above.
267
+ #serializer = JSON;
268
+ #hadUserAction;
269
+ #disabled;
270
+ #deprecation = null;
271
+ #loggedInitialAccess = false;
272
+ #logSettingAccess;
273
+ constructor(name, defaultValue, eventSupport, storage, logSettingAccess) {
274
+ this.name = name;
275
+ this.defaultValue = defaultValue;
276
+ this.eventSupport = eventSupport;
277
+ this.storage = storage;
278
+ storage.register(this.name);
279
+ this.#logSettingAccess = logSettingAccess;
280
+ }
281
+ setSerializer(serializer) {
282
+ this.#serializer = serializer;
283
+ }
284
+ addChangeListener(listener, thisObject) {
285
+ return this.eventSupport.addEventListener(this.name, listener, thisObject);
286
+ }
287
+ removeChangeListener(listener, thisObject) {
288
+ this.eventSupport.removeEventListener(this.name, listener, thisObject);
289
+ }
290
+ title() {
291
+ if (this.#title) {
292
+ return this.#title;
293
+ }
294
+ if (this.#titleFunction) {
295
+ return this.#titleFunction();
296
+ }
297
+ return '';
298
+ }
299
+ setTitleFunction(titleFunction) {
300
+ if (titleFunction) {
301
+ this.#titleFunction = titleFunction;
302
+ }
303
+ }
304
+ setTitle(title) {
305
+ this.#title = title;
306
+ }
307
+ setRequiresUserAction(requiresUserAction) {
308
+ this.#requiresUserAction = requiresUserAction;
309
+ }
310
+ disabled() {
311
+ if (this.#registration?.disabledCondition) {
312
+ const { disabled } = this.#registration.disabledCondition(Root.Runtime.hostConfig);
313
+ // If registration does not disable it, pass through to #disabled
314
+ // attribute check.
315
+ if (disabled) {
316
+ return true;
317
+ }
318
+ }
319
+ return this.#disabled || false;
320
+ }
321
+ disabledReasons() {
322
+ if (this.#registration?.disabledCondition) {
323
+ const result = this.#registration.disabledCondition(Root.Runtime.hostConfig);
324
+ if (result.disabled) {
325
+ return result.reasons;
326
+ }
327
+ }
328
+ return [];
329
+ }
330
+ setDisabled(disabled) {
331
+ this.#disabled = disabled;
332
+ this.eventSupport.dispatchEventToListeners(this.name);
333
+ }
334
+ #maybeLogAccess(value) {
335
+ try {
336
+ const valueToLog = typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' ?
337
+ value :
338
+ this.#serializer?.stringify(value);
339
+ if (valueToLog !== undefined && this.#logSettingAccess) {
340
+ void this.#logSettingAccess(this.name, valueToLog);
341
+ }
342
+ }
343
+ catch {
344
+ }
345
+ }
346
+ #maybeLogInitialAccess(value) {
347
+ if (!this.#loggedInitialAccess) {
348
+ this.#maybeLogAccess(value);
349
+ this.#loggedInitialAccess = true;
350
+ }
351
+ }
352
+ get() {
353
+ if (this.#requiresUserAction && !this.#hadUserAction) {
354
+ this.#maybeLogInitialAccess(this.defaultValue);
355
+ return this.defaultValue;
356
+ }
357
+ if (typeof this.#value !== 'undefined') {
358
+ this.#maybeLogInitialAccess(this.#value);
359
+ return this.#value;
360
+ }
361
+ this.#value = this.defaultValue;
362
+ if (this.storage.has(this.name)) {
363
+ try {
364
+ this.#value = this.#serializer.parse(this.storage.get(this.name));
365
+ }
366
+ catch {
367
+ this.storage.remove(this.name);
368
+ }
369
+ }
370
+ this.#maybeLogInitialAccess(this.#value);
371
+ return this.#value;
372
+ }
373
+ // Prefer this getter for settings which are "disableable". The plain getter returns `this.#value`,
374
+ // even if the setting is disabled, which means the callsite has to explicitly call the `disabled()`
375
+ // getter and add its own logic for the disabled state.
376
+ getIfNotDisabled() {
377
+ if (this.disabled()) {
378
+ return;
379
+ }
380
+ return this.get();
381
+ }
382
+ async forceGet() {
383
+ const name = this.name;
384
+ const oldValue = this.storage.get(name);
385
+ const value = await this.storage.forceGet(name);
386
+ this.#value = this.defaultValue;
387
+ if (value) {
388
+ try {
389
+ this.#value = this.#serializer.parse(value);
390
+ }
391
+ catch {
392
+ this.storage.remove(this.name);
393
+ }
394
+ }
395
+ if (oldValue !== value) {
396
+ this.eventSupport.dispatchEventToListeners(this.name, this.#value);
397
+ }
398
+ this.#maybeLogInitialAccess(this.#value);
399
+ return this.#value;
400
+ }
401
+ set(value) {
402
+ this.#maybeLogAccess(value);
403
+ this.#hadUserAction = true;
404
+ this.#value = value;
405
+ try {
406
+ const settingString = this.#serializer.stringify(value);
407
+ try {
408
+ this.storage.set(this.name, settingString);
409
+ }
410
+ catch (e) {
411
+ this.printSettingsSavingError(e.message, settingString);
412
+ }
413
+ }
414
+ catch (e) {
415
+ Console.instance().error('Cannot stringify setting with name: ' + this.name + ', error: ' + e.message);
416
+ }
417
+ this.eventSupport.dispatchEventToListeners(this.name, value);
418
+ }
419
+ setRegistration(registration) {
420
+ this.#registration = registration;
421
+ const { deprecationNotice } = registration;
422
+ if (deprecationNotice?.disabled) {
423
+ const experiment = deprecationNotice.experiment ?
424
+ Root.Runtime.experiments.allConfigurableExperiments().find(e => e.name === deprecationNotice.experiment) :
425
+ undefined;
426
+ if ((!experiment || experiment.isEnabled())) {
427
+ this.set(this.defaultValue);
428
+ this.setDisabled(true);
429
+ }
430
+ }
431
+ }
432
+ type() {
433
+ if (this.#registration) {
434
+ return this.#registration.settingType;
435
+ }
436
+ return null;
437
+ }
438
+ options() {
439
+ if (this.#registration && this.#registration.options) {
440
+ return this.#registration.options.map(opt => {
441
+ const { value, title, text, raw } = opt;
442
+ return {
443
+ value,
444
+ title: title(),
445
+ text: typeof text === 'function' ? text() : text,
446
+ raw,
447
+ };
448
+ });
449
+ }
450
+ return [];
451
+ }
452
+ reloadRequired() {
453
+ if (this.#registration) {
454
+ return this.#registration.reloadRequired || null;
455
+ }
456
+ return null;
457
+ }
458
+ category() {
459
+ if (this.#registration) {
460
+ return this.#registration.category || null;
461
+ }
462
+ return null;
463
+ }
464
+ tags() {
465
+ if (this.#registration && this.#registration.tags) {
466
+ // Get localized keys and separate by null character to prevent fuzzy matching from matching across them.
467
+ return this.#registration.tags.map(tag => tag()).join('\0');
468
+ }
469
+ return null;
470
+ }
471
+ order() {
472
+ if (this.#registration) {
473
+ return this.#registration.order || null;
474
+ }
475
+ return null;
476
+ }
477
+ learnMore() {
478
+ return this.#registration?.learnMore ?? null;
479
+ }
480
+ get deprecation() {
481
+ if (!this.#registration || !this.#registration.deprecationNotice) {
482
+ return null;
483
+ }
484
+ if (!this.#deprecation) {
485
+ this.#deprecation = new Deprecation(this.#registration);
486
+ }
487
+ return this.#deprecation;
488
+ }
489
+ printSettingsSavingError(message, value) {
490
+ const errorMessage = 'Error saving setting with name: ' + this.name + ', value length: ' + value.length + '. Error: ' + message;
491
+ console.error(errorMessage);
492
+ Console.instance().error(errorMessage);
493
+ this.storage.dumpSizes();
494
+ }
495
+ }
496
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
497
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
498
+ export class RegExpSetting extends Setting {
499
+ #regexFlags;
500
+ #regex;
501
+ constructor(name, defaultValue, eventSupport, storage, regexFlags, logSettingAccess) {
502
+ super(name, defaultValue ? [{ pattern: defaultValue }] : [], eventSupport, storage, logSettingAccess);
503
+ this.#regexFlags = regexFlags;
504
+ }
505
+ get() {
506
+ const result = [];
507
+ const items = this.getAsArray();
508
+ for (let i = 0; i < items.length; ++i) {
509
+ const item = items[i];
510
+ if (item.pattern && !item.disabled) {
511
+ result.push(item.pattern);
512
+ }
513
+ }
514
+ return result.join('|');
515
+ }
516
+ getAsArray() {
517
+ return super.get();
518
+ }
519
+ set(value) {
520
+ this.setAsArray([{ pattern: value, disabled: false }]);
521
+ }
522
+ setAsArray(value) {
523
+ this.#regex = undefined;
524
+ super.set(value);
525
+ }
526
+ asRegExp() {
527
+ if (typeof this.#regex !== 'undefined') {
528
+ return this.#regex;
529
+ }
530
+ this.#regex = null;
531
+ try {
532
+ const pattern = this.get();
533
+ if (pattern) {
534
+ this.#regex = new RegExp(pattern, this.#regexFlags || '');
535
+ }
536
+ }
537
+ catch {
538
+ }
539
+ return this.#regex;
540
+ }
541
+ }
542
+ export class VersionController {
543
+ static GLOBAL_VERSION_SETTING_NAME = 'inspectorVersion';
544
+ static SYNCED_VERSION_SETTING_NAME = 'syncedInspectorVersion';
545
+ static LOCAL_VERSION_SETTING_NAME = 'localInspectorVersion';
546
+ static CURRENT_VERSION = 40;
547
+ #globalVersionSetting;
548
+ #syncedVersionSetting;
549
+ #localVersionSetting;
550
+ constructor() {
551
+ // If no version setting is found, we initialize with the current version and don't do anything.
552
+ this.#globalVersionSetting = Settings.instance().createSetting(VersionController.GLOBAL_VERSION_SETTING_NAME, VersionController.CURRENT_VERSION, "Global" /* SettingStorageType.GLOBAL */);
553
+ this.#syncedVersionSetting = Settings.instance().createSetting(VersionController.SYNCED_VERSION_SETTING_NAME, VersionController.CURRENT_VERSION, "Synced" /* SettingStorageType.SYNCED */);
554
+ this.#localVersionSetting = Settings.instance().createSetting(VersionController.LOCAL_VERSION_SETTING_NAME, VersionController.CURRENT_VERSION, "Local" /* SettingStorageType.LOCAL */);
555
+ }
556
+ /**
557
+ * Force re-sets all version number settings to the current version without
558
+ * running any migrations.
559
+ */
560
+ resetToCurrent() {
561
+ this.#globalVersionSetting.set(VersionController.CURRENT_VERSION);
562
+ this.#syncedVersionSetting.set(VersionController.CURRENT_VERSION);
563
+ this.#localVersionSetting.set(VersionController.CURRENT_VERSION);
564
+ }
565
+ /**
566
+ * Runs the appropriate migrations and updates the version settings accordingly.
567
+ *
568
+ * To determine what migrations to run we take the minimum of all version number settings.
569
+ *
570
+ * IMPORTANT: All migrations must be idempotent since they might be applied multiple times.
571
+ */
572
+ updateVersion() {
573
+ const currentVersion = VersionController.CURRENT_VERSION;
574
+ const minimumVersion = Math.min(this.#globalVersionSetting.get(), this.#syncedVersionSetting.get(), this.#localVersionSetting.get());
575
+ const methodsToRun = this.methodsToRunToUpdateVersion(minimumVersion, currentVersion);
576
+ console.assert(
577
+ // @ts-expect-error
578
+ this[`updateVersionFrom${currentVersion}To${currentVersion + 1}`] === undefined, 'Unexpected migration method found. Increment CURRENT_VERSION or remove the method.');
579
+ for (const method of methodsToRun) {
580
+ // @ts-expect-error Special version method matching
581
+ this[method].call(this);
582
+ }
583
+ this.resetToCurrent();
584
+ }
585
+ methodsToRunToUpdateVersion(oldVersion, currentVersion) {
586
+ const result = [];
587
+ for (let i = oldVersion; i < currentVersion; ++i) {
588
+ result.push('updateVersionFrom' + i + 'To' + (i + 1));
589
+ }
590
+ return result;
591
+ }
592
+ updateVersionFrom0To1() {
593
+ this.clearBreakpointsWhenTooMany(Settings.instance().createLocalSetting('breakpoints', []), 500000);
594
+ }
595
+ updateVersionFrom1To2() {
596
+ Settings.instance().createSetting('previouslyViewedFiles', []).set([]);
597
+ }
598
+ updateVersionFrom2To3() {
599
+ Settings.instance().createSetting('fileSystemMapping', {}).set({});
600
+ removeSetting(Settings.instance().createSetting('fileMappingEntries', []));
601
+ }
602
+ updateVersionFrom3To4() {
603
+ const advancedMode = Settings.instance().createSetting('showHeaSnapshotObjectsHiddenProperties', false);
604
+ moduleSetting('showAdvancedHeapSnapshotProperties').set(advancedMode.get());
605
+ removeSetting(advancedMode);
606
+ }
607
+ updateVersionFrom4To5() {
608
+ const settingNames = {
609
+ FileSystemViewSidebarWidth: 'fileSystemViewSplitViewState',
610
+ elementsSidebarWidth: 'elementsPanelSplitViewState',
611
+ StylesPaneSplitRatio: 'stylesPaneSplitViewState',
612
+ heapSnapshotRetainersViewSize: 'heapSnapshotSplitViewState',
613
+ 'InspectorView.splitView': 'InspectorView.splitViewState',
614
+ 'InspectorView.screencastSplitView': 'InspectorView.screencastSplitViewState',
615
+ 'Inspector.drawerSplitView': 'Inspector.drawerSplitViewState',
616
+ layerDetailsSplitView: 'layerDetailsSplitViewState',
617
+ networkSidebarWidth: 'networkPanelSplitViewState',
618
+ sourcesSidebarWidth: 'sourcesPanelSplitViewState',
619
+ scriptsPanelNavigatorSidebarWidth: 'sourcesPanelNavigatorSplitViewState',
620
+ sourcesPanelSplitSidebarRatio: 'sourcesPanelDebuggerSidebarSplitViewState',
621
+ 'timeline-details': 'timelinePanelDetailsSplitViewState',
622
+ 'timeline-split': 'timelinePanelRecorsSplitViewState',
623
+ 'timeline-view': 'timelinePanelTimelineStackSplitViewState',
624
+ auditsSidebarWidth: 'auditsPanelSplitViewState',
625
+ layersSidebarWidth: 'layersPanelSplitViewState',
626
+ profilesSidebarWidth: 'profilesPanelSplitViewState',
627
+ resourcesSidebarWidth: 'resourcesPanelSplitViewState',
628
+ };
629
+ const empty = {};
630
+ for (const oldName in settingNames) {
631
+ const newName = settingNames[oldName];
632
+ const oldNameH = oldName + 'H';
633
+ let newValue = null;
634
+ const oldSetting = Settings.instance().createSetting(oldName, empty);
635
+ if (oldSetting.get() !== empty) {
636
+ newValue = newValue || {};
637
+ // @ts-expect-error
638
+ newValue.vertical = {};
639
+ // @ts-expect-error
640
+ newValue.vertical.size = oldSetting.get();
641
+ removeSetting(oldSetting);
642
+ }
643
+ const oldSettingH = Settings.instance().createSetting(oldNameH, empty);
644
+ if (oldSettingH.get() !== empty) {
645
+ newValue = newValue || {};
646
+ // @ts-expect-error
647
+ newValue.horizontal = {};
648
+ // @ts-expect-error
649
+ newValue.horizontal.size = oldSettingH.get();
650
+ removeSetting(oldSettingH);
651
+ }
652
+ if (newValue) {
653
+ Settings.instance().createSetting(newName, {}).set(newValue);
654
+ }
655
+ }
656
+ }
657
+ updateVersionFrom5To6() {
658
+ const settingNames = {
659
+ debuggerSidebarHidden: 'sourcesPanelSplitViewState',
660
+ navigatorHidden: 'sourcesPanelNavigatorSplitViewState',
661
+ 'WebInspector.Drawer.showOnLoad': 'Inspector.drawerSplitViewState',
662
+ };
663
+ for (const oldName in settingNames) {
664
+ const oldSetting = Settings.instance().createSetting(oldName, null);
665
+ if (oldSetting.get() === null) {
666
+ removeSetting(oldSetting);
667
+ continue;
668
+ }
669
+ const newName = settingNames[oldName];
670
+ const invert = oldName === 'WebInspector.Drawer.showOnLoad';
671
+ const hidden = oldSetting.get() !== invert;
672
+ removeSetting(oldSetting);
673
+ const showMode = hidden ? 'OnlyMain' : 'Both';
674
+ const newSetting = Settings.instance().createSetting(newName, {});
675
+ const newValue = newSetting.get() || {};
676
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
677
+ // @ts-expect-error
678
+ newValue.vertical = newValue.vertical || {};
679
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
680
+ // @ts-expect-error
681
+ newValue.vertical.showMode = showMode;
682
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
683
+ // @ts-expect-error
684
+ newValue.horizontal = newValue.horizontal || {};
685
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
686
+ // @ts-expect-error
687
+ newValue.horizontal.showMode = showMode;
688
+ newSetting.set(newValue);
689
+ }
690
+ }
691
+ updateVersionFrom6To7() {
692
+ const settingNames = {
693
+ sourcesPanelNavigatorSplitViewState: 'sourcesPanelNavigatorSplitViewState',
694
+ elementsPanelSplitViewState: 'elementsPanelSplitViewState',
695
+ stylesPaneSplitViewState: 'stylesPaneSplitViewState',
696
+ sourcesPanelDebuggerSidebarSplitViewState: 'sourcesPanelDebuggerSidebarSplitViewState',
697
+ };
698
+ const empty = {};
699
+ for (const name in settingNames) {
700
+ const setting = Settings.instance().createSetting(name, empty);
701
+ const value = setting.get();
702
+ if (value === empty) {
703
+ continue;
704
+ }
705
+ // Zero out saved percentage sizes, and they will be restored to defaults.
706
+ if (value.vertical?.size && value.vertical.size < 1) {
707
+ value.vertical.size = 0;
708
+ }
709
+ if (value.horizontal?.size && value.horizontal.size < 1) {
710
+ value.horizontal.size = 0;
711
+ }
712
+ setting.set(value);
713
+ }
714
+ }
715
+ updateVersionFrom7To8() {
716
+ }
717
+ updateVersionFrom8To9() {
718
+ const settingNames = ['skipStackFramesPattern', 'workspaceFolderExcludePattern'];
719
+ for (let i = 0; i < settingNames.length; ++i) {
720
+ const setting = Settings.instance().createSetting(settingNames[i], '');
721
+ let value = setting.get();
722
+ if (!value) {
723
+ return;
724
+ }
725
+ if (typeof value === 'string') {
726
+ value = [value];
727
+ }
728
+ for (let j = 0; j < value.length; ++j) {
729
+ if (typeof value[j] === 'string') {
730
+ value[j] = { pattern: value[j] };
731
+ }
732
+ }
733
+ setting.set(value);
734
+ }
735
+ }
736
+ updateVersionFrom9To10() {
737
+ // This one is localStorage specific, which is fine.
738
+ if (!window.localStorage) {
739
+ return;
740
+ }
741
+ for (const key in window.localStorage) {
742
+ if (key.startsWith('revision-history')) {
743
+ window.localStorage.removeItem(key);
744
+ }
745
+ }
746
+ }
747
+ updateVersionFrom10To11() {
748
+ const oldSettingName = 'customDevicePresets';
749
+ const newSettingName = 'customEmulatedDeviceList';
750
+ const oldSetting = Settings.instance().createSetting(oldSettingName, undefined);
751
+ const list = oldSetting.get();
752
+ if (!Array.isArray(list)) {
753
+ return;
754
+ }
755
+ const newList = [];
756
+ for (let i = 0; i < list.length; ++i) {
757
+ const value = list[i];
758
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
759
+ const device = {};
760
+ device['title'] = value['title'];
761
+ device['type'] = 'unknown';
762
+ device['user-agent'] = value['userAgent'];
763
+ device['capabilities'] = [];
764
+ if (value['touch']) {
765
+ device['capabilities'].push('touch');
766
+ }
767
+ if (value['mobile']) {
768
+ device['capabilities'].push('mobile');
769
+ }
770
+ device['screen'] = {};
771
+ device['screen']['vertical'] = { width: value['width'], height: value['height'] };
772
+ device['screen']['horizontal'] = { width: value['height'], height: value['width'] };
773
+ device['screen']['device-pixel-ratio'] = value['deviceScaleFactor'];
774
+ device['modes'] = [];
775
+ device['show-by-default'] = true;
776
+ device['show'] = 'Default';
777
+ newList.push(device);
778
+ }
779
+ if (newList.length) {
780
+ Settings.instance().createSetting(newSettingName, []).set(newList);
781
+ }
782
+ removeSetting(oldSetting);
783
+ }
784
+ updateVersionFrom11To12() {
785
+ this.migrateSettingsFromLocalStorage();
786
+ }
787
+ updateVersionFrom12To13() {
788
+ this.migrateSettingsFromLocalStorage();
789
+ removeSetting(Settings.instance().createSetting('timelineOverviewMode', ''));
790
+ }
791
+ updateVersionFrom13To14() {
792
+ const defaultValue = { throughput: -1, latency: 0 };
793
+ Settings.instance().createSetting('networkConditions', defaultValue).set(defaultValue);
794
+ }
795
+ updateVersionFrom14To15() {
796
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
797
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
798
+ const setting = Settings.instance().createLocalSetting('workspaceExcludedFolders', {});
799
+ const oldValue = setting.get();
800
+ const newValue = {};
801
+ for (const fileSystemPath in oldValue) {
802
+ newValue[fileSystemPath] = [];
803
+ for (const entry of oldValue[fileSystemPath]) {
804
+ newValue[fileSystemPath].push(entry.path);
805
+ }
806
+ }
807
+ setting.set(newValue);
808
+ }
809
+ updateVersionFrom15To16() {
810
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
811
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
812
+ const setting = Settings.instance().createSetting('InspectorView.panelOrder', {});
813
+ const tabOrders = setting.get();
814
+ for (const key of Object.keys(tabOrders)) {
815
+ tabOrders[key] = (tabOrders[key] + 1) * 10;
816
+ }
817
+ setting.set(tabOrders);
818
+ }
819
+ updateVersionFrom16To17() {
820
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
821
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
822
+ const setting = Settings.instance().createSetting('networkConditionsCustomProfiles', []);
823
+ const oldValue = setting.get();
824
+ const newValue = [];
825
+ if (Array.isArray(oldValue)) {
826
+ for (const preset of oldValue) {
827
+ if (typeof preset.title === 'string' && typeof preset.value === 'object' &&
828
+ typeof preset.value.throughput === 'number' && typeof preset.value.latency === 'number') {
829
+ newValue.push({
830
+ title: preset.title,
831
+ value: { download: preset.value.throughput, upload: preset.value.throughput, latency: preset.value.latency },
832
+ });
833
+ }
834
+ }
835
+ }
836
+ setting.set(newValue);
837
+ }
838
+ updateVersionFrom17To18() {
839
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
840
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
841
+ const setting = Settings.instance().createLocalSetting('workspaceExcludedFolders', {});
842
+ const oldValue = setting.get();
843
+ const newValue = {};
844
+ for (const oldKey in oldValue) {
845
+ let newKey = oldKey.replace(/\\/g, '/');
846
+ if (!newKey.startsWith('file://')) {
847
+ if (newKey.startsWith('/')) {
848
+ newKey = 'file://' + newKey;
849
+ }
850
+ else {
851
+ newKey = 'file:///' + newKey;
852
+ }
853
+ }
854
+ newValue[newKey] = oldValue[oldKey];
855
+ }
856
+ setting.set(newValue);
857
+ }
858
+ updateVersionFrom18To19() {
859
+ const defaultColumns = { status: true, type: true, initiator: true, size: true, time: true };
860
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
861
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
862
+ const visibleColumnSettings = Settings.instance().createSetting('networkLogColumnsVisibility', defaultColumns);
863
+ const visibleColumns = visibleColumnSettings.get();
864
+ visibleColumns.name = true;
865
+ visibleColumns.timeline = true;
866
+ const configs = {};
867
+ for (const columnId in visibleColumns) {
868
+ if (!visibleColumns.hasOwnProperty(columnId)) {
869
+ continue;
870
+ }
871
+ configs[columnId.toLowerCase()] = { visible: visibleColumns[columnId] };
872
+ }
873
+ const newSetting = Settings.instance().createSetting('networkLogColumns', {});
874
+ newSetting.set(configs);
875
+ removeSetting(visibleColumnSettings);
876
+ }
877
+ updateVersionFrom19To20() {
878
+ const oldSetting = Settings.instance().createSetting('InspectorView.panelOrder', {});
879
+ const newSetting = Settings.instance().createSetting('panel-tabOrder', {});
880
+ newSetting.set(oldSetting.get());
881
+ removeSetting(oldSetting);
882
+ }
883
+ updateVersionFrom20To21() {
884
+ const networkColumns = Settings.instance().createSetting('networkLogColumns', {});
885
+ const columns = networkColumns.get();
886
+ delete columns['timeline'];
887
+ delete columns['waterfall'];
888
+ networkColumns.set(columns);
889
+ }
890
+ updateVersionFrom21To22() {
891
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
892
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
893
+ const breakpointsSetting = Settings.instance().createLocalSetting('breakpoints', []);
894
+ const breakpoints = breakpointsSetting.get();
895
+ for (const breakpoint of breakpoints) {
896
+ breakpoint['url'] = breakpoint['sourceFileId'];
897
+ delete breakpoint['sourceFileId'];
898
+ }
899
+ breakpointsSetting.set(breakpoints);
900
+ }
901
+ updateVersionFrom22To23() {
902
+ // This update is no-op.
903
+ }
904
+ updateVersionFrom23To24() {
905
+ const oldSetting = Settings.instance().createSetting('searchInContentScripts', false);
906
+ const newSetting = Settings.instance().createSetting('searchInAnonymousAndContentScripts', false);
907
+ newSetting.set(oldSetting.get());
908
+ removeSetting(oldSetting);
909
+ }
910
+ updateVersionFrom24To25() {
911
+ const defaultColumns = { status: true, type: true, initiator: true, size: true, time: true };
912
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
913
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
914
+ const networkLogColumnsSetting = Settings.instance().createSetting('networkLogColumns', defaultColumns);
915
+ const columns = networkLogColumnsSetting.get();
916
+ delete columns.product;
917
+ networkLogColumnsSetting.set(columns);
918
+ }
919
+ updateVersionFrom25To26() {
920
+ const oldSetting = Settings.instance().createSetting('messageURLFilters', {});
921
+ const urls = Object.keys(oldSetting.get());
922
+ const textFilter = urls.map(url => `-url:${url}`).join(' ');
923
+ if (textFilter) {
924
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
925
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
926
+ const textFilterSetting = Settings.instance().createSetting('console.textFilter', '');
927
+ const suffix = textFilterSetting.get() ? ` ${textFilterSetting.get()}` : '';
928
+ textFilterSetting.set(`${textFilter}${suffix}`);
929
+ }
930
+ removeSetting(oldSetting);
931
+ }
932
+ updateVersionFrom26To27() {
933
+ function renameKeyInObjectSetting(settingName, from, to) {
934
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
935
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
936
+ const setting = Settings.instance().createSetting(settingName, {});
937
+ const value = setting.get();
938
+ if (from in value) {
939
+ value[to] = value[from];
940
+ delete value[from];
941
+ setting.set(value);
942
+ }
943
+ }
944
+ function renameInStringSetting(settingName, from, to) {
945
+ const setting = Settings.instance().createSetting(settingName, '');
946
+ const value = setting.get();
947
+ if (value === from) {
948
+ setting.set(to);
949
+ }
950
+ }
951
+ renameKeyInObjectSetting('panel-tabOrder', 'audits2', 'audits');
952
+ renameKeyInObjectSetting('panel-closeableTabs', 'audits2', 'audits');
953
+ renameInStringSetting('panel-selectedTab', 'audits2', 'audits');
954
+ }
955
+ updateVersionFrom27To28() {
956
+ const setting = Settings.instance().createSetting('uiTheme', 'systemPreferred');
957
+ if (setting.get() === 'default') {
958
+ setting.set('systemPreferred');
959
+ }
960
+ }
961
+ updateVersionFrom28To29() {
962
+ function renameKeyInObjectSetting(settingName, from, to) {
963
+ // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
964
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
965
+ const setting = Settings.instance().createSetting(settingName, {});
966
+ const value = setting.get();
967
+ if (from in value) {
968
+ value[to] = value[from];
969
+ delete value[from];
970
+ setting.set(value);
971
+ }
972
+ }
973
+ function renameInStringSetting(settingName, from, to) {
974
+ const setting = Settings.instance().createSetting(settingName, '');
975
+ const value = setting.get();
976
+ if (value === from) {
977
+ setting.set(to);
978
+ }
979
+ }
980
+ renameKeyInObjectSetting('panel-tabOrder', 'audits', 'lighthouse');
981
+ renameKeyInObjectSetting('panel-closeableTabs', 'audits', 'lighthouse');
982
+ renameInStringSetting('panel-selectedTab', 'audits', 'lighthouse');
983
+ }
984
+ updateVersionFrom29To30() {
985
+ // Create new location agnostic setting
986
+ const closeableTabSetting = Settings.instance().createSetting('closeableTabs', {});
987
+ // Read current settings
988
+ const panelCloseableTabSetting = Settings.instance().createSetting('panel-closeableTabs', {});
989
+ const drawerCloseableTabSetting = Settings.instance().createSetting('drawer-view-closeableTabs', {});
990
+ const openTabsInPanel = panelCloseableTabSetting.get();
991
+ const openTabsInDrawer = panelCloseableTabSetting.get();
992
+ // Set #value of new setting
993
+ const newValue = Object.assign(openTabsInDrawer, openTabsInPanel);
994
+ closeableTabSetting.set(newValue);
995
+ // Remove old settings
996
+ removeSetting(panelCloseableTabSetting);
997
+ removeSetting(drawerCloseableTabSetting);
998
+ }
999
+ updateVersionFrom30To31() {
1000
+ // Remove recorder_recordings setting that was used for storing recordings
1001
+ // by an old recorder experiment.
1002
+ const recordingsSetting = Settings.instance().createSetting('recorder_recordings', []);
1003
+ removeSetting(recordingsSetting);
1004
+ }
1005
+ updateVersionFrom31To32() {
1006
+ // Introduce the new 'resourceTypeName' property on stored breakpoints. Prior to
1007
+ // this change we synchronized the breakpoint only by URL, but since we don't
1008
+ // know on which resource type the given breakpoint was set, we just assume
1009
+ // 'script' here to keep things simple.
1010
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1011
+ const breakpointsSetting = Settings.instance().createLocalSetting('breakpoints', []);
1012
+ const breakpoints = breakpointsSetting.get();
1013
+ for (const breakpoint of breakpoints) {
1014
+ breakpoint['resourceTypeName'] = 'script';
1015
+ }
1016
+ breakpointsSetting.set(breakpoints);
1017
+ }
1018
+ updateVersionFrom32To33() {
1019
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1020
+ const previouslyViewedFilesSetting = Settings.instance().createLocalSetting('previouslyViewedFiles', []);
1021
+ let previouslyViewedFiles = previouslyViewedFilesSetting.get();
1022
+ // Discard old 'previouslyViewedFiles' items that don't have a 'url' property.
1023
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1024
+ previouslyViewedFiles = previouslyViewedFiles.filter((previouslyViewedFile) => 'url' in previouslyViewedFile);
1025
+ // Introduce the new 'resourceTypeName' property on previously viewed files.
1026
+ // Prior to this change we only keyed them based on the URL, but since we
1027
+ // don't know which resource type the given file had, we just assume 'script'
1028
+ // here to keep things simple.
1029
+ for (const previouslyViewedFile of previouslyViewedFiles) {
1030
+ previouslyViewedFile['resourceTypeName'] = 'script';
1031
+ }
1032
+ previouslyViewedFilesSetting.set(previouslyViewedFiles);
1033
+ }
1034
+ updateVersionFrom33To34() {
1035
+ // Introduces the 'isLogpoint' property on stored breakpoints. This information was
1036
+ // previously encoded in the 'condition' itself. This migration leaves the condition
1037
+ // alone but ensures that 'isLogpoint' is accurate for already stored breakpoints.
1038
+ // This enables us to use the 'isLogpoint' property in code.
1039
+ // A separate migration will remove the special encoding from the condition itself
1040
+ // once all refactorings are done.
1041
+ // The prefix/suffix are hardcoded here, since these constants will be removed in
1042
+ // the future.
1043
+ const logpointPrefix = '/** DEVTOOLS_LOGPOINT */ console.log(';
1044
+ const logpointSuffix = ')';
1045
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1046
+ const breakpointsSetting = Settings.instance().createLocalSetting('breakpoints', []);
1047
+ const breakpoints = breakpointsSetting.get();
1048
+ for (const breakpoint of breakpoints) {
1049
+ const isLogpoint = breakpoint.condition.startsWith(logpointPrefix) && breakpoint.condition.endsWith(logpointSuffix);
1050
+ breakpoint['isLogpoint'] = isLogpoint;
1051
+ }
1052
+ breakpointsSetting.set(breakpoints);
1053
+ }
1054
+ updateVersionFrom34To35() {
1055
+ // Uses the 'isLogpoint' property on stored breakpoints to remove the prefix/suffix
1056
+ // from logpoints. This way, we store the entered log point condition as the user
1057
+ // entered it.
1058
+ // The prefix/suffix are hardcoded here, since these constants will be removed in
1059
+ // the future.
1060
+ const logpointPrefix = '/** DEVTOOLS_LOGPOINT */ console.log(';
1061
+ const logpointSuffix = ')';
1062
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1063
+ const breakpointsSetting = Settings.instance().createLocalSetting('breakpoints', []);
1064
+ const breakpoints = breakpointsSetting.get();
1065
+ for (const breakpoint of breakpoints) {
1066
+ const { condition, isLogpoint } = breakpoint;
1067
+ if (isLogpoint) {
1068
+ breakpoint.condition = condition.slice(logpointPrefix.length, condition.length - logpointSuffix.length);
1069
+ }
1070
+ }
1071
+ breakpointsSetting.set(breakpoints);
1072
+ }
1073
+ updateVersionFrom35To36() {
1074
+ // We have changed the default from 'false' to 'true' and this updates the existing setting just for once.
1075
+ Settings.instance().createSetting('showThirdPartyIssues', true).set(true);
1076
+ }
1077
+ updateVersionFrom36To37() {
1078
+ const updateStorage = (storage) => {
1079
+ for (const key of storage.keys()) {
1080
+ const normalizedKey = Settings.normalizeSettingName(key);
1081
+ if (normalizedKey !== key) {
1082
+ const value = storage.get(key);
1083
+ removeSetting({ name: key, storage });
1084
+ storage.set(normalizedKey, value);
1085
+ }
1086
+ }
1087
+ };
1088
+ updateStorage(Settings.instance().globalStorage);
1089
+ updateStorage(Settings.instance().syncedStorage);
1090
+ updateStorage(Settings.instance().localStorage);
1091
+ for (const key of Settings.instance().globalStorage.keys()) {
1092
+ if ((key.startsWith('data-grid-') && key.endsWith('-column-weights')) || key.endsWith('-tab-order') ||
1093
+ key === 'views-location-override' || key === 'closeable-tabs') {
1094
+ const setting = Settings.instance().createSetting(key, {});
1095
+ setting.set(Platform.StringUtilities.toKebabCaseKeys(setting.get()));
1096
+ }
1097
+ if (key.endsWith('-selected-tab')) {
1098
+ const setting = Settings.instance().createSetting(key, '');
1099
+ setting.set(Platform.StringUtilities.toKebabCase(setting.get()));
1100
+ }
1101
+ }
1102
+ }
1103
+ updateVersionFrom37To38() {
1104
+ const getConsoleInsightsEnabledSetting = () => {
1105
+ try {
1106
+ return moduleSetting('console-insights-enabled');
1107
+ }
1108
+ catch {
1109
+ return;
1110
+ }
1111
+ };
1112
+ const consoleInsightsEnabled = getConsoleInsightsEnabledSetting();
1113
+ const onboardingFinished = Settings.instance().createLocalSetting('console-insights-onboarding-finished', false);
1114
+ if (consoleInsightsEnabled && consoleInsightsEnabled.get() === true && onboardingFinished.get() === false) {
1115
+ consoleInsightsEnabled.set(false);
1116
+ }
1117
+ if (consoleInsightsEnabled && consoleInsightsEnabled.get() === false) {
1118
+ onboardingFinished.set(false);
1119
+ }
1120
+ }
1121
+ updateVersionFrom38To39() {
1122
+ const PREFERRED_NETWORK_COND = 'preferred-network-condition';
1123
+ // crrev.com/c/5582013 renamed "Slow 3G" to "3G" and "Fast 3G" => "Slow 4G".
1124
+ // Any users with the old values need to have them moved to avoid breaking DevTools.
1125
+ // Note: we load the raw value via the globalStorage here because
1126
+ // `createSetting` creates if it is not present, and we do not want that;
1127
+ // we only want to update existing, old values.
1128
+ const setting = Settings.instance().globalStorage.get(PREFERRED_NETWORK_COND);
1129
+ if (!setting) {
1130
+ return;
1131
+ }
1132
+ try {
1133
+ const networkSetting = JSON.parse(setting);
1134
+ if (networkSetting.title === 'Slow 3G') {
1135
+ networkSetting.title = '3G';
1136
+ networkSetting.i18nTitleKey = '3G';
1137
+ Settings.instance().globalStorage.set(PREFERRED_NETWORK_COND, JSON.stringify(networkSetting));
1138
+ }
1139
+ else if (networkSetting.title === 'Fast 3G') {
1140
+ networkSetting.title = 'Slow 4G';
1141
+ networkSetting.i18nTitleKey = 'Slow 4G';
1142
+ Settings.instance().globalStorage.set(PREFERRED_NETWORK_COND, JSON.stringify(networkSetting));
1143
+ }
1144
+ }
1145
+ catch {
1146
+ // If parsing the setting threw, it's in some invalid state, so remove it.
1147
+ Settings.instance().globalStorage.remove(PREFERRED_NETWORK_COND);
1148
+ }
1149
+ }
1150
+ /**
1151
+ * There are two related migrations here for handling network throttling persistence:
1152
+ * 1. Go through all user custom throttling conditions and add a `key` property.
1153
+ * 2. If the user has a 'preferred-network-condition' setting, take the value
1154
+ * of that and set the right key for the new 'active-network-condition-key'
1155
+ * setting. Then, remove the now-obsolete 'preferred-network-condition'
1156
+ * setting.
1157
+ */
1158
+ updateVersionFrom39To40() {
1159
+ const hasCustomNetworkConditionsSetting = () => {
1160
+ try {
1161
+ // this will error if it does not exist
1162
+ moduleSetting('custom-network-conditions');
1163
+ return true;
1164
+ }
1165
+ catch {
1166
+ return false;
1167
+ }
1168
+ };
1169
+ if (hasCustomNetworkConditionsSetting()) {
1170
+ /**
1171
+ * We added keys to custom network throttling conditions in M140, so we
1172
+ * need to go through any existing profiles the user has and add the key to
1173
+ * them.
1174
+ * We can't use the SDK.NetworkManager.Condition here as it would be a
1175
+ * circular dependency. All that matters is that these conditions are
1176
+ * objects, and we need to set the right key on each one. The actual keys &
1177
+ * values in the object are not important.
1178
+ */
1179
+ const conditionsSetting = moduleSetting('custom-network-conditions');
1180
+ const customConditions = conditionsSetting.get();
1181
+ if (customConditions?.length > 0) {
1182
+ customConditions.forEach((condition, i) => {
1183
+ // This could be run multiple times, make sure that we don't override any
1184
+ // existing keys.
1185
+ if (condition.key) {
1186
+ return;
1187
+ }
1188
+ // The format of this key is important: see
1189
+ // SDK.NetworkManager.UserDefinedThrottlingConditionKey
1190
+ condition.key = `USER_CUSTOM_SETTING_${i + 1}`;
1191
+ });
1192
+ conditionsSetting.set(customConditions);
1193
+ }
1194
+ }
1195
+ // Additionally, we need to make sure we persist the right throttling for
1196
+ // users who have a preferred-network-condition set.
1197
+ const PREFERRED_NETWORK_COND_SETTING = 'preferred-network-condition';
1198
+ // We shipped a change to how we persist network throttling conditions and
1199
+ // added a `key` property rather than rely on any user visible string which
1200
+ // is more likely to change. This migration step tries to update the
1201
+ // setting for users, or removes it if we fail, so they start fresh next
1202
+ // time they load DevTools.
1203
+ const setting = Settings.instance().globalStorage.get(PREFERRED_NETWORK_COND_SETTING);
1204
+ if (!setting) {
1205
+ return;
1206
+ }
1207
+ // The keys here are the UI Strings as of July 2025 (shipped in M139).
1208
+ // This migration shipped in M140. The values are the values of the
1209
+ // `PredefinedThrottlingConditionKey` in SDK.NetworkManager.
1210
+ const UI_STRING_TO_NEW_KEY = {
1211
+ 'Fast 4G': 'SPEED_FAST_4G',
1212
+ 'Slow 4G': 'SPEED_SLOW_4G',
1213
+ '3G': 'SPEED_3G',
1214
+ 'No throttling': 'NO_THROTTLING',
1215
+ Offline: 'OFFLINE'
1216
+ };
1217
+ try {
1218
+ const networkSetting = JSON.parse(setting);
1219
+ if (networkSetting.i18nTitleKey && UI_STRING_TO_NEW_KEY.hasOwnProperty(networkSetting.i18nTitleKey)) {
1220
+ const key = UI_STRING_TO_NEW_KEY[networkSetting.i18nTitleKey];
1221
+ // The second argument is the default value, so it's important that we
1222
+ // set this to the default, and then update it to the new key.
1223
+ const newSetting = Settings.instance().createSetting('active-network-condition-key', 'NO_THROTTLING');
1224
+ newSetting.set(key);
1225
+ }
1226
+ }
1227
+ finally {
1228
+ // This setting is now not used, so we can remove it.
1229
+ Settings.instance().globalStorage.remove(PREFERRED_NETWORK_COND_SETTING);
1230
+ }
1231
+ }
1232
+ /*
1233
+ * Any new migration should be added before this comment.
1234
+ *
1235
+ * IMPORTANT: Migrations must be idempotent, since they may be applied
1236
+ * multiple times! E.g. when renaming a setting one has to check that the
1237
+ * a setting with the new name does not yet exist.
1238
+ * ----------------------------------------------------------------------- */
1239
+ migrateSettingsFromLocalStorage() {
1240
+ // This step migrates all the settings except for the ones below into the browser profile.
1241
+ const localSettings = new Set([
1242
+ 'advancedSearchConfig',
1243
+ 'breakpoints',
1244
+ 'consoleHistory',
1245
+ 'domBreakpoints',
1246
+ 'eventListenerBreakpoints',
1247
+ 'fileSystemMapping',
1248
+ 'lastSelectedSourcesSidebarPaneTab',
1249
+ 'previouslyViewedFiles',
1250
+ 'savedURLs',
1251
+ 'watchExpressions',
1252
+ 'workspaceExcludedFolders',
1253
+ 'xhrBreakpoints',
1254
+ ]);
1255
+ if (!window.localStorage) {
1256
+ return;
1257
+ }
1258
+ for (const key in window.localStorage) {
1259
+ if (localSettings.has(key)) {
1260
+ continue;
1261
+ }
1262
+ const value = window.localStorage[key];
1263
+ window.localStorage.removeItem(key);
1264
+ Settings.instance().globalStorage.set(key, value);
1265
+ }
1266
+ }
1267
+ clearBreakpointsWhenTooMany(breakpointsSetting, maxBreakpointsCount) {
1268
+ // If there are too many breakpoints in a storage, it is likely due to a recent bug that caused
1269
+ // periodical breakpoints duplication leading to inspector slowness.
1270
+ if (breakpointsSetting.get().length > maxBreakpointsCount) {
1271
+ breakpointsSetting.set([]);
1272
+ }
1273
+ }
1274
+ }
1275
+ export function moduleSetting(settingName) {
1276
+ return Settings.instance().moduleSetting(settingName);
1277
+ }
1278
+ export function settingForTest(settingName) {
1279
+ return Settings.instance().settingForTest(settingName);
1280
+ }
1281
+ export { getLocalizedSettingsCategory, maybeRemoveSettingExtension, registerSettingExtension, registerSettingsForTest, resetSettings, };