chrome-devtools-frontend 1.0.1657110 → 1.0.1660788
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/.agents/skills/devtools-ux-writing-refactor/SKILL.md +125 -0
- package/.agents/skills/migrate-chromium-test/SKILL.md +15 -70
- package/.agents/skills/repro-flaky-tests/SKILL.md +53 -0
- package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +37 -18
- package/.agents/skills/version-control/SKILL.md +8 -1
- package/AUTHORS +1 -0
- package/SECURITY.md +3 -0
- package/docs/get_the_code.md +6 -0
- package/front_end/Images/src/ads.svg +1 -0
- package/front_end/Tests.js +6 -6
- package/front_end/core/common/Gzip.ts +12 -5
- package/front_end/core/common/ResourceType.ts +19 -19
- package/front_end/core/common/Revealer.ts +15 -15
- package/front_end/core/common/SettingRegistration.ts +19 -19
- package/front_end/core/host/AidaClient.ts +35 -9
- package/front_end/core/host/GdpClient.ts +10 -7
- package/front_end/core/platform/StringUtilities.ts +35 -0
- package/front_end/core/sdk/AccessibilityModel.snapshot.txt +17 -0
- package/front_end/core/sdk/AccessibilityModel.ts +132 -2
- package/front_end/core/sdk/CPUThrottlingManager.ts +8 -5
- package/front_end/core/sdk/CSSMetadata.ts +110 -16
- package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +2 -5
- package/front_end/core/sdk/ConsoleModel.ts +5 -5
- package/front_end/core/sdk/DOMDebuggerModel.ts +5 -1
- package/front_end/core/sdk/DOMModel.ts +32 -18
- package/front_end/core/sdk/NetworkManager.ts +58 -14
- package/front_end/core/sdk/NetworkRequest.ts +37 -1
- package/front_end/core/sdk/OverlayModel.ts +45 -6
- package/front_end/core/sdk/ResourceTreeModel.ts +6 -7
- package/front_end/core/sdk/ScreenCaptureModel.ts +2 -2
- package/front_end/core/sdk/ServerTiming.ts +17 -13
- package/front_end/core/sdk/ServiceWorkerCacheModel.ts +4 -2
- package/front_end/core/sdk/ServiceWorkerManager.ts +19 -5
- package/front_end/core/sdk/TargetManager.ts +10 -1
- package/front_end/core/sdk/TraceObject.ts +4 -2
- package/front_end/core/sdk/sdk-meta.ts +170 -0
- package/front_end/design_system_tokens.css +0 -5
- package/front_end/entrypoints/devtools_app/devtools_app.ts +1 -1
- package/front_end/entrypoints/formatter_worker/CSSFormatter.ts +13 -4
- package/front_end/entrypoints/formatter_worker/FormattedContentBuilder.ts +5 -2
- package/front_end/entrypoints/formatter_worker/FormatterWorker.ts +23 -4
- package/front_end/entrypoints/formatter_worker/HTMLFormatter.ts +33 -10
- package/front_end/entrypoints/formatter_worker/JavaScriptFormatter.ts +8 -3
- package/front_end/entrypoints/inspector_main/InspectorMain.ts +4 -4
- package/front_end/entrypoints/inspector_main/OutermostTargetSelector.ts +2 -2
- package/front_end/entrypoints/inspector_main/RenderingOptions.ts +36 -37
- package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +15 -33
- package/front_end/entrypoints/js_app/js_app.ts +6 -5
- package/front_end/entrypoints/main/GlobalAiButton.ts +4 -4
- package/front_end/entrypoints/main/MainImpl.ts +25 -55
- package/front_end/entrypoints/main/main-meta.ts +50 -50
- package/front_end/entrypoints/node_app/app/NodeConnectionsPanel.ts +5 -5
- package/front_end/entrypoints/node_app/app/NodeMain.ts +3 -3
- package/front_end/entrypoints/node_app/node_app.ts +10 -9
- package/front_end/entrypoints/worker_app/WorkerMain.ts +1 -1
- package/front_end/foundation/Universe.ts +76 -6
- package/front_end/generated/InspectorBackendCommands.ts +3 -3
- package/front_end/generated/SupportedCSSProperties.js +19 -12
- package/front_end/generated/protocol.ts +7 -1
- package/front_end/models/ai_assistance/AiConversation.ts +19 -17
- package/front_end/models/ai_assistance/AiHistoryStorage.ts +37 -14
- package/front_end/models/ai_assistance/AiUtils.ts +38 -42
- package/front_end/models/ai_assistance/agents/AiAgent.ts +5 -1
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +3 -2
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +2 -1
- package/front_end/models/ai_assistance/agents/StorageAgent.ts +7 -5
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +270 -286
- package/front_end/models/ai_assistance/data_formatters/UnitFormatters.ts +20 -0
- package/front_end/models/ai_assistance/performance/AICallTree.ts +3 -1
- package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +3 -2
- package/front_end/models/autofill_manager/AutofillManager.ts +3 -1
- package/front_end/models/bindings/CSSWorkspaceBinding.ts +8 -5
- package/front_end/models/bindings/CompilerScriptMapping.ts +2 -1
- package/front_end/models/bindings/DebuggerLanguagePlugins.ts +15 -16
- package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +6 -4
- package/front_end/models/bindings/FileUtils.ts +11 -12
- package/front_end/models/bindings/NetworkProject.ts +4 -0
- package/front_end/models/bindings/PresentationConsoleMessageHelper.ts +2 -1
- package/front_end/models/bindings/ResourceUtils.ts +1 -1
- package/front_end/models/bindings/SASSSourceMapping.ts +8 -5
- package/front_end/models/emulation/DeviceModeModel.ts +14 -14
- package/front_end/models/emulation/EmulatedDevices.ts +392 -11
- package/front_end/models/extensions/ExtensionAPI.ts +6 -6
- package/front_end/models/extensions/LanguageExtensionEndpoint.ts +13 -12
- package/front_end/models/issues_manager/BounceTrackingIssue.ts +1 -1
- package/front_end/models/issues_manager/ClientHintIssue.ts +1 -1
- package/front_end/models/issues_manager/ConnectionAllowlistIssue.ts +1 -1
- package/front_end/models/issues_manager/ContentSecurityPolicyIssue.ts +7 -7
- package/front_end/models/issues_manager/CookieDeprecationMetadataIssue.ts +2 -2
- package/front_end/models/issues_manager/CookieIssue.ts +6 -7
- package/front_end/models/issues_manager/CorsIssue.ts +3 -3
- package/front_end/models/issues_manager/CrossOriginEmbedderPolicyIssue.ts +2 -2
- package/front_end/models/issues_manager/DeprecationIssue.ts +3 -3
- package/front_end/models/issues_manager/EmailVerificationRequestIssue.ts +1 -1
- package/front_end/models/issues_manager/FederatedAuthRequestIssue.ts +1 -1
- package/front_end/models/issues_manager/FederatedAuthUserInfoRequestIssue.ts +1 -1
- package/front_end/models/issues_manager/GenericIssue.ts +7 -7
- package/front_end/models/issues_manager/HeavyAdIssue.ts +3 -3
- package/front_end/models/issues_manager/Issue.ts +8 -8
- package/front_end/models/issues_manager/MixedContentIssue.ts +1 -1
- package/front_end/models/issues_manager/PartitioningBlobURLIssue.ts +3 -3
- package/front_end/models/issues_manager/QuirksModeIssue.ts +1 -1
- package/front_end/models/issues_manager/SRIMessageSignatureIssue.ts +2 -2
- package/front_end/models/issues_manager/SelectivePermissionsInterventionIssue.ts +2 -2
- package/front_end/models/issues_manager/SharedArrayBufferIssue.ts +2 -2
- package/front_end/models/issues_manager/SharedDictionaryIssue.ts +1 -1
- package/front_end/models/issues_manager/UnencodedDigestIssue.ts +3 -3
- package/front_end/models/javascript_metadata/NativeFunctions.js +5 -1
- package/front_end/models/stack_trace/StackTraceModel.ts +3 -3
- package/front_end/models/text_utils/ContentData.ts +27 -0
- package/front_end/models/trace/helpers/SamplesIntegrator.ts +21 -5
- package/front_end/models/trace_source_maps_resolver/SourceMapsResolver.ts +29 -14
- package/front_end/models/web_mcp/WebMCPModel.ts +24 -6
- package/front_end/models/workspace/IgnoreListManager.ts +6 -6
- package/front_end/models/workspace/UISourceCode.ts +3 -3
- package/front_end/models/workspace_diff/WorkspaceDiff.ts +23 -12
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +25 -22
- package/front_end/panels/ai_assistance/ExportConversation.ts +3 -4
- package/front_end/panels/ai_assistance/ai_assistance-meta.ts +3 -3
- package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +7 -0
- package/front_end/panels/ai_assistance/components/DisabledWidget.ts +2 -2
- package/front_end/panels/animation/AnimationTimeline.ts +17 -19
- package/front_end/panels/animation/AnimationUI.ts +5 -5
- package/front_end/panels/animation/animation-meta.ts +2 -2
- package/front_end/panels/application/ApplicationPanelSidebar.ts +13 -4
- package/front_end/panels/application/BackgroundServiceView.ts +2 -1
- package/front_end/panels/application/DeviceBoundSessionsView.ts +2 -6
- package/front_end/panels/application/IndexedDBViews.ts +245 -262
- package/front_end/panels/application/OpenedWindowDetailsView.ts +1 -1
- package/front_end/panels/application/ResourcesPanel.ts +9 -2
- package/front_end/panels/application/ServiceWorkersView.ts +252 -211
- package/front_end/panels/application/StorageView.ts +97 -33
- package/front_end/panels/application/WebMCPView.ts +15 -1
- package/front_end/panels/application/components/AdsView.ts +1 -1
- package/front_end/panels/application/indexedDBViews.css +38 -9
- package/front_end/panels/application/preloading/helper/PreloadingForward.ts +2 -1
- package/front_end/panels/application/resourcesSidebar.css +5 -0
- package/front_end/panels/application/storageView.css +26 -9
- package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +5 -1
- package/front_end/panels/browser_debugger/browser_debugger-meta.ts +8 -6
- package/front_end/panels/common/DOMLinkifier.ts +1 -1
- package/front_end/panels/common/ExtensionServer.ts +119 -14
- package/front_end/panels/console/ConsoleContextSelector.ts +4 -4
- package/front_end/panels/console/ConsolePinPane.ts +12 -12
- package/front_end/panels/console/ConsolePrompt.ts +6 -6
- package/front_end/panels/console/ConsoleSidebar.ts +7 -7
- package/front_end/panels/console/ConsoleView.ts +45 -44
- package/front_end/panels/console/ConsoleViewMessage.ts +40 -40
- package/front_end/panels/console/SymbolizedErrorWidget.ts +2 -1
- package/front_end/panels/console/console-meta.ts +34 -34
- package/front_end/panels/console_counters/WarningErrorCounter.ts +2 -2
- package/front_end/panels/coverage/CoverageListView.ts +28 -28
- package/front_end/panels/coverage/CoverageModel.ts +2 -1
- package/front_end/panels/coverage/CoverageView.ts +23 -23
- package/front_end/panels/coverage/coverage-meta.ts +5 -5
- package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +36 -36
- package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +1 -1
- package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +2 -2
- package/front_end/panels/css_overview/CSSOverviewStartView.ts +6 -6
- package/front_end/panels/css_overview/CSSOverviewUnusedDeclarations.ts +6 -6
- package/front_end/panels/css_overview/css_overview-meta.ts +2 -2
- package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +20 -21
- package/front_end/panels/developer_resources/DeveloperResourcesView.ts +6 -8
- package/front_end/panels/developer_resources/developer_resources-meta.ts +2 -2
- package/front_end/panels/elements/AccessibilityTreeUtils.ts +8 -102
- package/front_end/panels/elements/AccessibilityTreeView.ts +163 -70
- package/front_end/panels/elements/ElementsPanel.ts +17 -11
- package/front_end/panels/elements/ElementsTreeElement.ts +49 -2
- package/front_end/panels/elements/ElementsTreeOutline.ts +4 -4
- package/front_end/panels/elements/LayoutPane.ts +1 -1
- package/front_end/panels/elements/MetricsSidebarPane.ts +100 -34
- package/front_end/panels/elements/StylePropertiesSection.ts +2 -2
- package/front_end/panels/elements/StylePropertyTreeElement.ts +8 -2
- package/front_end/panels/elements/StylesSidebarPane.ts +1 -1
- package/front_end/panels/elements/components/AccessibilityTreeNode.ts +7 -18
- package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +2 -2
- package/front_end/panels/elements/components/QueryContainer.ts +1 -1
- package/front_end/panels/issues/AffectedDirectivesView.ts +1 -1
- package/front_end/panels/issues/AffectedResourcesView.ts +2 -1
- package/front_end/panels/layer_viewer/LayerViewHost.ts +1 -1
- package/front_end/panels/media/EventDisplayTable.ts +2 -2
- package/front_end/panels/media/EventTimelineView.ts +4 -4
- package/front_end/panels/media/MainView.ts +4 -4
- package/front_end/panels/media/PlayerDetailView.ts +5 -5
- package/front_end/panels/media/PlayerListView.ts +1 -1
- package/front_end/panels/media/PlayerMessagesView.ts +12 -12
- package/front_end/panels/media/PlayerPropertiesView.ts +17 -17
- package/front_end/panels/network/NetworkDataGridNode.ts +124 -36
- package/front_end/panels/network/NetworkLogView.ts +11 -2
- package/front_end/panels/network/NetworkLogViewColumns.ts +18 -0
- package/front_end/panels/network/NetworkPanel.ts +2 -1
- package/front_end/panels/network/NetworkWaterfallColumn.ts +1 -3
- package/front_end/panels/network/RequestConditionsDrawer.ts +2 -2
- package/front_end/panels/network/RequestPayloadView.ts +53 -7
- package/front_end/panels/network/RequestPreviewView.ts +7 -1
- package/front_end/panels/network/components/ResponseHeaderSection.ts +1 -1
- package/front_end/panels/network/forward/UIFilter.ts +1 -0
- package/front_end/panels/network/networkPanel.css +1 -0
- package/front_end/panels/network/networkTimingTable.css +1 -1
- package/front_end/panels/network/requestPayloadView.css +10 -0
- package/front_end/panels/performance_monitor/PerformanceMonitor.ts +12 -12
- package/front_end/panels/performance_monitor/performance_monitor-meta.ts +7 -7
- package/front_end/panels/profiler/HeapDetachedElementsView.ts +2 -2
- package/front_end/panels/profiler/HeapProfileView.ts +563 -51
- package/front_end/panels/profiler/HeapSnapshotView.ts +15 -9
- package/front_end/panels/profiler/ProfilesPanel.ts +13 -7
- package/front_end/panels/profiler/WritableProfileHeader.ts +152 -0
- package/front_end/panels/profiler/profiler.ts +2 -2
- package/front_end/panels/protocol_monitor/JSONEditor.ts +10 -10
- package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +28 -32
- package/front_end/panels/protocol_monitor/protocol_monitor-meta.ts +1 -1
- package/front_end/panels/recorder/RecorderController.ts +15 -15
- package/front_end/panels/recorder/RecorderEvents.ts +8 -0
- package/front_end/panels/recorder/components/CreateRecordingView.ts +11 -11
- package/front_end/panels/recorder/components/ExtensionView.ts +74 -83
- package/front_end/panels/recorder/components/RecordingListView.ts +3 -3
- package/front_end/panels/recorder/components/RecordingView.ts +13 -10
- package/front_end/panels/recorder/components/ReplaySection.ts +9 -9
- package/front_end/panels/recorder/components/StepEditor.ts +352 -321
- package/front_end/panels/recorder/components/StepView.ts +36 -37
- package/front_end/panels/recorder/components/recordingView.css +1 -1
- package/front_end/panels/recorder/models/RecorderSettings.ts +2 -2
- package/front_end/panels/recorder/recorder-meta.ts +7 -7
- package/front_end/panels/screencast/ScreencastApp.ts +1 -1
- package/front_end/panels/screencast/ScreencastView.ts +12 -12
- package/front_end/panels/search/SearchResultsPane.ts +4 -4
- package/front_end/panels/search/SearchView.ts +20 -20
- package/front_end/panels/security/SecurityModel.ts +7 -7
- package/front_end/panels/security/SecurityPanel.ts +99 -107
- package/front_end/panels/security/SecurityPanelSidebar.ts +7 -7
- package/front_end/panels/security/security-meta.ts +2 -2
- package/front_end/panels/sensors/LocationsSettingsTab.ts +19 -19
- package/front_end/panels/sensors/SensorsView.ts +27 -27
- package/front_end/panels/sensors/sensors-meta.ts +13 -167
- package/front_end/panels/settings/AISettingsTab.ts +98 -56
- package/front_end/panels/settings/EditFileSystemView.ts +2 -2
- package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +20 -20
- package/front_end/panels/settings/KeybindsSettingsTab.ts +20 -21
- package/front_end/panels/settings/SettingsScreen.ts +11 -11
- package/front_end/panels/settings/WorkspaceSettingsTab.ts +5 -5
- package/front_end/panels/settings/components/SyncSection.ts +12 -12
- package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +13 -13
- package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +31 -31
- package/front_end/panels/settings/emulation/emulation-meta.ts +1 -1
- package/front_end/panels/settings/settings-meta.ts +14 -14
- package/front_end/panels/sources/NavigatorView.ts +7 -6
- package/front_end/panels/sources/ScopeChainSidebarPane.ts +83 -37
- package/front_end/panels/sources/SourcesNavigator.ts +20 -18
- package/front_end/panels/sources/SourcesView.ts +10 -1
- package/front_end/panels/sources/scopeChainSidebarPane.css +12 -4
- package/front_end/panels/sources/sources-meta.ts +4 -4
- package/front_end/panels/timeline/CompatibilityTracksAppender.ts +5 -2
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +2 -1
- package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +2 -1
- package/front_end/panels/timeline/TimelineFlameChartView.ts +1 -1
- package/front_end/panels/timeline/TimelinePanel.ts +2 -1
- package/front_end/panels/timeline/TimelineUIUtils.ts +5 -2
- package/front_end/panels/timeline/components/NetworkRequestDetails.ts +4 -2
- package/front_end/panels/timeline/components/NetworkRequestTooltip.ts +4 -2
- package/front_end/panels/timeline/components/insights/ImageRef.ts +2 -1
- package/front_end/panels/utils/utils.ts +7 -3
- package/front_end/panels/web_audio/WebAudioView.ts +17 -18
- package/front_end/panels/web_audio/web_audio-meta.ts +3 -3
- package/front_end/panels/webauthn/WebauthnPane.ts +10 -10
- package/front_end/panels/whats_new/ReleaseNoteView.ts +1 -1
- package/front_end/panels/whats_new/whats_new-meta.ts +11 -11
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/lit/lib/async-directive.d.ts +2 -1
- package/front_end/third_party/lit/lib/async-directive.js +1 -1
- package/front_end/third_party/lit/lib/async-directive.js.map +1 -1
- package/front_end/third_party/lit/lib/decorators.d.ts +2 -1
- package/front_end/third_party/lit/lib/decorators.js.map +1 -1
- package/front_end/third_party/lit/lib/directive.d.ts +2 -1
- package/front_end/third_party/lit/lib/directive.js.map +1 -1
- package/front_end/third_party/lit/lib/directives.d.ts +2 -1
- package/front_end/third_party/lit/lib/directives.js +8 -8
- package/front_end/third_party/lit/lib/directives.js.map +1 -1
- package/front_end/third_party/lit/lib/lit.d.ts +2 -1
- package/front_end/third_party/lit/lib/lit.js +1 -1
- package/front_end/third_party/lit/lib/lit.js.map +1 -1
- package/front_end/third_party/lit/lib/static-html.d.ts +2 -1
- package/front_end/third_party/lit/lib/static-html.js +1 -1
- package/front_end/third_party/lit/lib/static-html.js.map +1 -1
- package/front_end/third_party/lit/package.json +2 -2
- package/front_end/third_party/lit/rebuild.sh +1 -1
- package/front_end/third_party/lit/src/async-directive.ts +5 -0
- package/front_end/ui/components/dialogs/Dialog.ts +1 -1
- package/front_end/ui/components/dialogs/ShortcutDialog.ts +1 -1
- package/front_end/ui/components/dialogs/shortcutDialog.css +15 -12
- package/front_end/ui/components/diff_view/DiffView.ts +2 -2
- package/front_end/ui/components/issue_counter/IssueCounter.ts +3 -3
- package/front_end/ui/components/issue_counter/IssueLinkIcon.ts +5 -5
- package/front_end/ui/components/lists/List.ts +2 -2
- package/front_end/ui/components/panel_feedback/PreviewToggle.ts +1 -1
- package/front_end/ui/components/request_link_icon/RequestLinkIcon.ts +5 -5
- package/front_end/ui/components/settings/SettingCheckbox.ts +1 -1
- package/front_end/ui/components/snackbars/Snackbar.ts +1 -1
- package/front_end/ui/components/survey_link/SurveyLink.ts +3 -3
- package/front_end/ui/components/text_editor/config.ts +2 -2
- package/front_end/ui/components/tree_outline/TreeOutline.ts +34 -1
- package/front_end/ui/legacy/ReportView.ts +5 -0
- package/front_end/ui/legacy/Treeoutline.ts +18 -0
- package/front_end/ui/legacy/View.ts +1 -1
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +2 -0
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +8 -3
- package/front_end/ui/legacy/components/data_grid/data_grid.ts +1 -0
- package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +1 -1
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +100 -36
- package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +7 -1
- package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +5 -0
- package/front_end/ui/legacy/components/utils/ImagePreview.ts +4 -2
- package/front_end/ui/legacy/inspectorCommon.css +5 -0
- package/front_end/ui/visual_logging/KnownContextValues.ts +4 -0
- package/mcp/mcp.ts +2 -0
- package/package.json +4 -4
- package/front_end/panels/profiler/ProfileView.ts +0 -610
|
@@ -1,128 +1,222 @@
|
|
|
1
1
|
// Copyright 2020 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-imperative-dom-api */
|
|
5
4
|
|
|
6
5
|
import type * as Common from '../../core/common/common.js';
|
|
6
|
+
import * as i18n from '../../core/i18n/i18n.js';
|
|
7
7
|
import * as SDK from '../../core/sdk/sdk.js';
|
|
8
8
|
import * as TreeOutline from '../../ui/components/tree_outline/tree_outline.js';
|
|
9
9
|
import * as UI from '../../ui/legacy/legacy.js';
|
|
10
|
+
import * as Lit from '../../ui/lit/lit.js';
|
|
10
11
|
import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
|
|
11
12
|
|
|
12
13
|
import * as AccessibilityTreeUtils from './AccessibilityTreeUtils.js';
|
|
13
14
|
import accessibilityTreeViewStyles from './accessibilityTreeView.css.js';
|
|
14
15
|
import {ElementsPanel} from './ElementsPanel.js';
|
|
15
16
|
|
|
17
|
+
const {html, render, Directives: {ref}} = Lit;
|
|
18
|
+
const UIStrings = {
|
|
19
|
+
/**
|
|
20
|
+
* @description Text for copying, copy should be used as a verb
|
|
21
|
+
*/
|
|
22
|
+
copy: 'Copy',
|
|
23
|
+
} as const;
|
|
24
|
+
const str_ = i18n.i18n.registerUIStrings('panels/elements/AccessibilityTreeView.ts', UIStrings);
|
|
25
|
+
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
26
|
+
|
|
27
|
+
export interface ViewInput {
|
|
28
|
+
nodes: AccessibilityTreeUtils.AXTreeNode[];
|
|
29
|
+
onNodeSelected: (node: SDK.AccessibilityModel.AccessibilityNode) => void;
|
|
30
|
+
onNodeHighlight: (node: SDK.AccessibilityModel.AccessibilityNode) => void;
|
|
31
|
+
onNodeClearHighlight: () => void;
|
|
32
|
+
onCopy: (node: SDK.AccessibilityModel.AccessibilityNode) => void;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ViewOutput {
|
|
36
|
+
expandRoots?(): Promise<void>;
|
|
37
|
+
revealNode?(ancestors: string[], nodeId: string): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type View = (input: ViewInput, output: ViewOutput, target: HTMLElement) => void;
|
|
41
|
+
|
|
42
|
+
export const DEFAULT_VIEW: View = (input, output, target) => {
|
|
43
|
+
const treeData: TreeOutline.TreeOutline.TreeOutlineData<AccessibilityTreeUtils.AXTreeNodeData> = {
|
|
44
|
+
defaultRenderer: AccessibilityTreeUtils.accessibilityNodeRenderer,
|
|
45
|
+
tree: input.nodes,
|
|
46
|
+
filter: node => {
|
|
47
|
+
return node.ignored() || (node.role()?.value === 'generic' && !node.name()?.value) ?
|
|
48
|
+
TreeOutline.TreeOutline.FilterOption.FLATTEN :
|
|
49
|
+
TreeOutline.TreeOutline.FilterOption.SHOW;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const onTreeOutlineRef = (el?: Element): void => {
|
|
54
|
+
const treeOutline = el as TreeOutline.TreeOutline.TreeOutline<AccessibilityTreeUtils.AXTreeNodeData>| undefined;
|
|
55
|
+
if (treeOutline) {
|
|
56
|
+
output.expandRoots = () => treeOutline.expandRecursively(1);
|
|
57
|
+
output.revealNode = (ancestors: string[], nodeId: string) =>
|
|
58
|
+
treeOutline.expandNodeIds(ancestors).then(() => treeOutline.focusNodeId(nodeId));
|
|
59
|
+
} else {
|
|
60
|
+
output.expandRoots = undefined;
|
|
61
|
+
output.revealNode = undefined;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
let selectedAXNode: SDK.AccessibilityModel.AccessibilityNode|null = null;
|
|
66
|
+
|
|
67
|
+
const onItemSelected =
|
|
68
|
+
(event: TreeOutline.TreeOutline.ItemSelectedEvent<AccessibilityTreeUtils.AXTreeNodeData>): void => {
|
|
69
|
+
selectedAXNode = event.data.node.treeNodeData;
|
|
70
|
+
input.onNodeSelected(selectedAXNode);
|
|
71
|
+
};
|
|
72
|
+
const onItemMouseOver =
|
|
73
|
+
(event: TreeOutline.TreeOutline.ItemMouseOverEvent<AccessibilityTreeUtils.AXTreeNodeData>): void => {
|
|
74
|
+
input.onNodeHighlight(event.data.node.treeNodeData);
|
|
75
|
+
};
|
|
76
|
+
const onItemMouseOut = (): void => {
|
|
77
|
+
input.onNodeClearHighlight();
|
|
78
|
+
};
|
|
79
|
+
const onItemContextMenu =
|
|
80
|
+
(event: TreeOutline.TreeOutline.ItemContextMenuEvent<AccessibilityTreeUtils.AXTreeNodeData>): void => {
|
|
81
|
+
event.data.originalEvent.preventDefault();
|
|
82
|
+
event.data.originalEvent.stopPropagation();
|
|
83
|
+
const contextMenu = new UI.ContextMenu.ContextMenu(event.data.originalEvent);
|
|
84
|
+
const axNode = event.data.node.treeNodeData;
|
|
85
|
+
contextMenu.clipboardSection().appendItem(i18nString(UIStrings.copy), () => input.onCopy(axNode),
|
|
86
|
+
{jslogContext: 'copy'});
|
|
87
|
+
void contextMenu.show();
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const onCopy = (event: ClipboardEvent): void => {
|
|
91
|
+
event.preventDefault();
|
|
92
|
+
event.stopPropagation();
|
|
93
|
+
if (selectedAXNode) {
|
|
94
|
+
input.onCopy(selectedAXNode);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// clang-format off
|
|
99
|
+
render(html`
|
|
100
|
+
<div class="accessibility-tree-view-container" jslog=${VisualLogging.tree('full-accessibility')} @copy=${onCopy}>
|
|
101
|
+
<devtools-tree-outline .data=${treeData}
|
|
102
|
+
@itemselected=${onItemSelected}
|
|
103
|
+
@itemmouseover=${onItemMouseOver}
|
|
104
|
+
@itemmouseout=${onItemMouseOut}
|
|
105
|
+
@itemcontextmenu=${onItemContextMenu}
|
|
106
|
+
${ref(onTreeOutlineRef)}></devtools-tree-outline>
|
|
107
|
+
</div>
|
|
108
|
+
`, target);
|
|
109
|
+
// clang-format on
|
|
110
|
+
};
|
|
16
111
|
export class AccessibilityTreeView extends UI.Widget.VBox implements
|
|
17
112
|
SDK.TargetManager.SDKModelObserver<SDK.AccessibilityModel.AccessibilityModel> {
|
|
18
|
-
private accessibilityTreeComponent: TreeOutline.TreeOutline.TreeOutline<AccessibilityTreeUtils.AXTreeNodeData>;
|
|
19
113
|
private inspectedDOMNode: SDK.DOMModel.DOMNode|null = null;
|
|
20
114
|
private root: SDK.AccessibilityModel.AccessibilityNode|null = null;
|
|
21
115
|
|
|
116
|
+
readonly #view: View;
|
|
22
117
|
readonly #frameManager: SDK.FrameManager.FrameManager;
|
|
118
|
+
readonly #treeOperations: ViewOutput = {};
|
|
23
119
|
|
|
24
|
-
constructor(
|
|
120
|
+
constructor(view: View = DEFAULT_VIEW,
|
|
25
121
|
frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance()) {
|
|
26
122
|
super();
|
|
123
|
+
this.#view = view;
|
|
27
124
|
this.registerRequiredCSS(accessibilityTreeViewStyles);
|
|
28
|
-
this.accessibilityTreeComponent = accessibilityTreeComponent;
|
|
29
125
|
this.#frameManager = frameManager;
|
|
30
126
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
container.setAttribute('jslog', `${VisualLogging.tree('full-accessibility')}`);
|
|
35
|
-
container.appendChild(this.accessibilityTreeComponent);
|
|
127
|
+
SDK.TargetManager.TargetManager.instance().observeModels(SDK.AccessibilityModel.AccessibilityModel, this,
|
|
128
|
+
{scoped: true});
|
|
129
|
+
}
|
|
36
130
|
|
|
37
|
-
|
|
38
|
-
|
|
131
|
+
#onNodeSelected = (axNode: SDK.AccessibilityModel.AccessibilityNode): void => {
|
|
132
|
+
if (!axNode.isDOMNode()) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const deferredNode = axNode.deferredDOMNode();
|
|
136
|
+
if (deferredNode) {
|
|
137
|
+
deferredNode.resolve(domNode => {
|
|
138
|
+
if (domNode) {
|
|
139
|
+
this.inspectedDOMNode = domNode;
|
|
140
|
+
void ElementsPanel.instance().revealAndSelectNode(
|
|
141
|
+
domNode, {showPanel: true, focusNode: true, highlightInOverlay: true});
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
};
|
|
39
146
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
this.accessibilityTreeComponent.addEventListener('itemselected', (event: Event) => {
|
|
44
|
-
const evt = event as TreeOutline.TreeOutline.ItemSelectedEvent<AccessibilityTreeUtils.AXTreeNodeData>;
|
|
45
|
-
const axNode = evt.data.node.treeNodeData;
|
|
46
|
-
if (!axNode.isDOMNode()) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const deferredNode = axNode.deferredDOMNode();
|
|
50
|
-
if (deferredNode) {
|
|
51
|
-
deferredNode.resolve(domNode => {
|
|
52
|
-
if (domNode) {
|
|
53
|
-
this.inspectedDOMNode = domNode;
|
|
54
|
-
void ElementsPanel.instance().revealAndSelectNode(
|
|
55
|
-
domNode, {showPanel: true, focusNode: true, highlightInOverlay: true});
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
});
|
|
147
|
+
#onNodeHighlight = (axNode: SDK.AccessibilityModel.AccessibilityNode): void => {
|
|
148
|
+
axNode.highlightDOMNode();
|
|
149
|
+
};
|
|
60
150
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
});
|
|
151
|
+
#onNodeClearHighlight = (): void => {
|
|
152
|
+
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
|
|
153
|
+
};
|
|
65
154
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
155
|
+
#onCopy = async(axNode: SDK.AccessibilityModel.AccessibilityNode): Promise<void> => {
|
|
156
|
+
const text = await axNode.axNodeToText();
|
|
157
|
+
UI.UIUtils.copyTextToClipboard(text);
|
|
158
|
+
};
|
|
70
159
|
|
|
71
160
|
override async wasShown(): Promise<void> {
|
|
72
161
|
super.wasShown();
|
|
162
|
+
this.requestUpdate();
|
|
73
163
|
await this.refreshAccessibilityTree();
|
|
74
164
|
if (this.inspectedDOMNode) {
|
|
75
165
|
await this.loadSubTreeIntoAccessibilityModel(this.inspectedDOMNode);
|
|
76
166
|
}
|
|
77
167
|
}
|
|
78
168
|
|
|
79
|
-
async
|
|
169
|
+
override async performUpdate(): Promise<void> {
|
|
170
|
+
let nodes: AccessibilityTreeUtils.AXTreeNode[] = [];
|
|
80
171
|
if (!this.root) {
|
|
81
172
|
const frameId = this.#frameManager.getOutermostFrame()?.id;
|
|
82
|
-
if (
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
this.root = await AccessibilityTreeUtils.getRootNode(frameId, this.#frameManager);
|
|
86
|
-
if (!this.root) {
|
|
87
|
-
throw new Error('No root');
|
|
173
|
+
if (frameId) {
|
|
174
|
+
this.root = await SDK.AccessibilityModel.getRootNode(frameId, this.#frameManager);
|
|
88
175
|
}
|
|
89
176
|
}
|
|
90
|
-
|
|
91
|
-
|
|
177
|
+
if (this.root) {
|
|
178
|
+
nodes = await AccessibilityTreeUtils.sdkNodeToAXTreeNodes(this.root);
|
|
179
|
+
}
|
|
180
|
+
const input: ViewInput = {
|
|
181
|
+
nodes,
|
|
182
|
+
onNodeSelected: this.#onNodeSelected,
|
|
183
|
+
onNodeHighlight: this.#onNodeHighlight,
|
|
184
|
+
onNodeClearHighlight: this.#onNodeClearHighlight,
|
|
185
|
+
onCopy: this.#onCopy,
|
|
186
|
+
};
|
|
187
|
+
this.#view(input, this.#treeOperations, this.contentElement);
|
|
92
188
|
}
|
|
93
189
|
|
|
94
|
-
async
|
|
190
|
+
async refreshAccessibilityTree(): Promise<void> {
|
|
95
191
|
if (!this.root) {
|
|
96
192
|
const frameId = this.#frameManager.getOutermostFrame()?.id;
|
|
97
|
-
if (frameId) {
|
|
98
|
-
|
|
193
|
+
if (!frameId) {
|
|
194
|
+
throw new Error('No top frame');
|
|
195
|
+
}
|
|
196
|
+
this.root = await SDK.AccessibilityModel.getRootNode(frameId, this.#frameManager);
|
|
197
|
+
if (!this.root) {
|
|
198
|
+
throw new Error('No root');
|
|
99
199
|
}
|
|
100
200
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const treeData = await AccessibilityTreeUtils.sdkNodeToAXTreeNodes(this.root, this.#frameManager);
|
|
105
|
-
this.accessibilityTreeComponent.data = {
|
|
106
|
-
defaultRenderer: AccessibilityTreeUtils.accessibilityNodeRenderer,
|
|
107
|
-
tree: treeData,
|
|
108
|
-
filter: node => {
|
|
109
|
-
return node.ignored() || (node.role()?.value === 'generic' && !node.name()?.value) ?
|
|
110
|
-
TreeOutline.TreeOutline.FilterOption.FLATTEN :
|
|
111
|
-
TreeOutline.TreeOutline.FilterOption.SHOW;
|
|
112
|
-
},
|
|
113
|
-
};
|
|
201
|
+
this.requestUpdate();
|
|
202
|
+
await this.updateComplete;
|
|
203
|
+
await this.#treeOperations.expandRoots?.();
|
|
114
204
|
}
|
|
115
205
|
|
|
116
206
|
// Given a selected DOM node, asks the model to load the missing subtree from the root to the
|
|
117
207
|
// selected node and then re-renders the tree.
|
|
118
208
|
async loadSubTreeIntoAccessibilityModel(selectedNode: SDK.DOMModel.DOMNode): Promise<void> {
|
|
119
|
-
const ancestors = await
|
|
209
|
+
const ancestors = await SDK.AccessibilityModel.getNodeAndAncestorsFromDOMNode(selectedNode);
|
|
120
210
|
const inspectedAXNode = ancestors.find(node => node.backendDOMNodeId() === selectedNode.backendNodeId());
|
|
121
211
|
if (!inspectedAXNode) {
|
|
122
212
|
return;
|
|
123
213
|
}
|
|
124
|
-
|
|
125
|
-
await this.
|
|
214
|
+
this.requestUpdate();
|
|
215
|
+
await this.updateComplete;
|
|
216
|
+
await this.#treeOperations.revealNode?.(
|
|
217
|
+
ancestors.map(node => node.getFrameId() + '#' + node.id()),
|
|
218
|
+
inspectedAXNode.getNodeId(),
|
|
219
|
+
);
|
|
126
220
|
}
|
|
127
221
|
|
|
128
222
|
// A node was revealed through the elements picker.
|
|
@@ -160,16 +254,15 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
|
|
|
160
254
|
}
|
|
161
255
|
if (!data.root) {
|
|
162
256
|
this.root = null;
|
|
163
|
-
|
|
257
|
+
this.requestUpdate();
|
|
164
258
|
return;
|
|
165
259
|
}
|
|
166
260
|
const outermostFrameId = this.#frameManager.getOutermostFrame()?.id;
|
|
167
261
|
if (data.root?.getFrameId() !== outermostFrameId) {
|
|
168
|
-
|
|
262
|
+
this.requestUpdate();
|
|
169
263
|
return;
|
|
170
264
|
}
|
|
171
265
|
this.root = data.root;
|
|
172
|
-
void this.accessibilityTreeComponent.collapseAllNodes();
|
|
173
266
|
|
|
174
267
|
void this.refreshAccessibilityTree();
|
|
175
268
|
}
|
|
@@ -43,11 +43,9 @@ import type * as Protocol from '../../generated/protocol.js';
|
|
|
43
43
|
import * as ComputedStyle from '../../models/computed_style/computed_style.js';
|
|
44
44
|
import * as PanelCommon from '../../panels/common/common.js';
|
|
45
45
|
import type * as Adorners from '../../ui/components/adorners/adorners.js';
|
|
46
|
-
import * as TreeOutline from '../../ui/components/tree_outline/tree_outline.js';
|
|
47
46
|
import * as UI from '../../ui/legacy/legacy.js';
|
|
48
47
|
import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
|
|
49
48
|
|
|
50
|
-
import type {AXTreeNodeData} from './AccessibilityTreeUtils.js';
|
|
51
49
|
import {AccessibilityTreeView} from './AccessibilityTreeView.js';
|
|
52
50
|
import {ColorSwatchPopoverIcon} from './ColorSwatchPopoverIcon.js';
|
|
53
51
|
import * as ElementsComponents from './components/components.js';
|
|
@@ -269,7 +267,7 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
|
|
|
269
267
|
this.#settings.moduleSetting('dom-word-wrap').addChangeListener(this.domWordWrapSettingChanged.bind(this));
|
|
270
268
|
|
|
271
269
|
crumbsContainer.id = 'elements-crumbs';
|
|
272
|
-
this.accessibilityTreeView = new AccessibilityTreeView(
|
|
270
|
+
this.accessibilityTreeView = new AccessibilityTreeView();
|
|
273
271
|
this.breadcrumbs = new ElementsComponents.ElementsBreadcrumbs.ElementsBreadcrumbs();
|
|
274
272
|
this.breadcrumbs.addEventListener('breadcrumbsnodeselected', event => {
|
|
275
273
|
this.crumbNodeSelected(event);
|
|
@@ -317,8 +315,9 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
|
|
|
317
315
|
this.#domTreeWidget.setWordWrap(this.#settings.moduleSetting('dom-word-wrap').get());
|
|
318
316
|
|
|
319
317
|
this.#targetManager.observeModels(SDK.DOMModel.DOMModel, this, {scoped: true});
|
|
320
|
-
this.#targetManager.
|
|
321
|
-
|
|
318
|
+
this.#targetManager.addModelListener(SDK.ResourceTreeModel.ResourceTreeModel,
|
|
319
|
+
SDK.ResourceTreeModel.Events.PrimaryPageChanged, this.onPrimaryPageChanged,
|
|
320
|
+
this, {scoped: true});
|
|
322
321
|
this.#settings.moduleSetting('show-ua-shadow-dom').addChangeListener(this.showUAShadowDOMChanged.bind(this));
|
|
323
322
|
PanelCommon.ExtensionServer.ExtensionServer.instance().addEventListener(
|
|
324
323
|
PanelCommon.ExtensionServer.Events.SidebarPaneAdded, this.extensionSidebarPaneAdded, this);
|
|
@@ -467,10 +466,15 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
|
|
|
467
466
|
});
|
|
468
467
|
}
|
|
469
468
|
|
|
470
|
-
private
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
469
|
+
private onPrimaryPageChanged(
|
|
470
|
+
event: Common.EventTarget.EventTargetEvent<
|
|
471
|
+
{frame: SDK.ResourceTreeModel.ResourceTreeFrame, type: SDK.ResourceTreeModel.PrimaryPageChangeType}>): void {
|
|
472
|
+
const {frame, type} = event.data;
|
|
473
|
+
if (type === SDK.ResourceTreeModel.PrimaryPageChangeType.ACTIVATION) {
|
|
474
|
+
const domModel = frame.resourceTreeModel().target().model(SDK.DOMModel.DOMModel);
|
|
475
|
+
if (domModel && !domModel.parentModel()) {
|
|
476
|
+
this.#domTreeWidget.show(this.domTreeContainer);
|
|
477
|
+
}
|
|
474
478
|
}
|
|
475
479
|
}
|
|
476
480
|
|
|
@@ -502,7 +506,7 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
|
|
|
502
506
|
}
|
|
503
507
|
|
|
504
508
|
override willHide(): void {
|
|
505
|
-
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
|
|
509
|
+
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
|
|
506
510
|
this.evaluateTrackingComputedStyleUpdatesForNode();
|
|
507
511
|
this.#domTreeWidget.detach();
|
|
508
512
|
super.willHide();
|
|
@@ -551,7 +555,9 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
|
|
|
551
555
|
if (!selectedNode) {
|
|
552
556
|
return;
|
|
553
557
|
}
|
|
554
|
-
|
|
558
|
+
if (selectedNode.canInspectNode()) {
|
|
559
|
+
void selectedNode.setAsInspectedNode();
|
|
560
|
+
}
|
|
555
561
|
if (focus) {
|
|
556
562
|
this.selectedNodeOnReset = selectedNode;
|
|
557
563
|
this.hasNonDefaultSelectedNode = true;
|
|
@@ -145,6 +145,11 @@ const UIStrings = {
|
|
|
145
145
|
* @description Text to paste an element, paste should be used as a verb
|
|
146
146
|
*/
|
|
147
147
|
paste: 'Paste',
|
|
148
|
+
/**
|
|
149
|
+
* @description Context menu item in the Edit as HTML editor that selects the editor's entire
|
|
150
|
+
* contents. "Select all" should be used as a verb.
|
|
151
|
+
*/
|
|
152
|
+
selectAll: 'Select all',
|
|
148
153
|
/**
|
|
149
154
|
* @description Text in Elements Tree Element of the Elements panel, copy should be used as a verb
|
|
150
155
|
*/
|
|
@@ -459,6 +464,7 @@ export interface ViewInput {
|
|
|
459
464
|
|
|
460
465
|
isHovered: boolean;
|
|
461
466
|
isSelected: boolean;
|
|
467
|
+
canInspect: boolean;
|
|
462
468
|
showAiButton: boolean;
|
|
463
469
|
aiButtonTitle?: string;
|
|
464
470
|
onAiButtonClick: (e: Event) => void;
|
|
@@ -1173,7 +1179,7 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
|
|
|
1173
1179
|
<span>${ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL_SNAP}</span>
|
|
1174
1180
|
</devtools-adorner>` : nothing}
|
|
1175
1181
|
</div>`: nothing}
|
|
1176
|
-
${input.isSelected ? html`
|
|
1182
|
+
${input.isSelected && input.canInspect ? html`
|
|
1177
1183
|
<span class="selected-hint ${input.editorState ? 'hidden' : ''}" title=${i18nString(UIStrings.useSInTheConsoleToReferToThis, { PH1: '$0' })} aria-hidden="true"></span>
|
|
1178
1184
|
` : nothing}
|
|
1179
1185
|
${input.showAiButton ? html`
|
|
@@ -1212,6 +1218,9 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
|
|
|
1212
1218
|
#hovered: boolean;
|
|
1213
1219
|
private editing: EditorHandles|null;
|
|
1214
1220
|
#editorRef?: TextEditor.TextEditor.TextEditor;
|
|
1221
|
+
// True while the Edit as HTML editor's own context menu is open, so that the
|
|
1222
|
+
// focusout caused by the menu taking focus does not commit the edit.
|
|
1223
|
+
#editAsHtmlMenuOpen = false;
|
|
1215
1224
|
#editorState: CodeMirror.EditorState|null = null;
|
|
1216
1225
|
#editorWidth: number|null = null;
|
|
1217
1226
|
expandAllButtonElement: UI.TreeOutline.TreeElement|null;
|
|
@@ -1430,6 +1439,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
|
|
|
1430
1439
|
},
|
|
1431
1440
|
isHovered: this.#hovered,
|
|
1432
1441
|
isSelected: this.selected,
|
|
1442
|
+
canInspect: this.node().canInspectNode(),
|
|
1433
1443
|
showAiButton: Boolean(this.#hovered || this.selected) && this.node().nodeType() === Node.ELEMENT_NODE &&
|
|
1434
1444
|
this.isAiButtonEnabled() && (this.treeOutline as ElementsTreeOutline)?.showAIButton,
|
|
1435
1445
|
aiButtonTitle: this.isAiButtonEnabled() ?
|
|
@@ -1806,6 +1816,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
|
|
|
1806
1816
|
onTopLayerAdornerClick: () => {},
|
|
1807
1817
|
isHovered: false,
|
|
1808
1818
|
isSelected: false,
|
|
1819
|
+
canInspect: false,
|
|
1809
1820
|
showAiButton: false,
|
|
1810
1821
|
onAiButtonClick: () => {},
|
|
1811
1822
|
decorations: [],
|
|
@@ -2691,7 +2702,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
|
|
|
2691
2702
|
}),
|
|
2692
2703
|
CodeMirror.EditorView.domEventHandlers({
|
|
2693
2704
|
focusout: event => {
|
|
2694
|
-
if (!this.#editorRef) {
|
|
2705
|
+
if (!this.#editorRef || this.#editAsHtmlMenuOpen) {
|
|
2695
2706
|
return;
|
|
2696
2707
|
}
|
|
2697
2708
|
// The relatedTarget is null when no element gains focus, e.g. switching windows.
|
|
@@ -2700,6 +2711,42 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
|
|
|
2700
2711
|
this.editing?.commit();
|
|
2701
2712
|
}
|
|
2702
2713
|
},
|
|
2714
|
+
contextmenu: (event, view) => {
|
|
2715
|
+
// The editor virtualizes its content, so the browser's native
|
|
2716
|
+
// "Select all" only reaches the rendered lines. Show a menu whose
|
|
2717
|
+
// "Select all" spans the whole document, like Ctrl/Cmd+A.
|
|
2718
|
+
event.consume(true);
|
|
2719
|
+
const {from, to, empty} = view.state.selection.main;
|
|
2720
|
+
const copy = (): void =>
|
|
2721
|
+
Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(view.state.sliceDoc(from, to));
|
|
2722
|
+
const contextMenu = new UI.ContextMenu.ContextMenu(event, {
|
|
2723
|
+
onSoftMenuClosed: () => {
|
|
2724
|
+
this.#editAsHtmlMenuOpen = false;
|
|
2725
|
+
},
|
|
2726
|
+
});
|
|
2727
|
+
contextMenu.clipboardSection().appendItem(i18nString(UIStrings.cut), () => {
|
|
2728
|
+
copy();
|
|
2729
|
+
view.dispatch({changes: {from, to, insert: ''}});
|
|
2730
|
+
view.focus();
|
|
2731
|
+
}, {disabled: empty, jslogContext: 'cut'});
|
|
2732
|
+
contextMenu.clipboardSection().appendItem(i18nString(UIStrings.copy), () => {
|
|
2733
|
+
copy();
|
|
2734
|
+
view.focus();
|
|
2735
|
+
}, {disabled: empty, jslogContext: 'copy'});
|
|
2736
|
+
contextMenu.clipboardSection().appendItem(i18nString(UIStrings.paste), () => {
|
|
2737
|
+
void navigator.clipboard.readText().then(text => {
|
|
2738
|
+
view.dispatch(view.state.replaceSelection(text));
|
|
2739
|
+
view.focus();
|
|
2740
|
+
});
|
|
2741
|
+
}, {jslogContext: 'paste'});
|
|
2742
|
+
contextMenu.editSection().appendItem(i18nString(UIStrings.selectAll), () => {
|
|
2743
|
+
view.dispatch({selection: {anchor: 0, head: view.state.doc.length}});
|
|
2744
|
+
view.focus();
|
|
2745
|
+
}, {jslogContext: 'select-all'});
|
|
2746
|
+
this.#editAsHtmlMenuOpen = true;
|
|
2747
|
+
void contextMenu.show();
|
|
2748
|
+
return true;
|
|
2749
|
+
},
|
|
2703
2750
|
}),
|
|
2704
2751
|
],
|
|
2705
2752
|
});
|
|
@@ -1348,7 +1348,7 @@ export class ElementsTreeOutline extends
|
|
|
1348
1348
|
}
|
|
1349
1349
|
|
|
1350
1350
|
private onfocusout(_event: Event): void {
|
|
1351
|
-
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
|
|
1351
|
+
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
|
|
1352
1352
|
}
|
|
1353
1353
|
|
|
1354
1354
|
private onmousedown(event: MouseEvent): void {
|
|
@@ -1401,7 +1401,7 @@ export class ElementsTreeOutline extends
|
|
|
1401
1401
|
|
|
1402
1402
|
private onmouseleave(_event: MouseEvent): void {
|
|
1403
1403
|
this.setHoverEffect(null);
|
|
1404
|
-
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
|
|
1404
|
+
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
|
|
1405
1405
|
}
|
|
1406
1406
|
|
|
1407
1407
|
private ondragstart(event: DragEvent): boolean|undefined {
|
|
@@ -1429,7 +1429,7 @@ export class ElementsTreeOutline extends
|
|
|
1429
1429
|
event.dataTransfer.effectAllowed = 'copyMove';
|
|
1430
1430
|
this.treeElementBeingDragged = treeElement;
|
|
1431
1431
|
|
|
1432
|
-
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
|
|
1432
|
+
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
|
|
1433
1433
|
|
|
1434
1434
|
return true;
|
|
1435
1435
|
}
|
|
@@ -1790,7 +1790,7 @@ export class ElementsTreeOutline extends
|
|
|
1790
1790
|
this.selectDOMNode(null, false);
|
|
1791
1791
|
this.imagePreviewPopover.hide();
|
|
1792
1792
|
delete this.clipboardNodeData;
|
|
1793
|
-
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
|
|
1793
|
+
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
|
|
1794
1794
|
this.updateRecords.clear();
|
|
1795
1795
|
}
|
|
1796
1796
|
|
|
@@ -116,7 +116,7 @@ const nodeToLayoutElement = (node: SDK.DOMModel.DOMNode): LayoutElement => {
|
|
|
116
116
|
node.highlight();
|
|
117
117
|
},
|
|
118
118
|
hideHighlight: () => {
|
|
119
|
-
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
|
|
119
|
+
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
|
|
120
120
|
},
|
|
121
121
|
toggle: (_value: boolean) => {
|
|
122
122
|
throw new Error('Not implemented');
|