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
@@ -0,0 +1,151 @@
|
|
1
|
+
// Copyright 2025 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
|
+
/**
|
6
|
+
* This module contains unit formatters that are only to be used within
|
7
|
+
* the AI models because they do not account for locales other than en-US.
|
8
|
+
*/
|
9
|
+
const defaultTimeFormatterOptions: Intl.NumberFormatOptions = {
|
10
|
+
style: 'unit',
|
11
|
+
unitDisplay: 'narrow',
|
12
|
+
minimumFractionDigits: 0,
|
13
|
+
maximumFractionDigits: 1,
|
14
|
+
} as const;
|
15
|
+
|
16
|
+
const defaultByteFormatterOptions: Intl.NumberFormatOptions = {
|
17
|
+
style: 'unit',
|
18
|
+
unitDisplay: 'narrow',
|
19
|
+
minimumFractionDigits: 0,
|
20
|
+
maximumFractionDigits: 1,
|
21
|
+
} as const;
|
22
|
+
|
23
|
+
const timeFormatters = {
|
24
|
+
milli: new Intl.NumberFormat('en-US', {
|
25
|
+
...defaultTimeFormatterOptions,
|
26
|
+
unit: 'millisecond',
|
27
|
+
}),
|
28
|
+
second: new Intl.NumberFormat('en-US', {
|
29
|
+
...defaultTimeFormatterOptions,
|
30
|
+
unit: 'second',
|
31
|
+
}),
|
32
|
+
micro: new Intl.NumberFormat('en-US', {
|
33
|
+
...defaultTimeFormatterOptions,
|
34
|
+
unit: 'microsecond',
|
35
|
+
}),
|
36
|
+
} as const;
|
37
|
+
|
38
|
+
const byteFormatters = {
|
39
|
+
bytes: new Intl.NumberFormat('en-US', {
|
40
|
+
...defaultByteFormatterOptions,
|
41
|
+
// Don't need as much precision on bytes.
|
42
|
+
minimumFractionDigits: 0,
|
43
|
+
maximumFractionDigits: 0,
|
44
|
+
unit: 'byte',
|
45
|
+
}),
|
46
|
+
kilobytes: new Intl.NumberFormat('en-US', {
|
47
|
+
...defaultByteFormatterOptions,
|
48
|
+
unit: 'kilobyte',
|
49
|
+
}),
|
50
|
+
megabytes: new Intl.NumberFormat('en-US', {
|
51
|
+
...defaultByteFormatterOptions,
|
52
|
+
unit: 'megabyte',
|
53
|
+
}),
|
54
|
+
} as const;
|
55
|
+
|
56
|
+
function numberIsTooLarge(x: number): boolean {
|
57
|
+
return !Number.isFinite(x) || x === Number.MAX_VALUE;
|
58
|
+
}
|
59
|
+
|
60
|
+
export function seconds(x: number): string {
|
61
|
+
if (numberIsTooLarge(x)) {
|
62
|
+
return '-';
|
63
|
+
}
|
64
|
+
if (x === 0) {
|
65
|
+
return formatAndEnsureSpace(timeFormatters.second, x);
|
66
|
+
}
|
67
|
+
|
68
|
+
const asMilli = x * 1_000;
|
69
|
+
|
70
|
+
if (asMilli < 1) {
|
71
|
+
return micros(x * 1_000_000);
|
72
|
+
}
|
73
|
+
|
74
|
+
if (asMilli < 1_000) {
|
75
|
+
return millis(asMilli);
|
76
|
+
}
|
77
|
+
return formatAndEnsureSpace(timeFormatters.second, x);
|
78
|
+
}
|
79
|
+
|
80
|
+
export function millis(x: number): string {
|
81
|
+
if (numberIsTooLarge(x)) {
|
82
|
+
return '-';
|
83
|
+
}
|
84
|
+
return formatAndEnsureSpace(timeFormatters.milli, x);
|
85
|
+
}
|
86
|
+
|
87
|
+
export function micros(x: number): string {
|
88
|
+
if (numberIsTooLarge(x)) {
|
89
|
+
return '-';
|
90
|
+
}
|
91
|
+
|
92
|
+
if (x < 100) {
|
93
|
+
return formatAndEnsureSpace(timeFormatters.micro, x);
|
94
|
+
}
|
95
|
+
|
96
|
+
const asMilli = x / 1_000;
|
97
|
+
return millis(asMilli);
|
98
|
+
}
|
99
|
+
|
100
|
+
export function bytes(x: number): string {
|
101
|
+
if (x < 1_000) {
|
102
|
+
return formatAndEnsureSpace(byteFormatters.bytes, x);
|
103
|
+
}
|
104
|
+
const kilobytes = x / 1_000;
|
105
|
+
if (kilobytes < 1_000) {
|
106
|
+
return formatAndEnsureSpace(byteFormatters.kilobytes, kilobytes);
|
107
|
+
}
|
108
|
+
|
109
|
+
const megabytes = kilobytes / 1_000;
|
110
|
+
return formatAndEnsureSpace(byteFormatters.megabytes, megabytes);
|
111
|
+
}
|
112
|
+
|
113
|
+
/**
|
114
|
+
* When using 'narrow' unitDisplay, many locales exclude the space between the literal and the unit.
|
115
|
+
* We don't like that, so when there is no space literal we inject the provided separator manually.
|
116
|
+
*/
|
117
|
+
function formatAndEnsureSpace(formatter: Intl.NumberFormat, value: number, separator = '\xA0'): string {
|
118
|
+
const parts = formatter.formatToParts(value);
|
119
|
+
|
120
|
+
let hasSpace = false;
|
121
|
+
for (const part of parts) {
|
122
|
+
if (part.type === 'literal') {
|
123
|
+
if (part.value === ' ') {
|
124
|
+
hasSpace = true;
|
125
|
+
part.value = separator;
|
126
|
+
} else if (part.value === separator) {
|
127
|
+
hasSpace = true;
|
128
|
+
}
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
if (hasSpace) {
|
133
|
+
return parts.map(part => part.value).join('');
|
134
|
+
}
|
135
|
+
|
136
|
+
const unitIndex = parts.findIndex(part => part.type === 'unit');
|
137
|
+
|
138
|
+
// Unexpected for there to be no unit, but just in case, handle that.
|
139
|
+
if (unitIndex === -1) {
|
140
|
+
return parts.map(part => part.value).join('');
|
141
|
+
}
|
142
|
+
|
143
|
+
// For locales where the unit comes first (sw), the space has to come after the unit.
|
144
|
+
if (unitIndex === 0) {
|
145
|
+
return parts[0].value + separator + parts.slice(1).map(part => part.value).join('');
|
146
|
+
}
|
147
|
+
|
148
|
+
// Otherwise, it comes before.
|
149
|
+
return parts.slice(0, unitIndex).map(part => part.value).join('') + separator +
|
150
|
+
parts.slice(unitIndex).map(part => part.value).join('');
|
151
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
// Copyright 2025 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 {Badge, type BadgeAction} from './Badge.js';
|
6
|
+
|
7
|
+
const AI_EXPLORER_BADGE_URI = new URL('../../Images/ai-explorer-badge.svg', import.meta.url).toString();
|
8
|
+
export class AiExplorerBadge extends Badge {
|
9
|
+
override readonly name =
|
10
|
+
'profiles/me/awards/developers.google.com%2Fprofile%2Fbadges%2Factivity%2Fchrome-devtools%2Fai-explorer';
|
11
|
+
override readonly title = 'AI Explorer';
|
12
|
+
override readonly imageUri = AI_EXPLORER_BADGE_URI;
|
13
|
+
|
14
|
+
override readonly interestedActions = [
|
15
|
+
// TODO(ergunsh): Instrument related actions.
|
16
|
+
] as const;
|
17
|
+
|
18
|
+
handleAction(_action: BadgeAction): void {
|
19
|
+
this.trigger();
|
20
|
+
}
|
21
|
+
}
|
@@ -5,30 +5,35 @@
|
|
5
5
|
import * as Common from '../../core/common/common.js';
|
6
6
|
|
7
7
|
export enum BadgeAction {
|
8
|
+
GDP_SIGN_UP_COMPLETE = 'gdp-sign-up-complete',
|
8
9
|
CSS_RULE_MODIFIED = 'css-rule-modified',
|
10
|
+
DOM_ELEMENT_OR_ATTRIBUTE_EDITED = 'dom-element-or-attribute-edited',
|
11
|
+
MODERN_DOM_BADGE_CLICKED = 'modern-dom-badge-clicked',
|
12
|
+
// TODO(ergunsh): Instrument performance insight clicks.
|
9
13
|
PERFORMANCE_INSIGHT_CLICKED = 'performance-insight-clicked',
|
10
14
|
}
|
11
15
|
|
12
16
|
export type BadgeActionEvents = Record<BadgeAction, void>;
|
13
17
|
|
14
18
|
export interface BadgeContext {
|
15
|
-
|
19
|
+
onTriggerBadge: (badge: Badge) => void;
|
16
20
|
badgeActionEventTarget: Common.ObjectWrapper.ObjectWrapper<BadgeActionEvents>;
|
17
21
|
}
|
18
22
|
|
19
23
|
export abstract class Badge {
|
20
|
-
#
|
24
|
+
#onTriggerBadge: (badge: Badge) => void;
|
21
25
|
#badgeActionEventTarget: Common.ObjectWrapper.ObjectWrapper<BadgeActionEvents>;
|
22
26
|
#eventListeners: Common.EventTarget.EventDescriptor[] = [];
|
23
27
|
#triggeredBefore = false;
|
24
28
|
|
25
29
|
abstract readonly name: string;
|
26
30
|
abstract readonly title: string;
|
31
|
+
abstract readonly imageUri: string;
|
27
32
|
abstract readonly interestedActions: readonly BadgeAction[];
|
28
33
|
readonly isStarterBadge: boolean = false;
|
29
34
|
|
30
35
|
constructor(context: BadgeContext) {
|
31
|
-
this.#
|
36
|
+
this.#onTriggerBadge = context.onTriggerBadge;
|
32
37
|
this.#badgeActionEventTarget = context.badgeActionEventTarget;
|
33
38
|
}
|
34
39
|
|
@@ -40,15 +45,10 @@ export abstract class Badge {
|
|
40
45
|
|
41
46
|
this.#triggeredBefore = true;
|
42
47
|
this.deactivate();
|
43
|
-
this.#
|
48
|
+
this.#onTriggerBadge(this);
|
44
49
|
}
|
45
50
|
|
46
51
|
activate(): void {
|
47
|
-
// We don't reactivate a badge that's triggered before.
|
48
|
-
if (this.#triggeredBefore) {
|
49
|
-
return;
|
50
|
-
}
|
51
|
-
|
52
52
|
// The event listeners are already registered, we don't re-register them.
|
53
53
|
if (this.#eventListeners.length > 0) {
|
54
54
|
return;
|
@@ -67,5 +67,6 @@ export abstract class Badge {
|
|
67
67
|
|
68
68
|
Common.EventTarget.removeEventListeners(this.#eventListeners);
|
69
69
|
this.#eventListeners = [];
|
70
|
+
this.#triggeredBefore = false;
|
70
71
|
}
|
71
72
|
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
// Copyright 2025 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 {Badge, type BadgeAction} from './Badge.js';
|
6
|
+
|
7
|
+
const CODE_WHISPERER_BADGE_IMAGE_URI = new URL('../../Images/code-whisperer-badge.svg', import.meta.url).toString();
|
8
|
+
export class CodeWhispererBadge extends Badge {
|
9
|
+
override readonly name =
|
10
|
+
'profiles/me/awards/developers.google.com%2Fprofile%2Fbadges%2Factivity%2Fchrome-devtools%2Fcode-whisperer';
|
11
|
+
override readonly title = 'Code Whisperer';
|
12
|
+
override readonly imageUri = CODE_WHISPERER_BADGE_IMAGE_URI;
|
13
|
+
|
14
|
+
override readonly interestedActions = [
|
15
|
+
// TODO(ergunsh): Instrument related actions.
|
16
|
+
] as const;
|
17
|
+
|
18
|
+
handleAction(_action: BadgeAction): void {
|
19
|
+
this.trigger();
|
20
|
+
}
|
21
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
// Copyright 2025 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 {Badge, BadgeAction} from './Badge.js';
|
6
|
+
|
7
|
+
const DOM_DETECTIVE_BADGE_IMAGE_URI = new URL('../../Images/dom-detective-badge.svg', import.meta.url).toString();
|
8
|
+
export class DOMDetectiveBadge extends Badge {
|
9
|
+
override readonly name =
|
10
|
+
'profiles/me/awards/developers.google.com%2Fprofile%2Fbadges%2Factivity%2Fchrome-devtools%2Fdom-detective';
|
11
|
+
override readonly title = 'DOM Detective';
|
12
|
+
override readonly imageUri = DOM_DETECTIVE_BADGE_IMAGE_URI;
|
13
|
+
|
14
|
+
override readonly interestedActions = [
|
15
|
+
BadgeAction.MODERN_DOM_BADGE_CLICKED,
|
16
|
+
] as const;
|
17
|
+
|
18
|
+
handleAction(_action: BadgeAction): void {
|
19
|
+
this.trigger();
|
20
|
+
}
|
21
|
+
}
|
@@ -4,10 +4,15 @@
|
|
4
4
|
|
5
5
|
import {Badge, BadgeAction} from './Badge.js';
|
6
6
|
|
7
|
+
const SPEEDSTER_BADGE_URI = new URL('../../Images/speedster-badge.svg', import.meta.url).toString();
|
7
8
|
export class SpeedsterBadge extends Badge {
|
8
|
-
override readonly name =
|
9
|
+
override readonly name =
|
10
|
+
'profiles/me/awards/developers.google.com%2Fprofile%2Fbadges%2Factivity%2Fchrome-devtools%2Fspeedster';
|
9
11
|
override readonly title = 'Speedster';
|
10
|
-
override readonly interestedActions = [
|
12
|
+
override readonly interestedActions = [
|
13
|
+
BadgeAction.PERFORMANCE_INSIGHT_CLICKED,
|
14
|
+
] as const;
|
15
|
+
override readonly imageUri = SPEEDSTER_BADGE_URI;
|
11
16
|
|
12
17
|
handleAction(_action: BadgeAction): void {
|
13
18
|
this.trigger();
|
@@ -4,14 +4,19 @@
|
|
4
4
|
|
5
5
|
import {Badge, BadgeAction} from './Badge.js';
|
6
6
|
|
7
|
+
const STARTER_BADGE_IMAGE_URI = new URL('../../Images/devtools-user-badge.svg', import.meta.url).toString();
|
7
8
|
export class StarterBadge extends Badge {
|
8
9
|
override readonly isStarterBadge = true;
|
9
|
-
override readonly name =
|
10
|
+
override readonly name =
|
11
|
+
'profiles/me/awards/developers.google.com%2Fprofile%2Fbadges%2Factivity%2Fchrome-devtools%2Fchrome-devtools-user';
|
10
12
|
override readonly title = 'Chrome DevTools User';
|
13
|
+
override readonly imageUri = STARTER_BADGE_IMAGE_URI;
|
11
14
|
|
12
15
|
// TODO(ergunsh): Add remaining non-trivial event definitions
|
13
16
|
override readonly interestedActions = [
|
17
|
+
BadgeAction.GDP_SIGN_UP_COMPLETE,
|
14
18
|
BadgeAction.CSS_RULE_MODIFIED,
|
19
|
+
BadgeAction.DOM_ELEMENT_OR_ATTRIBUTE_EDITED,
|
15
20
|
] as const;
|
16
21
|
|
17
22
|
handleAction(_action: BadgeAction): void {
|
@@ -5,7 +5,10 @@
|
|
5
5
|
import * as Common from '../../core/common/common.js';
|
6
6
|
import * as Host from '../../core/host/host.js';
|
7
7
|
|
8
|
+
import {AiExplorerBadge} from './AiExplorerBadge.js';
|
8
9
|
import type {Badge, BadgeAction, BadgeActionEvents, BadgeContext} from './Badge.js';
|
10
|
+
import {CodeWhispererBadge} from './CodeWhispererBadge.js';
|
11
|
+
import {DOMDetectiveBadge} from './DOMDetectiveBadge.js';
|
9
12
|
import {SpeedsterBadge} from './SpeedsterBadge.js';
|
10
13
|
import {StarterBadge} from './StarterBadge.js';
|
11
14
|
|
@@ -23,12 +26,15 @@ let userBadgesInstance: UserBadges|undefined = undefined;
|
|
23
26
|
export class UserBadges extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
24
27
|
readonly #badgeActionEventTarget = new Common.ObjectWrapper.ObjectWrapper<BadgeActionEvents>();
|
25
28
|
|
26
|
-
#receiveBadgesSetting
|
29
|
+
#receiveBadgesSetting: Common.Settings.Setting<Boolean>;
|
27
30
|
#allBadges: Badge[];
|
28
31
|
|
29
32
|
static readonly BADGE_REGISTRY: BadgeClass[] = [
|
30
33
|
StarterBadge,
|
31
34
|
SpeedsterBadge,
|
35
|
+
DOMDetectiveBadge,
|
36
|
+
CodeWhispererBadge,
|
37
|
+
AiExplorerBadge,
|
32
38
|
];
|
33
39
|
|
34
40
|
private constructor() {
|
@@ -37,11 +43,10 @@ export class UserBadges extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
37
43
|
this.#receiveBadgesSetting = Common.Settings.Settings.instance().moduleSetting('receive-gdp-badges');
|
38
44
|
this.#receiveBadgesSetting.addChangeListener(this.#reconcileBadges, this);
|
39
45
|
|
40
|
-
this.#allBadges =
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
}));
|
46
|
+
this.#allBadges = UserBadges.BADGE_REGISTRY.map(badgeCtor => new badgeCtor({
|
47
|
+
onTriggerBadge: this.#onTriggerBadge.bind(this),
|
48
|
+
badgeActionEventTarget: this.#badgeActionEventTarget,
|
49
|
+
}));
|
45
50
|
}
|
46
51
|
|
47
52
|
static instance({forceNew}: {forceNew: boolean} = {forceNew: false}): UserBadges {
|
@@ -65,7 +70,28 @@ export class UserBadges extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
65
70
|
this.#badgeActionEventTarget.dispatchEventToListeners(action);
|
66
71
|
}
|
67
72
|
|
68
|
-
#
|
73
|
+
async #onTriggerBadge(badge: Badge): Promise<void> {
|
74
|
+
let shouldAwardBadge = false;
|
75
|
+
// By default, we award non-starter badges directly when they are triggered.
|
76
|
+
if (!badge.isStarterBadge) {
|
77
|
+
shouldAwardBadge = true;
|
78
|
+
} else {
|
79
|
+
const gdpProfile = await Host.GdpClient.GdpClient.instance().getProfile();
|
80
|
+
const receiveBadgesSettingEnabled = Boolean(this.#receiveBadgesSetting.get());
|
81
|
+
// If there is a GDP profile and the user has enabled receiving badges, we award the starter badge as well.
|
82
|
+
if (gdpProfile && receiveBadgesSettingEnabled) {
|
83
|
+
shouldAwardBadge = true;
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
// Awarding was needed and not successful, we don't show the notification
|
88
|
+
if (shouldAwardBadge) {
|
89
|
+
const result = await Host.GdpClient.GdpClient.instance().createAward({name: badge.name});
|
90
|
+
if (!result) {
|
91
|
+
return;
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
69
95
|
this.dispatchEventToListeners(Events.BADGE_TRIGGERED, badge);
|
70
96
|
}
|
71
97
|
|
@@ -76,7 +102,6 @@ export class UserBadges extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
76
102
|
}
|
77
103
|
|
78
104
|
// TODO(ergunsh): Implement starter badge dismissal, snooze count & timestamp checks.
|
79
|
-
// TODO(ergunsh): Implement checking for previously awarded badges.
|
80
105
|
async #reconcileBadges(): Promise<void> {
|
81
106
|
const syncInfo = await new Promise<Host.InspectorFrontendHostAPI.SyncInformation>(
|
82
107
|
resolve => Host.InspectorFrontendHost.InspectorFrontendHostInstance.getSyncInformation(resolve));
|
@@ -98,8 +123,31 @@ export class UserBadges extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
98
123
|
return;
|
99
124
|
}
|
100
125
|
|
101
|
-
|
126
|
+
let awardedBadgeNames: Set<string>|null = null;
|
127
|
+
if (gdpProfile) {
|
128
|
+
awardedBadgeNames = await Host.GdpClient.GdpClient.instance().getAwardedBadgeNames(
|
129
|
+
{names: this.#allBadges.map(badge => badge.name)});
|
130
|
+
// This is a conservative approach. We bail out if `awardedBadgeNames` is null
|
131
|
+
// when there is a profile to prevent a negative user experience.
|
132
|
+
//
|
133
|
+
// A failure here (e.g., from a typo in a badge name) could cause us to
|
134
|
+
// re-trigger the "Receive badges" nudge for a user who has already earned the
|
135
|
+
// starter badge and opted out of receiving badges.
|
136
|
+
//
|
137
|
+
// The trade-off is, we silently failing to enable badge mechanism rather than annoying the user.
|
138
|
+
if (!awardedBadgeNames) {
|
139
|
+
this.#deactivateAllBadges();
|
140
|
+
return;
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
const receiveBadgesSettingEnabled = Boolean(this.#receiveBadgesSetting.get());
|
102
145
|
for (const badge of this.#allBadges) {
|
146
|
+
if (awardedBadgeNames?.has(badge.name)) {
|
147
|
+
badge.deactivate();
|
148
|
+
continue;
|
149
|
+
}
|
150
|
+
|
103
151
|
const shouldActivateStarterBadge = badge.isStarterBadge && isEligibleToCreateProfile;
|
104
152
|
const shouldActivateActivityBasedBadge =
|
105
153
|
!badge.isStarterBadge && Boolean(gdpProfile) && receiveBadgesSettingEnabled;
|
@@ -115,4 +163,8 @@ export class UserBadges extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
115
163
|
|
116
164
|
reconcileBadgesFinishedForTest(): void {
|
117
165
|
}
|
166
|
+
|
167
|
+
isReceiveBadgesSettingEnabled(): boolean {
|
168
|
+
return Boolean(this.#receiveBadgesSetting.get());
|
169
|
+
}
|
118
170
|
}
|
@@ -283,7 +283,7 @@ export class LiveLocation extends LiveLocationWithPool {
|
|
283
283
|
readonly #lineNumber: number;
|
284
284
|
readonly #columnNumber: number;
|
285
285
|
readonly #info: ModelInfo;
|
286
|
-
|
286
|
+
#header: SDK.CSSStyleSheetHeader.CSSStyleSheetHeader|null;
|
287
287
|
constructor(
|
288
288
|
rawLocation: SDK.CSSModel.CSSLocation, info: ModelInfo,
|
289
289
|
updateDelegate: (arg0: LiveLocationInterface) => Promise<void>, locationPool: LiveLocationPool) {
|
@@ -292,22 +292,22 @@ export class LiveLocation extends LiveLocationWithPool {
|
|
292
292
|
this.#lineNumber = rawLocation.lineNumber;
|
293
293
|
this.#columnNumber = rawLocation.columnNumber;
|
294
294
|
this.#info = info;
|
295
|
-
this
|
295
|
+
this.#header = null;
|
296
296
|
}
|
297
297
|
|
298
298
|
header(): SDK.CSSStyleSheetHeader.CSSStyleSheetHeader|null {
|
299
|
-
return this
|
299
|
+
return this.#header;
|
300
300
|
}
|
301
301
|
|
302
302
|
setHeader(header: SDK.CSSStyleSheetHeader.CSSStyleSheetHeader|null): void {
|
303
|
-
this
|
303
|
+
this.#header = header;
|
304
304
|
}
|
305
305
|
|
306
306
|
override async uiLocation(): Promise<Workspace.UISourceCode.UILocation|null> {
|
307
|
-
if (!this
|
307
|
+
if (!this.#header) {
|
308
308
|
return null;
|
309
309
|
}
|
310
|
-
const rawLocation = new SDK.CSSModel.CSSLocation(this
|
310
|
+
const rawLocation = new SDK.CSSModel.CSSLocation(this.#header, this.#lineNumber, this.#columnNumber);
|
311
311
|
return CSSWorkspaceBinding.instance().rawLocationToUILocation(rawLocation);
|
312
312
|
}
|
313
313
|
|
@@ -221,30 +221,30 @@ class SourceScopeRemoteObject extends SDK.RemoteObject.RemoteObjectImpl {
|
|
221
221
|
}
|
222
222
|
|
223
223
|
export class SourceScope implements SDK.DebuggerModel.ScopeChainEntry {
|
224
|
-
readonly #
|
225
|
-
readonly #
|
226
|
-
readonly #
|
227
|
-
readonly #
|
228
|
-
readonly #
|
224
|
+
readonly #callFrame: SDK.DebuggerModel.CallFrame;
|
225
|
+
readonly #type: string;
|
226
|
+
readonly #typeName: string;
|
227
|
+
readonly #icon: string|undefined;
|
228
|
+
readonly #object: SourceScopeRemoteObject;
|
229
229
|
constructor(
|
230
230
|
callFrame: SDK.DebuggerModel.CallFrame, stopId: StopId, type: string, typeName: string, icon: string|undefined,
|
231
231
|
plugin: DebuggerLanguagePlugin) {
|
232
232
|
if (icon && new URL(icon).protocol !== 'data:') {
|
233
233
|
throw new Error('The icon must be a data:-URL');
|
234
234
|
}
|
235
|
-
this.#
|
236
|
-
this.#
|
237
|
-
this.#
|
238
|
-
this.#
|
239
|
-
this.#
|
235
|
+
this.#callFrame = callFrame;
|
236
|
+
this.#type = type;
|
237
|
+
this.#typeName = typeName;
|
238
|
+
this.#icon = icon;
|
239
|
+
this.#object = new SourceScopeRemoteObject(callFrame, stopId, plugin);
|
240
240
|
}
|
241
241
|
|
242
242
|
async getVariableValue(name: string): Promise<SDK.RemoteObject.RemoteObject|null> {
|
243
|
-
for (let v = 0; v < this.#
|
244
|
-
if (this.#
|
243
|
+
for (let v = 0; v < this.#object.variables.length; ++v) {
|
244
|
+
if (this.#object.variables[v].name !== name) {
|
245
245
|
continue;
|
246
246
|
}
|
247
|
-
const properties = await this.#
|
247
|
+
const properties = await this.#object.getAllProperties(false, false);
|
248
248
|
if (!properties.properties) {
|
249
249
|
continue;
|
250
250
|
}
|
@@ -257,15 +257,15 @@ export class SourceScope implements SDK.DebuggerModel.ScopeChainEntry {
|
|
257
257
|
}
|
258
258
|
|
259
259
|
callFrame(): SDK.DebuggerModel.CallFrame {
|
260
|
-
return this.#
|
260
|
+
return this.#callFrame;
|
261
261
|
}
|
262
262
|
|
263
263
|
type(): string {
|
264
|
-
return this.#
|
264
|
+
return this.#type;
|
265
265
|
}
|
266
266
|
|
267
267
|
typeName(): string {
|
268
|
-
return this.#
|
268
|
+
return this.#typeName;
|
269
269
|
}
|
270
270
|
|
271
271
|
name(): string|undefined {
|
@@ -277,7 +277,7 @@ export class SourceScope implements SDK.DebuggerModel.ScopeChainEntry {
|
|
277
277
|
}
|
278
278
|
|
279
279
|
object(): SourceScopeRemoteObject {
|
280
|
-
return this.#
|
280
|
+
return this.#object;
|
281
281
|
}
|
282
282
|
|
283
283
|
description(): string {
|
@@ -285,7 +285,7 @@ export class SourceScope implements SDK.DebuggerModel.ScopeChainEntry {
|
|
285
285
|
}
|
286
286
|
|
287
287
|
icon(): string|undefined {
|
288
|
-
return this.#
|
288
|
+
return this.#icon;
|
289
289
|
}
|
290
290
|
|
291
291
|
extraProperties(): SDK.RemoteObject.RemoteObjectProperty[] {
|
@@ -47,27 +47,27 @@ export interface ChunkedReader {
|
|
47
47
|
|
48
48
|
export class ChunkedFileReader implements ChunkedReader {
|
49
49
|
#file: File|null;
|
50
|
-
readonly #
|
51
|
-
#
|
50
|
+
readonly #fileSize: number;
|
51
|
+
#loadedSize: number;
|
52
52
|
#streamReader: ReadableStreamDefaultReader<Uint8Array<ArrayBuffer>>|null;
|
53
53
|
readonly #chunkSize: number;
|
54
54
|
readonly #chunkTransferredCallback: ((arg0: ChunkedReader) => void)|undefined;
|
55
55
|
readonly #decoder: TextDecoder;
|
56
56
|
#isCanceled: boolean;
|
57
|
-
#
|
57
|
+
#error: DOMException|null;
|
58
58
|
#transferFinished!: (arg0: boolean) => void;
|
59
59
|
#output?: Common.StringOutputStream.OutputStream;
|
60
60
|
#reader?: FileReader|null;
|
61
61
|
|
62
62
|
constructor(file: File, chunkSize?: number, chunkTransferredCallback?: ((arg0: ChunkedReader) => void)) {
|
63
63
|
this.#file = file;
|
64
|
-
this.#
|
65
|
-
this.#
|
64
|
+
this.#fileSize = file.size;
|
65
|
+
this.#loadedSize = 0;
|
66
66
|
this.#chunkSize = (chunkSize) ? chunkSize : Number.MAX_VALUE;
|
67
67
|
this.#chunkTransferredCallback = chunkTransferredCallback;
|
68
68
|
this.#decoder = new TextDecoder();
|
69
69
|
this.#isCanceled = false;
|
70
|
-
this.#
|
70
|
+
this.#error = null;
|
71
71
|
this.#streamReader = null;
|
72
72
|
}
|
73
73
|
|
@@ -99,11 +99,11 @@ export class ChunkedFileReader implements ChunkedReader {
|
|
99
99
|
}
|
100
100
|
|
101
101
|
loadedSize(): number {
|
102
|
-
return this.#
|
102
|
+
return this.#loadedSize;
|
103
103
|
}
|
104
104
|
|
105
105
|
fileSize(): number {
|
106
|
-
return this.#
|
106
|
+
return this.#fileSize;
|
107
107
|
}
|
108
108
|
|
109
109
|
fileName(): string {
|
@@ -114,7 +114,7 @@ export class ChunkedFileReader implements ChunkedReader {
|
|
114
114
|
}
|
115
115
|
|
116
116
|
error(): DOMException|null {
|
117
|
-
return this.#
|
117
|
+
return this.#error;
|
118
118
|
}
|
119
119
|
|
120
120
|
private onChunkLoaded(event: Event): void {
|
@@ -132,8 +132,8 @@ export class ChunkedFileReader implements ChunkedReader {
|
|
132
132
|
}
|
133
133
|
|
134
134
|
const buffer = (this.#reader.result as ArrayBuffer);
|
135
|
-
this.#
|
136
|
-
const endOfFile = this.#
|
135
|
+
this.#loadedSize += buffer.byteLength;
|
136
|
+
const endOfFile = this.#loadedSize === this.#fileSize;
|
137
137
|
void this.decodeChunkBuffer(buffer, endOfFile);
|
138
138
|
}
|
139
139
|
|
@@ -164,7 +164,7 @@ export class ChunkedFileReader implements ChunkedReader {
|
|
164
164
|
this.#file = null;
|
165
165
|
this.#reader = null;
|
166
166
|
await this.#output.close();
|
167
|
-
this.#transferFinished(!this.#
|
167
|
+
this.#transferFinished(!this.#error);
|
168
168
|
}
|
169
169
|
|
170
170
|
private async loadChunk(): Promise<void> {
|
@@ -181,8 +181,8 @@ export class ChunkedFileReader implements ChunkedReader {
|
|
181
181
|
void this.decodeChunkBuffer(value.buffer, false);
|
182
182
|
}
|
183
183
|
if (this.#reader) {
|
184
|
-
const chunkStart = this.#
|
185
|
-
const chunkEnd = Math.min(this.#
|
184
|
+
const chunkStart = this.#loadedSize;
|
185
|
+
const chunkEnd = Math.min(this.#fileSize, chunkStart + this.#chunkSize);
|
186
186
|
const nextPart = this.#file.slice(chunkStart, chunkEnd);
|
187
187
|
this.#reader.readAsArrayBuffer(nextPart);
|
188
188
|
}
|
@@ -190,7 +190,7 @@ export class ChunkedFileReader implements ChunkedReader {
|
|
190
190
|
|
191
191
|
private onError(event: Event): void {
|
192
192
|
const eventTarget = (event.target as FileReader);
|
193
|
-
this.#
|
193
|
+
this.#error = eventTarget.error;
|
194
194
|
this.#transferFinished(false);
|
195
195
|
}
|
196
196
|
}
|