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
|
@@ -6,6 +6,7 @@ import * as Common from '../../core/common/common.js';
|
|
|
6
6
|
import * as Host from '../../core/host/host.js';
|
|
7
7
|
import * as i18n from '../../core/i18n/i18n.js';
|
|
8
8
|
import * as Platform from '../../core/platform/platform.js';
|
|
9
|
+
import * as Root from '../../core/root/root.js';
|
|
9
10
|
|
|
10
11
|
import type {FilesChangedData} from './FileSystemWorkspaceBinding.js';
|
|
11
12
|
import {IsolatedFileSystem} from './IsolatedFileSystem.js';
|
|
@@ -24,7 +25,6 @@ const UIStrings = {
|
|
|
24
25
|
} as const;
|
|
25
26
|
const str_ = i18n.i18n.registerUIStrings('models/persistence/IsolatedFileSystemManager.ts', UIStrings);
|
|
26
27
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
27
|
-
let isolatedFileSystemManagerInstance: IsolatedFileSystemManager|null;
|
|
28
28
|
|
|
29
29
|
export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
30
30
|
readonly #fileSystems: Map<Platform.DevToolsPath.UrlString, PlatformFileSystem>;
|
|
@@ -33,8 +33,12 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
33
33
|
readonly #workspaceFolderExcludePatternSetting: Common.Settings.RegExpSetting;
|
|
34
34
|
private fileSystemRequestResolve: ((arg0: IsolatedFileSystem|null) => void)|null;
|
|
35
35
|
private readonly fileSystemsLoadedPromise: Promise<IsolatedFileSystem[]>;
|
|
36
|
-
|
|
36
|
+
readonly #settings: Common.Settings.Settings;
|
|
37
|
+
readonly #console: Common.Console.Console;
|
|
38
|
+
constructor(settings: Common.Settings.Settings, console: Common.Console.Console) {
|
|
37
39
|
super();
|
|
40
|
+
this.#settings = settings;
|
|
41
|
+
this.#console = console;
|
|
38
42
|
|
|
39
43
|
this.#fileSystems = new Map();
|
|
40
44
|
this.callbacks = new Map();
|
|
@@ -90,24 +94,31 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
90
94
|
defaultExcludedFolders = defaultExcludedFolders.concat(defaultLinuxExcludedFolders);
|
|
91
95
|
}
|
|
92
96
|
const defaultExcludedFoldersPattern = defaultExcludedFolders.join('|');
|
|
93
|
-
this.#workspaceFolderExcludePatternSetting =
|
|
97
|
+
this.#workspaceFolderExcludePatternSetting = this.#settings.createRegExpSetting(
|
|
94
98
|
'workspace-folder-exclude-pattern', defaultExcludedFoldersPattern, Host.Platform.isWin() ? 'i' : '');
|
|
95
99
|
|
|
96
100
|
this.fileSystemRequestResolve = null;
|
|
97
101
|
this.fileSystemsLoadedPromise = this.requestFileSystems();
|
|
98
102
|
}
|
|
99
103
|
|
|
100
|
-
static instance(opts: {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
+
static instance(opts: {
|
|
105
|
+
forceNew?: boolean|null,
|
|
106
|
+
settings?: Common.Settings.Settings|null,
|
|
107
|
+
console?: Common.Console.Console|null,
|
|
108
|
+
} = {}): IsolatedFileSystemManager {
|
|
109
|
+
const forceNew = opts.forceNew ?? null;
|
|
110
|
+
const settings = opts.settings ?? Common.Settings.Settings.instance();
|
|
111
|
+
const console = opts.console ?? Common.Console.Console.instance();
|
|
112
|
+
if (!Root.DevToolsContext.globalInstance().has(IsolatedFileSystemManager) || forceNew) {
|
|
113
|
+
const instance = new IsolatedFileSystemManager(settings, console);
|
|
114
|
+
Root.DevToolsContext.globalInstance().set(IsolatedFileSystemManager, instance);
|
|
104
115
|
}
|
|
105
116
|
|
|
106
|
-
return
|
|
117
|
+
return Root.DevToolsContext.globalInstance().get(IsolatedFileSystemManager);
|
|
107
118
|
}
|
|
108
119
|
|
|
109
120
|
static removeInstance(): void {
|
|
110
|
-
|
|
121
|
+
Root.DevToolsContext.globalInstance().delete(IsolatedFileSystemManager);
|
|
111
122
|
}
|
|
112
123
|
|
|
113
124
|
private requestFileSystems(): Promise<IsolatedFileSystem[]> {
|
|
@@ -160,7 +171,7 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
160
171
|
const fileSystemURL = Common.ParsedURL.ParsedURL.rawPathToUrlString(fileSystem.fileSystemPath);
|
|
161
172
|
const promise = IsolatedFileSystem.create(
|
|
162
173
|
this, fileSystemURL, embedderPath, hostFileSystemTypeToPlatformFileSystemType(fileSystem.type),
|
|
163
|
-
fileSystem.fileSystemName, fileSystem.rootURL, fileSystem.type === 'automatic');
|
|
174
|
+
fileSystem.fileSystemName, fileSystem.rootURL, fileSystem.type === 'automatic', this.#settings);
|
|
164
175
|
return promise.then(storeFileSystem.bind(this));
|
|
165
176
|
|
|
166
177
|
function storeFileSystem(this: IsolatedFileSystemManager, fileSystem: IsolatedFileSystem|null): IsolatedFileSystem|
|
|
@@ -188,7 +199,7 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
188
199
|
const {errorMessage, fileSystem} = event.data;
|
|
189
200
|
if (errorMessage) {
|
|
190
201
|
if (errorMessage !== '<selection cancelled>' && errorMessage !== '<permission denied>') {
|
|
191
|
-
|
|
202
|
+
this.#console.error(i18nString(UIStrings.unableToAddFilesystemS, {PH1: errorMessage}));
|
|
192
203
|
}
|
|
193
204
|
if (!this.fileSystemRequestResolve) {
|
|
194
205
|
return;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import * as Common from '../../core/common/common.js';
|
|
6
6
|
import * as Host from '../../core/host/host.js';
|
|
7
7
|
import * as Platform from '../../core/platform/platform.js';
|
|
8
|
+
import * as Root from '../../core/root/root.js';
|
|
8
9
|
import * as SDK from '../../core/sdk/sdk.js';
|
|
9
10
|
import * as Protocol from '../../generated/protocol.js';
|
|
10
11
|
import * as Breakpoints from '../breakpoints/breakpoints.js';
|
|
@@ -15,8 +16,6 @@ import {type FileSystem, FileSystemWorkspaceBinding} from './FileSystemWorkspace
|
|
|
15
16
|
import {IsolatedFileSystemManager} from './IsolatedFileSystemManager.js';
|
|
16
17
|
import {PersistenceBinding, PersistenceImpl} from './PersistenceImpl.js';
|
|
17
18
|
|
|
18
|
-
let networkPersistenceManagerInstance: NetworkPersistenceManager|null;
|
|
19
|
-
|
|
20
19
|
const forbiddenUrls = ['chromewebstore.google.com', 'chrome.google.com'];
|
|
21
20
|
|
|
22
21
|
export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrapper<EventTypes> implements
|
|
@@ -24,8 +23,14 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
24
23
|
#bindings = new WeakMap<Workspace.UISourceCode.UISourceCode, PersistenceBinding>();
|
|
25
24
|
readonly #originalResponseContentPromises = new WeakMap<Workspace.UISourceCode.UISourceCode, Promise<string|null>>();
|
|
26
25
|
#savingForOverrides = new WeakSet<Workspace.UISourceCode.UISourceCode>();
|
|
27
|
-
#enabledSetting
|
|
26
|
+
readonly #enabledSetting: Common.Settings.Setting<boolean>;
|
|
28
27
|
readonly #workspace: Workspace.Workspace.WorkspaceImpl;
|
|
28
|
+
readonly #persistence: PersistenceImpl;
|
|
29
|
+
readonly #breakpointManager: Breakpoints.BreakpointManager.BreakpointManager;
|
|
30
|
+
readonly #targetManager: SDK.TargetManager.TargetManager;
|
|
31
|
+
readonly #settings: Common.Settings.Settings;
|
|
32
|
+
readonly #isolatedFileSystemManager: IsolatedFileSystemManager;
|
|
33
|
+
readonly #multitargetNetworkManager: SDK.NetworkManager.MultitargetNetworkManager;
|
|
29
34
|
readonly #networkUISourceCodeForEncodedPath =
|
|
30
35
|
new Map<Platform.DevToolsPath.EncodedPathString, Workspace.UISourceCode.UISourceCode>();
|
|
31
36
|
readonly #interceptionHandlerBound: (interceptedRequest: SDK.NetworkManager.InterceptedRequest) => Promise<void>;
|
|
@@ -39,12 +44,27 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
39
44
|
readonly #eventDispatchThrottler = new Common.Throttler.Throttler(50);
|
|
40
45
|
#headerOverridesForEventDispatch = new Set<Workspace.UISourceCode.UISourceCode>();
|
|
41
46
|
|
|
42
|
-
|
|
47
|
+
constructor(
|
|
48
|
+
workspace: Workspace.Workspace.WorkspaceImpl,
|
|
49
|
+
persistence: PersistenceImpl,
|
|
50
|
+
breakpointManager: Breakpoints.BreakpointManager.BreakpointManager,
|
|
51
|
+
targetManager: SDK.TargetManager.TargetManager,
|
|
52
|
+
settings: Common.Settings.Settings,
|
|
53
|
+
isolatedFileSystemManager: IsolatedFileSystemManager,
|
|
54
|
+
multitargetNetworkManager: SDK.NetworkManager.MultitargetNetworkManager,
|
|
55
|
+
) {
|
|
43
56
|
super();
|
|
44
57
|
|
|
45
|
-
this.#enabledSetting.addChangeListener(this.enabledChanged, this);
|
|
46
|
-
|
|
47
58
|
this.#workspace = workspace;
|
|
59
|
+
this.#persistence = persistence;
|
|
60
|
+
this.#breakpointManager = breakpointManager;
|
|
61
|
+
this.#targetManager = targetManager;
|
|
62
|
+
this.#settings = settings;
|
|
63
|
+
this.#isolatedFileSystemManager = isolatedFileSystemManager;
|
|
64
|
+
this.#multitargetNetworkManager = multitargetNetworkManager;
|
|
65
|
+
|
|
66
|
+
this.#enabledSetting = this.#settings.moduleSetting<boolean>('persistence-network-overrides-enabled');
|
|
67
|
+
this.#enabledSetting.addChangeListener(this.enabledChanged, this);
|
|
48
68
|
|
|
49
69
|
this.#interceptionHandlerBound = this.interceptionHandler.bind(this);
|
|
50
70
|
|
|
@@ -55,13 +75,12 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
55
75
|
void this.onProjectRemoved(event.data);
|
|
56
76
|
});
|
|
57
77
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
this.networkUISourceCodeAdded.bind(this));
|
|
78
|
+
this.#persistence.addNetworkInterceptor(this.canHandleNetworkUISourceCode.bind(this));
|
|
79
|
+
this.#breakpointManager.addUpdateBindingsCallback(this.networkUISourceCodeAdded.bind(this));
|
|
61
80
|
|
|
62
81
|
void this.enabledChanged();
|
|
63
82
|
|
|
64
|
-
|
|
83
|
+
this.#targetManager.observeTargets(this);
|
|
65
84
|
}
|
|
66
85
|
|
|
67
86
|
targetAdded(): void {
|
|
@@ -76,14 +95,29 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
76
95
|
workspace: Workspace.Workspace.WorkspaceImpl|null,
|
|
77
96
|
} = {forceNew: null, workspace: null}): NetworkPersistenceManager {
|
|
78
97
|
const {forceNew, workspace} = opts;
|
|
79
|
-
if (!
|
|
98
|
+
if (!Root.DevToolsContext.globalInstance().has(NetworkPersistenceManager) || forceNew) {
|
|
80
99
|
if (!workspace) {
|
|
81
100
|
throw new Error('Missing workspace for NetworkPersistenceManager');
|
|
82
101
|
}
|
|
83
|
-
|
|
102
|
+
Root.DevToolsContext.globalInstance().set(
|
|
103
|
+
NetworkPersistenceManager,
|
|
104
|
+
new NetworkPersistenceManager(
|
|
105
|
+
workspace,
|
|
106
|
+
PersistenceImpl.instance(),
|
|
107
|
+
Breakpoints.BreakpointManager.BreakpointManager.instance(),
|
|
108
|
+
SDK.TargetManager.TargetManager.instance(),
|
|
109
|
+
Common.Settings.Settings.instance(),
|
|
110
|
+
IsolatedFileSystemManager.instance(),
|
|
111
|
+
SDK.NetworkManager.MultitargetNetworkManager.instance(),
|
|
112
|
+
),
|
|
113
|
+
);
|
|
84
114
|
}
|
|
85
115
|
|
|
86
|
-
return
|
|
116
|
+
return Root.DevToolsContext.globalInstance().get(NetworkPersistenceManager);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
static removeInstance(): void {
|
|
120
|
+
Root.DevToolsContext.globalInstance().delete(NetworkPersistenceManager);
|
|
87
121
|
}
|
|
88
122
|
|
|
89
123
|
active(): boolean {
|
|
@@ -111,24 +145,20 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
111
145
|
if (this.#enabled) {
|
|
112
146
|
Host.userMetrics.actionTaken(Host.UserMetrics.Action.PersistenceNetworkOverridesEnabled);
|
|
113
147
|
this.#eventDescriptors = [
|
|
114
|
-
Workspace.Workspace.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}),
|
|
129
|
-
Workspace.Workspace.WorkspaceImpl.instance().addEventListener(
|
|
130
|
-
Workspace.Workspace.Events.WorkingCopyCommitted,
|
|
131
|
-
event => this.onUISourceCodeWorkingCopyCommitted(event.data.uiSourceCode)),
|
|
148
|
+
this.#workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeRenamed,
|
|
149
|
+
event => {
|
|
150
|
+
void this.uiSourceCodeRenamedListener(event);
|
|
151
|
+
}),
|
|
152
|
+
this.#workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeAdded,
|
|
153
|
+
event => {
|
|
154
|
+
void this.uiSourceCodeAdded(event);
|
|
155
|
+
}),
|
|
156
|
+
this.#workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeRemoved,
|
|
157
|
+
event => {
|
|
158
|
+
void this.uiSourceCodeRemovedListener(event);
|
|
159
|
+
}),
|
|
160
|
+
this.#workspace.addEventListener(Workspace.Workspace.Events.WorkingCopyCommitted,
|
|
161
|
+
event => this.onUISourceCodeWorkingCopyCommitted(event.data.uiSourceCode)),
|
|
132
162
|
];
|
|
133
163
|
await this.updateActiveProject();
|
|
134
164
|
} else {
|
|
@@ -158,8 +188,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
158
188
|
|
|
159
189
|
private async updateActiveProject(): Promise<void> {
|
|
160
190
|
const wasActive = this.#active;
|
|
161
|
-
this.#active =
|
|
162
|
-
Boolean(this.#enabledSetting.get() && SDK.TargetManager.TargetManager.instance().rootTarget() && this.#project);
|
|
191
|
+
this.#active = Boolean(this.#enabledSetting.get() && this.#targetManager.rootTarget() && this.#project);
|
|
163
192
|
if (this.#active === wasActive) {
|
|
164
193
|
return;
|
|
165
194
|
}
|
|
@@ -178,7 +207,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
178
207
|
[...this.#project.uiSourceCodes()].map(uiSourceCode => this.filesystemUISourceCodeRemoved(uiSourceCode)));
|
|
179
208
|
this.#networkUISourceCodeForEncodedPath.clear();
|
|
180
209
|
}
|
|
181
|
-
|
|
210
|
+
this.#persistence.refreshAutomapping();
|
|
182
211
|
}
|
|
183
212
|
|
|
184
213
|
encodedPathFromUrl(url: Platform.DevToolsPath.UrlString, ignoreInactive?: boolean):
|
|
@@ -270,7 +299,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
270
299
|
const folderUrlFromRequest =
|
|
271
300
|
Common.ParsedURL.ParsedURL.substring(fileUrlFromRequest, 0, fileUrlFromRequest.lastIndexOf('/'));
|
|
272
301
|
const headersFileUrl = Common.ParsedURL.ParsedURL.concatenate(folderUrlFromRequest, '/', HEADERS_FILENAME);
|
|
273
|
-
return
|
|
302
|
+
return this.#workspace.uiSourceCodeForURL(headersFileUrl);
|
|
274
303
|
}
|
|
275
304
|
|
|
276
305
|
async getOrCreateHeadersUISourceCodeFromUrl(url: Platform.DevToolsPath.UrlString):
|
|
@@ -315,7 +344,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
315
344
|
#innerUnbind(binding: PersistenceBinding): Promise<void> {
|
|
316
345
|
this.#bindings.delete(binding.network);
|
|
317
346
|
this.#bindings.delete(binding.fileSystem);
|
|
318
|
-
return
|
|
347
|
+
return this.#persistence.removeBinding(binding);
|
|
319
348
|
}
|
|
320
349
|
|
|
321
350
|
async #bind(
|
|
@@ -352,12 +381,12 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
352
381
|
const binding = new PersistenceBinding(networkUISourceCode, fileSystemUISourceCode);
|
|
353
382
|
this.#bindings.set(networkUISourceCode, binding);
|
|
354
383
|
this.#bindings.set(fileSystemUISourceCode, binding);
|
|
355
|
-
await
|
|
384
|
+
await this.#persistence.addBinding(binding);
|
|
356
385
|
const uiSourceCodeOfTruth =
|
|
357
386
|
this.#savingForOverrides.has(networkUISourceCode) ? networkUISourceCode : fileSystemUISourceCode;
|
|
358
387
|
const contentDataOrError = await uiSourceCodeOfTruth.requestContentData();
|
|
359
388
|
const {content, isEncoded} = TextUtils.ContentData.ContentData.asDeferredContent(contentDataOrError);
|
|
360
|
-
|
|
389
|
+
this.#persistence.syncContent(uiSourceCodeOfTruth, content || '', isEncoded);
|
|
361
390
|
}
|
|
362
391
|
|
|
363
392
|
private onUISourceCodeWorkingCopyCommitted(uiSourceCode: Workspace.UISourceCode.UISourceCode): void {
|
|
@@ -398,7 +427,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
398
427
|
if (this.#shouldPromptSaveForOverridesDialog(uiSourceCode)) {
|
|
399
428
|
Host.userMetrics.actionTaken(Host.UserMetrics.Action.OverrideContentContextMenuSetup);
|
|
400
429
|
await new Promise<void>(resolve => this.dispatchEventToListeners(Events.LOCAL_OVERRIDES_REQUESTED, resolve));
|
|
401
|
-
await
|
|
430
|
+
await this.#isolatedFileSystemManager.addFileSystem('overrides');
|
|
402
431
|
}
|
|
403
432
|
|
|
404
433
|
if (!this.project()) {
|
|
@@ -683,8 +712,8 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
683
712
|
async #innerUpdateInterceptionPatterns(): Promise<void> {
|
|
684
713
|
this.#headerOverridesMap.clear();
|
|
685
714
|
if (!this.#active || !this.#project) {
|
|
686
|
-
return await
|
|
687
|
-
|
|
715
|
+
return await this.#multitargetNetworkManager.setInterceptionHandlerForPatterns([],
|
|
716
|
+
this.#interceptionHandlerBound);
|
|
688
717
|
}
|
|
689
718
|
let patterns = new Set<string>();
|
|
690
719
|
for (const uiSourceCode of this.#project.uiSourceCodes()) {
|
|
@@ -713,9 +742,9 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
713
742
|
}
|
|
714
743
|
}
|
|
715
744
|
|
|
716
|
-
return await
|
|
717
|
-
Array.from(patterns).map(
|
|
718
|
-
|
|
745
|
+
return await this.#multitargetNetworkManager.setInterceptionHandlerForPatterns(
|
|
746
|
+
Array.from(patterns).map(pattern =>
|
|
747
|
+
({urlPattern: pattern, requestStage: Protocol.Fetch.RequestStage.Response})),
|
|
719
748
|
this.#interceptionHandlerBound);
|
|
720
749
|
}
|
|
721
750
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import * as Common from '../../core/common/common.js';
|
|
6
6
|
import * as Host from '../../core/host/host.js';
|
|
7
7
|
import * as Platform from '../../core/platform/platform.js';
|
|
8
|
+
import * as Root from '../../core/root/root.js';
|
|
8
9
|
import * as SDK from '../../core/sdk/sdk.js';
|
|
9
10
|
import * as Bindings from '../bindings/bindings.js';
|
|
10
11
|
import * as BreakpointManager from '../breakpoints/breakpoints.js';
|
|
@@ -13,8 +14,6 @@ import * as Workspace from '../workspace/workspace.js';
|
|
|
13
14
|
|
|
14
15
|
import {Automapping, type AutomappingStatus} from './Automapping.js';
|
|
15
16
|
|
|
16
|
-
let persistenceInstance: PersistenceImpl;
|
|
17
|
-
|
|
18
17
|
export class PersistenceImpl extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
19
18
|
readonly #workspace: Workspace.Workspace.WorkspaceImpl;
|
|
20
19
|
readonly #breakpointManager: BreakpointManager.BreakpointManager.BreakpointManager;
|
|
@@ -40,14 +39,14 @@ export class PersistenceImpl extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
|
40
39
|
breakpointManager: BreakpointManager.BreakpointManager.BreakpointManager|null,
|
|
41
40
|
} = {forceNew: null, workspace: null, breakpointManager: null}): PersistenceImpl {
|
|
42
41
|
const {forceNew, workspace, breakpointManager} = opts;
|
|
43
|
-
if (!
|
|
42
|
+
if (!Root.DevToolsContext.globalInstance().has(PersistenceImpl) || forceNew) {
|
|
44
43
|
if (!workspace || !breakpointManager) {
|
|
45
44
|
throw new Error('Missing arguments for workspace');
|
|
46
45
|
}
|
|
47
|
-
|
|
46
|
+
Root.DevToolsContext.globalInstance().set(PersistenceImpl, new PersistenceImpl(workspace, breakpointManager));
|
|
48
47
|
}
|
|
49
48
|
|
|
50
|
-
return
|
|
49
|
+
return Root.DevToolsContext.globalInstance().get(PersistenceImpl);
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
addNetworkInterceptor(interceptor: (arg0: Workspace.UISourceCode.UISourceCode) => boolean): void {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Common from '../../core/common/common.js';
|
|
6
6
|
import * as Platform from '../../core/platform/platform.js';
|
|
7
|
-
import
|
|
7
|
+
import * as Root from '../../core/root/root.js';
|
|
8
8
|
import * as SDK from '../../core/sdk/sdk.js';
|
|
9
9
|
|
|
10
10
|
/** The security origin for all DevTools (front-end) resources. */
|
|
@@ -72,8 +72,6 @@ export type ProjectSettingsAvailability = 'available'|'unavailable';
|
|
|
72
72
|
const EMPTY_PROJECT_SETTINGS: ProjectSettings = Object.freeze({});
|
|
73
73
|
const IDLE_PROMISE: Promise<void> = Promise.resolve();
|
|
74
74
|
|
|
75
|
-
let projectSettingsModelInstance: ProjectSettingsModel|undefined;
|
|
76
|
-
|
|
77
75
|
export class ProjectSettingsModel extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
78
76
|
readonly #pageResourceLoader: SDK.PageResourceLoader.PageResourceLoader;
|
|
79
77
|
readonly #targetManager: SDK.TargetManager.TargetManager;
|
|
@@ -108,7 +106,7 @@ export class ProjectSettingsModel extends Common.ObjectWrapper.ObjectWrapper<Eve
|
|
|
108
106
|
return this.#promise.then(() => this.#projectSettings);
|
|
109
107
|
}
|
|
110
108
|
|
|
111
|
-
|
|
109
|
+
constructor(
|
|
112
110
|
hostConfig: Root.Runtime.HostConfig,
|
|
113
111
|
pageResourceLoader: SDK.PageResourceLoader.PageResourceLoader,
|
|
114
112
|
targetManager: SDK.TargetManager.TargetManager,
|
|
@@ -140,24 +138,27 @@ export class ProjectSettingsModel extends Common.ObjectWrapper.ObjectWrapper<Eve
|
|
|
140
138
|
pageResourceLoader: SDK.PageResourceLoader.PageResourceLoader|null,
|
|
141
139
|
targetManager: SDK.TargetManager.TargetManager|null,
|
|
142
140
|
}): ProjectSettingsModel {
|
|
143
|
-
if (!
|
|
141
|
+
if (!Root.DevToolsContext.globalInstance().has(ProjectSettingsModel) || forceNew) {
|
|
144
142
|
if (!hostConfig || !pageResourceLoader || !targetManager) {
|
|
145
143
|
throw new Error(
|
|
146
144
|
'Unable to create ProjectSettingsModel: ' +
|
|
147
145
|
'hostConfig, pageResourceLoader, and targetManager must be provided');
|
|
148
146
|
}
|
|
149
|
-
|
|
147
|
+
Root.DevToolsContext.globalInstance().set(
|
|
148
|
+
ProjectSettingsModel,
|
|
149
|
+
new ProjectSettingsModel(hostConfig, pageResourceLoader, targetManager),
|
|
150
|
+
);
|
|
150
151
|
}
|
|
151
|
-
return
|
|
152
|
+
return Root.DevToolsContext.globalInstance().get(ProjectSettingsModel);
|
|
152
153
|
}
|
|
153
154
|
|
|
154
155
|
/**
|
|
155
|
-
* Clears the `ProjectSettingsModel` singleton (if any)
|
|
156
|
+
* Clears the `ProjectSettingsModel` singleton (if any);
|
|
156
157
|
*/
|
|
157
158
|
static removeInstance(): void {
|
|
158
|
-
if (
|
|
159
|
-
|
|
160
|
-
|
|
159
|
+
if (Root.DevToolsContext.globalInstance().has(ProjectSettingsModel)) {
|
|
160
|
+
Root.DevToolsContext.globalInstance().get(ProjectSettingsModel).#dispose();
|
|
161
|
+
Root.DevToolsContext.globalInstance().delete(ProjectSettingsModel);
|
|
161
162
|
}
|
|
162
163
|
}
|
|
163
164
|
|
|
@@ -118,7 +118,7 @@ export class EntityMapper {
|
|
|
118
118
|
const sourceLocationEvents: Types.Events.Event[] = [];
|
|
119
119
|
// The events that don't match the source location, but that we should keep mapped to its current entity.
|
|
120
120
|
const unrelatedEvents: Types.Events.Event[] = [];
|
|
121
|
-
currentEntityEvents?.forEach(e => {
|
|
121
|
+
currentEntityEvents?.forEach((e: Types.Events.Event) => {
|
|
122
122
|
const cf = Helpers.Trace.getStackTraceTopCallFrameInEventPayload(e);
|
|
123
123
|
|
|
124
124
|
const matchesCallFrame = cf && Helpers.Trace.isMatchingCallFrame(cf, callFrame);
|
|
@@ -7,21 +7,14 @@ import * as Types from '../types/types.js';
|
|
|
7
7
|
|
|
8
8
|
import type {HandlerName} from './types.js';
|
|
9
9
|
|
|
10
|
-
// Each thread contains events. Events indicate the thread and process IDs, which are
|
|
11
|
-
// used to store the event in the correct process thread entry below.
|
|
12
|
-
let unpairedAsyncEvents: Types.Events.PipelineReporter[] = [];
|
|
13
|
-
|
|
14
10
|
let legacyScreenshotEvents: Types.Events.LegacyScreenshot[] = [];
|
|
15
11
|
let modernScreenshotEvents: Types.Events.Screenshot[] = [];
|
|
16
12
|
let syntheticScreenshots: Types.Events.LegacySyntheticScreenshot[] = [];
|
|
17
|
-
let frameSequenceToTs: Record<string, Types.Timing.Micro> = {};
|
|
18
13
|
|
|
19
14
|
export function reset(): void {
|
|
20
|
-
unpairedAsyncEvents = [];
|
|
21
15
|
legacyScreenshotEvents = [];
|
|
22
16
|
syntheticScreenshots = [];
|
|
23
17
|
modernScreenshotEvents = [];
|
|
24
|
-
frameSequenceToTs = {};
|
|
25
18
|
}
|
|
26
19
|
|
|
27
20
|
export function handleEvent(event: Types.Events.Event): void {
|
|
@@ -29,39 +22,26 @@ export function handleEvent(event: Types.Events.Event): void {
|
|
|
29
22
|
legacyScreenshotEvents.push(event);
|
|
30
23
|
} else if (Types.Events.isScreenshot(event)) {
|
|
31
24
|
modernScreenshotEvents.push(event);
|
|
32
|
-
} else if (Types.Events.isPipelineReporter(event)) {
|
|
33
|
-
unpairedAsyncEvents.push(event);
|
|
34
25
|
}
|
|
35
26
|
}
|
|
36
27
|
|
|
37
28
|
export async function finalize(): Promise<void> {
|
|
38
|
-
const pipelineReporterEvents = Helpers.Trace.createMatchedSortedSyntheticEvents(unpairedAsyncEvents);
|
|
39
|
-
|
|
40
|
-
frameSequenceToTs = Object.fromEntries(pipelineReporterEvents.map(evt => {
|
|
41
|
-
const args = evt.args.data.beginEvent.args;
|
|
42
|
-
const frameReporter = 'frame_reporter' in args ? args.frame_reporter : args.chrome_frame_reporter;
|
|
43
|
-
const frameSequenceId = frameReporter.frame_sequence;
|
|
44
|
-
const presentationTs = Types.Timing.Micro(evt.ts + evt.dur);
|
|
45
|
-
return [frameSequenceId, presentationTs];
|
|
46
|
-
}));
|
|
47
|
-
|
|
48
29
|
for (const snapshotEvent of legacyScreenshotEvents) {
|
|
49
30
|
const {cat, name, ph, pid, tid} = snapshotEvent;
|
|
50
|
-
const syntheticEvent =
|
|
51
|
-
Types.Events.LegacySyntheticScreenshot>({
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
});
|
|
31
|
+
const syntheticEvent =
|
|
32
|
+
Helpers.SyntheticEvents.SyntheticEventsManager.registerSyntheticEvent<Types.Events.LegacySyntheticScreenshot>({
|
|
33
|
+
rawSourceEvent: snapshotEvent,
|
|
34
|
+
cat,
|
|
35
|
+
name,
|
|
36
|
+
ph,
|
|
37
|
+
pid,
|
|
38
|
+
tid,
|
|
39
|
+
// TODO(paulirish, crbug.com/41363012): fix snapshot timestamps.
|
|
40
|
+
ts: snapshotEvent.ts,
|
|
41
|
+
args: {
|
|
42
|
+
dataUri: `data:image/jpg;base64,${snapshotEvent.args.snapshot}`,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
65
45
|
syntheticScreenshots.push(syntheticEvent);
|
|
66
46
|
}
|
|
67
47
|
}
|
|
@@ -73,31 +53,6 @@ export function screenshotImageDataUri(event: Types.Events.LegacySyntheticScreen
|
|
|
73
53
|
return `data:image/jpg;base64,${event.args.snapshot}`;
|
|
74
54
|
}
|
|
75
55
|
|
|
76
|
-
/**
|
|
77
|
-
* Correct the screenshot timestamps
|
|
78
|
-
* The screenshot 'snapshot object' trace event has the "frame sequence number" attached as an ID.
|
|
79
|
-
* We match that up with the "PipelineReporter" trace events as they terminate at presentation.
|
|
80
|
-
* Presentation == when the pixels hit the screen. AKA Swap on the GPU
|
|
81
|
-
*/
|
|
82
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
83
|
-
function getPresentationTimestamp(screenshotEvent: Types.Events.LegacyScreenshot): Types.Timing.Micro {
|
|
84
|
-
const frameSequence = parseInt(screenshotEvent.id, 16);
|
|
85
|
-
// If it's 1, then it's an old trace (before https://crrev.com/c/4957973) and cannot be corrected.
|
|
86
|
-
if (frameSequence === 1) {
|
|
87
|
-
return screenshotEvent.ts;
|
|
88
|
-
}
|
|
89
|
-
// The screenshot trace event's `ts` reflects the "expected display time" which is ESTIMATE.
|
|
90
|
-
// It is set by the compositor frame sink from the `expected_display_time`, which is based on a previously known
|
|
91
|
-
// frame start PLUS the vsync interval (eg 16.6ms)
|
|
92
|
-
const updatedTs = frameSequenceToTs[frameSequence];
|
|
93
|
-
// Do we always find a match? No...
|
|
94
|
-
// We generally don't match the very first screenshot and, sometimes, the last
|
|
95
|
-
// The very first screenshot is requested immediately (even if nothing is painting). As a result there's no compositor
|
|
96
|
-
// instrumentation running alongside.
|
|
97
|
-
// The last one is sometimes missing as because the trace terminates right before the associated PipelineReporter is emitted.
|
|
98
|
-
return updatedTs ?? screenshotEvent.ts;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
56
|
export interface Data {
|
|
102
57
|
// These are nullable because in January 2025 a CL in Chromium
|
|
103
58
|
// crrev.com/c/6197645 landed which changed the format of screenshots. For a
|