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,1160 @@
1
+ // Copyright 2011 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
+ import * as i18n from '../i18n/i18n.js';
9
+ import * as Platform from '../platform/platform.js';
10
+
11
+ import {type DeferredDOMNode, DOMModel, type DOMNode} from './DOMModel.js';
12
+ import {FrameManager} from './FrameManager.js';
13
+ import {Events as NetworkManagerEvents, NetworkManager, type RequestUpdateDroppedEventData} from './NetworkManager.js';
14
+ import type {NetworkRequest} from './NetworkRequest.js';
15
+ import {Resource} from './Resource.js';
16
+ import {ExecutionContext, RuntimeModel} from './RuntimeModel.js';
17
+ import {SDKModel} from './SDKModel.js';
18
+ import {SecurityOriginManager} from './SecurityOriginManager.js';
19
+ import {StorageKeyManager} from './StorageKeyManager.js';
20
+ import {Capability, type Target, Type} from './Target.js';
21
+ import {TargetManager} from './TargetManager.js';
22
+
23
+ export class ResourceTreeModel extends SDKModel<EventTypes> {
24
+ readonly agent: ProtocolProxyApi.PageApi;
25
+ readonly storageAgent: ProtocolProxyApi.StorageApi;
26
+ readonly #securityOriginManager: SecurityOriginManager;
27
+ readonly #storageKeyManager: StorageKeyManager;
28
+ readonly framesInternal = new Map<string, ResourceTreeFrame>();
29
+ #cachedResourcesProcessed = false;
30
+ #pendingReloadOptions: {
31
+ ignoreCache: (boolean|undefined),
32
+ scriptToEvaluateOnLoad: (string|undefined),
33
+ }|null = null;
34
+ #reloadSuspensionCount = 0;
35
+ isInterstitialShowing = false;
36
+ mainFrame: ResourceTreeFrame|null = null;
37
+ #pendingBackForwardCacheNotUsedEvents = new Set<Protocol.Page.BackForwardCacheNotUsedEvent>();
38
+
39
+ constructor(target: Target) {
40
+ super(target);
41
+
42
+ const networkManager = target.model(NetworkManager);
43
+ if (networkManager) {
44
+ networkManager.addEventListener(NetworkManagerEvents.RequestFinished, this.onRequestFinished, this);
45
+ networkManager.addEventListener(NetworkManagerEvents.RequestUpdateDropped, this.onRequestUpdateDropped, this);
46
+ }
47
+ this.agent = target.pageAgent();
48
+ this.storageAgent = target.storageAgent();
49
+ void this.agent.invoke_enable({});
50
+ this.#securityOriginManager = (target.model(SecurityOriginManager) as SecurityOriginManager);
51
+ this.#storageKeyManager = (target.model(StorageKeyManager) as StorageKeyManager);
52
+ target.registerPageDispatcher(new PageDispatcher(this));
53
+
54
+ void this.#buildResourceTree();
55
+ }
56
+
57
+ async #buildResourceTree(): Promise<void> {
58
+ return await this.agent.invoke_getResourceTree().then(event => {
59
+ this.processCachedResources(event.getError() ? null : event.frameTree);
60
+ if (this.mainFrame) {
61
+ this.processPendingEvents(this.mainFrame);
62
+ }
63
+ });
64
+ }
65
+
66
+ static frameForRequest(request: NetworkRequest): ResourceTreeFrame|null {
67
+ const networkManager = NetworkManager.forRequest(request);
68
+ const resourceTreeModel = networkManager ? networkManager.target().model(ResourceTreeModel) : null;
69
+ if (!resourceTreeModel) {
70
+ return null;
71
+ }
72
+ return request.frameId ? resourceTreeModel.frameForId(request.frameId) : null;
73
+ }
74
+
75
+ static frames(): ResourceTreeFrame[] {
76
+ const result = [];
77
+ for (const resourceTreeModel of TargetManager.instance().models(ResourceTreeModel)) {
78
+ result.push(...resourceTreeModel.frames());
79
+ }
80
+ return result;
81
+ }
82
+
83
+ static resourceForURL(url: Platform.DevToolsPath.UrlString): Resource|null {
84
+ for (const resourceTreeModel of TargetManager.instance().models(ResourceTreeModel)) {
85
+ const mainFrame = resourceTreeModel.mainFrame;
86
+ // Workers call into this with no #frames available.
87
+ const result = mainFrame ? mainFrame.resourceForURL(url) : null;
88
+ if (result) {
89
+ return result;
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+
95
+ static reloadAllPages(bypassCache?: boolean, scriptToEvaluateOnLoad?: string): void {
96
+ for (const resourceTreeModel of TargetManager.instance().models(ResourceTreeModel)) {
97
+ if (resourceTreeModel.target().parentTarget()?.type() !== Type.FRAME) {
98
+ resourceTreeModel.reloadPage(bypassCache, scriptToEvaluateOnLoad);
99
+ }
100
+ }
101
+ }
102
+
103
+ async storageKeyForFrame(frameId: Protocol.Page.FrameId): Promise<string|null> {
104
+ if (!this.framesInternal.has(frameId)) {
105
+ return null;
106
+ }
107
+
108
+ // TODO(crbug.com/445966299): Refactor to use `storageAgent().invoke_getStorageKey()` instead.
109
+ const response = await this.storageAgent.invoke_getStorageKey({frameId});
110
+ if (response.getError() === 'Frame tree node for given frame not found') {
111
+ return null;
112
+ }
113
+ return response.storageKey;
114
+ }
115
+
116
+ domModel(): DOMModel {
117
+ return this.target().model(DOMModel) as DOMModel;
118
+ }
119
+
120
+ private processCachedResources(mainFramePayload: Protocol.Page.FrameResourceTree|null): void {
121
+ // TODO(caseq): the url check below is a mergeable, conservative
122
+ // workaround for a problem caused by us requesting resources from a
123
+ // subtarget frame before it has committed. The proper fix is likely
124
+ // to be too complicated to be safely merged.
125
+ // See https://crbug.com/1081270 for details.
126
+ if (mainFramePayload && mainFramePayload.frame.url !== ':') {
127
+ this.dispatchEventToListeners(Events.WillLoadCachedResources);
128
+ this.addFramesRecursively(null, mainFramePayload);
129
+ this.target().setInspectedURL(mainFramePayload.frame.url as Platform.DevToolsPath.UrlString);
130
+ }
131
+ this.#cachedResourcesProcessed = true;
132
+ const runtimeModel = this.target().model(RuntimeModel);
133
+ if (runtimeModel) {
134
+ runtimeModel.setExecutionContextComparator(this.executionContextComparator.bind(this));
135
+ runtimeModel.fireExecutionContextOrderChanged();
136
+ }
137
+ this.dispatchEventToListeners(Events.CachedResourcesLoaded, this);
138
+ }
139
+
140
+ cachedResourcesLoaded(): boolean {
141
+ return this.#cachedResourcesProcessed;
142
+ }
143
+
144
+ private addFrame(frame: ResourceTreeFrame, _aboutToNavigate?: boolean): void {
145
+ this.framesInternal.set(frame.id, frame);
146
+ if (frame.isMainFrame()) {
147
+ this.mainFrame = frame;
148
+ }
149
+ this.dispatchEventToListeners(Events.FrameAdded, frame);
150
+ this.updateSecurityOrigins();
151
+ void this.updateStorageKeys();
152
+ }
153
+
154
+ frameAttached(
155
+ frameId: Protocol.Page.FrameId, parentFrameId: Protocol.Page.FrameId|null,
156
+ stackTrace?: Protocol.Runtime.StackTrace): ResourceTreeFrame|null {
157
+ const sameTargetParentFrame = parentFrameId ? (this.framesInternal.get(parentFrameId) || null) : null;
158
+ // Do nothing unless cached resource tree is processed - it will overwrite everything.
159
+ if (!this.#cachedResourcesProcessed && sameTargetParentFrame) {
160
+ return null;
161
+ }
162
+ if (this.framesInternal.has(frameId)) {
163
+ return null;
164
+ }
165
+
166
+ const frame = new ResourceTreeFrame(this, sameTargetParentFrame, frameId, null, stackTrace || null);
167
+ if (parentFrameId && !sameTargetParentFrame) {
168
+ frame.crossTargetParentFrameId = parentFrameId;
169
+ }
170
+ if (frame.isMainFrame() && this.mainFrame) {
171
+ // Navigation to the new backend process.
172
+ this.frameDetached(this.mainFrame.id, false);
173
+ }
174
+ this.addFrame(frame, true);
175
+ return frame;
176
+ }
177
+
178
+ frameNavigated(framePayload: Protocol.Page.Frame, type: Protocol.Page.NavigationType|undefined): void {
179
+ const sameTargetParentFrame =
180
+ framePayload.parentId ? (this.framesInternal.get(framePayload.parentId) || null) : null;
181
+ // Do nothing unless cached resource tree is processed - it will overwrite everything.
182
+ if (!this.#cachedResourcesProcessed && sameTargetParentFrame) {
183
+ return;
184
+ }
185
+ let frame: (ResourceTreeFrame|null) = this.framesInternal.get(framePayload.id) || null;
186
+ if (!frame) {
187
+ // Simulate missed "frameAttached" for a main frame navigation to the new backend process.
188
+ frame = this.frameAttached(framePayload.id, framePayload.parentId || null);
189
+ console.assert(Boolean(frame));
190
+ if (!frame) {
191
+ return;
192
+ }
193
+ }
194
+
195
+ this.dispatchEventToListeners(Events.FrameWillNavigate, frame);
196
+ frame.navigate(framePayload);
197
+ if (type) {
198
+ frame.backForwardCacheDetails.restoredFromCache = type === Protocol.Page.NavigationType.BackForwardCacheRestore;
199
+ }
200
+ if (frame.isMainFrame()) {
201
+ this.target().setInspectedURL(frame.url);
202
+ }
203
+ this.dispatchEventToListeners(Events.FrameNavigated, frame);
204
+
205
+ if (frame.isPrimaryFrame()) {
206
+ this.primaryPageChanged(frame, PrimaryPageChangeType.NAVIGATION);
207
+ }
208
+
209
+ // Fill frame with retained resources (the ones loaded using new loader).
210
+ const resources = frame.resources();
211
+ for (let i = 0; i < resources.length; ++i) {
212
+ this.dispatchEventToListeners(Events.ResourceAdded, resources[i]);
213
+ }
214
+
215
+ this.updateSecurityOrigins();
216
+ void this.updateStorageKeys();
217
+
218
+ if (frame.backForwardCacheDetails.restoredFromCache) {
219
+ FrameManager.instance().modelRemoved(this);
220
+ FrameManager.instance().modelAdded(this);
221
+ void this.#buildResourceTree();
222
+ }
223
+ }
224
+
225
+ primaryPageChanged(frame: ResourceTreeFrame, type: PrimaryPageChangeType): void {
226
+ this.processPendingEvents(frame);
227
+ this.dispatchEventToListeners(Events.PrimaryPageChanged, {frame, type});
228
+ const networkManager = this.target().model(NetworkManager);
229
+ if (networkManager && frame.isOutermostFrame()) {
230
+ networkManager.clearRequests();
231
+ }
232
+ }
233
+
234
+ documentOpened(framePayload: Protocol.Page.Frame): void {
235
+ this.frameNavigated(framePayload, undefined);
236
+ const frame = this.framesInternal.get(framePayload.id);
237
+ if (frame && !frame.getResourcesMap().get(framePayload.url)) {
238
+ const frameResource = this.createResourceFromFramePayload(
239
+ framePayload, framePayload.url as Platform.DevToolsPath.UrlString, Common.ResourceType.resourceTypes.Document,
240
+ framePayload.mimeType, null, null);
241
+ frameResource.isGenerated = true;
242
+ frame.addResource(frameResource);
243
+ }
244
+ }
245
+
246
+ frameDetached(frameId: Protocol.Page.FrameId, isSwap: boolean): void {
247
+ // Do nothing unless cached resource tree is processed - it will overwrite everything.
248
+ if (!this.#cachedResourcesProcessed) {
249
+ return;
250
+ }
251
+
252
+ const frame = this.framesInternal.get(frameId);
253
+ if (!frame) {
254
+ return;
255
+ }
256
+
257
+ const sameTargetParentFrame = frame.sameTargetParentFrame();
258
+ if (sameTargetParentFrame) {
259
+ sameTargetParentFrame.removeChildFrame(frame, isSwap);
260
+ } else {
261
+ frame.remove(isSwap);
262
+ }
263
+ this.updateSecurityOrigins();
264
+ void this.updateStorageKeys();
265
+ }
266
+
267
+ private onRequestFinished(event: Common.EventTarget.EventTargetEvent<NetworkRequest>): void {
268
+ if (!this.#cachedResourcesProcessed) {
269
+ return;
270
+ }
271
+
272
+ const request = event.data;
273
+ if (request.failed) {
274
+ return;
275
+ }
276
+
277
+ const frame = request.frameId ? this.framesInternal.get(request.frameId) : null;
278
+ if (frame) {
279
+ frame.addRequest(request);
280
+ }
281
+ }
282
+
283
+ private onRequestUpdateDropped(event: Common.EventTarget.EventTargetEvent<RequestUpdateDroppedEventData>): void {
284
+ if (!this.#cachedResourcesProcessed) {
285
+ return;
286
+ }
287
+
288
+ const data = event.data;
289
+ const frameId = data.frameId;
290
+ if (!frameId) {
291
+ return;
292
+ }
293
+ const frame = this.framesInternal.get(frameId);
294
+ if (!frame) {
295
+ return;
296
+ }
297
+
298
+ const url = data.url;
299
+ if (frame.getResourcesMap().get(url)) {
300
+ return;
301
+ }
302
+
303
+ const resource = new Resource(
304
+ this, null, url, frame.url, frameId, data.loaderId, Common.ResourceType.resourceTypes[data.resourceType],
305
+ data.mimeType, data.lastModified, null);
306
+ frame.addResource(resource);
307
+ }
308
+
309
+ frameForId(frameId: Protocol.Page.FrameId): ResourceTreeFrame|null {
310
+ return this.framesInternal.get(frameId) || null;
311
+ }
312
+
313
+ forAllResources(callback: (arg0: Resource) => boolean): boolean {
314
+ if (this.mainFrame) {
315
+ return this.mainFrame.callForFrameResources(callback);
316
+ }
317
+ return false;
318
+ }
319
+
320
+ frames(): ResourceTreeFrame[] {
321
+ return [...this.framesInternal.values()];
322
+ }
323
+
324
+ private addFramesRecursively(
325
+ sameTargetParentFrame: ResourceTreeFrame|null, frameTreePayload: Protocol.Page.FrameResourceTree): void {
326
+ const framePayload = frameTreePayload.frame;
327
+ let frame = this.framesInternal.get(framePayload.id);
328
+ if (!frame) {
329
+ frame = new ResourceTreeFrame(this, sameTargetParentFrame, framePayload.id, framePayload, null);
330
+ }
331
+ if (!sameTargetParentFrame && framePayload.parentId) {
332
+ frame.crossTargetParentFrameId = framePayload.parentId;
333
+ }
334
+ this.addFrame(frame);
335
+
336
+ for (const childFrame of frameTreePayload.childFrames || []) {
337
+ this.addFramesRecursively(frame, childFrame);
338
+ }
339
+
340
+ for (let i = 0; i < frameTreePayload.resources.length; ++i) {
341
+ const subresource = frameTreePayload.resources[i];
342
+ const resource = this.createResourceFromFramePayload(
343
+ framePayload, subresource.url as Platform.DevToolsPath.UrlString,
344
+ Common.ResourceType.resourceTypes[subresource.type], subresource.mimeType, subresource.lastModified || null,
345
+ subresource.contentSize || null);
346
+ frame.addResource(resource);
347
+ }
348
+
349
+ if (!frame.getResourcesMap().get(framePayload.url)) {
350
+ const frameResource = this.createResourceFromFramePayload(
351
+ framePayload, framePayload.url as Platform.DevToolsPath.UrlString, Common.ResourceType.resourceTypes.Document,
352
+ framePayload.mimeType, null, null);
353
+ frame.addResource(frameResource);
354
+ }
355
+ }
356
+
357
+ private createResourceFromFramePayload(
358
+ frame: Protocol.Page.Frame, url: Platform.DevToolsPath.UrlString, type: Common.ResourceType.ResourceType,
359
+ mimeType: string, lastModifiedTime: number|null, contentSize: number|null): Resource {
360
+ const lastModified = typeof lastModifiedTime === 'number' ? new Date(lastModifiedTime * 1000) : null;
361
+ return new Resource(
362
+ this, null, url, frame.url as Platform.DevToolsPath.UrlString, frame.id, frame.loaderId, type, mimeType,
363
+ lastModified, contentSize);
364
+ }
365
+
366
+ suspendReload(): void {
367
+ this.#reloadSuspensionCount++;
368
+ }
369
+
370
+ resumeReload(): void {
371
+ this.#reloadSuspensionCount--;
372
+ console.assert(this.#reloadSuspensionCount >= 0, 'Unbalanced call to ResourceTreeModel.resumeReload()');
373
+ if (!this.#reloadSuspensionCount && this.#pendingReloadOptions) {
374
+ const {ignoreCache, scriptToEvaluateOnLoad} = this.#pendingReloadOptions;
375
+ this.reloadPage(ignoreCache, scriptToEvaluateOnLoad);
376
+ }
377
+ }
378
+
379
+ reloadPage(ignoreCache?: boolean, scriptToEvaluateOnLoad?: string): void {
380
+ const loaderId = this.mainFrame?.loaderId;
381
+ if (!loaderId) {
382
+ return;
383
+ }
384
+ // Only dispatch PageReloadRequested upon first reload request to simplify client logic.
385
+ if (!this.#pendingReloadOptions) {
386
+ this.dispatchEventToListeners(Events.PageReloadRequested, this);
387
+ }
388
+ if (this.#reloadSuspensionCount) {
389
+ this.#pendingReloadOptions = {ignoreCache, scriptToEvaluateOnLoad};
390
+ return;
391
+ }
392
+ this.#pendingReloadOptions = null;
393
+ const networkManager = this.target().model(NetworkManager);
394
+ if (networkManager) {
395
+ networkManager.clearRequests();
396
+ }
397
+ this.dispatchEventToListeners(Events.WillReloadPage);
398
+ void this.agent.invoke_reload({ignoreCache, scriptToEvaluateOnLoad, loaderId});
399
+ }
400
+
401
+ navigate(url: Platform.DevToolsPath.UrlString): Promise<Protocol.Page.NavigateResponse> {
402
+ return this.agent.invoke_navigate({url});
403
+ }
404
+
405
+ async navigationHistory(): Promise<{
406
+ currentIndex: number,
407
+ entries: Protocol.Page.NavigationEntry[],
408
+ }|null> {
409
+ const response = await this.agent.invoke_getNavigationHistory();
410
+ if (response.getError()) {
411
+ return null;
412
+ }
413
+ return {currentIndex: response.currentIndex, entries: response.entries};
414
+ }
415
+
416
+ navigateToHistoryEntry(entry: Protocol.Page.NavigationEntry): void {
417
+ void this.agent.invoke_navigateToHistoryEntry({entryId: entry.id});
418
+ }
419
+
420
+ setLifecycleEventsEnabled(enabled: boolean): Promise<Protocol.ProtocolResponseWithError> {
421
+ return this.agent.invoke_setLifecycleEventsEnabled({enabled});
422
+ }
423
+
424
+ async fetchAppManifest(): Promise<{
425
+ url: Platform.DevToolsPath.UrlString,
426
+ data: string|null,
427
+ errors: Protocol.Page.AppManifestError[],
428
+ }> {
429
+ const response = await this.agent.invoke_getAppManifest({});
430
+ if (response.getError()) {
431
+ return {url: response.url as Platform.DevToolsPath.UrlString, data: null, errors: []};
432
+ }
433
+ return {url: response.url as Platform.DevToolsPath.UrlString, data: response.data || null, errors: response.errors};
434
+ }
435
+
436
+ async getInstallabilityErrors(): Promise<Protocol.Page.InstallabilityError[]> {
437
+ const response = await this.agent.invoke_getInstallabilityErrors();
438
+ return response.installabilityErrors || [];
439
+ }
440
+
441
+ async getAppId(): Promise<Protocol.Page.GetAppIdResponse> {
442
+ return await this.agent.invoke_getAppId();
443
+ }
444
+
445
+ private executionContextComparator(a: ExecutionContext, b: ExecutionContext): number {
446
+ function framePath(frame: ResourceTreeFrame|null): ResourceTreeFrame[] {
447
+ let currentFrame: (ResourceTreeFrame|null) = frame;
448
+ const parents = [];
449
+ while (currentFrame) {
450
+ parents.push(currentFrame);
451
+ currentFrame = currentFrame.sameTargetParentFrame();
452
+ }
453
+ return parents.reverse();
454
+ }
455
+
456
+ if (a.target() !== b.target()) {
457
+ return ExecutionContext.comparator(a, b);
458
+ }
459
+
460
+ const framesA = a.frameId ? framePath(this.frameForId(a.frameId)) : [];
461
+ const framesB = b.frameId ? framePath(this.frameForId(b.frameId)) : [];
462
+ let frameA;
463
+ let frameB;
464
+ for (let i = 0;; i++) {
465
+ if (!framesA[i] || !framesB[i] || (framesA[i] !== framesB[i])) {
466
+ frameA = framesA[i];
467
+ frameB = framesB[i];
468
+ break;
469
+ }
470
+ }
471
+ if (!frameA && frameB) {
472
+ return -1;
473
+ }
474
+
475
+ if (!frameB && frameA) {
476
+ return 1;
477
+ }
478
+
479
+ if (frameA && frameB) {
480
+ return frameA.id.localeCompare(frameB.id);
481
+ }
482
+
483
+ return ExecutionContext.comparator(a, b);
484
+ }
485
+
486
+ private getSecurityOriginData(): SecurityOriginData {
487
+ const securityOrigins = new Set<string>();
488
+
489
+ let mainSecurityOrigin: string|null = null;
490
+ let unreachableMainSecurityOrigin: string|null = null;
491
+ for (const frame of this.framesInternal.values()) {
492
+ const origin = frame.securityOrigin;
493
+ if (!origin) {
494
+ continue;
495
+ }
496
+
497
+ securityOrigins.add(origin);
498
+ if (frame.isMainFrame()) {
499
+ mainSecurityOrigin = origin;
500
+ if (frame.unreachableUrl()) {
501
+ const unreachableParsed = new Common.ParsedURL.ParsedURL(frame.unreachableUrl());
502
+ unreachableMainSecurityOrigin = unreachableParsed.securityOrigin();
503
+ }
504
+ }
505
+ }
506
+ return {
507
+ securityOrigins,
508
+ mainSecurityOrigin,
509
+ unreachableMainSecurityOrigin,
510
+ };
511
+ }
512
+
513
+ private async getStorageKeyData(): Promise<StorageKeyData> {
514
+ const storageKeys = new Set<string>();
515
+ let mainStorageKey: string|null = null;
516
+
517
+ for (const {isMainFrame, storageKey} of await Promise.all([...this.framesInternal.values()].map(
518
+ f => f.getStorageKey(/* forceFetch */ false).then(k => ({
519
+ isMainFrame: f.isMainFrame(),
520
+ storageKey: k,
521
+ }))))) {
522
+ if (isMainFrame) {
523
+ mainStorageKey = storageKey;
524
+ }
525
+ if (storageKey) {
526
+ storageKeys.add(storageKey);
527
+ }
528
+ }
529
+
530
+ return {storageKeys, mainStorageKey};
531
+ }
532
+
533
+ private updateSecurityOrigins(): void {
534
+ const data = this.getSecurityOriginData();
535
+ this.#securityOriginManager.setMainSecurityOrigin(
536
+ data.mainSecurityOrigin || '', data.unreachableMainSecurityOrigin || '');
537
+ this.#securityOriginManager.updateSecurityOrigins(data.securityOrigins);
538
+ }
539
+
540
+ private async updateStorageKeys(): Promise<void> {
541
+ const data = await this.getStorageKeyData();
542
+ this.#storageKeyManager.setMainStorageKey(data.mainStorageKey || '');
543
+ this.#storageKeyManager.updateStorageKeys(data.storageKeys);
544
+ }
545
+
546
+ async getMainStorageKey(): Promise<string|null> {
547
+ return this.mainFrame ? await this.mainFrame.getStorageKey(/* forceFetch */ false) : null;
548
+ }
549
+
550
+ getMainSecurityOrigin(): string|null {
551
+ const data = this.getSecurityOriginData();
552
+ return data.mainSecurityOrigin || data.unreachableMainSecurityOrigin;
553
+ }
554
+
555
+ onBackForwardCacheNotUsed(event: Protocol.Page.BackForwardCacheNotUsedEvent): void {
556
+ if (this.mainFrame && this.mainFrame.id === event.frameId && this.mainFrame.loaderId === event.loaderId) {
557
+ this.mainFrame.setBackForwardCacheDetails(event);
558
+ this.dispatchEventToListeners(Events.BackForwardCacheDetailsUpdated, this.mainFrame);
559
+ } else {
560
+ this.#pendingBackForwardCacheNotUsedEvents.add(event);
561
+ }
562
+ }
563
+
564
+ processPendingEvents(frame: ResourceTreeFrame): void {
565
+ if (!frame.isMainFrame()) {
566
+ return;
567
+ }
568
+ for (const event of this.#pendingBackForwardCacheNotUsedEvents) {
569
+ if (frame.id === event.frameId && frame.loaderId === event.loaderId) {
570
+ frame.setBackForwardCacheDetails(event);
571
+ this.#pendingBackForwardCacheNotUsedEvents.delete(event);
572
+ break;
573
+ }
574
+ }
575
+ // No need to dispatch events here as this method call is followed by a `PrimaryPageChanged` event.
576
+ }
577
+ }
578
+
579
+ export enum Events {
580
+ /* eslint-disable @typescript-eslint/naming-convention -- Used by web_tests. */
581
+ FrameAdded = 'FrameAdded',
582
+ FrameNavigated = 'FrameNavigated',
583
+ FrameDetached = 'FrameDetached',
584
+ FrameResized = 'FrameResized',
585
+ FrameWillNavigate = 'FrameWillNavigate',
586
+ PrimaryPageChanged = 'PrimaryPageChanged',
587
+ ResourceAdded = 'ResourceAdded',
588
+ WillLoadCachedResources = 'WillLoadCachedResources',
589
+ CachedResourcesLoaded = 'CachedResourcesLoaded',
590
+ DOMContentLoaded = 'DOMContentLoaded',
591
+ LifecycleEvent = 'LifecycleEvent',
592
+ Load = 'Load',
593
+ PageReloadRequested = 'PageReloadRequested',
594
+ WillReloadPage = 'WillReloadPage',
595
+ InterstitialShown = 'InterstitialShown',
596
+ InterstitialHidden = 'InterstitialHidden',
597
+ BackForwardCacheDetailsUpdated = 'BackForwardCacheDetailsUpdated',
598
+ JavaScriptDialogOpening = 'JavaScriptDialogOpening',
599
+ /* eslint-enable @typescript-eslint/naming-convention */
600
+ }
601
+
602
+ export interface EventTypes {
603
+ [Events.FrameAdded]: ResourceTreeFrame;
604
+ [Events.FrameNavigated]: ResourceTreeFrame;
605
+ [Events.FrameDetached]: {frame: ResourceTreeFrame, isSwap: boolean};
606
+ [Events.FrameResized]: void;
607
+ [Events.FrameWillNavigate]: ResourceTreeFrame;
608
+ [Events.PrimaryPageChanged]: {frame: ResourceTreeFrame, type: PrimaryPageChangeType};
609
+ [Events.ResourceAdded]: Resource;
610
+ [Events.WillLoadCachedResources]: void;
611
+ [Events.CachedResourcesLoaded]: ResourceTreeModel;
612
+ [Events.DOMContentLoaded]: number;
613
+ [Events.LifecycleEvent]: {frameId: Protocol.Page.FrameId, name: string};
614
+ [Events.Load]: {resourceTreeModel: ResourceTreeModel, loadTime: number};
615
+ [Events.PageReloadRequested]: ResourceTreeModel;
616
+ [Events.WillReloadPage]: void;
617
+ [Events.InterstitialShown]: void;
618
+ [Events.InterstitialHidden]: void;
619
+ [Events.BackForwardCacheDetailsUpdated]: ResourceTreeFrame;
620
+ [Events.JavaScriptDialogOpening]: Protocol.Page.JavascriptDialogOpeningEvent;
621
+ }
622
+
623
+ export class ResourceTreeFrame {
624
+ #model: ResourceTreeModel;
625
+ #sameTargetParentFrame: ResourceTreeFrame|null;
626
+ readonly #id: Protocol.Page.FrameId;
627
+ crossTargetParentFrameId: string|null = null;
628
+ #loaderId: Protocol.Network.LoaderId;
629
+ #name: string|null|undefined;
630
+ #url: Platform.DevToolsPath.UrlString;
631
+ #domainAndRegistry: string;
632
+ #securityOrigin: string|null;
633
+ #securityOriginDetails?: Protocol.Page.SecurityOriginDetails;
634
+ #storageKey?: Promise<string|null>;
635
+ #unreachableUrl: Platform.DevToolsPath.UrlString;
636
+ #adFrameStatus?: Protocol.Page.AdFrameStatus;
637
+ #secureContextType: Protocol.Page.SecureContextType|null;
638
+ #crossOriginIsolatedContextType: Protocol.Page.CrossOriginIsolatedContextType|null;
639
+ #gatedAPIFeatures: Protocol.Page.GatedAPIFeatures[]|null;
640
+ #creationStackTrace: Protocol.Runtime.StackTrace|null;
641
+ #creationStackTraceTarget: Target|null = null;
642
+ #childFrames = new Set<ResourceTreeFrame>();
643
+ resourcesMap = new Map<Platform.DevToolsPath.UrlString, Resource>();
644
+ backForwardCacheDetails: {
645
+ restoredFromCache: boolean|undefined,
646
+ explanations: Protocol.Page.BackForwardCacheNotRestoredExplanation[],
647
+ explanationsTree: Protocol.Page.BackForwardCacheNotRestoredExplanationTree|undefined,
648
+ } = {
649
+ restoredFromCache: undefined,
650
+ explanations: [],
651
+ explanationsTree: undefined,
652
+ };
653
+
654
+ constructor(
655
+ model: ResourceTreeModel, parentFrame: ResourceTreeFrame|null, frameId: Protocol.Page.FrameId,
656
+ payload: Protocol.Page.Frame|null, creationStackTrace: Protocol.Runtime.StackTrace|null) {
657
+ this.#model = model;
658
+ this.#sameTargetParentFrame = parentFrame;
659
+ this.#id = frameId;
660
+
661
+ this.#loaderId = payload?.loaderId ?? '' as Protocol.Network.LoaderId;
662
+ this.#name = payload?.name;
663
+ this.#url = payload && payload.url as Platform.DevToolsPath.UrlString || Platform.DevToolsPath.EmptyUrlString;
664
+ this.#domainAndRegistry = (payload?.domainAndRegistry) || '';
665
+ this.#securityOrigin = payload?.securityOrigin ?? null;
666
+ this.#securityOriginDetails = payload?.securityOriginDetails;
667
+ this.#unreachableUrl =
668
+ (payload && payload.unreachableUrl as Platform.DevToolsPath.UrlString) || Platform.DevToolsPath.EmptyUrlString;
669
+ this.#adFrameStatus = payload?.adFrameStatus;
670
+ this.#secureContextType = payload?.secureContextType ?? null;
671
+ this.#crossOriginIsolatedContextType = payload?.crossOriginIsolatedContextType ?? null;
672
+ this.#gatedAPIFeatures = payload?.gatedAPIFeatures ?? null;
673
+
674
+ this.#creationStackTrace = creationStackTrace;
675
+
676
+ if (this.#sameTargetParentFrame) {
677
+ this.#sameTargetParentFrame.#childFrames.add(this);
678
+ }
679
+ }
680
+
681
+ isSecureContext(): boolean {
682
+ return this.#secureContextType !== null && this.#secureContextType.startsWith('Secure');
683
+ }
684
+
685
+ getSecureContextType(): Protocol.Page.SecureContextType|null {
686
+ return this.#secureContextType;
687
+ }
688
+
689
+ isCrossOriginIsolated(): boolean {
690
+ return this.#crossOriginIsolatedContextType !== null && this.#crossOriginIsolatedContextType.startsWith('Isolated');
691
+ }
692
+
693
+ getCrossOriginIsolatedContextType(): Protocol.Page.CrossOriginIsolatedContextType|null {
694
+ return this.#crossOriginIsolatedContextType;
695
+ }
696
+
697
+ getGatedAPIFeatures(): Protocol.Page.GatedAPIFeatures[]|null {
698
+ return this.#gatedAPIFeatures;
699
+ }
700
+
701
+ getCreationStackTraceData():
702
+ {creationStackTrace: Protocol.Runtime.StackTrace|null, creationStackTraceTarget: Target} {
703
+ return {
704
+ creationStackTrace: this.#creationStackTrace,
705
+ creationStackTraceTarget: this.#creationStackTraceTarget || this.resourceTreeModel().target(),
706
+ };
707
+ }
708
+
709
+ navigate(framePayload: Protocol.Page.Frame): void {
710
+ this.#loaderId = framePayload.loaderId;
711
+ this.#name = framePayload.name;
712
+ this.#url = framePayload.url as Platform.DevToolsPath.UrlString;
713
+ this.#domainAndRegistry = framePayload.domainAndRegistry;
714
+ this.#securityOrigin = framePayload.securityOrigin;
715
+ this.#securityOriginDetails = framePayload.securityOriginDetails;
716
+ void this.getStorageKey(/* forceFetch */ true);
717
+ this.#unreachableUrl =
718
+ framePayload.unreachableUrl as Platform.DevToolsPath.UrlString || Platform.DevToolsPath.EmptyUrlString;
719
+ this.#adFrameStatus = framePayload?.adFrameStatus;
720
+ this.#secureContextType = framePayload.secureContextType;
721
+ this.#crossOriginIsolatedContextType = framePayload.crossOriginIsolatedContextType;
722
+ this.#gatedAPIFeatures = framePayload.gatedAPIFeatures;
723
+ this.backForwardCacheDetails = {
724
+ restoredFromCache: undefined,
725
+ explanations: [],
726
+ explanationsTree: undefined,
727
+ };
728
+
729
+ const mainResource = this.resourcesMap.get(this.#url);
730
+ this.resourcesMap.clear();
731
+ this.removeChildFrames();
732
+ if (mainResource && mainResource.loaderId === this.#loaderId) {
733
+ this.addResource(mainResource);
734
+ }
735
+ }
736
+
737
+ resourceTreeModel(): ResourceTreeModel {
738
+ return this.#model;
739
+ }
740
+
741
+ get id(): Protocol.Page.FrameId {
742
+ return this.#id;
743
+ }
744
+
745
+ get name(): string {
746
+ return this.#name || '';
747
+ }
748
+
749
+ get url(): Platform.DevToolsPath.UrlString {
750
+ return this.#url;
751
+ }
752
+
753
+ domainAndRegistry(): string {
754
+ return this.#domainAndRegistry;
755
+ }
756
+
757
+ async getAdScriptAncestry(frameId: Protocol.Page.FrameId): Promise<Protocol.Page.AdScriptAncestry|null> {
758
+ const res = await this.#model.agent.invoke_getAdScriptAncestry({frameId});
759
+ return res.adScriptAncestry || null;
760
+ }
761
+
762
+ get securityOrigin(): string|null {
763
+ return this.#securityOrigin;
764
+ }
765
+
766
+ get securityOriginDetails(): Protocol.Page.SecurityOriginDetails|null {
767
+ return this.#securityOriginDetails ?? null;
768
+ }
769
+
770
+ getStorageKey(forceFetch: boolean): Promise<string|null> {
771
+ if (!this.#storageKey || forceFetch) {
772
+ this.#storageKey = this.#model.storageKeyForFrame(this.#id);
773
+ }
774
+ return this.#storageKey;
775
+ }
776
+
777
+ unreachableUrl(): Platform.DevToolsPath.UrlString {
778
+ return this.#unreachableUrl;
779
+ }
780
+
781
+ get loaderId(): Protocol.Network.LoaderId {
782
+ return this.#loaderId;
783
+ }
784
+
785
+ adFrameType(): Protocol.Page.AdFrameType {
786
+ return this.#adFrameStatus?.adFrameType || Protocol.Page.AdFrameType.None;
787
+ }
788
+
789
+ adFrameStatus(): Protocol.Page.AdFrameStatus|undefined {
790
+ return this.#adFrameStatus;
791
+ }
792
+
793
+ get childFrames(): ResourceTreeFrame[] {
794
+ return [...this.#childFrames];
795
+ }
796
+
797
+ /**
798
+ * Returns the parent frame if both #frames are part of the same process/target.
799
+ */
800
+ sameTargetParentFrame(): ResourceTreeFrame|null {
801
+ return this.#sameTargetParentFrame;
802
+ }
803
+
804
+ /**
805
+ * Returns the parent frame if both #frames are part of different processes/targets (child is an OOPIF).
806
+ */
807
+ crossTargetParentFrame(): ResourceTreeFrame|null {
808
+ if (!this.crossTargetParentFrameId) {
809
+ return null;
810
+ }
811
+ const parentTarget = this.#model.target().parentTarget();
812
+ if (parentTarget?.type() !== Type.FRAME) {
813
+ return null;
814
+ }
815
+ const parentModel = parentTarget.model(ResourceTreeModel);
816
+ if (!parentModel) {
817
+ return null;
818
+ }
819
+ // Note that parent #model has already processed cached resources:
820
+ // - when parent target was created, we issued getResourceTree call;
821
+ // - strictly after we issued setAutoAttach call;
822
+ // - both of them were handled in renderer in the same order;
823
+ // - cached resource tree got processed on parent #model;
824
+ // - child target was created as a result of setAutoAttach call.
825
+ return parentModel.framesInternal.get(this.crossTargetParentFrameId) || null;
826
+ }
827
+
828
+ /**
829
+ * Returns the parent frame. There is only 1 parent and it's either in the
830
+ * same target or it's cross-target.
831
+ */
832
+ parentFrame(): ResourceTreeFrame|null {
833
+ return this.sameTargetParentFrame() || this.crossTargetParentFrame();
834
+ }
835
+
836
+ /**
837
+ * Returns true if this is the main frame of its target. A main frame is the root of the frame tree i.e. a frame without
838
+ * a parent, but the whole frame tree could be embedded in another frame tree (e.g. OOPIFs, fenced frames, portals).
839
+ * https://chromium.googlesource.com/chromium/src/+/HEAD/docs/frame_trees.md
840
+ */
841
+ isMainFrame(): boolean {
842
+ return !this.#sameTargetParentFrame;
843
+ }
844
+
845
+ /**
846
+ * Returns true if this is a main frame which is not embedded in another frame tree. With MPArch features such as
847
+ * back/forward cache or prerender there can be multiple outermost frames.
848
+ * https://chromium.googlesource.com/chromium/src/+/HEAD/docs/frame_trees.md
849
+ */
850
+ isOutermostFrame(): boolean {
851
+ return this.#model.target().parentTarget()?.type() !== Type.FRAME && !this.#sameTargetParentFrame &&
852
+ !this.crossTargetParentFrameId;
853
+ }
854
+
855
+ /**
856
+ * Returns true if this is the primary frame of the browser tab. There can only be one primary frame for each
857
+ * browser tab. It is the outermost frame being actively displayed in the browser tab.
858
+ * https://chromium.googlesource.com/chromium/src/+/HEAD/docs/frame_trees.md
859
+ */
860
+ isPrimaryFrame(): boolean {
861
+ return !this.#sameTargetParentFrame && this.#model.target() === TargetManager.instance().primaryPageTarget();
862
+ }
863
+
864
+ removeChildFrame(frame: ResourceTreeFrame, isSwap: boolean): void {
865
+ this.#childFrames.delete(frame);
866
+ frame.remove(isSwap);
867
+ }
868
+
869
+ private removeChildFrames(): void {
870
+ const frames = this.#childFrames;
871
+ this.#childFrames = new Set();
872
+ for (const frame of frames) {
873
+ frame.remove(false);
874
+ }
875
+ }
876
+
877
+ remove(isSwap: boolean): void {
878
+ this.removeChildFrames();
879
+ this.#model.framesInternal.delete(this.id);
880
+ this.#model.dispatchEventToListeners(Events.FrameDetached, {frame: this, isSwap});
881
+ }
882
+
883
+ addResource(resource: Resource): void {
884
+ if (this.resourcesMap.get(resource.url) === resource) {
885
+ // Already in the tree, we just got an extra update.
886
+ return;
887
+ }
888
+ this.resourcesMap.set(resource.url, resource);
889
+ this.#model.dispatchEventToListeners(Events.ResourceAdded, resource);
890
+ }
891
+
892
+ addRequest(request: NetworkRequest): void {
893
+ let resource = this.resourcesMap.get(request.url());
894
+ if (resource && resource.request === request) {
895
+ // Already in the tree, we just got an extra update.
896
+ return;
897
+ }
898
+ resource = new Resource(
899
+ this.#model, request, request.url(), request.documentURL, request.frameId, request.loaderId,
900
+ request.resourceType(), request.mimeType, null, null);
901
+ this.resourcesMap.set(resource.url, resource);
902
+ this.#model.dispatchEventToListeners(Events.ResourceAdded, resource);
903
+ }
904
+
905
+ resources(): Resource[] {
906
+ return Array.from(this.resourcesMap.values());
907
+ }
908
+
909
+ resourceForURL(url: Platform.DevToolsPath.UrlString): Resource|null {
910
+ const resource = this.resourcesMap.get(url);
911
+ if (resource) {
912
+ return resource;
913
+ }
914
+ for (const frame of this.#childFrames) {
915
+ const resource = frame.resourceForURL(url);
916
+ if (resource) {
917
+ return resource;
918
+ }
919
+ }
920
+ return null;
921
+ }
922
+
923
+ callForFrameResources(callback: (arg0: Resource) => boolean): boolean {
924
+ for (const resource of this.resourcesMap.values()) {
925
+ if (callback(resource)) {
926
+ return true;
927
+ }
928
+ }
929
+
930
+ for (const frame of this.#childFrames) {
931
+ if (frame.callForFrameResources(callback)) {
932
+ return true;
933
+ }
934
+ }
935
+ return false;
936
+ }
937
+
938
+ displayName(): string {
939
+ if (this.isOutermostFrame()) {
940
+ return i18n.i18n.lockedString('top');
941
+ }
942
+ const subtitle = new Common.ParsedURL.ParsedURL(this.#url).displayName;
943
+ if (subtitle) {
944
+ if (!this.#name) {
945
+ return subtitle;
946
+ }
947
+ return this.#name + ' (' + subtitle + ')';
948
+ }
949
+ return i18n.i18n.lockedString('iframe');
950
+ }
951
+
952
+ async getOwnerDeferredDOMNode(): Promise<DeferredDOMNode|null> {
953
+ const parentFrame = this.parentFrame();
954
+ if (!parentFrame) {
955
+ return null;
956
+ }
957
+ return await parentFrame.resourceTreeModel().domModel().getOwnerNodeForFrame(this.#id);
958
+ }
959
+
960
+ async getOwnerDOMNodeOrDocument(): Promise<DOMNode|null> {
961
+ const deferredNode = await this.getOwnerDeferredDOMNode();
962
+ if (deferredNode) {
963
+ return await deferredNode.resolvePromise();
964
+ }
965
+ if (this.isOutermostFrame()) {
966
+ return await this.resourceTreeModel().domModel().requestDocument();
967
+ }
968
+ return null;
969
+ }
970
+
971
+ async highlight(): Promise<void> {
972
+ const parentFrame = this.parentFrame();
973
+ const parentTarget = this.resourceTreeModel().target().parentTarget();
974
+ const highlightFrameOwner = async(domModel: DOMModel): Promise<void> => {
975
+ const deferredNode = await domModel.getOwnerNodeForFrame(this.#id);
976
+ if (deferredNode) {
977
+ domModel.overlayModel().highlightInOverlay({deferredNode, selectorList: ''}, 'all', true);
978
+ }
979
+ };
980
+
981
+ if (parentFrame) {
982
+ return await highlightFrameOwner(parentFrame.resourceTreeModel().domModel());
983
+ }
984
+
985
+ // Fenced frames.
986
+ if (parentTarget?.type() === Type.FRAME) {
987
+ const domModel = parentTarget.model(DOMModel);
988
+ if (domModel) {
989
+ return await highlightFrameOwner(domModel);
990
+ }
991
+ }
992
+
993
+ // For the outermost frame there is no owner node. Highlight the whole #document instead.
994
+ const document = await this.resourceTreeModel().domModel().requestDocument();
995
+ if (document) {
996
+ this.resourceTreeModel().domModel().overlayModel().highlightInOverlay(
997
+ {node: document, selectorList: ''}, 'all', true);
998
+ }
999
+ }
1000
+
1001
+ async getPermissionsPolicyState(): Promise<Protocol.Page.PermissionsPolicyFeatureState[]|null> {
1002
+ const response =
1003
+ await this.resourceTreeModel().target().pageAgent().invoke_getPermissionsPolicyState({frameId: this.#id});
1004
+ if (response.getError()) {
1005
+ return null;
1006
+ }
1007
+ return response.states;
1008
+ }
1009
+
1010
+ async getOriginTrials(): Promise<Protocol.Page.OriginTrial[]> {
1011
+ const response = await this.resourceTreeModel().target().pageAgent().invoke_getOriginTrials({frameId: this.#id});
1012
+ if (response.getError()) {
1013
+ return [];
1014
+ }
1015
+ return response.originTrials;
1016
+ }
1017
+
1018
+ setCreationStackTrace(creationStackTraceData: {
1019
+ creationStackTrace: Protocol.Runtime.StackTrace|null,
1020
+ creationStackTraceTarget: Target,
1021
+ }): void {
1022
+ this.#creationStackTrace = creationStackTraceData.creationStackTrace;
1023
+ this.#creationStackTraceTarget = creationStackTraceData.creationStackTraceTarget;
1024
+ }
1025
+
1026
+ setBackForwardCacheDetails(event: Protocol.Page.BackForwardCacheNotUsedEvent): void {
1027
+ this.backForwardCacheDetails.restoredFromCache = false;
1028
+ this.backForwardCacheDetails.explanations = event.notRestoredExplanations;
1029
+ this.backForwardCacheDetails.explanationsTree = event.notRestoredExplanationsTree;
1030
+ }
1031
+
1032
+ getResourcesMap(): Map<string, Resource> {
1033
+ return this.resourcesMap;
1034
+ }
1035
+ }
1036
+
1037
+ export class PageDispatcher implements ProtocolProxyApi.PageDispatcher {
1038
+ #resourceTreeModel: ResourceTreeModel;
1039
+ constructor(resourceTreeModel: ResourceTreeModel) {
1040
+ this.#resourceTreeModel = resourceTreeModel;
1041
+ }
1042
+ backForwardCacheNotUsed(params: Protocol.Page.BackForwardCacheNotUsedEvent): void {
1043
+ this.#resourceTreeModel.onBackForwardCacheNotUsed(params);
1044
+ }
1045
+
1046
+ domContentEventFired({timestamp}: Protocol.Page.DomContentEventFiredEvent): void {
1047
+ this.#resourceTreeModel.dispatchEventToListeners(Events.DOMContentLoaded, timestamp);
1048
+ }
1049
+
1050
+ loadEventFired({timestamp}: Protocol.Page.LoadEventFiredEvent): void {
1051
+ this.#resourceTreeModel.dispatchEventToListeners(
1052
+ Events.Load, {resourceTreeModel: this.#resourceTreeModel, loadTime: timestamp});
1053
+ }
1054
+
1055
+ lifecycleEvent({frameId, name}: Protocol.Page.LifecycleEventEvent): void {
1056
+ this.#resourceTreeModel.dispatchEventToListeners(Events.LifecycleEvent, {frameId, name});
1057
+ }
1058
+
1059
+ frameAttached({frameId, parentFrameId, stack}: Protocol.Page.FrameAttachedEvent): void {
1060
+ this.#resourceTreeModel.frameAttached(frameId, parentFrameId, stack);
1061
+ }
1062
+
1063
+ frameNavigated({frame, type}: Protocol.Page.FrameNavigatedEvent): void {
1064
+ this.#resourceTreeModel.frameNavigated(frame, type);
1065
+ }
1066
+
1067
+ documentOpened({frame}: Protocol.Page.DocumentOpenedEvent): void {
1068
+ this.#resourceTreeModel.documentOpened(frame);
1069
+ }
1070
+
1071
+ frameDetached({frameId, reason}: Protocol.Page.FrameDetachedEvent): void {
1072
+ this.#resourceTreeModel.frameDetached(frameId, reason === Protocol.Page.FrameDetachedEventReason.Swap);
1073
+ }
1074
+
1075
+ frameSubtreeWillBeDetached(_params: Protocol.Page.FrameSubtreeWillBeDetachedEvent): void {
1076
+ }
1077
+
1078
+ frameStartedLoading({}: Protocol.Page.FrameStartedLoadingEvent): void {
1079
+ }
1080
+
1081
+ frameStoppedLoading({}: Protocol.Page.FrameStoppedLoadingEvent): void {
1082
+ }
1083
+
1084
+ frameRequestedNavigation({}: Protocol.Page.FrameRequestedNavigationEvent): void {
1085
+ }
1086
+
1087
+ frameScheduledNavigation({}: Protocol.Page.FrameScheduledNavigationEvent): void {
1088
+ }
1089
+
1090
+ frameClearedScheduledNavigation({}: Protocol.Page.FrameClearedScheduledNavigationEvent): void {
1091
+ }
1092
+
1093
+ frameStartedNavigating({}: Protocol.Page.FrameStartedNavigatingEvent): void {
1094
+ }
1095
+
1096
+ navigatedWithinDocument({}: Protocol.Page.NavigatedWithinDocumentEvent): void {
1097
+ }
1098
+
1099
+ frameResized(): void {
1100
+ this.#resourceTreeModel.dispatchEventToListeners(Events.FrameResized);
1101
+ }
1102
+
1103
+ javascriptDialogOpening(event: Protocol.Page.JavascriptDialogOpeningEvent): void {
1104
+ this.#resourceTreeModel.dispatchEventToListeners(Events.JavaScriptDialogOpening, event);
1105
+ if (!event.hasBrowserHandler) {
1106
+ void this.#resourceTreeModel.agent.invoke_handleJavaScriptDialog({accept: false});
1107
+ }
1108
+ }
1109
+
1110
+ javascriptDialogClosed({}: Protocol.Page.JavascriptDialogClosedEvent): void {
1111
+ }
1112
+
1113
+ screencastFrame({}: Protocol.Page.ScreencastFrameEvent): void {
1114
+ }
1115
+
1116
+ screencastVisibilityChanged({}: Protocol.Page.ScreencastVisibilityChangedEvent): void {
1117
+ }
1118
+
1119
+ interstitialShown(): void {
1120
+ this.#resourceTreeModel.isInterstitialShowing = true;
1121
+ this.#resourceTreeModel.dispatchEventToListeners(Events.InterstitialShown);
1122
+ }
1123
+
1124
+ interstitialHidden(): void {
1125
+ this.#resourceTreeModel.isInterstitialShowing = false;
1126
+ this.#resourceTreeModel.dispatchEventToListeners(Events.InterstitialHidden);
1127
+ }
1128
+
1129
+ windowOpen({}: Protocol.Page.WindowOpenEvent): void {
1130
+ }
1131
+
1132
+ compilationCacheProduced({}: Protocol.Page.CompilationCacheProducedEvent): void {
1133
+ }
1134
+
1135
+ fileChooserOpened({}: Protocol.Page.FileChooserOpenedEvent): void {
1136
+ }
1137
+
1138
+ downloadWillBegin({}: Protocol.Page.DownloadWillBeginEvent): void {
1139
+ }
1140
+
1141
+ downloadProgress(): void {
1142
+ }
1143
+ }
1144
+
1145
+ SDKModel.register(ResourceTreeModel, {capabilities: Capability.DOM, autostart: true, early: true});
1146
+ export interface SecurityOriginData {
1147
+ securityOrigins: Set<string>;
1148
+ mainSecurityOrigin: string|null;
1149
+ unreachableMainSecurityOrigin: string|null;
1150
+ }
1151
+
1152
+ export interface StorageKeyData {
1153
+ storageKeys: Set<string>;
1154
+ mainStorageKey: string|null;
1155
+ }
1156
+
1157
+ export const enum PrimaryPageChangeType {
1158
+ NAVIGATION = 'Navigation',
1159
+ ACTIVATION = 'Activation',
1160
+ }