chrome-devtools-frontend 1.0.1654411 → 1.0.1656291
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +116 -0
- package/.agents/skills/ui-eng-vision-logic-consolidator/SKILL.md +82 -0
- package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +123 -0
- package/.agents/skills/ui-eng-vision-test-scaffolder/SKILL.md +125 -0
- package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +75 -0
- package/AUTHORS +1 -0
- package/config/owner/COMMON_OWNERS +0 -4
- package/docs/playbook.md +1 -1
- package/front_end/Tests.js +1 -0
- package/front_end/core/common/Settings.ts +47 -30
- package/front_end/core/sdk/CPUThrottlingManager.ts +10 -159
- package/front_end/core/sdk/ConsoleModel.ts +13 -11
- package/front_end/core/sdk/DOMDebuggerModel.ts +11 -5
- package/front_end/core/sdk/EventBreakpointsModel.ts +9 -5
- package/front_end/core/sdk/IsolateManager.ts +6 -6
- package/front_end/core/sdk/ResourceTreeModel.ts +5 -3
- package/front_end/core/sdk/TargetManager.ts +17 -0
- package/front_end/entrypoints/devtools_app/devtools_app.ts +0 -1
- package/front_end/entrypoints/main/MainImpl.ts +12 -36
- package/front_end/foundation/Universe.ts +98 -3
- package/front_end/generated/InspectorBackendCommands.ts +5 -1
- package/front_end/generated/SupportedCSSProperties.js +2 -6
- package/front_end/generated/protocol-mapping.d.ts +8 -0
- package/front_end/generated/protocol-proxy-api.d.ts +15 -0
- package/front_end/generated/protocol.ts +36 -1
- package/front_end/models/ai_assistance/AiConversation.ts +0 -6
- package/front_end/models/ai_assistance/agents/NetworkAgent.snapshot.txt +1 -1
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +2 -156
- package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +0 -24
- package/front_end/models/ai_assistance/agents/StylingAgent.ts +2 -358
- package/front_end/models/ai_assistance/ai_assistance.ts +0 -6
- package/front_end/models/ai_assistance/contexts/RequestContext.snapshot.txt +0 -1
- package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +0 -2
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -14
- package/front_end/models/autofill_manager/AutofillManager.ts +1 -2
- package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
- package/front_end/models/persistence/AutomaticFileSystemManager.ts +14 -13
- package/front_end/models/persistence/AutomaticFileSystemWorkspaceBinding.ts +12 -9
- package/front_end/models/persistence/IsolatedFileSystemManager.ts +18 -9
- package/front_end/models/project_settings/ProjectSettingsModel.ts +12 -11
- package/front_end/models/trace/handlers/ScreenshotsHandler.ts +14 -59
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +3 -29
- package/front_end/panels/application/DeviceBoundSessionsView.ts +15 -3
- package/front_end/panels/application/FrameDetailsView.ts +2 -1
- package/front_end/panels/application/ServiceWorkersView.ts +23 -16
- package/front_end/panels/common/CPUThrottlingOption.ts +142 -0
- package/front_end/panels/common/ThrottlingUtils.ts +9 -4
- package/front_end/panels/common/common.ts +1 -1
- package/front_end/panels/console/ConsoleViewMessage.ts +45 -0
- package/front_end/panels/elements/ElementsPanel.ts +0 -74
- package/front_end/panels/elements/ElementsTreeOutline.ts +0 -4
- package/front_end/panels/emulation/DeviceModeToolbar.ts +46 -45
- package/front_end/panels/mobile_throttling/CalibrationController.ts +6 -5
- package/front_end/panels/mobile_throttling/MobileThrottlingSelector.ts +1 -1
- package/front_end/panels/mobile_throttling/ThrottlingManager.ts +40 -13
- package/front_end/panels/mobile_throttling/ThrottlingPresets.ts +13 -17
- package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +15 -13
- package/front_end/panels/network/NetworkLogView.ts +0 -9
- package/front_end/panels/network/NetworkPanel.ts +1 -63
- package/front_end/panels/network/RequestInitiatorView.ts +29 -4
- package/front_end/panels/network/components/HeaderSectionRow.css +9 -7
- package/front_end/panels/network/components/HeaderSectionRow.ts +20 -1
- package/front_end/panels/network/components/RequestHeaderSection.css +5 -3
- package/front_end/panels/network/components/RequestHeaderSection.ts +1 -2
- package/front_end/panels/network/components/RequestHeadersView.css +1 -1
- package/front_end/panels/security/SecurityPanel.ts +36 -23
- package/front_end/panels/settings/SettingsScreen.ts +18 -103
- package/front_end/panels/settings/settings-meta.ts +0 -24
- package/front_end/panels/timeline/TimelineController.ts +3 -2
- package/front_end/panels/timeline/TimelinePanel.ts +20 -3
- package/front_end/panels/timeline/components/CPUThrottlingSelector.ts +15 -14
- package/front_end/panels/timeline/timelineFlamechartPopover.css +2 -0
- package/front_end/panels/utils/utils.ts +25 -24
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +34 -55
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +96 -83
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +10 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/CDPSession.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/CDPSession.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.d.ts +3 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPResponse.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Target.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Target.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js +2 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Realm.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Realm.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +5 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js +23 -13
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.js +4 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPResponse.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Input.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/LifecycleWatcher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/LifecycleWatcher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts +3 -41
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +4 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/LaunchOptions.d.ts +5 -0
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/LaunchOptions.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.js +5 -5
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/httpUtils.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/types.d.ts +34 -55
- package/front_end/third_party/puppeteer/package/package.json +4 -4
- package/front_end/third_party/puppeteer/package/src/api/Browser.ts +13 -1
- package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +2 -3
- package/front_end/third_party/puppeteer/package/src/api/CDPSession.ts +3 -1
- package/front_end/third_party/puppeteer/package/src/api/HTTPResponse.ts +3 -2
- package/front_end/third_party/puppeteer/package/src/api/Realm.ts +1 -2
- package/front_end/third_party/puppeteer/package/src/api/Target.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/api/locators/locators.ts +1 -2
- package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +3 -1
- package/front_end/third_party/puppeteer/package/src/bidi/core/Realm.ts +1 -3
- package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +13 -3
- package/front_end/third_party/puppeteer/package/src/cdp/Frame.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/cdp/FrameManager.ts +24 -13
- package/front_end/third_party/puppeteer/package/src/cdp/HTTPResponse.ts +4 -1
- package/front_end/third_party/puppeteer/package/src/cdp/Input.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/cdp/LifecycleWatcher.ts +1 -4
- package/front_end/third_party/puppeteer/package/src/cdp/Target.ts +2 -4
- package/front_end/third_party/puppeteer/package/src/cdp/WebMCP.ts +7 -76
- package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +1 -4
- package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +4 -1
- package/front_end/third_party/puppeteer/package/src/node/LaunchOptions.ts +5 -0
- package/front_end/third_party/puppeteer/package/src/revisions.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/util/httpUtils.ts +5 -5
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/third_party/puppeteer/third_party/parsel/README.chromium +1 -1
- package/front_end/ui/components/dialogs/Dialog.ts +3 -0
- package/front_end/ui/components/markdown_view/MarkdownLinksMap.ts +0 -7
- package/front_end/ui/helpers/OpenInNewTab.ts +15 -7
- package/front_end/ui/legacy/TabbedPane.ts +1 -108
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +9 -0
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +172 -123
- package/front_end/ui/legacy/components/data_grid/DataGridExporter.ts +89 -0
- package/front_end/ui/legacy/components/data_grid/dataGrid.css +10 -0
- package/front_end/ui/legacy/components/data_grid/data_grid.ts +3 -1
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +89 -40
- package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
- package/package.json +1 -1
- package/front_end/Images/navigationControls.png +0 -0
- package/front_end/Images/navigationControls_2x.png +0 -0
- package/front_end/Images/popoverArrows.png +0 -0
- package/front_end/entrypoints/greendev_floaty/FloatyEntrypoint.ts +0 -746
- package/front_end/entrypoints/greendev_floaty/floaty.css +0 -301
- package/front_end/entrypoints/greendev_floaty/floaty.html +0 -38
- package/front_end/entrypoints/greendev_floaty/greendev_floaty.ts +0 -415
- package/front_end/models/ai_assistance/agents/GreenDevAgent.ts +0 -834
- package/front_end/models/ai_assistance/agents/GreenDevAgentAntigravityCliSocketClient.ts +0 -53
- package/front_end/models/ai_assistance/agents/GreenDevAgentGeminiCliSocketClient.ts +0 -117
- package/front_end/models/annotations/AnnotationRepository.ts +0 -238
- package/front_end/models/annotations/AnnotationType.ts +0 -10
- package/front_end/models/annotations/README.md +0 -7
- package/front_end/models/annotations/annotations.ts +0 -6
- package/front_end/models/greendev/Prototypes.ts +0 -68
- package/front_end/models/greendev/README.md +0 -5
- package/front_end/models/greendev/greendev.ts +0 -5
- package/front_end/panels/common/Annotation.ts +0 -184
- package/front_end/panels/common/AnnotationManager.ts +0 -208
- package/front_end/panels/common/annotation.css +0 -40
- package/front_end/panels/greendev/GreenDevPanel.css +0 -282
- package/front_end/panels/greendev/GreenDevPanel.ts +0 -364
- package/front_end/panels/greendev/GreenDevShared.ts +0 -13
- package/front_end/panels/greendev/greendev-meta.ts +0 -52
- package/front_end/panels/greendev/greendev.ts +0 -9
|
@@ -6,7 +6,6 @@ import * as Common from '../../../core/common/common.js';
|
|
|
6
6
|
import type * as Platform from '../../../core/platform/platform.js';
|
|
7
7
|
import type * as SDK from '../../../core/sdk/sdk.js';
|
|
8
8
|
import * as Protocol from '../../../generated/protocol.js';
|
|
9
|
-
import * as Annotations from '../../annotations/annotations.js';
|
|
10
9
|
import * as Logs from '../../logs/logs.js';
|
|
11
10
|
import * as NetworkTimeCalculator from '../../network_time_calculator/network_time_calculator.js';
|
|
12
11
|
import * as TextUtils from '../../text_utils/text_utils.js';
|
|
@@ -163,7 +162,6 @@ export class NetworkRequestFormatter {
|
|
|
163
162
|
}
|
|
164
163
|
|
|
165
164
|
return `Request: ${this.#request.url()}
|
|
166
|
-
${Annotations.AnnotationRepository.annotationsEnabled() ? `\nRequest ID: ${this.#request.requestId()}\n` : ''}
|
|
167
165
|
${this.formatRequestHeaders()}
|
|
168
166
|
|
|
169
167
|
${this.formatResponseHeaders()}${responseBody}
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
|
|
5
5
|
import type * as Platform from '../../../core/platform/platform.js';
|
|
6
6
|
import type * as Protocol from '../../../generated/protocol.js';
|
|
7
|
-
import * as Annotations from '../../annotations/annotations.js';
|
|
8
7
|
import * as CrUXManager from '../../crux-manager/crux-manager.js';
|
|
9
8
|
import type * as SourceMapScopes from '../../source_map_scopes/source_map_scopes.js';
|
|
10
9
|
import * as Trace from '../../trace/trace.js';
|
|
@@ -186,16 +185,6 @@ export class PerformanceTraceFormatter {
|
|
|
186
185
|
if (cls) {
|
|
187
186
|
const eventText = cls.worstClusterEvent ? `, event: ${this.serializeEvent(cls.worstClusterEvent)}` : '';
|
|
188
187
|
parts.push(` - CLS: ${cls.value.toFixed(2)}${eventText}`);
|
|
189
|
-
|
|
190
|
-
if (Annotations.AnnotationRepository.annotationsEnabled()) {
|
|
191
|
-
const worstClusterEvent = cls.worstClusterEvent as Trace.Types.Events.SyntheticLayoutShiftCluster;
|
|
192
|
-
const layoutShiftData =
|
|
193
|
-
worstClusterEvent?.worstShiftEvent?.args?.data as Trace.Types.Events.LayoutShiftData;
|
|
194
|
-
if (layoutShiftData?.impacted_nodes && layoutShiftData.impacted_nodes?.length > 0) {
|
|
195
|
-
Annotations.AnnotationRepository.instance().addElementsAnnotation(
|
|
196
|
-
'This element is impacted by a layout shift', layoutShiftData.impacted_nodes[0].node_id.toString());
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
188
|
}
|
|
200
189
|
} else {
|
|
201
190
|
parts.push('Metrics (lab / observed): n/a');
|
|
@@ -601,7 +590,6 @@ export class PerformanceTraceFormatter {
|
|
|
601
590
|
string {
|
|
602
591
|
const {
|
|
603
592
|
url,
|
|
604
|
-
requestId,
|
|
605
593
|
statusCode,
|
|
606
594
|
initialPriority,
|
|
607
595
|
priority,
|
|
@@ -662,8 +650,7 @@ export class PerformanceTraceFormatter {
|
|
|
662
650
|
const eventKey = this.#eventsSerializer.keyForEvent(request);
|
|
663
651
|
const eventKeyLine = eventKey ? `eventKey: ${eventKey}\n` : '';
|
|
664
652
|
|
|
665
|
-
return `${titlePrefix}: ${url}
|
|
666
|
-
Annotations.AnnotationRepository.annotationsEnabled() ? `\nrequestId: ${requestId}` : ''}
|
|
653
|
+
return `${titlePrefix}: ${url}
|
|
667
654
|
${eventKeyLine}Timings:
|
|
668
655
|
- Queued at: ${micros(startTimesForLifecycle.queuedAt)}
|
|
669
656
|
- Request sent at: ${micros(startTimesForLifecycle.requestSentAt)}
|
|
@@ -14,8 +14,7 @@ export class AutofillManager extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
|
14
14
|
#autofillModel: SDK.AutofillModel.AutofillModel|null = null;
|
|
15
15
|
#frameManager: SDK.FrameManager.FrameManager;
|
|
16
16
|
|
|
17
|
-
constructor(targetManager: SDK.TargetManager.TargetManager,
|
|
18
|
-
frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance()) {
|
|
17
|
+
constructor(targetManager: SDK.TargetManager.TargetManager, frameManager: SDK.FrameManager.FrameManager) {
|
|
19
18
|
super();
|
|
20
19
|
this.#frameManager = frameManager;
|
|
21
20
|
targetManager.addModelListener(SDK.AutofillModel.AutofillModel, SDK.AutofillModel.Events.ADDRESS_FORM_FILLED,
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import * as Common from '../../core/common/common.js';
|
|
6
6
|
import * as Host from '../../core/host/host.js';
|
|
7
7
|
import type * as Platform from '../../core/platform/platform.js';
|
|
8
|
+
import * as Root from '../../core/root/root.js';
|
|
8
9
|
import * as ProjectSettings from '../project_settings/project_settings.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
@@ -26,8 +27,6 @@ export interface AutomaticFileSystem {
|
|
|
26
27
|
*/
|
|
27
28
|
export type AutomaticFileSystemAvailability = 'available'|'unavailable';
|
|
28
29
|
|
|
29
|
-
let automaticFileSystemManagerInstance: AutomaticFileSystemManager|undefined;
|
|
30
|
-
|
|
31
30
|
/**
|
|
32
31
|
* Automatically connects and disconnects workspace folders.
|
|
33
32
|
*
|
|
@@ -66,9 +65,8 @@ export class AutomaticFileSystemManager extends Common.ObjectWrapper.ObjectWrapp
|
|
|
66
65
|
/**
|
|
67
66
|
* @internal
|
|
68
67
|
*/
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
projectSettingsModel: ProjectSettings.ProjectSettingsModel.ProjectSettingsModel) {
|
|
68
|
+
constructor(inspectorFrontendHost: Host.InspectorFrontendHostAPI.InspectorFrontendHostAPI,
|
|
69
|
+
projectSettingsModel: ProjectSettings.ProjectSettingsModel.ProjectSettingsModel) {
|
|
72
70
|
super();
|
|
73
71
|
this.#automaticFileSystem = null;
|
|
74
72
|
this.#inspectorFrontendHost = inspectorFrontendHost;
|
|
@@ -93,27 +91,30 @@ export class AutomaticFileSystemManager extends Common.ObjectWrapper.ObjectWrapp
|
|
|
93
91
|
inspectorFrontendHost: Host.InspectorFrontendHostAPI.InspectorFrontendHostAPI|null,
|
|
94
92
|
projectSettingsModel: ProjectSettings.ProjectSettingsModel.ProjectSettingsModel|null,
|
|
95
93
|
} = {forceNew: false, inspectorFrontendHost: null, projectSettingsModel: null}): AutomaticFileSystemManager {
|
|
96
|
-
if (!
|
|
94
|
+
if (!Root.DevToolsContext.globalInstance().has(AutomaticFileSystemManager) || forceNew) {
|
|
97
95
|
if (!inspectorFrontendHost || !projectSettingsModel) {
|
|
98
96
|
throw new Error(
|
|
99
97
|
'Unable to create AutomaticFileSystemManager: ' +
|
|
100
98
|
'inspectorFrontendHost, and projectSettingsModel must be provided');
|
|
101
99
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
100
|
+
Root.DevToolsContext.globalInstance().set(
|
|
101
|
+
AutomaticFileSystemManager,
|
|
102
|
+
new AutomaticFileSystemManager(
|
|
103
|
+
inspectorFrontendHost,
|
|
104
|
+
projectSettingsModel,
|
|
105
|
+
),
|
|
105
106
|
);
|
|
106
107
|
}
|
|
107
|
-
return
|
|
108
|
+
return Root.DevToolsContext.globalInstance().get(AutomaticFileSystemManager);
|
|
108
109
|
}
|
|
109
110
|
|
|
110
111
|
/**
|
|
111
112
|
* Clears the `AutomaticFileSystemManager` singleton (if any);
|
|
112
113
|
*/
|
|
113
114
|
static removeInstance(): void {
|
|
114
|
-
if (
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
if (Root.DevToolsContext.globalInstance().has(AutomaticFileSystemManager)) {
|
|
116
|
+
Root.DevToolsContext.globalInstance().get(AutomaticFileSystemManager).#dispose();
|
|
117
|
+
Root.DevToolsContext.globalInstance().delete(AutomaticFileSystemManager);
|
|
117
118
|
}
|
|
118
119
|
}
|
|
119
120
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import * as Common from '../../core/common/common.js';
|
|
6
6
|
import * as Host from '../../core/host/host.js';
|
|
7
7
|
import type * as Platform from '../../core/platform/platform.js';
|
|
8
|
+
import * as Root from '../../core/root/root.js';
|
|
8
9
|
import type {ContentDataOrError} from '../text_utils/ContentData.js';
|
|
9
10
|
import type {SearchMatch} from '../text_utils/ContentProvider.js';
|
|
10
11
|
import * as Workspace from '../workspace/workspace.js';
|
|
@@ -169,8 +170,6 @@ export class FileSystem implements Workspace.Workspace.Project {
|
|
|
169
170
|
}
|
|
170
171
|
}
|
|
171
172
|
|
|
172
|
-
let automaticFileSystemWorkspaceBindingInstance: AutomaticFileSystemWorkspaceBinding|undefined;
|
|
173
|
-
|
|
174
173
|
/**
|
|
175
174
|
* Provides a transient workspace `Project` that doesn't contain any `UISourceCode`s,
|
|
176
175
|
* and only acts as a placeholder for the automatic file system, while it's not
|
|
@@ -186,7 +185,7 @@ export class AutomaticFileSystemWorkspaceBinding {
|
|
|
186
185
|
/**
|
|
187
186
|
* @internal
|
|
188
187
|
*/
|
|
189
|
-
|
|
188
|
+
constructor(
|
|
190
189
|
automaticFileSystemManager: AutomaticFileSystemManager,
|
|
191
190
|
isolatedFileSystemManager: IsolatedFileSystemManager,
|
|
192
191
|
workspace: Workspace.Workspace.WorkspaceImpl,
|
|
@@ -219,29 +218,33 @@ export class AutomaticFileSystemWorkspaceBinding {
|
|
|
219
218
|
isolatedFileSystemManager: null,
|
|
220
219
|
workspace: null,
|
|
221
220
|
}): AutomaticFileSystemWorkspaceBinding {
|
|
222
|
-
if (!
|
|
221
|
+
if (!Root.DevToolsContext.globalInstance().has(AutomaticFileSystemWorkspaceBinding) || forceNew) {
|
|
223
222
|
if (!automaticFileSystemManager || !isolatedFileSystemManager || !workspace) {
|
|
224
223
|
throw new Error(
|
|
225
224
|
'Unable to create AutomaticFileSystemWorkspaceBinding: ' +
|
|
226
225
|
'automaticFileSystemManager, isolatedFileSystemManager, ' +
|
|
227
226
|
'and workspace must be provided');
|
|
228
227
|
}
|
|
229
|
-
|
|
228
|
+
const automaticFileSystemWorkspaceBinding = new AutomaticFileSystemWorkspaceBinding(
|
|
230
229
|
automaticFileSystemManager,
|
|
231
230
|
isolatedFileSystemManager,
|
|
232
231
|
workspace,
|
|
233
232
|
);
|
|
233
|
+
Root.DevToolsContext.globalInstance().set(AutomaticFileSystemWorkspaceBinding,
|
|
234
|
+
automaticFileSystemWorkspaceBinding);
|
|
234
235
|
}
|
|
235
|
-
return
|
|
236
|
+
return Root.DevToolsContext.globalInstance().get(AutomaticFileSystemWorkspaceBinding);
|
|
236
237
|
}
|
|
237
238
|
|
|
238
239
|
/**
|
|
239
240
|
* Clears the `AutomaticFileSystemWorkspaceBinding` singleton (if any);
|
|
240
241
|
*/
|
|
241
242
|
static removeInstance(): void {
|
|
242
|
-
if (
|
|
243
|
-
|
|
244
|
-
|
|
243
|
+
if (Root.DevToolsContext.globalInstance().has(AutomaticFileSystemWorkspaceBinding)) {
|
|
244
|
+
const automaticFileSystemWorkspaceBinding =
|
|
245
|
+
Root.DevToolsContext.globalInstance().get(AutomaticFileSystemWorkspaceBinding);
|
|
246
|
+
automaticFileSystemWorkspaceBinding.#dispose();
|
|
247
|
+
Root.DevToolsContext.globalInstance().delete(AutomaticFileSystemWorkspaceBinding);
|
|
245
248
|
}
|
|
246
249
|
}
|
|
247
250
|
|
|
@@ -6,6 +6,7 @@ import * as Common from '../../core/common/common.js';
|
|
|
6
6
|
import * as Host from '../../core/host/host.js';
|
|
7
7
|
import * as i18n from '../../core/i18n/i18n.js';
|
|
8
8
|
import * as Platform from '../../core/platform/platform.js';
|
|
9
|
+
import * as Root from '../../core/root/root.js';
|
|
9
10
|
|
|
10
11
|
import type {FilesChangedData} from './FileSystemWorkspaceBinding.js';
|
|
11
12
|
import {IsolatedFileSystem} from './IsolatedFileSystem.js';
|
|
@@ -24,7 +25,6 @@ const UIStrings = {
|
|
|
24
25
|
} as const;
|
|
25
26
|
const str_ = i18n.i18n.registerUIStrings('models/persistence/IsolatedFileSystemManager.ts', UIStrings);
|
|
26
27
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
27
|
-
let isolatedFileSystemManagerInstance: IsolatedFileSystemManager|null;
|
|
28
28
|
|
|
29
29
|
export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
30
30
|
readonly #fileSystems: Map<Platform.DevToolsPath.UrlString, PlatformFileSystem>;
|
|
@@ -34,9 +34,11 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
34
34
|
private fileSystemRequestResolve: ((arg0: IsolatedFileSystem|null) => void)|null;
|
|
35
35
|
private readonly fileSystemsLoadedPromise: Promise<IsolatedFileSystem[]>;
|
|
36
36
|
readonly #settings: Common.Settings.Settings;
|
|
37
|
-
|
|
37
|
+
readonly #console: Common.Console.Console;
|
|
38
|
+
constructor(settings: Common.Settings.Settings, console: Common.Console.Console) {
|
|
38
39
|
super();
|
|
39
40
|
this.#settings = settings;
|
|
41
|
+
this.#console = console;
|
|
40
42
|
|
|
41
43
|
this.#fileSystems = new Map();
|
|
42
44
|
this.callbacks = new Map();
|
|
@@ -99,17 +101,24 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
99
101
|
this.fileSystemsLoadedPromise = this.requestFileSystems();
|
|
100
102
|
}
|
|
101
103
|
|
|
102
|
-
static instance(opts: {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
static instance(opts: {
|
|
105
|
+
forceNew?: boolean|null,
|
|
106
|
+
settings?: Common.Settings.Settings|null,
|
|
107
|
+
console?: Common.Console.Console|null,
|
|
108
|
+
} = {}): IsolatedFileSystemManager {
|
|
109
|
+
const forceNew = opts.forceNew ?? null;
|
|
110
|
+
const settings = opts.settings ?? Common.Settings.Settings.instance();
|
|
111
|
+
const console = opts.console ?? Common.Console.Console.instance();
|
|
112
|
+
if (!Root.DevToolsContext.globalInstance().has(IsolatedFileSystemManager) || forceNew) {
|
|
113
|
+
const instance = new IsolatedFileSystemManager(settings, console);
|
|
114
|
+
Root.DevToolsContext.globalInstance().set(IsolatedFileSystemManager, instance);
|
|
106
115
|
}
|
|
107
116
|
|
|
108
|
-
return
|
|
117
|
+
return Root.DevToolsContext.globalInstance().get(IsolatedFileSystemManager);
|
|
109
118
|
}
|
|
110
119
|
|
|
111
120
|
static removeInstance(): void {
|
|
112
|
-
|
|
121
|
+
Root.DevToolsContext.globalInstance().delete(IsolatedFileSystemManager);
|
|
113
122
|
}
|
|
114
123
|
|
|
115
124
|
private requestFileSystems(): Promise<IsolatedFileSystem[]> {
|
|
@@ -190,7 +199,7 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
|
|
|
190
199
|
const {errorMessage, fileSystem} = event.data;
|
|
191
200
|
if (errorMessage) {
|
|
192
201
|
if (errorMessage !== '<selection cancelled>' && errorMessage !== '<permission denied>') {
|
|
193
|
-
|
|
202
|
+
this.#console.error(i18nString(UIStrings.unableToAddFilesystemS, {PH1: errorMessage}));
|
|
194
203
|
}
|
|
195
204
|
if (!this.fileSystemRequestResolve) {
|
|
196
205
|
return;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Common from '../../core/common/common.js';
|
|
6
6
|
import * as Platform from '../../core/platform/platform.js';
|
|
7
|
-
import
|
|
7
|
+
import * as Root from '../../core/root/root.js';
|
|
8
8
|
import * as SDK from '../../core/sdk/sdk.js';
|
|
9
9
|
|
|
10
10
|
/** The security origin for all DevTools (front-end) resources. */
|
|
@@ -72,8 +72,6 @@ export type ProjectSettingsAvailability = 'available'|'unavailable';
|
|
|
72
72
|
const EMPTY_PROJECT_SETTINGS: ProjectSettings = Object.freeze({});
|
|
73
73
|
const IDLE_PROMISE: Promise<void> = Promise.resolve();
|
|
74
74
|
|
|
75
|
-
let projectSettingsModelInstance: ProjectSettingsModel|undefined;
|
|
76
|
-
|
|
77
75
|
export class ProjectSettingsModel extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
|
|
78
76
|
readonly #pageResourceLoader: SDK.PageResourceLoader.PageResourceLoader;
|
|
79
77
|
readonly #targetManager: SDK.TargetManager.TargetManager;
|
|
@@ -108,7 +106,7 @@ export class ProjectSettingsModel extends Common.ObjectWrapper.ObjectWrapper<Eve
|
|
|
108
106
|
return this.#promise.then(() => this.#projectSettings);
|
|
109
107
|
}
|
|
110
108
|
|
|
111
|
-
|
|
109
|
+
constructor(
|
|
112
110
|
hostConfig: Root.Runtime.HostConfig,
|
|
113
111
|
pageResourceLoader: SDK.PageResourceLoader.PageResourceLoader,
|
|
114
112
|
targetManager: SDK.TargetManager.TargetManager,
|
|
@@ -140,24 +138,27 @@ export class ProjectSettingsModel extends Common.ObjectWrapper.ObjectWrapper<Eve
|
|
|
140
138
|
pageResourceLoader: SDK.PageResourceLoader.PageResourceLoader|null,
|
|
141
139
|
targetManager: SDK.TargetManager.TargetManager|null,
|
|
142
140
|
}): ProjectSettingsModel {
|
|
143
|
-
if (!
|
|
141
|
+
if (!Root.DevToolsContext.globalInstance().has(ProjectSettingsModel) || forceNew) {
|
|
144
142
|
if (!hostConfig || !pageResourceLoader || !targetManager) {
|
|
145
143
|
throw new Error(
|
|
146
144
|
'Unable to create ProjectSettingsModel: ' +
|
|
147
145
|
'hostConfig, pageResourceLoader, and targetManager must be provided');
|
|
148
146
|
}
|
|
149
|
-
|
|
147
|
+
Root.DevToolsContext.globalInstance().set(
|
|
148
|
+
ProjectSettingsModel,
|
|
149
|
+
new ProjectSettingsModel(hostConfig, pageResourceLoader, targetManager),
|
|
150
|
+
);
|
|
150
151
|
}
|
|
151
|
-
return
|
|
152
|
+
return Root.DevToolsContext.globalInstance().get(ProjectSettingsModel);
|
|
152
153
|
}
|
|
153
154
|
|
|
154
155
|
/**
|
|
155
|
-
* Clears the `ProjectSettingsModel` singleton (if any)
|
|
156
|
+
* Clears the `ProjectSettingsModel` singleton (if any);
|
|
156
157
|
*/
|
|
157
158
|
static removeInstance(): void {
|
|
158
|
-
if (
|
|
159
|
-
|
|
160
|
-
|
|
159
|
+
if (Root.DevToolsContext.globalInstance().has(ProjectSettingsModel)) {
|
|
160
|
+
Root.DevToolsContext.globalInstance().get(ProjectSettingsModel).#dispose();
|
|
161
|
+
Root.DevToolsContext.globalInstance().delete(ProjectSettingsModel);
|
|
161
162
|
}
|
|
162
163
|
}
|
|
163
164
|
|
|
@@ -7,21 +7,14 @@ import * as Types from '../types/types.js';
|
|
|
7
7
|
|
|
8
8
|
import type {HandlerName} from './types.js';
|
|
9
9
|
|
|
10
|
-
// Each thread contains events. Events indicate the thread and process IDs, which are
|
|
11
|
-
// used to store the event in the correct process thread entry below.
|
|
12
|
-
let unpairedAsyncEvents: Types.Events.PipelineReporter[] = [];
|
|
13
|
-
|
|
14
10
|
let legacyScreenshotEvents: Types.Events.LegacyScreenshot[] = [];
|
|
15
11
|
let modernScreenshotEvents: Types.Events.Screenshot[] = [];
|
|
16
12
|
let syntheticScreenshots: Types.Events.LegacySyntheticScreenshot[] = [];
|
|
17
|
-
let frameSequenceToTs: Record<string, Types.Timing.Micro> = {};
|
|
18
13
|
|
|
19
14
|
export function reset(): void {
|
|
20
|
-
unpairedAsyncEvents = [];
|
|
21
15
|
legacyScreenshotEvents = [];
|
|
22
16
|
syntheticScreenshots = [];
|
|
23
17
|
modernScreenshotEvents = [];
|
|
24
|
-
frameSequenceToTs = {};
|
|
25
18
|
}
|
|
26
19
|
|
|
27
20
|
export function handleEvent(event: Types.Events.Event): void {
|
|
@@ -29,39 +22,26 @@ export function handleEvent(event: Types.Events.Event): void {
|
|
|
29
22
|
legacyScreenshotEvents.push(event);
|
|
30
23
|
} else if (Types.Events.isScreenshot(event)) {
|
|
31
24
|
modernScreenshotEvents.push(event);
|
|
32
|
-
} else if (Types.Events.isPipelineReporter(event)) {
|
|
33
|
-
unpairedAsyncEvents.push(event);
|
|
34
25
|
}
|
|
35
26
|
}
|
|
36
27
|
|
|
37
28
|
export async function finalize(): Promise<void> {
|
|
38
|
-
const pipelineReporterEvents = Helpers.Trace.createMatchedSortedSyntheticEvents(unpairedAsyncEvents);
|
|
39
|
-
|
|
40
|
-
frameSequenceToTs = Object.fromEntries(pipelineReporterEvents.map(evt => {
|
|
41
|
-
const args = evt.args.data.beginEvent.args;
|
|
42
|
-
const frameReporter = 'frame_reporter' in args ? args.frame_reporter : args.chrome_frame_reporter;
|
|
43
|
-
const frameSequenceId = frameReporter.frame_sequence;
|
|
44
|
-
const presentationTs = Types.Timing.Micro(evt.ts + evt.dur);
|
|
45
|
-
return [frameSequenceId, presentationTs];
|
|
46
|
-
}));
|
|
47
|
-
|
|
48
29
|
for (const snapshotEvent of legacyScreenshotEvents) {
|
|
49
30
|
const {cat, name, ph, pid, tid} = snapshotEvent;
|
|
50
|
-
const syntheticEvent =
|
|
51
|
-
Types.Events.LegacySyntheticScreenshot>({
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
});
|
|
31
|
+
const syntheticEvent =
|
|
32
|
+
Helpers.SyntheticEvents.SyntheticEventsManager.registerSyntheticEvent<Types.Events.LegacySyntheticScreenshot>({
|
|
33
|
+
rawSourceEvent: snapshotEvent,
|
|
34
|
+
cat,
|
|
35
|
+
name,
|
|
36
|
+
ph,
|
|
37
|
+
pid,
|
|
38
|
+
tid,
|
|
39
|
+
// TODO(paulirish, crbug.com/41363012): fix snapshot timestamps.
|
|
40
|
+
ts: snapshotEvent.ts,
|
|
41
|
+
args: {
|
|
42
|
+
dataUri: `data:image/jpg;base64,${snapshotEvent.args.snapshot}`,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
65
45
|
syntheticScreenshots.push(syntheticEvent);
|
|
66
46
|
}
|
|
67
47
|
}
|
|
@@ -73,31 +53,6 @@ export function screenshotImageDataUri(event: Types.Events.LegacySyntheticScreen
|
|
|
73
53
|
return `data:image/jpg;base64,${event.args.snapshot}`;
|
|
74
54
|
}
|
|
75
55
|
|
|
76
|
-
/**
|
|
77
|
-
* Correct the screenshot timestamps
|
|
78
|
-
* The screenshot 'snapshot object' trace event has the "frame sequence number" attached as an ID.
|
|
79
|
-
* We match that up with the "PipelineReporter" trace events as they terminate at presentation.
|
|
80
|
-
* Presentation == when the pixels hit the screen. AKA Swap on the GPU
|
|
81
|
-
*/
|
|
82
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
83
|
-
function getPresentationTimestamp(screenshotEvent: Types.Events.LegacyScreenshot): Types.Timing.Micro {
|
|
84
|
-
const frameSequence = parseInt(screenshotEvent.id, 16);
|
|
85
|
-
// If it's 1, then it's an old trace (before https://crrev.com/c/4957973) and cannot be corrected.
|
|
86
|
-
if (frameSequence === 1) {
|
|
87
|
-
return screenshotEvent.ts;
|
|
88
|
-
}
|
|
89
|
-
// The screenshot trace event's `ts` reflects the "expected display time" which is ESTIMATE.
|
|
90
|
-
// It is set by the compositor frame sink from the `expected_display_time`, which is based on a previously known
|
|
91
|
-
// frame start PLUS the vsync interval (eg 16.6ms)
|
|
92
|
-
const updatedTs = frameSequenceToTs[frameSequence];
|
|
93
|
-
// Do we always find a match? No...
|
|
94
|
-
// We generally don't match the very first screenshot and, sometimes, the last
|
|
95
|
-
// The very first screenshot is requested immediately (even if nothing is painting). As a result there's no compositor
|
|
96
|
-
// instrumentation running alongside.
|
|
97
|
-
// The last one is sometimes missing as because the trace terminates right before the associated PipelineReporter is emitted.
|
|
98
|
-
return updatedTs ?? screenshotEvent.ts;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
56
|
export interface Data {
|
|
102
57
|
// These are nullable because in January 2025 a CL in Chromium
|
|
103
58
|
// crrev.com/c/6197645 landed which changed the format of screenshots. For a
|
|
@@ -11,9 +11,7 @@ import * as Platform from '../../core/platform/platform.js';
|
|
|
11
11
|
import * as Root from '../../core/root/root.js';
|
|
12
12
|
import * as SDK from '../../core/sdk/sdk.js';
|
|
13
13
|
import * as AiAssistanceModel from '../../models/ai_assistance/ai_assistance.js';
|
|
14
|
-
import * as Annotations from '../../models/annotations/annotations.js';
|
|
15
14
|
import * as Badges from '../../models/badges/badges.js';
|
|
16
|
-
import * as Greendev from '../../models/greendev/greendev.js';
|
|
17
15
|
import type * as LHModel from '../../models/lighthouse/lighthouse.js';
|
|
18
16
|
import type * as Trace from '../../models/trace/trace.js';
|
|
19
17
|
import * as Workspace from '../../models/workspace/workspace.js';
|
|
@@ -51,7 +49,6 @@ import {ExploreWidget} from './components/ExploreWidget.js';
|
|
|
51
49
|
import {MarkdownRendererWithCodeBlock} from './components/MarkdownRendererWithCodeBlock.js';
|
|
52
50
|
import {OptInChangeDialog} from './components/OptInChangeDialog.js';
|
|
53
51
|
import {PerformanceAgentMarkdownRenderer} from './components/PerformanceAgentMarkdownRenderer.js';
|
|
54
|
-
import {StylingAgentMarkdownRenderer} from './components/StylingAgentMarkdownRenderer.js';
|
|
55
52
|
import {
|
|
56
53
|
WalkthroughView,
|
|
57
54
|
} from './components/WalkthroughView.js';
|
|
@@ -280,10 +277,6 @@ const lockedString = i18n.i18n.lockedString;
|
|
|
280
277
|
|
|
281
278
|
function selectedElementFilter(maybeNode: SDK.DOMModel.DOMNode|null): SDK.DOMModel.DOMNode|null {
|
|
282
279
|
if (maybeNode) {
|
|
283
|
-
if (Greendev.Prototypes.instance().isEnabled('emulationCapabilities')) {
|
|
284
|
-
return maybeNode;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
280
|
return maybeNode.nodeType() === Node.ELEMENT_NODE ? maybeNode : null;
|
|
288
281
|
}
|
|
289
282
|
|
|
@@ -311,12 +304,7 @@ async function getEmptyStateSuggestions(conversation?: AiAssistanceModel.AiConve
|
|
|
311
304
|
return [
|
|
312
305
|
{title: 'What can you help me with?', jslogContext: 'styling-default'},
|
|
313
306
|
{title: 'Why isn’t this element visible?', jslogContext: 'styling-default'},
|
|
314
|
-
{
|
|
315
|
-
title: Greendev.Prototypes.instance().isEnabled('emulationCapabilities') ?
|
|
316
|
-
'Are there display issues on this page for people using an Android phone?' :
|
|
317
|
-
'How do I center this element?',
|
|
318
|
-
jslogContext: 'styling-default'
|
|
319
|
-
},
|
|
307
|
+
{title: 'How do I center this element?', jslogContext: 'styling-default'},
|
|
320
308
|
];
|
|
321
309
|
case AiAssistanceModel.AiHistoryStorage.ConversationType.FILE:
|
|
322
310
|
return [
|
|
@@ -408,14 +396,7 @@ function getMarkdownRenderer(conversation?: AiAssistanceModel.AiConversation.AiC
|
|
|
408
396
|
// Handle historical conversations (can't linkify anything).
|
|
409
397
|
return new PerformanceAgentMarkdownRenderer();
|
|
410
398
|
}
|
|
411
|
-
|
|
412
|
-
conversation?.type === AiAssistanceModel.AiHistoryStorage.ConversationType.STYLING &&
|
|
413
|
-
SDK.TargetManager.TargetManager.instance().primaryPageTarget()?.model(SDK.DOMModel.DOMModel)) {
|
|
414
|
-
const domModel = SDK.TargetManager.TargetManager.instance().primaryPageTarget()?.model(SDK.DOMModel.DOMModel);
|
|
415
|
-
const resourceTreeModel = domModel?.target().model(SDK.ResourceTreeModel.ResourceTreeModel);
|
|
416
|
-
const mainFrameId = resourceTreeModel?.mainFrame?.id;
|
|
417
|
-
return new StylingAgentMarkdownRenderer(mainFrameId);
|
|
418
|
-
}
|
|
399
|
+
|
|
419
400
|
if (conversation?.type === AiAssistanceModel.AiHistoryStorage.ConversationType.ACCESSIBILITY) {
|
|
420
401
|
const domModel = SDK.TargetManager.TargetManager.instance().primaryPageTarget()?.model(SDK.DOMModel.DOMModel);
|
|
421
402
|
const mainDocumentURL = domModel?.existingDocument()?.documentURL;
|
|
@@ -1737,9 +1718,6 @@ export class AiAssistancePanel extends UI.Panel.Panel {
|
|
|
1737
1718
|
this.#resetWalkthrough();
|
|
1738
1719
|
UI.ARIAUtils.LiveAnnouncer.alert(i18nString(UIStrings.newChatCreated));
|
|
1739
1720
|
|
|
1740
|
-
if (Annotations.AnnotationRepository.annotationsEnabled()) {
|
|
1741
|
-
Annotations.AnnotationRepository.instance().deleteAllAnnotations();
|
|
1742
|
-
}
|
|
1743
1721
|
}
|
|
1744
1722
|
|
|
1745
1723
|
#cancel(): void {
|
|
@@ -1863,12 +1841,8 @@ export class AiAssistancePanel extends UI.Panel.Panel {
|
|
|
1863
1841
|
Badges.UserBadges.instance().recordAction(Badges.BadgeAction.STARTED_AI_CONVERSATION);
|
|
1864
1842
|
}
|
|
1865
1843
|
|
|
1866
|
-
const greenDevEmulationEnabled = Greendev.Prototypes.instance().isEnabled('emulationCapabilities');
|
|
1867
1844
|
let multimodalInput: AiAssistanceModel.AiAgent.MultimodalInput|undefined;
|
|
1868
|
-
|
|
1869
|
-
if (greenDevEmulationEnabled && pendingInput) {
|
|
1870
|
-
multimodalInput = pendingInput;
|
|
1871
|
-
} else if (isAiAssistanceMultimodalInputEnabled() && imageInput && multimodalInputType) {
|
|
1845
|
+
if (isAiAssistanceMultimodalInputEnabled() && imageInput && multimodalInputType) {
|
|
1872
1846
|
multimodalInput = {
|
|
1873
1847
|
input: imageInput,
|
|
1874
1848
|
id: crypto.randomUUID(),
|
|
@@ -218,11 +218,19 @@ const UIStrings = {
|
|
|
218
218
|
/**
|
|
219
219
|
*@description Explanation for an event outcome. Key refers to a cryptographic key.
|
|
220
220
|
*/
|
|
221
|
-
|
|
221
|
+
signingKeyGenerationError: 'Signing key generation error',
|
|
222
|
+
/**
|
|
223
|
+
*@description Explanation for an event outcome. Key refers to a cryptographic key.
|
|
224
|
+
*/
|
|
225
|
+
attestationKeyGenerationError: 'Attestation key generation error',
|
|
222
226
|
/**
|
|
223
227
|
*@description Explanation for an event outcome. Signing refers to cryptographic signing.
|
|
224
228
|
*/
|
|
225
229
|
signingError: 'Signing error',
|
|
230
|
+
/**
|
|
231
|
+
*@description Explanation for an event outcome. Signing refers to cryptographic signing.
|
|
232
|
+
*/
|
|
233
|
+
transientSigningError: 'Transient signing error',
|
|
226
234
|
/**
|
|
227
235
|
*@description Explanation for an event outcome.
|
|
228
236
|
*/
|
|
@@ -942,10 +950,14 @@ function fetchResultToString(fetchResult: Protocol.Network.DeviceBoundSessionFet
|
|
|
942
950
|
switch (fetchResult) {
|
|
943
951
|
case Protocol.Network.DeviceBoundSessionFetchResult.Success:
|
|
944
952
|
return i18nString(UIStrings.success);
|
|
945
|
-
case Protocol.Network.DeviceBoundSessionFetchResult.
|
|
946
|
-
return i18nString(UIStrings.
|
|
953
|
+
case Protocol.Network.DeviceBoundSessionFetchResult.SigningKeyGenerationError:
|
|
954
|
+
return i18nString(UIStrings.signingKeyGenerationError);
|
|
955
|
+
case Protocol.Network.DeviceBoundSessionFetchResult.AttestationKeyGenerationError:
|
|
956
|
+
return i18nString(UIStrings.attestationKeyGenerationError);
|
|
947
957
|
case Protocol.Network.DeviceBoundSessionFetchResult.SigningError:
|
|
948
958
|
return i18nString(UIStrings.signingError);
|
|
959
|
+
case Protocol.Network.DeviceBoundSessionFetchResult.TransientSigningError:
|
|
960
|
+
return i18nString(UIStrings.transientSigningError);
|
|
949
961
|
case Protocol.Network.DeviceBoundSessionFetchResult.ServerRequestedTermination:
|
|
950
962
|
return i18nString(UIStrings.serverRequestedTermination);
|
|
951
963
|
case Protocol.Network.DeviceBoundSessionFetchResult.InvalidSessionId:
|
|
@@ -21,6 +21,7 @@ import * as CspEvaluator from '../../third_party/csp_evaluator/csp_evaluator.js'
|
|
|
21
21
|
import * as Buttons from '../../ui/components/buttons/buttons.js';
|
|
22
22
|
import type * as ExpandableList from '../../ui/components/expandable_list/expandable_list.js';
|
|
23
23
|
import type * as ReportView from '../../ui/components/report_view/report_view.js';
|
|
24
|
+
import * as UIHelpers from '../../ui/helpers/helpers.js';
|
|
24
25
|
import * as Components from '../../ui/legacy/components/utils/utils.js';
|
|
25
26
|
import * as UI from '../../ui/legacy/legacy.js';
|
|
26
27
|
import {html, type LitTemplate, nothing, render} from '../../ui/lit/lit.js';
|
|
@@ -680,7 +681,7 @@ function renderSingleCSP(cspInfo: Protocol.Network.ContentSecurityPolicyStatus,
|
|
|
680
681
|
.accessibleLabel=${i18nString(UIStrings.learnMore)}
|
|
681
682
|
.variant=${Buttons.Button.Variant.ICON}
|
|
682
683
|
.size=${Buttons.Button.Size.SMALL}
|
|
683
|
-
@click=${()=> {
|
|
684
|
+
@click=${()=> {UIHelpers.openInNewTab('https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only');}}
|
|
684
685
|
jslog=${VisualLogging.link('learn-more.csp-report-only').track({click: true})}
|
|
685
686
|
></devtools-button>`}
|
|
686
687
|
</devtools-report-key>
|