chrome-devtools-frontend 1.0.1652307 → 1.0.1656291
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/fixing-skipped-tests/SKILL.md +32 -0
- package/.agents/skills/migrate-chromium-test/SKILL.md +144 -0
- package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +116 -0
- package/.agents/skills/ui-eng-vision-logic-consolidator/SKILL.md +82 -0
- package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +123 -0
- package/.agents/skills/ui-eng-vision-test-scaffolder/SKILL.md +125 -0
- package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +75 -0
- package/AUTHORS +1 -0
- package/config/owner/COMMON_OWNERS +0 -4
- package/docs/get_the_code.md +1 -2
- package/docs/playbook.md +1 -1
- package/docs/ui_engineering.md +3 -1
- package/eslint.config.mjs +0 -5
- package/front_end/Tests.js +1 -0
- package/front_end/core/common/Settings.ts +47 -30
- package/front_end/core/sdk/CPUThrottlingManager.ts +23 -167
- package/front_end/core/sdk/CSSMetadata.ts +23 -0
- package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +8 -4
- package/front_end/core/sdk/ConsoleModel.ts +13 -11
- package/front_end/core/sdk/DOMDebuggerModel.ts +11 -5
- package/front_end/core/sdk/DOMModel.ts +4 -0
- package/front_end/core/sdk/EmulationModel.ts +4 -0
- package/front_end/core/sdk/EventBreakpointsModel.ts +9 -5
- package/front_end/core/sdk/IsolateManager.ts +6 -6
- package/front_end/core/sdk/ResourceTreeModel.ts +8 -5
- package/front_end/core/sdk/TargetManager.ts +17 -0
- package/front_end/entrypoints/devtools_app/devtools_app.ts +0 -1
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +459 -74
- package/front_end/entrypoints/main/MainImpl.ts +12 -42
- package/front_end/foundation/Universe.ts +116 -3
- package/front_end/generated/InspectorBackendCommands.ts +11 -6
- package/front_end/generated/SupportedCSSProperties.js +124 -34
- package/front_end/generated/protocol-mapping.d.ts +8 -0
- package/front_end/generated/protocol-proxy-api.d.ts +15 -0
- package/front_end/generated/protocol.ts +94 -1
- package/front_end/models/ai_assistance/AiConversation.ts +2 -7
- package/front_end/models/ai_assistance/README.md +4 -3
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -1
- package/front_end/models/ai_assistance/agents/NetworkAgent.snapshot.txt +1 -1
- package/front_end/models/ai_assistance/agents/PerformanceAgent.snapshot.txt +2 -2
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +13 -320
- package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +0 -24
- package/front_end/models/ai_assistance/agents/StylingAgent.ts +2 -358
- package/front_end/models/ai_assistance/ai_assistance.ts +6 -8
- package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +295 -0
- package/front_end/models/ai_assistance/contexts/RequestContext.snapshot.txt +0 -1
- package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +0 -2
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +10 -10
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +12 -11
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +6 -6
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -14
- package/front_end/models/ai_assistance/skills/accessibility.md +4 -2
- package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +142 -0
- package/front_end/models/ai_assistance/tools/GetStyles.ts +1 -1
- package/front_end/models/ai_assistance/tools/README.md +21 -1
- package/front_end/models/ai_assistance/tools/{ResolveLighthousePath.ts → ResolveDevtoolsNodePath.ts} +18 -17
- package/front_end/models/ai_assistance/tools/Tool.ts +6 -1
- package/front_end/models/ai_assistance/tools/ToolRegistry.ts +4 -2
- package/front_end/models/autofill_manager/AutofillManager.ts +6 -15
- package/front_end/models/bindings/NetworkProject.ts +4 -8
- package/front_end/models/breakpoints/BreakpointManager.ts +9 -9
- package/front_end/models/emulation/DeviceModeModel.ts +24 -0
- package/front_end/models/emulation/EmulatedDevices.ts +108 -0
- package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +36 -0
- package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +8 -0
- package/front_end/models/issues_manager/IssuesManager.ts +10 -6
- package/front_end/models/javascript_metadata/JavaScriptMetadata.ts +4 -5
- package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
- package/front_end/models/live-metrics/LiveMetrics.ts +6 -6
- package/front_end/models/live-metrics/web-vitals-injected/spec/spec.ts +5 -5
- package/front_end/models/live-metrics/web-vitals-injected/web-vitals-injected.ts +3 -3
- package/front_end/models/logs/LogManager.ts +25 -10
- package/front_end/models/logs/NetworkLog.ts +24 -19
- package/front_end/models/persistence/AutomaticFileSystemManager.ts +14 -13
- package/front_end/models/persistence/AutomaticFileSystemWorkspaceBinding.ts +26 -14
- package/front_end/models/persistence/IsolatedFileSystem.ts +9 -11
- package/front_end/models/persistence/IsolatedFileSystemManager.ts +22 -11
- package/front_end/models/persistence/NetworkPersistenceManager.ts +73 -44
- package/front_end/models/persistence/PersistenceImpl.ts +4 -5
- package/front_end/models/project_settings/ProjectSettingsModel.ts +12 -11
- package/front_end/models/trace/EntityMapper.ts +1 -1
- package/front_end/models/trace/handlers/ScreenshotsHandler.ts +14 -59
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +12 -38
- package/front_end/panels/ai_assistance/ExportConversation.ts +4 -1
- package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
- package/front_end/panels/application/DeviceBoundSessionsView.ts +15 -3
- package/front_end/panels/application/FrameDetailsView.ts +2 -1
- package/front_end/panels/application/IndexedDBViews.ts +38 -36
- package/front_end/panels/application/ServiceWorkersView.ts +23 -16
- package/front_end/panels/application/components/AdsView.ts +4 -0
- package/front_end/panels/autofill/AutofillView.ts +1 -1
- package/front_end/panels/autofill/autofill-meta.ts +3 -2
- package/front_end/panels/common/CPUThrottlingOption.ts +142 -0
- package/front_end/panels/common/ThrottlingUtils.ts +9 -4
- package/front_end/panels/common/common.ts +1 -1
- package/front_end/panels/console/ConsoleViewMessage.ts +45 -0
- package/front_end/panels/elements/AccessibilityTreeUtils.ts +26 -15
- package/front_end/panels/elements/AccessibilityTreeView.ts +12 -9
- package/front_end/panels/elements/ElementsPanel.ts +0 -74
- package/front_end/panels/elements/ElementsTreeOutline.ts +5 -4
- package/front_end/panels/emulation/DeviceModeToolbar.ts +46 -45
- package/front_end/panels/layer_viewer/LayerTreeOutline.ts +118 -68
- package/front_end/panels/layer_viewer/Layers3DView.ts +1 -1
- package/front_end/panels/layer_viewer/layerTreeOutline.css +20 -13
- package/front_end/panels/layers/LayersPanel.ts +1 -1
- package/front_end/panels/mobile_throttling/CalibrationController.ts +6 -5
- package/front_end/panels/mobile_throttling/MobileThrottlingSelector.ts +1 -1
- package/front_end/panels/mobile_throttling/ThrottlingManager.ts +40 -13
- package/front_end/panels/mobile_throttling/ThrottlingPresets.ts +13 -17
- package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +79 -30
- package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +5 -0
- package/front_end/panels/network/LinkPreloadGenerator.ts +101 -0
- package/front_end/panels/network/NetworkLogView.ts +28 -9
- package/front_end/panels/network/NetworkPanel.ts +1 -63
- package/front_end/panels/network/RequestInitiatorView.ts +29 -4
- package/front_end/panels/network/components/HeaderSectionRow.css +9 -7
- package/front_end/panels/network/components/HeaderSectionRow.ts +20 -1
- package/front_end/panels/network/components/RequestHeaderSection.css +5 -3
- package/front_end/panels/network/components/RequestHeaderSection.ts +1 -2
- package/front_end/panels/network/components/RequestHeadersView.css +1 -1
- package/front_end/panels/network/network.ts +2 -0
- package/front_end/panels/profiler/HeapSnapshotView.ts +121 -33
- package/front_end/panels/profiler/ModuleUIStrings.ts +4 -0
- package/front_end/panels/security/SecurityPanel.ts +36 -23
- package/front_end/panels/settings/SettingsScreen.ts +18 -103
- package/front_end/panels/settings/settings-meta.ts +0 -24
- package/front_end/panels/timeline/TimelineController.ts +3 -2
- package/front_end/panels/timeline/TimelineHistoryManager.ts +38 -37
- package/front_end/panels/timeline/TimelinePanel.ts +52 -11
- package/front_end/panels/timeline/components/CPUThrottlingSelector.ts +20 -18
- package/front_end/panels/timeline/components/LiveMetricsView.ts +38 -38
- package/front_end/panels/timeline/components/MetricCard.ts +18 -18
- package/front_end/panels/timeline/components/liveMetricsView.css +6 -6
- package/front_end/panels/timeline/components/metricCard.css +4 -4
- package/front_end/panels/timeline/timelineFlamechartPopover.css +2 -0
- package/front_end/panels/utils/utils.ts +25 -24
- package/front_end/panels/whats_new/ReleaseNoteText.ts +3 -3
- package/front_end/panels/whats_new/resources/WNDT.md +1 -1
- 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/es5-iife/puppeteer-core-browser.d.ts +34 -55
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +96 -83
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +10 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/CDPSession.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/CDPSession.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.d.ts +3 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Target.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Target.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js +2 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Realm.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Realm.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +5 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js +23 -13
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.js +4 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Input.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/LifecycleWatcher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/LifecycleWatcher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts +3 -41
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +4 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/LaunchOptions.d.ts +5 -0
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/LaunchOptions.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.js +5 -5
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/types.d.ts +34 -55
- package/front_end/third_party/puppeteer/package/package.json +4 -4
- package/front_end/third_party/puppeteer/package/src/api/Browser.ts +13 -1
- package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +2 -3
- package/front_end/third_party/puppeteer/package/src/api/CDPSession.ts +3 -1
- package/front_end/third_party/puppeteer/package/src/api/HTTPResponse.ts +3 -2
- package/front_end/third_party/puppeteer/package/src/api/Realm.ts +1 -2
- package/front_end/third_party/puppeteer/package/src/api/Target.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/api/locators/locators.ts +1 -2
- package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +3 -1
- package/front_end/third_party/puppeteer/package/src/bidi/core/Realm.ts +1 -3
- package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +13 -3
- package/front_end/third_party/puppeteer/package/src/cdp/Frame.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/cdp/FrameManager.ts +24 -13
- package/front_end/third_party/puppeteer/package/src/cdp/HTTPResponse.ts +4 -1
- package/front_end/third_party/puppeteer/package/src/cdp/Input.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/cdp/LifecycleWatcher.ts +1 -4
- package/front_end/third_party/puppeteer/package/src/cdp/Target.ts +2 -4
- package/front_end/third_party/puppeteer/package/src/cdp/WebMCP.ts +7 -76
- package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +1 -4
- package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +4 -1
- package/front_end/third_party/puppeteer/package/src/node/LaunchOptions.ts +5 -0
- package/front_end/third_party/puppeteer/package/src/revisions.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/util/httpUtils.ts +5 -5
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/third_party/puppeteer/third_party/parsel/README.chromium +1 -1
- package/front_end/ui/components/dialogs/Dialog.ts +3 -0
- package/front_end/ui/components/markdown_view/MarkdownLinksMap.ts +0 -7
- package/front_end/ui/helpers/OpenInNewTab.ts +15 -7
- package/front_end/ui/legacy/InspectorDrawerView.ts +7 -5
- package/front_end/ui/legacy/ListWidget.ts +12 -0
- package/front_end/ui/legacy/SplitWidget.ts +12 -11
- package/front_end/ui/legacy/TabbedPane.ts +1 -108
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +9 -0
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +192 -139
- package/front_end/ui/legacy/components/data_grid/DataGridExporter.ts +89 -0
- package/front_end/ui/legacy/components/data_grid/dataGrid.css +10 -0
- package/front_end/ui/legacy/components/data_grid/data_grid.ts +3 -1
- package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +8 -1
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +110 -17
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +89 -40
- package/front_end/ui/legacy/treeoutline.css +1 -1
- package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
- package/package.json +4 -3
- package/front_end/Images/navigationControls.png +0 -0
- package/front_end/Images/navigationControls_2x.png +0 -0
- package/front_end/Images/popoverArrows.png +0 -0
- package/front_end/entrypoints/greendev_floaty/FloatyEntrypoint.ts +0 -746
- package/front_end/entrypoints/greendev_floaty/floaty.css +0 -301
- package/front_end/entrypoints/greendev_floaty/floaty.html +0 -38
- package/front_end/entrypoints/greendev_floaty/greendev_floaty.ts +0 -415
- package/front_end/models/ai_assistance/agents/GreenDevAgent.ts +0 -834
- package/front_end/models/ai_assistance/agents/GreenDevAgentAntigravityCliSocketClient.ts +0 -53
- package/front_end/models/ai_assistance/agents/GreenDevAgentGeminiCliSocketClient.ts +0 -117
- package/front_end/models/annotations/AnnotationRepository.ts +0 -238
- package/front_end/models/annotations/AnnotationType.ts +0 -10
- package/front_end/models/annotations/README.md +0 -7
- package/front_end/models/annotations/annotations.ts +0 -6
- package/front_end/models/greendev/Prototypes.ts +0 -68
- package/front_end/models/greendev/README.md +0 -5
- package/front_end/models/greendev/greendev.ts +0 -5
- package/front_end/panels/common/Annotation.ts +0 -184
- package/front_end/panels/common/AnnotationManager.ts +0 -208
- package/front_end/panels/common/annotation.css +0 -40
- package/front_end/panels/greendev/GreenDevPanel.css +0 -282
- package/front_end/panels/greendev/GreenDevPanel.ts +0 -364
- package/front_end/panels/greendev/GreenDevShared.ts +0 -13
- package/front_end/panels/greendev/greendev-meta.ts +0 -52
- package/front_end/panels/greendev/greendev.ts +0 -9
|
@@ -5,8 +5,14 @@
|
|
|
5
5
|
import * as SDK from '../../core/sdk/sdk.js';
|
|
6
6
|
import * as CrUXManager from '../../models/crux-manager/crux-manager.js';
|
|
7
7
|
|
|
8
|
+
import {
|
|
9
|
+
CalibratedMidTierMobileThrottlingOption,
|
|
10
|
+
type CPUThrottlingOption,
|
|
11
|
+
MidTierThrottlingOption,
|
|
12
|
+
} from './CPUThrottlingOption.js';
|
|
13
|
+
|
|
8
14
|
export interface ThrottlingRecommendations {
|
|
9
|
-
cpuOption:
|
|
15
|
+
cpuOption: CPUThrottlingOption|null;
|
|
10
16
|
networkConditions: SDK.NetworkManager.Conditions|null;
|
|
11
17
|
}
|
|
12
18
|
|
|
@@ -18,10 +24,9 @@ export function getThrottlingRecommendations(): ThrottlingRecommendations {
|
|
|
18
24
|
const cruxManager = CrUXManager.CrUXManager.instance();
|
|
19
25
|
const roundTripTimeMetricData = cruxManager.getSelectedFieldMetricData('round_trip_time');
|
|
20
26
|
|
|
21
|
-
let cpuOption:
|
|
22
|
-
SDK.CPUThrottlingManager.CalibratedMidTierMobileThrottlingOption;
|
|
27
|
+
let cpuOption: CPUThrottlingOption = CalibratedMidTierMobileThrottlingOption;
|
|
23
28
|
if (cpuOption.rate() === 0) {
|
|
24
|
-
cpuOption =
|
|
29
|
+
cpuOption = MidTierThrottlingOption;
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
const networkConditions = getRecommendedNetworkConditions(roundTripTimeMetricData);
|
|
@@ -97,13 +97,13 @@ export class TypeToAllowDialog {
|
|
|
97
97
|
export {AiCodeCompletionTeaser} from './AiCodeCompletionTeaser.js';
|
|
98
98
|
export * as AiCodeGenerationTeaser from './AiCodeGenerationTeaser.js';
|
|
99
99
|
export {AiCodeGenerationUpgradeDialog} from './AiCodeGenerationUpgradeDialog.js';
|
|
100
|
-
export {AnnotationManager} from './AnnotationManager.js';
|
|
101
100
|
export {FreDialog} from './FreDialog.js';
|
|
102
101
|
export {GdpSignUpDialog} from './GdpSignUpDialog.js';
|
|
103
102
|
export {GeminiRebrandPromoDialog} from './GeminiRebrandPromoDialog.js';
|
|
104
103
|
export {AiCodeCompletionDisclaimer} from './AiCodeCompletionDisclaimer.js';
|
|
105
104
|
export * as AiCodeCompletionSummaryToolbar from './AiCodeCompletionSummaryToolbar.js';
|
|
106
105
|
export * from './BadgeNotification.js';
|
|
106
|
+
export * as CPUThrottlingOption from './CPUThrottlingOption.js';
|
|
107
107
|
export * as ExtensionPanel from './ExtensionPanel.js';
|
|
108
108
|
export * as ExtensionServer from './ExtensionServer.js';
|
|
109
109
|
export * as ExtensionView from './ExtensionView.js';
|
|
@@ -225,6 +225,18 @@ const UIStrings = {
|
|
|
225
225
|
* @description Element title in Object Properties Section
|
|
226
226
|
*/
|
|
227
227
|
invokePropertyGetter: 'Invoke property getter',
|
|
228
|
+
/**
|
|
229
|
+
* @description Context menu item to copy table data
|
|
230
|
+
*/
|
|
231
|
+
copyTableAs: 'Copy table as',
|
|
232
|
+
/**
|
|
233
|
+
* @description Submenu item to copy table as Markdown
|
|
234
|
+
*/
|
|
235
|
+
copyAsMarkdown: 'Copy as Markdown',
|
|
236
|
+
/**
|
|
237
|
+
* @description Submenu item to copy table as CSV
|
|
238
|
+
*/
|
|
239
|
+
copyAsCsv: 'Copy as CSV',
|
|
228
240
|
} as const;
|
|
229
241
|
const str_ = i18n.i18n.registerUIStrings('panels/console/ConsoleViewMessage.ts', UIStrings);
|
|
230
242
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
@@ -2180,6 +2192,7 @@ export class ConsoleTableMessageView extends ConsoleViewMessage {
|
|
|
2180
2192
|
if (this.dataGrid) {
|
|
2181
2193
|
this.dataGrid.setStriped(true);
|
|
2182
2194
|
this.dataGrid.setFocusable(false);
|
|
2195
|
+
this.dataGrid.setTableContextMenuCallback(this.populateTableContextMenu.bind(this));
|
|
2183
2196
|
|
|
2184
2197
|
const formattedResult = document.createElement('span');
|
|
2185
2198
|
formattedResult.classList.add('console-message-text');
|
|
@@ -2205,6 +2218,38 @@ export class ConsoleTableMessageView extends ConsoleViewMessage {
|
|
|
2205
2218
|
}
|
|
2206
2219
|
return defaultConsoleRowHeight;
|
|
2207
2220
|
}
|
|
2221
|
+
|
|
2222
|
+
private populateTableContextMenu(contextMenu: UI.ContextMenu.ContextMenu): void {
|
|
2223
|
+
const copySubMenu = contextMenu.clipboardSection().appendSubMenuItem(i18nString(UIStrings.copyTableAs));
|
|
2224
|
+
copySubMenu.defaultSection().appendItem(i18nString(UIStrings.copyAsMarkdown), this.copyTableAsMarkdown.bind(this),
|
|
2225
|
+
{jslogContext: 'copy-as-markdown'});
|
|
2226
|
+
copySubMenu.defaultSection().appendItem(i18nString(UIStrings.copyAsCsv), this.copyTableAsCSV.bind(this),
|
|
2227
|
+
{jslogContext: 'copy-as-csv'});
|
|
2228
|
+
}
|
|
2229
|
+
|
|
2230
|
+
private copyTableAsMarkdown(): void {
|
|
2231
|
+
if (!this.dataGrid) {
|
|
2232
|
+
return;
|
|
2233
|
+
}
|
|
2234
|
+
const markdown = DataGrid.DataGridExporter.exportToMarkdown(this.dataGrid);
|
|
2235
|
+
UI.UIUtils.copyTextToClipboard(markdown);
|
|
2236
|
+
}
|
|
2237
|
+
|
|
2238
|
+
private copyTableAsCSV(): void {
|
|
2239
|
+
if (!this.dataGrid) {
|
|
2240
|
+
return;
|
|
2241
|
+
}
|
|
2242
|
+
const csv = DataGrid.DataGridExporter.exportToCSV(this.dataGrid);
|
|
2243
|
+
UI.UIUtils.copyTextToClipboard(csv);
|
|
2244
|
+
}
|
|
2245
|
+
|
|
2246
|
+
getDataGridForTest(): DataGrid.SortableDataGrid.SortableDataGrid<unknown>|null {
|
|
2247
|
+
return this.dataGrid;
|
|
2248
|
+
}
|
|
2249
|
+
|
|
2250
|
+
populateTableContextMenuForTest(contextMenu: UI.ContextMenu.ContextMenu): void {
|
|
2251
|
+
this.populateTableContextMenu(contextMenu);
|
|
2252
|
+
}
|
|
2208
2253
|
}
|
|
2209
2254
|
|
|
2210
2255
|
/**
|
|
@@ -18,8 +18,10 @@ function isLeafNode(node: SDK.AccessibilityModel.AccessibilityNode): boolean {
|
|
|
18
18
|
return node.numChildren() === 0 && node.role()?.value !== 'Iframe';
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
function getModel(frameId: Protocol.Page.FrameId
|
|
22
|
-
|
|
21
|
+
function getModel(frameId: Protocol.Page.FrameId,
|
|
22
|
+
frameManager: SDK.FrameManager.FrameManager =
|
|
23
|
+
SDK.FrameManager.FrameManager.instance()): SDK.AccessibilityModel.AccessibilityModel {
|
|
24
|
+
const frame = frameManager.getFrame(frameId);
|
|
23
25
|
const model = frame?.resourceTreeModel().target().model(SDK.AccessibilityModel.AccessibilityModel);
|
|
24
26
|
if (!model) {
|
|
25
27
|
throw new Error('Could not instantiate model for frameId');
|
|
@@ -27,8 +29,11 @@ function getModel(frameId: Protocol.Page.FrameId): SDK.AccessibilityModel.Access
|
|
|
27
29
|
return model;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
|
-
export async function getRootNode(
|
|
31
|
-
|
|
32
|
+
export async function getRootNode(
|
|
33
|
+
frameId: Protocol.Page.FrameId,
|
|
34
|
+
frameManager: SDK.FrameManager.FrameManager =
|
|
35
|
+
SDK.FrameManager.FrameManager.instance()): Promise<SDK.AccessibilityModel.AccessibilityNode> {
|
|
36
|
+
const model = getModel(frameId, frameManager);
|
|
32
37
|
const root = await model.requestRootNode(frameId);
|
|
33
38
|
if (!root) {
|
|
34
39
|
throw new Error('No accessibility root for frame');
|
|
@@ -49,33 +54,36 @@ function getFrameIdForNodeOrDocument(node: SDK.DOMModel.DOMNode): Protocol.Page.
|
|
|
49
54
|
return frameId;
|
|
50
55
|
}
|
|
51
56
|
|
|
52
|
-
export async function getNodeAndAncestorsFromDOMNode(
|
|
53
|
-
|
|
57
|
+
export async function getNodeAndAncestorsFromDOMNode(
|
|
58
|
+
domNode: SDK.DOMModel.DOMNode,
|
|
59
|
+
frameManager: SDK.FrameManager.FrameManager =
|
|
60
|
+
SDK.FrameManager.FrameManager.instance()): Promise<SDK.AccessibilityModel.AccessibilityNode[]> {
|
|
54
61
|
let frameId = getFrameIdForNodeOrDocument(domNode);
|
|
55
|
-
const model = getModel(frameId);
|
|
62
|
+
const model = getModel(frameId, frameManager);
|
|
56
63
|
const result = await model.requestAndLoadSubTreeToNode(domNode);
|
|
57
64
|
if (!result) {
|
|
58
65
|
throw new Error('Could not retrieve accessibility node for inspected DOM node');
|
|
59
66
|
}
|
|
60
67
|
|
|
61
|
-
const outermostFrameId =
|
|
68
|
+
const outermostFrameId = frameManager.getOutermostFrame()?.id;
|
|
62
69
|
if (!outermostFrameId) {
|
|
63
70
|
return result;
|
|
64
71
|
}
|
|
65
72
|
while (frameId !== outermostFrameId) {
|
|
66
|
-
const node = await
|
|
73
|
+
const node = await frameManager.getFrame(frameId)?.getOwnerDOMNodeOrDocument();
|
|
67
74
|
if (!node) {
|
|
68
75
|
break;
|
|
69
76
|
}
|
|
70
77
|
frameId = getFrameIdForNodeOrDocument(node);
|
|
71
|
-
const model = getModel(frameId);
|
|
78
|
+
const model = getModel(frameId, frameManager);
|
|
72
79
|
const ancestors = await model.requestAndLoadSubTreeToNode(node);
|
|
73
80
|
result.push(...ancestors || []);
|
|
74
81
|
}
|
|
75
82
|
return result;
|
|
76
83
|
}
|
|
77
84
|
|
|
78
|
-
async function getChildren(node: SDK.AccessibilityModel.AccessibilityNode
|
|
85
|
+
async function getChildren(node: SDK.AccessibilityModel.AccessibilityNode,
|
|
86
|
+
frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance()):
|
|
79
87
|
Promise<SDK.AccessibilityModel.AccessibilityNode[]> {
|
|
80
88
|
if (node.role()?.value === 'Iframe') {
|
|
81
89
|
const domNode = await node.deferredDOMNode()?.resolvePromise();
|
|
@@ -86,13 +94,15 @@ async function getChildren(node: SDK.AccessibilityModel.AccessibilityNode):
|
|
|
86
94
|
if (!frameId) {
|
|
87
95
|
throw new Error('No owner frameId on iframe node');
|
|
88
96
|
}
|
|
89
|
-
const localRoot = await getRootNode(frameId);
|
|
97
|
+
const localRoot = await getRootNode(frameId, frameManager);
|
|
90
98
|
return [localRoot];
|
|
91
99
|
}
|
|
92
100
|
return await node.accessibilityModel().requestAXChildren(node.id(), node.getFrameId() || undefined);
|
|
93
101
|
}
|
|
94
102
|
|
|
95
|
-
export async function sdkNodeToAXTreeNodes(
|
|
103
|
+
export async function sdkNodeToAXTreeNodes(
|
|
104
|
+
sdkNode: SDK.AccessibilityModel.AccessibilityNode,
|
|
105
|
+
frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance()): Promise<AXTreeNode[]> {
|
|
96
106
|
const treeNodeData = sdkNode;
|
|
97
107
|
if (isLeafNode(sdkNode)) {
|
|
98
108
|
return [{
|
|
@@ -104,8 +114,9 @@ export async function sdkNodeToAXTreeNodes(sdkNode: SDK.AccessibilityModel.Acces
|
|
|
104
114
|
return [{
|
|
105
115
|
treeNodeData,
|
|
106
116
|
children: async () => {
|
|
107
|
-
const childNodes = await getChildren(sdkNode);
|
|
108
|
-
const childTreeNodes =
|
|
117
|
+
const childNodes = await getChildren(sdkNode, frameManager);
|
|
118
|
+
const childTreeNodes =
|
|
119
|
+
await Promise.all(childNodes.map(childNode => sdkNodeToAXTreeNodes(childNode, frameManager)));
|
|
109
120
|
return childTreeNodes.flat(1);
|
|
110
121
|
},
|
|
111
122
|
id: getNodeId(sdkNode),
|
|
@@ -19,11 +19,14 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
|
|
|
19
19
|
private inspectedDOMNode: SDK.DOMModel.DOMNode|null = null;
|
|
20
20
|
private root: SDK.AccessibilityModel.AccessibilityNode|null = null;
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
readonly #frameManager: SDK.FrameManager.FrameManager;
|
|
23
|
+
|
|
24
|
+
constructor(accessibilityTreeComponent: TreeOutline.TreeOutline.TreeOutline<AccessibilityTreeUtils.AXTreeNodeData>,
|
|
25
|
+
frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance()) {
|
|
24
26
|
super();
|
|
25
27
|
this.registerRequiredCSS(accessibilityTreeViewStyles);
|
|
26
28
|
this.accessibilityTreeComponent = accessibilityTreeComponent;
|
|
29
|
+
this.#frameManager = frameManager;
|
|
27
30
|
|
|
28
31
|
const container = this.contentElement.createChild('div');
|
|
29
32
|
|
|
@@ -75,11 +78,11 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
|
|
|
75
78
|
|
|
76
79
|
async refreshAccessibilityTree(): Promise<void> {
|
|
77
80
|
if (!this.root) {
|
|
78
|
-
const frameId =
|
|
81
|
+
const frameId = this.#frameManager.getOutermostFrame()?.id;
|
|
79
82
|
if (!frameId) {
|
|
80
83
|
throw new Error('No top frame');
|
|
81
84
|
}
|
|
82
|
-
this.root = await AccessibilityTreeUtils.getRootNode(frameId);
|
|
85
|
+
this.root = await AccessibilityTreeUtils.getRootNode(frameId, this.#frameManager);
|
|
83
86
|
if (!this.root) {
|
|
84
87
|
throw new Error('No root');
|
|
85
88
|
}
|
|
@@ -90,15 +93,15 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
|
|
|
90
93
|
|
|
91
94
|
async renderTree(): Promise<void> {
|
|
92
95
|
if (!this.root) {
|
|
93
|
-
const frameId =
|
|
96
|
+
const frameId = this.#frameManager.getOutermostFrame()?.id;
|
|
94
97
|
if (frameId) {
|
|
95
|
-
this.root = await AccessibilityTreeUtils.getRootNode(frameId);
|
|
98
|
+
this.root = await AccessibilityTreeUtils.getRootNode(frameId, this.#frameManager);
|
|
96
99
|
}
|
|
97
100
|
}
|
|
98
101
|
if (!this.root) {
|
|
99
102
|
return;
|
|
100
103
|
}
|
|
101
|
-
const treeData = await AccessibilityTreeUtils.sdkNodeToAXTreeNodes(this.root);
|
|
104
|
+
const treeData = await AccessibilityTreeUtils.sdkNodeToAXTreeNodes(this.root, this.#frameManager);
|
|
102
105
|
this.accessibilityTreeComponent.data = {
|
|
103
106
|
defaultRenderer: AccessibilityTreeUtils.accessibilityNodeRenderer,
|
|
104
107
|
tree: treeData,
|
|
@@ -113,7 +116,7 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
|
|
|
113
116
|
// Given a selected DOM node, asks the model to load the missing subtree from the root to the
|
|
114
117
|
// selected node and then re-renders the tree.
|
|
115
118
|
async loadSubTreeIntoAccessibilityModel(selectedNode: SDK.DOMModel.DOMNode): Promise<void> {
|
|
116
|
-
const ancestors = await AccessibilityTreeUtils.getNodeAndAncestorsFromDOMNode(selectedNode);
|
|
119
|
+
const ancestors = await AccessibilityTreeUtils.getNodeAndAncestorsFromDOMNode(selectedNode, this.#frameManager);
|
|
117
120
|
const inspectedAXNode = ancestors.find(node => node.backendDOMNodeId() === selectedNode.backendNodeId());
|
|
118
121
|
if (!inspectedAXNode) {
|
|
119
122
|
return;
|
|
@@ -160,7 +163,7 @@ export class AccessibilityTreeView extends UI.Widget.VBox implements
|
|
|
160
163
|
void this.renderTree();
|
|
161
164
|
return;
|
|
162
165
|
}
|
|
163
|
-
const outermostFrameId =
|
|
166
|
+
const outermostFrameId = this.#frameManager.getOutermostFrame()?.id;
|
|
164
167
|
if (data.root?.getFrameId() !== outermostFrameId) {
|
|
165
168
|
void this.renderTree();
|
|
166
169
|
return;
|
|
@@ -40,7 +40,6 @@ import * as Platform from '../../core/platform/platform.js';
|
|
|
40
40
|
import * as Root from '../../core/root/root.js';
|
|
41
41
|
import * as SDK from '../../core/sdk/sdk.js';
|
|
42
42
|
import type * as Protocol from '../../generated/protocol.js';
|
|
43
|
-
import * as Annotations from '../../models/annotations/annotations.js';
|
|
44
43
|
import * as ComputedStyle from '../../models/computed_style/computed_style.js';
|
|
45
44
|
import * as PanelCommon from '../../panels/common/common.js';
|
|
46
45
|
import type * as Adorners from '../../ui/components/adorners/adorners.js';
|
|
@@ -307,8 +306,6 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
|
|
|
307
306
|
this.#domTreeWidget.onSelectedNodeChanged = this.selectedNodeChanged.bind(this);
|
|
308
307
|
this.#domTreeWidget.onElementsTreeUpdated = this.updateBreadcrumbIfNeeded.bind(this);
|
|
309
308
|
this.#domTreeWidget.onDocumentUpdated = this.documentUpdated.bind(this);
|
|
310
|
-
this.#domTreeWidget.onElementExpanded = this.handleElementExpanded.bind(this);
|
|
311
|
-
this.#domTreeWidget.onElementCollapsed = this.handleElementCollapsed.bind(this);
|
|
312
309
|
this.#domTreeWidget.setWordWrap(Common.Settings.Settings.instance().moduleSetting('dom-word-wrap').get());
|
|
313
310
|
|
|
314
311
|
SDK.TargetManager.TargetManager.instance().observeModels(SDK.DOMModel.DOMModel, this, {scoped: true});
|
|
@@ -319,11 +316,6 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
|
|
|
319
316
|
.addChangeListener(this.showUAShadowDOMChanged.bind(this));
|
|
320
317
|
PanelCommon.ExtensionServer.ExtensionServer.instance().addEventListener(
|
|
321
318
|
PanelCommon.ExtensionServer.Events.SidebarPaneAdded, this.extensionSidebarPaneAdded, this);
|
|
322
|
-
|
|
323
|
-
if (Annotations.AnnotationRepository.annotationsEnabled()) {
|
|
324
|
-
PanelCommon.AnnotationManager.instance().initializePlacementForAnnotationType(
|
|
325
|
-
Annotations.AnnotationType.ELEMENT_NODE, this.resolveInitialState.bind(this), this.#domTreeWidget.element);
|
|
326
|
-
}
|
|
327
319
|
}
|
|
328
320
|
|
|
329
321
|
// This is a debounced method because the user might be navigated from Styles tab to Computed Style tab and vice versa.
|
|
@@ -353,18 +345,6 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
|
|
|
353
345
|
}
|
|
354
346
|
}
|
|
355
347
|
|
|
356
|
-
private handleElementExpanded(): void {
|
|
357
|
-
if (Annotations.AnnotationRepository.annotationsEnabled()) {
|
|
358
|
-
void PanelCommon.AnnotationManager.instance().resolveAnnotationsOfType(Annotations.AnnotationType.ELEMENT_NODE);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
private handleElementCollapsed(): void {
|
|
363
|
-
if (Annotations.AnnotationRepository.annotationsEnabled()) {
|
|
364
|
-
void PanelCommon.AnnotationManager.instance().resolveAnnotationsOfType(Annotations.AnnotationType.ELEMENT_NODE);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
348
|
private showAccessibilityTree(): void {
|
|
369
349
|
if (this.accessibilityTreeView) {
|
|
370
350
|
this.splitWidget.setMainWidget(this.accessibilityTreeView);
|
|
@@ -511,10 +491,6 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
|
|
|
511
491
|
UI.Context.Context.instance().setFlavor(ElementsPanel, this);
|
|
512
492
|
this.#domTreeWidget.show(this.domTreeContainer);
|
|
513
493
|
this.evaluateTrackingComputedStyleUpdatesForNode();
|
|
514
|
-
|
|
515
|
-
if (Annotations.AnnotationRepository.annotationsEnabled()) {
|
|
516
|
-
void PanelCommon.AnnotationManager.instance().resolveAnnotationsOfType(Annotations.AnnotationType.ELEMENT_NODE);
|
|
517
|
-
}
|
|
518
494
|
}
|
|
519
495
|
|
|
520
496
|
override willHide(): void {
|
|
@@ -1321,56 +1297,6 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
|
|
|
1321
1297
|
this.#domTreeWidget.copyStyles(node);
|
|
1322
1298
|
}
|
|
1323
1299
|
|
|
1324
|
-
async resolveInitialState(
|
|
1325
|
-
parentElement: Element, reveal: boolean, lookupId: string,
|
|
1326
|
-
anchor?: SDK.DOMModel.DOMNode|SDK.NetworkRequest.NetworkRequest): Promise<{x: number, y: number}|null> {
|
|
1327
|
-
if (!this.isShowing()) {
|
|
1328
|
-
return null;
|
|
1329
|
-
}
|
|
1330
|
-
|
|
1331
|
-
if (!anchor) {
|
|
1332
|
-
const backendNodeId = Number(lookupId) as Protocol.DOM.BackendNodeId;
|
|
1333
|
-
if (isNaN(backendNodeId)) {
|
|
1334
|
-
return null;
|
|
1335
|
-
}
|
|
1336
|
-
const rootDOMNode = this.#domTreeWidget.rootDOMNode;
|
|
1337
|
-
if (!rootDOMNode) {
|
|
1338
|
-
return null;
|
|
1339
|
-
}
|
|
1340
|
-
const domModel = rootDOMNode.domModel();
|
|
1341
|
-
const nodes = await domModel.pushNodesByBackendIdsToFrontend(new Set([backendNodeId]));
|
|
1342
|
-
if (!nodes) {
|
|
1343
|
-
return null;
|
|
1344
|
-
}
|
|
1345
|
-
const foundNode = nodes.get(backendNodeId);
|
|
1346
|
-
if (!foundNode) {
|
|
1347
|
-
return null;
|
|
1348
|
-
}
|
|
1349
|
-
anchor = foundNode;
|
|
1350
|
-
}
|
|
1351
|
-
|
|
1352
|
-
const element = this.#domTreeWidget.treeElementForNode(anchor as SDK.DOMModel.DOMNode);
|
|
1353
|
-
if (!element) {
|
|
1354
|
-
return null;
|
|
1355
|
-
}
|
|
1356
|
-
|
|
1357
|
-
if (reveal) {
|
|
1358
|
-
// The node must have been revealed in order to calculate its position.
|
|
1359
|
-
await Common.Revealer.reveal(anchor);
|
|
1360
|
-
}
|
|
1361
|
-
|
|
1362
|
-
// The tree element element starts at the top-left of the expand/collapse arrow). We
|
|
1363
|
-
// want to aim for the tagname instead.
|
|
1364
|
-
const offsetToTagName = 22;
|
|
1365
|
-
const yPadding = 5;
|
|
1366
|
-
|
|
1367
|
-
const targetRect = element.listItemElement.getBoundingClientRect();
|
|
1368
|
-
const parentRect = parentElement.getBoundingClientRect();
|
|
1369
|
-
const relativeX = targetRect.x - parentRect.x + offsetToTagName;
|
|
1370
|
-
const relativeY = targetRect.y - parentRect.y + yPadding;
|
|
1371
|
-
return {x: relativeX, y: relativeY};
|
|
1372
|
-
}
|
|
1373
|
-
|
|
1374
1300
|
protected static firstInspectElementCompletedForTest = function(): void {};
|
|
1375
1301
|
protected static firstInspectElementNodeNameForTest = '';
|
|
1376
1302
|
}
|
|
@@ -235,8 +235,6 @@ export class DOMTreeWidget extends UI.Widget.Widget {
|
|
|
235
235
|
Common.EventTarget.EventTargetEvent<{node: SDK.DOMModel.DOMNode | null, focus: boolean}>) => void = () => {};
|
|
236
236
|
onElementsTreeUpdated: (event: Common.EventTarget.EventTargetEvent<SDK.DOMModel.DOMNode[]>) => void = () => {};
|
|
237
237
|
onDocumentUpdated: (domModel: SDK.DOMModel.DOMModel) => void = () => {};
|
|
238
|
-
onElementExpanded: () => void = () => {};
|
|
239
|
-
onElementCollapsed: () => void = () => {};
|
|
240
238
|
|
|
241
239
|
#maxTreeDepth?: number;
|
|
242
240
|
#enableContextMenu = true;
|
|
@@ -455,11 +453,9 @@ export class DOMTreeWidget extends UI.Widget.Widget {
|
|
|
455
453
|
},
|
|
456
454
|
onElementCollapsed: () => {
|
|
457
455
|
this.#clearHighlightedNode();
|
|
458
|
-
this.onElementCollapsed();
|
|
459
456
|
},
|
|
460
457
|
onElementExpanded: () => {
|
|
461
458
|
this.#clearHighlightedNode();
|
|
462
|
-
this.onElementExpanded();
|
|
463
459
|
},
|
|
464
460
|
},
|
|
465
461
|
this.#viewOutput, this.contentElement);
|
|
@@ -2136,6 +2132,11 @@ export class ElementsTreeOutline extends
|
|
|
2136
2132
|
visibleChildren.push(pickerIconPseudoElement);
|
|
2137
2133
|
}
|
|
2138
2134
|
|
|
2135
|
+
const interestButtonPseudoElement = node.interestButtonPseudoElement();
|
|
2136
|
+
if (interestButtonPseudoElement) {
|
|
2137
|
+
visibleChildren.push(interestButtonPseudoElement);
|
|
2138
|
+
}
|
|
2139
|
+
|
|
2139
2140
|
const backdropPseudoElement = node.backdropPseudoElement();
|
|
2140
2141
|
if (backdropPseudoElement) {
|
|
2141
2142
|
visibleChildren.push(backdropPseudoElement);
|
|
@@ -108,16 +108,9 @@ const UIStrings = {
|
|
|
108
108
|
moreOptions: 'More options',
|
|
109
109
|
/**
|
|
110
110
|
* @description A menu item in the drop-down box that allows the user to select the zoom level.
|
|
111
|
-
* Labels the
|
|
112
|
-
* placeholder, which is a number. In the Device Mode Toolbar.
|
|
113
|
-
* @example {30.0} PH1
|
|
114
|
-
*/
|
|
115
|
-
fitToWindowPercentage: '{PH1}% (fit to window)',
|
|
116
|
-
/**
|
|
117
|
-
* @description A checkbox setting that appears in the context menu for the zoom level, in the
|
|
118
|
-
* Device Mode Toolbar.
|
|
111
|
+
* Labels the option to automatically fit the preview to the available window space. In the Device Mode Toolbar.
|
|
119
112
|
*/
|
|
120
|
-
|
|
113
|
+
fitToWindow: 'Fit to window',
|
|
121
114
|
/**
|
|
122
115
|
* @description A menu item in the drop-down box that allows the user to select the device pixel
|
|
123
116
|
* ratio. Labels the default value which varies between device types, represented by the
|
|
@@ -236,7 +229,6 @@ const str_ = i18n.i18n.registerUIStrings('panels/emulation/DeviceModeToolbar.ts'
|
|
|
236
229
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
237
230
|
const {ifDefined, live} = Directives;
|
|
238
231
|
const {widget} = UI.Widget;
|
|
239
|
-
const {bindToSetting} = UI.UIUtils;
|
|
240
232
|
|
|
241
233
|
export interface DeviceModeOption {
|
|
242
234
|
device: EmulationModel.EmulatedDevices.EmulatedDevice;
|
|
@@ -359,17 +351,11 @@ export const DEFAULT_VIEW: View = (input, _output, target) => {
|
|
|
359
351
|
title=${i18nString(UIStrings.zoom)}
|
|
360
352
|
aria-label=${i18nString(UIStrings.zoom)}
|
|
361
353
|
@change=${input.onScaleChange}
|
|
362
|
-
.value=${String(input.scaleOptions.find(o => o.selected)?.value
|
|
354
|
+
.value=${String(input.scaleOptions.find(o => o.selected)?.value ?? '')}
|
|
363
355
|
jslog=${VisualLogging.dropDown().track({change: true}).context('scale')}>
|
|
364
356
|
${input.scaleOptions.map(o => html`<option value=${o.value} ?selected=${o.selected} jslog=${VisualLogging.item(o.jslogContext).track({click: true})}>${o.title}</option>`)}
|
|
365
357
|
</select>
|
|
366
358
|
|
|
367
|
-
<devtools-button .data=${{variant: Buttons.Button.Variant.TOOLBAR, iconName: 'center-focus-weak',
|
|
368
|
-
toggledIconName: 'center-focus-weak', toggleType: Buttons.Button.ToggleType.PRIMARY} as Buttons.Button.ButtonData}
|
|
369
|
-
class="toolbar-button" title=${i18nString(UIStrings.autoadjustZoom)}
|
|
370
|
-
${bindToSetting(input.autoAdjustScaleSetting)}>
|
|
371
|
-
</devtools-button>
|
|
372
|
-
|
|
373
359
|
<div class="device-mode-empty-toolbar-element"></div>
|
|
374
360
|
|
|
375
361
|
${input.showDeviceScaleFactorSetting.get() ? html`
|
|
@@ -381,7 +367,7 @@ export const DEFAULT_VIEW: View = (input, _output, target) => {
|
|
|
381
367
|
title=${i18nString(UIStrings.devicePixelRatio)}
|
|
382
368
|
aria-label=${i18nString(UIStrings.devicePixelRatio)}
|
|
383
369
|
@change=${input.onDeviceScaleChange}
|
|
384
|
-
.value=${String(input.dprOptions.find(o => o.selected)?.value
|
|
370
|
+
.value=${String(input.dprOptions.find(o => o.selected)?.value ?? '')}
|
|
385
371
|
jslog=${VisualLogging.dropDown().track({change: true}).context('device-pixel-ratio')}
|
|
386
372
|
?disabled=${!input.isResponsive}>
|
|
387
373
|
${input.dprOptions.map(o => html`<option value=${o.value} ?selected=${o.selected} jslog=${VisualLogging.item(o.jslogContext).track({click: true})}>${o.title}</option>`)}
|
|
@@ -488,6 +474,7 @@ export class DeviceModeToolbar extends UI.Widget.Widget {
|
|
|
488
474
|
|
|
489
475
|
this.autoAdjustScaleSetting =
|
|
490
476
|
Common.Settings.Settings.instance().createSetting('emulation.auto-adjust-scale', true);
|
|
477
|
+
this.autoAdjustScaleSetting.addChangeListener(this.requestUpdate, this);
|
|
491
478
|
|
|
492
479
|
this.lastMode = new Map();
|
|
493
480
|
|
|
@@ -665,39 +652,53 @@ export class DeviceModeToolbar extends UI.Widget.Widget {
|
|
|
665
652
|
|
|
666
653
|
private getScaleOptions(): Array<{title: string, value: number, selected: boolean, jslogContext: string}> {
|
|
667
654
|
const values = [0.5, 0.75, 1, 1.25, 1.5, 2];
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
if ((values[i] * 100).toFixed(0) === fitValuePct) {
|
|
675
|
-
found = true;
|
|
676
|
-
values[i] = fitValue;
|
|
677
|
-
break;
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
if (!found) {
|
|
681
|
-
values.push(fitValue);
|
|
682
|
-
values.sort((a, b) => a - b);
|
|
683
|
-
}
|
|
655
|
+
const isAutoAdjusting = this.autoAdjustScaleSetting.get();
|
|
656
|
+
const currentScale = this.model.scaleSetting().get();
|
|
657
|
+
|
|
658
|
+
if (!isAutoAdjusting && !values.includes(currentScale)) {
|
|
659
|
+
values.push(currentScale);
|
|
660
|
+
values.sort((a, b) => a - b);
|
|
684
661
|
}
|
|
685
662
|
|
|
686
|
-
const
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
663
|
+
const options: Array<{title: string, value: number, selected: boolean, jslogContext: string}> = [
|
|
664
|
+
{
|
|
665
|
+
title: i18nString(UIStrings.fitToWindow),
|
|
666
|
+
value: 0,
|
|
667
|
+
selected: isAutoAdjusting,
|
|
668
|
+
jslogContext: 'fit-to-window',
|
|
669
|
+
},
|
|
670
|
+
];
|
|
671
|
+
|
|
672
|
+
for (const value of values) {
|
|
673
|
+
const title = (value * 100).toFixed(0) + '%';
|
|
674
|
+
options.push({
|
|
675
|
+
title,
|
|
676
|
+
value,
|
|
677
|
+
selected: !isAutoAdjusting && currentScale === value,
|
|
678
|
+
jslogContext: title,
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
return options;
|
|
696
682
|
}
|
|
697
683
|
|
|
698
684
|
private onScaleChange(event: Event): void {
|
|
699
685
|
const value = Number((event.target as HTMLSelectElement).value);
|
|
700
|
-
|
|
686
|
+
if (value === 0) {
|
|
687
|
+
this.autoAdjustScaleSetting.set(true);
|
|
688
|
+
if (this.model.type() === EmulationModel.DeviceModeModel.Type.Responsive) {
|
|
689
|
+
const appliedSize = this.model.appliedDeviceSize();
|
|
690
|
+
this.model.setSizeAndScaleToFit(appliedSize.width, appliedSize.height);
|
|
691
|
+
} else {
|
|
692
|
+
const device = this.model.device();
|
|
693
|
+
const mode = this.model.mode();
|
|
694
|
+
if (device && mode) {
|
|
695
|
+
this.model.emulate(EmulationModel.DeviceModeModel.Type.Device, device, mode, undefined);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
} else {
|
|
699
|
+
this.autoAdjustScaleSetting.set(false);
|
|
700
|
+
this.model.scaleSetting().set(value);
|
|
701
|
+
}
|
|
701
702
|
}
|
|
702
703
|
|
|
703
704
|
private getDeviceScaleFactorOptions():
|