chrome-devtools-frontend 1.0.1512147 → 1.0.1513662
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/docs/cookbook/release_management.md +15 -13
- package/docs/get_the_code.md +114 -35
- package/front_end/Images/src/ai-explorer-badge.svg +114 -0
- package/front_end/Images/src/code-whisperer-badge.svg +166 -0
- package/front_end/Images/src/devtools-user-badge.svg +129 -0
- package/front_end/Images/src/dom-detective-badge.svg +136 -0
- package/front_end/Images/src/speedster-badge.svg +166 -0
- package/front_end/core/common/Color.ts +40 -44
- package/front_end/core/common/Console.ts +4 -4
- package/front_end/core/common/ParsedURL.ts +14 -14
- package/front_end/core/common/ResourceType.ts +20 -20
- package/front_end/core/common/SegmentedRange.ts +13 -14
- package/front_end/core/common/Settings.ts +4 -4
- package/front_end/core/common/StringOutputStream.ts +4 -4
- package/front_end/core/host/GdpClient.ts +76 -2
- package/front_end/core/host/InspectorFrontendHost.ts +4 -1
- package/front_end/core/host/InspectorFrontendHostAPI.ts +2 -0
- package/front_end/core/host/ResourceLoader.ts +2 -2
- package/front_end/core/host/UserMetrics.ts +0 -2
- package/front_end/core/i18n/NumberFormatter.ts +7 -0
- package/front_end/core/protocol_client/InspectorBackend.ts +9 -9
- package/front_end/core/root/Runtime.ts +5 -2
- package/front_end/core/sdk/AccessibilityModel.ts +48 -48
- package/front_end/core/sdk/AnimationModel.ts +78 -79
- package/front_end/core/sdk/CPUProfilerModel.ts +5 -5
- package/front_end/core/sdk/CPUThrottlingManager.ts +17 -17
- package/front_end/core/sdk/CSSMatchedStyles.ts +44 -44
- package/front_end/core/sdk/CSSMedia.ts +22 -22
- package/front_end/core/sdk/CSSModel.ts +4 -4
- package/front_end/core/sdk/CSSProperty.ts +9 -9
- package/front_end/core/sdk/CSSPropertyParser.ts +1 -2
- package/front_end/core/sdk/CSSRule.ts +3 -3
- package/front_end/core/sdk/CSSStyleDeclaration.ts +27 -28
- package/front_end/core/sdk/CSSStyleSheetHeader.ts +13 -13
- package/front_end/core/sdk/CategorizedBreakpoint.ts +4 -4
- package/front_end/core/sdk/ChildTargetManager.ts +6 -6
- package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +4 -4
- package/front_end/core/sdk/ConsoleModel.ts +24 -24
- package/front_end/core/sdk/Cookie.ts +16 -16
- package/front_end/core/sdk/CookieParser.ts +6 -6
- package/front_end/core/sdk/DOMDebuggerModel.ts +88 -89
- package/front_end/core/sdk/DOMModel.ts +113 -113
- package/front_end/core/sdk/DebuggerModel.ts +102 -103
- package/front_end/core/sdk/EmulationModel.ts +6 -6
- package/front_end/core/sdk/EventBreakpointsModel.ts +5 -5
- package/front_end/core/sdk/HeapProfilerModel.ts +5 -5
- package/front_end/core/sdk/IsolateManager.ts +26 -26
- package/front_end/core/sdk/LayerTreeBase.ts +29 -30
- package/front_end/core/sdk/OverlayModel.ts +6 -6
- package/front_end/core/sdk/Resource.ts +43 -43
- package/front_end/core/sdk/ResourceTreeModel.ts +58 -61
- package/front_end/core/sdk/RuntimeModel.ts +12 -13
- package/front_end/core/sdk/SDKModel.ts +3 -3
- package/front_end/core/sdk/Script.ts +17 -17
- package/front_end/core/sdk/SecurityOriginManager.ts +14 -14
- package/front_end/core/sdk/ServerTiming.ts +2 -2
- package/front_end/core/sdk/ServiceWorkerCacheModel.ts +15 -15
- package/front_end/core/sdk/ServiceWorkerManager.ts +19 -24
- package/front_end/core/sdk/SourceMap.ts +10 -10
- package/front_end/core/sdk/StorageKeyManager.ts +12 -12
- package/front_end/core/sdk/Target.ts +33 -34
- package/front_end/core/sdk/TargetManager.ts +20 -20
- package/front_end/entrypoints/formatter_worker/AcornTokenizer.ts +8 -8
- package/front_end/entrypoints/formatter_worker/HTMLFormatter.ts +7 -7
- package/front_end/entrypoints/heap_snapshot_worker/AllocationProfile.ts +7 -7
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +24 -24
- package/front_end/entrypoints/main/GlobalAiButton.ts +3 -3
- package/front_end/entrypoints/main/MainImpl.ts +16 -14
- package/front_end/entrypoints/main/main-meta.ts +1 -2
- package/front_end/generated/InspectorBackendCommands.js +3 -2
- package/front_end/generated/SupportedCSSProperties.js +20 -0
- package/front_end/generated/protocol-mapping.d.ts +4 -0
- package/front_end/generated/protocol-proxy-api.d.ts +5 -0
- package/front_end/generated/protocol.ts +20 -0
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +18 -35
- package/front_end/models/ai_assistance/ai_assistance.ts +1 -1
- package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +7 -6
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +246 -119
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +187 -73
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +106 -100
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +20 -27
- package/front_end/models/ai_assistance/data_formatters/UnitFormatters.ts +151 -0
- package/front_end/models/badges/AiExplorerBadge.ts +21 -0
- package/front_end/models/badges/Badge.ts +10 -9
- package/front_end/models/badges/CodeWhispererBadge.ts +21 -0
- package/front_end/models/badges/DOMDetectiveBadge.ts +21 -0
- package/front_end/models/badges/SpeedsterBadge.ts +7 -2
- package/front_end/models/badges/StarterBadge.ts +6 -1
- package/front_end/models/badges/UserBadges.ts +61 -9
- package/front_end/models/bindings/CSSWorkspaceBinding.ts +6 -6
- package/front_end/models/bindings/DebuggerLanguagePlugins.ts +18 -18
- package/front_end/models/bindings/FileUtils.ts +15 -15
- package/front_end/models/bindings/ResourceScriptMapping.ts +14 -14
- package/front_end/models/elements/ElementUpdateRecord.ts +11 -11
- package/front_end/models/emulation/DeviceModeModel.ts +123 -131
- package/front_end/models/emulation/EmulatedDevices.ts +22 -22
- package/front_end/models/extensions/ExtensionPanel.ts +24 -24
- package/front_end/models/extensions/ExtensionServer.ts +4 -4
- package/front_end/models/javascript_metadata/NativeFunctions.js +14 -2
- package/front_end/models/persistence/IsolatedFileSystem.ts +18 -19
- package/front_end/models/persistence/IsolatedFileSystemManager.ts +13 -13
- package/front_end/models/trace/EventsSerializer.ts +5 -5
- package/front_end/models/trace/LanternComputationData.ts +10 -10
- package/front_end/models/trace/ModelImpl.ts +32 -54
- package/front_end/models/trace/Processor.ts +28 -30
- package/front_end/models/trace/extras/FilmStrip.ts +6 -6
- package/front_end/models/trace/extras/StackTraceForEvent.ts +22 -25
- package/front_end/models/trace/extras/ThirdParties.ts +16 -17
- package/front_end/models/trace/extras/TraceFilter.ts +1 -1
- package/front_end/models/trace/handlers/Threads.ts +10 -10
- package/front_end/models/trace/handlers/helpers.ts +9 -9
- package/front_end/models/trace/handlers/types.ts +3 -3
- package/front_end/models/trace/insights/CLSCulprits.ts +12 -14
- package/front_end/models/trace/insights/Cache.ts +8 -4
- package/front_end/models/trace/insights/DOMSize.ts +8 -5
- package/front_end/models/trace/insights/DocumentLatency.ts +2 -2
- package/front_end/models/trace/insights/DuplicatedJavaScript.ts +3 -3
- package/front_end/models/trace/insights/FontDisplay.ts +3 -4
- package/front_end/models/trace/insights/ForcedReflow.ts +3 -3
- package/front_end/models/trace/insights/INPBreakdown.ts +2 -2
- package/front_end/models/trace/insights/ImageDelivery.ts +11 -11
- package/front_end/models/trace/insights/LCPBreakdown.ts +4 -4
- package/front_end/models/trace/insights/LCPDiscovery.ts +4 -4
- package/front_end/models/trace/insights/LegacyJavaScript.ts +2 -2
- package/front_end/models/trace/insights/ModernHTTP.ts +4 -5
- package/front_end/models/trace/insights/NetworkDependencyTree.ts +12 -12
- package/front_end/models/trace/insights/RenderBlocking.ts +9 -10
- package/front_end/models/trace/insights/SlowCSSSelector.ts +2 -2
- package/front_end/models/trace/insights/ThirdParties.ts +4 -5
- package/front_end/models/trace/insights/Viewport.ts +8 -5
- package/front_end/models/trace/insights/types.ts +1 -0
- package/front_end/models/trace/lantern/testing/MetricTestUtils.ts +10 -10
- package/front_end/panels/accessibility/AXBreadcrumbsPane.ts +52 -52
- package/front_end/panels/accessibility/AccessibilitySidebarView.ts +8 -8
- package/front_end/panels/animation/AnimationTimeline.ts +5 -5
- package/front_end/panels/animation/AnimationUI.ts +22 -23
- package/front_end/panels/application/ApplicationPanelSidebar.ts +12 -12
- package/front_end/panels/application/DOMStorageModel.ts +23 -23
- package/front_end/panels/application/ExtensionStorageModel.ts +31 -31
- package/front_end/panels/application/IndexedDBModel.ts +1 -0
- package/front_end/panels/application/PreloadingTreeElement.ts +8 -8
- package/front_end/panels/application/ServiceWorkersView.ts +0 -53
- package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +2 -2
- package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +2 -2
- package/front_end/panels/common/BadgeNotification.ts +140 -10
- package/front_end/panels/common/GdpSignUpDialog.ts +5 -0
- package/front_end/panels/common/badgeNotification.css +30 -9
- package/front_end/panels/console/ConsoleContextSelector.ts +9 -9
- package/front_end/panels/console/ConsolePrompt.ts +8 -5
- package/front_end/panels/console/ConsoleView.ts +13 -13
- package/front_end/panels/console/ConsoleViewport.ts +29 -29
- package/front_end/panels/coverage/CoverageModel.ts +22 -22
- package/front_end/panels/elements/ClassesPaneWidget.ts +1 -1
- package/front_end/panels/elements/ComputedStyleModel.ts +17 -18
- package/front_end/panels/elements/DOMPath.ts +2 -2
- package/front_end/panels/elements/ElementsPanel.ts +13 -13
- package/front_end/panels/elements/ElementsTreeElement.ts +30 -18
- package/front_end/panels/elements/ElementsTreeOutline.ts +44 -48
- package/front_end/panels/elements/ShortcutTreeElement.ts +4 -4
- package/front_end/panels/elements/StylePropertiesSection.ts +7 -4
- package/front_end/panels/elements/StylePropertyTreeElement.ts +54 -50
- package/front_end/panels/elements/StylesSidebarPane.ts +19 -19
- package/front_end/panels/emulation/DeviceModeToolbar.ts +7 -7
- package/front_end/panels/emulation/DeviceModeView.ts +6 -6
- package/front_end/panels/emulation/MediaQueryInspector.ts +18 -18
- package/front_end/panels/event_listeners/EventListenersView.ts +13 -14
- package/front_end/panels/layer_viewer/LayerTreeOutline.ts +3 -3
- package/front_end/panels/layer_viewer/LayerViewHost.ts +13 -13
- package/front_end/panels/layer_viewer/PaintProfilerView.ts +9 -10
- package/front_end/panels/layer_viewer/TransformController.ts +34 -36
- package/front_end/panels/layers/LayerTreeModel.ts +41 -40
- package/front_end/panels/lighthouse/LighthouseReportSelector.ts +13 -13
- package/front_end/panels/lighthouse/LighthouseStartView.ts +7 -7
- package/front_end/panels/media/PlayerMessagesView.ts +5 -5
- package/front_end/panels/media/TickingFlameChart.ts +24 -24
- package/front_end/panels/media/TickingFlameChartHelpers.ts +32 -32
- package/front_end/panels/network/NetworkItemView.ts +4 -4
- package/front_end/panels/network/NetworkLogViewColumns.ts +29 -29
- package/front_end/panels/network/NetworkPanel.ts +8 -5
- package/front_end/panels/network/ResourceWebSocketFrameView.ts +10 -10
- package/front_end/panels/profiler/HeapDetachedElementsView.ts +3 -3
- package/front_end/panels/profiler/HeapProfileView.ts +1 -1
- package/front_end/panels/profiler/ProfileFlameChartDataProvider.ts +3 -4
- package/front_end/panels/profiler/ProfileHeader.ts +25 -25
- package/front_end/panels/profiler/ProfileLauncherView.ts +5 -6
- package/front_end/panels/recorder/components/ReplaySection.ts +3 -1
- package/front_end/panels/security/OriginTreeElement.ts +8 -8
- package/front_end/panels/security/SecurityPanel.ts +5 -5
- package/front_end/panels/settings/SettingsScreen.ts +18 -18
- package/front_end/panels/settings/components/SyncSection.ts +26 -8
- package/front_end/panels/sources/AiCodeCompletionPlugin.ts +3 -0
- package/front_end/panels/sources/DebuggerPausedMessage.ts +8 -9
- package/front_end/panels/sources/NavigatorView.ts +43 -46
- package/front_end/panels/sources/SourcesPanel.ts +35 -35
- package/front_end/panels/sources/SourcesView.ts +13 -13
- package/front_end/panels/sources/TabbedEditorContainer.ts +19 -22
- package/front_end/panels/sources/UISourceCodeFrame.ts +4 -4
- package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +34 -36
- package/front_end/panels/timeline/AnimationsTrackAppender.ts +3 -3
- package/front_end/panels/timeline/CompatibilityTracksAppender.ts +8 -8
- package/front_end/panels/timeline/CountersGraph.ts +16 -16
- package/front_end/panels/timeline/EntriesFilter.ts +4 -3
- package/front_end/panels/timeline/EventsTimelineTreeView.ts +3 -3
- package/front_end/panels/timeline/GPUTrackAppender.ts +3 -3
- package/front_end/panels/timeline/Initiators.ts +10 -10
- package/front_end/panels/timeline/InteractionsTrackAppender.ts +5 -5
- package/front_end/panels/timeline/LayoutShiftsTrackAppender.ts +7 -7
- package/front_end/panels/timeline/ModificationsManager.ts +8 -15
- package/front_end/panels/timeline/TargetForEvent.ts +2 -2
- package/front_end/panels/timeline/ThirdPartyTreeView.ts +1 -1
- package/front_end/panels/timeline/ThreadAppender.ts +13 -13
- package/front_end/panels/timeline/TimelineDetailsView.ts +6 -14
- package/front_end/panels/timeline/TimelineEventOverview.ts +27 -26
- package/front_end/panels/timeline/TimelineFilters.ts +5 -5
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +54 -53
- package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +34 -34
- package/front_end/panels/timeline/TimelineFlameChartView.ts +18 -31
- package/front_end/panels/timeline/TimelineHistoryManager.ts +17 -18
- package/front_end/panels/timeline/TimelineMiniMap.ts +6 -6
- package/front_end/panels/timeline/TimelinePaintProfilerView.ts +6 -6
- package/front_end/panels/timeline/TimelinePanel.ts +73 -68
- package/front_end/panels/timeline/TimelineSelectorStatsView.ts +7 -5
- package/front_end/panels/timeline/TimelineTreeView.ts +10 -10
- package/front_end/panels/timeline/TimelineUIUtils.ts +47 -46
- package/front_end/panels/timeline/TimingsTrackAppender.ts +12 -12
- package/front_end/panels/timeline/TracingLayerTree.ts +43 -43
- package/front_end/panels/timeline/TrackConfigBanner.ts +6 -6
- package/front_end/panels/timeline/TrackConfiguration.ts +1 -1
- package/front_end/panels/timeline/components/DetailsView.ts +4 -4
- package/front_end/panels/timeline/components/LayoutShiftDetails.ts +12 -21
- package/front_end/panels/timeline/components/LiveMetricsView.ts +2 -1
- package/front_end/panels/timeline/components/NetworkRequestDetails.ts +5 -5
- package/front_end/panels/timeline/components/Sidebar.ts +4 -14
- package/front_end/panels/timeline/components/SidebarInsightsTab.ts +13 -36
- package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +21 -19
- package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +1 -1
- package/front_end/panels/timeline/components/insights/Cache.ts +4 -0
- package/front_end/panels/timeline/components/insights/DOMSize.ts +5 -1
- package/front_end/panels/timeline/components/insights/Helpers.ts +19 -0
- package/front_end/panels/timeline/components/insights/NetworkDependencyTree.ts +1 -1
- package/front_end/panels/timeline/components/insights/Viewport.ts +4 -0
- package/front_end/panels/timeline/overlays/OverlaysImpl.ts +1 -1
- package/front_end/panels/timeline/utils/AICallTree.ts +11 -11
- package/front_end/panels/timeline/utils/AIContext.ts +17 -19
- package/front_end/panels/timeline/utils/EntityMapper.ts +6 -5
- package/front_end/panels/timeline/utils/EntryName.ts +2 -2
- package/front_end/panels/timeline/utils/EntryNodes.ts +5 -5
- package/front_end/panels/timeline/utils/EntryStyles.ts +4 -4
- package/front_end/panels/timeline/utils/FreshRecording.ts +3 -3
- package/front_end/panels/timeline/utils/Helpers.ts +0 -18
- package/front_end/panels/timeline/utils/InsightAIContext.ts +6 -6
- package/front_end/panels/timeline/utils/SourceMapsResolver.ts +7 -7
- package/front_end/panels/webauthn/WebauthnPane.ts +1 -0
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/codemirror.next/chunk/angular.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/angular.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/codemirror.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/cpp.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/cpp.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/java.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/java.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/legacy.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/legacy.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/less.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/less.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/markdown.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/markdown.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/php.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/php.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/python.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/python.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/sass.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/sass.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/svelte.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/svelte.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/vue.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/vue.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/wast.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/wast.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/xml.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/xml.js.map +1 -1
- package/front_end/third_party/codemirror.next/codemirror.next.js +1 -1
- package/front_end/third_party/codemirror.next/package.json +1 -1
- package/front_end/third_party/codemirror.next/rebuild.sh +1 -1
- package/front_end/third_party/json5/rebuild.sh +1 -1
- package/front_end/third_party/legacy-javascript/{update.sh → rebuild.sh} +1 -1
- package/front_end/third_party/lit/lib/decorators.d.ts +26 -9
- package/front_end/third_party/lit/lib/decorators.js +5 -5
- package/front_end/third_party/lit/lib/decorators.js.map +1 -1
- package/front_end/third_party/lit/lib/directive.js.map +1 -1
- package/front_end/third_party/lit/lib/directives.js +8 -13
- package/front_end/third_party/lit/lib/directives.js.map +1 -1
- package/front_end/third_party/lit/lib/lit.d.ts +26 -9
- package/front_end/third_party/lit/lib/lit.js +5 -5
- package/front_end/third_party/lit/lib/lit.js.map +1 -1
- package/front_end/third_party/lit/lib/static-html.js +2 -2
- package/front_end/third_party/lit/lib/static-html.js.map +1 -1
- package/front_end/third_party/lit/rebuild.sh +1 -1
- package/front_end/third_party/third-party-web/rebuild.sh +1 -1
- package/front_end/ui/components/dialogs/Dialog.ts +6 -7
- package/front_end/ui/legacy/ActionRegistration.ts +9 -9
- package/front_end/ui/legacy/DockController.ts +18 -18
- package/front_end/ui/legacy/FilterBar.ts +7 -7
- package/front_end/ui/legacy/Fragment.ts +4 -4
- package/front_end/ui/legacy/GlassPane.ts +12 -12
- package/front_end/ui/legacy/InspectorView.ts +5 -15
- package/front_end/ui/legacy/ListControl.ts +27 -27
- package/front_end/ui/legacy/ListWidget.ts +4 -4
- package/front_end/ui/legacy/PopoverHelper.ts +4 -4
- package/front_end/ui/legacy/ShortcutRegistry.ts +17 -17
- package/front_end/ui/legacy/TabbedPane.ts +74 -75
- package/front_end/ui/legacy/TextPrompt.ts +31 -31
- package/front_end/ui/legacy/Toolbar.ts +13 -14
- package/front_end/ui/legacy/ViewManager.ts +30 -31
- package/front_end/ui/legacy/Widget.ts +6 -6
- package/front_end/ui/legacy/XLink.ts +9 -9
- package/front_end/ui/legacy/ZoomManager.ts +9 -9
- package/front_end/ui/legacy/components/color_picker/ContrastDetails.ts +27 -27
- package/front_end/ui/legacy/components/color_picker/ContrastInfo.ts +30 -32
- package/front_end/ui/legacy/components/color_picker/Spectrum.ts +15 -15
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +64 -64
- package/front_end/ui/legacy/components/data_grid/ShowMoreDataGridNode.ts +2 -2
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +10 -11
- package/front_end/ui/legacy/components/perf_ui/ChartViewport.ts +12 -12
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +3 -3
- package/front_end/ui/legacy/components/perf_ui/TimelineGrid.ts +14 -14
- package/front_end/ui/legacy/components/perf_ui/TimelineOverviewPane.ts +8 -8
- package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +5 -5
- package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +4 -4
- package/front_end/ui/legacy/filter.css +1 -1
- package/front_end/ui/legacy/inspectorCommon.css +1 -1
- package/front_end/ui/legacy/softDropDownButton.css +1 -1
- package/front_end/ui/legacy/theme_support/ThemeSupport.ts +4 -4
- package/front_end/ui/visual_logging/KnownContextValues.ts +2 -2
- package/package.json +1 -1
- package/front_end/models/ai_assistance/data_formatters/Types.ts +0 -9
@@ -10,9 +10,9 @@ import type * as Types from './types/types.js';
|
|
10
10
|
|
11
11
|
type NetworkRequest = Lantern.Types.NetworkRequest<Types.Events.SyntheticNetworkRequest>;
|
12
12
|
|
13
|
-
function createProcessedNavigation(
|
13
|
+
function createProcessedNavigation(data: Handlers.Types.HandlerData, frameId: string, navigationId: string):
|
14
14
|
Lantern.Types.Simulation.ProcessedNavigation {
|
15
|
-
const scoresByNav =
|
15
|
+
const scoresByNav = data.PageLoadMetrics.metricScoresByFrameId.get(frameId);
|
16
16
|
if (!scoresByNav) {
|
17
17
|
throw new Lantern.Core.LanternError('missing metric scores for frame');
|
18
18
|
}
|
@@ -85,7 +85,7 @@ function findWorkerThreads(trace: Lantern.Types.Trace): Map<number, number[]> {
|
|
85
85
|
}
|
86
86
|
|
87
87
|
function createLanternRequest(
|
88
|
-
parsedTrace: Readonly<Handlers.Types.
|
88
|
+
parsedTrace: Readonly<Handlers.Types.HandlerData>, workerThreads: Map<number, number[]>,
|
89
89
|
request: Types.Events.SyntheticNetworkRequest): NetworkRequest|undefined {
|
90
90
|
if (request.args.data.hasResponse && request.args.data.connectionId === undefined) {
|
91
91
|
throw new Lantern.Core.LanternError('Trace is too old');
|
@@ -273,14 +273,14 @@ function linkInitiators(lanternRequests: NetworkRequest[]): void {
|
|
273
273
|
}
|
274
274
|
|
275
275
|
function createNetworkRequests(
|
276
|
-
trace: Lantern.Types.Trace,
|
276
|
+
trace: Lantern.Types.Trace, data: Handlers.Types.HandlerData, startTime = 0,
|
277
277
|
endTime = Number.POSITIVE_INFINITY): NetworkRequest[] {
|
278
278
|
const workerThreads = findWorkerThreads(trace);
|
279
279
|
|
280
280
|
const lanternRequestsNoRedirects: NetworkRequest[] = [];
|
281
|
-
for (const request of
|
281
|
+
for (const request of data.NetworkRequests.byTime) {
|
282
282
|
if (request.ts >= startTime && request.ts < endTime) {
|
283
|
-
const lanternRequest = createLanternRequest(
|
283
|
+
const lanternRequest = createLanternRequest(data, workerThreads, request);
|
284
284
|
if (lanternRequest) {
|
285
285
|
lanternRequestsNoRedirects.push(lanternRequest);
|
286
286
|
}
|
@@ -371,8 +371,8 @@ function createNetworkRequests(
|
|
371
371
|
}
|
372
372
|
|
373
373
|
function collectMainThreadEvents(
|
374
|
-
trace: Lantern.Types.Trace,
|
375
|
-
const Meta =
|
374
|
+
trace: Lantern.Types.Trace, data: Handlers.Types.HandlerData): Lantern.Types.TraceEvent[] {
|
375
|
+
const Meta = data.Meta;
|
376
376
|
const mainFramePids = Meta.mainFrameNavigations.length ? new Set(Meta.mainFrameNavigations.map(nav => nav.pid)) :
|
377
377
|
Meta.topLevelRendererIds;
|
378
378
|
|
@@ -408,9 +408,9 @@ function collectMainThreadEvents(
|
|
408
408
|
}
|
409
409
|
|
410
410
|
function createGraph(
|
411
|
-
requests: Lantern.Types.NetworkRequest[], trace: Lantern.Types.Trace,
|
411
|
+
requests: Lantern.Types.NetworkRequest[], trace: Lantern.Types.Trace, data: Handlers.Types.HandlerData,
|
412
412
|
url?: Lantern.Types.Simulation.URL): Lantern.Graph.Node<Types.Events.SyntheticNetworkRequest> {
|
413
|
-
const mainThreadEvents = collectMainThreadEvents(trace,
|
413
|
+
const mainThreadEvents = collectMainThreadEvents(trace, data);
|
414
414
|
|
415
415
|
// url defines the initial request that the Lantern graph starts at (the root node) and the
|
416
416
|
// main document request. These are equal if there are no redirects.
|
@@ -29,7 +29,7 @@ export interface ParseConfig {
|
|
29
29
|
* `createWithSubsetOfHandlers` can be used to run just some handlers.
|
30
30
|
**/
|
31
31
|
export class Model extends EventTarget {
|
32
|
-
readonly #traces:
|
32
|
+
readonly #traces: ParsedTrace[] = [];
|
33
33
|
readonly #nextNumberByDomain = new Map<string, number>();
|
34
34
|
|
35
35
|
readonly #recordingsAvailable: string[] = [];
|
@@ -100,14 +100,8 @@ export class Model extends EventTarget {
|
|
100
100
|
|
101
101
|
this.#processor.addEventListener(TraceParseProgressEvent.eventName, onTraceUpdate);
|
102
102
|
|
103
|
-
//
|
104
|
-
const
|
105
|
-
traceEvents,
|
106
|
-
metadata,
|
107
|
-
parsedTrace: null,
|
108
|
-
traceInsights: null,
|
109
|
-
syntheticEventsManager: Helpers.SyntheticEvents.SyntheticEventsManager.createAndActivate(traceEvents),
|
110
|
-
};
|
103
|
+
// TODO(cjamcl): this.#processor.parse needs this to work. So it should either take it as input, or create it itself.
|
104
|
+
const syntheticEventsManager = Helpers.SyntheticEvents.SyntheticEventsManager.createAndActivate(traceEvents);
|
111
105
|
|
112
106
|
try {
|
113
107
|
// Wait for all outstanding promises before finishing the async execution,
|
@@ -118,21 +112,12 @@ export class Model extends EventTarget {
|
|
118
112
|
metadata,
|
119
113
|
resolveSourceMap: config?.resolveSourceMap,
|
120
114
|
};
|
121
|
-
if (!parseConfig.logger &&
|
122
|
-
(window.location.href.includes('devtools/bundled') || window.location.search.includes('debugFrontend'))) {
|
123
|
-
// Someone is debugging DevTools, enable the logger.
|
124
|
-
const times: Record<string, number> = {};
|
125
|
-
parseConfig.logger = {
|
126
|
-
start(id) {
|
127
|
-
times[id] = performance.now();
|
128
|
-
},
|
129
|
-
end(id) {
|
130
|
-
performance.measure(id, {start: times[id]});
|
131
|
-
},
|
132
|
-
};
|
133
|
-
}
|
134
115
|
await this.#processor.parse(traceEvents, parseConfig);
|
135
|
-
|
116
|
+
if (!this.#processor.data) {
|
117
|
+
throw new Error('processor did not parse trace');
|
118
|
+
}
|
119
|
+
const file = this.#storeAndCreateParsedTraceFile(
|
120
|
+
syntheticEventsManager, traceEvents, metadata, this.#processor.data, this.#processor.insights);
|
136
121
|
// We only push the file onto this.#traces here once we know it's valid
|
137
122
|
// and there's been no errors in the parsing.
|
138
123
|
this.#traces.push(file);
|
@@ -146,23 +131,27 @@ export class Model extends EventTarget {
|
|
146
131
|
}
|
147
132
|
}
|
148
133
|
|
149
|
-
#
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
file.traceInsights = insights;
|
134
|
+
#storeAndCreateParsedTraceFile(
|
135
|
+
syntheticEventsManager: Helpers.SyntheticEvents.SyntheticEventsManager,
|
136
|
+
traceEvents: readonly Types.Events.Event[], metadata: Types.File.MetaData, data: Handlers.Types.HandlerData,
|
137
|
+
traceInsights: Insights.Types.TraceInsightSets|null): ParsedTrace {
|
154
138
|
this.#lastRecordingIndex++;
|
155
139
|
let recordingName = `Trace ${this.#lastRecordingIndex}`;
|
156
|
-
|
157
|
-
if (
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
recordingName = `${origin} (${nextSequenceForDomain})`;
|
162
|
-
this.#nextNumberByDomain.set(origin, nextSequenceForDomain + 1);
|
163
|
-
}
|
140
|
+
const origin = Helpers.Trace.extractOriginFromTrace(data.Meta.mainFrameURL);
|
141
|
+
if (origin) {
|
142
|
+
const nextSequenceForDomain = Platform.MapUtilities.getWithDefault(this.#nextNumberByDomain, origin, () => 1);
|
143
|
+
recordingName = `${origin} (${nextSequenceForDomain})`;
|
144
|
+
this.#nextNumberByDomain.set(origin, nextSequenceForDomain + 1);
|
164
145
|
}
|
165
146
|
this.#recordingsAvailable.push(recordingName);
|
147
|
+
|
148
|
+
return {
|
149
|
+
traceEvents,
|
150
|
+
metadata,
|
151
|
+
data,
|
152
|
+
insights: traceInsights,
|
153
|
+
syntheticEventsManager,
|
154
|
+
};
|
166
155
|
}
|
167
156
|
|
168
157
|
lastTraceIndex(): number {
|
@@ -173,16 +162,8 @@ export class Model extends EventTarget {
|
|
173
162
|
* Returns the parsed trace data indexed by the order in which it was stored.
|
174
163
|
* If no index is given, the last stored parsed data is returned.
|
175
164
|
*/
|
176
|
-
parsedTrace(index: number = this.#traces.length - 1):
|
177
|
-
return this.#traces.at(index)
|
178
|
-
}
|
179
|
-
|
180
|
-
traceInsights(index: number = this.#traces.length - 1): Insights.Types.TraceInsightSets|null {
|
181
|
-
return this.#traces.at(index)?.traceInsights ?? null;
|
182
|
-
}
|
183
|
-
|
184
|
-
metadata(index: number = this.#traces.length - 1): Types.File.MetaData|null {
|
185
|
-
return this.#traces.at(index)?.metadata ?? null;
|
165
|
+
parsedTrace(index: number = this.#traces.length - 1): ParsedTrace|null {
|
166
|
+
return this.#traces.at(index) ?? null;
|
186
167
|
}
|
187
168
|
|
188
169
|
overrideModifications(index: number, newModifications: Types.File.Modifications): void {
|
@@ -191,10 +172,6 @@ export class Model extends EventTarget {
|
|
191
172
|
}
|
192
173
|
}
|
193
174
|
|
194
|
-
rawTraceEvents(index: number = this.#traces.length - 1): readonly Types.Events.Event[]|null {
|
195
|
-
return this.#traces.at(index)?.traceEvents ?? null;
|
196
|
-
}
|
197
|
-
|
198
175
|
syntheticTraceEventsManager(index: number = this.#traces.length - 1): Helpers.SyntheticEvents.SyntheticEventsManager
|
199
176
|
|null {
|
200
177
|
return this.#traces.at(index)?.syntheticEventsManager ?? null;
|
@@ -219,13 +196,14 @@ export class Model extends EventTarget {
|
|
219
196
|
}
|
220
197
|
|
221
198
|
/**
|
222
|
-
* This parsed trace
|
199
|
+
* This parsed trace is used by the Model. It keeps multiple instances
|
223
200
|
* of these so that the user can swap between them. The key is that it is
|
224
201
|
* essentially the TraceFile plus whatever the model has parsed from it.
|
225
202
|
*/
|
226
|
-
export type
|
227
|
-
|
228
|
-
|
203
|
+
export type ParsedTrace = Types.File.TraceFile&{
|
204
|
+
data: Handlers.Types.HandlerData,
|
205
|
+
/** Is null for CPU profiles. */
|
206
|
+
insights: Insights.Types.TraceInsightSets | null,
|
229
207
|
syntheticEventsManager: Helpers.SyntheticEvents.SyntheticEventsManager,
|
230
208
|
};
|
231
209
|
|
@@ -56,7 +56,7 @@ export class TraceProcessor extends EventTarget {
|
|
56
56
|
readonly #traceHandlers: Partial<Handlers.Types.Handlers>;
|
57
57
|
#status = Status.IDLE;
|
58
58
|
#modelConfiguration = Types.Configuration.defaults();
|
59
|
-
#data: Handlers.Types.
|
59
|
+
#data: Handlers.Types.HandlerData|null = null;
|
60
60
|
#insights: Insights.Types.TraceInsightSets|null = null;
|
61
61
|
|
62
62
|
static createWithAllHandlers(): TraceProcessor {
|
@@ -243,10 +243,10 @@ export class TraceProcessor extends EventTarget {
|
|
243
243
|
|
244
244
|
this.dispatchEvent(new TraceParseProgressEvent({percent: ProgressPhase.CLONE}));
|
245
245
|
|
246
|
-
this.#data = parsedTrace as Handlers.Types.
|
246
|
+
this.#data = parsedTrace as Handlers.Types.HandlerData;
|
247
247
|
}
|
248
248
|
|
249
|
-
get
|
249
|
+
get data(): Handlers.Types.HandlerData|null {
|
250
250
|
if (this.#status !== Status.FINISHED_PARSING) {
|
251
251
|
return null;
|
252
252
|
}
|
@@ -263,17 +263,17 @@ export class TraceProcessor extends EventTarget {
|
|
263
263
|
}
|
264
264
|
|
265
265
|
#createLanternContext(
|
266
|
-
|
266
|
+
data: Handlers.Types.HandlerData, traceEvents: readonly Types.Events.Event[], frameId: string,
|
267
267
|
navigationId: string, options: Types.Configuration.ParseOptions): Insights.Types.LanternContext|undefined {
|
268
268
|
// Check for required handlers.
|
269
|
-
if (!
|
269
|
+
if (!data.NetworkRequests || !data.Workers || !data.PageLoadMetrics) {
|
270
270
|
return;
|
271
271
|
}
|
272
|
-
if (!
|
272
|
+
if (!data.NetworkRequests.byTime.length) {
|
273
273
|
throw new Lantern.Core.LanternError('No network requests found in trace');
|
274
274
|
}
|
275
275
|
|
276
|
-
const navStarts =
|
276
|
+
const navStarts = data.Meta.navigationsByFrameId.get(frameId);
|
277
277
|
const navStartIndex = navStarts?.findIndex(n => n.args.data?.navigationId === navigationId);
|
278
278
|
if (!navStarts || navStartIndex === undefined || navStartIndex === -1) {
|
279
279
|
throw new Lantern.Core.LanternError('Could not find navigation start');
|
@@ -289,9 +289,9 @@ export class TraceProcessor extends EventTarget {
|
|
289
289
|
traceEvents: boundedTraceEvents as unknown as Lantern.Types.TraceEvent[],
|
290
290
|
};
|
291
291
|
|
292
|
-
const requests = LanternComputationData.createNetworkRequests(trace,
|
293
|
-
const graph = LanternComputationData.createGraph(requests, trace,
|
294
|
-
const processedNavigation = LanternComputationData.createProcessedNavigation(
|
292
|
+
const requests = LanternComputationData.createNetworkRequests(trace, data, startTime, endTime);
|
293
|
+
const graph = LanternComputationData.createGraph(requests, trace, data);
|
294
|
+
const processedNavigation = LanternComputationData.createProcessedNavigation(data, frameId, navigationId);
|
295
295
|
|
296
296
|
const networkAnalysis = Lantern.Core.NetworkAnalyzer.analyze(requests);
|
297
297
|
if (!networkAnalysis) {
|
@@ -425,17 +425,16 @@ export class TraceProcessor extends EventTarget {
|
|
425
425
|
}
|
426
426
|
|
427
427
|
#computeInsightSet(
|
428
|
-
|
428
|
+
data: Handlers.Types.HandlerData, context: Insights.Types.InsightSetContext,
|
429
429
|
options: Types.Configuration.ParseOptions): void {
|
430
430
|
let id, urlString, navigation;
|
431
431
|
if (context.navigation) {
|
432
432
|
id = context.navigationId;
|
433
|
-
urlString =
|
434
|
-
parsedTrace.Meta.finalDisplayUrlByNavigationId.get(context.navigationId) ?? parsedTrace.Meta.mainFrameURL;
|
433
|
+
urlString = data.Meta.finalDisplayUrlByNavigationId.get(context.navigationId) ?? data.Meta.mainFrameURL;
|
435
434
|
navigation = context.navigation;
|
436
435
|
} else {
|
437
436
|
id = Types.Events.NO_NAVIGATION;
|
438
|
-
urlString =
|
437
|
+
urlString = data.Meta.finalDisplayUrlByNavigationId.get('') ?? data.Meta.mainFrameURL;
|
439
438
|
}
|
440
439
|
|
441
440
|
const insightSetModel = {} as Insights.Types.InsightSet['model'];
|
@@ -444,7 +443,7 @@ export class TraceProcessor extends EventTarget {
|
|
444
443
|
let model: Insights.Types.InsightModel|Error;
|
445
444
|
try {
|
446
445
|
options.logger?.start(`insights:${name}`);
|
447
|
-
model = insight.generateInsight(
|
446
|
+
model = insight.generateInsight(data, context);
|
448
447
|
model.frameId = context.frameId;
|
449
448
|
const navId = context.navigation?.args.data?.navigationId;
|
450
449
|
if (navId) {
|
@@ -511,24 +510,24 @@ export class TraceProcessor extends EventTarget {
|
|
511
510
|
* Run all the insights and set the result to `#insights`.
|
512
511
|
*/
|
513
512
|
#computeInsights(
|
514
|
-
|
513
|
+
data: Handlers.Types.HandlerData, traceEvents: readonly Types.Events.Event[],
|
515
514
|
options: Types.Configuration.ParseOptions): void {
|
516
515
|
// This insights map will be populated by the helper methods.
|
517
516
|
this.#insights = new Map();
|
518
517
|
|
519
518
|
// Filter main frame navigations to those that have the necessary data (frameId and navigationId).
|
520
519
|
// TODO(cjamcl): Does this filtering makes the "use the next nav as the end time" logic potentially broken? Are navs without nav id or frame even real?
|
521
|
-
const navigations =
|
520
|
+
const navigations = data.Meta.mainFrameNavigations.filter(
|
522
521
|
navigation => navigation.args.frame && navigation.args.data?.navigationId);
|
523
522
|
|
524
|
-
this.#computeInsightsForInitialTracePeriod(
|
523
|
+
this.#computeInsightsForInitialTracePeriod(data, navigations, options);
|
525
524
|
|
526
525
|
for (const [index, navigation] of navigations.entries()) {
|
527
526
|
const min = navigation.ts;
|
528
527
|
// Use trace end for the last navigation, otherwise use the start of the next navigation.
|
529
|
-
const max = index + 1 < navigations.length ? navigations[index + 1].ts :
|
528
|
+
const max = index + 1 < navigations.length ? navigations[index + 1].ts : data.Meta.traceBounds.max;
|
530
529
|
const bounds = Helpers.Timing.traceWindowFromMicroSeconds(min, max);
|
531
|
-
this.#computeInsightsForNavigation(navigation, bounds,
|
530
|
+
this.#computeInsightsForNavigation(navigation, bounds, data, traceEvents, options);
|
532
531
|
}
|
533
532
|
}
|
534
533
|
|
@@ -536,28 +535,27 @@ export class TraceProcessor extends EventTarget {
|
|
536
535
|
* Computes insights for the period before the first navigation, or for the entire trace if no navigations exist.
|
537
536
|
*/
|
538
537
|
#computeInsightsForInitialTracePeriod(
|
539
|
-
|
538
|
+
data: Handlers.Types.HandlerData, navigations: readonly Types.Events.NavigationStart[],
|
540
539
|
options: Types.Configuration.ParseOptions): void {
|
541
540
|
// Determine bounds: Use the period before the first navigation if navigations exist, otherwise use the entire trace bounds.
|
542
541
|
const bounds = navigations.length > 0 ?
|
543
|
-
Helpers.Timing.traceWindowFromMicroSeconds(
|
544
|
-
|
542
|
+
Helpers.Timing.traceWindowFromMicroSeconds(data.Meta.traceBounds.min, navigations[0].ts) :
|
543
|
+
data.Meta.traceBounds;
|
545
544
|
|
546
545
|
const context: Insights.Types.InsightSetContext = {
|
547
546
|
bounds,
|
548
|
-
frameId:
|
547
|
+
frameId: data.Meta.mainFrameId,
|
549
548
|
// No navigation or lantern context applies to this initial/no-navigation period.
|
550
549
|
};
|
551
|
-
this.#computeInsightSet(
|
550
|
+
this.#computeInsightSet(data, context, options);
|
552
551
|
}
|
553
552
|
|
554
553
|
/**
|
555
554
|
* Computes insights for a specific navigation event.
|
556
555
|
*/
|
557
556
|
#computeInsightsForNavigation(
|
558
|
-
navigation: Types.Events.NavigationStart, bounds: Types.Timing.TraceWindowMicro,
|
559
|
-
|
560
|
-
options: Types.Configuration.ParseOptions): void {
|
557
|
+
navigation: Types.Events.NavigationStart, bounds: Types.Timing.TraceWindowMicro, data: Handlers.Types.HandlerData,
|
558
|
+
traceEvents: readonly Types.Events.Event[], options: Types.Configuration.ParseOptions): void {
|
561
559
|
const frameId = navigation.args.frame;
|
562
560
|
// Guaranteed by the filter in #computeInsights
|
563
561
|
const navigationId = navigation.args.data?.navigationId as string;
|
@@ -568,7 +566,7 @@ export class TraceProcessor extends EventTarget {
|
|
568
566
|
let lantern: Insights.Types.LanternContext|undefined;
|
569
567
|
try {
|
570
568
|
options.logger?.start('insights:createLanternContext');
|
571
|
-
lantern = this.#createLanternContext(
|
569
|
+
lantern = this.#createLanternContext(data, traceEvents, frameId, navigationId, options);
|
572
570
|
} catch (e) {
|
573
571
|
// Handle Lantern errors gracefully
|
574
572
|
// Don't allow an error in constructing the Lantern graphs to break the rest of the trace processor.
|
@@ -601,7 +599,7 @@ export class TraceProcessor extends EventTarget {
|
|
601
599
|
navigationId,
|
602
600
|
lantern,
|
603
601
|
};
|
604
|
-
this.#computeInsightSet(
|
602
|
+
this.#computeInsightSet(data, context, options);
|
605
603
|
}
|
606
604
|
}
|
607
605
|
|
@@ -32,17 +32,17 @@ export type HandlerDataWithScreenshots = Handlers.Types.EnabledHandlerDataWithMe
|
|
32
32
|
// 2. The start time.
|
33
33
|
const filmStripCache = new WeakMap<HandlerDataWithScreenshots, Map<Types.Timing.Micro, Data>>();
|
34
34
|
|
35
|
-
export function
|
35
|
+
export function fromHandlerData(data: HandlerDataWithScreenshots, customZeroTime?: Types.Timing.Micro): Data {
|
36
36
|
const frames: Frame[] = [];
|
37
37
|
|
38
|
-
const zeroTime = typeof customZeroTime !== 'undefined' ? customZeroTime :
|
39
|
-
const spanTime =
|
40
|
-
const fromCache = filmStripCache.get(
|
38
|
+
const zeroTime = typeof customZeroTime !== 'undefined' ? customZeroTime : data.Meta.traceBounds.min;
|
39
|
+
const spanTime = data.Meta.traceBounds.range;
|
40
|
+
const fromCache = filmStripCache.get(data)?.get(zeroTime);
|
41
41
|
if (fromCache) {
|
42
42
|
return fromCache;
|
43
43
|
}
|
44
44
|
|
45
|
-
const screenshots =
|
45
|
+
const screenshots = data.Screenshots.screenshots ?? data.Screenshots.legacySyntheticScreenshots ?? [];
|
46
46
|
|
47
47
|
for (const screenshotEvent of screenshots) {
|
48
48
|
if (screenshotEvent.ts < zeroTime) {
|
@@ -62,7 +62,7 @@ export function fromParsedTrace(parsedTrace: HandlerDataWithScreenshots, customZ
|
|
62
62
|
};
|
63
63
|
|
64
64
|
const cachedForData =
|
65
|
-
Platform.MapUtilities.getWithDefault(filmStripCache,
|
65
|
+
Platform.MapUtilities.getWithDefault(filmStripCache, data, () => new Map<Types.Timing.Micro, Data>());
|
66
66
|
cachedForData.set(zeroTime, result);
|
67
67
|
|
68
68
|
return result;
|
@@ -8,10 +8,10 @@ import * as Helpers from '../helpers/helpers.js';
|
|
8
8
|
import * as Types from '../types/types.js';
|
9
9
|
|
10
10
|
export const stackTraceForEventInTrace =
|
11
|
-
new Map<Handlers.Types.
|
11
|
+
new Map<Handlers.Types.HandlerData, Map<Types.Events.Event, Protocol.Runtime.StackTrace>>();
|
12
12
|
|
13
|
-
export function clearCacheForTrace(
|
14
|
-
stackTraceForEventInTrace.delete(
|
13
|
+
export function clearCacheForTrace(data: Handlers.Types.HandlerData): void {
|
14
|
+
stackTraceForEventInTrace.delete(data);
|
15
15
|
}
|
16
16
|
/**
|
17
17
|
* This util builds a stack trace that includes async calls for a given
|
@@ -19,12 +19,11 @@ export function clearCacheForTrace(parsedTrace: Handlers.Types.ParsedTrace): voi
|
|
19
19
|
* stacks and trace event instrumentation on the V8 debugger to stitch
|
20
20
|
* them together.
|
21
21
|
*/
|
22
|
-
export function get(event: Types.Events.Event,
|
23
|
-
|
24
|
-
let cacheForTrace = stackTraceForEventInTrace.get(parsedTrace);
|
22
|
+
export function get(event: Types.Events.Event, data: Handlers.Types.HandlerData): Protocol.Runtime.StackTrace|null {
|
23
|
+
let cacheForTrace = stackTraceForEventInTrace.get(data);
|
25
24
|
if (!cacheForTrace) {
|
26
25
|
cacheForTrace = new Map();
|
27
|
-
stackTraceForEventInTrace.set(
|
26
|
+
stackTraceForEventInTrace.set(data, cacheForTrace);
|
28
27
|
}
|
29
28
|
const resultFromCache = cacheForTrace.get(event);
|
30
29
|
if (resultFromCache) {
|
@@ -32,11 +31,11 @@ export function get(event: Types.Events.Event, parsedTrace: Handlers.Types.Parse
|
|
32
31
|
}
|
33
32
|
let result: Protocol.Runtime.StackTrace|null = null;
|
34
33
|
if (Types.Extensions.isSyntheticExtensionEntry(event)) {
|
35
|
-
result = getForExtensionEntry(event,
|
34
|
+
result = getForExtensionEntry(event, data);
|
36
35
|
} else if (Types.Events.isPerformanceMeasureBegin(event)) {
|
37
|
-
result = getForPerformanceMeasure(event,
|
36
|
+
result = getForPerformanceMeasure(event, data);
|
38
37
|
} else {
|
39
|
-
result = getForEvent(event,
|
38
|
+
result = getForEvent(event, data);
|
40
39
|
const payloadCallFrames =
|
41
40
|
getTraceEventPayloadStackAsProtocolCallFrame(event).filter(callFrame => !isNativeJSFunction(callFrame));
|
42
41
|
// If the event has a payload stack trace, replace the synchronous
|
@@ -65,24 +64,22 @@ export function get(event: Types.Events.Event, parsedTrace: Handlers.Types.Parse
|
|
65
64
|
* hierarchy. This shouldn't be called outside of this file, use `get`
|
66
65
|
* instead to ensure the correct event in the tree hierarchy is used.
|
67
66
|
*/
|
68
|
-
function getForEvent(event: Types.Events.Event,
|
67
|
+
function getForEvent(event: Types.Events.Event, data: Handlers.Types.HandlerData): Protocol.Runtime.StackTrace {
|
69
68
|
// When working with a CPU profile the renderer handler won't have
|
70
69
|
// entries in its tree.
|
71
|
-
const entryToNode =
|
72
|
-
parsedTrace.Renderer.entryToNode.size > 0 ? parsedTrace.Renderer.entryToNode : parsedTrace.Samples.entryToNode;
|
70
|
+
const entryToNode = data.Renderer.entryToNode.size > 0 ? data.Renderer.entryToNode : data.Samples.entryToNode;
|
73
71
|
const topStackTrace: Protocol.Runtime.StackTrace = {callFrames: []};
|
74
72
|
let stackTrace: Protocol.Runtime.StackTrace = topStackTrace;
|
75
73
|
let currentEntry: Types.Events.SyntheticProfileCall;
|
76
74
|
let node: Helpers.TreeHelpers.TraceEntryNode|null|undefined = entryToNode.get(event);
|
77
|
-
const traceCache =
|
78
|
-
|
79
|
-
stackTraceForEventInTrace.set(parsedTrace, traceCache);
|
75
|
+
const traceCache = stackTraceForEventInTrace.get(data) || new Map<Types.Events.Event, Protocol.Runtime.StackTrace>();
|
76
|
+
stackTraceForEventInTrace.set(data, traceCache);
|
80
77
|
// Move up this node's ancestor tree appending JS frames to its
|
81
78
|
// stack trace. If an async caller is detected, move up in the async
|
82
79
|
// stack instead.
|
83
80
|
while (node) {
|
84
81
|
if (!Types.Events.isProfileCall(node.entry)) {
|
85
|
-
const maybeAsyncParent =
|
82
|
+
const maybeAsyncParent = data.AsyncJSCalls.runEntryPointToScheduler.get(node.entry);
|
86
83
|
if (!maybeAsyncParent) {
|
87
84
|
node = node.parent;
|
88
85
|
continue;
|
@@ -114,7 +111,7 @@ function getForEvent(event: Types.Events.Event, parsedTrace: Handlers.Types.Pars
|
|
114
111
|
if (!isNativeJSFunction(currentEntry.callFrame)) {
|
115
112
|
stackTrace.callFrames.push(currentEntry.callFrame);
|
116
113
|
}
|
117
|
-
const maybeAsyncParentEvent =
|
114
|
+
const maybeAsyncParentEvent = data.AsyncJSCalls.asyncCallToScheduler.get(currentEntry);
|
118
115
|
const maybeAsyncParentNode = maybeAsyncParentEvent && entryToNode.get(maybeAsyncParentEvent.scheduler);
|
119
116
|
if (maybeAsyncParentNode) {
|
120
117
|
stackTrace = addAsyncParentToStack(stackTrace, maybeAsyncParentEvent.taskName);
|
@@ -147,23 +144,23 @@ function addAsyncParentToStack(stackTrace: Protocol.Runtime.StackTrace, taskName
|
|
147
144
|
* code location that called the extension API), and returns its stack
|
148
145
|
* trace.
|
149
146
|
*/
|
150
|
-
function getForExtensionEntry(event: Types.Extensions.SyntheticExtensionEntry,
|
147
|
+
function getForExtensionEntry(event: Types.Extensions.SyntheticExtensionEntry, data: Handlers.Types.HandlerData):
|
151
148
|
Protocol.Runtime.StackTrace|null {
|
152
149
|
const rawEvent: Types.Events.Event = event.rawSourceEvent;
|
153
150
|
if (Types.Events.isPerformanceMeasureBegin(rawEvent)) {
|
154
|
-
return getForPerformanceMeasure(rawEvent,
|
151
|
+
return getForPerformanceMeasure(rawEvent, data);
|
155
152
|
}
|
156
153
|
if (!rawEvent) {
|
157
154
|
return null;
|
158
155
|
}
|
159
|
-
return get(rawEvent,
|
156
|
+
return get(rawEvent, data);
|
160
157
|
}
|
161
158
|
|
162
159
|
/**
|
163
160
|
* Gets the raw event for a user timing and obtains its stack trace.
|
164
161
|
*/
|
165
|
-
function getForPerformanceMeasure(
|
166
|
-
Protocol.Runtime.StackTrace|null {
|
162
|
+
function getForPerformanceMeasure(
|
163
|
+
event: Types.Events.PerformanceMeasureBegin, data: Handlers.Types.HandlerData): Protocol.Runtime.StackTrace|null {
|
167
164
|
let rawEvent: Types.Events.Event|undefined = event;
|
168
165
|
if (event.args.traceId === undefined) {
|
169
166
|
return null;
|
@@ -173,11 +170,11 @@ function getForPerformanceMeasure(event: Types.Events.PerformanceMeasureBegin, p
|
|
173
170
|
// timeline. They are connected via a common traceId. At this
|
174
171
|
// point `rawEvent` corresponds to the second case, we must
|
175
172
|
// encounter the event for the call itself to obtain its callstack.
|
176
|
-
rawEvent =
|
173
|
+
rawEvent = data.UserTimings.measureTraceByTraceId.get(event.args.traceId);
|
177
174
|
if (!rawEvent) {
|
178
175
|
return null;
|
179
176
|
}
|
180
|
-
return get(rawEvent,
|
177
|
+
return get(rawEvent, data);
|
181
178
|
}
|
182
179
|
/**
|
183
180
|
* Determines if a function is a native JS API (like setTimeout,
|
@@ -32,9 +32,9 @@ export interface URLSummary extends BaseSummary {
|
|
32
32
|
* Returns Main frame main thread events.
|
33
33
|
* These events are inline with the ones used by selectedEvents() of TimelineTreeViews
|
34
34
|
*/
|
35
|
-
function collectMainThreadActivity(
|
35
|
+
function collectMainThreadActivity(data: Handlers.Types.HandlerData): Types.Events.Event[] {
|
36
36
|
// TODO: Note b/402658800 could be an issue here.
|
37
|
-
const mainFrameMainThread =
|
37
|
+
const mainFrameMainThread = data.Renderer.processes.values()
|
38
38
|
.find(p => {
|
39
39
|
const url = p.url ?? '';
|
40
40
|
// Frame url checked a la CompatibilityTracksAppenders's addThreadAppenders
|
@@ -51,14 +51,14 @@ function collectMainThreadActivity(parsedTrace: Handlers.Types.ParsedTrace): Typ
|
|
51
51
|
}
|
52
52
|
|
53
53
|
export function summarizeByThirdParty(
|
54
|
-
|
55
|
-
const mainThreadEvents = collectMainThreadActivity(
|
54
|
+
data: Handlers.Types.HandlerData, traceBounds: Types.Timing.TraceWindowMicro): EntitySummary[] {
|
55
|
+
const mainThreadEvents = collectMainThreadActivity(data).sort(Helpers.Trace.eventTimeComparator);
|
56
56
|
const groupingFunction = (event: Types.Events.Event): string => {
|
57
|
-
const entity =
|
57
|
+
const entity = data.Renderer.entityMappings.entityByEvent.get(event);
|
58
58
|
return entity?.name ?? '';
|
59
59
|
};
|
60
60
|
const node = getBottomUpTree(mainThreadEvents, traceBounds, groupingFunction);
|
61
|
-
const summaries = summarizeBottomUpByEntity(node,
|
61
|
+
const summaries = summarizeBottomUpByEntity(node, data);
|
62
62
|
|
63
63
|
return summaries;
|
64
64
|
}
|
@@ -67,19 +67,19 @@ export function summarizeByThirdParty(
|
|
67
67
|
* Used only by Lighthouse.
|
68
68
|
*/
|
69
69
|
export function summarizeByURL(
|
70
|
-
|
71
|
-
const mainThreadEvents = collectMainThreadActivity(
|
70
|
+
data: Handlers.Types.HandlerData, traceBounds: Types.Timing.TraceWindowMicro): URLSummary[] {
|
71
|
+
const mainThreadEvents = collectMainThreadActivity(data).sort(Helpers.Trace.eventTimeComparator);
|
72
72
|
const groupingFunction = (event: Types.Events.Event): string => {
|
73
|
-
return Handlers.Helpers.getNonResolvedURL(event,
|
73
|
+
return Handlers.Helpers.getNonResolvedURL(event, data) ?? '';
|
74
74
|
};
|
75
75
|
const node = getBottomUpTree(mainThreadEvents, traceBounds, groupingFunction);
|
76
|
-
const summaries = summarizeBottomUpByURL(node,
|
76
|
+
const summaries = summarizeBottomUpByURL(node, data);
|
77
77
|
|
78
78
|
return summaries;
|
79
79
|
}
|
80
80
|
|
81
81
|
function summarizeBottomUpByEntity(
|
82
|
-
root: TraceTree.BottomUpRootNode,
|
82
|
+
root: TraceTree.BottomUpRootNode, data: Handlers.Types.HandlerData): EntitySummary[] {
|
83
83
|
const summaries: EntitySummary[] = [];
|
84
84
|
|
85
85
|
// Top nodes are the 3P entities.
|
@@ -89,7 +89,7 @@ function summarizeBottomUpByEntity(
|
|
89
89
|
continue;
|
90
90
|
}
|
91
91
|
|
92
|
-
const entity =
|
92
|
+
const entity = data.Renderer.entityMappings.entityByEvent.get(node.event);
|
93
93
|
if (!entity) {
|
94
94
|
continue;
|
95
95
|
}
|
@@ -100,7 +100,7 @@ function summarizeBottomUpByEntity(
|
|
100
100
|
transferSize: node.transferSize,
|
101
101
|
mainThreadTime: Types.Timing.Milli(node.selfTime),
|
102
102
|
entity,
|
103
|
-
relatedEvents:
|
103
|
+
relatedEvents: data.Renderer.entityMappings.eventsByEntity.get(entity) ?? [],
|
104
104
|
};
|
105
105
|
summaries.push(summary);
|
106
106
|
}
|
@@ -108,10 +108,9 @@ function summarizeBottomUpByEntity(
|
|
108
108
|
return summaries;
|
109
109
|
}
|
110
110
|
|
111
|
-
function summarizeBottomUpByURL(
|
112
|
-
root: TraceTree.BottomUpRootNode, parsedTrace: Handlers.Types.ParsedTrace): URLSummary[] {
|
111
|
+
function summarizeBottomUpByURL(root: TraceTree.BottomUpRootNode, data: Handlers.Types.HandlerData): URLSummary[] {
|
113
112
|
const summaries: URLSummary[] = [];
|
114
|
-
const allRequests =
|
113
|
+
const allRequests = data.NetworkRequests.byTime;
|
115
114
|
|
116
115
|
// Top nodes are URLs.
|
117
116
|
const topNodes = [...root.children().values()].flat();
|
@@ -120,7 +119,7 @@ function summarizeBottomUpByURL(
|
|
120
119
|
continue;
|
121
120
|
}
|
122
121
|
|
123
|
-
const entity =
|
122
|
+
const entity = data.Renderer.entityMappings.entityByEvent.get(node.event);
|
124
123
|
if (!entity) {
|
125
124
|
continue;
|
126
125
|
}
|
@@ -6,7 +6,7 @@ import type * as Handlers from '../handlers/handlers.js';
|
|
6
6
|
import * as Types from '../types/types.js';
|
7
7
|
|
8
8
|
export abstract class TraceFilter {
|
9
|
-
abstract accept(_event: Types.Events.Event,
|
9
|
+
abstract accept(_event: Types.Events.Event, handlerData?: Handlers.Types.HandlerData): boolean;
|
10
10
|
}
|
11
11
|
|
12
12
|
export class VisibleEventsFilter extends TraceFilter {
|