chrome-devtools-frontend 1.0.1376716 → 1.0.1380117
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/config/gni/devtools_grd_files.gni +15 -7
- package/config/gni/devtools_image_files.gni +2 -0
- package/front_end/Images/src/animation.svg +3 -0
- package/front_end/Images/src/brush-2.svg +3 -0
- package/front_end/core/common/SettingRegistration.ts +1 -1
- package/front_end/core/host/AidaClient.ts +1 -0
- package/front_end/core/host/InspectorFrontendHost.ts +4 -0
- package/front_end/core/i18n/ByteUtilities.test.ts +34 -0
- package/front_end/core/i18n/ByteUtilities.ts +65 -0
- package/front_end/core/i18n/NumberFormatter.ts +75 -0
- package/front_end/core/i18n/i18n.ts +4 -0
- package/front_end/core/i18n/time-utilities.test.ts +20 -2
- package/front_end/core/i18n/time-utilities.ts +125 -86
- package/front_end/core/platform/NumberUtilities.test.ts +3 -26
- package/front_end/core/platform/NumberUtilities.ts +0 -20
- package/front_end/core/root/Runtime.ts +6 -3
- package/front_end/core/sdk/CPUThrottlingManager.ts +4 -0
- package/front_end/core/sdk/CSSContainerQuery.test.ts +10 -16
- package/front_end/core/sdk/CSSContainerQuery.ts +3 -15
- package/front_end/core/sdk/CSSMatchedStyles.test.ts +4 -0
- package/front_end/core/sdk/CSSMatchedStyles.ts +5 -5
- package/front_end/core/sdk/CSSModel.ts +18 -0
- package/front_end/core/sdk/CSSPropertyParser.test.ts +16 -1
- package/front_end/core/sdk/CSSPropertyParser.ts +2 -2
- package/front_end/core/sdk/sdk-meta.ts +8 -0
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +3 -3
- package/front_end/generated/ARIAProperties.js +4 -0
- package/front_end/generated/InspectorBackendCommands.js +8 -6
- package/front_end/generated/SupportedCSSProperties.js +17 -4
- package/front_end/generated/protocol-mapping.d.ts +15 -1
- package/front_end/generated/protocol-proxy-api.d.ts +14 -1
- package/front_end/generated/protocol.ts +26 -2
- package/front_end/models/extensions/ExtensionAPI.ts +9 -1
- package/front_end/models/heap_snapshot_model/HeapSnapshotModel.ts +2 -0
- package/front_end/models/javascript_metadata/NativeFunctions.js +8 -21
- package/front_end/models/live-metrics/web-vitals-injected/{rollup.config.js → rollup.config.mjs} +1 -1
- package/front_end/models/persistence/EditFileSystemView.ts +19 -9
- package/front_end/models/persistence/WorkspaceSettingsTab.ts +50 -54
- package/front_end/models/persistence/editFileSystemView.css +35 -15
- package/front_end/models/persistence/workspaceSettingsTab.css +21 -87
- package/front_end/models/timeline_model/timeline_model.ts +0 -6
- package/front_end/models/trace/Processor.test.ts +18 -17
- package/front_end/models/trace/Processor.ts +10 -14
- package/front_end/models/trace/README.md +0 -1
- package/front_end/models/{timeline_model → trace/extras}/TimelineJSProfile.ts +19 -29
- package/front_end/models/{timeline_model/TimelineModelFilter.test.ts → trace/extras/TraceFilter.test.ts} +15 -17
- package/front_end/models/trace/extras/TraceFilter.ts +62 -0
- package/front_end/models/{timeline_model/TimelineProfileTree.test.ts → trace/extras/TraceTree.test.ts} +44 -43
- package/front_end/models/{timeline_model/TimelineProfileTree.ts → trace/extras/TraceTree.ts} +65 -59
- package/front_end/models/trace/extras/extras.ts +3 -0
- package/front_end/models/trace/handlers/AnimationHandler.ts +0 -8
- package/front_end/models/trace/handlers/ExtensionTraceDataHandler.ts +1 -11
- package/front_end/models/trace/handlers/FramesHandler.test.ts +1 -6
- package/front_end/models/trace/handlers/FramesHandler.ts +1 -14
- package/front_end/models/trace/handlers/GPUHandler.test.ts +0 -2
- package/front_end/models/trace/handlers/GPUHandler.ts +1 -25
- package/front_end/models/trace/handlers/ImagePaintingHandler.ts +3 -0
- package/front_end/models/trace/handlers/InitiatorsHandler.test.ts +0 -1
- package/front_end/models/trace/handlers/InitiatorsHandler.ts +0 -20
- package/front_end/models/trace/handlers/InvalidationsHandler.test.ts +0 -1
- package/front_end/models/trace/handlers/InvalidationsHandler.ts +0 -18
- package/front_end/models/trace/handlers/LargestImagePaintHandler.test.ts +2 -2
- package/front_end/models/trace/handlers/LargestImagePaintHandler.ts +63 -3
- package/front_end/models/trace/handlers/LargestTextPaintHandler.ts +3 -0
- package/front_end/models/trace/handlers/LayerTreeHandler.test.ts +0 -2
- package/front_end/models/trace/handlers/LayerTreeHandler.ts +1 -18
- package/front_end/models/trace/handlers/LayoutShiftsHandler.test.ts +0 -3
- package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +1 -20
- package/front_end/models/trace/handlers/MemoryHandler.test.ts +0 -1
- package/front_end/models/trace/handlers/MemoryHandler.ts +3 -0
- package/front_end/models/trace/handlers/MetaHandler.test.ts +1 -32
- package/front_end/models/trace/handlers/MetaHandler.ts +2 -30
- package/front_end/models/trace/handlers/NetworkRequestsHandler.test.ts +0 -26
- package/front_end/models/trace/handlers/NetworkRequestsHandler.ts +4 -23
- package/front_end/models/trace/handlers/PageFramesHandler.ts +3 -0
- package/front_end/models/trace/handlers/RendererHandler.test.ts +0 -4
- package/front_end/models/trace/handlers/RendererHandler.ts +1 -24
- package/front_end/models/trace/handlers/SamplesHandler.test.ts +0 -5
- package/front_end/models/trace/handlers/SamplesHandler.ts +0 -26
- package/front_end/models/trace/handlers/ScreenshotsHandler.test.ts +0 -1
- package/front_end/models/trace/handlers/SelectorStatsHandler.ts +3 -0
- package/front_end/models/trace/handlers/ServerTimingsHandler.ts +1 -16
- package/front_end/models/trace/handlers/Threads.test.ts +1 -2
- package/front_end/models/trace/handlers/UserInteractionsHandler.test.ts +4 -27
- package/front_end/models/trace/handlers/UserInteractionsHandler.ts +16 -25
- package/front_end/models/trace/handlers/UserTimingsHandler.ts +0 -17
- package/front_end/models/trace/handlers/WorkersHandler.test.ts +0 -1
- package/front_end/models/trace/handlers/WorkersHandler.ts +0 -23
- package/front_end/models/trace/handlers/types.ts +1 -8
- package/front_end/models/trace/insights/{CumulativeLayoutShift.test.ts → CLSCulprits.test.ts} +21 -21
- package/front_end/models/trace/insights/{CumulativeLayoutShift.ts → CLSCulprits.ts} +24 -5
- package/front_end/models/trace/insights/Common.ts +5 -55
- package/front_end/models/trace/insights/DocumentLatency.test.ts +2 -2
- package/front_end/models/trace/insights/DocumentLatency.ts +26 -6
- package/front_end/models/trace/insights/FontDisplay.ts +24 -5
- package/front_end/models/trace/insights/InteractionToNextPaint.test.ts +1 -1
- package/front_end/models/trace/insights/InteractionToNextPaint.ts +26 -6
- package/front_end/models/trace/insights/LCPDiscovery.test.ts +58 -0
- package/front_end/models/trace/insights/LCPDiscovery.ts +101 -0
- package/front_end/models/trace/insights/{LargestContentfulPaint.test.ts → LCPPhases.test.ts} +6 -28
- package/front_end/models/trace/insights/{LargestContentfulPaint.ts → LCPPhases.ts} +37 -38
- package/front_end/models/trace/insights/{InsightRunners.ts → Models.ts} +4 -3
- package/front_end/models/trace/insights/RenderBlocking.test.ts +1 -1
- package/front_end/models/trace/insights/RenderBlocking.ts +33 -28
- package/front_end/models/trace/insights/SlowCSSSelector.ts +26 -5
- package/front_end/models/trace/insights/{ThirdPartyWeb.test.ts → ThirdParties.test.ts} +3 -3
- package/front_end/models/trace/insights/{ThirdPartyWeb.ts → ThirdParties.ts} +24 -5
- package/front_end/models/trace/insights/Viewport.test.ts +1 -1
- package/front_end/models/trace/insights/Viewport.ts +27 -9
- package/front_end/models/trace/insights/insights.ts +1 -1
- package/front_end/models/trace/insights/types.ts +11 -9
- package/front_end/models/trace/types/TraceEvents.ts +51 -22
- package/front_end/panels/application/SharedStorageItemsView.test.ts +3 -3
- package/front_end/panels/application/SharedStorageItemsView.ts +5 -3
- package/front_end/panels/application/StorageView.ts +3 -3
- package/front_end/panels/application/components/StorageMetadataView.ts +1 -2
- package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +34 -31
- package/front_end/panels/coverage/CoverageView.ts +3 -3
- package/front_end/panels/elements/ComputedStyleModel.ts +9 -2
- package/front_end/panels/elements/ComputedStyleWidget.test.ts +72 -0
- package/front_end/panels/elements/ComputedStyleWidget.ts +12 -0
- package/front_end/panels/elements/ElementStatePaneWidget.test.ts +84 -30
- package/front_end/panels/elements/ElementStatePaneWidget.ts +42 -24
- package/front_end/panels/elements/ElementsTreeElement.ts +24 -11
- package/front_end/panels/elements/MetricsSidebarPane.ts +12 -7
- package/front_end/panels/elements/PropertyMatchers.ts +3 -0
- package/front_end/panels/elements/StylePropertiesSection.ts +15 -6
- package/front_end/panels/elements/StylePropertyTreeElement.test.ts +3 -1
- package/front_end/panels/elements/StylePropertyTreeElement.ts +8 -3
- package/front_end/panels/elements/stylePropertiesTreeOutline.css +2 -2
- package/front_end/panels/explain/components/ConsoleInsight.ts +8 -18
- package/front_end/panels/freestyler/AiAgent.test.ts +58 -1
- package/front_end/panels/freestyler/AiAgent.ts +58 -3
- package/front_end/panels/freestyler/DrJonesFileAgent.test.ts +99 -23
- package/front_end/panels/freestyler/DrJonesFileAgent.ts +53 -20
- package/front_end/panels/freestyler/DrJonesNetworkAgent.test.ts +15 -7
- package/front_end/panels/freestyler/DrJonesNetworkAgent.ts +36 -15
- package/front_end/panels/freestyler/DrJonesPerformanceAgent.test.ts +6 -6
- package/front_end/panels/freestyler/DrJonesPerformanceAgent.ts +48 -8
- package/front_end/panels/freestyler/FreestylerAgent.test.ts +15 -14
- package/front_end/panels/freestyler/FreestylerAgent.ts +52 -8
- package/front_end/panels/freestyler/FreestylerPanel.test.ts +539 -39
- package/front_end/panels/freestyler/FreestylerPanel.ts +349 -215
- package/front_end/panels/freestyler/components/FreestylerChatUi.test.ts +126 -34
- package/front_end/panels/freestyler/components/FreestylerChatUi.ts +320 -268
- package/front_end/panels/freestyler/components/UserActionRow.ts +156 -47
- package/front_end/panels/freestyler/components/freestylerChatUi.css +69 -34
- package/front_end/panels/freestyler/components/userActionRow.css +40 -67
- package/front_end/panels/freestyler/freestyler-meta.ts +3 -11
- package/front_end/panels/issues/components/HideIssuesMenu.ts +2 -11
- package/front_end/panels/layer_viewer/LayerDetailsView.ts +1 -2
- package/front_end/panels/layer_viewer/PaintProfilerView.ts +5 -5
- package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +46 -0
- package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +26 -17
- package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +25 -19
- package/front_end/panels/network/BinaryResourceView.ts +6 -7
- package/front_end/panels/network/EventSourceMessagesView.ts +1 -1
- package/front_end/panels/network/NetworkDataGridNode.ts +3 -3
- package/front_end/panels/network/NetworkLogView.ts +7 -8
- package/front_end/panels/network/RequestTimingView.test.ts +35 -1
- package/front_end/panels/network/RequestTimingView.ts +96 -0
- package/front_end/panels/network/ResourceWebSocketFrameView.ts +2 -2
- package/front_end/panels/network/networkTimingTable.css +2 -1
- package/front_end/panels/performance_monitor/PerformanceMonitor.ts +1 -1
- package/front_end/panels/profiler/HeapProfileView.ts +3 -3
- package/front_end/panels/profiler/HeapSnapshotView.ts +2 -2
- package/front_end/panels/profiler/HeapTimelineOverview.ts +12 -12
- package/front_end/panels/profiler/IsolateSelector.ts +3 -4
- package/front_end/panels/profiler/ProfileFlameChartDataProvider.ts +1 -1
- package/front_end/panels/profiler/ProfileSidebarTreeElement.ts +7 -6
- package/front_end/panels/profiler/ProfileView.ts +1 -1
- package/front_end/panels/recorder/components/RecordingView.ts +2 -2
- package/front_end/panels/recorder/injected/{rollup.config.js → rollup.config.mjs} +1 -1
- package/front_end/panels/recorder/recorderController.css +0 -4
- package/front_end/panels/security/CookieReportTreeElement.ts +1 -9
- package/front_end/panels/security/CookieReportView.ts +120 -0
- package/front_end/panels/security/SecurityPanel.ts +8 -2
- package/front_end/panels/security/cookieReportView.css +46 -0
- package/front_end/panels/security/sidebar.css +1 -2
- package/front_end/panels/sensors/LocationsSettingsTab.ts +26 -11
- package/front_end/panels/sensors/locationsSettingsTab.css +18 -18
- package/front_end/panels/settings/AISettingsTab.ts +6 -15
- package/front_end/panels/settings/KeybindsSettingsTab.ts +1 -1
- package/front_end/panels/settings/SettingsScreen.ts +61 -56
- package/front_end/panels/settings/aiSettingsTab.css +3 -14
- package/front_end/panels/settings/components/SyncSection.ts +1 -2
- package/front_end/panels/settings/components/syncSection.css +0 -10
- package/front_end/panels/settings/frameworkIgnoreListSettingsTab.css +3 -1
- package/front_end/panels/settings/keybindsSettingsTab.css +7 -10
- package/front_end/panels/settings/settingsScreen.css +27 -125
- package/front_end/panels/sources/DebuggerPlugin.ts +9 -4
- package/front_end/panels/sources/NavigatorView.ts +11 -13
- package/front_end/panels/timeline/ActiveFilters.ts +3 -4
- package/front_end/panels/timeline/AnimationsTrackAppender.ts +1 -2
- package/front_end/panels/timeline/CountersGraph.ts +2 -4
- package/front_end/panels/timeline/EventsTimelineTreeView.ts +7 -8
- package/front_end/panels/timeline/README.md +2 -1
- package/front_end/panels/timeline/TimelineController.ts +14 -4
- package/front_end/panels/timeline/TimelineEventOverview.ts +3 -4
- package/front_end/panels/timeline/TimelineFilters.ts +3 -4
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.test.ts +1 -1
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +3 -10
- package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +1 -2
- package/front_end/panels/timeline/TimelineFlameChartView.ts +21 -12
- package/front_end/panels/timeline/TimelineLoader.test.ts +1 -2
- package/front_end/panels/timeline/TimelineLoader.ts +3 -4
- package/front_end/panels/timeline/TimelineMiniMap.ts +10 -0
- package/front_end/panels/timeline/TimelinePanel.ts +20 -8
- package/front_end/panels/timeline/TimelineTreeView.test.ts +12 -13
- package/front_end/panels/timeline/TimelineTreeView.ts +35 -40
- package/front_end/panels/timeline/TimelineUIUtils.test.ts +2 -2
- package/front_end/panels/timeline/TimelineUIUtils.ts +12 -14
- package/front_end/panels/timeline/components/LayoutShiftDetails.ts +6 -7
- package/front_end/panels/timeline/components/LiveMetricsView.test.ts +3 -3
- package/front_end/panels/timeline/components/LiveMetricsView.ts +14 -26
- package/front_end/panels/timeline/components/MetricCard.test.ts +1 -1
- package/front_end/panels/timeline/components/MetricCard.ts +46 -0
- package/front_end/panels/timeline/components/NetworkRequestDetails.ts +3 -4
- package/front_end/panels/timeline/components/SidebarSingleInsightSet.test.ts +2 -0
- package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +41 -36
- package/front_end/panels/timeline/components/insights/CLSCulprits.ts +19 -33
- package/front_end/panels/timeline/components/insights/DocumentLatency.ts +29 -40
- package/front_end/panels/timeline/components/insights/FontDisplay.ts +17 -23
- package/front_end/panels/timeline/components/insights/Helpers.ts +12 -16
- package/front_end/panels/timeline/components/insights/InteractionToNextPaint.ts +14 -26
- package/front_end/panels/timeline/components/insights/LCPDiscovery.ts +25 -37
- package/front_end/panels/timeline/components/insights/LCPPhases.ts +20 -47
- package/front_end/panels/timeline/components/insights/RenderBlocking.ts +19 -28
- package/front_end/panels/timeline/components/insights/SidebarInsight.ts +1 -2
- package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +18 -31
- package/front_end/panels/timeline/components/insights/Table.ts +5 -3
- package/front_end/panels/timeline/components/insights/ThirdParties.ts +18 -25
- package/front_end/panels/timeline/components/insights/Viewport.ts +14 -25
- package/front_end/panels/timeline/components/liveMetricsView.css +5 -13
- package/front_end/panels/timeline/components/metricCard.css +11 -0
- package/front_end/panels/timeline/components/sidebarInsightsTab.css +1 -1
- package/front_end/panels/timeline/overlays/OverlaysImpl.test.ts +5 -5
- package/front_end/panels/timeline/overlays/OverlaysImpl.ts +13 -12
- package/front_end/panels/timeline/timelineFlameChartView.css +1 -1
- package/front_end/panels/timeline/utils/AICallTree.test.ts +105 -0
- package/front_end/panels/timeline/utils/AICallTree.ts +25 -24
- package/front_end/testing/EnvironmentHelpers.ts +5 -18
- package/front_end/testing/InsightHelpers.ts +4 -4
- package/front_end/testing/TraceHelpers.ts +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +2 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts +14 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js +16 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.d.ts +34 -5
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.js +51 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.js +10 -8
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.d.ts +14 -4
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.js +57 -23
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.js +13 -10
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.d.ts +15 -4
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.js +55 -26
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.d.ts +0 -8
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.js +2 -11
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js +5 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts +7 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js +9 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.js +5 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.js +0 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.d.ts +14 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.js +18 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +51 -10
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +215 -97
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +2 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts +14 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js +16 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts +34 -5
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.js +51 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.js +10 -8
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.d.ts +14 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.js +57 -23
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.js +13 -10
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.d.ts +15 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.js +55 -26
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.d.ts +0 -8
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.js +1 -9
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js +5 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts +7 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js +7 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.js +5 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.js +0 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.d.ts +14 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.js +15 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/types.d.ts +51 -10
- package/front_end/third_party/puppeteer/package/package.json +4 -4
- package/front_end/third_party/puppeteer/package/src/api/Browser.ts +2 -3
- package/front_end/third_party/puppeteer/package/src/api/ElementHandle.ts +21 -3
- package/front_end/third_party/puppeteer/package/src/api/Input.ts +57 -8
- package/front_end/third_party/puppeteer/package/src/bidi/ElementHandle.ts +9 -7
- package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +1 -0
- package/front_end/third_party/puppeteer/package/src/bidi/Input.ts +72 -31
- package/front_end/third_party/puppeteer/package/src/cdp/ElementHandle.ts +14 -9
- package/front_end/third_party/puppeteer/package/src/cdp/Input.ts +71 -26
- package/front_end/third_party/puppeteer/package/src/common/CallbackRegistry.ts +1 -15
- package/front_end/third_party/puppeteer/package/src/common/ConsoleMessage.ts +8 -1
- package/front_end/third_party/puppeteer/package/src/common/Errors.ts +7 -0
- package/front_end/third_party/puppeteer/package/src/common/WaitTask.ts +9 -9
- package/front_end/third_party/puppeteer/package/src/environment.ts +1 -4
- package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/generated/version.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
- package/front_end/third_party/puppeteer/package/src/util/incremental-id-generator.ts +20 -0
- package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +1 -0
- package/front_end/ui/components/buttons/Button.test.ts +14 -0
- package/front_end/ui/components/buttons/Button.ts +27 -4
- package/front_end/ui/components/cards/card.css +7 -4
- package/front_end/ui/components/dialogs/Dialog.ts +2 -4
- package/front_end/ui/components/dialogs/ShortcutDialog.ts +15 -13
- package/front_end/ui/components/dialogs/dialog.css +2 -6
- package/front_end/ui/components/dialogs/shortcutDialog.css +33 -41
- package/front_end/ui/components/docs/freestyler/basic.ts +6 -8
- package/front_end/ui/components/docs/freestyler/empty_state.ts +6 -8
- package/front_end/ui/components/docs/performance_panel/track_example.html +1 -1
- package/front_end/ui/components/markdown_view/MarkdownView.test.ts +39 -17
- package/front_end/ui/components/markdown_view/MarkdownView.ts +77 -14
- package/front_end/ui/components/markdown_view/markdownView.css +15 -0
- package/front_end/ui/components/settings/SettingCheckbox.ts +3 -2
- package/front_end/ui/legacy/ContextMenu.ts +2 -2
- package/front_end/ui/legacy/InplaceEditor.ts +18 -14
- package/front_end/ui/legacy/TabbedPane.ts +0 -14
- package/front_end/ui/legacy/UIUtils.ts +0 -7
- package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +7 -2
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +8 -4
- package/front_end/ui/legacy/components/data_grid/ViewportDataGrid.ts +20 -11
- package/front_end/ui/legacy/components/inline_editor/LinkSwatch.test.ts +19 -0
- package/front_end/ui/legacy/components/inline_editor/LinkSwatch.ts +1 -1
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +1 -1
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +5 -22
- package/front_end/ui/legacy/components/perf_ui/OverviewGrid.ts +129 -100
- package/front_end/ui/legacy/components/perf_ui/TimelineGrid.ts +4 -2
- package/front_end/ui/legacy/components/perf_ui/TimelineOverviewCalculator.test.ts +9 -4
- package/front_end/ui/legacy/components/perf_ui/TimelineOverviewCalculator.ts +6 -6
- package/front_end/ui/legacy/components/perf_ui/TimelineOverviewPane.ts +22 -4
- package/front_end/ui/legacy/components/perf_ui/flameChart.css +0 -2
- package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.test.ts +49 -0
- package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.ts +23 -46
- package/front_end/ui/legacy/components/source_frame/ImageView.ts +1 -1
- package/front_end/ui/legacy/components/utils/ImagePreview.ts +1 -1
- package/front_end/ui/legacy/textPrompt.css +1 -1
- package/front_end/ui/legacy/toolbar.css +4 -5
- package/front_end/ui/visual_logging/KnownContextValues.ts +174 -0
- package/front_end/ui/visual_logging/LoggingConfig.ts +6 -2
- package/package.json +7 -6
- package/scripts/build/ninja/bundle.gni +3 -3
- package/scripts/build/{rollup.config.js → rollup.config.mjs} +4 -4
- package/scripts/devtools_paths.py +8 -4
- package/scripts/eslint_rules/tests/check_test_definitions_test.js +8 -3
- package/scripts/tools/update_goldens_v2.py +1 -1
- package/front_end/models/timeline_model/TimelineModelFilter.ts +0 -61
- /package/front_end/Images/{rollup.config.js → rollup.config.mjs} +0 -0
@@ -31,7 +31,6 @@
|
|
31
31
|
import * as Common from '../../../../core/common/common.js';
|
32
32
|
import * as i18n from '../../../../core/i18n/i18n.js';
|
33
33
|
import * as Platform from '../../../../core/platform/platform.js';
|
34
|
-
import * as Trace from '../../../../models/trace/trace.js';
|
35
34
|
import * as IconButton from '../../../components/icon_button/icon_button.js';
|
36
35
|
import * as VisualLogging from '../../../visual_logging/visual_logging.js';
|
37
36
|
import * as UI from '../../legacy.js';
|
@@ -59,6 +58,8 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
59
58
|
export class OverviewGrid {
|
60
59
|
element: HTMLDivElement;
|
61
60
|
private readonly grid: TimelineGrid;
|
61
|
+
// The |window| will manage the html element of resizers, the left/right blue-colour curtain, and handle the resizing,
|
62
|
+
// zooming, and breadcrumb creation.
|
62
63
|
private readonly window: Window;
|
63
64
|
constructor(prefix: string, calculator?: Calculator) {
|
64
65
|
this.element = document.createElement('div');
|
@@ -101,16 +102,30 @@ export class OverviewGrid {
|
|
101
102
|
this.window.reset();
|
102
103
|
}
|
103
104
|
|
104
|
-
|
105
|
-
|
105
|
+
// The ratio of the left slider position compare to the whole overview grid.
|
106
|
+
// It should be a number between 0 and 1.
|
107
|
+
windowLeftRatio(): number {
|
108
|
+
return this.window.windowLeftRatio || 0;
|
106
109
|
}
|
107
110
|
|
108
|
-
|
109
|
-
|
111
|
+
// The ratio of the right slider position compare to the whole overview grid.
|
112
|
+
// It should be a number between 0 and 1.
|
113
|
+
windowRightRatio(): number {
|
114
|
+
return this.window.windowRightRatio || 0;
|
110
115
|
}
|
111
116
|
|
112
|
-
|
113
|
-
|
117
|
+
/**
|
118
|
+
* This function will return the raw value of the slider window.
|
119
|
+
* Since the OverviewGrid is used in Performance panel or Memory panel, the raw value can be in milliseconds or bytes.
|
120
|
+
*
|
121
|
+
* @returns the pair of start/end value of the slider window in milliseconds or bytes
|
122
|
+
*/
|
123
|
+
calculateWindowValue(): {rawStartValue: number, rawEndValue: number} {
|
124
|
+
return this.window.calculateWindowValue();
|
125
|
+
}
|
126
|
+
|
127
|
+
setWindowRatio(leftRatio: number, rightRatio: number): void {
|
128
|
+
this.window.setWindowRatio(leftRatio, rightRatio);
|
114
129
|
}
|
115
130
|
|
116
131
|
addEventListener<T extends keyof EventTypes>(
|
@@ -128,14 +143,14 @@ export class OverviewGrid {
|
|
128
143
|
}
|
129
144
|
|
130
145
|
setResizeEnabled(enabled: boolean): void {
|
131
|
-
this.window.
|
146
|
+
this.window.setResizeEnabled(enabled);
|
132
147
|
}
|
133
148
|
}
|
134
149
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
150
|
+
const MinSelectableSize = 14;
|
151
|
+
const WindowScrollSpeedFactor = .3;
|
152
|
+
const ResizerOffset = 5;
|
153
|
+
const OffsetFromWindowEnds = 10;
|
139
154
|
|
140
155
|
export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
141
156
|
private parentElement: Element;
|
@@ -151,12 +166,16 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
151
166
|
|
152
167
|
private overviewWindowSelector!: WindowSelector|undefined;
|
153
168
|
private offsetLeft!: number;
|
154
|
-
private
|
155
|
-
private
|
156
|
-
private
|
157
|
-
|
158
|
-
|
159
|
-
|
169
|
+
private dragStartPointPixel!: number;
|
170
|
+
private dragStartLeftRatio!: number;
|
171
|
+
private dragStartRightRatio!: number;
|
172
|
+
|
173
|
+
// The ratio of the left/right resizer position compare to the whole overview grid.
|
174
|
+
// They should be a number between 0 and 1.
|
175
|
+
windowLeftRatio = 0;
|
176
|
+
windowRightRatio = 1;
|
177
|
+
|
178
|
+
private resizeEnabled?: boolean;
|
160
179
|
private clickHandler?: ((arg0: Event) => boolean)|null;
|
161
180
|
private resizerParentOffsetLeft?: number;
|
162
181
|
#breadcrumbsEnabled: boolean = false;
|
@@ -248,7 +267,7 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
248
267
|
return;
|
249
268
|
}
|
250
269
|
element.addEventListener('mouseover', () => {
|
251
|
-
if (
|
270
|
+
if (this.windowLeftRatio <= 0 && this.windowRightRatio >= 1) {
|
252
271
|
this.breadcrumbButtonContainerElement.classList.toggle('is-breadcrumb-button-visible', false);
|
253
272
|
this.#mouseOverGridOverview = false;
|
254
273
|
} else {
|
@@ -275,16 +294,16 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
275
294
|
}
|
276
295
|
|
277
296
|
reset(): void {
|
278
|
-
this.
|
279
|
-
this.
|
280
|
-
this.
|
297
|
+
this.windowLeftRatio = 0;
|
298
|
+
this.windowRightRatio = 1;
|
299
|
+
this.setResizeEnabled(true);
|
281
300
|
this.updateCurtains();
|
282
301
|
}
|
283
302
|
|
284
|
-
|
285
|
-
this.
|
286
|
-
this.rightResizeElement.tabIndex =
|
287
|
-
this.leftResizeElement.tabIndex =
|
303
|
+
setResizeEnabled(resizeEnabled: boolean): void {
|
304
|
+
this.resizeEnabled = resizeEnabled;
|
305
|
+
this.rightResizeElement.tabIndex = resizeEnabled ? 0 : -1;
|
306
|
+
this.leftResizeElement.tabIndex = resizeEnabled ? 0 : -1;
|
288
307
|
}
|
289
308
|
|
290
309
|
setClickHandler(clickHandler: ((arg0: Event) => boolean)|null): void {
|
@@ -294,7 +313,7 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
294
313
|
private resizerElementStartDragging(event: Event): boolean {
|
295
314
|
const mouseEvent = (event as MouseEvent);
|
296
315
|
const target = (event.target as HTMLElement);
|
297
|
-
if (!this.
|
316
|
+
if (!this.resizeEnabled) {
|
298
317
|
return false;
|
299
318
|
}
|
300
319
|
this.resizerParentOffsetLeft = mouseEvent.pageX - mouseEvent.offsetX - target.offsetLeft;
|
@@ -351,7 +370,7 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
351
370
|
}
|
352
371
|
|
353
372
|
private startWindowSelectorDragging(event: Event): boolean {
|
354
|
-
if (!this.
|
373
|
+
if (!this.resizeEnabled) {
|
355
374
|
return false;
|
356
375
|
}
|
357
376
|
const mouseEvent = (event as MouseEvent);
|
@@ -404,9 +423,9 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
404
423
|
|
405
424
|
private startWindowDragging(event: Event): boolean {
|
406
425
|
const mouseEvent = (event as MouseEvent);
|
407
|
-
this.
|
408
|
-
this.
|
409
|
-
this.
|
426
|
+
this.dragStartPointPixel = mouseEvent.pageX;
|
427
|
+
this.dragStartLeftRatio = this.windowLeftRatio;
|
428
|
+
this.dragStartRightRatio = this.windowRightRatio;
|
410
429
|
event.stopPropagation();
|
411
430
|
return true;
|
412
431
|
}
|
@@ -418,16 +437,16 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
418
437
|
}
|
419
438
|
const mouseEvent = (event as MouseEvent);
|
420
439
|
mouseEvent.preventDefault();
|
421
|
-
let delta: number = (mouseEvent.pageX - this.
|
422
|
-
if (this.
|
423
|
-
delta = -this.
|
440
|
+
let delta: number = (mouseEvent.pageX - this.dragStartPointPixel) / this.parentElement.clientWidth;
|
441
|
+
if (this.dragStartLeftRatio + delta < 0) {
|
442
|
+
delta = -this.dragStartLeftRatio;
|
424
443
|
}
|
425
444
|
|
426
|
-
if (this.
|
427
|
-
delta = 1 - this.
|
445
|
+
if (this.dragStartRightRatio + delta > 1) {
|
446
|
+
delta = 1 - this.dragStartRightRatio;
|
428
447
|
}
|
429
448
|
|
430
|
-
this.
|
449
|
+
this.setWindowRatio(this.dragStartLeftRatio + delta, this.dragStartRightRatio + delta);
|
431
450
|
}
|
432
451
|
|
433
452
|
private resizeWindowLeft(start: number): void {
|
@@ -456,6 +475,12 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
456
475
|
this.setWindowPosition(0, this.parentElement.clientWidth);
|
457
476
|
}
|
458
477
|
|
478
|
+
/**
|
479
|
+
* This function will return the raw value of the give slider.
|
480
|
+
* Since the OverviewGrid is used in Performance panel or Memory panel, the raw value can be in milliseconds or bytes.
|
481
|
+
* @param leftSlider if this slider is the left one
|
482
|
+
* @returns the value in milliseconds or bytes
|
483
|
+
*/
|
459
484
|
private getRawSliderValue(leftSlider?: boolean): number {
|
460
485
|
if (!this.calculator) {
|
461
486
|
throw new Error('No calculator to calculate boundaries');
|
@@ -464,14 +489,14 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
464
489
|
const minimumValue = this.calculator.minimumBoundary();
|
465
490
|
const valueSpan = this.calculator.maximumBoundary() - minimumValue;
|
466
491
|
if (leftSlider) {
|
467
|
-
return minimumValue + valueSpan *
|
492
|
+
return minimumValue + valueSpan * this.windowLeftRatio;
|
468
493
|
}
|
469
|
-
return minimumValue + valueSpan *
|
494
|
+
return minimumValue + valueSpan * this.windowRightRatio;
|
470
495
|
}
|
471
496
|
|
472
|
-
private
|
473
|
-
const roundedLeftValue =
|
474
|
-
const roundedRightValue =
|
497
|
+
private updateResizeElementAriaValue(leftPercentValue: number, rightPercentValue: number): void {
|
498
|
+
const roundedLeftValue = leftPercentValue.toFixed(2);
|
499
|
+
const roundedRightValue = rightPercentValue.toFixed(2);
|
475
500
|
UI.ARIAUtils.setAriaValueNow(this.leftResizeElement, roundedLeftValue);
|
476
501
|
UI.ARIAUtils.setAriaValueNow(this.rightResizeElement, roundedRightValue);
|
477
502
|
|
@@ -486,10 +511,8 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
486
511
|
if (!this.calculator) {
|
487
512
|
return;
|
488
513
|
}
|
489
|
-
const startValue =
|
490
|
-
|
491
|
-
const endValue =
|
492
|
-
this.calculator.formatValue(Trace.Types.Timing.MilliSeconds(this.getRawSliderValue(/* leftSlider */ false)));
|
514
|
+
const startValue = this.calculator.formatValue(this.getRawSliderValue(/* leftSlider */ true));
|
515
|
+
const endValue = this.calculator.formatValue(this.getRawSliderValue(/* leftSlider */ false));
|
493
516
|
UI.ARIAUtils.setAriaValueText(this.leftResizeElement, String(startValue));
|
494
517
|
UI.ARIAUtils.setAriaValueText(this.rightResizeElement, String(endValue));
|
495
518
|
}
|
@@ -499,34 +522,40 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
499
522
|
UI.ARIAUtils.setAriaValueText(this.rightResizeElement, rightValue);
|
500
523
|
}
|
501
524
|
|
502
|
-
|
525
|
+
/**
|
526
|
+
* This function will return the raw value of the slider window.
|
527
|
+
* Since the OverviewGrid is used in Performance panel or Memory panel, the raw value can be in milliseconds or bytes.
|
528
|
+
*
|
529
|
+
* @returns the pair of start/end value of the slider window in milliseconds or bytes
|
530
|
+
*/
|
531
|
+
calculateWindowValue(): {
|
503
532
|
rawStartValue: number,
|
504
533
|
rawEndValue: number,
|
505
534
|
} {
|
506
535
|
return {
|
507
|
-
rawStartValue:
|
508
|
-
rawEndValue:
|
536
|
+
rawStartValue: this.getRawSliderValue(/* leftSlider */ true),
|
537
|
+
rawEndValue: this.getRawSliderValue(/* leftSlider */ false),
|
509
538
|
};
|
510
539
|
}
|
511
540
|
|
512
|
-
|
513
|
-
this.
|
514
|
-
this.
|
541
|
+
setWindowRatio(windowLeftRatio: number, windowRightRatio: number): void {
|
542
|
+
this.windowLeftRatio = windowLeftRatio;
|
543
|
+
this.windowRightRatio = windowRightRatio;
|
515
544
|
this.updateCurtains();
|
516
545
|
if (this.calculator) {
|
517
|
-
this.dispatchEventToListeners(Events.WINDOW_CHANGED_WITH_POSITION, this.
|
546
|
+
this.dispatchEventToListeners(Events.WINDOW_CHANGED_WITH_POSITION, this.calculateWindowValue());
|
518
547
|
}
|
519
548
|
this.dispatchEventToListeners(Events.WINDOW_CHANGED);
|
520
|
-
this.#changeBreadcrumbButtonVisibility(
|
549
|
+
this.#changeBreadcrumbButtonVisibility(windowLeftRatio, windowRightRatio);
|
521
550
|
}
|
522
551
|
|
523
552
|
// "Create breadcrumb" button is only visible when the window is set to
|
524
553
|
// something other than the full range and mouse is hovering over the MiniMap
|
525
|
-
#changeBreadcrumbButtonVisibility(
|
554
|
+
#changeBreadcrumbButtonVisibility(windowLeftRatio: number, windowRightRatio: number): void {
|
526
555
|
if (!this.#breadcrumbsEnabled) {
|
527
556
|
return;
|
528
557
|
}
|
529
|
-
if ((
|
558
|
+
if ((windowRightRatio >= 1 && windowLeftRatio <= 0) || !this.#mouseOverGridOverview) {
|
530
559
|
this.breadcrumbButtonContainerElement.classList.toggle('is-breadcrumb-button-visible', false);
|
531
560
|
} else {
|
532
561
|
this.breadcrumbButtonContainerElement.classList.toggle('is-breadcrumb-button-visible', true);
|
@@ -534,30 +563,30 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
534
563
|
}
|
535
564
|
|
536
565
|
#createBreadcrumb(): void {
|
537
|
-
this.dispatchEventToListeners(Events.BREADCRUMB_ADDED, this.
|
566
|
+
this.dispatchEventToListeners(Events.BREADCRUMB_ADDED, this.calculateWindowValue());
|
538
567
|
}
|
539
568
|
|
540
569
|
private updateCurtains(): void {
|
541
|
-
const
|
542
|
-
const
|
543
|
-
let
|
544
|
-
let
|
545
|
-
const
|
570
|
+
const windowLeftRatio = this.windowLeftRatio;
|
571
|
+
const windowRightRatio = this.windowRightRatio;
|
572
|
+
let leftRatio = windowLeftRatio;
|
573
|
+
let rightRatio = windowRightRatio;
|
574
|
+
const widthRatio = rightRatio - leftRatio;
|
546
575
|
|
547
576
|
// OverviewGrids that are instantiated before the parentElement is shown will have a parent element client width of 0 which throws off the 'factor' calculation
|
548
577
|
if (this.parentElement.clientWidth !== 0) {
|
549
578
|
// We allow actual time window to be arbitrarily small but don't want the UI window to be too small.
|
550
|
-
const widthInPixels =
|
579
|
+
const widthInPixels = widthRatio * this.parentElement.clientWidth;
|
551
580
|
const minWidthInPixels = MinSelectableSize / 2;
|
552
581
|
if (widthInPixels < minWidthInPixels) {
|
553
582
|
const factor = minWidthInPixels / widthInPixels;
|
554
|
-
|
555
|
-
|
583
|
+
leftRatio = ((windowRightRatio + windowLeftRatio) - widthRatio * factor) / 2;
|
584
|
+
rightRatio = ((windowRightRatio + windowLeftRatio) + widthRatio * factor) / 2;
|
556
585
|
}
|
557
586
|
}
|
558
|
-
const leftResizerPercLeftOffset = (100 *
|
559
|
-
const rightResizerPercLeftOffset = (100 *
|
560
|
-
const rightResizerPercRightOffset = (100 - (100 *
|
587
|
+
const leftResizerPercLeftOffset = (100 * leftRatio);
|
588
|
+
const rightResizerPercLeftOffset = (100 * rightRatio);
|
589
|
+
const rightResizerPercRightOffset = (100 - (100 * rightRatio));
|
561
590
|
|
562
591
|
const leftResizerPercLeftOffsetString = leftResizerPercLeftOffset + '%';
|
563
592
|
const rightResizerPercLeftOffsetString = rightResizerPercLeftOffset + '%';
|
@@ -577,17 +606,17 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
577
606
|
this.curtainsRange.textContent = this.getWindowRange().toFixed(0) + ' ms';
|
578
607
|
}
|
579
608
|
|
580
|
-
this.
|
609
|
+
this.updateResizeElementAriaValue(leftResizerPercLeftOffset, rightResizerPercLeftOffset);
|
581
610
|
if (this.calculator) {
|
582
611
|
this.updateResizeElementPositionLabels();
|
583
612
|
} else {
|
584
613
|
this.updateResizeElementPercentageLabels(leftResizerPercLeftOffsetString, rightResizerPercLeftOffsetString);
|
585
614
|
}
|
586
615
|
|
587
|
-
this.
|
616
|
+
this.toggleBreadcrumbZoomButtonDisplay();
|
588
617
|
}
|
589
618
|
|
590
|
-
private
|
619
|
+
private toggleBreadcrumbZoomButtonDisplay(): void {
|
591
620
|
if (this.breadcrumbZoomIcon) {
|
592
621
|
// disable button that creates breadcrumbs and hide the zoom icon
|
593
622
|
// when the selected window is smaller than 4.5 ms
|
@@ -607,21 +636,21 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
607
636
|
throw new Error('No calculator to calculate window range');
|
608
637
|
}
|
609
638
|
|
610
|
-
const
|
611
|
-
const
|
612
|
-
return (this.calculator.boundarySpan() * (
|
639
|
+
const leftRatio = this.windowLeftRatio > 0 ? this.windowLeftRatio : 0;
|
640
|
+
const rightRatio = this.windowRightRatio < 1 ? this.windowRightRatio : 1;
|
641
|
+
return (this.calculator.boundarySpan() * (rightRatio - leftRatio));
|
613
642
|
}
|
614
643
|
|
615
|
-
private setWindowPosition(
|
644
|
+
private setWindowPosition(startPixel: number|null, endPixel: number|null): void {
|
616
645
|
const clientWidth = this.parentElement.clientWidth;
|
617
|
-
const windowLeft = typeof
|
618
|
-
const windowRight = typeof
|
619
|
-
this.
|
646
|
+
const windowLeft = typeof startPixel === 'number' ? startPixel / clientWidth : this.windowLeftRatio;
|
647
|
+
const windowRight = typeof endPixel === 'number' ? endPixel / clientWidth : this.windowRightRatio;
|
648
|
+
this.setWindowRatio(windowLeft || 0, windowRight || 0);
|
620
649
|
}
|
621
650
|
|
622
651
|
private onMouseWheel(event: Event): void {
|
623
652
|
const wheelEvent = (event as WheelEvent);
|
624
|
-
if (!this.
|
653
|
+
if (!this.resizeEnabled) {
|
625
654
|
return;
|
626
655
|
}
|
627
656
|
if (wheelEvent.deltaY) {
|
@@ -633,38 +662,38 @@ export class Window extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
633
662
|
}
|
634
663
|
if (wheelEvent.deltaX) {
|
635
664
|
let offset = Math.round(wheelEvent.deltaX * WindowScrollSpeedFactor);
|
636
|
-
const
|
637
|
-
const
|
665
|
+
const windowLeftPixel = this.leftResizeElement.offsetLeft + ResizerOffset;
|
666
|
+
const windowRightPixel = this.rightResizeElement.offsetLeft + ResizerOffset;
|
638
667
|
|
639
|
-
if (
|
640
|
-
offset =
|
668
|
+
if (windowLeftPixel - offset < 0) {
|
669
|
+
offset = windowLeftPixel;
|
641
670
|
}
|
642
671
|
|
643
|
-
if (
|
644
|
-
offset =
|
672
|
+
if (windowRightPixel - offset > this.parentElement.clientWidth) {
|
673
|
+
offset = windowRightPixel - this.parentElement.clientWidth;
|
645
674
|
}
|
646
675
|
|
647
|
-
this.setWindowPosition(
|
676
|
+
this.setWindowPosition(windowLeftPixel - offset, windowRightPixel - offset);
|
648
677
|
|
649
678
|
wheelEvent.preventDefault();
|
650
679
|
}
|
651
680
|
}
|
652
681
|
|
653
682
|
zoom(factor: number, reference: number): void {
|
654
|
-
let
|
655
|
-
let
|
656
|
-
const
|
657
|
-
let
|
658
|
-
if (
|
659
|
-
|
660
|
-
factor =
|
661
|
-
}
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
this.
|
683
|
+
let leftRatio: number = this.windowLeftRatio || 0;
|
684
|
+
let rightRatio: number = this.windowRightRatio || 0;
|
685
|
+
const windowSizeRatio = rightRatio - leftRatio;
|
686
|
+
let newWindowSizeRatio: 1|number = factor * windowSizeRatio;
|
687
|
+
if (newWindowSizeRatio > 1) {
|
688
|
+
newWindowSizeRatio = 1;
|
689
|
+
factor = newWindowSizeRatio / windowSizeRatio;
|
690
|
+
}
|
691
|
+
leftRatio = reference + (leftRatio - reference) * factor;
|
692
|
+
leftRatio = Platform.NumberUtilities.clamp(leftRatio, 0, 1 - newWindowSizeRatio);
|
693
|
+
|
694
|
+
rightRatio = reference + (rightRatio - reference) * factor;
|
695
|
+
rightRatio = Platform.NumberUtilities.clamp(rightRatio, newWindowSizeRatio, 1);
|
696
|
+
this.setWindowRatio(leftRatio, rightRatio);
|
668
697
|
}
|
669
698
|
}
|
670
699
|
|
@@ -275,9 +275,11 @@ export class TimelineGrid {
|
|
275
275
|
}
|
276
276
|
}
|
277
277
|
|
278
|
+
// The TimelineGrid is used in the Performance panel and Memory panel -> Allocating sampling, so the value can be either
|
279
|
+
// milliseconds or bytes
|
278
280
|
export interface Calculator {
|
279
|
-
computePosition(
|
280
|
-
formatValue(
|
281
|
+
computePosition(value: number): number;
|
282
|
+
formatValue(value: number, precision?: number): string;
|
281
283
|
minimumBoundary(): number;
|
282
284
|
zeroTime(): number;
|
283
285
|
maximumBoundary(): number;
|
@@ -23,14 +23,14 @@ describeWithLocale('TimelineOverviewCalculator', () => {
|
|
23
23
|
calculator.setDisplayWidth(200);
|
24
24
|
calculator.setBounds(MilliSeconds(0), MilliSeconds(100));
|
25
25
|
|
26
|
-
assert.strictEqual(calculator.positionToTime(100), 50);
|
26
|
+
assert.strictEqual(calculator.positionToTime(100), MilliSeconds(50));
|
27
27
|
});
|
28
28
|
|
29
29
|
it('formats time values', async () => {
|
30
30
|
const calculator = new PerfUI.TimelineOverviewCalculator.TimelineOverviewCalculator();
|
31
31
|
calculator.setDisplayWidth(200);
|
32
32
|
calculator.setBounds(MilliSeconds(0), MilliSeconds(100));
|
33
|
-
const result = calculator.formatValue(55.234);
|
33
|
+
const result = calculator.formatValue(MilliSeconds(55.234));
|
34
34
|
assert.deepEqual(result, '55\u00A0ms');
|
35
35
|
});
|
36
36
|
|
@@ -38,7 +38,7 @@ describeWithLocale('TimelineOverviewCalculator', () => {
|
|
38
38
|
const calculator = new PerfUI.TimelineOverviewCalculator.TimelineOverviewCalculator();
|
39
39
|
calculator.setDisplayWidth(200);
|
40
40
|
calculator.setBounds(MilliSeconds(0), MilliSeconds(100));
|
41
|
-
const result = calculator.formatValue(55.234, 2);
|
41
|
+
const result = calculator.formatValue(MilliSeconds(55.234), 2);
|
42
42
|
assert.deepEqual(result, '55.23\u00A0ms');
|
43
43
|
});
|
44
44
|
|
@@ -49,10 +49,15 @@ describeWithLocale('TimelineOverviewCalculator', () => {
|
|
49
49
|
const fakeNavStart = {
|
50
50
|
// Trace Engine events are in microseconds
|
51
51
|
ts: 100_000,
|
52
|
+
args: {
|
53
|
+
data: {
|
54
|
+
documentLoaderURL: 'https://example.com',
|
55
|
+
},
|
56
|
+
},
|
52
57
|
} as unknown as Trace.Types.Events.NavigationStart;
|
53
58
|
calculator.setNavStartTimes([fakeNavStart]);
|
54
59
|
// There is a navigation at 100ms, so this time gets changed to 5ms
|
55
|
-
const result = calculator.formatValue(105);
|
60
|
+
const result = calculator.formatValue(MilliSeconds(105));
|
56
61
|
assert.deepEqual(result, '5\u00A0ms');
|
57
62
|
});
|
58
63
|
|
@@ -17,8 +17,8 @@ export class TimelineOverviewCalculator implements Calculator {
|
|
17
17
|
return (time - this.#minimumBoundary) / this.boundarySpan() * this.workingArea;
|
18
18
|
}
|
19
19
|
|
20
|
-
positionToTime(position: number):
|
21
|
-
return position / this.workingArea * this.boundarySpan() + this.#minimumBoundary;
|
20
|
+
positionToTime(position: number): Trace.Types.Timing.MilliSeconds {
|
21
|
+
return Trace.Types.Timing.MilliSeconds(position / this.workingArea * this.boundarySpan() + this.#minimumBoundary);
|
22
22
|
}
|
23
23
|
|
24
24
|
setBounds(minimumBoundary: Trace.Types.Timing.MilliSeconds, maximumBoundary: Trace.Types.Timing.MilliSeconds): void {
|
@@ -41,7 +41,7 @@ export class TimelineOverviewCalculator implements Calculator {
|
|
41
41
|
);
|
42
42
|
}
|
43
43
|
|
44
|
-
formatValue(
|
44
|
+
formatValue(time: Trace.Types.Timing.MilliSeconds, precision?: number): string {
|
45
45
|
// If there are nav start times the value needs to be remapped.
|
46
46
|
if (this.navStartTimes) {
|
47
47
|
// Find the latest possible nav start time which is considered earlier
|
@@ -51,14 +51,14 @@ export class TimelineOverviewCalculator implements Calculator {
|
|
51
51
|
this.navStartTimes[i].ts,
|
52
52
|
);
|
53
53
|
|
54
|
-
if (
|
55
|
-
|
54
|
+
if (time > startTimeMilliseconds) {
|
55
|
+
time = Trace.Types.Timing.MilliSeconds(time - (startTimeMilliseconds - this.zeroTime()));
|
56
56
|
break;
|
57
57
|
}
|
58
58
|
}
|
59
59
|
}
|
60
60
|
|
61
|
-
return i18n.TimeUtilities.preciseMillisToString(
|
61
|
+
return i18n.TimeUtilities.preciseMillisToString(time - this.zeroTime(), precision);
|
62
62
|
}
|
63
63
|
|
64
64
|
maximumBoundary(): Trace.Types.Timing.MilliSeconds {
|
@@ -108,6 +108,19 @@ export class TimelineOverviewPane extends Common.ObjectWrapper.eventMixin<EventT
|
|
108
108
|
this.cursorPosition = mouseEvent.offsetX + offsetLeftRelativeToCursorArea;
|
109
109
|
this.cursorElement.style.left = this.cursorPosition + 'px';
|
110
110
|
this.cursorElement.style.visibility = 'visible';
|
111
|
+
|
112
|
+
// Dispatch an event to notify the flame chart to show a timestamp marker for the current timestamp if it's visible
|
113
|
+
// in the flame chart.
|
114
|
+
const timeInMilliSeconds = this.overviewCalculator.positionToTime(this.cursorPosition);
|
115
|
+
const timeWindow = this.overviewGrid.calculateWindowValue();
|
116
|
+
if (Trace.Types.Timing.MilliSeconds(timeWindow.rawStartValue) <= timeInMilliSeconds &&
|
117
|
+
timeInMilliSeconds <= Trace.Types.Timing.MilliSeconds(timeWindow.rawEndValue)) {
|
118
|
+
const timeInMicroSeconds = Trace.Helpers.Timing.millisecondsToMicroseconds(timeInMilliSeconds);
|
119
|
+
this.dispatchEventToListeners(Events.OVERVIEW_PANE_MOUSE_MOVE, {timeInMicroSeconds});
|
120
|
+
} else {
|
121
|
+
this.dispatchEventToListeners(Events.OVERVIEW_PANE_MOUSE_LEAVE);
|
122
|
+
}
|
123
|
+
|
111
124
|
void this.overviewInfo.setContent(this.buildOverviewInfo());
|
112
125
|
}
|
113
126
|
|
@@ -123,6 +136,7 @@ export class TimelineOverviewPane extends Common.ObjectWrapper.eventMixin<EventT
|
|
123
136
|
|
124
137
|
private hideCursor(): void {
|
125
138
|
this.cursorElement.style.visibility = 'hidden';
|
139
|
+
this.dispatchEventToListeners(Events.OVERVIEW_PANE_MOUSE_LEAVE);
|
126
140
|
this.overviewInfo.hide();
|
127
141
|
}
|
128
142
|
|
@@ -290,7 +304,7 @@ export class TimelineOverviewPane extends Common.ObjectWrapper.eventMixin<EventT
|
|
290
304
|
const left = haveRecords && this.windowStartTime ? Math.min((this.windowStartTime - absoluteMin) / timeSpan, 1) : 0;
|
291
305
|
const right = haveRecords && this.windowEndTime < Infinity ? (this.windowEndTime - absoluteMin) / timeSpan : 1;
|
292
306
|
this.muteOnWindowChanged = true;
|
293
|
-
this.overviewGrid.
|
307
|
+
this.overviewGrid.setWindowRatio(left, right);
|
294
308
|
this.muteOnWindowChanged = false;
|
295
309
|
}
|
296
310
|
|
@@ -351,7 +365,8 @@ export class TimelineOverviewPane extends Common.ObjectWrapper.eventMixin<EventT
|
|
351
365
|
export const enum Events {
|
352
366
|
OVERVIEW_PANE_WINDOW_CHANGED = 'OverviewPaneWindowChanged',
|
353
367
|
OVERVIEW_PANE_BREADCRUMB_ADDED = 'OverviewPaneBreadcrumbAdded',
|
354
|
-
|
368
|
+
OVERVIEW_PANE_MOUSE_MOVE = 'OverviewPaneMouseMove',
|
369
|
+
OVERVIEW_PANE_MOUSE_LEAVE = 'OverviewPaneMouseLeave',
|
355
370
|
}
|
356
371
|
|
357
372
|
export interface OverviewPaneWindowChangedEvent {
|
@@ -364,12 +379,15 @@ export interface OverviewPaneBreadcrumbAddedEvent {
|
|
364
379
|
endTime: Trace.Types.Timing.MilliSeconds;
|
365
380
|
}
|
366
381
|
|
367
|
-
export interface
|
382
|
+
export interface OverviewPaneMouseMoveEvent {
|
383
|
+
timeInMicroSeconds: Trace.Types.Timing.MicroSeconds;
|
384
|
+
}
|
368
385
|
|
369
386
|
export type EventTypes = {
|
370
387
|
[Events.OVERVIEW_PANE_WINDOW_CHANGED]: OverviewPaneWindowChangedEvent,
|
371
388
|
[Events.OVERVIEW_PANE_BREADCRUMB_ADDED]: OverviewPaneBreadcrumbAddedEvent,
|
372
|
-
[Events.
|
389
|
+
[Events.OVERVIEW_PANE_MOUSE_MOVE]: OverviewPaneMouseMoveEvent,
|
390
|
+
[Events.OVERVIEW_PANE_MOUSE_LEAVE]: void,
|
373
391
|
};
|
374
392
|
|
375
393
|
export interface TimelineOverview {
|
@@ -7,12 +7,10 @@
|
|
7
7
|
.flame-chart-main-pane {
|
8
8
|
overflow: hidden;
|
9
9
|
|
10
|
-
--selected-group-background: hsl(215deg 85% 98%);
|
11
10
|
--selected-group-border: hsl(216deg 68% 54%);
|
12
11
|
}
|
13
12
|
|
14
13
|
:host-context(.theme-with-dark-background) .flame-chart-main-pane {
|
15
|
-
--selected-group-background: hsl(215deg 85% 15%);
|
16
14
|
--selected-group-border: hsl(216deg 68% 46%);
|
17
15
|
}
|
18
16
|
|