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.
- package/generate.ts +643 -0
- package/index.ts +16 -0
- package/lib/front_end/core/common/App.ts +7 -0
- package/lib/front_end/core/common/AppProvider.ts +32 -0
- package/lib/front_end/core/common/Base64.ts +47 -0
- package/lib/front_end/core/common/CharacterIdMap.ts +30 -0
- package/lib/front_end/core/common/Color.ts +2506 -0
- package/lib/front_end/core/common/ColorConverter.ts +402 -0
- package/lib/front_end/core/common/ColorUtils.ts +252 -0
- package/lib/front_end/core/common/Console.ts +114 -0
- package/lib/front_end/core/common/Debouncer.ts +15 -0
- package/lib/front_end/core/common/EventTarget.ts +52 -0
- package/lib/front_end/core/common/Gzip.ts +74 -0
- package/lib/front_end/core/common/JavaScriptMetaData.ts +29 -0
- package/lib/front_end/core/common/Lazy.ts +31 -0
- package/lib/front_end/core/common/Linkifier.ts +55 -0
- package/lib/front_end/core/common/MapWithDefault.ts +26 -0
- package/lib/front_end/core/common/Mutex.ts +55 -0
- package/lib/front_end/core/common/Object.ts +145 -0
- package/lib/front_end/core/common/ParsedURL.ts +554 -0
- package/lib/front_end/core/common/Progress.ts +180 -0
- package/lib/front_end/core/common/QueryParamHandler.ts +7 -0
- package/lib/front_end/core/common/ResolverBase.ts +85 -0
- package/lib/front_end/core/common/ResourceType.ts +588 -0
- package/lib/front_end/core/common/ReturnToPanel.ts +17 -0
- package/lib/front_end/core/common/Revealer.ts +192 -0
- package/lib/front_end/core/common/Runnable.ts +41 -0
- package/lib/front_end/core/common/SegmentedRange.ts +87 -0
- package/lib/front_end/core/common/SettingRegistration.ts +339 -0
- package/lib/front_end/core/common/Settings.ts +1497 -0
- package/lib/front_end/core/common/SimpleHistoryManager.ts +124 -0
- package/lib/front_end/core/common/StringOutputStream.ts +26 -0
- package/lib/front_end/core/common/TextDictionary.ts +48 -0
- package/lib/front_end/core/common/Throttler.ts +99 -0
- package/lib/front_end/core/common/Trie.ts +152 -0
- package/lib/front_end/core/common/Worker.ts +60 -0
- package/lib/front_end/core/common/common.ts +81 -0
- package/lib/front_end/core/host/AidaClient.ts +733 -0
- package/lib/front_end/core/host/GdpClient.ts +316 -0
- package/lib/front_end/core/host/InspectorFrontendHost.ts +648 -0
- package/lib/front_end/core/host/InspectorFrontendHostAPI.ts +551 -0
- package/lib/front_end/core/host/Platform.ts +76 -0
- package/lib/front_end/core/host/ResourceLoader.ts +282 -0
- package/lib/front_end/core/host/UserMetrics.ts +1230 -0
- package/lib/front_end/core/host/host.ts +23 -0
- package/lib/front_end/core/i18n/ByteUtilities.ts +82 -0
- package/lib/front_end/core/i18n/DevToolsLocale.ts +87 -0
- package/lib/front_end/core/i18n/NumberFormatter.ts +82 -0
- package/lib/front_end/core/i18n/i18n.ts +17 -0
- package/lib/front_end/core/i18n/i18nImpl.ts +204 -0
- package/lib/front_end/core/i18n/i18nTypes.ts +10 -0
- package/lib/front_end/core/i18n/locales.js +14 -0
- package/lib/front_end/core/i18n/time-utilities.ts +174 -0
- package/lib/front_end/core/platform/ArrayUtilities.ts +271 -0
- package/lib/front_end/core/platform/Brand.ts +23 -0
- package/lib/front_end/core/platform/Constructor.ts +10 -0
- package/lib/front_end/core/platform/DOMUtilities.ts +138 -0
- package/lib/front_end/core/platform/DateUtilities.ts +15 -0
- package/lib/front_end/core/platform/DevToolsPath.ts +53 -0
- package/lib/front_end/core/platform/KeyboardUtilities.ts +38 -0
- package/lib/front_end/core/platform/MapUtilities.ts +95 -0
- package/lib/front_end/core/platform/MimeType.ts +175 -0
- package/lib/front_end/core/platform/NumberUtilities.ts +80 -0
- package/lib/front_end/core/platform/StringUtilities.ts +588 -0
- package/lib/front_end/core/platform/Timing.ts +17 -0
- package/lib/front_end/core/platform/TypedArrayUtilities.ts +189 -0
- package/lib/front_end/core/platform/TypescriptUtilities.ts +86 -0
- package/lib/front_end/core/platform/UIString.ts +39 -0
- package/lib/front_end/core/platform/UserVisibleError.ts +28 -0
- package/lib/front_end/core/platform/platform.ts +45 -0
- package/lib/front_end/core/protocol_client/ConnectionTransport.ts +26 -0
- package/lib/front_end/core/protocol_client/InspectorBackend.ts +1050 -0
- package/lib/front_end/core/protocol_client/NodeURL.ts +42 -0
- package/lib/front_end/core/protocol_client/protocol_client.ts +13 -0
- package/lib/front_end/core/root/Runtime.ts +609 -0
- package/lib/front_end/core/root/root.ts +6 -0
- package/lib/front_end/core/sdk/AccessibilityModel.ts +353 -0
- package/lib/front_end/core/sdk/AnimationModel.ts +1041 -0
- package/lib/front_end/core/sdk/AutofillModel.ts +184 -0
- package/lib/front_end/core/sdk/CPUProfilerModel.ts +148 -0
- package/lib/front_end/core/sdk/CPUThrottlingManager.ts +282 -0
- package/lib/front_end/core/sdk/CSSContainerQuery.ts +139 -0
- package/lib/front_end/core/sdk/CSSFontFace.ts +40 -0
- package/lib/front_end/core/sdk/CSSLayer.ts +30 -0
- package/lib/front_end/core/sdk/CSSMatchedStyles.ts +1646 -0
- package/lib/front_end/core/sdk/CSSMedia.ts +121 -0
- package/lib/front_end/core/sdk/CSSMetadata.ts +1647 -0
- package/lib/front_end/core/sdk/CSSModel.ts +1128 -0
- package/lib/front_end/core/sdk/CSSProperty.ts +384 -0
- package/lib/front_end/core/sdk/CSSPropertyParser.ts +681 -0
- package/lib/front_end/core/sdk/CSSPropertyParserMatchers.ts +1395 -0
- package/lib/front_end/core/sdk/CSSQuery.ts +72 -0
- package/lib/front_end/core/sdk/CSSRule.ts +465 -0
- package/lib/front_end/core/sdk/CSSScope.ts +30 -0
- package/lib/front_end/core/sdk/CSSStartingStyle.ts +29 -0
- package/lib/front_end/core/sdk/CSSStyleDeclaration.ts +313 -0
- package/lib/front_end/core/sdk/CSSStyleSheetHeader.ts +196 -0
- package/lib/front_end/core/sdk/CSSSupports.ts +33 -0
- package/lib/front_end/core/sdk/CategorizedBreakpoint.ts +64 -0
- package/lib/front_end/core/sdk/ChildTargetManager.ts +314 -0
- package/lib/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +62 -0
- package/lib/front_end/core/sdk/Connections.ts +293 -0
- package/lib/front_end/core/sdk/ConsoleModel.ts +808 -0
- package/lib/front_end/core/sdk/ConsoleModelTypes.ts +15 -0
- package/lib/front_end/core/sdk/Cookie.ts +319 -0
- package/lib/front_end/core/sdk/CookieModel.ts +239 -0
- package/lib/front_end/core/sdk/CookieParser.ts +185 -0
- package/lib/front_end/core/sdk/DOMDebuggerModel.ts +787 -0
- package/lib/front_end/core/sdk/DOMModel.ts +1961 -0
- package/lib/front_end/core/sdk/DebuggerModel.ts +1605 -0
- package/lib/front_end/core/sdk/EmulationModel.ts +648 -0
- package/lib/front_end/core/sdk/EnhancedTracesParser.ts +515 -0
- package/lib/front_end/core/sdk/EventBreakpointsModel.ts +183 -0
- package/lib/front_end/core/sdk/FrameAssociated.ts +11 -0
- package/lib/front_end/core/sdk/FrameManager.ts +259 -0
- package/lib/front_end/core/sdk/HeapProfilerModel.ts +225 -0
- package/lib/front_end/core/sdk/HttpReasonPhraseStrings.ts +77 -0
- package/lib/front_end/core/sdk/IOModel.ts +91 -0
- package/lib/front_end/core/sdk/IsolateManager.ts +257 -0
- package/lib/front_end/core/sdk/IssuesModel.ts +70 -0
- package/lib/front_end/core/sdk/LayerTreeBase.ts +169 -0
- package/lib/front_end/core/sdk/LogModel.ts +56 -0
- package/lib/front_end/core/sdk/NetworkManager.ts +2823 -0
- package/lib/front_end/core/sdk/NetworkRequest.ts +2253 -0
- package/lib/front_end/core/sdk/OverlayColorGenerator.ts +52 -0
- package/lib/front_end/core/sdk/OverlayModel.ts +1011 -0
- package/lib/front_end/core/sdk/OverlayPersistentHighlighter.ts +522 -0
- package/lib/front_end/core/sdk/PageLoad.ts +35 -0
- package/lib/front_end/core/sdk/PageResourceLoader.ts +435 -0
- package/lib/front_end/core/sdk/PaintProfiler.ts +110 -0
- package/lib/front_end/core/sdk/PerformanceMetricsModel.ts +84 -0
- package/lib/front_end/core/sdk/PreloadingModel.ts +863 -0
- package/lib/front_end/core/sdk/RehydratingConnection.ts +386 -0
- package/lib/front_end/core/sdk/RehydratingObject.ts +66 -0
- package/lib/front_end/core/sdk/RemoteObject.ts +1160 -0
- package/lib/front_end/core/sdk/Resource.ts +232 -0
- package/lib/front_end/core/sdk/ResourceTreeModel.ts +1160 -0
- package/lib/front_end/core/sdk/RuntimeModel.ts +732 -0
- package/lib/front_end/core/sdk/SDKModel.ts +65 -0
- package/lib/front_end/core/sdk/ScopeTreeCache.ts +45 -0
- package/lib/front_end/core/sdk/ScreenCaptureModel.ts +255 -0
- package/lib/front_end/core/sdk/Script.ts +534 -0
- package/lib/front_end/core/sdk/SecurityOriginManager.ts +76 -0
- package/lib/front_end/core/sdk/ServerSentEvents.ts +80 -0
- package/lib/front_end/core/sdk/ServerSentEventsProtocol.ts +122 -0
- package/lib/front_end/core/sdk/ServerTiming.ts +260 -0
- package/lib/front_end/core/sdk/ServiceWorkerCacheModel.ts +377 -0
- package/lib/front_end/core/sdk/ServiceWorkerManager.ts +605 -0
- package/lib/front_end/core/sdk/SourceMap.ts +867 -0
- package/lib/front_end/core/sdk/SourceMapCache.ts +54 -0
- package/lib/front_end/core/sdk/SourceMapFunctionRanges.ts +156 -0
- package/lib/front_end/core/sdk/SourceMapManager.ts +239 -0
- package/lib/front_end/core/sdk/SourceMapScopeChainEntry.ts +189 -0
- package/lib/front_end/core/sdk/SourceMapScopesInfo.ts +508 -0
- package/lib/front_end/core/sdk/StorageBucketsModel.ts +204 -0
- package/lib/front_end/core/sdk/StorageKeyManager.ts +98 -0
- package/lib/front_end/core/sdk/Target.ts +332 -0
- package/lib/front_end/core/sdk/TargetManager.ts +453 -0
- package/lib/front_end/core/sdk/TraceObject.ts +61 -0
- package/lib/front_end/core/sdk/WebAuthnModel.ts +104 -0
- package/lib/front_end/core/sdk/sdk.ts +174 -0
- package/lib/front_end/entrypoints/formatter_worker/FormatterActions.ts +59 -0
- package/lib/front_end/generated/InspectorBackendCommands.js +1617 -0
- package/lib/front_end/generated/SupportedCSSProperties.js +7512 -0
- package/lib/front_end/generated/protocol-proxy-api.d.ts +5022 -0
- package/lib/front_end/generated/protocol.ts +22014 -0
- package/lib/front_end/models/cpu_profile/CPUProfileDataModel.ts +571 -0
- package/lib/front_end/models/cpu_profile/ProfileTreeModel.ts +103 -0
- package/lib/front_end/models/cpu_profile/cpu_profile.ts +11 -0
- package/lib/front_end/models/formatter/FormatterWorkerPool.ts +219 -0
- package/lib/front_end/models/formatter/ScriptFormatter.ts +112 -0
- package/lib/front_end/models/formatter/formatter.ts +8 -0
- package/lib/front_end/models/text_utils/CodeMirrorUtils.ts +37 -0
- package/lib/front_end/models/text_utils/ContentData.ts +199 -0
- package/lib/front_end/models/text_utils/ContentProvider.ts +68 -0
- package/lib/front_end/models/text_utils/StaticContentProvider.ts +49 -0
- package/lib/front_end/models/text_utils/StreamingContentData.ts +108 -0
- package/lib/front_end/models/text_utils/Text.ts +90 -0
- package/lib/front_end/models/text_utils/TextCursor.ts +44 -0
- package/lib/front_end/models/text_utils/TextRange.ts +266 -0
- package/lib/front_end/models/text_utils/TextUtils.ts +401 -0
- package/lib/front_end/models/text_utils/WasmDisassembly.ts +87 -0
- package/lib/front_end/models/text_utils/text_utils.ts +27 -0
- package/lib/front_end/models/trace/EntityMapper.ts +141 -0
- package/lib/front_end/models/trace/EventsSerializer.ts +101 -0
- package/lib/front_end/models/trace/LanternComputationData.ts +438 -0
- package/lib/front_end/models/trace/ModelImpl.ts +236 -0
- package/lib/front_end/models/trace/Name.ts +136 -0
- package/lib/front_end/models/trace/Processor.ts +652 -0
- package/lib/front_end/models/trace/Styles.ts +1138 -0
- package/lib/front_end/models/trace/extras/FilmStrip.ts +78 -0
- package/lib/front_end/models/trace/extras/MainThreadActivity.ts +86 -0
- package/lib/front_end/models/trace/extras/ScriptDuplication.ts +236 -0
- package/lib/front_end/models/trace/extras/StackTraceForEvent.ts +203 -0
- package/lib/front_end/models/trace/extras/ThirdParties.ts +164 -0
- package/lib/front_end/models/trace/extras/TraceFilter.ts +62 -0
- package/lib/front_end/models/trace/extras/TraceTree.ts +701 -0
- package/lib/front_end/models/trace/extras/extras.ts +11 -0
- package/lib/front_end/models/trace/handlers/AnimationFramesHandler.ts +128 -0
- package/lib/front_end/models/trace/handlers/AnimationHandler.ts +36 -0
- package/lib/front_end/models/trace/handlers/AsyncJSCallsHandler.ts +239 -0
- package/lib/front_end/models/trace/handlers/AuctionWorkletsHandler.ts +183 -0
- package/lib/front_end/models/trace/handlers/DOMStatsHandler.ts +31 -0
- package/lib/front_end/models/trace/handlers/ExtensionTraceDataHandler.ts +306 -0
- package/lib/front_end/models/trace/handlers/FlowsHandler.ts +175 -0
- package/lib/front_end/models/trace/handlers/FramesHandler.ts +571 -0
- package/lib/front_end/models/trace/handlers/GPUHandler.ts +50 -0
- package/lib/front_end/models/trace/handlers/ImagePaintingHandler.ts +183 -0
- package/lib/front_end/models/trace/handlers/InitiatorsHandler.ts +193 -0
- package/lib/front_end/models/trace/handlers/InvalidationsHandler.ts +168 -0
- package/lib/front_end/models/trace/handlers/LargestImagePaintHandler.ts +109 -0
- package/lib/front_end/models/trace/handlers/LargestTextPaintHandler.ts +35 -0
- package/lib/front_end/models/trace/handlers/LayerTreeHandler.ts +123 -0
- package/lib/front_end/models/trace/handlers/LayoutShiftsHandler.ts +573 -0
- package/lib/front_end/models/trace/handlers/MemoryHandler.ts +31 -0
- package/lib/front_end/models/trace/handlers/MetaHandler.ts +525 -0
- package/lib/front_end/models/trace/handlers/ModelHandlers.ts +34 -0
- package/lib/front_end/models/trace/handlers/NetworkRequestsHandler.ts +672 -0
- package/lib/front_end/models/trace/handlers/PageFramesHandler.ts +52 -0
- package/lib/front_end/models/trace/handlers/PageLoadMetricsHandler.ts +460 -0
- package/lib/front_end/models/trace/handlers/RendererHandler.ts +428 -0
- package/lib/front_end/models/trace/handlers/SamplesHandler.ts +271 -0
- package/lib/front_end/models/trace/handlers/ScreenshotsHandler.ts +122 -0
- package/lib/front_end/models/trace/handlers/ScriptsHandler.ts +336 -0
- package/lib/front_end/models/trace/handlers/SelectorStatsHandler.ts +110 -0
- package/lib/front_end/models/trace/handlers/Threads.ts +139 -0
- package/lib/front_end/models/trace/handlers/UserInteractionsHandler.ts +400 -0
- package/lib/front_end/models/trace/handlers/UserTimingsHandler.ts +233 -0
- package/lib/front_end/models/trace/handlers/WarningsHandler.ts +162 -0
- package/lib/front_end/models/trace/handlers/WorkersHandler.ts +45 -0
- package/lib/front_end/models/trace/handlers/handlers.ts +8 -0
- package/lib/front_end/models/trace/handlers/helpers.ts +196 -0
- package/lib/front_end/models/trace/handlers/types.ts +75 -0
- package/lib/front_end/models/trace/helpers/Extensions.ts +54 -0
- package/lib/front_end/models/trace/helpers/Network.ts +129 -0
- package/lib/front_end/models/trace/helpers/SamplesIntegrator.ts +544 -0
- package/lib/front_end/models/trace/helpers/SyntheticEvents.ts +87 -0
- package/lib/front_end/models/trace/helpers/Timing.ts +248 -0
- package/lib/front_end/models/trace/helpers/Trace.ts +928 -0
- package/lib/front_end/models/trace/helpers/TreeHelpers.ts +320 -0
- package/lib/front_end/models/trace/helpers/helpers.ts +11 -0
- package/lib/front_end/models/trace/insights/CLSCulprits.ts +668 -0
- package/lib/front_end/models/trace/insights/Cache.ts +269 -0
- package/lib/front_end/models/trace/insights/Common.ts +453 -0
- package/lib/front_end/models/trace/insights/DOMSize.ts +223 -0
- package/lib/front_end/models/trace/insights/DocumentLatency.ts +319 -0
- package/lib/front_end/models/trace/insights/DuplicatedJavaScript.ts +126 -0
- package/lib/front_end/models/trace/insights/FontDisplay.ts +119 -0
- package/lib/front_end/models/trace/insights/ForcedReflow.ts +220 -0
- package/lib/front_end/models/trace/insights/INPBreakdown.ts +171 -0
- package/lib/front_end/models/trace/insights/ImageDelivery.ts +348 -0
- package/lib/front_end/models/trace/insights/LCPBreakdown.ts +268 -0
- package/lib/front_end/models/trace/insights/LCPDiscovery.ts +237 -0
- package/lib/front_end/models/trace/insights/LegacyJavaScript.ts +138 -0
- package/lib/front_end/models/trace/insights/Models.ts +22 -0
- package/lib/front_end/models/trace/insights/ModernHTTP.ts +257 -0
- package/lib/front_end/models/trace/insights/NetworkDependencyTree.ts +726 -0
- package/lib/front_end/models/trace/insights/RenderBlocking.ts +257 -0
- package/lib/front_end/models/trace/insights/SlowCSSSelector.ts +175 -0
- package/lib/front_end/models/trace/insights/Statistics.ts +101 -0
- package/lib/front_end/models/trace/insights/ThirdParties.ts +130 -0
- package/lib/front_end/models/trace/insights/Viewport.ts +138 -0
- package/lib/front_end/models/trace/insights/insights.ts +10 -0
- package/lib/front_end/models/trace/insights/types.ts +157 -0
- package/lib/front_end/models/trace/lantern/core/LanternError.ts +7 -0
- package/lib/front_end/models/trace/lantern/core/NetworkAnalyzer.ts +619 -0
- package/lib/front_end/models/trace/lantern/core/core.ts +6 -0
- package/lib/front_end/models/trace/lantern/graph/BaseNode.ts +345 -0
- package/lib/front_end/models/trace/lantern/graph/CPUNode.ts +80 -0
- package/lib/front_end/models/trace/lantern/graph/NetworkNode.ts +101 -0
- package/lib/front_end/models/trace/lantern/graph/PageDependencyGraph.ts +636 -0
- package/lib/front_end/models/trace/lantern/graph/graph.ts +8 -0
- package/lib/front_end/models/trace/lantern/lantern.ts +17 -0
- package/lib/front_end/models/trace/lantern/metrics/FirstContentfulPaint.ts +187 -0
- package/lib/front_end/models/trace/lantern/metrics/Interactive.ts +88 -0
- package/lib/front_end/models/trace/lantern/metrics/LargestContentfulPaint.ts +92 -0
- package/lib/front_end/models/trace/lantern/metrics/MaxPotentialFID.ts +72 -0
- package/lib/front_end/models/trace/lantern/metrics/Metric.ts +126 -0
- package/lib/front_end/models/trace/lantern/metrics/SpeedIndex.ts +126 -0
- package/lib/front_end/models/trace/lantern/metrics/TBTUtils.ts +82 -0
- package/lib/front_end/models/trace/lantern/metrics/TotalBlockingTime.ts +112 -0
- package/lib/front_end/models/trace/lantern/metrics/metrics.ts +12 -0
- package/lib/front_end/models/trace/lantern/simulation/ConnectionPool.ts +150 -0
- package/lib/front_end/models/trace/lantern/simulation/Constants.ts +46 -0
- package/lib/front_end/models/trace/lantern/simulation/DNSCache.ts +61 -0
- package/lib/front_end/models/trace/lantern/simulation/SimulationTimingMap.ts +196 -0
- package/lib/front_end/models/trace/lantern/simulation/Simulator.ts +556 -0
- package/lib/front_end/models/trace/lantern/simulation/TCPConnection.ts +192 -0
- package/lib/front_end/models/trace/lantern/simulation/simulation.ts +10 -0
- package/lib/front_end/models/trace/lantern/types/Lantern.ts +220 -0
- package/lib/front_end/models/trace/lantern/types/types.ts +5 -0
- package/lib/front_end/models/trace/trace.ts +33 -0
- package/lib/front_end/models/trace/types/Configuration.ts +110 -0
- package/lib/front_end/models/trace/types/Extensions.ts +136 -0
- package/lib/front_end/models/trace/types/File.ts +281 -0
- package/lib/front_end/models/trace/types/Overlays.ts +138 -0
- package/lib/front_end/models/trace/types/Timing.ts +30 -0
- package/lib/front_end/models/trace/types/TraceEvents.ts +3277 -0
- package/lib/front_end/models/trace/types/types.ts +10 -0
- package/lib/front_end/third_party/i18n/LICENSE +202 -0
- package/lib/front_end/third_party/i18n/README.chromium +15 -0
- package/lib/front_end/third_party/i18n/i18n-impl.ts +61 -0
- package/lib/front_end/third_party/i18n/i18n.ts +11 -0
- package/lib/front_end/third_party/i18n/localized-string-set.ts +129 -0
- package/lib/front_end/third_party/intl-messageformat/LICENSE +33 -0
- package/lib/front_end/third_party/intl-messageformat/README.chromium +24 -0
- package/lib/front_end/third_party/intl-messageformat/intl-messageformat-tsconfig.json +16 -0
- package/lib/front_end/third_party/intl-messageformat/intl-messageformat.ts +6 -0
- package/lib/front_end/third_party/intl-messageformat/package/LICENSE.md +33 -0
- package/lib/front_end/third_party/intl-messageformat/package/README.md +3 -0
- package/lib/front_end/third_party/intl-messageformat/package/index.d.ts +6 -0
- package/lib/front_end/third_party/intl-messageformat/package/index.d.ts.map +1 -0
- package/lib/front_end/third_party/intl-messageformat/package/index.js +13 -0
- package/lib/front_end/third_party/intl-messageformat/package/intl-messageformat.esm.d.ts +5 -0
- package/lib/front_end/third_party/intl-messageformat/package/intl-messageformat.esm.js +1710 -0
- package/lib/front_end/third_party/intl-messageformat/package/intl-messageformat.iife.js +1815 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/index.d.ts +6 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/index.d.ts.map +1 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/index.js +10 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/src/core.d.ts +34 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/src/core.d.ts.map +1 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/src/core.js +229 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/src/error.d.ts +28 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/src/error.d.ts.map +1 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/src/error.js +48 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/src/formatters.d.ts +34 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/src/formatters.d.ts.map +1 -0
- package/lib/front_end/third_party/intl-messageformat/package/lib/src/formatters.js +179 -0
- package/lib/front_end/third_party/intl-messageformat/package/package.json +42 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/core.d.ts +34 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/core.d.ts.map +1 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/core.js +230 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/error.d.ts +28 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/error.d.ts.map +1 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/error.js +51 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/formatters.d.ts +34 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/formatters.d.ts.map +1 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/formatters.js +182 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/error.d.ts +79 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/index.d.ts +15 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/parser.d.ts +153 -0
- package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/types.d.ts +139 -0
- package/lib/front_end/third_party/legacy-javascript/LICENSE +202 -0
- package/lib/front_end/third_party/legacy-javascript/README.chromium +13 -0
- package/lib/front_end/third_party/legacy-javascript/legacy-javascript-tsconfig.json +8 -0
- package/lib/front_end/third_party/legacy-javascript/legacy-javascript.ts +3 -0
- package/lib/front_end/third_party/legacy-javascript/lib/legacy-javascript.d.ts +18 -0
- package/lib/front_end/third_party/legacy-javascript/lib/legacy-javascript.js +943 -0
- package/lib/front_end/third_party/legacy-javascript/package.json +8 -0
- package/lib/front_end/third_party/legacy-javascript/rebuild.sh +9 -0
- package/lib/front_end/third_party/third-party-web/LICENSE +20 -0
- package/lib/front_end/third_party/third-party-web/README.chromium +13 -0
- package/lib/front_end/third_party/third-party-web/lib/nostats-subset.d.ts +2 -0
- package/lib/front_end/third_party/third-party-web/lib/nostats-subset.js +149 -0
- package/lib/front_end/third_party/third-party-web/package/LICENSE +20 -0
- package/lib/front_end/third_party/third-party-web/package/README.md +929 -0
- package/lib/front_end/third_party/third-party-web/package/dist/entities-httparchive-nostats.json +1 -0
- package/lib/front_end/third_party/third-party-web/package/dist/entities-httparchive.json +1 -0
- package/lib/front_end/third_party/third-party-web/package/dist/entities-nostats.json +1 -0
- package/lib/front_end/third_party/third-party-web/package/dist/entities.json +1 -0
- package/lib/front_end/third_party/third-party-web/package/facades.md +46 -0
- package/lib/front_end/third_party/third-party-web/package/httparchive-nostats-subset.d.ts +1 -0
- package/lib/front_end/third_party/third-party-web/package/httparchive-nostats-subset.js +1 -0
- package/lib/front_end/third_party/third-party-web/package/httparchive-subset.d.ts +1 -0
- package/lib/front_end/third_party/third-party-web/package/httparchive-subset.js +1 -0
- package/lib/front_end/third_party/third-party-web/package/lib/__snapshots__/index.test.js.snap +1006 -0
- package/lib/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.js +139 -0
- package/lib/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.test.js +44 -0
- package/lib/front_end/third_party/third-party-web/package/lib/entities.test.js +27 -0
- package/lib/front_end/third_party/third-party-web/package/lib/index.d.ts +34 -0
- package/lib/front_end/third_party/third-party-web/package/lib/index.js +3 -0
- package/lib/front_end/third_party/third-party-web/package/lib/index.test.js +246 -0
- package/lib/front_end/third_party/third-party-web/package/lib/markdown/faqs.partial.md +36 -0
- package/lib/front_end/third_party/third-party-web/package/lib/markdown/goals.partial.md +9 -0
- package/lib/front_end/third_party/third-party-web/package/lib/markdown/methodology.partial.md +5 -0
- package/lib/front_end/third_party/third-party-web/package/lib/markdown/template.md +151 -0
- package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-02-01.md +1 -0
- package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-03-01.md +1 -0
- package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-05-06.md +1 -0
- package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-05-13.md +14 -0
- package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2021-01-01.md +1 -0
- package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2024-07-01.md +3 -0
- package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.d.ts +1 -0
- package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.js +3 -0
- package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive.d.ts +1 -0
- package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive.js +3 -0
- package/lib/front_end/third_party/third-party-web/package/lib/subsets/nostats.d.ts +1 -0
- package/lib/front_end/third_party/third-party-web/package/lib/subsets/nostats.js +3 -0
- package/lib/front_end/third_party/third-party-web/package/nostats-subset.d.ts +1 -0
- package/lib/front_end/third_party/third-party-web/package/nostats-subset.js +1 -0
- package/lib/front_end/third_party/third-party-web/package/package.json +46 -0
- package/lib/front_end/third_party/third-party-web/package.json +8 -0
- package/lib/front_end/third_party/third-party-web/rebuild.sh +13 -0
- package/lib/front_end/third_party/third-party-web/third-party-web-tsconfig.json +8 -0
- package/lib/front_end/third_party/third-party-web/third-party-web.ts +3 -0
- package/package.json +24 -0
- package/patches/chrome-devtools-frontend+1.0.1533544.patch +187 -0
|
@@ -0,0 +1,863 @@
|
|
|
1
|
+
// Copyright 2023 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 type * as Common from '../common/common.js';
|
|
8
|
+
import {MapWithDefault} from '../common/MapWithDefault.js';
|
|
9
|
+
import {assertNotNullOrUndefined} from '../platform/platform.js';
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
Events as ResourceTreeModelEvents,
|
|
13
|
+
PrimaryPageChangeType,
|
|
14
|
+
type ResourceTreeFrame,
|
|
15
|
+
ResourceTreeModel,
|
|
16
|
+
} from './ResourceTreeModel.js';
|
|
17
|
+
import {SDKModel} from './SDKModel.js';
|
|
18
|
+
import {Capability, type Target} from './Target.js';
|
|
19
|
+
import {TargetManager} from './TargetManager.js';
|
|
20
|
+
|
|
21
|
+
export interface WithId<I, V> {
|
|
22
|
+
id: I;
|
|
23
|
+
value: V;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Holds preloading related information.
|
|
28
|
+
*
|
|
29
|
+
* - SpeculationRule rule sets
|
|
30
|
+
* - Preloading attempts
|
|
31
|
+
* - Relationship between rule sets and preloading attempts
|
|
32
|
+
**/
|
|
33
|
+
export class PreloadingModel extends SDKModel<EventTypes> {
|
|
34
|
+
private agent: ProtocolProxyApi.PreloadApi;
|
|
35
|
+
private loaderIds: Protocol.Network.LoaderId[] = [];
|
|
36
|
+
private targetJustAttached = true;
|
|
37
|
+
private lastPrimaryPageModel: PreloadingModel|null = null;
|
|
38
|
+
private documents: Map<Protocol.Network.LoaderId, DocumentPreloadingData> =
|
|
39
|
+
new Map<Protocol.Network.LoaderId, DocumentPreloadingData>();
|
|
40
|
+
|
|
41
|
+
constructor(target: Target) {
|
|
42
|
+
super(target);
|
|
43
|
+
|
|
44
|
+
target.registerPreloadDispatcher(new PreloadDispatcher(this));
|
|
45
|
+
|
|
46
|
+
this.agent = target.preloadAgent();
|
|
47
|
+
void this.agent.invoke_enable();
|
|
48
|
+
|
|
49
|
+
const targetInfo = target.targetInfo();
|
|
50
|
+
if (targetInfo !== undefined && targetInfo.subtype === 'prerender') {
|
|
51
|
+
this.lastPrimaryPageModel = TargetManager.instance().primaryPageTarget()?.model(PreloadingModel) || null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
TargetManager.instance().addModelListener(
|
|
55
|
+
ResourceTreeModel, ResourceTreeModelEvents.PrimaryPageChanged, this.onPrimaryPageChanged, this);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
override dispose(): void {
|
|
59
|
+
super.dispose();
|
|
60
|
+
|
|
61
|
+
TargetManager.instance().removeModelListener(
|
|
62
|
+
ResourceTreeModel, ResourceTreeModelEvents.PrimaryPageChanged, this.onPrimaryPageChanged, this);
|
|
63
|
+
|
|
64
|
+
void this.agent.invoke_disable();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private ensureDocumentPreloadingData(loaderId: Protocol.Network.LoaderId): void {
|
|
68
|
+
if (this.documents.get(loaderId) === undefined) {
|
|
69
|
+
this.documents.set(loaderId, new DocumentPreloadingData());
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private currentLoaderId(): Protocol.Network.LoaderId|null {
|
|
74
|
+
// Target is just attached and didn't received CDP events that we can infer loaderId.
|
|
75
|
+
if (this.targetJustAttached) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (this.loaderIds.length === 0) {
|
|
80
|
+
throw new Error('unreachable');
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return this.loaderIds[this.loaderIds.length - 1];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private currentDocument(): DocumentPreloadingData|null {
|
|
87
|
+
const loaderId = this.currentLoaderId();
|
|
88
|
+
return loaderId === null ? null : this.documents.get(loaderId) || null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Returns a rule set of the current page.
|
|
92
|
+
//
|
|
93
|
+
// Returns reference. Don't save returned values.
|
|
94
|
+
// Returned value may or may not be updated as the time grows.
|
|
95
|
+
getRuleSetById(id: Protocol.Preload.RuleSetId): Protocol.Preload.RuleSet|null {
|
|
96
|
+
return this.currentDocument()?.ruleSets.getById(id) || null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Returns rule sets of the current page.
|
|
100
|
+
//
|
|
101
|
+
// Returns array of pairs of id and reference. Don't save returned references.
|
|
102
|
+
// Returned values may or may not be updated as the time grows.
|
|
103
|
+
getAllRuleSets(): Array<WithId<Protocol.Preload.RuleSetId, Protocol.Preload.RuleSet>> {
|
|
104
|
+
return this.currentDocument()?.ruleSets.getAll() || [];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
getPreloadCountsByRuleSetId(): Map<Protocol.Preload.RuleSetId|null, Map<PreloadingStatus, number>> {
|
|
108
|
+
const countsByRuleSetId = new Map<Protocol.Preload.RuleSetId|null, Map<PreloadingStatus, number>>();
|
|
109
|
+
|
|
110
|
+
for (const {value} of this.getRepresentativePreloadingAttempts(null)) {
|
|
111
|
+
for (const ruleSetId of [null, ...value.ruleSetIds]) {
|
|
112
|
+
if (countsByRuleSetId.get(ruleSetId) === undefined) {
|
|
113
|
+
countsByRuleSetId.set(ruleSetId, new Map<PreloadingStatus, number>());
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const countsByStatus = countsByRuleSetId.get(ruleSetId);
|
|
117
|
+
assertNotNullOrUndefined(countsByStatus);
|
|
118
|
+
const i = countsByStatus.get(value.status) || 0;
|
|
119
|
+
countsByStatus.set(value.status, i + 1);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return countsByRuleSetId;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Returns a preloading attempt of the current page.
|
|
127
|
+
//
|
|
128
|
+
// Returns reference. Don't save returned values.
|
|
129
|
+
// Returned value may or may not be updated as the time grows.
|
|
130
|
+
getPreloadingAttemptById(id: PreloadingAttemptId): PreloadingAttempt|null {
|
|
131
|
+
const document = this.currentDocument();
|
|
132
|
+
if (document === null) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return document.preloadingAttempts.getById(id, document.sources) || null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Returs preloading attempts of the current page that triggered by the rule set with `ruleSetId`.
|
|
140
|
+
// `ruleSetId === null` means "do not filter".
|
|
141
|
+
//
|
|
142
|
+
// Returns array of pairs of id and reference. Don't save returned references.
|
|
143
|
+
// Returned values may or may not be updated as the time grows.
|
|
144
|
+
getRepresentativePreloadingAttempts(ruleSetId: Protocol.Preload.RuleSetId|null):
|
|
145
|
+
Array<WithId<PreloadingAttemptId, PreloadingAttempt>> {
|
|
146
|
+
const document = this.currentDocument();
|
|
147
|
+
if (document === null) {
|
|
148
|
+
return [];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return document.preloadingAttempts.getAllRepresentative(ruleSetId, document.sources);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Returs preloading attempts of the previousPgae.
|
|
155
|
+
//
|
|
156
|
+
// Returns array of pairs of id and reference. Don't save returned references.
|
|
157
|
+
// Returned values may or may not be updated as the time grows.
|
|
158
|
+
getRepresentativePreloadingAttemptsOfPreviousPage(): Array<WithId<PreloadingAttemptId, PreloadingAttempt>> {
|
|
159
|
+
if (this.loaderIds.length <= 1) {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const document = this.documents.get(this.loaderIds[this.loaderIds.length - 2]);
|
|
164
|
+
if (document === undefined) {
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return document.preloadingAttempts.getAllRepresentative(null, document.sources);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Precondition: `pipelineId` should exists.
|
|
172
|
+
// Postcondition: The return value is not empty.
|
|
173
|
+
private getPipelineById(pipelineId: Protocol.Preload.PreloadPipelineId):
|
|
174
|
+
Map<Protocol.Preload.SpeculationAction, PreloadingAttempt>|null {
|
|
175
|
+
const document = this.currentDocument();
|
|
176
|
+
if (document === null) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return document.preloadingAttempts.getPipeline(pipelineId, document.sources);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Returns attemtps that are sit in the same preload pipeline.
|
|
184
|
+
getPipeline(attempt: PreloadingAttempt): PreloadPipeline {
|
|
185
|
+
let pipelineNullable = null;
|
|
186
|
+
if (attempt.pipelineId !== null) {
|
|
187
|
+
pipelineNullable = this.getPipelineById(attempt.pipelineId);
|
|
188
|
+
}
|
|
189
|
+
if (pipelineNullable === null) {
|
|
190
|
+
const pipeline = new Map();
|
|
191
|
+
pipeline.set(attempt.action, attempt);
|
|
192
|
+
return new PreloadPipeline(pipeline);
|
|
193
|
+
}
|
|
194
|
+
return new PreloadPipeline(pipelineNullable);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
private onPrimaryPageChanged(
|
|
198
|
+
event: Common.EventTarget.EventTargetEvent<{frame: ResourceTreeFrame, type: PrimaryPageChangeType}>): void {
|
|
199
|
+
const {frame, type} = event.data;
|
|
200
|
+
|
|
201
|
+
// Model of prerendered page's target will hands over. Do nothing for the initiator page.
|
|
202
|
+
if (this.lastPrimaryPageModel === null && type === PrimaryPageChangeType.ACTIVATION) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (this.lastPrimaryPageModel !== null && type !== PrimaryPageChangeType.ACTIVATION) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (this.lastPrimaryPageModel !== null && type === PrimaryPageChangeType.ACTIVATION) {
|
|
211
|
+
// Hand over from the model of the last primary page.
|
|
212
|
+
this.loaderIds = this.lastPrimaryPageModel.loaderIds;
|
|
213
|
+
for (const [loaderId, prev] of this.lastPrimaryPageModel.documents.entries()) {
|
|
214
|
+
this.ensureDocumentPreloadingData(loaderId);
|
|
215
|
+
this.documents.get(loaderId)?.mergePrevious(prev);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
this.lastPrimaryPageModel = null;
|
|
220
|
+
|
|
221
|
+
// Note that at this timing ResourceTreeFrame.loaderId is ensured to
|
|
222
|
+
// be non empty and Protocol.Network.LoaderId because it is filled
|
|
223
|
+
// by ResourceTreeFrame.navigate.
|
|
224
|
+
const currentLoaderId = frame.loaderId;
|
|
225
|
+
|
|
226
|
+
// Holds histories for two pages at most.
|
|
227
|
+
this.loaderIds.push(currentLoaderId);
|
|
228
|
+
this.loaderIds = this.loaderIds.slice(-2);
|
|
229
|
+
this.ensureDocumentPreloadingData(currentLoaderId);
|
|
230
|
+
for (const loaderId of this.documents.keys()) {
|
|
231
|
+
if (!this.loaderIds.includes(loaderId)) {
|
|
232
|
+
this.documents.delete(loaderId);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
this.dispatchEventToListeners(Events.MODEL_UPDATED);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
onRuleSetUpdated(event: Protocol.Preload.RuleSetUpdatedEvent): void {
|
|
240
|
+
const ruleSet = event.ruleSet;
|
|
241
|
+
|
|
242
|
+
const loaderId = ruleSet.loaderId;
|
|
243
|
+
|
|
244
|
+
// Infer current loaderId if DevTools is opned at the current page.
|
|
245
|
+
if (this.currentLoaderId() === null) {
|
|
246
|
+
this.loaderIds = [loaderId];
|
|
247
|
+
this.targetJustAttached = false;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
this.ensureDocumentPreloadingData(loaderId);
|
|
251
|
+
this.documents.get(loaderId)?.ruleSets.upsert(ruleSet);
|
|
252
|
+
this.dispatchEventToListeners(Events.MODEL_UPDATED);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
onRuleSetRemoved(event: Protocol.Preload.RuleSetRemovedEvent): void {
|
|
256
|
+
const id = event.id;
|
|
257
|
+
|
|
258
|
+
for (const document of this.documents.values()) {
|
|
259
|
+
document.ruleSets.delete(id);
|
|
260
|
+
}
|
|
261
|
+
this.dispatchEventToListeners(Events.MODEL_UPDATED);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
onPreloadingAttemptSourcesUpdated(event: Protocol.Preload.PreloadingAttemptSourcesUpdatedEvent): void {
|
|
265
|
+
const loaderId = event.loaderId;
|
|
266
|
+
this.ensureDocumentPreloadingData(loaderId);
|
|
267
|
+
|
|
268
|
+
const document = this.documents.get(loaderId);
|
|
269
|
+
if (document === undefined) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
document.sources.update(event.preloadingAttemptSources);
|
|
274
|
+
document.preloadingAttempts.maybeRegisterNotTriggered(document.sources);
|
|
275
|
+
document.preloadingAttempts.cleanUpRemovedAttempts(document.sources);
|
|
276
|
+
this.dispatchEventToListeners(Events.MODEL_UPDATED);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
onPrefetchStatusUpdated(event: Protocol.Preload.PrefetchStatusUpdatedEvent): void {
|
|
280
|
+
// We ignore this event to avoid reinserting an attempt after it was removed by
|
|
281
|
+
// onPreloadingAttemptSourcesUpdated.
|
|
282
|
+
if (event.prefetchStatus === Protocol.Preload.PrefetchStatus.PrefetchEvictedAfterCandidateRemoved) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const loaderId = event.key.loaderId;
|
|
287
|
+
this.ensureDocumentPreloadingData(loaderId);
|
|
288
|
+
const attempt: PrefetchAttemptInternal = {
|
|
289
|
+
action: Protocol.Preload.SpeculationAction.Prefetch,
|
|
290
|
+
key: event.key,
|
|
291
|
+
pipelineId: event.pipelineId,
|
|
292
|
+
status: convertPreloadingStatus(event.status),
|
|
293
|
+
prefetchStatus: event.prefetchStatus || null,
|
|
294
|
+
requestId: event.requestId,
|
|
295
|
+
};
|
|
296
|
+
this.documents.get(loaderId)?.preloadingAttempts.upsert(attempt);
|
|
297
|
+
this.dispatchEventToListeners(Events.MODEL_UPDATED);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
onPrerenderStatusUpdated(event: Protocol.Preload.PrerenderStatusUpdatedEvent): void {
|
|
301
|
+
const loaderId = event.key.loaderId;
|
|
302
|
+
this.ensureDocumentPreloadingData(loaderId);
|
|
303
|
+
let attempt: PrerenderAttemptInternal|PrerenderUntilScriptAttemptInternal;
|
|
304
|
+
switch (event.key.action) {
|
|
305
|
+
case Protocol.Preload.SpeculationAction.Prerender:
|
|
306
|
+
attempt = {
|
|
307
|
+
action: event.key.action,
|
|
308
|
+
key: event.key,
|
|
309
|
+
pipelineId: event.pipelineId,
|
|
310
|
+
status: convertPreloadingStatus(event.status),
|
|
311
|
+
prerenderStatus: event.prerenderStatus || null,
|
|
312
|
+
disallowedMojoInterface: event.disallowedMojoInterface || null,
|
|
313
|
+
mismatchedHeaders: event.mismatchedHeaders || null,
|
|
314
|
+
};
|
|
315
|
+
break;
|
|
316
|
+
case Protocol.Preload.SpeculationAction.PrerenderUntilScript:
|
|
317
|
+
attempt = {
|
|
318
|
+
action: event.key.action,
|
|
319
|
+
key: event.key,
|
|
320
|
+
pipelineId: event.pipelineId,
|
|
321
|
+
status: convertPreloadingStatus(event.status),
|
|
322
|
+
prerenderStatus: event.prerenderStatus || null,
|
|
323
|
+
disallowedMojoInterface: event.disallowedMojoInterface || null,
|
|
324
|
+
mismatchedHeaders: event.mismatchedHeaders || null,
|
|
325
|
+
};
|
|
326
|
+
break;
|
|
327
|
+
default:
|
|
328
|
+
throw new Error(`unreachable: event.key.action: ${event.key.action}`);
|
|
329
|
+
}
|
|
330
|
+
this.documents.get(loaderId)?.preloadingAttempts.upsert(attempt);
|
|
331
|
+
this.dispatchEventToListeners(Events.MODEL_UPDATED);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
onPreloadEnabledStateUpdated(event: Protocol.Preload.PreloadEnabledStateUpdatedEvent): void {
|
|
335
|
+
this.dispatchEventToListeners(Events.WARNINGS_UPDATED, event);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
SDKModel.register(PreloadingModel, {capabilities: Capability.DOM, autostart: false});
|
|
340
|
+
|
|
341
|
+
export const enum Events {
|
|
342
|
+
MODEL_UPDATED = 'ModelUpdated',
|
|
343
|
+
WARNINGS_UPDATED = 'WarningsUpdated',
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export interface EventTypes {
|
|
347
|
+
[Events.MODEL_UPDATED]: void;
|
|
348
|
+
[Events.WARNINGS_UPDATED]: Protocol.Preload.PreloadEnabledStateUpdatedEvent;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
class PreloadDispatcher implements ProtocolProxyApi.PreloadDispatcher {
|
|
352
|
+
private model: PreloadingModel;
|
|
353
|
+
|
|
354
|
+
constructor(model: PreloadingModel) {
|
|
355
|
+
this.model = model;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
ruleSetUpdated(event: Protocol.Preload.RuleSetUpdatedEvent): void {
|
|
359
|
+
this.model.onRuleSetUpdated(event);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
ruleSetRemoved(event: Protocol.Preload.RuleSetRemovedEvent): void {
|
|
363
|
+
this.model.onRuleSetRemoved(event);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
preloadingAttemptSourcesUpdated(event: Protocol.Preload.PreloadingAttemptSourcesUpdatedEvent): void {
|
|
367
|
+
this.model.onPreloadingAttemptSourcesUpdated(event);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
prefetchStatusUpdated(event: Protocol.Preload.PrefetchStatusUpdatedEvent): void {
|
|
371
|
+
this.model.onPrefetchStatusUpdated(event);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
prerenderStatusUpdated(event: Protocol.Preload.PrerenderStatusUpdatedEvent): void {
|
|
375
|
+
this.model.onPrerenderStatusUpdated(event);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
preloadEnabledStateUpdated(event: Protocol.Preload.PreloadEnabledStateUpdatedEvent): void {
|
|
379
|
+
void this.model.onPreloadEnabledStateUpdated(event);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
class DocumentPreloadingData {
|
|
384
|
+
ruleSets: RuleSetRegistry = new RuleSetRegistry();
|
|
385
|
+
preloadingAttempts: PreloadingAttemptRegistry = new PreloadingAttemptRegistry();
|
|
386
|
+
sources: SourceRegistry = new SourceRegistry();
|
|
387
|
+
|
|
388
|
+
mergePrevious(prev: DocumentPreloadingData): void {
|
|
389
|
+
// Note that CDP events Preload.ruleSetUpdated/Deleted and
|
|
390
|
+
// Preload.preloadingAttemptSourcesUpdated with a loaderId are emitted to target that bounded to
|
|
391
|
+
// a document with the loaderId. On the other hand, prerendering activation changes targets
|
|
392
|
+
// of Preload.prefetch/prerenderStatusUpdated, i.e. activated page receives those events for
|
|
393
|
+
// triggering outcome "Success".
|
|
394
|
+
if (!this.ruleSets.isEmpty() || !this.sources.isEmpty()) {
|
|
395
|
+
throw new Error('unreachable');
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
this.ruleSets = prev.ruleSets;
|
|
399
|
+
this.preloadingAttempts.mergePrevious(prev.preloadingAttempts);
|
|
400
|
+
this.sources = prev.sources;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
class RuleSetRegistry {
|
|
405
|
+
private map: Map<Protocol.Preload.RuleSetId, Protocol.Preload.RuleSet> =
|
|
406
|
+
new Map<Protocol.Preload.RuleSetId, Protocol.Preload.RuleSet>();
|
|
407
|
+
|
|
408
|
+
isEmpty(): boolean {
|
|
409
|
+
return this.map.size === 0;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// Returns reference. Don't save returned values.
|
|
413
|
+
// Returned values may or may not be updated as the time grows.
|
|
414
|
+
getById(id: Protocol.Preload.RuleSetId): Protocol.Preload.RuleSet|null {
|
|
415
|
+
return this.map.get(id) || null;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Returns reference. Don't save returned values.
|
|
419
|
+
// Returned values may or may not be updated as the time grows.
|
|
420
|
+
getAll(): Array<WithId<Protocol.Preload.RuleSetId, Protocol.Preload.RuleSet>> {
|
|
421
|
+
return Array.from(this.map.entries()).map(([id, value]) => ({id, value}));
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
upsert(ruleSet: Protocol.Preload.RuleSet): void {
|
|
425
|
+
this.map.set(ruleSet.id, ruleSet);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
delete(id: Protocol.Preload.RuleSetId): void {
|
|
429
|
+
this.map.delete(id);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Protocol.Preload.PreloadingStatus|'NotTriggered'
|
|
435
|
+
*
|
|
436
|
+
* A renderer sends SpeculationCandidate to the browser process and the
|
|
437
|
+
* browser process checks eligibilities, and starts PreloadingAttempt.
|
|
438
|
+
*
|
|
439
|
+
* In the frontend, "NotTriggered" is used to denote that a
|
|
440
|
+
* PreloadingAttempt is waiting for at trigger event (eg:
|
|
441
|
+
* mousedown/mouseover). All PreloadingAttempts will start off as
|
|
442
|
+
* "NotTriggered", but "eager" preloading attempts (attempts not
|
|
443
|
+
* actually waiting for any trigger) will be processed by the browser
|
|
444
|
+
* immediately, and will not stay in this state for long.
|
|
445
|
+
*
|
|
446
|
+
* TODO(https://crbug.com/1384419): Add NotEligible.
|
|
447
|
+
**/
|
|
448
|
+
export const enum PreloadingStatus {
|
|
449
|
+
NOT_TRIGGERED = 'NotTriggered',
|
|
450
|
+
PENDING = 'Pending',
|
|
451
|
+
RUNNING = 'Running',
|
|
452
|
+
READY = 'Ready',
|
|
453
|
+
SUCCESS = 'Success',
|
|
454
|
+
FAILURE = 'Failure',
|
|
455
|
+
NOT_SUPPORTED = 'NotSupported',
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
function convertPreloadingStatus(status: Protocol.Preload.PreloadingStatus): PreloadingStatus {
|
|
459
|
+
switch (status) {
|
|
460
|
+
case Protocol.Preload.PreloadingStatus.Pending:
|
|
461
|
+
return PreloadingStatus.PENDING;
|
|
462
|
+
case Protocol.Preload.PreloadingStatus.Running:
|
|
463
|
+
return PreloadingStatus.RUNNING;
|
|
464
|
+
case Protocol.Preload.PreloadingStatus.Ready:
|
|
465
|
+
return PreloadingStatus.READY;
|
|
466
|
+
case Protocol.Preload.PreloadingStatus.Success:
|
|
467
|
+
return PreloadingStatus.SUCCESS;
|
|
468
|
+
case Protocol.Preload.PreloadingStatus.Failure:
|
|
469
|
+
return PreloadingStatus.FAILURE;
|
|
470
|
+
case Protocol.Preload.PreloadingStatus.NotSupported:
|
|
471
|
+
return PreloadingStatus.NOT_SUPPORTED;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
throw new Error('unreachable');
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
export type PreloadingAttemptId = string;
|
|
478
|
+
|
|
479
|
+
export type PreloadingAttempt = PrefetchAttempt|PrerenderAttempt|PrerenderUntilScriptAttempt;
|
|
480
|
+
|
|
481
|
+
export interface PrefetchAttempt {
|
|
482
|
+
action: Protocol.Preload.SpeculationAction.Prefetch;
|
|
483
|
+
key: Protocol.Preload.PreloadingAttemptKey;
|
|
484
|
+
pipelineId: Protocol.Preload.PreloadPipelineId|null;
|
|
485
|
+
status: PreloadingStatus;
|
|
486
|
+
prefetchStatus: Protocol.Preload.PrefetchStatus|null;
|
|
487
|
+
requestId: Protocol.Network.RequestId;
|
|
488
|
+
ruleSetIds: Protocol.Preload.RuleSetId[];
|
|
489
|
+
nodeIds: Protocol.DOM.BackendNodeId[];
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
export interface PrerenderAttempt {
|
|
493
|
+
action: Protocol.Preload.SpeculationAction.Prerender;
|
|
494
|
+
key: Protocol.Preload.PreloadingAttemptKey;
|
|
495
|
+
pipelineId: Protocol.Preload.PreloadPipelineId|null;
|
|
496
|
+
status: PreloadingStatus;
|
|
497
|
+
prerenderStatus: Protocol.Preload.PrerenderFinalStatus|null;
|
|
498
|
+
disallowedMojoInterface: string|null;
|
|
499
|
+
mismatchedHeaders: Protocol.Preload.PrerenderMismatchedHeaders[]|null;
|
|
500
|
+
ruleSetIds: Protocol.Preload.RuleSetId[];
|
|
501
|
+
nodeIds: Protocol.DOM.BackendNodeId[];
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
export interface PrerenderUntilScriptAttempt {
|
|
505
|
+
action: Protocol.Preload.SpeculationAction.PrerenderUntilScript;
|
|
506
|
+
key: Protocol.Preload.PreloadingAttemptKey;
|
|
507
|
+
pipelineId: Protocol.Preload.PreloadPipelineId|null;
|
|
508
|
+
status: PreloadingStatus;
|
|
509
|
+
prerenderStatus: Protocol.Preload.PrerenderFinalStatus|null;
|
|
510
|
+
disallowedMojoInterface: string|null;
|
|
511
|
+
mismatchedHeaders: Protocol.Preload.PrerenderMismatchedHeaders[]|null;
|
|
512
|
+
ruleSetIds: Protocol.Preload.RuleSetId[];
|
|
513
|
+
nodeIds: Protocol.DOM.BackendNodeId[];
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
export type PreloadingAttemptInternal =
|
|
517
|
+
PrefetchAttemptInternal|PrerenderAttemptInternal|PrerenderUntilScriptAttemptInternal;
|
|
518
|
+
|
|
519
|
+
export interface PrefetchAttemptInternal {
|
|
520
|
+
action: Protocol.Preload.SpeculationAction.Prefetch;
|
|
521
|
+
key: Protocol.Preload.PreloadingAttemptKey;
|
|
522
|
+
pipelineId: Protocol.Preload.PreloadPipelineId|null;
|
|
523
|
+
status: PreloadingStatus;
|
|
524
|
+
prefetchStatus: Protocol.Preload.PrefetchStatus|null;
|
|
525
|
+
requestId: Protocol.Network.RequestId;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
export interface PrerenderAttemptInternal {
|
|
529
|
+
action: Protocol.Preload.SpeculationAction.Prerender;
|
|
530
|
+
key: Protocol.Preload.PreloadingAttemptKey;
|
|
531
|
+
pipelineId: Protocol.Preload.PreloadPipelineId|null;
|
|
532
|
+
status: PreloadingStatus;
|
|
533
|
+
prerenderStatus: Protocol.Preload.PrerenderFinalStatus|null;
|
|
534
|
+
disallowedMojoInterface: string|null;
|
|
535
|
+
mismatchedHeaders: Protocol.Preload.PrerenderMismatchedHeaders[]|null;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
export interface PrerenderUntilScriptAttemptInternal {
|
|
539
|
+
action: Protocol.Preload.SpeculationAction.PrerenderUntilScript;
|
|
540
|
+
key: Protocol.Preload.PreloadingAttemptKey;
|
|
541
|
+
pipelineId: Protocol.Preload.PreloadPipelineId|null;
|
|
542
|
+
status: PreloadingStatus;
|
|
543
|
+
prerenderStatus: Protocol.Preload.PrerenderFinalStatus|null;
|
|
544
|
+
disallowedMojoInterface: string|null;
|
|
545
|
+
mismatchedHeaders: Protocol.Preload.PrerenderMismatchedHeaders[]|null;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
function makePreloadingAttemptId(key: Protocol.Preload.PreloadingAttemptKey): PreloadingAttemptId {
|
|
549
|
+
let action;
|
|
550
|
+
switch (key.action) {
|
|
551
|
+
case Protocol.Preload.SpeculationAction.Prefetch:
|
|
552
|
+
action = 'Prefetch';
|
|
553
|
+
break;
|
|
554
|
+
case Protocol.Preload.SpeculationAction.Prerender:
|
|
555
|
+
action = 'Prerender';
|
|
556
|
+
break;
|
|
557
|
+
case Protocol.Preload.SpeculationAction.PrerenderUntilScript:
|
|
558
|
+
action = 'PrerenderUntilScript';
|
|
559
|
+
break;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
let targetHint;
|
|
563
|
+
switch (key.targetHint) {
|
|
564
|
+
case undefined:
|
|
565
|
+
targetHint = 'undefined';
|
|
566
|
+
break;
|
|
567
|
+
case Protocol.Preload.SpeculationTargetHint.Blank:
|
|
568
|
+
targetHint = 'Blank';
|
|
569
|
+
break;
|
|
570
|
+
case Protocol.Preload.SpeculationTargetHint.Self:
|
|
571
|
+
targetHint = 'Self';
|
|
572
|
+
break;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
return `${key.loaderId}:${action}:${key.url}:${targetHint}`;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
export class PreloadPipeline {
|
|
579
|
+
private inner: Map<Protocol.Preload.SpeculationAction, PreloadingAttempt>;
|
|
580
|
+
|
|
581
|
+
constructor(inner: Map<Protocol.Preload.SpeculationAction, PreloadingAttempt>) {
|
|
582
|
+
if (inner.size === 0) {
|
|
583
|
+
throw new Error('unreachable');
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
this.inner = inner;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
static newFromAttemptsForTesting(attempts: PreloadingAttempt[]): PreloadPipeline {
|
|
590
|
+
const inner = new Map();
|
|
591
|
+
for (const attempt of attempts) {
|
|
592
|
+
inner.set(attempt.action, attempt);
|
|
593
|
+
}
|
|
594
|
+
return new PreloadPipeline(inner);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
getOriginallyTriggered(): PreloadingAttempt {
|
|
598
|
+
const attempt = this.getPrerender() || this.getPrerenderUntilScript() || this.getPrefetch();
|
|
599
|
+
assertNotNullOrUndefined(attempt);
|
|
600
|
+
return attempt;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
getPrefetch(): PreloadingAttempt|null {
|
|
604
|
+
return this.inner.get(Protocol.Preload.SpeculationAction.Prefetch) || null;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
getPrerender(): PreloadingAttempt|null {
|
|
608
|
+
return this.inner.get(Protocol.Preload.SpeculationAction.Prerender) || null;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
getPrerenderUntilScript(): PreloadingAttempt|null {
|
|
612
|
+
return this.inner.get(Protocol.Preload.SpeculationAction.PrerenderUntilScript) || null;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// Returns attempts in the order: prefetch < prerender_until_script < prerender.
|
|
616
|
+
// Currently unused.
|
|
617
|
+
getAttempts(): PreloadingAttempt[] {
|
|
618
|
+
const ret = [];
|
|
619
|
+
|
|
620
|
+
const prefetch = this.getPrefetch();
|
|
621
|
+
if (prefetch !== null) {
|
|
622
|
+
ret.push(prefetch);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
const prerender = this.getPrerender();
|
|
626
|
+
if (prerender !== null) {
|
|
627
|
+
ret.push(prerender);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
const prerenderUntilScript = this.getPrerenderUntilScript();
|
|
631
|
+
if (prerenderUntilScript !== null) {
|
|
632
|
+
ret.push(prerenderUntilScript);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
if (ret.length === 0) {
|
|
636
|
+
throw new Error('unreachable');
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
return ret;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
class PreloadingAttemptRegistry {
|
|
644
|
+
private map: Map<PreloadingAttemptId, PreloadingAttemptInternal> =
|
|
645
|
+
new Map<PreloadingAttemptId, PreloadingAttemptInternal>();
|
|
646
|
+
private pipelines:
|
|
647
|
+
MapWithDefault<Protocol.Preload.PreloadPipelineId, Map<Protocol.Preload.SpeculationAction, PreloadingAttemptId>> =
|
|
648
|
+
new MapWithDefault<
|
|
649
|
+
Protocol.Preload.PreloadPipelineId, Map<Protocol.Preload.SpeculationAction, PreloadingAttemptId>>();
|
|
650
|
+
|
|
651
|
+
private enrich(attempt: PreloadingAttemptInternal, source: Protocol.Preload.PreloadingAttemptSource|null):
|
|
652
|
+
PreloadingAttempt {
|
|
653
|
+
let ruleSetIds: Protocol.Preload.RuleSetId[] = [];
|
|
654
|
+
let nodeIds: Protocol.DOM.BackendNodeId[] = [];
|
|
655
|
+
if (source !== null) {
|
|
656
|
+
ruleSetIds = source.ruleSetIds;
|
|
657
|
+
nodeIds = source.nodeIds;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
return {
|
|
661
|
+
...attempt,
|
|
662
|
+
ruleSetIds,
|
|
663
|
+
nodeIds,
|
|
664
|
+
};
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
// Returns true iff the attempt is triggered by a SpecRules, not automatically derived.
|
|
668
|
+
//
|
|
669
|
+
// In some cases, browsers automatically triggers preloads. For example, Chrome triggers prefetch
|
|
670
|
+
// ahead of prerender to prevent multiple fetches in case that the prerender failed due to, e.g.
|
|
671
|
+
// use of forbidden mojo APIs. Also, a prerender-until-script attempt triggers prefetch as well,
|
|
672
|
+
// and can upgrade to prerender. Such prefetch, prerender-until-script, and prerender sit in the
|
|
673
|
+
// same preload pipeline.
|
|
674
|
+
//
|
|
675
|
+
// We regard them as not representative and only show the representative ones to represent
|
|
676
|
+
// pipelines.
|
|
677
|
+
private isAttemptRepresentative(attempt: PreloadingAttempt): boolean {
|
|
678
|
+
function getSortKey(action: Protocol.Preload.SpeculationAction): number {
|
|
679
|
+
switch (action) {
|
|
680
|
+
case Protocol.Preload.SpeculationAction.Prefetch:
|
|
681
|
+
return 0;
|
|
682
|
+
case Protocol.Preload.SpeculationAction.PrerenderUntilScript:
|
|
683
|
+
return 1;
|
|
684
|
+
case Protocol.Preload.SpeculationAction.Prerender:
|
|
685
|
+
return 2;
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
// Attempt with status `NOT_TRIGGERED` is a representative of a pipeline.
|
|
690
|
+
if (attempt.pipelineId === null) {
|
|
691
|
+
return true;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// Attempt with the strongest action in pipeline is a representative of a pipeline.
|
|
695
|
+
// Order: prefetch < prerender.
|
|
696
|
+
const pipeline = this.pipelines.get(attempt.pipelineId);
|
|
697
|
+
assertNotNullOrUndefined(pipeline);
|
|
698
|
+
if (pipeline.size === 0) {
|
|
699
|
+
throw new Error('unreachable');
|
|
700
|
+
}
|
|
701
|
+
return [...pipeline.keys()].every(action => getSortKey(action) <= getSortKey(attempt.action));
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
// Returns reference. Don't save returned values.
|
|
705
|
+
// Returned values may or may not be updated as the time grows.
|
|
706
|
+
getById(id: PreloadingAttemptId, sources: SourceRegistry): PreloadingAttempt|null {
|
|
707
|
+
const attempt = this.map.get(id) || null;
|
|
708
|
+
if (attempt === null) {
|
|
709
|
+
return null;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
return this.enrich(attempt, sources.getById(id));
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
// Returns representative preloading attempts that triggered by the rule set with `ruleSetId`.
|
|
716
|
+
// `ruleSetId === null` means "do not filter".
|
|
717
|
+
//
|
|
718
|
+
// Returns reference. Don't save returned values.
|
|
719
|
+
// Returned values may or may not be updated as the time grows.
|
|
720
|
+
getAllRepresentative(ruleSetId: Protocol.Preload.RuleSetId|null, sources: SourceRegistry):
|
|
721
|
+
Array<WithId<PreloadingAttemptId, PreloadingAttempt>> {
|
|
722
|
+
return [...this.map.entries()]
|
|
723
|
+
.map(([id, value]) => ({id, value: this.enrich(value, sources.getById(id))}))
|
|
724
|
+
.filter(({value}) => !ruleSetId || value.ruleSetIds.includes(ruleSetId))
|
|
725
|
+
.filter(({value}) => this.isAttemptRepresentative(value));
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
getPipeline(pipelineId: Protocol.Preload.PreloadPipelineId, sources: SourceRegistry):
|
|
729
|
+
Map<Protocol.Preload.SpeculationAction, PreloadingAttempt>|null {
|
|
730
|
+
const pipeline = this.pipelines.get(pipelineId);
|
|
731
|
+
|
|
732
|
+
if (pipeline === undefined || pipeline.size === 0) {
|
|
733
|
+
return null;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
const map: Record<PreloadingAttemptId, PreloadingAttemptInternal> = {};
|
|
737
|
+
for (const [id, attempt] of this.map.entries()) {
|
|
738
|
+
map[id] = attempt;
|
|
739
|
+
}
|
|
740
|
+
return new Map(pipeline.entries().map(([action, id]) => {
|
|
741
|
+
const attempt = this.getById(id, sources);
|
|
742
|
+
assertNotNullOrUndefined(attempt);
|
|
743
|
+
return [action, attempt];
|
|
744
|
+
}));
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
upsert(attempt: PreloadingAttemptInternal): void {
|
|
748
|
+
const id = makePreloadingAttemptId(attempt.key);
|
|
749
|
+
|
|
750
|
+
this.map.set(id, attempt);
|
|
751
|
+
|
|
752
|
+
if (attempt.pipelineId !== null) {
|
|
753
|
+
this.pipelines.getOrInsertComputed(attempt.pipelineId, () => new Map()).set(attempt.action, id);
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
private reconstructPipelines(): void {
|
|
758
|
+
this.pipelines.clear();
|
|
759
|
+
|
|
760
|
+
for (const [id, attempt] of this.map.entries()) {
|
|
761
|
+
if (attempt.pipelineId === null) {
|
|
762
|
+
continue;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
const pipeline = this.pipelines.getOrInsertComputed(attempt.pipelineId, () => new Map());
|
|
766
|
+
pipeline.set(attempt.action, id);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
// Speculation rules emits a CDP event Preload.preloadingAttemptSourcesUpdated
|
|
771
|
+
// and an IPC SpeculationHost::UpdateSpeculationCandidates. The latter emits
|
|
772
|
+
// Preload.prefetch/prerenderAttemptUpdated for each preload attempt triggered.
|
|
773
|
+
// In general, "Not triggered to triggered" period is short (resp. long) for
|
|
774
|
+
// eager (resp. non-eager) preloads. For not yet emitted ones, we fill
|
|
775
|
+
// "Not triggered" preload attempts and show them.
|
|
776
|
+
maybeRegisterNotTriggered(sources: SourceRegistry): void {
|
|
777
|
+
for (const [id, {key}] of sources.entries()) {
|
|
778
|
+
if (this.map.get(id) !== undefined) {
|
|
779
|
+
continue;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
let attempt: PreloadingAttemptInternal;
|
|
783
|
+
switch (key.action) {
|
|
784
|
+
case Protocol.Preload.SpeculationAction.Prefetch:
|
|
785
|
+
attempt = {
|
|
786
|
+
action: Protocol.Preload.SpeculationAction.Prefetch,
|
|
787
|
+
key,
|
|
788
|
+
pipelineId: null,
|
|
789
|
+
status: PreloadingStatus.NOT_TRIGGERED,
|
|
790
|
+
prefetchStatus: null,
|
|
791
|
+
// Fill invalid request id.
|
|
792
|
+
requestId: '' as Protocol.Network.RequestId,
|
|
793
|
+
};
|
|
794
|
+
break;
|
|
795
|
+
case Protocol.Preload.SpeculationAction.Prerender:
|
|
796
|
+
attempt = {
|
|
797
|
+
action: Protocol.Preload.SpeculationAction.Prerender,
|
|
798
|
+
key,
|
|
799
|
+
pipelineId: null,
|
|
800
|
+
status: PreloadingStatus.NOT_TRIGGERED,
|
|
801
|
+
prerenderStatus: null,
|
|
802
|
+
disallowedMojoInterface: null,
|
|
803
|
+
mismatchedHeaders: null,
|
|
804
|
+
};
|
|
805
|
+
break;
|
|
806
|
+
case Protocol.Preload.SpeculationAction.PrerenderUntilScript:
|
|
807
|
+
attempt = {
|
|
808
|
+
action: Protocol.Preload.SpeculationAction.PrerenderUntilScript,
|
|
809
|
+
key,
|
|
810
|
+
pipelineId: null,
|
|
811
|
+
status: PreloadingStatus.NOT_TRIGGERED,
|
|
812
|
+
prerenderStatus: null,
|
|
813
|
+
disallowedMojoInterface: null,
|
|
814
|
+
mismatchedHeaders: null,
|
|
815
|
+
};
|
|
816
|
+
break;
|
|
817
|
+
}
|
|
818
|
+
this.map.set(id, attempt);
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
// Removes keys in `this.map` that are not in `sources`. This is used to
|
|
823
|
+
// remove attempts that no longer have a matching speculation rule.
|
|
824
|
+
cleanUpRemovedAttempts(sources: SourceRegistry): void {
|
|
825
|
+
const keysToRemove = Array.from(this.map.keys()).filter(key => !sources.getById(key));
|
|
826
|
+
for (const key of keysToRemove) {
|
|
827
|
+
this.map.delete(key);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
this.reconstructPipelines();
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
mergePrevious(prev: PreloadingAttemptRegistry): void {
|
|
834
|
+
for (const [id, attempt] of this.map.entries()) {
|
|
835
|
+
prev.map.set(id, attempt);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
this.map = prev.map;
|
|
839
|
+
|
|
840
|
+
this.reconstructPipelines();
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
class SourceRegistry {
|
|
845
|
+
private map: Map<PreloadingAttemptId, Protocol.Preload.PreloadingAttemptSource> =
|
|
846
|
+
new Map<PreloadingAttemptId, Protocol.Preload.PreloadingAttemptSource>();
|
|
847
|
+
|
|
848
|
+
entries(): IterableIterator<[PreloadingAttemptId, Protocol.Preload.PreloadingAttemptSource]> {
|
|
849
|
+
return this.map.entries();
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
isEmpty(): boolean {
|
|
853
|
+
return this.map.size === 0;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
getById(id: PreloadingAttemptId): Protocol.Preload.PreloadingAttemptSource|null {
|
|
857
|
+
return this.map.get(id) || null;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
update(sources: Protocol.Preload.PreloadingAttemptSource[]): void {
|
|
861
|
+
this.map = new Map(sources.map(s => [makePreloadingAttemptId(s.key), s]));
|
|
862
|
+
}
|
|
863
|
+
}
|