chrome-devtools-frontend 1.0.1550444 → 1.0.1553956
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/styleguide/ux/components.md +34 -8
- package/eslint.config.mjs +7 -0
- package/front_end/Images/generate-css-vars.js +8 -4
- package/front_end/core/common/Settings.ts +20 -8
- package/front_end/core/host/UserMetrics.ts +3 -1
- package/front_end/core/i18n/collect-ui-strings.js +19 -10
- package/front_end/core/i18n/generate-locales-js.js +4 -4
- package/front_end/core/protocol_client/CDPConnection.ts +1 -0
- package/front_end/core/protocol_client/InspectorBackend.ts +5 -1
- package/front_end/core/root/Runtime.ts +0 -12
- package/front_end/core/sdk/DOMModel.ts +38 -3
- package/front_end/core/sdk/DebuggerModel.ts +9 -4
- package/front_end/core/sdk/IsolateManager.ts +7 -0
- package/front_end/core/sdk/PageResourceLoader.ts +3 -3
- package/front_end/core/sdk/RehydratingConnection.ts +5 -2
- package/front_end/entrypoints/main/MainImpl.ts +28 -10
- package/front_end/generated/SupportedCSSProperties.js +14 -0
- package/front_end/models/ai_assistance/AiConversation.ts +94 -4
- package/front_end/models/ai_assistance/agents/AiAgent.ts +30 -15
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +179 -41
- package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +5 -0
- package/front_end/models/ai_assistance/agents/StylingAgent.ts +62 -0
- package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +2 -1
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +1 -7
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +124 -12
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +125 -30
- package/front_end/models/ai_assistance/performance/AICallTree.ts +42 -0
- package/front_end/models/ai_code_generation/AiCodeGeneration.ts +12 -0
- package/front_end/models/issues_manager/Issue.ts +1 -0
- package/front_end/models/issues_manager/IssueAggregator.ts +9 -0
- package/front_end/models/issues_manager/IssuesManager.ts +5 -0
- package/front_end/models/issues_manager/PermissionElementIssue.ts +262 -0
- package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabled.md +7 -0
- package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluder.md +9 -0
- package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluderParent.md +9 -0
- package/front_end/models/issues_manager/descriptions/permissionElementCspFrameAncestorsMissing.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementFencedFrameDisallowed.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooLarge.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooSmall.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementGeolocationDeprecated.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementInsetBoxShadowUnsupported.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementInvalidDisplayStyle.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementInvalidSizeValue.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementInvalidType.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementInvalidTypeActivation.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementLowContrast.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementNonOpaqueColor.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementPaddingBottomUnsupported.md +6 -0
- package/front_end/models/issues_manager/descriptions/permissionElementPaddingRightUnsupported.md +6 -0
- package/front_end/models/issues_manager/descriptions/permissionElementPermissionsPolicyBlocked.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementRegistrationFailed.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementRequestInProgress.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementSecurityChecksFailed.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementTypeNotSupported.md +5 -0
- package/front_end/models/issues_manager/descriptions/permissionElementUntrustedEvent.md +7 -0
- package/front_end/models/issues_manager/issues_manager.ts +2 -0
- package/front_end/models/javascript_metadata/NativeFunctions.js +8 -0
- package/front_end/models/stack_trace/StackTraceModel.ts +37 -18
- package/front_end/models/trace/Processor.ts +14 -15
- package/front_end/models/trace/insights/Common.ts +2 -8
- package/front_end/models/trace/insights/types.ts +12 -2
- package/front_end/models/trace/types/TraceEvents.ts +4 -1
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +28 -6
- package/front_end/panels/ai_assistance/ai_assistance-meta.ts +9 -23
- package/front_end/panels/ai_assistance/ai_assistance.ts +1 -0
- package/front_end/panels/ai_assistance/components/ChatView.ts +78 -2
- package/front_end/panels/ai_assistance/components/CollapsibleAssistanceContentWidget.ts +71 -0
- package/front_end/panels/ai_assistance/components/PerformanceAgentFlameChart.ts +126 -0
- package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +131 -2
- package/front_end/panels/ai_assistance/components/chatView.css +28 -0
- package/front_end/panels/ai_assistance/components/collapsibleAssistanceContentWidget.css +33 -0
- package/front_end/panels/application/AppManifestView.ts +1007 -521
- package/front_end/panels/application/ApplicationPanelSidebar.ts +1 -17
- package/front_end/panels/application/ExtensionStorageItemsView.ts +3 -5
- package/front_end/panels/application/KeyValueStorageItemsView.ts +3 -2
- package/front_end/panels/application/components/BackForwardCacheView.ts +2 -2
- package/front_end/panels/application/preloading/PreloadingView.ts +46 -45
- package/front_end/panels/application/preloading/components/MismatchedPreloadingGrid.ts +80 -75
- package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +169 -133
- package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +74 -93
- package/front_end/panels/application/preloading/components/RuleSetGrid.ts +142 -117
- package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +51 -11
- package/front_end/panels/application/preloading/components/components.ts +0 -2
- package/front_end/panels/common/Annotation.ts +184 -0
- package/front_end/panels/common/AnnotationManager.ts +148 -11
- package/front_end/panels/common/ExtensionView.ts +47 -0
- package/front_end/panels/common/PersistenceUtils.ts +22 -25
- package/front_end/panels/common/annotation.css +40 -0
- package/front_end/panels/common/common.ts +1 -0
- package/front_end/panels/console/ConsoleInsightTeaser.ts +187 -5
- package/front_end/panels/console/ConsolePinPane.ts +437 -217
- package/front_end/panels/console/ConsolePrompt.ts +32 -223
- package/front_end/panels/console/ConsoleView.ts +67 -66
- package/front_end/panels/console/ConsoleViewMessage.ts +8 -3
- package/front_end/panels/console/consoleInsightTeaser.css +23 -0
- package/front_end/panels/console/consoleView.css +1 -1
- package/front_end/panels/elements/AdoptedStyleSheetTreeElement.ts +89 -0
- package/front_end/panels/elements/ColorSwatchPopoverIcon.ts +2 -2
- package/front_end/panels/elements/ComputedStyleWidget.ts +16 -5
- package/front_end/panels/elements/ElementsPanel.ts +38 -12
- package/front_end/panels/elements/ElementsSidebarPane.ts +1 -3
- package/front_end/panels/elements/ElementsTreeElement.ts +313 -353
- package/front_end/panels/elements/ElementsTreeOutline.ts +39 -13
- package/front_end/panels/elements/StylePropertyTreeElement.ts +15 -14
- package/front_end/panels/elements/StylesSidebarPane.ts +1 -1
- package/front_end/panels/emulation/MediaQueryInspector.ts +171 -125
- package/front_end/panels/explain/components/ConsoleInsight.ts +175 -150
- package/front_end/panels/explain/components/consoleInsight.css +348 -347
- package/front_end/panels/issues/AffectedPermissionElementsView.ts +46 -0
- package/front_end/panels/issues/IssueView.ts +2 -0
- package/front_end/panels/issues/IssuesPane.ts +6 -0
- package/front_end/panels/layer_viewer/LayerDetailsView.ts +165 -149
- package/front_end/panels/layer_viewer/Layers3DView.ts +131 -78
- package/front_end/panels/lighthouse/LighthouseStatusView.ts +149 -100
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +90 -64
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +25 -34
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +60 -44
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +170 -151
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +50 -51
- package/front_end/panels/linear_memory_inspector/components/valueInterpreterDisplay.css +0 -13
- package/front_end/panels/linear_memory_inspector/components/valueInterpreterSettings.css +20 -18
- package/front_end/panels/mobile_throttling/CalibrationController.ts +3 -1
- package/front_end/panels/network/NetworkDataGridNode.ts +14 -6
- package/front_end/panels/network/NetworkItemView.ts +42 -3
- package/front_end/panels/network/NetworkLogView.ts +10 -11
- package/front_end/panels/network/NetworkPanel.ts +63 -1
- package/front_end/panels/network/RequestInitiatorView.ts +146 -113
- package/front_end/panels/network/components/RequestHeaderSection.css +51 -50
- package/front_end/panels/network/components/RequestHeaderSection.ts +81 -71
- package/front_end/panels/network/components/RequestHeadersView.css +1 -1
- package/front_end/panels/network/components/RequestHeadersView.ts +26 -11
- package/front_end/panels/network/components/RequestTrustTokensView.css +24 -14
- package/front_end/panels/network/components/RequestTrustTokensView.ts +144 -140
- package/front_end/panels/profiler/IsolateSelector.ts +2 -1
- package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +49 -33
- package/front_end/panels/recorder/RecorderController.ts +2 -3
- package/front_end/panels/recorder/components/ControlButton.ts +68 -34
- package/front_end/panels/recorder/components/CreateRecordingView.ts +9 -6
- package/front_end/panels/recorder/components/RecordingView.ts +81 -88
- package/front_end/panels/recorder/components/ReplaySection.ts +226 -145
- package/front_end/panels/recorder/{controllers → components}/SelectorPicker.ts +129 -52
- package/front_end/panels/recorder/components/StepEditor.ts +21 -67
- package/front_end/panels/recorder/components/StepView.ts +222 -180
- package/front_end/panels/recorder/components/TimelineSection.ts +69 -48
- package/front_end/panels/recorder/components/components.ts +2 -2
- package/front_end/panels/recorder/components/selectorPicker.css +14 -0
- package/front_end/panels/recorder/components/stepEditor.css +0 -5
- package/front_end/panels/recorder/components/stepView.css +196 -198
- package/front_end/panels/recorder/extensions/ExtensionManager.ts +4 -48
- package/front_end/panels/recorder/models/ScreenshotUtils.ts +17 -11
- package/front_end/panels/security/CookieControlsView.ts +9 -16
- package/front_end/panels/settings/components/SyncSection.ts +0 -1
- package/front_end/panels/sources/CSSPlugin.ts +3 -3
- package/front_end/panels/sources/CallStackSidebarPane.ts +60 -75
- package/front_end/panels/sources/SourcesPanel.ts +1 -11
- package/front_end/panels/sources/TabbedEditorContainer.ts +11 -8
- package/front_end/panels/sources/ThreadsSidebarPane.ts +96 -101
- package/front_end/panels/sources/threadsSidebarPane.css +6 -5
- package/front_end/panels/timeline/InteractionsTrackAppender.ts +2 -3
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +23 -33
- package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +4 -3
- package/front_end/panels/timeline/TimelineFlameChartView.ts +12 -0
- package/front_end/panels/timeline/TimelinePanel.ts +3 -5
- package/front_end/panels/timeline/components/IgnoreListSetting.ts +164 -142
- package/front_end/panels/timeline/components/InteractionBreakdown.ts +48 -28
- package/front_end/panels/timeline/components/LayoutShiftDetails.ts +18 -23
- package/front_end/panels/timeline/components/NetworkRequestTooltip.ts +98 -73
- package/front_end/panels/timeline/components/SidebarInsightsTab.ts +9 -12
- package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +262 -291
- package/front_end/panels/timeline/components/Utils.ts +25 -0
- package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +210 -146
- package/front_end/panels/timeline/components/insights/CLSCulprits.ts +8 -20
- package/front_end/panels/timeline/components/insights/Cache.ts +0 -9
- package/front_end/panels/timeline/components/insights/DOMSize.ts +11 -33
- package/front_end/panels/timeline/components/insights/DocumentLatency.ts +0 -9
- package/front_end/panels/timeline/components/insights/DuplicatedJavaScript.ts +0 -9
- package/front_end/panels/timeline/components/insights/EventRef.ts +47 -109
- package/front_end/panels/timeline/components/insights/FontDisplay.ts +0 -9
- package/front_end/panels/timeline/components/insights/ForcedReflow.ts +0 -9
- package/front_end/panels/timeline/components/insights/INPBreakdown.ts +0 -9
- package/front_end/panels/timeline/components/insights/ImageDelivery.ts +1 -10
- package/front_end/panels/timeline/components/insights/ImageRef.ts +112 -0
- package/front_end/panels/timeline/components/insights/InsightRenderer.ts +91 -0
- package/front_end/panels/timeline/components/insights/LCPBreakdown.ts +0 -9
- package/front_end/panels/timeline/components/insights/LCPDiscovery.ts +4 -11
- package/front_end/panels/timeline/components/insights/LegacyJavaScript.ts +0 -9
- package/front_end/panels/timeline/components/insights/ModernHTTP.ts +0 -9
- package/front_end/panels/timeline/components/insights/NetworkDependencyTree.ts +6 -21
- package/front_end/panels/timeline/components/insights/NodeLink.ts +68 -43
- package/front_end/panels/timeline/components/insights/README.md +2 -3
- package/front_end/panels/timeline/components/insights/RenderBlocking.ts +0 -9
- package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +0 -9
- package/front_end/panels/timeline/components/insights/ThirdParties.ts +0 -9
- package/front_end/panels/timeline/components/insights/Viewport.ts +7 -19
- package/front_end/panels/timeline/components/insights/baseInsightComponent.css +5 -0
- package/front_end/panels/timeline/components/insights/insights.ts +2 -0
- package/front_end/panels/timeline/components/interactionBreakdown.css +15 -13
- package/front_end/panels/timeline/enable-easter-egg.js +7 -3
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BluetoothEmulation.d.ts +96 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BluetoothEmulation.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BluetoothEmulation.js +8 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BluetoothEmulation.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +87 -0
- 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/DeviceRequestPrompt.d.ts +2 -6
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/DeviceRequestPrompt.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/DeviceRequestPrompt.js +5 -24
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/DeviceRequestPrompt.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +5 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/api.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/api.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/api.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BluetoothEmulation.d.ts +18 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BluetoothEmulation.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BluetoothEmulation.js +42 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BluetoothEmulation.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts +4 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js +10 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/DeviceRequestPrompt.d.ts +27 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/DeviceRequestPrompt.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/DeviceRequestPrompt.js +90 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/DeviceRequestPrompt.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts +3 -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 +3 -2
- 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/Page.d.ts +4 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +5 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts +4 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js +14 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.js +7 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BluetoothEmulation.d.ts +18 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BluetoothEmulation.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BluetoothEmulation.js +30 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BluetoothEmulation.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts +5 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +22 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/CdpSession.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/CdpSession.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/DeviceRequestPrompt.d.ts +2 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/DeviceRequestPrompt.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/DeviceRequestPrompt.js +4 -6
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/DeviceRequestPrompt.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/FrameManager.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/FrameManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/FrameManager.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/FrameManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +2 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +8 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.js +8 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/cdp.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/cdp.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/cdp.js +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/cdp.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js +30 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConnectOptions.d.ts +15 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConnectOptions.d.ts.map +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/node/ChromeLauncher.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js +2 -13
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/LaunchOptions.d.ts +5 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/LaunchOptions.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/LaunchOptions.js +17 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/LaunchOptions.js.map +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/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +221 -4
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +182 -95
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BluetoothEmulation.d.ts +96 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BluetoothEmulation.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BluetoothEmulation.js +7 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BluetoothEmulation.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +87 -0
- 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/DeviceRequestPrompt.d.ts +2 -6
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/DeviceRequestPrompt.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/DeviceRequestPrompt.js +4 -22
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/DeviceRequestPrompt.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +5 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/api.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/api.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/api.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BluetoothEmulation.d.ts +18 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BluetoothEmulation.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BluetoothEmulation.js +38 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BluetoothEmulation.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts +4 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js +10 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/DeviceRequestPrompt.d.ts +27 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/DeviceRequestPrompt.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/DeviceRequestPrompt.js +85 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/DeviceRequestPrompt.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts +3 -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 +3 -2
- 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/Page.d.ts +4 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +5 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts +4 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js +14 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.js +7 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BluetoothEmulation.d.ts +18 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BluetoothEmulation.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BluetoothEmulation.js +26 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BluetoothEmulation.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts +5 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +22 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/CdpSession.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/CdpSession.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/DeviceRequestPrompt.d.ts +2 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/DeviceRequestPrompt.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/DeviceRequestPrompt.js +2 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/DeviceRequestPrompt.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/FrameManager.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/FrameManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/FrameManager.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/FrameManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +2 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +8 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.js +8 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/cdp.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/cdp.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/cdp.js +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/cdp.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js +31 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConnectOptions.d.ts +15 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConnectOptions.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js +2 -13
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/LaunchOptions.d.ts +5 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/LaunchOptions.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/LaunchOptions.js +16 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/LaunchOptions.js.map +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/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/types.d.ts +221 -4
- package/front_end/third_party/puppeteer/package/package.json +4 -4
- package/front_end/third_party/puppeteer/package/src/api/BluetoothEmulation.ts +103 -0
- package/front_end/third_party/puppeteer/package/src/api/Browser.ts +96 -1
- package/front_end/third_party/puppeteer/package/src/api/DeviceRequestPrompt.ts +2 -10
- package/front_end/third_party/puppeteer/package/src/api/Page.ts +6 -0
- package/front_end/third_party/puppeteer/package/src/api/api.ts +1 -0
- package/front_end/third_party/puppeteer/package/src/bidi/BluetoothEmulation.ts +52 -0
- package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +15 -0
- package/front_end/third_party/puppeteer/package/src/bidi/DeviceRequestPrompt.ts +138 -0
- package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +7 -3
- package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +10 -2
- package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +30 -2
- package/front_end/third_party/puppeteer/package/src/bidi/util.ts +8 -0
- package/front_end/third_party/puppeteer/package/src/cdp/Accessibility.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/cdp/BluetoothEmulation.ts +47 -0
- package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +33 -3
- package/front_end/third_party/puppeteer/package/src/cdp/CdpSession.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/cdp/DeviceRequestPrompt.ts +3 -8
- package/front_end/third_party/puppeteer/package/src/cdp/Frame.ts +2 -2
- package/front_end/third_party/puppeteer/package/src/cdp/FrameManager.ts +9 -4
- package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +13 -0
- package/front_end/third_party/puppeteer/package/src/cdp/WebWorker.ts +8 -3
- package/front_end/third_party/puppeteer/package/src/cdp/cdp.ts +1 -0
- package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +45 -1
- package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +20 -0
- package/front_end/third_party/puppeteer/package/src/node/ChromeLauncher.ts +5 -17
- package/front_end/third_party/puppeteer/package/src/node/LaunchOptions.ts +23 -7
- package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +4 -0
- package/front_end/ui/components/annotations/AnnotationRepository.ts +153 -13
- package/front_end/ui/components/snackbars/Snackbars.docs.ts +0 -1
- package/front_end/ui/components/text_editor/AiCodeCompletionTeaserPlaceholder.ts +12 -3
- package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +182 -0
- package/front_end/ui/components/text_editor/text_editor.ts +1 -0
- package/front_end/ui/helpers/OpenInNewTab.ts +5 -1
- package/front_end/ui/i18n/i18n.ts +9 -9
- package/front_end/ui/kit/icons/Icon.docs.ts +22 -65
- package/front_end/ui/kit/kit.ts +1 -0
- package/front_end/ui/kit/link/Link.docs.ts +15 -0
- package/front_end/ui/kit/link/Link.ts +151 -0
- package/front_end/ui/kit/link/link.css +27 -0
- package/front_end/ui/legacy/EmptyWidget.ts +6 -0
- package/front_end/ui/legacy/Floaty.ts +442 -0
- package/front_end/ui/legacy/InspectorView.ts +12 -0
- package/front_end/ui/legacy/ReportView.ts +1 -1
- package/front_end/ui/legacy/SelectMenu.docs.ts +0 -1
- package/front_end/ui/legacy/TabbedPane.ts +131 -53
- package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +1 -1
- package/front_end/ui/legacy/components/inline_editor/ColorSwatch.ts +36 -36
- package/front_end/ui/legacy/components/object_ui/JavaScriptREPL.ts +22 -37
- package/front_end/ui/legacy/components/object_ui/RemoteObjectPreviewFormatter.ts +31 -1
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +2 -2
- package/front_end/ui/legacy/components/utils/Linkifier.ts +7 -11
- package/front_end/ui/legacy/floaty.css +77 -0
- package/front_end/ui/legacy/legacy.ts +2 -0
- package/front_end/ui/visual_logging/KnownContextValues.ts +6 -0
- package/inspector_overlay/loadCSS.rollup.js +5 -4
- package/package.json +2 -2
- package/front_end/panels/application/preloading/components/PreloadingMismatchedHeadersGrid.ts +0 -99
- package/front_end/panels/recorder/components/SelectButton.ts +0 -304
- package/front_end/panels/recorder/controllers/controllers.ts +0 -7
- package/front_end/ui/components/chrome_link/ChromeLink.ts +0 -76
- package/front_end/ui/components/chrome_link/chromeLink.css +0 -12
- package/front_end/ui/components/chrome_link/chrome_link.ts +0 -9
- /package/front_end/panels/recorder/components/{selectButton.css → replaySection.css} +0 -0
|
@@ -300,3 +300,28 @@ export function determineCompareRating(
|
|
|
300
300
|
|
|
301
301
|
return 'similar';
|
|
302
302
|
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Returns true if LCP or INP are worse in the field than what was observed locally.
|
|
306
|
+
*
|
|
307
|
+
* CLS is ignored because the guidance of applying throttling or device emulation doesn't
|
|
308
|
+
* correlate as much with observing a more average user experience.
|
|
309
|
+
*/
|
|
310
|
+
export function isFieldWorseThanLocal(local: {lcp?: Trace.Types.Timing.Milli, inp?: Trace.Types.Timing.Milli}, field: {
|
|
311
|
+
lcp?: Trace.Types.Timing.Milli,
|
|
312
|
+
inp?: Trace.Types.Timing.Milli,
|
|
313
|
+
}): boolean {
|
|
314
|
+
if (local.lcp !== undefined && field.lcp !== undefined) {
|
|
315
|
+
if (determineCompareRating('LCP', local.lcp, field.lcp) === 'better') {
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (local.inp !== undefined && field.inp !== undefined) {
|
|
321
|
+
if (determineCompareRating('LCP', local.inp, field.inp) === 'better') {
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright 2024 The Chromium Authors
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
|
-
/* eslint-disable @devtools/no-
|
|
4
|
+
/* eslint-disable @devtools/no-imperative-dom-api */
|
|
5
5
|
|
|
6
6
|
import '../../../../ui/components/markdown_view/markdown_view.js';
|
|
7
7
|
|
|
@@ -12,7 +12,6 @@ import * as Badges from '../../../../models/badges/badges.js';
|
|
|
12
12
|
import type {InsightModel} from '../../../../models/trace/insights/types.js';
|
|
13
13
|
import type * as Trace from '../../../../models/trace/trace.js';
|
|
14
14
|
import * as Buttons from '../../../../ui/components/buttons/buttons.js';
|
|
15
|
-
import * as ComponentHelpers from '../../../../ui/components/helpers/helpers.js';
|
|
16
15
|
import * as UI from '../../../../ui/legacy/legacy.js';
|
|
17
16
|
import * as Lit from '../../../../ui/lit/lit.js';
|
|
18
17
|
import * as VisualLogging from '../../../../ui/visual_logging/visual_logging.js';
|
|
@@ -66,6 +65,136 @@ const UIStrings = {
|
|
|
66
65
|
const str_ = i18n.i18n.registerUIStrings('panels/timeline/components/insights/BaseInsightComponent.ts', UIStrings);
|
|
67
66
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
68
67
|
|
|
68
|
+
interface ViewInput {
|
|
69
|
+
internalName: string;
|
|
70
|
+
model: InsightModel;
|
|
71
|
+
selected: boolean;
|
|
72
|
+
isAIAssistanceContext: boolean;
|
|
73
|
+
canShowAskAI: boolean;
|
|
74
|
+
estimatedSavingsString: string|null;
|
|
75
|
+
estimatedSavingsAriaLabel: string|null;
|
|
76
|
+
renderContent: () => Lit.LitTemplate;
|
|
77
|
+
dispatchInsightToggle: () => void;
|
|
78
|
+
onHeaderKeyDown: () => void;
|
|
79
|
+
onAskAIButtonClick: () => void;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
type View = (input: ViewInput, output: undefined, target: HTMLElement) => void;
|
|
83
|
+
|
|
84
|
+
const DEFAULT_VIEW: View = (input, output, target) => {
|
|
85
|
+
const {
|
|
86
|
+
internalName,
|
|
87
|
+
model,
|
|
88
|
+
selected,
|
|
89
|
+
estimatedSavingsString,
|
|
90
|
+
estimatedSavingsAriaLabel,
|
|
91
|
+
isAIAssistanceContext,
|
|
92
|
+
canShowAskAI,
|
|
93
|
+
dispatchInsightToggle,
|
|
94
|
+
renderContent,
|
|
95
|
+
onHeaderKeyDown,
|
|
96
|
+
onAskAIButtonClick,
|
|
97
|
+
} = input;
|
|
98
|
+
|
|
99
|
+
const containerClasses = Lit.Directives.classMap({
|
|
100
|
+
insight: true,
|
|
101
|
+
closed: !selected || isAIAssistanceContext,
|
|
102
|
+
'ai-assistance-context': isAIAssistanceContext,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
let ariaLabel = `${i18nString(UIStrings.viewDetails, {PH1: model.title})}`;
|
|
106
|
+
if (estimatedSavingsAriaLabel) {
|
|
107
|
+
// space prefix is deliberate to add a gap after the view details text
|
|
108
|
+
ariaLabel += ` ${estimatedSavingsAriaLabel}`;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function renderInsightContent(): Lit.LitTemplate {
|
|
112
|
+
if (!selected) {
|
|
113
|
+
return Lit.nothing;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const aiLabel = 'Debug with AI';
|
|
117
|
+
const ariaLabel = `Ask AI about ${model.title} insight`;
|
|
118
|
+
const content = renderContent();
|
|
119
|
+
|
|
120
|
+
// clang-format off
|
|
121
|
+
return html`
|
|
122
|
+
<div class="insight-body">
|
|
123
|
+
<div class="insight-description">${md(model.description)}</div>
|
|
124
|
+
<div class="insight-content">${content}</div>
|
|
125
|
+
${canShowAskAI ? html`
|
|
126
|
+
<div class="ask-ai-btn-wrap">
|
|
127
|
+
<devtools-button class="ask-ai"
|
|
128
|
+
.variant=${Buttons.Button.Variant.OUTLINED}
|
|
129
|
+
.iconName=${'smart-assistant'}
|
|
130
|
+
data-insights-ask-ai
|
|
131
|
+
jslog=${VisualLogging.action(`timeline.insight-ask-ai.${internalName}`).track({click: true})}
|
|
132
|
+
@click=${onAskAIButtonClick}
|
|
133
|
+
aria-label=${ariaLabel}
|
|
134
|
+
>${aiLabel}</devtools-button>
|
|
135
|
+
</div>
|
|
136
|
+
`: Lit.nothing}
|
|
137
|
+
</div>`;
|
|
138
|
+
// clang-format on
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function renderHoverIcon(): Lit.LitTemplate {
|
|
142
|
+
if (isAIAssistanceContext) {
|
|
143
|
+
return Lit.nothing;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const containerClasses = Lit.Directives.classMap({
|
|
147
|
+
'insight-hover-icon': true,
|
|
148
|
+
active: selected,
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// clang-format off
|
|
152
|
+
return html`
|
|
153
|
+
<div class=${containerClasses} inert>
|
|
154
|
+
<devtools-button .data=${{
|
|
155
|
+
variant: Buttons.Button.Variant.ICON,
|
|
156
|
+
iconName: 'chevron-down',
|
|
157
|
+
size: Buttons.Button.Size.SMALL,
|
|
158
|
+
} as Buttons.Button.ButtonData}
|
|
159
|
+
></devtools-button>
|
|
160
|
+
</div>
|
|
161
|
+
`;
|
|
162
|
+
// clang-format on
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// clang-format off
|
|
166
|
+
Lit.render(html`
|
|
167
|
+
<style>${baseInsightComponentStyles}</style>
|
|
168
|
+
<div class=${containerClasses}>
|
|
169
|
+
<header @click=${dispatchInsightToggle}
|
|
170
|
+
@keydown=${onHeaderKeyDown}
|
|
171
|
+
jslog=${VisualLogging.action(`timeline.toggle-insight.${internalName}`).track({click: true})}
|
|
172
|
+
data-insight-header-title=${model?.title}
|
|
173
|
+
tabIndex="0"
|
|
174
|
+
role="button"
|
|
175
|
+
aria-expanded=${selected}
|
|
176
|
+
aria-label=${ariaLabel}
|
|
177
|
+
>
|
|
178
|
+
${renderHoverIcon()}
|
|
179
|
+
<h3 class="insight-title">${model?.title}</h3>
|
|
180
|
+
${estimatedSavingsString ?
|
|
181
|
+
html`
|
|
182
|
+
<slot name="insight-savings" class="insight-savings">
|
|
183
|
+
<span title=${estimatedSavingsAriaLabel ?? ''}>${estimatedSavingsString}</span>
|
|
184
|
+
</slot>
|
|
185
|
+
</div>`
|
|
186
|
+
: Lit.nothing}
|
|
187
|
+
</header>
|
|
188
|
+
${renderInsightContent()}
|
|
189
|
+
</div>
|
|
190
|
+
`, target);
|
|
191
|
+
// clang-format on
|
|
192
|
+
|
|
193
|
+
if (selected) {
|
|
194
|
+
requestAnimationFrame(() => requestAnimationFrame(() => target.scrollIntoViewIfNeeded()));
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
|
|
69
198
|
export interface BaseInsightData {
|
|
70
199
|
/** The trace bounds for the insight set that contains this insight. */
|
|
71
200
|
bounds: Trace.Types.Timing.TraceWindowMicro|null;
|
|
@@ -73,26 +202,32 @@ export interface BaseInsightData {
|
|
|
73
202
|
insightSetKey: string|null;
|
|
74
203
|
}
|
|
75
204
|
|
|
76
|
-
export abstract class BaseInsightComponent<T extends InsightModel> extends
|
|
205
|
+
export abstract class BaseInsightComponent<T extends InsightModel> extends UI.Widget.Widget {
|
|
206
|
+
#view: View;
|
|
77
207
|
abstract internalName: string;
|
|
78
208
|
|
|
79
|
-
// So we can use the TypeScript BaseInsight class without getting warnings
|
|
80
|
-
// about litTagName. Every child should overwrite this.
|
|
81
|
-
static readonly litTagName = Lit.StaticHtml.literal``;
|
|
82
|
-
protected readonly shadow = this.attachShadow({mode: 'open'});
|
|
83
|
-
|
|
84
209
|
// This flag tracks if the Insights AI feature is enabled within Chrome for
|
|
85
210
|
// the active user.
|
|
86
211
|
#askAiEnabled = false;
|
|
87
|
-
|
|
212
|
+
// Tracks if this component is rendered withing the AI assistance panel.
|
|
213
|
+
// Currently only relevant to GreenDev.
|
|
214
|
+
#isAIAssistanceContext = false;
|
|
88
215
|
#selected = false;
|
|
89
216
|
#model: T|null = null;
|
|
90
217
|
#agentFocus: AIAssistance.AIContext.AgentFocus|null = null;
|
|
91
218
|
#fieldMetrics: Trace.Insights.Common.CrUXFieldMetricResults|null = null;
|
|
219
|
+
#parsedTrace: Trace.TraceModel.ParsedTrace|null = null;
|
|
220
|
+
#initialOverlays: Trace.Types.Overlays.Overlay[]|null = null;
|
|
221
|
+
|
|
222
|
+
constructor(element?: HTMLElement, view: View = DEFAULT_VIEW) {
|
|
223
|
+
super(element, {useShadowDom: true});
|
|
224
|
+
this.#view = view;
|
|
225
|
+
}
|
|
92
226
|
|
|
93
227
|
get model(): T|null {
|
|
94
228
|
return this.#model;
|
|
95
229
|
}
|
|
230
|
+
|
|
96
231
|
protected data: BaseInsightData = {
|
|
97
232
|
bounds: null,
|
|
98
233
|
insightSetKey: null,
|
|
@@ -102,11 +237,6 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
102
237
|
selectedRowEl: null,
|
|
103
238
|
selectionIsSticky: false,
|
|
104
239
|
};
|
|
105
|
-
#initialOverlays: Trace.Types.Overlays.Overlay[]|null = null;
|
|
106
|
-
|
|
107
|
-
protected scheduleRender(): void {
|
|
108
|
-
void ComponentHelpers.ScheduledRender.scheduleRender(this, this.#render);
|
|
109
|
-
}
|
|
110
240
|
|
|
111
241
|
// Insights that do support the AI feature can override this to return true.
|
|
112
242
|
// The "Ask AI" button will only be shown for an Insight if this
|
|
@@ -116,37 +246,49 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
116
246
|
return false;
|
|
117
247
|
}
|
|
118
248
|
|
|
119
|
-
|
|
120
|
-
|
|
249
|
+
override wasShown(): void {
|
|
250
|
+
super.wasShown();
|
|
251
|
+
|
|
121
252
|
// Used for unit test purposes when querying the DOM.
|
|
122
|
-
this.dataset.insightName = this.internalName;
|
|
253
|
+
this.element.dataset.insightName = this.internalName;
|
|
123
254
|
|
|
124
255
|
const {devToolsAiAssistancePerformanceAgent} = Root.Runtime.hostConfig;
|
|
125
256
|
this.#askAiEnabled = Boolean(devToolsAiAssistancePerformanceAgent?.enabled);
|
|
126
257
|
}
|
|
127
258
|
|
|
259
|
+
set isAIAssistanceContext(isAIAssistanceContext: boolean) {
|
|
260
|
+
this.#isAIAssistanceContext = isAIAssistanceContext;
|
|
261
|
+
this.requestUpdate();
|
|
262
|
+
}
|
|
263
|
+
|
|
128
264
|
set selected(selected: boolean) {
|
|
129
265
|
if (!this.#selected && selected) {
|
|
130
266
|
const options = this.getOverlayOptionsForInitialOverlays();
|
|
131
|
-
this.dispatchEvent(new SidebarInsight.InsightProvideOverlays(this.getInitialOverlays(), options));
|
|
267
|
+
this.element.dispatchEvent(new SidebarInsight.InsightProvideOverlays(this.getInitialOverlays(), options));
|
|
132
268
|
}
|
|
133
269
|
|
|
134
|
-
this.#selected
|
|
135
|
-
|
|
270
|
+
if (this.#selected !== selected) {
|
|
271
|
+
this.#selected = selected;
|
|
272
|
+
this.requestUpdate();
|
|
273
|
+
}
|
|
136
274
|
}
|
|
137
275
|
|
|
138
276
|
get selected(): boolean {
|
|
139
277
|
return this.#selected;
|
|
140
278
|
}
|
|
141
279
|
|
|
280
|
+
set parsedTrace(trace: Trace.TraceModel.ParsedTrace|null) {
|
|
281
|
+
this.#parsedTrace = trace;
|
|
282
|
+
}
|
|
283
|
+
|
|
142
284
|
set model(model: T) {
|
|
143
285
|
this.#model = model;
|
|
144
|
-
|
|
286
|
+
this.requestUpdate();
|
|
145
287
|
}
|
|
146
288
|
|
|
147
289
|
set insightSetKey(insightSetKey: string|null) {
|
|
148
290
|
this.data.insightSetKey = insightSetKey;
|
|
149
|
-
|
|
291
|
+
this.requestUpdate();
|
|
150
292
|
}
|
|
151
293
|
|
|
152
294
|
get bounds(): Trace.Types.Timing.TraceWindowMicro|null {
|
|
@@ -155,7 +297,7 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
155
297
|
|
|
156
298
|
set bounds(bounds: Trace.Types.Timing.TraceWindowMicro|null) {
|
|
157
299
|
this.data.bounds = bounds;
|
|
158
|
-
|
|
300
|
+
this.requestUpdate();
|
|
159
301
|
}
|
|
160
302
|
|
|
161
303
|
set agentFocus(agentFocus: AIAssistance.AIContext.AgentFocus) {
|
|
@@ -175,14 +317,27 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
175
317
|
}
|
|
176
318
|
|
|
177
319
|
#dispatchInsightToggle(): void {
|
|
178
|
-
if (!this.data.insightSetKey || !this
|
|
320
|
+
if (!this.data.insightSetKey || !this.#model) {
|
|
179
321
|
// Shouldn't happen, but needed to satisfy TS.
|
|
180
322
|
return;
|
|
181
323
|
}
|
|
182
324
|
|
|
325
|
+
if (this.#parsedTrace && UI.Floaty.enabled()) {
|
|
326
|
+
const floatyHandled = UI.Floaty.onFloatyClick({
|
|
327
|
+
type: UI.Floaty.FloatyContextTypes.PERFORMANCE_INSIGHT,
|
|
328
|
+
data: {
|
|
329
|
+
insight: this.#model,
|
|
330
|
+
trace: this.#parsedTrace,
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
if (floatyHandled) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
183
338
|
const focus = UI.Context.Context.instance().flavor(AIAssistance.AIContext.AgentFocus);
|
|
184
339
|
if (this.#selected) {
|
|
185
|
-
this.dispatchEvent(new SidebarInsight.InsightDeactivated());
|
|
340
|
+
this.element.dispatchEvent(new SidebarInsight.InsightDeactivated());
|
|
186
341
|
|
|
187
342
|
// Clear agent (but only if currently focused on an insight).
|
|
188
343
|
if (focus) {
|
|
@@ -192,7 +347,7 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
192
347
|
}
|
|
193
348
|
|
|
194
349
|
if (focus) {
|
|
195
|
-
UI.Context.Context.instance().setFlavor(AIAssistance.AIContext.AgentFocus, focus.withInsight(this
|
|
350
|
+
UI.Context.Context.instance().setFlavor(AIAssistance.AIContext.AgentFocus, focus.withInsight(this.#model));
|
|
196
351
|
}
|
|
197
352
|
|
|
198
353
|
Badges.UserBadges.instance().recordAction(Badges.BadgeAction.PERFORMANCE_INSIGHT_CLICKED);
|
|
@@ -201,34 +356,14 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
201
356
|
this.sharedTableState.selectedRowEl = null;
|
|
202
357
|
this.sharedTableState.selectionIsSticky = false;
|
|
203
358
|
|
|
204
|
-
this.dispatchEvent(new SidebarInsight.InsightActivated(this
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
#renderHoverIcon(insightIsActive: boolean): Lit.TemplateResult {
|
|
208
|
-
// clang-format off
|
|
209
|
-
const containerClasses = Lit.Directives.classMap({
|
|
210
|
-
'insight-hover-icon': true,
|
|
211
|
-
active: insightIsActive,
|
|
212
|
-
});
|
|
213
|
-
return html`
|
|
214
|
-
<div class=${containerClasses} inert>
|
|
215
|
-
<devtools-button .data=${{
|
|
216
|
-
variant: Buttons.Button.Variant.ICON,
|
|
217
|
-
iconName: 'chevron-down',
|
|
218
|
-
size: Buttons.Button.Size.SMALL,
|
|
219
|
-
} as Buttons.Button.ButtonData}
|
|
220
|
-
></devtools-button>
|
|
221
|
-
</div>
|
|
222
|
-
|
|
223
|
-
`;
|
|
224
|
-
// clang-format on
|
|
359
|
+
this.element.dispatchEvent(new SidebarInsight.InsightActivated(this.#model, this.data.insightSetKey));
|
|
225
360
|
}
|
|
226
361
|
|
|
227
362
|
/**
|
|
228
363
|
* Ensure that if the user presses enter or space on a header, we treat it
|
|
229
364
|
* like a click and toggle the insight.
|
|
230
365
|
*/
|
|
231
|
-
#
|
|
366
|
+
#onHeaderKeyDown(event: KeyboardEvent): void {
|
|
232
367
|
if (event.key === 'Enter' || event.key === ' ') {
|
|
233
368
|
event.preventDefault();
|
|
234
369
|
event.stopPropagation();
|
|
@@ -252,12 +387,12 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
252
387
|
}
|
|
253
388
|
|
|
254
389
|
if (!overlays) {
|
|
255
|
-
this.dispatchEvent(new SidebarInsight.InsightProvideOverlays(
|
|
390
|
+
this.element.dispatchEvent(new SidebarInsight.InsightProvideOverlays(
|
|
256
391
|
this.getInitialOverlays(), this.getOverlayOptionsForInitialOverlays()));
|
|
257
392
|
return;
|
|
258
393
|
}
|
|
259
394
|
|
|
260
|
-
this.dispatchEvent(new SidebarInsight.InsightProvideOverlays(overlays, options));
|
|
395
|
+
this.element.dispatchEvent(new SidebarInsight.InsightProvideOverlays(overlays, options));
|
|
261
396
|
}
|
|
262
397
|
|
|
263
398
|
getInitialOverlays(): Trace.Types.Overlays.Overlay[] {
|
|
@@ -270,17 +405,30 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
270
405
|
}
|
|
271
406
|
|
|
272
407
|
protected createOverlays(): Trace.Types.Overlays.Overlay[] {
|
|
273
|
-
return this
|
|
408
|
+
return this.#model?.createOverlays?.() ?? [];
|
|
274
409
|
}
|
|
275
410
|
|
|
276
411
|
protected abstract renderContent(): Lit.LitTemplate;
|
|
277
412
|
|
|
278
|
-
|
|
279
|
-
if (!this
|
|
413
|
+
override performUpdate(): void {
|
|
414
|
+
if (!this.#model) {
|
|
280
415
|
return;
|
|
281
416
|
}
|
|
282
417
|
|
|
283
|
-
|
|
418
|
+
const input: ViewInput = {
|
|
419
|
+
internalName: this.internalName,
|
|
420
|
+
model: this.#model,
|
|
421
|
+
selected: this.#selected,
|
|
422
|
+
estimatedSavingsString: this.getEstimatedSavingsString(),
|
|
423
|
+
estimatedSavingsAriaLabel: this.#getEstimatedSavingsAriaLabel(),
|
|
424
|
+
isAIAssistanceContext: this.#isAIAssistanceContext,
|
|
425
|
+
canShowAskAI: this.#canShowAskAI(),
|
|
426
|
+
dispatchInsightToggle: () => this.#dispatchInsightToggle(),
|
|
427
|
+
renderContent: () => this.renderContent(),
|
|
428
|
+
onHeaderKeyDown: () => this.#onHeaderKeyDown,
|
|
429
|
+
onAskAIButtonClick: () => this.#onAskAIButtonClick(),
|
|
430
|
+
};
|
|
431
|
+
this.#view(input, undefined, this.contentElement);
|
|
284
432
|
}
|
|
285
433
|
|
|
286
434
|
getEstimatedSavingsTime(): Trace.Types.Timing.Milli|null {
|
|
@@ -288,7 +436,7 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
288
436
|
}
|
|
289
437
|
|
|
290
438
|
getEstimatedSavingsBytes(): number|null {
|
|
291
|
-
return this
|
|
439
|
+
return this.#model?.wastedBytes ?? null;
|
|
292
440
|
}
|
|
293
441
|
|
|
294
442
|
#getEstimatedSavingsTextParts(): {bytesString?: string, timeString?: string} {
|
|
@@ -331,7 +479,7 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
331
479
|
return null;
|
|
332
480
|
}
|
|
333
481
|
|
|
334
|
-
|
|
482
|
+
getEstimatedSavingsString(): string|null {
|
|
335
483
|
const {bytesString, timeString} = this.#getEstimatedSavingsTextParts();
|
|
336
484
|
|
|
337
485
|
if (timeString && bytesString) {
|
|
@@ -354,7 +502,7 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
354
502
|
return null;
|
|
355
503
|
}
|
|
356
504
|
|
|
357
|
-
#
|
|
505
|
+
#onAskAIButtonClick(): void {
|
|
358
506
|
if (!this.#agentFocus) {
|
|
359
507
|
return;
|
|
360
508
|
}
|
|
@@ -367,7 +515,7 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
367
515
|
|
|
368
516
|
let focus = UI.Context.Context.instance().flavor(AIAssistance.AIContext.AgentFocus);
|
|
369
517
|
if (focus) {
|
|
370
|
-
focus = focus.withInsight(this
|
|
518
|
+
focus = focus.withInsight(this.#model);
|
|
371
519
|
} else {
|
|
372
520
|
focus = this.#agentFocus;
|
|
373
521
|
}
|
|
@@ -379,98 +527,14 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends HTMLE
|
|
|
379
527
|
}
|
|
380
528
|
|
|
381
529
|
#canShowAskAI(): boolean {
|
|
530
|
+
if (this.#isAIAssistanceContext) {
|
|
531
|
+
return false;
|
|
532
|
+
}
|
|
533
|
+
|
|
382
534
|
const aiAvailable = Root.Runtime.hostConfig.aidaAvailability?.enterprisePolicyValue !==
|
|
383
535
|
Root.Runtime.GenAiEnterprisePolicyValue.DISABLE &&
|
|
384
536
|
this.#askAiEnabled && Root.Runtime.hostConfig.aidaAvailability?.enabled === true;
|
|
385
537
|
|
|
386
538
|
return aiAvailable && this.hasAskAiSupport();
|
|
387
539
|
}
|
|
388
|
-
|
|
389
|
-
#renderInsightContent(insightModel: T): Lit.LitTemplate {
|
|
390
|
-
if (!this.#selected) {
|
|
391
|
-
return Lit.nothing;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
const aiLabel = Root.Runtime.hostConfig.devToolsAiDebugWithAi?.enabled ||
|
|
395
|
-
Root.Runtime.hostConfig.devToolsAiSubmenuPrompts?.enabled ?
|
|
396
|
-
'Debug with AI' :
|
|
397
|
-
'Ask AI';
|
|
398
|
-
const ariaLabel = `${aiLabel} about ${insightModel.title} insight`;
|
|
399
|
-
// Only render the insight body content if it is selected.
|
|
400
|
-
// To avoid re-rendering triggered from elsewhere.
|
|
401
|
-
const content = this.renderContent();
|
|
402
|
-
// clang-format off
|
|
403
|
-
return html`
|
|
404
|
-
<div class="insight-body">
|
|
405
|
-
<div class="insight-description">${md(insightModel.description)}</div>
|
|
406
|
-
<div class="insight-content">${content}</div>
|
|
407
|
-
${this.#canShowAskAI() ? html`
|
|
408
|
-
<div class="ask-ai-btn-wrap">
|
|
409
|
-
<devtools-button class="ask-ai"
|
|
410
|
-
.variant=${Buttons.Button.Variant.OUTLINED}
|
|
411
|
-
.iconName=${'smart-assistant'}
|
|
412
|
-
data-insights-ask-ai
|
|
413
|
-
jslog=${VisualLogging.action(`timeline.insight-ask-ai.${this.internalName}`).track({click: true})}
|
|
414
|
-
@click=${this.#askAIButtonClick}
|
|
415
|
-
aria-label=${ariaLabel}
|
|
416
|
-
>${aiLabel}</devtools-button>
|
|
417
|
-
</div>
|
|
418
|
-
`: Lit.nothing}
|
|
419
|
-
</div>`;
|
|
420
|
-
// clang-format on
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
#renderWithContent(): void {
|
|
424
|
-
if (!this.#model) {
|
|
425
|
-
Lit.render(Lit.nothing, this.shadow, {host: this});
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
const containerClasses = Lit.Directives.classMap({
|
|
430
|
-
insight: true,
|
|
431
|
-
closed: !this.#selected,
|
|
432
|
-
});
|
|
433
|
-
const estimatedSavingsString = this.#getEstimatedSavingsString();
|
|
434
|
-
const estimatedSavingsAriaLabel = this.#getEstimatedSavingsAriaLabel();
|
|
435
|
-
|
|
436
|
-
let ariaLabel = `${i18nString(UIStrings.viewDetails, {PH1: this.#model.title})}`;
|
|
437
|
-
if (estimatedSavingsAriaLabel) {
|
|
438
|
-
// space prefix is deliberate to add a gap after the view details text
|
|
439
|
-
ariaLabel += ` ${estimatedSavingsAriaLabel}`;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
// clang-format off
|
|
443
|
-
const output = html`
|
|
444
|
-
<style>${baseInsightComponentStyles}</style>
|
|
445
|
-
<div class=${containerClasses}>
|
|
446
|
-
<header @click=${this.#dispatchInsightToggle}
|
|
447
|
-
@keydown=${this.#handleHeaderKeyDown}
|
|
448
|
-
jslog=${VisualLogging.action(`timeline.toggle-insight.${this.internalName}`).track({click: true})}
|
|
449
|
-
data-insight-header-title=${this.#model?.title}
|
|
450
|
-
tabIndex="0"
|
|
451
|
-
role="button"
|
|
452
|
-
aria-expanded=${this.#selected}
|
|
453
|
-
aria-label=${ariaLabel}
|
|
454
|
-
>
|
|
455
|
-
${this.#renderHoverIcon(this.#selected)}
|
|
456
|
-
<h3 class="insight-title">${this.#model?.title}</h3>
|
|
457
|
-
${estimatedSavingsString ?
|
|
458
|
-
html`
|
|
459
|
-
<slot name="insight-savings" class="insight-savings">
|
|
460
|
-
<span title=${estimatedSavingsAriaLabel ?? ''}>${estimatedSavingsString}</span>
|
|
461
|
-
</slot>
|
|
462
|
-
</div>`
|
|
463
|
-
: Lit.nothing}
|
|
464
|
-
</header>
|
|
465
|
-
${this.#renderInsightContent(this.#model)}
|
|
466
|
-
</div>
|
|
467
|
-
`;
|
|
468
|
-
// clang-format on
|
|
469
|
-
|
|
470
|
-
Lit.render(output, this.shadow, {host: this});
|
|
471
|
-
|
|
472
|
-
if (this.#selected) {
|
|
473
|
-
requestAnimationFrame(() => requestAnimationFrame(() => this.scrollIntoViewIfNeeded()));
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
540
|
}
|
|
@@ -2,23 +2,21 @@
|
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
|
-
import './NodeLink.js';
|
|
6
|
-
|
|
7
5
|
import * as i18n from '../../../../core/i18n/i18n.js';
|
|
6
|
+
import type * as Platform from '../../../../core/platform/platform.js';
|
|
8
7
|
import type {CLSCulpritsInsightModel} from '../../../../models/trace/insights/CLSCulprits.js';
|
|
9
8
|
import * as Trace from '../../../../models/trace/trace.js';
|
|
10
9
|
import * as Lit from '../../../../ui/lit/lit.js';
|
|
11
10
|
|
|
12
11
|
import {BaseInsightComponent} from './BaseInsightComponent.js';
|
|
13
12
|
import {EventReferenceClick} from './EventRef.js';
|
|
14
|
-
import
|
|
13
|
+
import {nodeLink} from './NodeLink.js';
|
|
15
14
|
|
|
16
15
|
const {UIStrings, i18nString} = Trace.Insights.Models.CLSCulprits;
|
|
17
16
|
|
|
18
17
|
const {html} = Lit;
|
|
19
18
|
|
|
20
19
|
export class CLSCulprits extends BaseInsightComponent<CLSCulpritsInsightModel> {
|
|
21
|
-
static override readonly litTagName = Lit.StaticHtml.literal`devtools-performance-cls-culprits`;
|
|
22
20
|
override internalName = 'cls-culprits';
|
|
23
21
|
|
|
24
22
|
protected override hasAskAiSupport(): boolean {
|
|
@@ -34,7 +32,7 @@ export class CLSCulprits extends BaseInsightComponent<CLSCulpritsInsightModel> {
|
|
|
34
32
|
}
|
|
35
33
|
|
|
36
34
|
#clickEvent(event: Trace.Types.Events.Event): void {
|
|
37
|
-
this.dispatchEvent(new EventReferenceClick(event));
|
|
35
|
+
this.element.dispatchEvent(new EventReferenceClick(event));
|
|
38
36
|
}
|
|
39
37
|
|
|
40
38
|
#renderCulpritsSection(culprits: Trace.Insights.Models.CLSCulprits.LayoutShiftItem[]): Lit.LitTemplate {
|
|
@@ -52,13 +50,11 @@ export class CLSCulprits extends BaseInsightComponent<CLSCulpritsInsightModel> {
|
|
|
52
50
|
return html`
|
|
53
51
|
<li>
|
|
54
52
|
${culprit.description}
|
|
55
|
-
|
|
56
|
-
.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
} as NodeLink.NodeLinkData}>
|
|
61
|
-
</devtools-performance-node-link>
|
|
53
|
+
${nodeLink({
|
|
54
|
+
backendNodeId: culprit.backendNodeId,
|
|
55
|
+
frame: culprit.frame,
|
|
56
|
+
fallbackUrl: culprit.url as Platform.DevToolsPath.UrlString,
|
|
57
|
+
})}
|
|
62
58
|
</li>`;
|
|
63
59
|
}
|
|
64
60
|
|
|
@@ -94,11 +90,3 @@ export class CLSCulprits extends BaseInsightComponent<CLSCulpritsInsightModel> {
|
|
|
94
90
|
// clang-format on
|
|
95
91
|
}
|
|
96
92
|
}
|
|
97
|
-
|
|
98
|
-
declare global {
|
|
99
|
-
interface HTMLElementTagNameMap {
|
|
100
|
-
'devtools-performance-cls-culprits': CLSCulprits;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
customElements.define('devtools-performance-cls-culprits', CLSCulprits);
|
|
@@ -18,7 +18,6 @@ const {UIStrings, i18nString, createOverlayForRequest} = Trace.Insights.Models.C
|
|
|
18
18
|
const {html} = Lit;
|
|
19
19
|
|
|
20
20
|
export class Cache extends BaseInsightComponent<CacheInsightModel> {
|
|
21
|
-
static override readonly litTagName = Lit.StaticHtml.literal`devtools-performance-cache`;
|
|
22
21
|
override internalName = 'cache';
|
|
23
22
|
|
|
24
23
|
protected override hasAskAiSupport(): boolean {
|
|
@@ -68,11 +67,3 @@ export class Cache extends BaseInsightComponent<CacheInsightModel> {
|
|
|
68
67
|
// clang-format on
|
|
69
68
|
}
|
|
70
69
|
}
|
|
71
|
-
|
|
72
|
-
declare global {
|
|
73
|
-
interface HTMLElementTagNameMap {
|
|
74
|
-
'devtools-performance-cache': Cache;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
customElements.define('devtools-performance-cache', Cache);
|