chrome-devtools-frontend 1.0.1717196 → 1.0.1721762
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/rules/models-and-core/core-ai-agent-context-and-prompt-discipline.md +29 -0
- package/.agents/rules/models-and-core/core-cdp-and-extension-error-handling.md +34 -0
- package/.agents/rules/models-and-core/core-gn-build-and-module-layering.md +23 -0
- package/.agents/rules/models-and-core/core-runtime-neutrality-and-platform-utils.md +28 -0
- package/.agents/rules/models-and-core/core-sdk-model-and-target-lifecycle.md +35 -0
- package/.agents/rules/models-and-core/core-security-origin-and-capability-guards.md +33 -0
- package/.agents/rules/models-and-core/core-settings-and-storage-migration.md +31 -0
- package/.agents/rules/models-and-core/core-sourcemap-and-workspace-mapping.md +28 -0
- package/.agents/rules/models-and-core/core-trace-engine-handler-invariants.md +32 -0
- package/.agents/rules/models-and-core/core-trace-insight-models-and-timing-types.md +28 -0
- package/.agents/rules/tests/test-cleanup-mutated-globals-and-widgets.md +40 -0
- package/.agents/rules/tests/test-deterministic-async-synchronization.md +30 -0
- package/.agents/rules/tests/test-modular-hooks-and-test-universe.md +38 -0
- package/.agents/rules/tests/test-public-api-and-encapsulation.md +30 -0
- package/.agents/rules/tests/test-shared-fixture-and-helper-reuse.md +29 -0
- package/.agents/rules/tests/test-single-responsibility-and-conciseness.md +37 -0
- package/.agents/rules/tests/test-strict-assertions-and-literal-expectations.md +31 -0
- package/.agents/rules/tests/test-type-safe-mocks-and-events.md +30 -0
- package/.agents/rules/tests/test-view-and-presenter-isolation.md +32 -0
- package/.agents/rules/ui-and-widgets/ui-accessibility-and-semantic-html.md +32 -0
- package/.agents/rules/ui-and-widgets/ui-await-update-complete-post-render.md +30 -0
- package/.agents/rules/ui-and-widgets/ui-css-scoping-and-flex-layout.md +27 -0
- package/.agents/rules/ui-and-widgets/ui-declarative-child-widget-composition.md +29 -0
- package/.agents/rules/ui-and-widgets/ui-lit-declarative-templates-and-directives.md +33 -0
- package/.agents/rules/ui-and-widgets/ui-localization-and-uistrings-hygiene.md +36 -0
- package/.agents/rules/ui-and-widgets/ui-modern-component-and-encapsulation-standards.md +32 -0
- package/.agents/rules/ui-and-widgets/ui-panel-and-meta-registration.md +35 -0
- package/.agents/rules/ui-and-widgets/ui-performance-and-flamechart-rendering.md +34 -0
- package/.agents/rules/ui-and-widgets/ui-pure-view-and-presenter-separation.md +31 -0
- package/.agents/rules/ui-and-widgets/ui-reactive-widget-update-lifecycle.md +34 -0
- package/.agents/rules/ui-and-widgets/ui-security-and-output-sanitization.md +28 -0
- package/.agents/rules/ui-and-widgets/ui-type-safety-and-exhaustiveness.md +37 -0
- package/.agents/rules/ui-and-widgets/ui-view-output-and-callback-contracts.md +35 -0
- package/.agents/rules/ui-and-widgets/ui-visual-logging-instrumentation.md +29 -0
- package/.agents/rules/ui-and-widgets/ui-weak-dom-references-and-observer-cleanup.md +29 -0
- package/.agents/rules/ui-and-widgets/ui-widget-dom-and-listener-lifecycle.md +38 -0
- package/.agents/skills/code-review/SKILL.md +3 -0
- package/.agents/skills/devtools-testing-guidance/SKILL.md +5 -2
- package/.agents/skills/review-models-core/SKILL.md +73 -0
- package/.agents/skills/review-tests/SKILL.md +67 -0
- package/.agents/skills/review-ui-widgets/SKILL.md +115 -0
- package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +73 -9
- package/.agents/skills/ui-eng-vision-logic-consolidator/SKILL.md +27 -3
- package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +32 -2
- package/.agents/skills/ui-eng-vision-test-scaffolder/SKILL.md +37 -7
- package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +6 -5
- package/.agents/skills/ui-widgets/SKILL.md +11 -9
- package/AUTHORS +3 -0
- package/DIR_METADATA +51 -1
- package/docs/ui_engineering.md +34 -0
- package/eslint.config.mjs +63 -21
- package/front_end/core/common/Settings.ts +5 -0
- package/front_end/core/host/UserMetricsEnums.ts +1 -0
- package/front_end/core/platform/api/HostRuntime.ts +1 -0
- package/front_end/core/platform/browser/HostRuntime.ts +10 -0
- package/front_end/core/platform/node/HostRuntime.ts +1 -0
- package/front_end/core/sdk/CSSMatchedStyles.ts +60 -20
- package/front_end/core/sdk/CSSModel.ts +21 -0
- package/front_end/core/sdk/CSSProperty.ts +2 -2
- package/front_end/core/sdk/CSSPropertyParser.ts +11 -2
- package/front_end/core/sdk/CSSPropertyParserMatchers.ts +28 -9
- package/front_end/core/sdk/DOMModel.ts +1 -1
- package/front_end/core/sdk/DebuggerModel.ts +3 -0
- package/front_end/core/sdk/EmulationModel.ts +40 -39
- package/front_end/core/sdk/NetworkManager.ts +10 -3
- package/front_end/core/sdk/NetworkRequest.ts +21 -0
- package/front_end/core/sdk/OverlayModel.ts +2 -8
- package/front_end/core/sdk/PrivateVerificationTokensModel.ts +79 -0
- package/front_end/core/sdk/RuntimeModel.ts +8 -3
- package/front_end/core/sdk/SecurityOrigin.ts +1 -1
- package/front_end/core/sdk/SourceMapCache.ts +20 -15
- package/front_end/core/sdk/SourceMapManager.ts +28 -9
- package/front_end/core/sdk/TargetManager.ts +7 -4
- package/front_end/core/sdk/WebAuthnModel.ts +11 -2
- package/front_end/core/sdk/sdk.ts +2 -0
- package/front_end/devtools_compatibility.js +1 -0
- package/front_end/entrypoints/inspector_main/InspectorMain.ts +0 -2
- package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +10 -0
- package/front_end/entrypoints/main/GlobalAiButton.ts +1 -1
- package/front_end/entrypoints/main/MainImpl.ts +5 -2
- package/front_end/foundation/Universe.ts +1 -1
- package/front_end/generated/Deprecation.ts +4 -7
- package/front_end/generated/InspectorBackendCommands.ts +4 -4
- package/front_end/generated/SupportedCSSProperties.ts +89 -17
- package/front_end/generated/protocol-mapping.d.ts +1 -0
- package/front_end/generated/protocol-proxy-api.d.ts +1 -0
- package/front_end/generated/protocol.ts +6 -3
- package/front_end/models/{ai_assistance → ai-utils}/AiHistoryStorage.ts +6 -5
- package/front_end/models/{ai_assistance → ai-utils}/AiUtils.ts +14 -2
- package/front_end/models/{ai_assistance → ai-utils}/BuiltInAi.ts +1 -1
- package/front_end/models/ai-utils/ai-utils.ts +17 -0
- package/front_end/models/ai_assistance/AiAgent2.ts +14 -6
- package/front_end/models/ai_assistance/AiConversation.ts +37 -24
- package/front_end/models/ai_assistance/AlwaysAllowedTools.ts +107 -0
- package/front_end/models/ai_assistance/ConversationSummary.ts +2 -1
- package/front_end/models/ai_assistance/PerformanceAnnotations.ts +3 -1
- package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +12 -5
- package/front_end/models/ai_assistance/agents/AiAgent.ts +261 -127
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +12 -6
- package/front_end/models/ai_assistance/agents/ExecuteJavascript.ts +3 -1
- package/front_end/models/ai_assistance/agents/PerformanceAgent.snapshot.txt +1 -1
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +3 -1
- package/front_end/models/ai_assistance/ai_assistance.ts +9 -10
- package/front_end/models/ai_assistance/data_formatters/FileFormatter.ts +27 -6
- package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +2 -9
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +3 -3
- package/front_end/models/ai_assistance/skills/sources.md +3 -1
- package/front_end/models/ai_assistance/tools/ExecuteJavaScript.ts +1 -0
- package/front_end/models/ai_assistance/tools/GetCookieValues.ts +1 -0
- package/front_end/models/ai_assistance/tools/GetInsightDetails.ts +3 -1
- package/front_end/models/ai_assistance/tools/GetSourceContent.ts +46 -4
- package/front_end/models/ai_assistance/tools/GetStorageValues.ts +1 -0
- package/front_end/models/ai_assistance/tools/RunLighthouse.ts +6 -3
- package/front_end/models/ai_assistance/tools/Tool.ts +11 -1
- package/front_end/models/bindings/CompilerScriptMapping.ts +40 -8
- package/front_end/models/bindings/ResourceScriptMapping.ts +1 -1
- package/front_end/models/breakpoints/BreakpointManager.ts +0 -4
- package/front_end/models/change_tracker/ChangeTracker.ts +2 -0
- package/front_end/models/comment_manager/CommentManager.ts +12 -0
- package/front_end/models/comment_manager/CommentThread.ts +34 -1
- package/front_end/models/computed_style/ComputedStyleModel.ts +1 -0
- package/front_end/models/elements/ChangeTrackingUtils.ts +37 -0
- package/front_end/models/elements/DOMChanges.ts +24 -36
- package/front_end/models/elements/StyleChanges.ts +97 -0
- package/front_end/models/elements/elements.ts +4 -0
- package/front_end/models/emulation/DeviceModeModel.ts +19 -0
- package/front_end/models/issues_manager/GenericIssue.ts +18 -0
- package/front_end/models/issues_manager/descriptions/genericGeolocationPromptWithoutUserGesture.md +5 -0
- package/front_end/models/javascript_metadata/NativeFunctions.ts +11 -5
- package/front_end/models/lighthouse/RunTypes.ts +16 -0
- package/front_end/models/stack_trace/StackTraceModel.ts +24 -3
- package/front_end/models/trace/EventsSerializer.ts +35 -2
- package/front_end/models/trace/extras/TraceTree.ts +2 -7
- package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +17 -21
- package/front_end/models/trace/helpers/SyntheticEvents.ts +4 -2
- package/front_end/models/trace/helpers/Timing.ts +11 -22
- package/front_end/models/trace/lantern/core/NetworkAnalyzer.ts +12 -8
- package/front_end/models/trace/types/File.ts +20 -3
- package/front_end/models/trace/types/TraceEvents.ts +8 -3
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +37 -2
- package/front_end/panels/ai_assistance/README.md +4 -2
- package/front_end/panels/ai_assistance/ai_assistance-meta.ts +1 -1
- package/front_end/panels/ai_assistance/ai_assistance.ts +2 -0
- package/front_end/panels/ai_assistance/components/ChatInput.ts +5 -43
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +52 -147
- package/front_end/panels/ai_assistance/components/ChatView.ts +28 -3
- package/front_end/panels/ai_assistance/components/PermissionPrompt.ts +151 -0
- package/front_end/panels/ai_assistance/components/RelevantDataDisclaimer.ts +73 -0
- package/front_end/panels/ai_assistance/components/chatInput.css +0 -59
- package/front_end/panels/ai_assistance/components/chatMessage.css +0 -47
- package/front_end/panels/ai_assistance/components/chatView.css +5 -30
- package/front_end/panels/ai_assistance/components/permissionPrompt.css +55 -0
- package/front_end/panels/ai_assistance/components/relevantDataDisclaimer.css +35 -0
- package/front_end/panels/application/AppManifestView.ts +1 -4
- package/front_end/panels/application/ApplicationPanelSidebar.ts +3 -7
- package/front_end/panels/application/BackgroundServiceView.ts +8 -8
- package/front_end/panels/application/IndexedDBViews.ts +102 -73
- package/front_end/panels/application/OpenedWindowDetailsView.ts +167 -130
- package/front_end/panels/application/ServiceWorkerCacheViews.ts +288 -346
- package/front_end/panels/application/StorageBucketsTreeElement.ts +22 -27
- package/front_end/panels/application/StorageItemsToolbar.ts +2 -2
- package/front_end/panels/application/components/StorageMetadataView.ts +207 -160
- package/front_end/panels/application/openedWindowDetailsView.css +7 -30
- package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +1 -1
- package/front_end/panels/changes/changesView.css +0 -6
- package/front_end/panels/comments/CommentsPane.ts +7 -3
- package/front_end/panels/comments/comments-meta.ts +1 -1
- package/front_end/panels/common/CommentThreadWidget.ts +67 -25
- package/front_end/panels/common/CommentsOverlayWidget.ts +13 -0
- package/front_end/panels/console/ConsoleInsightTeaser.ts +5 -1
- package/front_end/panels/console/ConsolePinPane.ts +1 -1
- package/front_end/panels/console/ConsoleView.ts +1 -0
- package/front_end/panels/elements/CSSValueTraceView.ts +5 -5
- package/front_end/panels/elements/ColorSwatchPopoverIcon.ts +14 -6
- package/front_end/panels/elements/ComputedStyleWidget.ts +14 -5
- package/front_end/panels/elements/DOMTreeElementWidget.ts +2 -2
- package/front_end/panels/elements/DOMTreeWidget.ts +7 -3
- package/front_end/panels/elements/EventListenersWidget.ts +1 -1
- package/front_end/panels/elements/LayersWidget.ts +1 -1
- package/front_end/panels/elements/PropertyRenderer.ts +178 -10
- package/front_end/panels/elements/StandaloneStylesContainer.ts +33 -6
- package/front_end/panels/elements/StylePropertiesSection.ts +1 -0
- package/front_end/panels/elements/StylePropertyTreeElement.ts +295 -116
- package/front_end/panels/elements/StylesContainer.ts +2 -0
- package/front_end/panels/elements/StylesSidebarPane.ts +34 -16
- package/front_end/panels/elements/components/QueryContainer.ts +1 -1
- package/front_end/panels/elements/elementStatePaneWidget.css +1 -1
- package/front_end/panels/elements/stylePropertiesTreeOutline.css +7 -2
- package/front_end/panels/elements/stylesSidebarPane.css +4 -0
- package/front_end/panels/emulation/DeviceModeToolbar.ts +57 -25
- package/front_end/panels/emulation/DeviceModeView.ts +27 -1
- package/front_end/panels/emulation/InspectedPagePlaceholder.ts +6 -0
- package/front_end/panels/emulation/MediaQueryInspector.ts +14 -4
- package/front_end/panels/emulation/deviceModeView.css +3 -3
- package/front_end/panels/explain/components/ConsoleInsight.ts +2 -3
- package/front_end/panels/explain/explain-meta.ts +1 -1
- package/front_end/panels/issues/AffectedMetadataAllowedSitesView.ts +67 -34
- package/front_end/panels/issues/issues.ts +2 -0
- package/front_end/panels/layer_viewer/LayerTreeOutline.ts +7 -3
- package/front_end/panels/lighthouse/LighthouseController.ts +29 -22
- package/front_end/panels/lighthouse/LighthousePanel.ts +5 -6
- package/front_end/panels/lighthouse/LighthouseProtocolService.ts +24 -16
- package/front_end/panels/media/PlayerMessagesView.ts +1 -1
- package/front_end/panels/mobile_throttling/CPUThrottlingSelector.ts +1 -1
- package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +45 -15
- package/front_end/panels/mobile_throttling/ThrottlingManager.ts +3 -3
- package/front_end/panels/network/BinaryResourceView.ts +54 -50
- package/front_end/panels/network/RequestHeadersView.ts +6 -2
- package/front_end/panels/network/RequestPreviewView.ts +28 -5
- package/front_end/panels/network/ResourceWebSocketFrameView.ts +1 -0
- package/front_end/panels/network/components/EditableSpan.ts +11 -30
- package/front_end/panels/network/components/HeaderSectionRow.ts +2 -2
- package/front_end/panels/performance_monitor/PerformanceMonitor.ts +10 -6
- package/front_end/panels/profiler/HeapDetachedElementsView.ts +112 -22
- package/front_end/panels/profiler/HeapProfileView.ts +3 -3
- package/front_end/panels/profiler/HeapSnapshotView.ts +12 -2
- package/front_end/panels/profiler/HeapTimelineOverview.ts +16 -2
- package/front_end/panels/profiler/profiler.ts +0 -2
- package/front_end/panels/protocol_monitor/JSONEditor.ts +1 -1
- package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +1 -1
- package/front_end/panels/recorder/CreateRecordingView.ts +1 -1
- package/front_end/panels/recorder/RecordingView.ts +3 -3
- package/front_end/panels/recorder/ReplaySection.ts +1 -1
- package/front_end/panels/screencast/ScreencastApp.ts +83 -57
- package/front_end/panels/screencast/ScreencastView.ts +76 -45
- package/front_end/panels/screencast/screencastView.css +1 -1
- package/front_end/panels/settings/AISettingsTab.ts +107 -4
- package/front_end/panels/settings/aiSettingsTab.css +53 -0
- package/front_end/panels/settings/settings-meta.ts +1 -1
- package/front_end/panels/settings/settingsScreen.css +0 -4
- package/front_end/panels/sources/BreakpointEditDialog.ts +3 -6
- package/front_end/panels/sources/BreakpointsView.ts +2 -2
- package/front_end/panels/sources/DebuggerPlugin.ts +7 -0
- package/front_end/panels/sources/NavigatorView.ts +61 -18
- package/front_end/panels/sources/SourcesNavigator.ts +22 -7
- package/front_end/panels/sources/SourcesPanel.ts +1 -0
- package/front_end/panels/timeline/CountersGraph.ts +1 -1
- package/front_end/panels/timeline/README.md +12 -0
- package/front_end/panels/timeline/StatusDialog.ts +1 -1
- package/front_end/panels/timeline/ThirdPartyTreeView.ts +1 -3
- package/front_end/panels/timeline/TimelineCommentController.ts +346 -0
- package/front_end/panels/timeline/TimelineDetailsView.ts +24 -1
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +34 -30
- package/front_end/panels/timeline/TimelineFlameChartView.ts +24 -10
- package/front_end/panels/timeline/TimelinePanel.ts +12 -5
- package/front_end/panels/timeline/TimelineTreeView.ts +28 -6
- package/front_end/panels/timeline/components/LiveMetricsView.ts +1 -1
- package/front_end/panels/timeline/components/fieldSettingsDialog.css +2 -2
- package/front_end/panels/timeline/components/insights/baseInsightComponent.css +1 -1
- package/front_end/panels/timeline/overlays/components/entriesLinkOverlay.css +2 -2
- package/front_end/panels/timeline/overlays/components/entryLabelOverlay.css +9 -9
- package/front_end/panels/timeline/timeline-meta.ts +2 -2
- package/front_end/panels/timeline/timeline.ts +4 -0
- package/front_end/panels/timeline/timelineFlamechartPopover.css +2 -2
- package/front_end/panels/timeline/timelinePanel.css +2 -2
- package/front_end/panels/timeline/utils/EntryNodes.ts +1 -1
- package/front_end/panels/web_audio/WebAudioView.ts +7 -4
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/codemirror.next/chunk/angular.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/angular.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/codemirror.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/cpp.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/cpp.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/java.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/java.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/less.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/less.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/markdown.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/markdown.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/php.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/php.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/python.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/python.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/sass.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/sass.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/svelte.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/svelte.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/vue.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/vue.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/wast.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/wast.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/xml.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/xml.js.map +1 -1
- package/front_end/third_party/codemirror.next/codemirror.next.js +1 -1
- package/front_end/third_party/codemirror.next/rollup.config.mjs +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 +42 -12
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +154 -26
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.d.ts +47 -7
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.js +56 -4
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +6 -4
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +5 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPRequest.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPRequest.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js +23 -11
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.js +1 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.d.ts +13 -7
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.js +26 -11
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js +69 -13
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts +10 -0
- 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/revisions.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.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 +42 -12
- package/front_end/third_party/puppeteer/package/package.json +4 -4
- package/front_end/third_party/puppeteer/package/src/api/HTTPRequest.ts +103 -11
- package/front_end/third_party/puppeteer/package/src/api/Page.ts +11 -6
- package/front_end/third_party/puppeteer/package/src/bidi/HTTPRequest.ts +4 -4
- package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +26 -14
- package/front_end/third_party/puppeteer/package/src/cdp/HTTPRequest.ts +7 -7
- package/front_end/third_party/puppeteer/package/src/cdp/NetworkManager.ts +40 -18
- package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +2 -3
- package/front_end/third_party/puppeteer/package/src/cdp/TargetManager.ts +87 -14
- package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +10 -0
- package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/tsconfig.json +1 -1
- package/front_end/ui/comments/CommentAnchorResolver.ts +1 -1
- package/front_end/ui/components/buttons/Button.ts +29 -18
- package/front_end/ui/components/code_highlighter/CodeHighlighter.ts +1 -1
- package/front_end/ui/components/dialogs/TypeToAllowDialog.ts +94 -39
- package/front_end/ui/components/dialogs/dialog.css +1 -1
- package/front_end/ui/components/menus/menuItem.css +11 -0
- package/front_end/ui/components/text_editor/AccessiblePlaceholder.ts +1 -1
- package/front_end/ui/components/text_editor/AiCodeCompletionTeaser.ts +1 -1
- package/front_end/ui/components/text_editor/config.ts +2 -1
- package/front_end/ui/components/text_editor/javascript.ts +2 -1
- package/front_end/ui/legacy/InspectorView.ts +4 -2
- package/front_end/ui/legacy/SplitWidget.ts +23 -24
- package/front_end/ui/legacy/TabbedPane.ts +9 -1
- package/front_end/ui/legacy/UIUtils.ts +60 -40
- package/front_end/ui/legacy/components/color_picker/spectrum.css +2 -2
- package/front_end/ui/legacy/components/data_grid/dataGrid.css +9 -0
- package/front_end/ui/legacy/components/inline_editor/CSSAngle.ts +0 -1
- package/front_end/ui/legacy/components/inline_editor/cssShadowEditor.css +5 -7
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +1 -1
- package/front_end/ui/legacy/components/perf_ui/PieChart.ts +11 -0
- package/front_end/ui/legacy/components/perf_ui/chartViewport.css +4 -4
- package/front_end/ui/legacy/components/quick_open/filteredListWidget.css +6 -0
- package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +1 -1
- package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +38 -13
- package/front_end/ui/legacy/dropTarget.css +1 -1
- package/front_end/ui/legacy/statusBar.css +7 -0
- package/front_end/ui/legacy/tabbedPane.css +0 -7
- package/front_end/ui/visual_logging/KnownContextValues.ts +55 -0
- package/inspector_overlay/main.ts +2 -15
- package/inspector_overlay/tool_persistent.ts +0 -14
- package/mcp/mcp.ts +3 -0
- package/package.json +1 -1
- package/.agents/skills/devtools-ux-writing-refactor/SKILL.md +0 -142
- package/front_end/panels/ai_assistance/components/StylingAgentMarkdownRenderer.ts +0 -178
- package/front_end/panels/profiler/HeapDetachedElementsDataGrid.ts +0 -147
- package/front_end/panels/profiler/heapDetachedElementsDataGrid.css +0 -14
- package/front_end/ui/components/legacy_wrapper/LegacyWrapper.ts +0 -62
- package/front_end/ui/components/legacy_wrapper/legacy_wrapper.ts +0 -8
- package/inspector_overlay/tool_green_dev_anchors.css +0 -54
- package/inspector_overlay/tool_green_dev_anchors.ts +0 -164
- /package/front_end/models/{ai_assistance → ai-utils}/AiSetting.ts +0 -0
- /package/front_end/models/{ai_assistance → ai-utils}/debug.ts +0 -0
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
type Matcher,
|
|
19
19
|
stripComments,
|
|
20
20
|
} from './CSSPropertyParser.js';
|
|
21
|
-
import {CSSWideKeywordMatcher} from './CSSPropertyParserMatchers.js';
|
|
21
|
+
import {CSSWideKeywordMatcher, ImportantMatcher} from './CSSPropertyParserMatchers.js';
|
|
22
22
|
import type {CSSStyleDeclaration} from './CSSStyleDeclaration.js';
|
|
23
23
|
import {textEditorIndentSettingDescriptor} from './SDKSettings.js';
|
|
24
24
|
|
|
@@ -114,7 +114,7 @@ export class CSSProperty extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
|
|
|
114
114
|
#matchers(matchedStyles: CSSMatchedStyles, computedStyles: Map<string, string>|null): Array<Matcher<Match>> {
|
|
115
115
|
const matchers = matchedStyles.propertyMatchers(this.ownerStyle, computedStyles);
|
|
116
116
|
|
|
117
|
-
matchers.push(new CSSWideKeywordMatcher(this, matchedStyles));
|
|
117
|
+
matchers.push(new CSSWideKeywordMatcher(this, matchedStyles), new ImportantMatcher());
|
|
118
118
|
return matchers;
|
|
119
119
|
}
|
|
120
120
|
|
|
@@ -341,7 +341,7 @@ class ComputedTextChunk {
|
|
|
341
341
|
* original and computed slices as required.
|
|
342
342
|
**/
|
|
343
343
|
export class ComputedText {
|
|
344
|
-
|
|
344
|
+
#chunks: ComputedTextChunk[] = [];
|
|
345
345
|
readonly text: string;
|
|
346
346
|
readonly #topLevelValueCounts = new Map<string, number>();
|
|
347
347
|
|
|
@@ -356,6 +356,7 @@ export class ComputedText {
|
|
|
356
356
|
}
|
|
357
357
|
|
|
358
358
|
get chunkCount(): number {
|
|
359
|
+
this.#sortIfNecessary();
|
|
359
360
|
return this.#chunks.length;
|
|
360
361
|
}
|
|
361
362
|
|
|
@@ -363,6 +364,14 @@ export class ComputedText {
|
|
|
363
364
|
if (this.#sorted) {
|
|
364
365
|
return;
|
|
365
366
|
}
|
|
367
|
+
// A match that was pushed more than once is superseded by its last push.
|
|
368
|
+
const lastPush = new Map<Match, ComputedTextChunk>();
|
|
369
|
+
for (const chunk of this.#chunks) {
|
|
370
|
+
lastPush.set(chunk.match, chunk);
|
|
371
|
+
}
|
|
372
|
+
if (lastPush.size < this.#chunks.length) {
|
|
373
|
+
this.#chunks = this.#chunks.filter(chunk => lastPush.get(chunk.match) === chunk);
|
|
374
|
+
}
|
|
366
375
|
// Sort intervals by offset, with longer intervals first if the offset is identical.
|
|
367
376
|
this.#chunks.sort((a, b) => {
|
|
368
377
|
if (a.offset < b.offset) {
|
|
@@ -383,7 +392,7 @@ export class ComputedText {
|
|
|
383
392
|
}
|
|
384
393
|
|
|
385
394
|
// Add another substitutable match. The match will either be appended to the list of existing matches or it will
|
|
386
|
-
// be substituted for the last match(es) if it encompasses them.
|
|
395
|
+
// be substituted for the last match(es) if it encompasses them. Pushing a match again supersedes its earlier push.
|
|
387
396
|
push(match: Match, offset: number): void {
|
|
388
397
|
function hasComputedText(match: Match): match is MatchWithComputedText {
|
|
389
398
|
return Boolean(match.computedText);
|
|
@@ -360,6 +360,19 @@ export class TextMatcher extends TextMatcherBase {
|
|
|
360
360
|
}
|
|
361
361
|
}
|
|
362
362
|
|
|
363
|
+
export class ImportantMatch extends TextMatch {
|
|
364
|
+
override computedText = (): string => '';
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
const ImportantMatcherBase: MatcherClass<ImportantMatch> = matcherBase(ImportantMatch);
|
|
368
|
+
// clang-format off
|
|
369
|
+
export class ImportantMatcher extends ImportantMatcherBase {
|
|
370
|
+
// clang-format on
|
|
371
|
+
override matches(node: CodeMirror.SyntaxNode, matching: BottomUpTreeMatching): ImportantMatch|null {
|
|
372
|
+
return node.name === 'Important' ? new ImportantMatch(matching.ast.text(node), node) : null;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
363
376
|
export class AngleMatch implements Match {
|
|
364
377
|
constructor(readonly text: string, readonly node: CodeMirror.SyntaxNode) {
|
|
365
378
|
}
|
|
@@ -1167,14 +1180,15 @@ export class FlexGridGridLanesMatcher extends FlexGridGridLanesMatcherBase {
|
|
|
1167
1180
|
.map(node => matching.getComputedText(node).trim())
|
|
1168
1181
|
.filter(value => value);
|
|
1169
1182
|
const text = values.join(' ');
|
|
1183
|
+
const valueText = matching.ast.textRange(valueNodes[0], valueNodes[valueNodes.length - 1]);
|
|
1170
1184
|
if (FlexGridGridLanesMatcher.FLEX.includes(text)) {
|
|
1171
|
-
return new FlexGridGridLanesMatch(
|
|
1185
|
+
return new FlexGridGridLanesMatch(valueText, node, LayoutType.FLEX);
|
|
1172
1186
|
}
|
|
1173
1187
|
if (FlexGridGridLanesMatcher.GRID.includes(text)) {
|
|
1174
|
-
return new FlexGridGridLanesMatch(
|
|
1188
|
+
return new FlexGridGridLanesMatch(valueText, node, LayoutType.GRID);
|
|
1175
1189
|
}
|
|
1176
1190
|
if (FlexGridGridLanesMatcher.GRID_LANES.includes(text)) {
|
|
1177
|
-
return new FlexGridGridLanesMatch(
|
|
1191
|
+
return new FlexGridGridLanesMatch(valueText, node, LayoutType.GRID_LANES);
|
|
1178
1192
|
}
|
|
1179
1193
|
return null;
|
|
1180
1194
|
}
|
|
@@ -1360,7 +1374,11 @@ export class CSSWideKeywordMatch implements Match {
|
|
|
1360
1374
|
return this.matchedStyles.resolveGlobalKeyword(this.property, this.text);
|
|
1361
1375
|
}
|
|
1362
1376
|
computedText?(): string|null {
|
|
1363
|
-
return this.resolveProperty()
|
|
1377
|
+
return this.resolveProperty()
|
|
1378
|
+
?.declaration.parseValue(this.matchedStyles, null)
|
|
1379
|
+
?.getComputedPropertyValueText()
|
|
1380
|
+
.trim() ??
|
|
1381
|
+
null;
|
|
1364
1382
|
}
|
|
1365
1383
|
}
|
|
1366
1384
|
|
|
@@ -1379,6 +1397,7 @@ export class CSSWideKeywordMatcher extends CSSWideKeywordMatcherBase {
|
|
|
1379
1397
|
}
|
|
1380
1398
|
|
|
1381
1399
|
if (Array.from(ASTUtils.stripComments(ASTUtils.siblings(ASTUtils.declValue(parentNode))))
|
|
1400
|
+
.filter(child => child.name !== 'Important')
|
|
1382
1401
|
.some(child => !ASTUtils.equals(child, node))) {
|
|
1383
1402
|
return null;
|
|
1384
1403
|
}
|
|
@@ -1416,18 +1435,17 @@ export class PositionTryMatcher extends PositionTryMatcherBase {
|
|
|
1416
1435
|
let preamble: CodeMirror.SyntaxNode[] = [];
|
|
1417
1436
|
const valueNodes = ASTUtils.siblings(ASTUtils.declValue(node));
|
|
1418
1437
|
const fallbacks = ASTUtils.split(valueNodes);
|
|
1419
|
-
if (matching.ast.propertyName === LinkableNameProperties.POSITION_TRY) {
|
|
1420
1438
|
for (const [i, n] of fallbacks[0].entries()) {
|
|
1421
1439
|
const computedText = matching.getComputedText(n);
|
|
1422
1440
|
if (CSSMetadata.isCSSWideKeyword(computedText)) {
|
|
1423
1441
|
return null;
|
|
1424
1442
|
}
|
|
1425
|
-
if (
|
|
1443
|
+
if (matching.ast.propertyName === LinkableNameProperties.POSITION_TRY &&
|
|
1444
|
+
CSSMetadata.isPositionTryOrderKeyword(computedText)) {
|
|
1426
1445
|
preamble = fallbacks[0].splice(0, i + 1);
|
|
1427
1446
|
break;
|
|
1428
1447
|
}
|
|
1429
1448
|
}
|
|
1430
|
-
}
|
|
1431
1449
|
|
|
1432
1450
|
const valueText = matching.ast.textRange(valueNodes[0], valueNodes[valueNodes.length - 1]);
|
|
1433
1451
|
return new PositionTryMatch(valueText, node, preamble, fallbacks);
|
|
@@ -1493,10 +1511,11 @@ export class PositionAreaMatcher extends PositionAreaMatcherBase {
|
|
|
1493
1511
|
if (valueNodes.length === 0) {
|
|
1494
1512
|
return null;
|
|
1495
1513
|
}
|
|
1496
|
-
const
|
|
1497
|
-
if (CSSMetadata.isCSSWideKeyword(
|
|
1514
|
+
const computedText = matching.getComputedTextRange(valueNodes[0], valueNodes[valueNodes.length - 1]).trim();
|
|
1515
|
+
if (CSSMetadata.isCSSWideKeyword(computedText)) {
|
|
1498
1516
|
return null;
|
|
1499
1517
|
}
|
|
1518
|
+
const valueText = matching.ast.textRange(valueNodes[0], valueNodes[valueNodes.length - 1]);
|
|
1500
1519
|
return new PositionAreaMatch(valueText, node);
|
|
1501
1520
|
}
|
|
1502
1521
|
}
|
|
@@ -1188,7 +1188,7 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
|
|
|
1188
1188
|
}
|
|
1189
1189
|
|
|
1190
1190
|
marker<T>(name: string): T|null {
|
|
1191
|
-
return this.#markers.get(name) as T
|
|
1191
|
+
return (this.#markers.get(name) as T) ?? null;
|
|
1192
1192
|
}
|
|
1193
1193
|
|
|
1194
1194
|
getMarkerKeysForTest(): string[] {
|
|
@@ -959,6 +959,9 @@ export class DebuggerModel extends SDKModel<EventTypes> {
|
|
|
959
959
|
this.#disableAsyncStackTracesSetting.removeChangeListener(this.asyncStackTracesStateChanged, this);
|
|
960
960
|
this.#breakpointsActiveSetting.removeChangeListener(this.breakpointsActiveChanged, this);
|
|
961
961
|
this.#jsSourceMapsEnabledSetting.removeChangeListener(this.jsSourceMapsStateChanged, this);
|
|
962
|
+
// Drop all scripts and their source maps, so they don't outlive the target in case something
|
|
963
|
+
// still holds on to this model (e.g. a console message with "Preserve log" enabled).
|
|
964
|
+
this.reset();
|
|
962
965
|
}
|
|
963
966
|
|
|
964
967
|
override async suspendModel(): Promise<void> {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
|
|
6
6
|
import * as Protocol from '../../generated/protocol.js';
|
|
7
|
-
import
|
|
7
|
+
import * as Common from '../common/common.js';
|
|
8
8
|
|
|
9
9
|
import {CSSModel} from './CSSModel.js';
|
|
10
10
|
import type {MultitargetNetworkManager} from './NetworkManager.js';
|
|
@@ -59,7 +59,7 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
|
|
|
59
59
|
#screenOrientationLocked: boolean;
|
|
60
60
|
#lockedOrientation: Protocol.Emulation.ScreenOrientation|null;
|
|
61
61
|
readonly #dataSaverSetting: Common.Settings.Setting<DataSaverOverride>;
|
|
62
|
-
readonly #
|
|
62
|
+
readonly #settingListeners: Common.EventTarget.EventDescriptor[] = [];
|
|
63
63
|
|
|
64
64
|
constructor(target: Target) {
|
|
65
65
|
super(target);
|
|
@@ -78,22 +78,22 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
|
|
|
78
78
|
|
|
79
79
|
const settings = this.target().targetManager().settings;
|
|
80
80
|
const disableJavascriptSetting = settings.resolve(javaScriptDisabledSettingDescriptor);
|
|
81
|
-
disableJavascriptSetting.addChangeListener(
|
|
81
|
+
this.#settingListeners.push(disableJavascriptSetting.addChangeListener(
|
|
82
82
|
async () =>
|
|
83
|
-
await this.#emulationAgent.invoke_setScriptExecutionDisabled({value: disableJavascriptSetting.get()}));
|
|
83
|
+
await this.#emulationAgent.invoke_setScriptExecutionDisabled({value: disableJavascriptSetting.get()})));
|
|
84
84
|
if (disableJavascriptSetting.get()) {
|
|
85
85
|
void this.#emulationAgent.invoke_setScriptExecutionDisabled({value: true});
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
const touchSetting = settings.resolve(touchSettingDescriptor);
|
|
89
|
-
touchSetting.addChangeListener(() => {
|
|
89
|
+
this.#settingListeners.push(touchSetting.addChangeListener(() => {
|
|
90
90
|
const settingValue = touchSetting.get();
|
|
91
91
|
|
|
92
92
|
void this.overrideEmulateTouch(settingValue === 'force');
|
|
93
|
-
});
|
|
93
|
+
}));
|
|
94
94
|
|
|
95
95
|
const idleDetectionSetting = settings.resolve(idleDetectionSettingDescriptor);
|
|
96
|
-
idleDetectionSetting.addChangeListener(async () => {
|
|
96
|
+
this.#settingListeners.push(idleDetectionSetting.addChangeListener(async () => {
|
|
97
97
|
const settingValue = idleDetectionSetting.get();
|
|
98
98
|
if (settingValue === 'none') {
|
|
99
99
|
await this.clearIdleOverride();
|
|
@@ -105,10 +105,10 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
|
|
|
105
105
|
isScreenUnlocked: boolean,
|
|
106
106
|
});
|
|
107
107
|
await this.setIdleOverride(emulationParams);
|
|
108
|
-
});
|
|
108
|
+
}));
|
|
109
109
|
|
|
110
110
|
const cpuPressureDetectionSetting = settings.resolve(cpuPressureSettingDescriptor);
|
|
111
|
-
cpuPressureDetectionSetting.addChangeListener(async () => {
|
|
111
|
+
this.#settingListeners.push(cpuPressureDetectionSetting.addChangeListener(async () => {
|
|
112
112
|
const settingValue = cpuPressureDetectionSetting.get();
|
|
113
113
|
|
|
114
114
|
if (settingValue === 'none') {
|
|
@@ -123,7 +123,7 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
|
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
await this.setPressureStateOverride(settingValue);
|
|
126
|
-
});
|
|
126
|
+
}));
|
|
127
127
|
|
|
128
128
|
const mediaTypeSetting = settings.resolve(emulatedCSSMediaSettingDescriptor);
|
|
129
129
|
const mediaFeatureColorGamutSetting = settings.resolve(emulatedCSSMediaFeatureColorGamutSettingDescriptor);
|
|
@@ -152,67 +152,69 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
|
|
|
152
152
|
['prefers-reduced-motion', mediaFeaturePrefersReducedMotionSetting.get()],
|
|
153
153
|
['prefers-reduced-transparency', mediaFeaturePrefersReducedTransparencySetting.get()],
|
|
154
154
|
]);
|
|
155
|
-
mediaTypeSetting.addChangeListener(() => {
|
|
155
|
+
this.#settingListeners.push(mediaTypeSetting.addChangeListener(() => {
|
|
156
156
|
this.#mediaConfiguration.set('type', mediaTypeSetting.get());
|
|
157
157
|
void this.updateCssMedia();
|
|
158
|
-
});
|
|
159
|
-
mediaFeatureColorGamutSetting.addChangeListener(() => {
|
|
158
|
+
}));
|
|
159
|
+
this.#settingListeners.push(mediaFeatureColorGamutSetting.addChangeListener(() => {
|
|
160
160
|
this.#mediaConfiguration.set('color-gamut', mediaFeatureColorGamutSetting.get());
|
|
161
161
|
void this.updateCssMedia();
|
|
162
|
-
});
|
|
163
|
-
mediaFeaturePrefersColorSchemeSetting.addChangeListener(() => {
|
|
162
|
+
}));
|
|
163
|
+
this.#settingListeners.push(mediaFeaturePrefersColorSchemeSetting.addChangeListener(() => {
|
|
164
164
|
this.#mediaConfiguration.set('prefers-color-scheme', mediaFeaturePrefersColorSchemeSetting.get());
|
|
165
165
|
void this.updateCssMedia();
|
|
166
|
-
});
|
|
167
|
-
mediaFeatureForcedColorsSetting.addChangeListener(() => {
|
|
166
|
+
}));
|
|
167
|
+
this.#settingListeners.push(mediaFeatureForcedColorsSetting.addChangeListener(() => {
|
|
168
168
|
this.#mediaConfiguration.set('forced-colors', mediaFeatureForcedColorsSetting.get());
|
|
169
169
|
void this.updateCssMedia();
|
|
170
|
-
});
|
|
171
|
-
mediaFeaturePrefersContrastSetting.addChangeListener(() => {
|
|
170
|
+
}));
|
|
171
|
+
this.#settingListeners.push(mediaFeaturePrefersContrastSetting.addChangeListener(() => {
|
|
172
172
|
this.#mediaConfiguration.set('prefers-contrast', mediaFeaturePrefersContrastSetting.get());
|
|
173
173
|
void this.updateCssMedia();
|
|
174
|
-
});
|
|
175
|
-
mediaFeaturePrefersReducedDataSetting.addChangeListener(() => {
|
|
174
|
+
}));
|
|
175
|
+
this.#settingListeners.push(mediaFeaturePrefersReducedDataSetting.addChangeListener(() => {
|
|
176
176
|
this.#mediaConfiguration.set('prefers-reduced-data', mediaFeaturePrefersReducedDataSetting.get());
|
|
177
177
|
void this.updateCssMedia();
|
|
178
|
-
});
|
|
179
|
-
mediaFeaturePrefersReducedMotionSetting.addChangeListener(() => {
|
|
178
|
+
}));
|
|
179
|
+
this.#settingListeners.push(mediaFeaturePrefersReducedMotionSetting.addChangeListener(() => {
|
|
180
180
|
this.#mediaConfiguration.set('prefers-reduced-motion', mediaFeaturePrefersReducedMotionSetting.get());
|
|
181
181
|
void this.updateCssMedia();
|
|
182
|
-
});
|
|
183
|
-
mediaFeaturePrefersReducedTransparencySetting.addChangeListener(() => {
|
|
182
|
+
}));
|
|
183
|
+
this.#settingListeners.push(mediaFeaturePrefersReducedTransparencySetting.addChangeListener(() => {
|
|
184
184
|
this.#mediaConfiguration.set('prefers-reduced-transparency', mediaFeaturePrefersReducedTransparencySetting.get());
|
|
185
185
|
void this.updateCssMedia();
|
|
186
|
-
});
|
|
186
|
+
}));
|
|
187
187
|
void this.updateCssMedia();
|
|
188
188
|
|
|
189
189
|
const autoDarkModeSetting = settings.resolve(emulateAutoDarkModeSettingDescriptor);
|
|
190
|
-
autoDarkModeSetting.addChangeListener(() => {
|
|
190
|
+
this.#settingListeners.push(autoDarkModeSetting.addChangeListener(() => {
|
|
191
191
|
const enabled = autoDarkModeSetting.get();
|
|
192
192
|
mediaFeaturePrefersColorSchemeSetting.set(enabled ? 'dark' : '');
|
|
193
193
|
void this.emulateAutoDarkMode(enabled);
|
|
194
|
-
});
|
|
194
|
+
}));
|
|
195
195
|
if (autoDarkModeSetting.get()) {
|
|
196
196
|
mediaFeaturePrefersColorSchemeSetting.set('dark');
|
|
197
197
|
void this.emulateAutoDarkMode(true);
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
const visionDeficiencySetting = settings.resolve(emulatedVisionDeficiencySettingDescriptor);
|
|
201
|
-
|
|
201
|
+
this.#settingListeners.push(
|
|
202
|
+
visionDeficiencySetting.addChangeListener(() => this.emulateVisionDeficiency(visionDeficiencySetting.get())));
|
|
202
203
|
if (visionDeficiencySetting.get()) {
|
|
203
204
|
void this.emulateVisionDeficiency(visionDeficiencySetting.get());
|
|
204
205
|
}
|
|
205
206
|
|
|
206
207
|
const osTextScaleSetting = settings.resolve(emulatedOSTextScaleSettingDescriptor);
|
|
207
|
-
osTextScaleSetting.addChangeListener(() => {
|
|
208
|
+
this.#settingListeners.push(osTextScaleSetting.addChangeListener(() => {
|
|
208
209
|
void this.emulateOSTextScale(parseFloat(osTextScaleSetting.get()) || undefined);
|
|
209
|
-
});
|
|
210
|
+
}));
|
|
210
211
|
if (osTextScaleSetting.get()) {
|
|
211
212
|
void this.emulateOSTextScale(parseFloat(osTextScaleSetting.get()) || undefined);
|
|
212
213
|
}
|
|
213
214
|
|
|
214
215
|
const localFontsDisabledSetting = settings.resolve(localFontsDisabledSettingDescriptor);
|
|
215
|
-
|
|
216
|
+
this.#settingListeners.push(
|
|
217
|
+
localFontsDisabledSetting.addChangeListener(() => this.setLocalFontsDisabled(localFontsDisabledSetting.get())));
|
|
216
218
|
if (localFontsDisabledSetting.get()) {
|
|
217
219
|
this.setLocalFontsDisabled(localFontsDisabledSetting.get());
|
|
218
220
|
}
|
|
@@ -235,19 +237,18 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
|
|
|
235
237
|
this.setDisabledImageTypes(types);
|
|
236
238
|
};
|
|
237
239
|
|
|
238
|
-
avifFormatDisabledSetting.addChangeListener(updateDisabledImageFormats);
|
|
239
|
-
jpegXlFormatDisabledSetting.addChangeListener(updateDisabledImageFormats);
|
|
240
|
-
webpFormatDisabledSetting.addChangeListener(updateDisabledImageFormats);
|
|
240
|
+
this.#settingListeners.push(avifFormatDisabledSetting.addChangeListener(updateDisabledImageFormats));
|
|
241
|
+
this.#settingListeners.push(jpegXlFormatDisabledSetting.addChangeListener(updateDisabledImageFormats));
|
|
242
|
+
this.#settingListeners.push(webpFormatDisabledSetting.addChangeListener(updateDisabledImageFormats));
|
|
241
243
|
|
|
242
244
|
if (avifFormatDisabledSetting.get() || jpegXlFormatDisabledSetting.get() || webpFormatDisabledSetting.get()) {
|
|
243
245
|
updateDisabledImageFormats();
|
|
244
246
|
}
|
|
245
247
|
|
|
246
248
|
this.#dataSaverSetting = settings.resolve(dataSaverSettingDescriptor);
|
|
247
|
-
this.#
|
|
249
|
+
this.#settingListeners.push(this.#dataSaverSetting.addChangeListener(() => {
|
|
248
250
|
void this.setDataSaverOverride(this.#dataSaverSetting.get());
|
|
249
|
-
};
|
|
250
|
-
this.#dataSaverSetting.addChangeListener(this.#dataSaverChangeListener, this);
|
|
251
|
+
}));
|
|
251
252
|
if (this.#dataSaverSetting.get() !== DataSaverOverride.UNSET) {
|
|
252
253
|
void this.setDataSaverOverride(this.#dataSaverSetting.get());
|
|
253
254
|
}
|
|
@@ -266,7 +267,7 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
|
|
|
266
267
|
|
|
267
268
|
override dispose(): void {
|
|
268
269
|
super.dispose();
|
|
269
|
-
|
|
270
|
+
Common.EventTarget.removeEventListeners(this.#settingListeners);
|
|
270
271
|
}
|
|
271
272
|
|
|
272
273
|
setTouchEmulationAllowed(touchEmulationAllowed: boolean): void {
|
|
@@ -563,6 +563,7 @@ export class NetworkManager extends SDKModel<EventTypes> {
|
|
|
563
563
|
const settings = this.target().targetManager().settings;
|
|
564
564
|
settings.resolve(cacheDisabledSettingDescriptor).removeChangeListener(this.cacheDisabledSettingChanged, this);
|
|
565
565
|
settings.resolve(preserveNetworkLogSettingDescriptor).removeChangeListener(this.preserveLogChanged, this);
|
|
566
|
+
this.#bypassServiceWorkerSetting.removeChangeListener(this.bypassServiceWorkerChanged, this);
|
|
566
567
|
}
|
|
567
568
|
|
|
568
569
|
private bypassServiceWorkerChanged(): void {
|
|
@@ -762,6 +763,11 @@ export class FetchDispatcher implements ProtocolProxyApi.FetchDispatcher {
|
|
|
762
763
|
}
|
|
763
764
|
}
|
|
764
765
|
|
|
766
|
+
function multicastMembership(event: Pick<Protocol.Network.DirectUDPSocketJoinedMulticastGroupEvent, 'IPAddress'>&
|
|
767
|
+
{sourceAddress?: string}): string {
|
|
768
|
+
return event.sourceAddress ? `${event.IPAddress}@${event.sourceAddress}` : event.IPAddress;
|
|
769
|
+
}
|
|
770
|
+
|
|
765
771
|
export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher {
|
|
766
772
|
readonly #manager: NetworkManager;
|
|
767
773
|
readonly #multitargetNetworkManager: MultitargetNetworkManager;
|
|
@@ -1742,8 +1748,9 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher {
|
|
|
1742
1748
|
if (!networkRequest.directSocketInfo.joinedMulticastGroups) {
|
|
1743
1749
|
networkRequest.directSocketInfo.joinedMulticastGroups = new Set();
|
|
1744
1750
|
}
|
|
1745
|
-
|
|
1746
|
-
|
|
1751
|
+
const membership = multicastMembership(event);
|
|
1752
|
+
if (!networkRequest.directSocketInfo.joinedMulticastGroups.has(membership)) {
|
|
1753
|
+
networkRequest.directSocketInfo.joinedMulticastGroups.add(membership);
|
|
1747
1754
|
this.updateNetworkRequest(networkRequest);
|
|
1748
1755
|
}
|
|
1749
1756
|
}
|
|
@@ -1753,7 +1760,7 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher {
|
|
|
1753
1760
|
if (!networkRequest?.directSocketInfo?.joinedMulticastGroups) {
|
|
1754
1761
|
return;
|
|
1755
1762
|
}
|
|
1756
|
-
if (networkRequest.directSocketInfo.joinedMulticastGroups.delete(event
|
|
1763
|
+
if (networkRequest.directSocketInfo.joinedMulticastGroups.delete(multicastMembership(event))) {
|
|
1757
1764
|
this.updateNetworkRequest(networkRequest);
|
|
1758
1765
|
}
|
|
1759
1766
|
}
|
|
@@ -1506,6 +1506,27 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper<EventType
|
|
|
1506
1506
|
return this.#contentData;
|
|
1507
1507
|
}
|
|
1508
1508
|
|
|
1509
|
+
/**
|
|
1510
|
+
* Returns the response body without waiting for the request to finish loading.
|
|
1511
|
+
*
|
|
1512
|
+
* `requestContentData()` waits for `FINISHED_LOADING` when the request has no
|
|
1513
|
+
* content data provider. Some requests never finish: Chrome does not send
|
|
1514
|
+
* `loadingFinished` for a `Cache-Control: no-store` fetch() whose body the page
|
|
1515
|
+
* never reads, and synthetic requests without a provider are never finished at all.
|
|
1516
|
+
* Callers that must not block, such as AI context building, use this method instead.
|
|
1517
|
+
*
|
|
1518
|
+
* Requests with a content data provider (Local Overrides, Cache Storage, HAR
|
|
1519
|
+
* imports) resolve even when they have not finished.
|
|
1520
|
+
*/
|
|
1521
|
+
requestContentDataIfAvailable(): Promise<TextUtils.ContentData.ContentDataOrError> {
|
|
1522
|
+
// A content data provider returns the body without waiting for the request
|
|
1523
|
+
// to finish, so only requests without a content data provider can block.
|
|
1524
|
+
if (!this.finished && !this.#contentDataProvider) {
|
|
1525
|
+
return Promise.resolve({error: 'Request has not finished loading'});
|
|
1526
|
+
}
|
|
1527
|
+
return this.requestContentData();
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1509
1530
|
setContentDataProvider(
|
|
1510
1531
|
dataProvider: () => Promise<TextUtils.ContentData.ContentDataOrError>,
|
|
1511
1532
|
): void {
|
|
@@ -887,12 +887,10 @@ export class OverlayModel extends SDKModel<EventTypes> implements ProtocolProxyA
|
|
|
887
887
|
return await this.#windowControls.initializeStyleSheetText(url);
|
|
888
888
|
}
|
|
889
889
|
|
|
890
|
-
inspectPanelShowRequested(
|
|
891
|
-
this.dispatchEventToListeners(Events.INSPECT_PANEL_SHOW_REQUESTED, backendNodeId);
|
|
890
|
+
inspectPanelShowRequested(_event: Protocol.Overlay.InspectPanelShowRequestedEvent): void {
|
|
892
891
|
}
|
|
893
892
|
|
|
894
|
-
inspectedElementWindowRestored(
|
|
895
|
-
this.dispatchEventToListeners(Events.INSPECTED_ELEMENT_WINDOW_RESTORED, backendNodeId);
|
|
893
|
+
inspectedElementWindowRestored(_event: Protocol.Overlay.InspectedElementWindowRestoredEvent): void {
|
|
896
894
|
}
|
|
897
895
|
}
|
|
898
896
|
|
|
@@ -1028,8 +1026,6 @@ export const enum Events {
|
|
|
1028
1026
|
PERSISTENT_FLEX_CONTAINER_OVERLAY_STATE_CHANGED = 'PersistentFlexContainerOverlayStateChanged',
|
|
1029
1027
|
PERSISTENT_SCROLL_SNAP_OVERLAY_STATE_CHANGED = 'PersistentScrollSnapOverlayStateChanged',
|
|
1030
1028
|
PERSISTENT_CONTAINER_QUERY_OVERLAY_STATE_CHANGED = 'PersistentContainerQueryOverlayStateChanged',
|
|
1031
|
-
INSPECT_PANEL_SHOW_REQUESTED = 'InspectPanelShowRequested',
|
|
1032
|
-
INSPECTED_ELEMENT_WINDOW_RESTORED = 'InspectedElementWindowRestored',
|
|
1033
1029
|
}
|
|
1034
1030
|
|
|
1035
1031
|
export interface ChangedNodeId {
|
|
@@ -1046,8 +1042,6 @@ export interface EventTypes {
|
|
|
1046
1042
|
[Events.PERSISTENT_FLEX_CONTAINER_OVERLAY_STATE_CHANGED]: ChangedNodeId;
|
|
1047
1043
|
[Events.PERSISTENT_SCROLL_SNAP_OVERLAY_STATE_CHANGED]: ChangedNodeId;
|
|
1048
1044
|
[Events.PERSISTENT_CONTAINER_QUERY_OVERLAY_STATE_CHANGED]: ChangedNodeId;
|
|
1049
|
-
[Events.INSPECT_PANEL_SHOW_REQUESTED]: number;
|
|
1050
|
-
[Events.INSPECTED_ELEMENT_WINDOW_RESTORED]: number;
|
|
1051
1045
|
}
|
|
1052
1046
|
|
|
1053
1047
|
export interface Highlighter {
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Copyright 2026 The Chromium Authors
|
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
|
|
6
|
+
import type * as Protocol from '../../generated/protocol.js';
|
|
7
|
+
|
|
8
|
+
import {SDKModel} from './SDKModel.js';
|
|
9
|
+
import {Capability, type Target} from './Target.js';
|
|
10
|
+
|
|
11
|
+
export class PrivateVerificationTokensModel extends SDKModel<EventTypes> implements ProtocolProxyApi.StorageDispatcher {
|
|
12
|
+
readonly #storageAgent: ProtocolProxyApi.StorageApi;
|
|
13
|
+
|
|
14
|
+
constructor(target: Target) {
|
|
15
|
+
super(target);
|
|
16
|
+
target.registerStorageDispatcher(this);
|
|
17
|
+
this.#storageAgent = target.storageAgent();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
setTracking(enable: boolean): void {
|
|
21
|
+
void this.#storageAgent.invoke_setPrivateVerificationTokensTracking({enable});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async getTokens(): Promise<Protocol.Storage.PrivateVerificationToken[]> {
|
|
25
|
+
const response = await this.#storageAgent.invoke_getPrivateVerificationTokens();
|
|
26
|
+
if (response.getError()) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
return response.tokens ?? [];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async getIssuerConfigs(): Promise<Protocol.Storage.PrivateVerificationTokensIssuerConfig[]> {
|
|
33
|
+
const response = await this.#storageAgent.invoke_getPrivateVerificationTokensIssuerConfigs();
|
|
34
|
+
if (response.getError()) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
return response.configs ?? [];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async clearTokens(issuerOrigin: string): Promise<void> {
|
|
41
|
+
await this.#storageAgent.invoke_clearPrivateVerificationTokens({issuerOrigin});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async deleteToken(tokenId: string): Promise<void> {
|
|
45
|
+
await this.#storageAgent.invoke_deletePrivateVerificationToken({tokenId});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
privateVerificationTokensUpdated(): void {
|
|
49
|
+
this.dispatchEventToListeners(Events.TOKENS_UPDATED);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
cacheStorageContentUpdated(_event: Protocol.Storage.CacheStorageContentUpdatedEvent): void {
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
cacheStorageListUpdated(_event: Protocol.Storage.CacheStorageListUpdatedEvent): void {
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
indexedDBContentUpdated(_event: Protocol.Storage.IndexedDBContentUpdatedEvent): void {
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
indexedDBListUpdated(_event: Protocol.Storage.IndexedDBListUpdatedEvent): void {
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
storageBucketCreatedOrUpdated(_event: Protocol.Storage.StorageBucketCreatedOrUpdatedEvent): void {
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
storageBucketDeleted(_event: Protocol.Storage.StorageBucketDeletedEvent): void {
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
SDKModel.register(PrivateVerificationTokensModel, {capabilities: Capability.STORAGE, autostart: false});
|
|
72
|
+
|
|
73
|
+
export const enum Events {
|
|
74
|
+
TOKENS_UPDATED = 'TokensUpdated',
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface EventTypes {
|
|
78
|
+
[Events.TOKENS_UPDATED]: void;
|
|
79
|
+
}
|
|
@@ -27,6 +27,7 @@ export class RuntimeModel extends SDKModel<EventTypes> {
|
|
|
27
27
|
readonly agent: ProtocolProxyApi.RuntimeApi;
|
|
28
28
|
readonly #executionContextById = new Map<number, ExecutionContext>();
|
|
29
29
|
#executionContextComparator: (arg0: ExecutionContext, arg1: ExecutionContext) => number = ExecutionContext.comparator;
|
|
30
|
+
readonly #customFormattersSetting: Common.Settings.Setting<boolean>;
|
|
30
31
|
constructor(target: Target) {
|
|
31
32
|
super(target);
|
|
32
33
|
|
|
@@ -34,13 +35,17 @@ export class RuntimeModel extends SDKModel<EventTypes> {
|
|
|
34
35
|
this.target().registerRuntimeDispatcher(new RuntimeDispatcher(this));
|
|
35
36
|
void this.agent.invoke_enable();
|
|
36
37
|
|
|
37
|
-
|
|
38
|
+
this.#customFormattersSetting =
|
|
38
39
|
this.target().targetManager().context.get(Common.Settings.Settings).resolve(customFormattersSettingDescriptor);
|
|
39
|
-
if (customFormattersSetting.get()) {
|
|
40
|
+
if (this.#customFormattersSetting.get()) {
|
|
40
41
|
void this.agent.invoke_setCustomObjectFormatterEnabled({enabled: true});
|
|
41
42
|
}
|
|
42
43
|
|
|
43
|
-
customFormattersSetting.addChangeListener(this.customFormattersStateChanged
|
|
44
|
+
this.#customFormattersSetting.addChangeListener(this.customFormattersStateChanged, this);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
override dispose(): void {
|
|
48
|
+
this.#customFormattersSetting.removeChangeListener(this.customFormattersStateChanged, this);
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
static isSideEffectFailure(response: Protocol.Runtime.EvaluateResponse|EvaluationResult): boolean {
|
|
@@ -113,7 +113,7 @@ export class SecurityOrigin {
|
|
|
113
113
|
|
|
114
114
|
if (rawUrl.toLowerCase().startsWith('file://')) {
|
|
115
115
|
const parsed = Common.ParsedURL.ParsedURL.fromString(rawUrl as Platform.DevToolsPath.UrlString);
|
|
116
|
-
if (!parsed) {
|
|
116
|
+
if (!parsed || parsed.path === '/') {
|
|
117
117
|
return SecurityOrigin.createUniqueOpaque();
|
|
118
118
|
}
|
|
119
119
|
const authority = parsed.host + (parsed.port ? ':' + parsed.port : '');
|