chrome-devtools-frontend 1.0.1657855 → 1.0.1661063
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/evaluate-ai-css-completion/SKILL.md +133 -0
- package/.agents/skills/evaluate-ai-css-completion/scripts/evaluate.js +76 -0
- package/.agents/skills/migrate-chromium-test/SKILL.md +15 -70
- package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +37 -18
- package/.agents/skills/version-control/SKILL.md +8 -1
- package/AUTHORS +1 -0
- package/SECURITY.md +3 -0
- package/docs/get_the_code.md +6 -0
- package/eslint.config.mjs +7 -0
- package/extension-api/ExtensionAPI.d.ts +88 -0
- package/front_end/Tests.js +6 -6
- package/front_end/core/common/Gzip.ts +12 -5
- package/front_end/core/host/AidaClient.ts +35 -9
- package/front_end/core/host/GdpClient.ts +10 -7
- package/front_end/core/host/InspectorFrontendHost.ts +1 -0
- package/front_end/core/host/InspectorFrontendHostStub.ts +2 -0
- package/front_end/core/platform/StringUtilities.ts +55 -4
- package/front_end/core/sdk/AccessibilityModel.snapshot.txt +17 -0
- package/front_end/core/sdk/AccessibilityModel.ts +132 -2
- package/front_end/core/sdk/CPUThrottlingManager.ts +10 -5
- package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +2 -5
- package/front_end/core/sdk/ConsoleModel.ts +5 -5
- package/front_end/core/sdk/DOMDebuggerModel.ts +7 -1
- package/front_end/core/sdk/DOMModel.ts +33 -18
- package/front_end/core/sdk/DebuggerModel.ts +4 -4
- package/front_end/core/sdk/EventBreakpointsModel.ts +2 -0
- package/front_end/core/sdk/FrameManager.ts +1 -0
- package/front_end/core/sdk/IsolateManager.ts +1 -0
- package/front_end/core/sdk/NetworkManager.ts +59 -11
- package/front_end/core/sdk/NetworkRequest.ts +38 -1
- package/front_end/core/sdk/OverlayModel.ts +45 -6
- package/front_end/core/sdk/PageResourceLoader.ts +2 -0
- package/front_end/core/sdk/ResourceTreeModel.ts +6 -7
- package/front_end/core/sdk/ScreenCaptureModel.ts +2 -2
- package/front_end/core/sdk/ServerTiming.ts +17 -13
- package/front_end/core/sdk/ServiceWorkerCacheModel.ts +4 -2
- package/front_end/core/sdk/ServiceWorkerManager.ts +19 -5
- package/front_end/core/sdk/SourceMap.ts +5 -5
- package/front_end/core/sdk/SourceMapManager.ts +3 -2
- package/front_end/core/sdk/TargetManager.ts +14 -1
- package/front_end/core/sdk/TraceObject.ts +4 -2
- package/front_end/core/sdk/sdk-meta.ts +170 -0
- package/front_end/design_system_tokens.css +0 -5
- package/front_end/entrypoints/formatter_worker/FormattedContentBuilder.ts +5 -2
- package/front_end/entrypoints/formatter_worker/HTMLFormatter.ts +26 -4
- package/front_end/entrypoints/formatter_worker/JavaScriptFormatter.ts +8 -3
- package/front_end/entrypoints/inspector_main/InspectorMain.ts +4 -4
- package/front_end/entrypoints/inspector_main/OutermostTargetSelector.ts +2 -2
- package/front_end/entrypoints/inspector_main/RenderingOptions.ts +36 -37
- package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +15 -33
- package/front_end/entrypoints/js_app/js_app.ts +6 -5
- package/front_end/entrypoints/main/GlobalAiButton.ts +4 -4
- package/front_end/entrypoints/main/MainImpl.ts +20 -22
- package/front_end/entrypoints/main/main-meta.ts +42 -42
- package/front_end/entrypoints/node_app/node_app.ts +3 -2
- package/front_end/entrypoints/worker_app/WorkerMain.ts +1 -1
- package/front_end/foundation/Universe.ts +44 -1
- package/front_end/generated/InspectorBackendCommands.ts +2 -2
- package/front_end/generated/SupportedCSSProperties.js +19 -12
- package/front_end/generated/protocol.ts +3 -1
- package/front_end/models/ai_assistance/AiConversation.ts +19 -17
- package/front_end/models/ai_assistance/AiHistoryStorage.ts +37 -14
- package/front_end/models/ai_assistance/AiUtils.ts +38 -42
- package/front_end/models/ai_assistance/agents/AiAgent.ts +5 -1
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +3 -2
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +2 -1
- package/front_end/models/ai_assistance/agents/StorageAgent.ts +7 -5
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +270 -286
- package/front_end/models/ai_assistance/data_formatters/UnitFormatters.ts +20 -0
- package/front_end/models/ai_assistance/performance/AICallTree.ts +3 -1
- package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +3 -2
- package/front_end/models/autofill_manager/AutofillManager.ts +3 -1
- package/front_end/models/bindings/CompilerScriptMapping.ts +7 -7
- package/front_end/models/bindings/ContentProviderBasedProject.ts +4 -4
- package/front_end/models/bindings/DebuggerLanguagePlugins.ts +5 -5
- package/front_end/models/bindings/DefaultScriptMapping.ts +3 -3
- package/front_end/models/bindings/NetworkProject.ts +5 -10
- package/front_end/models/bindings/PresentationConsoleMessageHelper.ts +2 -1
- package/front_end/models/bindings/ResourceMapping.ts +3 -4
- package/front_end/models/bindings/ResourceScriptMapping.ts +2 -3
- package/front_end/models/bindings/ResourceUtils.ts +1 -1
- package/front_end/models/bindings/SASSSourceMapping.ts +11 -9
- package/front_end/models/bindings/StylesSourceMapping.ts +3 -3
- package/front_end/models/bindings/TempFile.ts +8 -3
- package/front_end/models/emulation/EmulatedDevices.ts +389 -8
- package/front_end/models/extensions/ExtensionAPI.ts +116 -52
- package/front_end/models/extensions/LanguageExtensionEndpoint.ts +13 -12
- package/front_end/models/formatter/ScriptFormatter.ts +8 -11
- package/front_end/models/issues_manager/BounceTrackingIssue.ts +1 -1
- package/front_end/models/issues_manager/ClientHintIssue.ts +1 -1
- package/front_end/models/issues_manager/ConnectionAllowlistIssue.ts +1 -1
- package/front_end/models/issues_manager/ContentSecurityPolicyIssue.ts +7 -7
- package/front_end/models/issues_manager/CookieDeprecationMetadataIssue.ts +2 -2
- package/front_end/models/issues_manager/CookieIssue.ts +27 -16
- package/front_end/models/issues_manager/CorsIssue.ts +3 -3
- package/front_end/models/issues_manager/CrossOriginEmbedderPolicyIssue.ts +2 -2
- package/front_end/models/issues_manager/DeprecationIssue.ts +3 -3
- package/front_end/models/issues_manager/EmailVerificationRequestIssue.ts +1 -1
- package/front_end/models/issues_manager/FederatedAuthRequestIssue.ts +1 -1
- package/front_end/models/issues_manager/FederatedAuthUserInfoRequestIssue.ts +1 -1
- package/front_end/models/issues_manager/GenericIssue.ts +7 -7
- package/front_end/models/issues_manager/HeavyAdIssue.ts +3 -3
- package/front_end/models/issues_manager/Issue.ts +11 -12
- package/front_end/models/issues_manager/IssueAggregator.ts +0 -9
- package/front_end/models/issues_manager/IssueResolver.ts +2 -2
- package/front_end/models/issues_manager/IssuesManager.ts +136 -137
- package/front_end/models/issues_manager/MixedContentIssue.ts +1 -1
- package/front_end/models/issues_manager/PartitioningBlobURLIssue.ts +3 -3
- package/front_end/models/issues_manager/QuirksModeIssue.ts +1 -1
- package/front_end/models/issues_manager/SRIMessageSignatureIssue.ts +2 -2
- package/front_end/models/issues_manager/SelectivePermissionsInterventionIssue.ts +2 -2
- package/front_end/models/issues_manager/SharedArrayBufferIssue.ts +2 -2
- package/front_end/models/issues_manager/SharedDictionaryIssue.ts +1 -1
- package/front_end/models/issues_manager/UnencodedDigestIssue.ts +3 -3
- package/front_end/models/issues_manager/issues_manager.ts +0 -2
- package/front_end/models/javascript_metadata/NativeFunctions.js +5 -1
- package/front_end/models/persistence/AutomaticFileSystemWorkspaceBinding.ts +5 -0
- package/front_end/models/source_map_scopes/FunctionCodeResolver.ts +13 -10
- package/front_end/models/stack_trace/StackTraceModel.ts +3 -3
- package/front_end/models/text_utils/ContentData.ts +27 -0
- package/front_end/models/trace/helpers/SamplesIntegrator.ts +21 -5
- package/front_end/models/trace_source_maps_resolver/SourceMapsResolver.ts +29 -14
- package/front_end/models/web_mcp/WebMCPModel.ts +24 -6
- package/front_end/models/workspace/IgnoreListManager.ts +6 -6
- package/front_end/models/workspace/UISourceCode.ts +3 -3
- package/front_end/models/workspace/WorkspaceImpl.ts +10 -1
- package/front_end/models/workspace_diff/WorkspaceDiff.ts +10 -4
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +25 -22
- package/front_end/panels/ai_assistance/ExportConversation.ts +3 -4
- package/front_end/panels/ai_assistance/ai_assistance-meta.ts +3 -3
- package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +9 -1
- package/front_end/panels/ai_assistance/components/DisabledWidget.ts +2 -2
- package/front_end/panels/animation/AnimationTimeline.ts +17 -19
- package/front_end/panels/animation/AnimationUI.ts +5 -5
- package/front_end/panels/animation/animation-meta.ts +2 -2
- package/front_end/panels/application/ApplicationPanelSidebar.ts +4 -3
- package/front_end/panels/application/DeviceBoundSessionsView.ts +2 -6
- package/front_end/panels/application/FrameDetailsView.ts +1 -1
- package/front_end/panels/application/IndexedDBViews.ts +220 -266
- package/front_end/panels/application/OpenedWindowDetailsView.ts +1 -1
- package/front_end/panels/application/ResourcesPanel.ts +9 -2
- package/front_end/panels/application/ServiceWorkersView.ts +252 -211
- package/front_end/panels/application/StorageView.ts +97 -33
- package/front_end/panels/application/WebMCPView.ts +53 -44
- package/front_end/panels/application/components/AdsView.ts +201 -30
- package/front_end/panels/application/components/adsView.css +25 -0
- package/front_end/panels/application/indexedDBViews.css +38 -9
- package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +2 -2
- package/front_end/panels/application/preloading/helper/PreloadingForward.ts +2 -1
- package/front_end/panels/application/storageView.css +26 -9
- package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +5 -1
- package/front_end/panels/browser_debugger/browser_debugger-meta.ts +8 -6
- package/front_end/panels/common/DOMLinkifier.ts +1 -1
- package/front_end/panels/common/ExtensionServer.ts +119 -14
- package/front_end/panels/console/ConsoleContextSelector.ts +1 -1
- package/front_end/panels/console/ConsolePinPane.ts +2 -2
- package/front_end/panels/console/ConsolePrompt.ts +2 -2
- package/front_end/panels/console/ConsoleView.ts +3 -2
- package/front_end/panels/console/PromptBuilder.ts +2 -1
- package/front_end/panels/console/SymbolizedErrorWidget.ts +2 -1
- package/front_end/panels/console_counters/WarningErrorCounter.ts +2 -2
- package/front_end/panels/coverage/CoverageListView.ts +28 -28
- package/front_end/panels/coverage/CoverageModel.ts +2 -1
- package/front_end/panels/coverage/CoverageView.ts +22 -22
- package/front_end/panels/coverage/coverage-meta.ts +5 -5
- package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +36 -36
- package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +1 -1
- package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +2 -2
- package/front_end/panels/css_overview/CSSOverviewStartView.ts +6 -6
- package/front_end/panels/css_overview/CSSOverviewUnusedDeclarations.ts +6 -6
- package/front_end/panels/css_overview/css_overview-meta.ts +2 -2
- package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +1 -1
- package/front_end/panels/elements/AccessibilityTreeUtils.ts +8 -102
- package/front_end/panels/elements/AccessibilityTreeView.ts +163 -70
- package/front_end/panels/elements/ElementsPanel.ts +17 -11
- package/front_end/panels/elements/ElementsTreeElement.ts +4 -1
- package/front_end/panels/elements/ElementsTreeOutline.ts +4 -4
- package/front_end/panels/elements/LayoutPane.ts +1 -1
- package/front_end/panels/elements/MetricsSidebarPane.ts +100 -34
- package/front_end/panels/elements/StylePropertiesSection.ts +2 -2
- package/front_end/panels/elements/StylePropertyTreeElement.ts +8 -2
- package/front_end/panels/elements/StylesSidebarPane.ts +1 -1
- package/front_end/panels/elements/components/AccessibilityTreeNode.ts +7 -18
- package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +2 -2
- package/front_end/panels/elements/components/QueryContainer.ts +1 -1
- package/front_end/panels/emulation/DeviceModeView.ts +52 -70
- package/front_end/panels/issues/AffectedDirectivesView.ts +1 -1
- package/front_end/panels/issues/AffectedResourcesView.ts +2 -1
- package/front_end/panels/issues/IssueView.ts +0 -2
- package/front_end/panels/issues/IssuesPane.ts +1 -8
- package/front_end/panels/js_timeline/js_timeline-meta.ts +3 -2
- package/front_end/panels/layer_viewer/LayerViewHost.ts +1 -1
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +3 -3
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +5 -5
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +4 -4
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +2 -2
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryNavigator.ts +6 -6
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +3 -3
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +8 -9
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplayUtils.ts +2 -2
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +1 -1
- package/front_end/panels/linear_memory_inspector/linear_memory_inspector-meta.ts +2 -2
- package/front_end/panels/network/NetworkDataGridNode.ts +124 -36
- package/front_end/panels/network/NetworkLogView.ts +9 -1
- package/front_end/panels/network/NetworkLogViewColumns.ts +18 -0
- package/front_end/panels/network/NetworkPanel.ts +2 -1
- package/front_end/panels/network/RequestPayloadView.ts +68 -20
- package/front_end/panels/network/RequestPreviewView.ts +7 -1
- package/front_end/panels/network/RequestTimingView.ts +95 -127
- package/front_end/panels/network/components/ResponseHeaderSection.ts +1 -1
- package/front_end/panels/network/forward/UIFilter.ts +1 -0
- package/front_end/panels/network/requestPayloadView.css +10 -0
- package/front_end/panels/performance_monitor/PerformanceMonitor.ts +12 -12
- package/front_end/panels/performance_monitor/performance_monitor-meta.ts +7 -7
- package/front_end/panels/profiler/HeapDetachedElementsView.ts +2 -2
- package/front_end/panels/profiler/HeapProfileView.ts +563 -51
- package/front_end/panels/profiler/HeapSnapshotView.ts +14 -9
- package/front_end/panels/profiler/ProfilesPanel.ts +13 -7
- package/front_end/panels/profiler/WritableProfileHeader.ts +152 -0
- package/front_end/panels/profiler/profiler.ts +2 -2
- package/front_end/panels/recorder/{components/ControlButton.ts → ControlButton.ts} +9 -10
- package/front_end/panels/recorder/{components/CreateRecordingView.ts → CreateRecordingView.ts} +59 -58
- package/front_end/panels/recorder/ExtensionView.ts +123 -0
- package/front_end/panels/recorder/RecorderController.ts +102 -92
- package/front_end/panels/recorder/{components/RecordingListView.ts → RecordingListView.ts} +22 -23
- package/front_end/panels/recorder/{components/RecordingView.ts → RecordingView.ts} +99 -96
- package/front_end/panels/recorder/{components/ReplaySection.ts → ReplaySection.ts} +20 -20
- package/front_end/panels/recorder/{components/SelectorPicker.ts → SelectorPicker.ts} +13 -13
- package/front_end/panels/recorder/{components/StepEditor.ts → StepEditor.ts} +367 -336
- package/front_end/panels/recorder/{components/StepView.ts → StepView.ts} +48 -49
- package/front_end/panels/recorder/{components/TimelineSection.ts → TimelineSection.ts} +2 -2
- package/front_end/panels/recorder/models/RecorderSettings.ts +2 -2
- package/front_end/panels/recorder/recorder-meta.ts +7 -7
- package/front_end/panels/recorder/recorder.ts +23 -1
- package/front_end/panels/recorder/{components/recordingView.css → recordingView.css} +1 -1
- package/front_end/panels/recorder/util/util.ts +113 -0
- package/front_end/panels/screencast/ScreencastApp.ts +1 -1
- package/front_end/panels/screencast/ScreencastView.ts +12 -12
- package/front_end/panels/search/SearchResultsPane.ts +4 -4
- package/front_end/panels/search/SearchView.ts +20 -20
- package/front_end/panels/security/SecurityModel.ts +7 -7
- package/front_end/panels/security/SecurityPanel.ts +99 -107
- package/front_end/panels/security/SecurityPanelSidebar.ts +7 -7
- package/front_end/panels/security/security-meta.ts +2 -2
- package/front_end/panels/sensors/LocationsSettingsTab.ts +19 -19
- package/front_end/panels/sensors/SensorsView.ts +27 -27
- package/front_end/panels/sensors/sensors-meta.ts +13 -167
- package/front_end/panels/settings/AISettingsTab.ts +98 -56
- package/front_end/panels/settings/EditFileSystemView.ts +2 -2
- package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +20 -20
- package/front_end/panels/settings/KeybindsSettingsTab.ts +20 -21
- package/front_end/panels/settings/SettingsScreen.ts +11 -11
- package/front_end/panels/settings/WorkspaceSettingsTab.ts +5 -5
- package/front_end/panels/settings/components/SyncSection.ts +12 -12
- package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +13 -13
- package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +31 -31
- package/front_end/panels/settings/emulation/emulation-meta.ts +1 -1
- package/front_end/panels/settings/settings-meta.ts +14 -14
- package/front_end/panels/sources/InplaceFormatterEditorAction.ts +2 -2
- package/front_end/panels/sources/NavigatorView.ts +7 -6
- package/front_end/panels/sources/ScopeChainSidebarPane.ts +83 -37
- package/front_end/panels/sources/SourcesNavigator.ts +22 -21
- package/front_end/panels/sources/SourcesView.ts +10 -1
- package/front_end/panels/sources/TabbedEditorContainer.ts +1 -1
- package/front_end/panels/sources/scopeChainSidebarPane.css +12 -4
- package/front_end/panels/sources/sources-meta.ts +4 -4
- package/front_end/panels/timeline/CompatibilityTracksAppender.ts +5 -2
- package/front_end/panels/timeline/IsolateSelector.ts +10 -8
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +2 -1
- package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +2 -1
- package/front_end/panels/timeline/TimelineFlameChartView.ts +1 -1
- package/front_end/panels/timeline/TimelinePanel.ts +20 -8
- package/front_end/panels/timeline/TimelineUIUtils.ts +149 -131
- package/front_end/panels/timeline/components/NetworkRequestDetails.ts +4 -2
- package/front_end/panels/timeline/components/NetworkRequestTooltip.ts +4 -2
- package/front_end/panels/timeline/components/insights/ImageRef.ts +2 -1
- package/front_end/panels/timeline/timeline-meta.ts +3 -2
- package/front_end/panels/utils/utils.ts +7 -3
- package/front_end/panels/web_audio/WebAudioView.ts +17 -18
- package/front_end/panels/web_audio/web_audio-meta.ts +3 -3
- package/front_end/panels/whats_new/ReleaseNoteView.ts +1 -1
- package/front_end/panels/whats_new/whats_new-meta.ts +11 -11
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/lit/lib/async-directive.d.ts +2 -1
- package/front_end/third_party/lit/lib/async-directive.js +1 -1
- package/front_end/third_party/lit/lib/async-directive.js.map +1 -1
- package/front_end/third_party/lit/lib/decorators.d.ts +2 -1
- package/front_end/third_party/lit/lib/decorators.js.map +1 -1
- package/front_end/third_party/lit/lib/directive.d.ts +2 -1
- package/front_end/third_party/lit/lib/directive.js.map +1 -1
- package/front_end/third_party/lit/lib/directives.d.ts +2 -1
- package/front_end/third_party/lit/lib/directives.js +8 -8
- package/front_end/third_party/lit/lib/directives.js.map +1 -1
- package/front_end/third_party/lit/lib/lit.d.ts +2 -1
- package/front_end/third_party/lit/lib/lit.js +1 -1
- package/front_end/third_party/lit/lib/lit.js.map +1 -1
- package/front_end/third_party/lit/lib/static-html.d.ts +2 -1
- package/front_end/third_party/lit/lib/static-html.js +1 -1
- package/front_end/third_party/lit/lib/static-html.js.map +1 -1
- package/front_end/third_party/lit/package.json +2 -2
- package/front_end/third_party/lit/rebuild.sh +1 -1
- package/front_end/third_party/lit/src/async-directive.ts +5 -0
- package/front_end/ui/components/dialogs/Dialog.ts +1 -1
- package/front_end/ui/components/dialogs/ShortcutDialog.ts +1 -1
- package/front_end/ui/components/diff_view/DiffView.ts +2 -2
- package/front_end/ui/components/issue_counter/IssueCounter.ts +3 -3
- package/front_end/ui/components/issue_counter/IssueLinkIcon.ts +5 -5
- package/front_end/ui/components/lists/List.ts +2 -2
- package/front_end/ui/components/panel_feedback/PreviewToggle.ts +1 -1
- package/front_end/ui/components/request_link_icon/RequestLinkIcon.ts +5 -5
- package/front_end/ui/components/settings/SettingCheckbox.ts +1 -1
- package/front_end/ui/components/snackbars/Snackbar.ts +1 -1
- package/front_end/ui/components/survey_link/SurveyLink.ts +3 -3
- package/front_end/ui/components/text_editor/config.ts +2 -2
- package/front_end/ui/components/tree_outline/TreeOutline.ts +34 -1
- package/front_end/ui/legacy/ReportView.ts +5 -0
- package/front_end/ui/legacy/Treeoutline.ts +6 -0
- package/front_end/ui/legacy/View.ts +1 -1
- package/front_end/ui/legacy/Widget.ts +14 -15
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +2 -0
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +8 -3
- package/front_end/ui/legacy/components/data_grid/data_grid.ts +1 -0
- package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +1 -1
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +106 -38
- package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +7 -1
- package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +2 -1
- package/front_end/ui/legacy/components/utils/ImagePreview.ts +4 -2
- package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +10 -1
- package/front_end/ui/legacy/inspectorCommon.css +5 -0
- package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
- package/mcp/mcp.ts +2 -0
- package/package.json +4 -4
- package/front_end/models/issues_manager/AttributionReportingIssue.ts +0 -247
- package/front_end/models/issues_manager/descriptions/arInsecureContext.md +0 -7
- package/front_end/models/issues_manager/descriptions/arInvalidInfoHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterOsSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterOsTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNavigationRegistrationWithoutTransientUserActivation.md +0 -6
- package/front_end/models/issues_manager/descriptions/arNoRegisterOsSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoRegisterOsTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoRegisterSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoRegisterTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoWebOrOsSupport.md +0 -4
- package/front_end/models/issues_manager/descriptions/arOsSourceIgnored.md +0 -18
- package/front_end/models/issues_manager/descriptions/arOsTriggerIgnored.md +0 -19
- package/front_end/models/issues_manager/descriptions/arPermissionPolicyDisabled.md +0 -8
- package/front_end/models/issues_manager/descriptions/arSourceAndTriggerHeaders.md +0 -9
- package/front_end/models/issues_manager/descriptions/arSourceIgnored.md +0 -13
- package/front_end/models/issues_manager/descriptions/arTriggerIgnored.md +0 -12
- package/front_end/models/issues_manager/descriptions/arUntrustworthyReportingOrigin.md +0 -10
- package/front_end/models/issues_manager/descriptions/arWebAndOsHeaders.md +0 -11
- package/front_end/panels/issues/AttributionReportingIssueDetailsView.ts +0 -182
- package/front_end/panels/profiler/ProfileView.ts +0 -611
- package/front_end/panels/recorder/components/ExtensionView.ts +0 -132
- package/front_end/panels/recorder/components/components.ts +0 -25
- package/front_end/panels/recorder/components/util.ts +0 -116
- /package/front_end/panels/recorder/{components/controlButton.css → controlButton.css} +0 -0
- /package/front_end/panels/recorder/{components/createRecordingView.css → createRecordingView.css} +0 -0
- /package/front_end/panels/recorder/{components/extensionView.css → extensionView.css} +0 -0
- /package/front_end/panels/recorder/{components/recordingListView.css → recordingListView.css} +0 -0
- /package/front_end/panels/recorder/{components/replaySection.css → replaySection.css} +0 -0
- /package/front_end/panels/recorder/{components/selectorPicker.css → selectorPicker.css} +0 -0
- /package/front_end/panels/recorder/{components/startView.css → startView.css} +0 -0
- /package/front_end/panels/recorder/{components/stepEditor.css → stepEditor.css} +0 -0
- /package/front_end/panels/recorder/{components/stepView.css → stepView.css} +0 -0
- /package/front_end/panels/recorder/{components/timelineSection.css → timelineSection.css} +0 -0
package/front_end/Tests.js
CHANGED
|
@@ -496,8 +496,8 @@
|
|
|
496
496
|
|
|
497
497
|
TestSuite.prototype.testConsoleOnNavigateBack = function() {
|
|
498
498
|
function filteredMessages() {
|
|
499
|
-
return SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(
|
|
500
|
-
a => a.source !== Protocol.Log.LogEntrySource.Violation);
|
|
499
|
+
return SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(SDK.TargetManager.TargetManager.instance())
|
|
500
|
+
.filter(a => a.source !== Protocol.Log.LogEntrySource.Violation);
|
|
501
501
|
}
|
|
502
502
|
|
|
503
503
|
if (filteredMessages().length === 1) {
|
|
@@ -710,7 +710,7 @@
|
|
|
710
710
|
SDK.TargetManager.TargetManager.instance().addModelListener(
|
|
711
711
|
SDK.ConsoleModel.ConsoleModel, SDK.ConsoleModel.Events.MessageAdded, onConsoleMessage, this);
|
|
712
712
|
|
|
713
|
-
const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered();
|
|
713
|
+
const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(SDK.TargetManager.TargetManager.instance());
|
|
714
714
|
if (messages.length) {
|
|
715
715
|
const text = messages[0].messageText;
|
|
716
716
|
this.assertEquals('ready', text);
|
|
@@ -976,7 +976,7 @@
|
|
|
976
976
|
TestSuite.prototype.testWindowInitializedOnNavigateBack = function() {
|
|
977
977
|
const test = this;
|
|
978
978
|
test.takeControl();
|
|
979
|
-
const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered();
|
|
979
|
+
const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(SDK.TargetManager.TargetManager.instance());
|
|
980
980
|
if (messages.length === 1) {
|
|
981
981
|
checkMessages();
|
|
982
982
|
} else {
|
|
@@ -985,7 +985,7 @@
|
|
|
985
985
|
}
|
|
986
986
|
|
|
987
987
|
function checkMessages() {
|
|
988
|
-
const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered();
|
|
988
|
+
const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(SDK.TargetManager.TargetManager.instance());
|
|
989
989
|
test.assertEquals(1, messages.length);
|
|
990
990
|
test.assertTrue(messages[0].messageText.indexOf('Uncaught') === -1);
|
|
991
991
|
test.releaseControl();
|
|
@@ -1062,7 +1062,7 @@
|
|
|
1062
1062
|
};
|
|
1063
1063
|
|
|
1064
1064
|
TestSuite.prototype.waitForTestResultsInConsole = function() {
|
|
1065
|
-
const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered();
|
|
1065
|
+
const messages = SDK.ConsoleModel.ConsoleModel.allMessagesUnordered(SDK.TargetManager.TargetManager.instance());
|
|
1066
1066
|
for (let i = 0; i < messages.length; ++i) {
|
|
1067
1067
|
const text = messages[i].messageText;
|
|
1068
1068
|
if (text === 'PASS') {
|
|
@@ -38,24 +38,31 @@ export async function fileToString(file: File): Promise<string> {
|
|
|
38
38
|
* Consider using `arrayBufferToString` instead, which can handle both gzipped and plain text buffers.
|
|
39
39
|
*/
|
|
40
40
|
export async function decompress(gzippedBuffer: ArrayBufferLike, charset = 'utf-8'): Promise<string> {
|
|
41
|
-
const buffer = await
|
|
41
|
+
const buffer = await decompressToBuffer(gzippedBuffer);
|
|
42
42
|
const str = new TextDecoder(charset).decode(buffer);
|
|
43
43
|
return str;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
export async function decompressToBuffer(gzippedBuffer: ArrayBufferLike): Promise<ArrayBuffer> {
|
|
47
|
+
return await gzipCodec(gzippedBuffer, new DecompressionStream('gzip'));
|
|
48
|
+
}
|
|
49
|
+
|
|
46
50
|
/**
|
|
47
51
|
* Decompress a deflate-encoded ArrayBuffer to a string.
|
|
48
52
|
* Tries 'deflate' (zlib wrapper) first, then falls back to 'deflate-raw'.
|
|
49
53
|
*/
|
|
50
54
|
export async function decompressDeflate(buffer: ArrayBufferLike, charset = 'utf-8'): Promise<string> {
|
|
51
|
-
|
|
55
|
+
const decompressedBuffer = await decompressDeflateToBuffer(buffer);
|
|
56
|
+
return new TextDecoder(charset).decode(decompressedBuffer);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function decompressDeflateToBuffer(buffer: ArrayBufferLike): Promise<ArrayBuffer> {
|
|
52
60
|
try {
|
|
53
|
-
|
|
61
|
+
return await gzipCodec(buffer, new DecompressionStream('deflate'));
|
|
54
62
|
} catch {
|
|
55
63
|
// Try deflate-raw format if zlib-wrapped deflate fails.
|
|
56
|
-
|
|
64
|
+
return await gzipCodec(buffer, new DecompressionStream('deflate-raw'));
|
|
57
65
|
}
|
|
58
|
-
return new TextDecoder(charset).decode(decompressedBuffer);
|
|
59
66
|
}
|
|
60
67
|
export async function compress(str: string): Promise<ArrayBuffer> {
|
|
61
68
|
const encoded = new TextEncoder().encode(str);
|
|
@@ -63,6 +63,7 @@ const AidaLanguageToMarkdown: Record<AidaInferenceLanguage, string> = {
|
|
|
63
63
|
|
|
64
64
|
export class AidaAbortError extends Error {}
|
|
65
65
|
export class AidaBlockError extends Error {}
|
|
66
|
+
export class AidaQuotaError extends Error {}
|
|
66
67
|
|
|
67
68
|
interface AiStream {
|
|
68
69
|
write: (data: string) => Promise<void>;
|
|
@@ -185,12 +186,23 @@ export class AidaClient {
|
|
|
185
186
|
debugLog('doConversation failed with error:', JSON.stringify(err));
|
|
186
187
|
if (err instanceof DispatchHttpRequestClient.DispatchHttpRequestError && err.response) {
|
|
187
188
|
const result = err.response;
|
|
189
|
+
if (result.statusCode === 429) {
|
|
190
|
+
stream.fail(new AidaQuotaError('Server responded: quota exceeded'));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
188
193
|
if (result.statusCode === 403) {
|
|
189
194
|
stream.fail(new Error('Server responded: permission denied'));
|
|
190
195
|
return;
|
|
191
196
|
}
|
|
192
197
|
if ('error' in result && result.error) {
|
|
193
|
-
|
|
198
|
+
const errorStr = typeof result.error === 'string' ? result.error : '';
|
|
199
|
+
const detailStr = typeof result.detail === 'string' ? result.detail : '';
|
|
200
|
+
if (errorStr.toLowerCase().includes('quota') || detailStr.toLowerCase().includes('quota')) {
|
|
201
|
+
stream.fail(new AidaQuotaError(
|
|
202
|
+
`Cannot send request: ${result.error}${result.detail ? ` ${result.detail}` : ''}`));
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
stream.fail(new Error(`Cannot send request: ${result.error}${result.detail ? ` ${result.detail}` : ''}`));
|
|
194
206
|
return;
|
|
195
207
|
}
|
|
196
208
|
if ('netErrorName' in result && result.netErrorName === 'net::ERR_TIMED_OUT') {
|
|
@@ -249,6 +261,9 @@ export class AidaClient {
|
|
|
249
261
|
thoughtSignature: result.functionCallChunk.functionCall.thoughtSignature,
|
|
250
262
|
});
|
|
251
263
|
} else if ('error' in result) {
|
|
264
|
+
if (typeof result.error === 'string' && result.error.toLowerCase().includes('quota')) {
|
|
265
|
+
throw new AidaQuotaError(`Server responded: ${JSON.stringify(result)}`);
|
|
266
|
+
}
|
|
252
267
|
throw new Error(`Server responded: ${JSON.stringify(result)}`);
|
|
253
268
|
} else {
|
|
254
269
|
throw new Error(`Unknown chunk result ${JSON.stringify(result)}`);
|
|
@@ -435,21 +450,32 @@ export function getClientFeatureName(feature: ClientFeature): string {
|
|
|
435
450
|
return name;
|
|
436
451
|
}
|
|
437
452
|
|
|
438
|
-
let hostConfigTrackerInstance: HostConfigTracker|undefined;
|
|
439
|
-
|
|
440
453
|
export class HostConfigTracker extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
441
454
|
#pollTimer?: ReturnType<typeof setTimeout>;
|
|
442
455
|
#aidaAvailability?: AidaAccessPreconditions;
|
|
443
456
|
|
|
444
|
-
|
|
445
|
-
|
|
457
|
+
static instance({forceNew}: {
|
|
458
|
+
forceNew: boolean,
|
|
459
|
+
} = {forceNew: false}): HostConfigTracker {
|
|
460
|
+
if (!Root.DevToolsContext.globalInstance().has(HostConfigTracker) || forceNew) {
|
|
461
|
+
Root.DevToolsContext.globalInstance().set(
|
|
462
|
+
HostConfigTracker,
|
|
463
|
+
new HostConfigTracker(),
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
return Root.DevToolsContext.globalInstance().get(HostConfigTracker);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
dispose(): void {
|
|
470
|
+
clearTimeout(this.#pollTimer);
|
|
471
|
+
this.listeners = undefined;
|
|
446
472
|
}
|
|
447
473
|
|
|
448
|
-
static
|
|
449
|
-
if (
|
|
450
|
-
|
|
474
|
+
static removeInstance(): void {
|
|
475
|
+
if (Root.DevToolsContext.globalInstance().has(HostConfigTracker)) {
|
|
476
|
+
Root.DevToolsContext.globalInstance().get(HostConfigTracker).dispose();
|
|
477
|
+
Root.DevToolsContext.globalInstance().delete(HostConfigTracker);
|
|
451
478
|
}
|
|
452
|
-
return hostConfigTrackerInstance;
|
|
453
479
|
}
|
|
454
480
|
|
|
455
481
|
override addEventListener(eventType: Events, listener: Common.EventTarget.EventListener<EventTypes, Events>):
|
|
@@ -98,21 +98,24 @@ async function makeHttpRequest<R>(request: DispatchHttpRequestRequest): Promise<
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
const SERVICE_NAME = 'gdpService';
|
|
101
|
-
let gdpClientInstance: GdpClient|null = null;
|
|
102
101
|
export class GdpClient {
|
|
103
102
|
#cachedProfilePromise?: Promise<Profile>;
|
|
104
103
|
#cachedEligibilityPromise?: Promise<CheckElibigilityResponse>;
|
|
105
104
|
|
|
106
|
-
private constructor() {
|
|
107
|
-
}
|
|
108
|
-
|
|
109
105
|
static instance({forceNew}: {
|
|
110
106
|
forceNew: boolean,
|
|
111
107
|
} = {forceNew: false}): GdpClient {
|
|
112
|
-
if (!
|
|
113
|
-
|
|
108
|
+
if (!Root.DevToolsContext.globalInstance().has(GdpClient) || forceNew) {
|
|
109
|
+
Root.DevToolsContext.globalInstance().set(
|
|
110
|
+
GdpClient,
|
|
111
|
+
new GdpClient(),
|
|
112
|
+
);
|
|
114
113
|
}
|
|
115
|
-
return
|
|
114
|
+
return Root.DevToolsContext.globalInstance().get(GdpClient);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
static removeInstance(): void {
|
|
118
|
+
Root.DevToolsContext.globalInstance().delete(GdpClient);
|
|
116
119
|
}
|
|
117
120
|
|
|
118
121
|
/**
|
|
@@ -112,6 +112,7 @@ export function isUnderTest(prefs?: Record<string, string>): boolean {
|
|
|
112
112
|
return prefs['isUnderTest'] === 'true';
|
|
113
113
|
}
|
|
114
114
|
return Common.Settings.Settings.hasInstance() &&
|
|
115
|
+
// eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
|
|
115
116
|
Common.Settings.Settings.instance().createSetting('isUnderTest', false).get();
|
|
116
117
|
}
|
|
117
118
|
|
|
@@ -168,11 +168,13 @@ export class InspectorFrontendHostStub implements InspectorFrontendHostAPI {
|
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
openSearchResultsInNewTab(_query: string): void {
|
|
171
|
+
// eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
|
|
171
172
|
Common.Console.Console.instance().error(
|
|
172
173
|
'Search is not enabled in hosted mode. Please inspect using chrome://inspect');
|
|
173
174
|
}
|
|
174
175
|
|
|
175
176
|
showItemInFolder(_fileSystemPath: Platform.DevToolsPath.RawPathString): void {
|
|
177
|
+
// eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
|
|
176
178
|
Common.Console.Console.instance().error(
|
|
177
179
|
'Show item in folder is not enabled in hosted mode. Please inspect using chrome://inspect');
|
|
178
180
|
}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import type {Brand} from './Brand.js';
|
|
6
6
|
|
|
7
|
+
let graphemeSegmenter: Intl.Segmenter|null = null;
|
|
8
|
+
|
|
7
9
|
export const escapeCharacters = (inputString: string, charsToEscape: string): string => {
|
|
8
10
|
let foundChar = false;
|
|
9
11
|
for (let i = 0; i < charsToEscape.length; ++i) {
|
|
@@ -48,23 +50,39 @@ const escapedReplacements = new Map([
|
|
|
48
50
|
['</script', '\\x3C/script'],
|
|
49
51
|
]);
|
|
50
52
|
|
|
53
|
+
export const escapeUnicode = (content: string): string => {
|
|
54
|
+
return content.replaceAll(/[\p{Format}\p{Surrogate}]/gu, match => {
|
|
55
|
+
return match.split('').map(char => '\\u' + toHexadecimal(char.charCodeAt(0), 4)).join('');
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
|
|
51
59
|
export const formatAsJSLiteral = (content: string): string => {
|
|
52
|
-
const patternsToEscape = /(\\|<(?:!--|\/?script))|(\p{Control})|(\p{Surrogate})/
|
|
53
|
-
const patternsToEscapePlusSingleQuote = /(\\|'|<(?:!--|\/?script))|(\p{Control})|(\p{Surrogate})/
|
|
60
|
+
const patternsToEscape = /(\\|<(?:!--|\/?script))|(\p{Control}|\p{Format})|(\p{Surrogate})/giu;
|
|
61
|
+
const patternsToEscapePlusSingleQuote = /(\\|'|<(?:!--|\/?script))|(\p{Control}|\p{Format})|(\p{Surrogate})/giu;
|
|
54
62
|
const escapePattern = (match: string, pattern: string, controlChar: string, loneSurrogate: string): string => {
|
|
55
63
|
if (controlChar) {
|
|
56
64
|
if (escapedReplacements.has(controlChar)) {
|
|
57
65
|
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/13086
|
|
58
66
|
return escapedReplacements.get(controlChar);
|
|
59
67
|
}
|
|
60
|
-
|
|
61
|
-
|
|
68
|
+
return controlChar.split('')
|
|
69
|
+
.map(char => {
|
|
70
|
+
const charCode = char.charCodeAt(0);
|
|
71
|
+
if (controlChar.length === 1 && charCode <= 0xFF) {
|
|
72
|
+
return '\\x' + toHexadecimal(charCode, 2);
|
|
73
|
+
}
|
|
74
|
+
return '\\u' + toHexadecimal(charCode, 4);
|
|
75
|
+
})
|
|
76
|
+
.join('');
|
|
62
77
|
}
|
|
63
78
|
if (loneSurrogate) {
|
|
64
79
|
const fourDigitHex = toHexadecimal(loneSurrogate.charCodeAt(0), 4);
|
|
65
80
|
return '\\u' + fourDigitHex;
|
|
66
81
|
}
|
|
67
82
|
if (pattern) {
|
|
83
|
+
if (pattern.startsWith('<')) {
|
|
84
|
+
return '\\x3C' + pattern.slice(1);
|
|
85
|
+
}
|
|
68
86
|
return escapedReplacements.get(pattern) || '';
|
|
69
87
|
}
|
|
70
88
|
return match;
|
|
@@ -447,6 +465,39 @@ export const trimEndWithMaxLength = (str: string, maxLength: number): string =>
|
|
|
447
465
|
return str.slice(0, lastSegmentIndex) + ellipsis;
|
|
448
466
|
};
|
|
449
467
|
|
|
468
|
+
/**
|
|
469
|
+
* Truncates a string to not exceed a maximum number of UTF-16 code units (as measured by JS `string.length`).
|
|
470
|
+
*
|
|
471
|
+
* Unlike simple character limiters, this helper is grapheme-aware and uses `Intl.Segmenter` to prevent
|
|
472
|
+
* slicing inside surrogate pairs (e.g. Plane 1+ characters or emojis like '𠜎' / '🥳') or combining characters
|
|
473
|
+
* (e.g. 'é' represented in NFD as 'e' + combining acute accent). If the limit falls in the middle of a
|
|
474
|
+
* grapheme cluster, the function backs off to drop the entire cluster, ensuring the result is always a valid
|
|
475
|
+
* Unicode string.
|
|
476
|
+
*
|
|
477
|
+
* @param str The string to truncate.
|
|
478
|
+
* @param maxCodeUnits The maximum allowed code unit length (must be >= 0).
|
|
479
|
+
* @returns The truncated string, guaranteed to be <= maxCodeUnits in length and grapheme-safe.
|
|
480
|
+
*/
|
|
481
|
+
export const truncateToCodeUnitLength = (str: string, maxCodeUnits: number): string => {
|
|
482
|
+
if (isNaN(maxCodeUnits) || maxCodeUnits <= 0) {
|
|
483
|
+
return '';
|
|
484
|
+
}
|
|
485
|
+
if (str.length <= maxCodeUnits) {
|
|
486
|
+
return str;
|
|
487
|
+
}
|
|
488
|
+
if (!graphemeSegmenter) {
|
|
489
|
+
graphemeSegmenter = new Intl.Segmenter(undefined, {granularity: 'grapheme'});
|
|
490
|
+
}
|
|
491
|
+
let lastSafeIndex = 0;
|
|
492
|
+
for (const {index, segment} of graphemeSegmenter.segment(str)) {
|
|
493
|
+
if (index + segment.length > maxCodeUnits) {
|
|
494
|
+
break;
|
|
495
|
+
}
|
|
496
|
+
lastSafeIndex = index + segment.length;
|
|
497
|
+
}
|
|
498
|
+
return str.slice(0, lastSafeIndex);
|
|
499
|
+
};
|
|
500
|
+
|
|
450
501
|
export const escapeForRegExp = (str: string): string => {
|
|
451
502
|
return escapeCharacters(str, SPECIAL_REGEX_CHARACTERS);
|
|
452
503
|
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Title: AccessibilityModel axNodeToText correctly formats an accessibility node tree to text
|
|
2
|
+
Content:
|
|
3
|
+
dialog "Confirmation"
|
|
4
|
+
button "Submit" focusable: true
|
|
5
|
+
=== end content
|
|
6
|
+
|
|
7
|
+
Title: AccessibilityModel axNodeToText correctly formats when the root node is ignored
|
|
8
|
+
Content:
|
|
9
|
+
Ignored
|
|
10
|
+
button "Submit" focusable: true
|
|
11
|
+
=== end content
|
|
12
|
+
|
|
13
|
+
Title: AccessibilityModel axNodeToText correctly formats when a nested node is ignored
|
|
14
|
+
Content:
|
|
15
|
+
dialog "Confirmation"
|
|
16
|
+
button "Submit" focusable: true
|
|
17
|
+
=== end content
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
5
|
import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
|
|
6
|
-
import
|
|
6
|
+
import * as Protocol from '../../generated/protocol.js';
|
|
7
7
|
|
|
8
|
-
import {DeferredDOMNode, DOMModel, type DOMNode, Events as DOMModelEvents} from './DOMModel.js';
|
|
8
|
+
import {DeferredDOMNode, DOMDocument, DOMModel, type DOMNode, Events as DOMModelEvents} from './DOMModel.js';
|
|
9
|
+
import type {FrameManager} from './FrameManager.js';
|
|
9
10
|
import {SDKModel} from './SDKModel.js';
|
|
10
11
|
import {Capability, type Target} from './Target.js';
|
|
11
12
|
|
|
@@ -23,6 +24,7 @@ export interface CoreOrProtocolAxProperty {
|
|
|
23
24
|
|
|
24
25
|
export class AccessibilityNode {
|
|
25
26
|
readonly #accessibilityModel: AccessibilityModel;
|
|
27
|
+
readonly #frameManager: FrameManager;
|
|
26
28
|
readonly #id: Protocol.Accessibility.AXNodeId;
|
|
27
29
|
readonly #backendDOMNodeId: Protocol.DOM.BackendNodeId|null;
|
|
28
30
|
readonly #deferredDOMNode: DeferredDOMNode|null;
|
|
@@ -39,6 +41,7 @@ export class AccessibilityNode {
|
|
|
39
41
|
|
|
40
42
|
constructor(accessibilityModel: AccessibilityModel, payload: Protocol.Accessibility.AXNode) {
|
|
41
43
|
this.#accessibilityModel = accessibilityModel;
|
|
44
|
+
this.#frameManager = accessibilityModel.target().targetManager().getFrameManager();
|
|
42
45
|
|
|
43
46
|
this.#id = payload.nodeId;
|
|
44
47
|
accessibilityModel.setAXNodeForAXId(this.#id, this);
|
|
@@ -190,6 +193,63 @@ export class AccessibilityNode {
|
|
|
190
193
|
getFrameId(): Protocol.Page.FrameId|null {
|
|
191
194
|
return this.#frameId || this.parentNode()?.getFrameId() || null;
|
|
192
195
|
}
|
|
196
|
+
|
|
197
|
+
isLeafNode(): boolean {
|
|
198
|
+
return this.numChildren() === 0 && this.role()?.value !== 'Iframe';
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
getNodeId(): string {
|
|
202
|
+
return this.getFrameId() + '#' + this.id();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async getChildren(): Promise<AccessibilityNode[]> {
|
|
206
|
+
if (this.role()?.value === 'Iframe') {
|
|
207
|
+
const domNode = await this.deferredDOMNode()?.resolvePromise();
|
|
208
|
+
if (!domNode) {
|
|
209
|
+
throw new Error('Could not find corresponding DOMNode');
|
|
210
|
+
}
|
|
211
|
+
const frameId = domNode.frameOwnerFrameId();
|
|
212
|
+
if (!frameId) {
|
|
213
|
+
throw new Error('No owner frameId on iframe node');
|
|
214
|
+
}
|
|
215
|
+
const localRoot = await getRootNode(frameId, this.#frameManager);
|
|
216
|
+
return [localRoot];
|
|
217
|
+
}
|
|
218
|
+
return await this.accessibilityModel().requestAXChildren(this.id(), this.getFrameId() || undefined);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async axNodeToText(depth = 0): Promise<string> {
|
|
222
|
+
const indent = ' '.repeat(depth);
|
|
223
|
+
const role = this.role()?.value || '';
|
|
224
|
+
const name = this.name()?.value || '';
|
|
225
|
+
const properties = this.properties() || [];
|
|
226
|
+
const ignored = this.ignored();
|
|
227
|
+
let childDepth = depth + 1;
|
|
228
|
+
|
|
229
|
+
const lines = [];
|
|
230
|
+
if (ignored) {
|
|
231
|
+
if (depth === 0) {
|
|
232
|
+
lines.push('Ignored\n');
|
|
233
|
+
} else {
|
|
234
|
+
childDepth = depth;
|
|
235
|
+
}
|
|
236
|
+
} else {
|
|
237
|
+
let line = `${indent}${role} "${name}"`;
|
|
238
|
+
for (const prop of properties) {
|
|
239
|
+
if (prop.value && isPrintableType(prop.value.type)) {
|
|
240
|
+
line += ` ${prop.name}: ${prop.value.value}`;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
lines.push(line + '\n');
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const children = await this.getChildren();
|
|
247
|
+
for (const child of children) {
|
|
248
|
+
lines.push(await child.axNodeToText(childDepth));
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return lines.join('');
|
|
252
|
+
}
|
|
193
253
|
}
|
|
194
254
|
|
|
195
255
|
export const enum Events {
|
|
@@ -363,3 +423,73 @@ export class AccessibilityModel extends SDKModel<EventTypes> implements Protocol
|
|
|
363
423
|
}
|
|
364
424
|
|
|
365
425
|
SDKModel.register(AccessibilityModel, {capabilities: Capability.DOM, autostart: false});
|
|
426
|
+
|
|
427
|
+
function getModel(frameId: Protocol.Page.FrameId, frameManager: FrameManager): AccessibilityModel {
|
|
428
|
+
const frame = frameManager.getFrame(frameId);
|
|
429
|
+
const model = frame?.resourceTreeModel().target().model(AccessibilityModel);
|
|
430
|
+
if (!model) {
|
|
431
|
+
throw new Error('Could not instantiate model for frameId');
|
|
432
|
+
}
|
|
433
|
+
return model;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
export async function getRootNode(frameId: Protocol.Page.FrameId,
|
|
437
|
+
frameManager: FrameManager): Promise<AccessibilityNode> {
|
|
438
|
+
const model = getModel(frameId, frameManager);
|
|
439
|
+
const root = await model.requestRootNode(frameId);
|
|
440
|
+
if (!root) {
|
|
441
|
+
throw new Error('No accessibility root for frame');
|
|
442
|
+
}
|
|
443
|
+
return root;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
function getFrameIdForNodeOrDocument(node: DOMNode): Protocol.Page.FrameId {
|
|
447
|
+
let frameId;
|
|
448
|
+
if (node instanceof DOMDocument) {
|
|
449
|
+
frameId = node.body?.frameId();
|
|
450
|
+
} else {
|
|
451
|
+
frameId = node.frameId();
|
|
452
|
+
}
|
|
453
|
+
if (!frameId) {
|
|
454
|
+
throw new Error('No frameId for DOM node');
|
|
455
|
+
}
|
|
456
|
+
return frameId;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
export async function getNodeAndAncestorsFromDOMNode(domNode: DOMNode): Promise<AccessibilityNode[]> {
|
|
460
|
+
const frameManager = domNode.domModel().target().targetManager().getFrameManager();
|
|
461
|
+
let frameId = getFrameIdForNodeOrDocument(domNode);
|
|
462
|
+
const model = getModel(frameId, frameManager);
|
|
463
|
+
const result = await model.requestAndLoadSubTreeToNode(domNode);
|
|
464
|
+
if (!result) {
|
|
465
|
+
throw new Error('Could not retrieve accessibility node for inspected DOM node');
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
const outermostFrameId = frameManager.getOutermostFrame()?.id;
|
|
469
|
+
if (!outermostFrameId) {
|
|
470
|
+
return result;
|
|
471
|
+
}
|
|
472
|
+
while (frameId !== outermostFrameId) {
|
|
473
|
+
const node = await frameManager.getFrame(frameId)?.getOwnerDOMNodeOrDocument();
|
|
474
|
+
if (!node) {
|
|
475
|
+
break;
|
|
476
|
+
}
|
|
477
|
+
frameId = getFrameIdForNodeOrDocument(node);
|
|
478
|
+
const model = getModel(frameId, frameManager);
|
|
479
|
+
const ancestors = await model.requestAndLoadSubTreeToNode(node);
|
|
480
|
+
result.push(...ancestors || []);
|
|
481
|
+
}
|
|
482
|
+
return result;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
export function isPrintableType(valueType: Protocol.Accessibility.AXValueType): boolean {
|
|
486
|
+
switch (valueType) {
|
|
487
|
+
case Protocol.Accessibility.AXValueType.Boolean:
|
|
488
|
+
case Protocol.Accessibility.AXValueType.BooleanOrUndefined:
|
|
489
|
+
case Protocol.Accessibility.AXValueType.String:
|
|
490
|
+
case Protocol.Accessibility.AXValueType.Number:
|
|
491
|
+
return true;
|
|
492
|
+
default:
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
@@ -19,7 +19,10 @@ export class CPUThrottlingManager extends Common.ObjectWrapper.ObjectWrapper<Eve
|
|
|
19
19
|
super();
|
|
20
20
|
this.#targetManager = targetManager;
|
|
21
21
|
this.#cpuThrottlingRate = 1; // No throttling
|
|
22
|
-
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
initialize(): void {
|
|
25
|
+
this.#targetManager.observeModels(EmulationModel, this);
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
static instance(opts: {
|
|
@@ -29,10 +32,12 @@ export class CPUThrottlingManager extends Common.ObjectWrapper.ObjectWrapper<Eve
|
|
|
29
32
|
} = {forceNew: null}): CPUThrottlingManager {
|
|
30
33
|
const {forceNew} = opts;
|
|
31
34
|
if (!Root.DevToolsContext.globalInstance().has(CPUThrottlingManager) || forceNew) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
/* eslint-disable @devtools/no-instance-of-migrated-singletons */
|
|
36
|
+
const manager = new CPUThrottlingManager(opts.settings ?? Common.Settings.Settings.instance(),
|
|
37
|
+
opts.targetManager ?? TargetManager.instance());
|
|
38
|
+
/* eslint-enable @devtools/no-instance-of-migrated-singletons */
|
|
39
|
+
manager.initialize();
|
|
40
|
+
Root.DevToolsContext.globalInstance().set(CPUThrottlingManager, manager);
|
|
36
41
|
}
|
|
37
42
|
|
|
38
43
|
return Root.DevToolsContext.globalInstance().get(CPUThrottlingManager);
|
|
@@ -7,7 +7,7 @@ import type * as Common from '../common/common.js';
|
|
|
7
7
|
import * as i18n from '../i18n/i18n.js';
|
|
8
8
|
import type * as Platform from '../platform/platform.js';
|
|
9
9
|
|
|
10
|
-
import {PageResourceLoader,
|
|
10
|
+
import type {PageResourceLoader, PageResourceLoadInitiator} from './PageResourceLoader.js';
|
|
11
11
|
|
|
12
12
|
const UIStrings = {
|
|
13
13
|
/**
|
|
@@ -28,10 +28,7 @@ export class CompilerSourceMappingContentProvider implements TextUtils.ContentPr
|
|
|
28
28
|
readonly #pageResourceLoader: PageResourceLoader;
|
|
29
29
|
|
|
30
30
|
constructor(sourceURL: Platform.DevToolsPath.UrlString, contentType: Common.ResourceType.ResourceType,
|
|
31
|
-
initiator: PageResourceLoadInitiator,
|
|
32
|
-
pageResourceLoader: PageResourceLoader = initiator.target ?
|
|
33
|
-
initiator.target.targetManager().context.get(PageResourceLoader) :
|
|
34
|
-
PageResourceLoader.instance()) {
|
|
31
|
+
initiator: PageResourceLoadInitiator, pageResourceLoader: PageResourceLoader) {
|
|
35
32
|
this.#sourceURL = sourceURL;
|
|
36
33
|
this.#contentType = contentType;
|
|
37
34
|
this.#initiator = initiator;
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
} from './RuntimeModel.js';
|
|
36
36
|
import {SDKModel} from './SDKModel.js';
|
|
37
37
|
import {Capability, type Target, Type} from './Target.js';
|
|
38
|
-
import {TargetManager} from './TargetManager.js';
|
|
38
|
+
import type {TargetManager} from './TargetManager.js';
|
|
39
39
|
|
|
40
40
|
export {FrontendMessageType} from './ConsoleModelTypes.js';
|
|
41
41
|
|
|
@@ -357,7 +357,7 @@ export class ConsoleModel extends SDKModel<EventTypes> {
|
|
|
357
357
|
}
|
|
358
358
|
|
|
359
359
|
// messages[] are not ordered by timestamp.
|
|
360
|
-
static allMessagesUnordered(targetManager: TargetManager
|
|
360
|
+
static allMessagesUnordered(targetManager: TargetManager): ConsoleMessage[] {
|
|
361
361
|
const messages = [];
|
|
362
362
|
for (const target of targetManager.targets()) {
|
|
363
363
|
const targetMessages = target.model(ConsoleModel)?.messages() || [];
|
|
@@ -366,7 +366,7 @@ export class ConsoleModel extends SDKModel<EventTypes> {
|
|
|
366
366
|
return messages;
|
|
367
367
|
}
|
|
368
368
|
|
|
369
|
-
static requestClearMessages(targetManager: TargetManager
|
|
369
|
+
static requestClearMessages(targetManager: TargetManager): void {
|
|
370
370
|
for (const logModel of targetManager.models(LogModel)) {
|
|
371
371
|
logModel.requestClear();
|
|
372
372
|
}
|
|
@@ -394,7 +394,7 @@ export class ConsoleModel extends SDKModel<EventTypes> {
|
|
|
394
394
|
return this.#errors;
|
|
395
395
|
}
|
|
396
396
|
|
|
397
|
-
static allErrors(targetManager: TargetManager
|
|
397
|
+
static allErrors(targetManager: TargetManager): number {
|
|
398
398
|
let errors = 0;
|
|
399
399
|
for (const target of targetManager.targets()) {
|
|
400
400
|
errors += target.model(ConsoleModel)?.errors() || 0;
|
|
@@ -406,7 +406,7 @@ export class ConsoleModel extends SDKModel<EventTypes> {
|
|
|
406
406
|
return this.#warnings;
|
|
407
407
|
}
|
|
408
408
|
|
|
409
|
-
static allWarnings(targetManager: TargetManager
|
|
409
|
+
static allWarnings(targetManager: TargetManager): number {
|
|
410
410
|
let warnings = 0;
|
|
411
411
|
for (const target of targetManager.targets()) {
|
|
412
412
|
warnings += target.model(ConsoleModel)?.warnings() || 0;
|
|
@@ -537,6 +537,7 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
|
|
|
537
537
|
readonly #eventListenerBreakpoints: DOMEventListenerBreakpoint[] = [];
|
|
538
538
|
readonly #targetManager: TargetManager;
|
|
539
539
|
|
|
540
|
+
// eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
|
|
540
541
|
constructor(targetManager: TargetManager = TargetManager.instance()) {
|
|
541
542
|
this.#targetManager = targetManager;
|
|
542
543
|
this.#xhrBreakpointsSetting = this.#targetManager.settings.createLocalSetting('xhr-breakpoints', []);
|
|
@@ -661,7 +662,9 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
|
|
|
661
662
|
this.createEventListenerBreakpoints(
|
|
662
663
|
Category.XHR, ['readystatechange', 'load', 'loadstart', 'loadend', 'abort', 'error', 'progress', 'timeout'],
|
|
663
664
|
['xmlhttprequest', 'xmlhttprequestupload']);
|
|
665
|
+
}
|
|
664
666
|
|
|
667
|
+
initialize(): void {
|
|
665
668
|
this.#targetManager.observeModels(DOMDebuggerModel, this);
|
|
666
669
|
}
|
|
667
670
|
|
|
@@ -671,9 +674,12 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
|
|
|
671
674
|
} = {forceNew: null}): DOMDebuggerManager {
|
|
672
675
|
const {forceNew, targetManager} = opts;
|
|
673
676
|
if (!Root.DevToolsContext.globalInstance().has(DOMDebuggerManager) || forceNew) {
|
|
677
|
+
// eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
|
|
678
|
+
const manager = new DOMDebuggerManager(targetManager ?? TargetManager.instance());
|
|
679
|
+
manager.initialize();
|
|
674
680
|
Root.DevToolsContext.globalInstance().set(
|
|
675
681
|
DOMDebuggerManager,
|
|
676
|
-
|
|
682
|
+
manager,
|
|
677
683
|
);
|
|
678
684
|
}
|
|
679
685
|
|