devtools-tracing 1.0.0

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 (397) hide show
  1. package/generate.ts +643 -0
  2. package/index.ts +16 -0
  3. package/lib/front_end/core/common/App.ts +7 -0
  4. package/lib/front_end/core/common/AppProvider.ts +32 -0
  5. package/lib/front_end/core/common/Base64.ts +47 -0
  6. package/lib/front_end/core/common/CharacterIdMap.ts +30 -0
  7. package/lib/front_end/core/common/Color.ts +2506 -0
  8. package/lib/front_end/core/common/ColorConverter.ts +402 -0
  9. package/lib/front_end/core/common/ColorUtils.ts +252 -0
  10. package/lib/front_end/core/common/Console.ts +114 -0
  11. package/lib/front_end/core/common/Debouncer.ts +15 -0
  12. package/lib/front_end/core/common/EventTarget.ts +52 -0
  13. package/lib/front_end/core/common/Gzip.ts +74 -0
  14. package/lib/front_end/core/common/JavaScriptMetaData.ts +29 -0
  15. package/lib/front_end/core/common/Lazy.ts +31 -0
  16. package/lib/front_end/core/common/Linkifier.ts +55 -0
  17. package/lib/front_end/core/common/MapWithDefault.ts +26 -0
  18. package/lib/front_end/core/common/Mutex.ts +55 -0
  19. package/lib/front_end/core/common/Object.ts +145 -0
  20. package/lib/front_end/core/common/ParsedURL.ts +554 -0
  21. package/lib/front_end/core/common/Progress.ts +180 -0
  22. package/lib/front_end/core/common/QueryParamHandler.ts +7 -0
  23. package/lib/front_end/core/common/ResolverBase.ts +85 -0
  24. package/lib/front_end/core/common/ResourceType.ts +588 -0
  25. package/lib/front_end/core/common/ReturnToPanel.ts +17 -0
  26. package/lib/front_end/core/common/Revealer.ts +192 -0
  27. package/lib/front_end/core/common/Runnable.ts +41 -0
  28. package/lib/front_end/core/common/SegmentedRange.ts +87 -0
  29. package/lib/front_end/core/common/SettingRegistration.ts +339 -0
  30. package/lib/front_end/core/common/Settings.ts +1497 -0
  31. package/lib/front_end/core/common/SimpleHistoryManager.ts +124 -0
  32. package/lib/front_end/core/common/StringOutputStream.ts +26 -0
  33. package/lib/front_end/core/common/TextDictionary.ts +48 -0
  34. package/lib/front_end/core/common/Throttler.ts +99 -0
  35. package/lib/front_end/core/common/Trie.ts +152 -0
  36. package/lib/front_end/core/common/Worker.ts +60 -0
  37. package/lib/front_end/core/common/common.ts +81 -0
  38. package/lib/front_end/core/host/AidaClient.ts +733 -0
  39. package/lib/front_end/core/host/GdpClient.ts +316 -0
  40. package/lib/front_end/core/host/InspectorFrontendHost.ts +648 -0
  41. package/lib/front_end/core/host/InspectorFrontendHostAPI.ts +551 -0
  42. package/lib/front_end/core/host/Platform.ts +76 -0
  43. package/lib/front_end/core/host/ResourceLoader.ts +282 -0
  44. package/lib/front_end/core/host/UserMetrics.ts +1230 -0
  45. package/lib/front_end/core/host/host.ts +23 -0
  46. package/lib/front_end/core/i18n/ByteUtilities.ts +82 -0
  47. package/lib/front_end/core/i18n/DevToolsLocale.ts +87 -0
  48. package/lib/front_end/core/i18n/NumberFormatter.ts +82 -0
  49. package/lib/front_end/core/i18n/i18n.ts +17 -0
  50. package/lib/front_end/core/i18n/i18nImpl.ts +204 -0
  51. package/lib/front_end/core/i18n/i18nTypes.ts +10 -0
  52. package/lib/front_end/core/i18n/locales.js +14 -0
  53. package/lib/front_end/core/i18n/time-utilities.ts +174 -0
  54. package/lib/front_end/core/platform/ArrayUtilities.ts +271 -0
  55. package/lib/front_end/core/platform/Brand.ts +23 -0
  56. package/lib/front_end/core/platform/Constructor.ts +10 -0
  57. package/lib/front_end/core/platform/DOMUtilities.ts +138 -0
  58. package/lib/front_end/core/platform/DateUtilities.ts +15 -0
  59. package/lib/front_end/core/platform/DevToolsPath.ts +53 -0
  60. package/lib/front_end/core/platform/KeyboardUtilities.ts +38 -0
  61. package/lib/front_end/core/platform/MapUtilities.ts +95 -0
  62. package/lib/front_end/core/platform/MimeType.ts +175 -0
  63. package/lib/front_end/core/platform/NumberUtilities.ts +80 -0
  64. package/lib/front_end/core/platform/StringUtilities.ts +588 -0
  65. package/lib/front_end/core/platform/Timing.ts +17 -0
  66. package/lib/front_end/core/platform/TypedArrayUtilities.ts +189 -0
  67. package/lib/front_end/core/platform/TypescriptUtilities.ts +86 -0
  68. package/lib/front_end/core/platform/UIString.ts +39 -0
  69. package/lib/front_end/core/platform/UserVisibleError.ts +28 -0
  70. package/lib/front_end/core/platform/platform.ts +45 -0
  71. package/lib/front_end/core/protocol_client/ConnectionTransport.ts +26 -0
  72. package/lib/front_end/core/protocol_client/InspectorBackend.ts +1050 -0
  73. package/lib/front_end/core/protocol_client/NodeURL.ts +42 -0
  74. package/lib/front_end/core/protocol_client/protocol_client.ts +13 -0
  75. package/lib/front_end/core/root/Runtime.ts +609 -0
  76. package/lib/front_end/core/root/root.ts +6 -0
  77. package/lib/front_end/core/sdk/AccessibilityModel.ts +353 -0
  78. package/lib/front_end/core/sdk/AnimationModel.ts +1041 -0
  79. package/lib/front_end/core/sdk/AutofillModel.ts +184 -0
  80. package/lib/front_end/core/sdk/CPUProfilerModel.ts +148 -0
  81. package/lib/front_end/core/sdk/CPUThrottlingManager.ts +282 -0
  82. package/lib/front_end/core/sdk/CSSContainerQuery.ts +139 -0
  83. package/lib/front_end/core/sdk/CSSFontFace.ts +40 -0
  84. package/lib/front_end/core/sdk/CSSLayer.ts +30 -0
  85. package/lib/front_end/core/sdk/CSSMatchedStyles.ts +1646 -0
  86. package/lib/front_end/core/sdk/CSSMedia.ts +121 -0
  87. package/lib/front_end/core/sdk/CSSMetadata.ts +1647 -0
  88. package/lib/front_end/core/sdk/CSSModel.ts +1128 -0
  89. package/lib/front_end/core/sdk/CSSProperty.ts +384 -0
  90. package/lib/front_end/core/sdk/CSSPropertyParser.ts +681 -0
  91. package/lib/front_end/core/sdk/CSSPropertyParserMatchers.ts +1395 -0
  92. package/lib/front_end/core/sdk/CSSQuery.ts +72 -0
  93. package/lib/front_end/core/sdk/CSSRule.ts +465 -0
  94. package/lib/front_end/core/sdk/CSSScope.ts +30 -0
  95. package/lib/front_end/core/sdk/CSSStartingStyle.ts +29 -0
  96. package/lib/front_end/core/sdk/CSSStyleDeclaration.ts +313 -0
  97. package/lib/front_end/core/sdk/CSSStyleSheetHeader.ts +196 -0
  98. package/lib/front_end/core/sdk/CSSSupports.ts +33 -0
  99. package/lib/front_end/core/sdk/CategorizedBreakpoint.ts +64 -0
  100. package/lib/front_end/core/sdk/ChildTargetManager.ts +314 -0
  101. package/lib/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +62 -0
  102. package/lib/front_end/core/sdk/Connections.ts +293 -0
  103. package/lib/front_end/core/sdk/ConsoleModel.ts +808 -0
  104. package/lib/front_end/core/sdk/ConsoleModelTypes.ts +15 -0
  105. package/lib/front_end/core/sdk/Cookie.ts +319 -0
  106. package/lib/front_end/core/sdk/CookieModel.ts +239 -0
  107. package/lib/front_end/core/sdk/CookieParser.ts +185 -0
  108. package/lib/front_end/core/sdk/DOMDebuggerModel.ts +787 -0
  109. package/lib/front_end/core/sdk/DOMModel.ts +1961 -0
  110. package/lib/front_end/core/sdk/DebuggerModel.ts +1605 -0
  111. package/lib/front_end/core/sdk/EmulationModel.ts +648 -0
  112. package/lib/front_end/core/sdk/EnhancedTracesParser.ts +515 -0
  113. package/lib/front_end/core/sdk/EventBreakpointsModel.ts +183 -0
  114. package/lib/front_end/core/sdk/FrameAssociated.ts +11 -0
  115. package/lib/front_end/core/sdk/FrameManager.ts +259 -0
  116. package/lib/front_end/core/sdk/HeapProfilerModel.ts +225 -0
  117. package/lib/front_end/core/sdk/HttpReasonPhraseStrings.ts +77 -0
  118. package/lib/front_end/core/sdk/IOModel.ts +91 -0
  119. package/lib/front_end/core/sdk/IsolateManager.ts +257 -0
  120. package/lib/front_end/core/sdk/IssuesModel.ts +70 -0
  121. package/lib/front_end/core/sdk/LayerTreeBase.ts +169 -0
  122. package/lib/front_end/core/sdk/LogModel.ts +56 -0
  123. package/lib/front_end/core/sdk/NetworkManager.ts +2823 -0
  124. package/lib/front_end/core/sdk/NetworkRequest.ts +2253 -0
  125. package/lib/front_end/core/sdk/OverlayColorGenerator.ts +52 -0
  126. package/lib/front_end/core/sdk/OverlayModel.ts +1011 -0
  127. package/lib/front_end/core/sdk/OverlayPersistentHighlighter.ts +522 -0
  128. package/lib/front_end/core/sdk/PageLoad.ts +35 -0
  129. package/lib/front_end/core/sdk/PageResourceLoader.ts +435 -0
  130. package/lib/front_end/core/sdk/PaintProfiler.ts +110 -0
  131. package/lib/front_end/core/sdk/PerformanceMetricsModel.ts +84 -0
  132. package/lib/front_end/core/sdk/PreloadingModel.ts +863 -0
  133. package/lib/front_end/core/sdk/RehydratingConnection.ts +386 -0
  134. package/lib/front_end/core/sdk/RehydratingObject.ts +66 -0
  135. package/lib/front_end/core/sdk/RemoteObject.ts +1160 -0
  136. package/lib/front_end/core/sdk/Resource.ts +232 -0
  137. package/lib/front_end/core/sdk/ResourceTreeModel.ts +1160 -0
  138. package/lib/front_end/core/sdk/RuntimeModel.ts +732 -0
  139. package/lib/front_end/core/sdk/SDKModel.ts +65 -0
  140. package/lib/front_end/core/sdk/ScopeTreeCache.ts +45 -0
  141. package/lib/front_end/core/sdk/ScreenCaptureModel.ts +255 -0
  142. package/lib/front_end/core/sdk/Script.ts +534 -0
  143. package/lib/front_end/core/sdk/SecurityOriginManager.ts +76 -0
  144. package/lib/front_end/core/sdk/ServerSentEvents.ts +80 -0
  145. package/lib/front_end/core/sdk/ServerSentEventsProtocol.ts +122 -0
  146. package/lib/front_end/core/sdk/ServerTiming.ts +260 -0
  147. package/lib/front_end/core/sdk/ServiceWorkerCacheModel.ts +377 -0
  148. package/lib/front_end/core/sdk/ServiceWorkerManager.ts +605 -0
  149. package/lib/front_end/core/sdk/SourceMap.ts +867 -0
  150. package/lib/front_end/core/sdk/SourceMapCache.ts +54 -0
  151. package/lib/front_end/core/sdk/SourceMapFunctionRanges.ts +156 -0
  152. package/lib/front_end/core/sdk/SourceMapManager.ts +239 -0
  153. package/lib/front_end/core/sdk/SourceMapScopeChainEntry.ts +189 -0
  154. package/lib/front_end/core/sdk/SourceMapScopesInfo.ts +508 -0
  155. package/lib/front_end/core/sdk/StorageBucketsModel.ts +204 -0
  156. package/lib/front_end/core/sdk/StorageKeyManager.ts +98 -0
  157. package/lib/front_end/core/sdk/Target.ts +332 -0
  158. package/lib/front_end/core/sdk/TargetManager.ts +453 -0
  159. package/lib/front_end/core/sdk/TraceObject.ts +61 -0
  160. package/lib/front_end/core/sdk/WebAuthnModel.ts +104 -0
  161. package/lib/front_end/core/sdk/sdk.ts +174 -0
  162. package/lib/front_end/entrypoints/formatter_worker/FormatterActions.ts +59 -0
  163. package/lib/front_end/generated/InspectorBackendCommands.js +1617 -0
  164. package/lib/front_end/generated/SupportedCSSProperties.js +7512 -0
  165. package/lib/front_end/generated/protocol-proxy-api.d.ts +5022 -0
  166. package/lib/front_end/generated/protocol.ts +22014 -0
  167. package/lib/front_end/models/cpu_profile/CPUProfileDataModel.ts +571 -0
  168. package/lib/front_end/models/cpu_profile/ProfileTreeModel.ts +103 -0
  169. package/lib/front_end/models/cpu_profile/cpu_profile.ts +11 -0
  170. package/lib/front_end/models/formatter/FormatterWorkerPool.ts +219 -0
  171. package/lib/front_end/models/formatter/ScriptFormatter.ts +112 -0
  172. package/lib/front_end/models/formatter/formatter.ts +8 -0
  173. package/lib/front_end/models/text_utils/CodeMirrorUtils.ts +37 -0
  174. package/lib/front_end/models/text_utils/ContentData.ts +199 -0
  175. package/lib/front_end/models/text_utils/ContentProvider.ts +68 -0
  176. package/lib/front_end/models/text_utils/StaticContentProvider.ts +49 -0
  177. package/lib/front_end/models/text_utils/StreamingContentData.ts +108 -0
  178. package/lib/front_end/models/text_utils/Text.ts +90 -0
  179. package/lib/front_end/models/text_utils/TextCursor.ts +44 -0
  180. package/lib/front_end/models/text_utils/TextRange.ts +266 -0
  181. package/lib/front_end/models/text_utils/TextUtils.ts +401 -0
  182. package/lib/front_end/models/text_utils/WasmDisassembly.ts +87 -0
  183. package/lib/front_end/models/text_utils/text_utils.ts +27 -0
  184. package/lib/front_end/models/trace/EntityMapper.ts +141 -0
  185. package/lib/front_end/models/trace/EventsSerializer.ts +101 -0
  186. package/lib/front_end/models/trace/LanternComputationData.ts +438 -0
  187. package/lib/front_end/models/trace/ModelImpl.ts +236 -0
  188. package/lib/front_end/models/trace/Name.ts +136 -0
  189. package/lib/front_end/models/trace/Processor.ts +652 -0
  190. package/lib/front_end/models/trace/Styles.ts +1138 -0
  191. package/lib/front_end/models/trace/extras/FilmStrip.ts +78 -0
  192. package/lib/front_end/models/trace/extras/MainThreadActivity.ts +86 -0
  193. package/lib/front_end/models/trace/extras/ScriptDuplication.ts +236 -0
  194. package/lib/front_end/models/trace/extras/StackTraceForEvent.ts +203 -0
  195. package/lib/front_end/models/trace/extras/ThirdParties.ts +164 -0
  196. package/lib/front_end/models/trace/extras/TraceFilter.ts +62 -0
  197. package/lib/front_end/models/trace/extras/TraceTree.ts +701 -0
  198. package/lib/front_end/models/trace/extras/extras.ts +11 -0
  199. package/lib/front_end/models/trace/handlers/AnimationFramesHandler.ts +128 -0
  200. package/lib/front_end/models/trace/handlers/AnimationHandler.ts +36 -0
  201. package/lib/front_end/models/trace/handlers/AsyncJSCallsHandler.ts +239 -0
  202. package/lib/front_end/models/trace/handlers/AuctionWorkletsHandler.ts +183 -0
  203. package/lib/front_end/models/trace/handlers/DOMStatsHandler.ts +31 -0
  204. package/lib/front_end/models/trace/handlers/ExtensionTraceDataHandler.ts +306 -0
  205. package/lib/front_end/models/trace/handlers/FlowsHandler.ts +175 -0
  206. package/lib/front_end/models/trace/handlers/FramesHandler.ts +571 -0
  207. package/lib/front_end/models/trace/handlers/GPUHandler.ts +50 -0
  208. package/lib/front_end/models/trace/handlers/ImagePaintingHandler.ts +183 -0
  209. package/lib/front_end/models/trace/handlers/InitiatorsHandler.ts +193 -0
  210. package/lib/front_end/models/trace/handlers/InvalidationsHandler.ts +168 -0
  211. package/lib/front_end/models/trace/handlers/LargestImagePaintHandler.ts +109 -0
  212. package/lib/front_end/models/trace/handlers/LargestTextPaintHandler.ts +35 -0
  213. package/lib/front_end/models/trace/handlers/LayerTreeHandler.ts +123 -0
  214. package/lib/front_end/models/trace/handlers/LayoutShiftsHandler.ts +573 -0
  215. package/lib/front_end/models/trace/handlers/MemoryHandler.ts +31 -0
  216. package/lib/front_end/models/trace/handlers/MetaHandler.ts +525 -0
  217. package/lib/front_end/models/trace/handlers/ModelHandlers.ts +34 -0
  218. package/lib/front_end/models/trace/handlers/NetworkRequestsHandler.ts +672 -0
  219. package/lib/front_end/models/trace/handlers/PageFramesHandler.ts +52 -0
  220. package/lib/front_end/models/trace/handlers/PageLoadMetricsHandler.ts +460 -0
  221. package/lib/front_end/models/trace/handlers/RendererHandler.ts +428 -0
  222. package/lib/front_end/models/trace/handlers/SamplesHandler.ts +271 -0
  223. package/lib/front_end/models/trace/handlers/ScreenshotsHandler.ts +122 -0
  224. package/lib/front_end/models/trace/handlers/ScriptsHandler.ts +336 -0
  225. package/lib/front_end/models/trace/handlers/SelectorStatsHandler.ts +110 -0
  226. package/lib/front_end/models/trace/handlers/Threads.ts +139 -0
  227. package/lib/front_end/models/trace/handlers/UserInteractionsHandler.ts +400 -0
  228. package/lib/front_end/models/trace/handlers/UserTimingsHandler.ts +233 -0
  229. package/lib/front_end/models/trace/handlers/WarningsHandler.ts +162 -0
  230. package/lib/front_end/models/trace/handlers/WorkersHandler.ts +45 -0
  231. package/lib/front_end/models/trace/handlers/handlers.ts +8 -0
  232. package/lib/front_end/models/trace/handlers/helpers.ts +196 -0
  233. package/lib/front_end/models/trace/handlers/types.ts +75 -0
  234. package/lib/front_end/models/trace/helpers/Extensions.ts +54 -0
  235. package/lib/front_end/models/trace/helpers/Network.ts +129 -0
  236. package/lib/front_end/models/trace/helpers/SamplesIntegrator.ts +544 -0
  237. package/lib/front_end/models/trace/helpers/SyntheticEvents.ts +87 -0
  238. package/lib/front_end/models/trace/helpers/Timing.ts +248 -0
  239. package/lib/front_end/models/trace/helpers/Trace.ts +928 -0
  240. package/lib/front_end/models/trace/helpers/TreeHelpers.ts +320 -0
  241. package/lib/front_end/models/trace/helpers/helpers.ts +11 -0
  242. package/lib/front_end/models/trace/insights/CLSCulprits.ts +668 -0
  243. package/lib/front_end/models/trace/insights/Cache.ts +269 -0
  244. package/lib/front_end/models/trace/insights/Common.ts +453 -0
  245. package/lib/front_end/models/trace/insights/DOMSize.ts +223 -0
  246. package/lib/front_end/models/trace/insights/DocumentLatency.ts +319 -0
  247. package/lib/front_end/models/trace/insights/DuplicatedJavaScript.ts +126 -0
  248. package/lib/front_end/models/trace/insights/FontDisplay.ts +119 -0
  249. package/lib/front_end/models/trace/insights/ForcedReflow.ts +220 -0
  250. package/lib/front_end/models/trace/insights/INPBreakdown.ts +171 -0
  251. package/lib/front_end/models/trace/insights/ImageDelivery.ts +348 -0
  252. package/lib/front_end/models/trace/insights/LCPBreakdown.ts +268 -0
  253. package/lib/front_end/models/trace/insights/LCPDiscovery.ts +237 -0
  254. package/lib/front_end/models/trace/insights/LegacyJavaScript.ts +138 -0
  255. package/lib/front_end/models/trace/insights/Models.ts +22 -0
  256. package/lib/front_end/models/trace/insights/ModernHTTP.ts +257 -0
  257. package/lib/front_end/models/trace/insights/NetworkDependencyTree.ts +726 -0
  258. package/lib/front_end/models/trace/insights/RenderBlocking.ts +257 -0
  259. package/lib/front_end/models/trace/insights/SlowCSSSelector.ts +175 -0
  260. package/lib/front_end/models/trace/insights/Statistics.ts +101 -0
  261. package/lib/front_end/models/trace/insights/ThirdParties.ts +130 -0
  262. package/lib/front_end/models/trace/insights/Viewport.ts +138 -0
  263. package/lib/front_end/models/trace/insights/insights.ts +10 -0
  264. package/lib/front_end/models/trace/insights/types.ts +157 -0
  265. package/lib/front_end/models/trace/lantern/core/LanternError.ts +7 -0
  266. package/lib/front_end/models/trace/lantern/core/NetworkAnalyzer.ts +619 -0
  267. package/lib/front_end/models/trace/lantern/core/core.ts +6 -0
  268. package/lib/front_end/models/trace/lantern/graph/BaseNode.ts +345 -0
  269. package/lib/front_end/models/trace/lantern/graph/CPUNode.ts +80 -0
  270. package/lib/front_end/models/trace/lantern/graph/NetworkNode.ts +101 -0
  271. package/lib/front_end/models/trace/lantern/graph/PageDependencyGraph.ts +636 -0
  272. package/lib/front_end/models/trace/lantern/graph/graph.ts +8 -0
  273. package/lib/front_end/models/trace/lantern/lantern.ts +17 -0
  274. package/lib/front_end/models/trace/lantern/metrics/FirstContentfulPaint.ts +187 -0
  275. package/lib/front_end/models/trace/lantern/metrics/Interactive.ts +88 -0
  276. package/lib/front_end/models/trace/lantern/metrics/LargestContentfulPaint.ts +92 -0
  277. package/lib/front_end/models/trace/lantern/metrics/MaxPotentialFID.ts +72 -0
  278. package/lib/front_end/models/trace/lantern/metrics/Metric.ts +126 -0
  279. package/lib/front_end/models/trace/lantern/metrics/SpeedIndex.ts +126 -0
  280. package/lib/front_end/models/trace/lantern/metrics/TBTUtils.ts +82 -0
  281. package/lib/front_end/models/trace/lantern/metrics/TotalBlockingTime.ts +112 -0
  282. package/lib/front_end/models/trace/lantern/metrics/metrics.ts +12 -0
  283. package/lib/front_end/models/trace/lantern/simulation/ConnectionPool.ts +150 -0
  284. package/lib/front_end/models/trace/lantern/simulation/Constants.ts +46 -0
  285. package/lib/front_end/models/trace/lantern/simulation/DNSCache.ts +61 -0
  286. package/lib/front_end/models/trace/lantern/simulation/SimulationTimingMap.ts +196 -0
  287. package/lib/front_end/models/trace/lantern/simulation/Simulator.ts +556 -0
  288. package/lib/front_end/models/trace/lantern/simulation/TCPConnection.ts +192 -0
  289. package/lib/front_end/models/trace/lantern/simulation/simulation.ts +10 -0
  290. package/lib/front_end/models/trace/lantern/types/Lantern.ts +220 -0
  291. package/lib/front_end/models/trace/lantern/types/types.ts +5 -0
  292. package/lib/front_end/models/trace/trace.ts +33 -0
  293. package/lib/front_end/models/trace/types/Configuration.ts +110 -0
  294. package/lib/front_end/models/trace/types/Extensions.ts +136 -0
  295. package/lib/front_end/models/trace/types/File.ts +281 -0
  296. package/lib/front_end/models/trace/types/Overlays.ts +138 -0
  297. package/lib/front_end/models/trace/types/Timing.ts +30 -0
  298. package/lib/front_end/models/trace/types/TraceEvents.ts +3277 -0
  299. package/lib/front_end/models/trace/types/types.ts +10 -0
  300. package/lib/front_end/third_party/i18n/LICENSE +202 -0
  301. package/lib/front_end/third_party/i18n/README.chromium +15 -0
  302. package/lib/front_end/third_party/i18n/i18n-impl.ts +61 -0
  303. package/lib/front_end/third_party/i18n/i18n.ts +11 -0
  304. package/lib/front_end/third_party/i18n/localized-string-set.ts +129 -0
  305. package/lib/front_end/third_party/intl-messageformat/LICENSE +33 -0
  306. package/lib/front_end/third_party/intl-messageformat/README.chromium +24 -0
  307. package/lib/front_end/third_party/intl-messageformat/intl-messageformat-tsconfig.json +16 -0
  308. package/lib/front_end/third_party/intl-messageformat/intl-messageformat.ts +6 -0
  309. package/lib/front_end/third_party/intl-messageformat/package/LICENSE.md +33 -0
  310. package/lib/front_end/third_party/intl-messageformat/package/README.md +3 -0
  311. package/lib/front_end/third_party/intl-messageformat/package/index.d.ts +6 -0
  312. package/lib/front_end/third_party/intl-messageformat/package/index.d.ts.map +1 -0
  313. package/lib/front_end/third_party/intl-messageformat/package/index.js +13 -0
  314. package/lib/front_end/third_party/intl-messageformat/package/intl-messageformat.esm.d.ts +5 -0
  315. package/lib/front_end/third_party/intl-messageformat/package/intl-messageformat.esm.js +1710 -0
  316. package/lib/front_end/third_party/intl-messageformat/package/intl-messageformat.iife.js +1815 -0
  317. package/lib/front_end/third_party/intl-messageformat/package/lib/index.d.ts +6 -0
  318. package/lib/front_end/third_party/intl-messageformat/package/lib/index.d.ts.map +1 -0
  319. package/lib/front_end/third_party/intl-messageformat/package/lib/index.js +10 -0
  320. package/lib/front_end/third_party/intl-messageformat/package/lib/src/core.d.ts +34 -0
  321. package/lib/front_end/third_party/intl-messageformat/package/lib/src/core.d.ts.map +1 -0
  322. package/lib/front_end/third_party/intl-messageformat/package/lib/src/core.js +229 -0
  323. package/lib/front_end/third_party/intl-messageformat/package/lib/src/error.d.ts +28 -0
  324. package/lib/front_end/third_party/intl-messageformat/package/lib/src/error.d.ts.map +1 -0
  325. package/lib/front_end/third_party/intl-messageformat/package/lib/src/error.js +48 -0
  326. package/lib/front_end/third_party/intl-messageformat/package/lib/src/formatters.d.ts +34 -0
  327. package/lib/front_end/third_party/intl-messageformat/package/lib/src/formatters.d.ts.map +1 -0
  328. package/lib/front_end/third_party/intl-messageformat/package/lib/src/formatters.js +179 -0
  329. package/lib/front_end/third_party/intl-messageformat/package/package.json +42 -0
  330. package/lib/front_end/third_party/intl-messageformat/package/src/core.d.ts +34 -0
  331. package/lib/front_end/third_party/intl-messageformat/package/src/core.d.ts.map +1 -0
  332. package/lib/front_end/third_party/intl-messageformat/package/src/core.js +230 -0
  333. package/lib/front_end/third_party/intl-messageformat/package/src/error.d.ts +28 -0
  334. package/lib/front_end/third_party/intl-messageformat/package/src/error.d.ts.map +1 -0
  335. package/lib/front_end/third_party/intl-messageformat/package/src/error.js +51 -0
  336. package/lib/front_end/third_party/intl-messageformat/package/src/formatters.d.ts +34 -0
  337. package/lib/front_end/third_party/intl-messageformat/package/src/formatters.d.ts.map +1 -0
  338. package/lib/front_end/third_party/intl-messageformat/package/src/formatters.js +182 -0
  339. package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/error.d.ts +79 -0
  340. package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/index.d.ts +15 -0
  341. package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/parser.d.ts +153 -0
  342. package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/types.d.ts +139 -0
  343. package/lib/front_end/third_party/legacy-javascript/LICENSE +202 -0
  344. package/lib/front_end/third_party/legacy-javascript/README.chromium +13 -0
  345. package/lib/front_end/third_party/legacy-javascript/legacy-javascript-tsconfig.json +8 -0
  346. package/lib/front_end/third_party/legacy-javascript/legacy-javascript.ts +3 -0
  347. package/lib/front_end/third_party/legacy-javascript/lib/legacy-javascript.d.ts +18 -0
  348. package/lib/front_end/third_party/legacy-javascript/lib/legacy-javascript.js +943 -0
  349. package/lib/front_end/third_party/legacy-javascript/package.json +8 -0
  350. package/lib/front_end/third_party/legacy-javascript/rebuild.sh +9 -0
  351. package/lib/front_end/third_party/third-party-web/LICENSE +20 -0
  352. package/lib/front_end/third_party/third-party-web/README.chromium +13 -0
  353. package/lib/front_end/third_party/third-party-web/lib/nostats-subset.d.ts +2 -0
  354. package/lib/front_end/third_party/third-party-web/lib/nostats-subset.js +149 -0
  355. package/lib/front_end/third_party/third-party-web/package/LICENSE +20 -0
  356. package/lib/front_end/third_party/third-party-web/package/README.md +929 -0
  357. package/lib/front_end/third_party/third-party-web/package/dist/entities-httparchive-nostats.json +1 -0
  358. package/lib/front_end/third_party/third-party-web/package/dist/entities-httparchive.json +1 -0
  359. package/lib/front_end/third_party/third-party-web/package/dist/entities-nostats.json +1 -0
  360. package/lib/front_end/third_party/third-party-web/package/dist/entities.json +1 -0
  361. package/lib/front_end/third_party/third-party-web/package/facades.md +46 -0
  362. package/lib/front_end/third_party/third-party-web/package/httparchive-nostats-subset.d.ts +1 -0
  363. package/lib/front_end/third_party/third-party-web/package/httparchive-nostats-subset.js +1 -0
  364. package/lib/front_end/third_party/third-party-web/package/httparchive-subset.d.ts +1 -0
  365. package/lib/front_end/third_party/third-party-web/package/httparchive-subset.js +1 -0
  366. package/lib/front_end/third_party/third-party-web/package/lib/__snapshots__/index.test.js.snap +1006 -0
  367. package/lib/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.js +139 -0
  368. package/lib/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.test.js +44 -0
  369. package/lib/front_end/third_party/third-party-web/package/lib/entities.test.js +27 -0
  370. package/lib/front_end/third_party/third-party-web/package/lib/index.d.ts +34 -0
  371. package/lib/front_end/third_party/third-party-web/package/lib/index.js +3 -0
  372. package/lib/front_end/third_party/third-party-web/package/lib/index.test.js +246 -0
  373. package/lib/front_end/third_party/third-party-web/package/lib/markdown/faqs.partial.md +36 -0
  374. package/lib/front_end/third_party/third-party-web/package/lib/markdown/goals.partial.md +9 -0
  375. package/lib/front_end/third_party/third-party-web/package/lib/markdown/methodology.partial.md +5 -0
  376. package/lib/front_end/third_party/third-party-web/package/lib/markdown/template.md +151 -0
  377. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-02-01.md +1 -0
  378. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-03-01.md +1 -0
  379. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-05-06.md +1 -0
  380. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-05-13.md +14 -0
  381. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2021-01-01.md +1 -0
  382. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2024-07-01.md +3 -0
  383. package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.d.ts +1 -0
  384. package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.js +3 -0
  385. package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive.d.ts +1 -0
  386. package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive.js +3 -0
  387. package/lib/front_end/third_party/third-party-web/package/lib/subsets/nostats.d.ts +1 -0
  388. package/lib/front_end/third_party/third-party-web/package/lib/subsets/nostats.js +3 -0
  389. package/lib/front_end/third_party/third-party-web/package/nostats-subset.d.ts +1 -0
  390. package/lib/front_end/third_party/third-party-web/package/nostats-subset.js +1 -0
  391. package/lib/front_end/third_party/third-party-web/package/package.json +46 -0
  392. package/lib/front_end/third_party/third-party-web/package.json +8 -0
  393. package/lib/front_end/third_party/third-party-web/rebuild.sh +13 -0
  394. package/lib/front_end/third_party/third-party-web/third-party-web-tsconfig.json +8 -0
  395. package/lib/front_end/third_party/third-party-web/third-party-web.ts +3 -0
  396. package/package.json +24 -0
  397. package/patches/chrome-devtools-frontend+1.0.1533544.patch +187 -0
@@ -0,0 +1,648 @@
1
+ // Copyright 2017 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
+
5
+ import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
6
+ import * as Protocol from '../../generated/protocol.js';
7
+ import * as Common from '../common/common.js';
8
+
9
+ import {CSSModel} from './CSSModel.js';
10
+ import {MultitargetNetworkManager} from './NetworkManager.js';
11
+ import {Events, OverlayModel} from './OverlayModel.js';
12
+ import {SDKModel} from './SDKModel.js';
13
+ import {Capability, type Target} from './Target.js';
14
+
15
+ export const enum DataSaverOverride {
16
+ UNSET = 'unset',
17
+ ENABLED = 'enabled',
18
+ DISABLED = 'disabled',
19
+ }
20
+
21
+ export class EmulationModel extends SDKModel<void> {
22
+ readonly #emulationAgent: ProtocolProxyApi.EmulationApi;
23
+ readonly #deviceOrientationAgent: ProtocolProxyApi.DeviceOrientationApi;
24
+ #cssModel: CSSModel|null;
25
+ readonly #overlayModel: OverlayModel|null;
26
+ readonly #mediaConfiguration: Map<string, string>;
27
+ #cpuPressureEnabled: boolean;
28
+ #touchEnabled: boolean;
29
+ #touchMobile: boolean;
30
+ #touchEmulationAllowed: boolean;
31
+ #customTouchEnabled: boolean;
32
+ #touchConfiguration: {
33
+ enabled: boolean,
34
+ configuration: Protocol.Emulation.SetEmitTouchEventsForMouseRequestConfiguration,
35
+ };
36
+
37
+ constructor(target: Target) {
38
+ super(target);
39
+ this.#emulationAgent = target.emulationAgent();
40
+ this.#deviceOrientationAgent = target.deviceOrientationAgent();
41
+ this.#cssModel = target.model(CSSModel);
42
+ this.#overlayModel = target.model(OverlayModel);
43
+ if (this.#overlayModel) {
44
+ this.#overlayModel.addEventListener(Events.INSPECT_MODE_WILL_BE_TOGGLED, () => {
45
+ void this.updateTouch();
46
+ }, this);
47
+ }
48
+
49
+ const disableJavascriptSetting = Common.Settings.Settings.instance().moduleSetting('java-script-disabled');
50
+ disableJavascriptSetting.addChangeListener(
51
+ async () =>
52
+ await this.#emulationAgent.invoke_setScriptExecutionDisabled({value: disableJavascriptSetting.get()}));
53
+ if (disableJavascriptSetting.get()) {
54
+ void this.#emulationAgent.invoke_setScriptExecutionDisabled({value: true});
55
+ }
56
+
57
+ const touchSetting = Common.Settings.Settings.instance().moduleSetting('emulation.touch');
58
+ touchSetting.addChangeListener(() => {
59
+ const settingValue = touchSetting.get();
60
+
61
+ void this.overrideEmulateTouch(settingValue === 'force');
62
+ });
63
+
64
+ const idleDetectionSetting = Common.Settings.Settings.instance().moduleSetting('emulation.idle-detection');
65
+ idleDetectionSetting.addChangeListener(async () => {
66
+ const settingValue = idleDetectionSetting.get();
67
+ if (settingValue === 'none') {
68
+ await this.clearIdleOverride();
69
+ return;
70
+ }
71
+
72
+ const emulationParams = (JSON.parse(settingValue) as {
73
+ isUserActive: boolean,
74
+ isScreenUnlocked: boolean,
75
+ });
76
+ await this.setIdleOverride(emulationParams);
77
+ });
78
+
79
+ const cpuPressureDetectionSetting = Common.Settings.Settings.instance().moduleSetting('emulation.cpu-pressure');
80
+ cpuPressureDetectionSetting.addChangeListener(async () => {
81
+ const settingValue = cpuPressureDetectionSetting.get();
82
+
83
+ if (settingValue === 'none') {
84
+ await this.setPressureSourceOverrideEnabled(false);
85
+ this.#cpuPressureEnabled = false;
86
+ return;
87
+ }
88
+
89
+ if (!this.#cpuPressureEnabled) {
90
+ this.#cpuPressureEnabled = true;
91
+ await this.setPressureSourceOverrideEnabled(true);
92
+ }
93
+
94
+ await this.setPressureStateOverride(settingValue);
95
+ });
96
+
97
+ const mediaTypeSetting = Common.Settings.Settings.instance().moduleSetting<string>('emulated-css-media');
98
+ const mediaFeatureColorGamutSetting =
99
+ Common.Settings.Settings.instance().moduleSetting<string>('emulated-css-media-feature-color-gamut');
100
+ const mediaFeaturePrefersColorSchemeSetting =
101
+ Common.Settings.Settings.instance().moduleSetting<string>('emulated-css-media-feature-prefers-color-scheme');
102
+ const mediaFeatureForcedColorsSetting =
103
+ Common.Settings.Settings.instance().moduleSetting('emulated-css-media-feature-forced-colors');
104
+ const mediaFeaturePrefersContrastSetting =
105
+ Common.Settings.Settings.instance().moduleSetting<string>('emulated-css-media-feature-prefers-contrast');
106
+ const mediaFeaturePrefersReducedDataSetting =
107
+ Common.Settings.Settings.instance().moduleSetting<string>('emulated-css-media-feature-prefers-reduced-data');
108
+ const mediaFeaturePrefersReducedTransparencySetting = Common.Settings.Settings.instance().moduleSetting<string>(
109
+ 'emulated-css-media-feature-prefers-reduced-transparency');
110
+ const mediaFeaturePrefersReducedMotionSetting =
111
+ Common.Settings.Settings.instance().moduleSetting<string>('emulated-css-media-feature-prefers-reduced-motion');
112
+ // Note: this uses a different format than what the CDP API expects,
113
+ // because we want to update these values per media type/feature
114
+ // without having to search the `features` array (inefficient) or
115
+ // hardcoding the indices (not readable/maintainable).
116
+ this.#mediaConfiguration = new Map([
117
+ ['type', mediaTypeSetting.get()],
118
+ ['color-gamut', mediaFeatureColorGamutSetting.get()],
119
+ ['prefers-color-scheme', mediaFeaturePrefersColorSchemeSetting.get()],
120
+ ['forced-colors', mediaFeatureForcedColorsSetting.get()],
121
+ ['prefers-contrast', mediaFeaturePrefersContrastSetting.get()],
122
+ ['prefers-reduced-data', mediaFeaturePrefersReducedDataSetting.get()],
123
+ ['prefers-reduced-motion', mediaFeaturePrefersReducedMotionSetting.get()],
124
+ ['prefers-reduced-transparency', mediaFeaturePrefersReducedTransparencySetting.get()],
125
+ ]);
126
+ mediaTypeSetting.addChangeListener(() => {
127
+ this.#mediaConfiguration.set('type', mediaTypeSetting.get());
128
+ void this.updateCssMedia();
129
+ });
130
+ mediaFeatureColorGamutSetting.addChangeListener(() => {
131
+ this.#mediaConfiguration.set('color-gamut', mediaFeatureColorGamutSetting.get());
132
+ void this.updateCssMedia();
133
+ });
134
+ mediaFeaturePrefersColorSchemeSetting.addChangeListener(() => {
135
+ this.#mediaConfiguration.set('prefers-color-scheme', mediaFeaturePrefersColorSchemeSetting.get());
136
+ void this.updateCssMedia();
137
+ });
138
+ mediaFeatureForcedColorsSetting.addChangeListener(() => {
139
+ this.#mediaConfiguration.set('forced-colors', mediaFeatureForcedColorsSetting.get());
140
+ void this.updateCssMedia();
141
+ });
142
+ mediaFeaturePrefersContrastSetting.addChangeListener(() => {
143
+ this.#mediaConfiguration.set('prefers-contrast', mediaFeaturePrefersContrastSetting.get());
144
+ void this.updateCssMedia();
145
+ });
146
+ mediaFeaturePrefersReducedDataSetting.addChangeListener(() => {
147
+ this.#mediaConfiguration.set('prefers-reduced-data', mediaFeaturePrefersReducedDataSetting.get());
148
+ void this.updateCssMedia();
149
+ });
150
+ mediaFeaturePrefersReducedMotionSetting.addChangeListener(() => {
151
+ this.#mediaConfiguration.set('prefers-reduced-motion', mediaFeaturePrefersReducedMotionSetting.get());
152
+ void this.updateCssMedia();
153
+ });
154
+ mediaFeaturePrefersReducedTransparencySetting.addChangeListener(() => {
155
+ this.#mediaConfiguration.set('prefers-reduced-transparency', mediaFeaturePrefersReducedTransparencySetting.get());
156
+ void this.updateCssMedia();
157
+ });
158
+ void this.updateCssMedia();
159
+
160
+ const autoDarkModeSetting = Common.Settings.Settings.instance().moduleSetting('emulate-auto-dark-mode');
161
+ autoDarkModeSetting.addChangeListener(() => {
162
+ const enabled = autoDarkModeSetting.get();
163
+ mediaFeaturePrefersColorSchemeSetting.setDisabled(enabled);
164
+ mediaFeaturePrefersColorSchemeSetting.set(enabled ? 'dark' : '');
165
+ void this.emulateAutoDarkMode(enabled);
166
+ });
167
+ if (autoDarkModeSetting.get()) {
168
+ mediaFeaturePrefersColorSchemeSetting.setDisabled(true);
169
+ mediaFeaturePrefersColorSchemeSetting.set('dark');
170
+ void this.emulateAutoDarkMode(true);
171
+ }
172
+
173
+ const visionDeficiencySetting = Common.Settings.Settings.instance().moduleSetting('emulated-vision-deficiency');
174
+ visionDeficiencySetting.addChangeListener(() => this.emulateVisionDeficiency(visionDeficiencySetting.get()));
175
+ if (visionDeficiencySetting.get()) {
176
+ void this.emulateVisionDeficiency(visionDeficiencySetting.get());
177
+ }
178
+
179
+ const osTextScaleSetting = Common.Settings.Settings.instance().moduleSetting('emulated-os-text-scale');
180
+ osTextScaleSetting.addChangeListener(() => {
181
+ void this.emulateOSTextScale(parseFloat(osTextScaleSetting.get()) || undefined);
182
+ });
183
+ if (osTextScaleSetting.get()) {
184
+ void this.emulateOSTextScale(parseFloat(osTextScaleSetting.get()) || undefined);
185
+ }
186
+
187
+ const localFontsDisabledSetting = Common.Settings.Settings.instance().moduleSetting('local-fonts-disabled');
188
+ localFontsDisabledSetting.addChangeListener(() => this.setLocalFontsDisabled(localFontsDisabledSetting.get()));
189
+ if (localFontsDisabledSetting.get()) {
190
+ this.setLocalFontsDisabled(localFontsDisabledSetting.get());
191
+ }
192
+
193
+ const avifFormatDisabledSetting = Common.Settings.Settings.instance().moduleSetting('avif-format-disabled');
194
+ const webpFormatDisabledSetting = Common.Settings.Settings.instance().moduleSetting('webp-format-disabled');
195
+
196
+ const updateDisabledImageFormats = (): void => {
197
+ const types = [];
198
+ if (avifFormatDisabledSetting.get()) {
199
+ types.push(Protocol.Emulation.DisabledImageType.Avif);
200
+ }
201
+ if (webpFormatDisabledSetting.get()) {
202
+ types.push(Protocol.Emulation.DisabledImageType.Webp);
203
+ }
204
+ this.setDisabledImageTypes(types);
205
+ };
206
+
207
+ avifFormatDisabledSetting.addChangeListener(updateDisabledImageFormats);
208
+ webpFormatDisabledSetting.addChangeListener(updateDisabledImageFormats);
209
+
210
+ if (avifFormatDisabledSetting.get() || webpFormatDisabledSetting.get()) {
211
+ updateDisabledImageFormats();
212
+ }
213
+
214
+ this.#cpuPressureEnabled = false;
215
+ this.#touchEmulationAllowed = true;
216
+ this.#touchEnabled = false;
217
+ this.#touchMobile = false;
218
+ this.#customTouchEnabled = false;
219
+ this.#touchConfiguration = {
220
+ enabled: false,
221
+ configuration: Protocol.Emulation.SetEmitTouchEventsForMouseRequestConfiguration.Mobile,
222
+ };
223
+ }
224
+
225
+ setTouchEmulationAllowed(touchEmulationAllowed: boolean): void {
226
+ this.#touchEmulationAllowed = touchEmulationAllowed;
227
+ }
228
+
229
+ supportsDeviceEmulation(): boolean {
230
+ return this.target().hasAllCapabilities(Capability.DEVICE_EMULATION);
231
+ }
232
+
233
+ async resetPageScaleFactor(): Promise<void> {
234
+ await this.#emulationAgent.invoke_resetPageScaleFactor();
235
+ }
236
+
237
+ async emulateDevice(metrics: Protocol.Page.SetDeviceMetricsOverrideRequest|null): Promise<void> {
238
+ if (metrics) {
239
+ await this.#emulationAgent.invoke_setDeviceMetricsOverride(metrics);
240
+ } else {
241
+ await this.#emulationAgent.invoke_clearDeviceMetricsOverride();
242
+ }
243
+ }
244
+
245
+ overlayModel(): OverlayModel|null {
246
+ return this.#overlayModel;
247
+ }
248
+
249
+ async setPressureSourceOverrideEnabled(enabled: boolean): Promise<void> {
250
+ await this.#emulationAgent.invoke_setPressureSourceOverrideEnabled(
251
+ {source: Protocol.Emulation.PressureSource.Cpu, enabled});
252
+ }
253
+
254
+ async setPressureStateOverride(pressureState: string): Promise<void> {
255
+ await this.#emulationAgent.invoke_setPressureStateOverride({
256
+ source: Protocol.Emulation.PressureSource.Cpu,
257
+ state: pressureState as Protocol.Emulation.PressureState,
258
+ });
259
+ }
260
+
261
+ async emulateLocation(location: Location|null): Promise<void> {
262
+ if (!location) {
263
+ await Promise.all([
264
+ this.#emulationAgent.invoke_clearGeolocationOverride(),
265
+ this.#emulationAgent.invoke_setTimezoneOverride({timezoneId: ''}),
266
+ this.#emulationAgent.invoke_setLocaleOverride({locale: ''}),
267
+ this.#emulationAgent.invoke_setUserAgentOverride(
268
+ {userAgent: MultitargetNetworkManager.instance().currentUserAgent()}),
269
+ ]);
270
+ } else if (location.unavailable) {
271
+ await Promise.all([
272
+ this.#emulationAgent.invoke_setGeolocationOverride({}),
273
+ this.#emulationAgent.invoke_setTimezoneOverride({timezoneId: ''}),
274
+ this.#emulationAgent.invoke_setLocaleOverride({locale: ''}),
275
+ this.#emulationAgent.invoke_setUserAgentOverride(
276
+ {userAgent: MultitargetNetworkManager.instance().currentUserAgent()}),
277
+ ]);
278
+ } else {
279
+ function processEmulationResult(errorType: string, result: Protocol.ProtocolResponseWithError): Promise<void> {
280
+ const errorMessage = result.getError();
281
+ if (errorMessage) {
282
+ return Promise.reject({
283
+ type: errorType,
284
+ message: errorMessage,
285
+ });
286
+ }
287
+ return Promise.resolve();
288
+ }
289
+
290
+ await Promise.all([
291
+ this.#emulationAgent
292
+ .invoke_setGeolocationOverride({
293
+ latitude: location.latitude,
294
+ longitude: location.longitude,
295
+ accuracy: location.accuracy,
296
+ })
297
+ .then(result => processEmulationResult('emulation-set-location', result)),
298
+ this.#emulationAgent
299
+ .invoke_setTimezoneOverride({
300
+ timezoneId: location.timezoneId,
301
+ })
302
+ .then(result => processEmulationResult('emulation-set-timezone', result)),
303
+ this.#emulationAgent
304
+ .invoke_setLocaleOverride({
305
+ locale: location.locale,
306
+ })
307
+ .then(result => processEmulationResult('emulation-set-locale', result)),
308
+ this.#emulationAgent
309
+ .invoke_setUserAgentOverride({
310
+ userAgent: MultitargetNetworkManager.instance().currentUserAgent(),
311
+ acceptLanguage: location.locale,
312
+ })
313
+ .then(result => processEmulationResult('emulation-set-user-agent', result)),
314
+ ]);
315
+ }
316
+ }
317
+
318
+ async emulateDeviceOrientation(deviceOrientation: DeviceOrientation|null): Promise<void> {
319
+ if (deviceOrientation) {
320
+ await this.#deviceOrientationAgent.invoke_setDeviceOrientationOverride(
321
+ {alpha: deviceOrientation.alpha, beta: deviceOrientation.beta, gamma: deviceOrientation.gamma});
322
+ } else {
323
+ await this.#deviceOrientationAgent.invoke_clearDeviceOrientationOverride();
324
+ }
325
+ }
326
+
327
+ async setIdleOverride(emulationParams: {
328
+ isUserActive: boolean,
329
+ isScreenUnlocked: boolean,
330
+ }): Promise<void> {
331
+ await this.#emulationAgent.invoke_setIdleOverride(emulationParams);
332
+ }
333
+
334
+ async clearIdleOverride(): Promise<void> {
335
+ await this.#emulationAgent.invoke_clearIdleOverride();
336
+ }
337
+
338
+ private async emulateCSSMedia(type: string, features: Array<{
339
+ name: string,
340
+ value: string,
341
+ }>): Promise<void> {
342
+ await this.#emulationAgent.invoke_setEmulatedMedia({media: type, features});
343
+ if (this.#cssModel) {
344
+ this.#cssModel.mediaQueryResultChanged();
345
+ }
346
+ }
347
+
348
+ private async emulateAutoDarkMode(enabled: boolean): Promise<void> {
349
+ if (enabled) {
350
+ this.#mediaConfiguration.set('prefers-color-scheme', 'dark');
351
+ await this.updateCssMedia();
352
+ }
353
+ // We never send `enabled: false` since that would explicitly disable
354
+ // autodark mode. We either enable it or clear any existing override.
355
+ await this.#emulationAgent.invoke_setAutoDarkModeOverride({enabled: enabled || undefined});
356
+ }
357
+
358
+ private async emulateVisionDeficiency(type: Protocol.Emulation.SetEmulatedVisionDeficiencyRequestType):
359
+ Promise<void> {
360
+ await this.#emulationAgent.invoke_setEmulatedVisionDeficiency({type});
361
+ }
362
+
363
+ private async emulateOSTextScale(scale: number|undefined): Promise<void> {
364
+ await this.#emulationAgent.invoke_setEmulatedOSTextScale({scale: scale || undefined});
365
+ }
366
+
367
+ private setLocalFontsDisabled(disabled: boolean): void {
368
+ if (!this.#cssModel) {
369
+ return;
370
+ }
371
+ void this.#cssModel.setLocalFontsEnabled(!disabled);
372
+ }
373
+
374
+ private setDisabledImageTypes(imageTypes: Protocol.Emulation.DisabledImageType[]): void {
375
+ void this.#emulationAgent.invoke_setDisabledImageTypes({imageTypes});
376
+ }
377
+
378
+ async setDataSaverOverride(dataSaverOverride: DataSaverOverride): Promise<void> {
379
+ const dataSaverEnabled = dataSaverOverride === DataSaverOverride.UNSET ? undefined :
380
+ dataSaverOverride === DataSaverOverride.ENABLED ? true :
381
+ false;
382
+ await this.#emulationAgent.invoke_setDataSaverOverride({dataSaverEnabled});
383
+ }
384
+
385
+ async setCPUThrottlingRate(rate: number): Promise<void> {
386
+ await this.#emulationAgent.invoke_setCPUThrottlingRate({rate});
387
+ }
388
+
389
+ async setHardwareConcurrency(hardwareConcurrency: number): Promise<void> {
390
+ if (hardwareConcurrency < 1) {
391
+ throw new Error('hardwareConcurrency must be a positive value');
392
+ }
393
+ await this.#emulationAgent.invoke_setHardwareConcurrencyOverride({hardwareConcurrency});
394
+ }
395
+
396
+ async emulateTouch(enabled: boolean, mobile: boolean): Promise<void> {
397
+ this.#touchEnabled = enabled && this.#touchEmulationAllowed;
398
+ this.#touchMobile = mobile && this.#touchEmulationAllowed;
399
+ await this.updateTouch();
400
+ }
401
+
402
+ async overrideEmulateTouch(enabled: boolean): Promise<void> {
403
+ this.#customTouchEnabled = enabled && this.#touchEmulationAllowed;
404
+ await this.updateTouch();
405
+ }
406
+
407
+ private async updateTouch(): Promise<void> {
408
+ let configuration = {
409
+ enabled: this.#touchEnabled,
410
+ configuration: this.#touchMobile ? Protocol.Emulation.SetEmitTouchEventsForMouseRequestConfiguration.Mobile :
411
+ Protocol.Emulation.SetEmitTouchEventsForMouseRequestConfiguration.Desktop,
412
+ };
413
+ if (this.#customTouchEnabled) {
414
+ configuration = {
415
+ enabled: true,
416
+ configuration: Protocol.Emulation.SetEmitTouchEventsForMouseRequestConfiguration.Mobile,
417
+ };
418
+ }
419
+
420
+ if (this.#overlayModel && this.#overlayModel.inspectModeEnabled()) {
421
+ configuration = {
422
+ enabled: false,
423
+ configuration: Protocol.Emulation.SetEmitTouchEventsForMouseRequestConfiguration.Mobile,
424
+ };
425
+ }
426
+
427
+ if (!this.#touchConfiguration.enabled && !configuration.enabled) {
428
+ return;
429
+ }
430
+ if (this.#touchConfiguration.enabled && configuration.enabled &&
431
+ this.#touchConfiguration.configuration === configuration.configuration) {
432
+ return;
433
+ }
434
+
435
+ this.#touchConfiguration = configuration;
436
+ await this.#emulationAgent.invoke_setTouchEmulationEnabled({enabled: configuration.enabled, maxTouchPoints: 1});
437
+ await this.#emulationAgent.invoke_setEmitTouchEventsForMouse(
438
+ {enabled: configuration.enabled, configuration: configuration.configuration});
439
+ }
440
+
441
+ private async updateCssMedia(): Promise<void> {
442
+ // See the note above, where this.#mediaConfiguration is defined.
443
+ const type = this.#mediaConfiguration.get('type') ?? '';
444
+ const features = [
445
+ {
446
+ name: 'color-gamut',
447
+ value: this.#mediaConfiguration.get('color-gamut') ?? '',
448
+ },
449
+ {
450
+ name: 'prefers-color-scheme',
451
+ value: this.#mediaConfiguration.get('prefers-color-scheme') ?? '',
452
+ },
453
+ {
454
+ name: 'forced-colors',
455
+ value: this.#mediaConfiguration.get('forced-colors') ?? '',
456
+ },
457
+ {
458
+ name: 'prefers-contrast',
459
+ value: this.#mediaConfiguration.get('prefers-contrast') ?? '',
460
+ },
461
+ {
462
+ name: 'prefers-reduced-data',
463
+ value: this.#mediaConfiguration.get('prefers-reduced-data') ?? '',
464
+ },
465
+ {
466
+ name: 'prefers-reduced-motion',
467
+ value: this.#mediaConfiguration.get('prefers-reduced-motion') ?? '',
468
+ },
469
+ {
470
+ name: 'prefers-reduced-transparency',
471
+ value: this.#mediaConfiguration.get('prefers-reduced-transparency') ?? '',
472
+ },
473
+ ];
474
+ return await this.emulateCSSMedia(type, features);
475
+ }
476
+ }
477
+
478
+ export class Location {
479
+ static readonly DEFAULT_ACCURACY = 150;
480
+ latitude: number;
481
+ longitude: number;
482
+ timezoneId: string;
483
+ locale: string;
484
+ accuracy: number;
485
+ unavailable: boolean;
486
+
487
+ constructor(
488
+ latitude: number, longitude: number, timezoneId: string, locale: string, accuracy: number, unavailable: boolean) {
489
+ this.latitude = latitude;
490
+ this.longitude = longitude;
491
+ this.timezoneId = timezoneId;
492
+ this.locale = locale;
493
+ this.accuracy = accuracy;
494
+ this.unavailable = unavailable;
495
+ }
496
+
497
+ static parseSetting(value: string): Location {
498
+ if (value) {
499
+ const [position, timezoneId, locale, unavailable, ...maybeAccuracy] = value.split(':');
500
+ const accuracy = maybeAccuracy.length ? Number(maybeAccuracy[0]) : Location.DEFAULT_ACCURACY;
501
+ const [latitude, longitude] = position.split('@');
502
+ return new Location(
503
+ parseFloat(latitude), parseFloat(longitude), timezoneId, locale, accuracy, Boolean(unavailable));
504
+ }
505
+ return new Location(0, 0, '', '', Location.DEFAULT_ACCURACY, false);
506
+ }
507
+
508
+ static parseUserInput(
509
+ latitudeString: string, longitudeString: string, timezoneId: string, locale: string,
510
+ accuracyString: string): Location|null {
511
+ if (!latitudeString && !longitudeString && !accuracyString) {
512
+ return null;
513
+ }
514
+
515
+ const isLatitudeValid = Location.latitudeValidator(latitudeString);
516
+ const isLongitudeValid = Location.longitudeValidator(longitudeString);
517
+ const {valid: isAccuracyValid} = Location.accuracyValidator(accuracyString);
518
+
519
+ if (!isLatitudeValid && !isLongitudeValid && !isAccuracyValid) {
520
+ return null;
521
+ }
522
+
523
+ const latitude = isLatitudeValid ? parseFloat(latitudeString) : -1;
524
+ const longitude = isLongitudeValid ? parseFloat(longitudeString) : -1;
525
+ const accuracy = isAccuracyValid ? parseFloat(accuracyString) : Location.DEFAULT_ACCURACY;
526
+ return new Location(latitude, longitude, timezoneId, locale, accuracy, false);
527
+ }
528
+
529
+ static latitudeValidator(value: string): boolean {
530
+ const numValue = parseFloat(value);
531
+ return /^([+-]?[\d]+(\.\d+)?|[+-]?\.\d+)$/.test(value) && numValue >= -90 && numValue <= 90;
532
+ }
533
+
534
+ static longitudeValidator(value: string): boolean {
535
+ const numValue = parseFloat(value);
536
+ return /^([+-]?[\d]+(\.\d+)?|[+-]?\.\d+)$/.test(value) && numValue >= -180 && numValue <= 180;
537
+ }
538
+
539
+ static timezoneIdValidator(value: string): boolean {
540
+ // Chromium uses ICU's timezone implementation, which is very
541
+ // liberal in what it accepts. ICU does not simply use an allowlist
542
+ // but instead tries to make sense of the input, even for
543
+ // weird-looking timezone IDs. There's not much point in validating
544
+ // the input other than checking if it contains at least one alphabet.
545
+ // The empty string resets the override, and is accepted as well.
546
+ return value === '' || /[a-zA-Z]/.test(value);
547
+ }
548
+
549
+ static localeValidator(value: string): boolean {
550
+ // Similarly to timezone IDs, there's not much point in validating
551
+ // input locales other than checking if it contains at least two
552
+ // alphabetic characters.
553
+ // https://unicode.org/reports/tr35/#Unicode_language_identifier
554
+ // The empty string resets the override, and is accepted as
555
+ // well.
556
+ return value === '' || /[a-zA-Z]{2}/.test(value);
557
+ }
558
+
559
+ static accuracyValidator(value: string): {
560
+ valid: boolean,
561
+ errorMessage: (string|undefined),
562
+ } {
563
+ if (!value) {
564
+ return {valid: true, errorMessage: undefined};
565
+ }
566
+ const numValue = parseFloat(value);
567
+ const valid = /^([+-]?[\d]+(\.\d+)?|[+-]?\.\d+)$/.test(value) && numValue >= 0;
568
+ return {valid, errorMessage: undefined};
569
+ }
570
+
571
+ toSetting(): string {
572
+ return `${this.latitude}@${this.longitude}:${this.timezoneId}:${this.locale}:${this.unavailable || ''}:${
573
+ this.accuracy || ''}`;
574
+ }
575
+ }
576
+
577
+ export class DeviceOrientation {
578
+ alpha: number;
579
+ beta: number;
580
+ gamma: number;
581
+
582
+ constructor(alpha: number, beta: number, gamma: number) {
583
+ this.alpha = alpha;
584
+ this.beta = beta;
585
+ this.gamma = gamma;
586
+ }
587
+
588
+ static parseSetting(value: string): DeviceOrientation {
589
+ if (value) {
590
+ const jsonObject = JSON.parse(value);
591
+ return new DeviceOrientation(jsonObject.alpha, jsonObject.beta, jsonObject.gamma);
592
+ }
593
+ return new DeviceOrientation(0, 0, 0);
594
+ }
595
+
596
+ static parseUserInput(alphaString: string, betaString: string, gammaString: string): DeviceOrientation|null {
597
+ if (!alphaString && !betaString && !gammaString) {
598
+ return null;
599
+ }
600
+
601
+ const isAlphaValid = DeviceOrientation.alphaAngleValidator(alphaString);
602
+ const isBetaValid = DeviceOrientation.betaAngleValidator(betaString);
603
+ const isGammaValid = DeviceOrientation.gammaAngleValidator(gammaString);
604
+
605
+ if (!isAlphaValid && !isBetaValid && !isGammaValid) {
606
+ return null;
607
+ }
608
+
609
+ const alpha = isAlphaValid ? parseFloat(alphaString) : -1;
610
+ const beta = isBetaValid ? parseFloat(betaString) : -1;
611
+ const gamma = isGammaValid ? parseFloat(gammaString) : -1;
612
+
613
+ return new DeviceOrientation(alpha, beta, gamma);
614
+ }
615
+
616
+ static angleRangeValidator(value: string, interval: {
617
+ minimum: number,
618
+ maximum: number,
619
+ }): boolean {
620
+ const numValue = parseFloat(value);
621
+ return /^([+-]?[\d]+(\.\d+)?|[+-]?\.\d+)$/.test(value) && numValue >= interval.minimum &&
622
+ numValue < interval.maximum;
623
+ }
624
+
625
+ static alphaAngleValidator(value: string): boolean {
626
+ // https://w3c.github.io/deviceorientation/#device-orientation-model
627
+ // Alpha must be within the [0, 360) interval.
628
+ return DeviceOrientation.angleRangeValidator(value, {minimum: 0, maximum: 360});
629
+ }
630
+
631
+ static betaAngleValidator(value: string): boolean {
632
+ // https://w3c.github.io/deviceorientation/#device-orientation-model
633
+ // Beta must be within the [-180, 180) interval.
634
+ return DeviceOrientation.angleRangeValidator(value, {minimum: -180, maximum: 180});
635
+ }
636
+
637
+ static gammaAngleValidator(value: string): boolean {
638
+ // https://w3c.github.io/deviceorientation/#device-orientation-model
639
+ // Gamma must be within the [-90, 90) interval.
640
+ return DeviceOrientation.angleRangeValidator(value, {minimum: -90, maximum: 90});
641
+ }
642
+
643
+ toSetting(): string {
644
+ return JSON.stringify(this);
645
+ }
646
+ }
647
+
648
+ SDKModel.register(EmulationModel, {capabilities: Capability.EMULATION, autostart: true});