chrome-devtools-frontend 1.0.1574367 → 1.0.1575635
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/.stylelintrc.json +1 -1
- package/AUTHORS +1 -0
- package/docs/contributing/settings-experiments-features.md +5 -2
- package/front_end/core/common/Settings.ts +1 -1
- package/front_end/core/host/InspectorFrontendHostAPI.ts +7 -1
- package/front_end/core/host/InspectorFrontendHostStub.ts +10 -0
- package/front_end/core/host/UserMetrics.ts +15 -0
- package/front_end/core/root/Runtime.ts +119 -39
- package/front_end/core/sdk/CSSMatchedStyles.ts +27 -0
- package/front_end/entrypoints/main/MainImpl.ts +25 -7
- package/front_end/entrypoints/node_app/app/NodeConnectionsPanel.ts +3 -2
- package/front_end/generated/InspectorBackendCommands.ts +37 -0
- package/front_end/generated/protocol-mapping.d.ts +257 -0
- package/front_end/generated/protocol-proxy-api.d.ts +256 -0
- package/front_end/generated/protocol.ts +359 -0
- package/front_end/models/ai_assistance/AiConversation.ts +31 -10
- package/front_end/models/ai_assistance/AiHistoryStorage.ts +1 -0
- package/front_end/models/ai_assistance/agents/AiAgent.ts +29 -5
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.snapshot.txt +73 -0
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +141 -0
- package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +3 -3
- package/front_end/models/ai_assistance/agents/StylingAgent.ts +5 -4
- package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
- package/front_end/models/issues_manager/CorsIssue.ts +0 -3
- package/front_end/models/javascript_metadata/NativeFunctions.js +5 -0
- package/front_end/models/live-metrics/LiveMetrics.ts +31 -51
- package/front_end/models/stack_trace/StackTrace.ts +41 -0
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +72 -6
- package/front_end/panels/ai_assistance/ai_assistance-meta.ts +1 -0
- package/front_end/panels/ai_assistance/components/ChatInput.ts +24 -2
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +6 -4
- package/front_end/panels/ai_assistance/components/ChatView.ts +5 -6
- package/front_end/panels/ai_assistance/components/chatView.css +10 -0
- package/front_end/panels/application/StorageView.ts +3 -3
- package/front_end/panels/application/preloading/components/preloadingDisabledInfobar.css +1 -1
- package/front_end/panels/common/AiCodeGenerationUpgradeDialog.ts +32 -16
- package/front_end/panels/common/aiCodeCompletionSummaryToolbar.css +1 -1
- package/front_end/panels/console/ConsoleContextSelector.ts +4 -3
- package/front_end/panels/console/ConsoleFormat.ts +31 -2
- package/front_end/panels/console/ConsoleInsightTeaser.ts +6 -1
- package/front_end/panels/elements/ElementsTreeElement.ts +46 -2
- package/front_end/panels/elements/ElementsTreeOutline.ts +1 -1
- package/front_end/panels/elements/StylePropertyTreeElement.ts +63 -0
- package/front_end/panels/elements/StylesSidebarPane.ts +17 -2
- package/front_end/panels/elements/stylePropertiesTreeOutline.css +4 -0
- package/front_end/panels/issues/AffectedMetadataAllowedSitesView.ts +3 -3
- package/front_end/panels/layer_viewer/Layers3DView.ts +2 -1
- package/front_end/panels/lighthouse/LighthouseStartView.ts +7 -6
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +3 -2
- package/front_end/panels/network/RequestConditionsDrawer.ts +2 -3
- package/front_end/panels/network/SignedExchangeInfoView.ts +3 -4
- package/front_end/panels/network/components/HeaderSectionRow.css +1 -1
- package/front_end/panels/recorder/components/RecordingView.ts +2 -2
- package/front_end/panels/recorder/components/recordingView.css +5 -0
- package/front_end/panels/security/SecurityPanelSidebar.ts +10 -9
- package/front_end/panels/settings/AISettingsTab.ts +2 -1
- package/front_end/panels/settings/KeybindsSettingsTab.ts +3 -5
- package/front_end/panels/settings/SettingsScreen.ts +14 -9
- package/front_end/panels/settings/settings-meta.ts +1 -0
- package/front_end/panels/sources/CallStackSidebarPane.ts +10 -0
- package/front_end/panels/sources/DebuggerPlugin.ts +18 -12
- package/front_end/panels/sources/ScopeChainSidebarPane.ts +4 -3
- package/front_end/panels/sources/SourcesNavigator.ts +2 -2
- package/front_end/panels/sources/SourcesPanel.ts +6 -3
- package/front_end/panels/sources/TabbedEditorContainer.ts +2 -2
- package/front_end/panels/sources/sources-meta.ts +2 -1
- package/front_end/panels/timeline/TimelinePanel.ts +2 -1
- package/front_end/panels/timeline/TimelineUIUtils.ts +2 -2
- package/front_end/panels/timeline/components/DetailsView.ts +7 -7
- package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -2
- package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +4 -4
- package/front_end/panels/whats_new/ReleaseNoteText.ts +11 -11
- package/front_end/panels/whats_new/releaseNoteView.css +1 -1
- package/front_end/panels/whats_new/resources/WNDT.md +6 -6
- 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/cjs/puppeteer/cdp/TargetManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/TargetManager.js +30 -25
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/TargetManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +30 -21
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/TargetManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/TargetManager.js +31 -26
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/TargetManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/package.json +3 -3
- package/front_end/third_party/puppeteer/package/src/cdp/TargetManager.ts +45 -44
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/ui/components/buttons/Button.ts +2 -2
- package/front_end/ui/components/panel_feedback/PreviewToggle.ts +1 -1
- package/front_end/ui/components/panel_feedback/panelFeedback.css +1 -1
- package/front_end/ui/kit/link/Link.ts +31 -0
- package/front_end/ui/legacy/LinkContextMenuProvider.ts +3 -5
- package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +2 -2
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +336 -250
- package/front_end/ui/legacy/inspectorCommon.css +0 -1
- package/front_end/ui/legacy/legacy.ts +0 -4
- package/front_end/ui/visual_logging/KnownContextValues.ts +4 -0
- package/front_end/ui/visual_logging/LoggingDriver.ts +10 -6
- package/mcp/HostBindings.ts +6 -0
- package/package.json +1 -1
- package/front_end/ui/legacy/XElement.ts +0 -41
- package/front_end/ui/legacy/XLink.ts +0 -128
package/.stylelintrc.json
CHANGED
package/AUTHORS
CHANGED
|
@@ -64,6 +64,7 @@ Krishnal Ciccolella <ciccolella.krishnal@gmail.com>
|
|
|
64
64
|
Liam DeBeasi <ldebeasi@gmail.com>
|
|
65
65
|
Luke Swiderski <luke.swiderski@gmail.com>
|
|
66
66
|
Luke Warlow <luke@warlow.dev>
|
|
67
|
+
Lyra Rebane <rebane2001@gmail.com>
|
|
67
68
|
Marijn Haverbeke <marijnh@gmail.com>
|
|
68
69
|
Max 😎 Coplan <mchcopl@gmail.com>
|
|
69
70
|
Michael Brüning <michael.bruning@qt.io>
|
|
@@ -12,6 +12,9 @@ Adding new DevTools experiments is deprecated, the preferred way for adding new
|
|
|
12
12
|
features / exposing experimental features is via `base::Feature`s. These are
|
|
13
13
|
controllable via Chromium command line parameters or optionally via `chrome://flags`.
|
|
14
14
|
|
|
15
|
+
Note: We are currently in the process of migrating away from DevTools experiments,
|
|
16
|
+
this documentation is partly outdated and will be updated ASAP.
|
|
17
|
+
|
|
15
18
|
|
|
16
19
|
[TOC]
|
|
17
20
|
|
|
@@ -76,9 +79,9 @@ This step is optional. If you want the `base::Feature` to be controllable via th
|
|
|
76
79
|
|
|
77
80
|
Please refer to this [example CL](https://crrev.com/c/5626314).
|
|
78
81
|
|
|
79
|
-
## How to add experiments
|
|
82
|
+
## DEPRECATED:How to add experiments
|
|
80
83
|
|
|
81
|
-
Note:
|
|
84
|
+
Note: We are currently in the process of migrating away from DevTools experiments, please use a `base::Feature` instead.
|
|
82
85
|
|
|
83
86
|
If you want to launch a new feature in DevTools behind an experiment flag, you
|
|
84
87
|
will need to do two things:
|
|
@@ -343,7 +343,7 @@ export class SettingsStorage {
|
|
|
343
343
|
export class Deprecation {
|
|
344
344
|
readonly disabled: boolean;
|
|
345
345
|
readonly warning: Platform.UIString.LocalizedString;
|
|
346
|
-
readonly experiment?: Root.Runtime.Experiment;
|
|
346
|
+
readonly experiment?: Root.Runtime.Experiment|Root.Runtime.HostExperiment;
|
|
347
347
|
|
|
348
348
|
constructor({deprecationNotice}: SettingRegistration) {
|
|
349
349
|
if (!deprecationNotice) {
|
|
@@ -389,6 +389,8 @@ export interface InspectorFrontendHostAPI {
|
|
|
389
389
|
|
|
390
390
|
recordPerformanceHistogram(histogramName: string, duration: number): void;
|
|
391
391
|
|
|
392
|
+
recordPerformanceHistogramMedium(histogramName: string, duration: number): void;
|
|
393
|
+
|
|
392
394
|
recordUserMetricsAction(umaName: string): void;
|
|
393
395
|
|
|
394
396
|
recordNewBadgeUsage(featureName: string): void;
|
|
@@ -449,6 +451,8 @@ export interface InspectorFrontendHostAPI {
|
|
|
449
451
|
recordKeyDown(event: KeyDownEvent): void;
|
|
450
452
|
recordSettingAccess(event: SettingAccessEvent): void;
|
|
451
453
|
recordFunctionCall(event: FunctionCallEvent): void;
|
|
454
|
+
|
|
455
|
+
setChromeFlag(flagName: string, value: boolean): void;
|
|
452
456
|
}
|
|
453
457
|
|
|
454
458
|
export interface AcceleratorDescriptor {
|
|
@@ -507,12 +511,14 @@ export interface SyncInformation {
|
|
|
507
511
|
accountImage?: string;
|
|
508
512
|
/** The full name of the account used for syncing */
|
|
509
513
|
accountFullName?: string;
|
|
514
|
+
/** The given name of the account used for syncing */
|
|
515
|
+
accountGivenName?: string;
|
|
510
516
|
/** Whether Chrome Sync is paused, equivalent to the user being logged out automatically */
|
|
511
517
|
isSyncPaused?: boolean;
|
|
512
518
|
}
|
|
513
519
|
|
|
514
520
|
/**
|
|
515
|
-
* Enum for
|
|
521
|
+
* Enum for recordEnumeratedHistogram
|
|
516
522
|
* Warning: There is another definition of this enum in the DevTools code
|
|
517
523
|
* base, keep them in sync:
|
|
518
524
|
* front_end/devtools_compatibility.js
|
|
@@ -255,6 +255,13 @@ export class InspectorFrontendHostStub implements InspectorFrontendHostAPI {
|
|
|
255
255
|
this.recordedPerformanceHistograms.push({histogramName, duration});
|
|
256
256
|
}
|
|
257
257
|
|
|
258
|
+
recordPerformanceHistogramMedium(histogramName: string, duration: number): void {
|
|
259
|
+
if (this.recordedPerformanceHistograms.length >= MAX_RECORDED_HISTOGRAMS_SIZE) {
|
|
260
|
+
this.recordedPerformanceHistograms.shift();
|
|
261
|
+
}
|
|
262
|
+
this.recordedPerformanceHistograms.push({histogramName, duration});
|
|
263
|
+
}
|
|
264
|
+
|
|
258
265
|
recordUserMetricsAction(_umaName: string): void {
|
|
259
266
|
}
|
|
260
267
|
|
|
@@ -555,4 +562,7 @@ export class InspectorFrontendHostStub implements InspectorFrontendHostAPI {
|
|
|
555
562
|
}
|
|
556
563
|
recordFunctionCall(_event: FunctionCallEvent): void {
|
|
557
564
|
}
|
|
565
|
+
|
|
566
|
+
setChromeFlag(_flagName: string, _value: boolean): void {
|
|
567
|
+
}
|
|
558
568
|
}
|
|
@@ -283,11 +283,26 @@ export class UserMetrics {
|
|
|
283
283
|
'DevTools.Insights.TeaserGenerationTime', timeInMilliseconds);
|
|
284
284
|
}
|
|
285
285
|
|
|
286
|
+
consoleInsightTeaserGeneratedMedium(timeInMilliseconds: number): void {
|
|
287
|
+
InspectorFrontendHostInstance.recordPerformanceHistogramMedium(
|
|
288
|
+
'DevTools.Insights.TeaserGenerationTimeMedium', timeInMilliseconds);
|
|
289
|
+
}
|
|
290
|
+
|
|
286
291
|
consoleInsightTeaserFirstChunkGenerated(timeInMilliseconds: number): void {
|
|
287
292
|
InspectorFrontendHostInstance.recordPerformanceHistogram(
|
|
288
293
|
'DevTools.Insights.TeaserFirstChunkGenerationTime', timeInMilliseconds);
|
|
289
294
|
}
|
|
290
295
|
|
|
296
|
+
consoleInsightTeaserFirstChunkGeneratedMedium(timeInMilliseconds: number): void {
|
|
297
|
+
InspectorFrontendHostInstance.recordPerformanceHistogramMedium(
|
|
298
|
+
'DevTools.Insights.TeaserFirstChunkGenerationTimeMedium', timeInMilliseconds);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
consoleInsightTeaserChunkToEndMedium(timeInMilliseconds: number): void {
|
|
302
|
+
InspectorFrontendHostInstance.recordPerformanceHistogramMedium(
|
|
303
|
+
'DevTools.Insights.TeaserChunkToEndMedium', timeInMilliseconds);
|
|
304
|
+
}
|
|
305
|
+
|
|
291
306
|
consoleInsightTeaserAbortedAfterFirstCharacter(timeInMilliseconds: number): void {
|
|
292
307
|
InspectorFrontendHostInstance.recordPerformanceHistogram(
|
|
293
308
|
'DevTools.Insights.TeaserAfterFirstCharacterAbortionTime', timeInMilliseconds);
|
|
@@ -159,24 +159,35 @@ export interface Option {
|
|
|
159
159
|
|
|
160
160
|
export class ExperimentsSupport {
|
|
161
161
|
#experiments: Experiment[] = [];
|
|
162
|
+
#hostExperiments = new Map<ExperimentName, HostExperiment>();
|
|
162
163
|
readonly #experimentNames = new Set<ExperimentName>();
|
|
163
|
-
readonly #
|
|
164
|
+
readonly #enabledForTests = new Set<ExperimentName>();
|
|
164
165
|
readonly #enabledByDefault = new Set<ExperimentName>();
|
|
165
166
|
readonly #serverEnabled = new Set<ExperimentName>();
|
|
166
167
|
readonly #storage = new ExperimentStorage();
|
|
167
168
|
|
|
168
|
-
allConfigurableExperiments(): Experiment
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
169
|
+
allConfigurableExperiments(): Array<Experiment|HostExperiment> {
|
|
170
|
+
return [...this.#experiments, ...this.#hostExperiments.values()];
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
registerHostExperiment(params: {
|
|
174
|
+
name: ExperimentName,
|
|
175
|
+
title: string,
|
|
176
|
+
aboutFlag: string,
|
|
177
|
+
isEnabled: boolean,
|
|
178
|
+
docLink?: Platform.DevToolsPath.UrlString,
|
|
179
|
+
readonly feedbackLink?: Platform.DevToolsPath.UrlString,
|
|
180
|
+
}): HostExperiment {
|
|
181
|
+
if (this.#isHostExperiment(params.name) || this.#isExperiment(params.name)) {
|
|
182
|
+
throw new Error(`Duplicate registration of experiment '${params.name}'`);
|
|
174
183
|
}
|
|
175
|
-
|
|
184
|
+
const hostExperiment = new HostExperiment({...params, experiments: this});
|
|
185
|
+
this.#hostExperiments.set(params.name, hostExperiment);
|
|
186
|
+
return hostExperiment;
|
|
176
187
|
}
|
|
177
188
|
|
|
178
189
|
register(experimentName: ExperimentName, experimentTitle: string, docLink?: string, feedbackLink?: string): void {
|
|
179
|
-
if (this.#
|
|
190
|
+
if (this.#isHostExperiment(experimentName) || this.#isExperiment(experimentName)) {
|
|
180
191
|
throw new Error(`Duplicate registration of experiment '${experimentName}'`);
|
|
181
192
|
}
|
|
182
193
|
this.#experimentNames.add(experimentName);
|
|
@@ -187,63 +198,87 @@ export class ExperimentsSupport {
|
|
|
187
198
|
}
|
|
188
199
|
|
|
189
200
|
isEnabled(experimentName: ExperimentName): boolean {
|
|
190
|
-
this
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
if (this.#storage.get(experimentName) === false) {
|
|
194
|
-
return false;
|
|
201
|
+
if (this.#isHostExperiment(experimentName)) {
|
|
202
|
+
return this.#enabledForTests.has(experimentName) ||
|
|
203
|
+
(this.#hostExperiments.get(experimentName)?.isEnabled() ?? false);
|
|
195
204
|
}
|
|
196
|
-
if (this.#
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
205
|
+
if (this.#isExperiment(experimentName)) {
|
|
206
|
+
// Check for explicitly disabled #experiments first - the code could call setEnable(false)
|
|
207
|
+
// on the experiment enabled by default and we should respect that.
|
|
208
|
+
if (this.#storage.get(experimentName) === false) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
if (this.#enabledForTests.has(experimentName) || this.#enabledByDefault.has(experimentName)) {
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
if (this.#serverEnabled.has(experimentName)) {
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
return Boolean(this.#storage.get(experimentName));
|
|
201
218
|
}
|
|
202
|
-
|
|
203
|
-
return Boolean(this.#storage.get(experimentName));
|
|
219
|
+
throw new Error(`Unknown experiment '${experimentName}'`);
|
|
204
220
|
}
|
|
205
221
|
|
|
206
|
-
|
|
207
|
-
this.
|
|
208
|
-
this.#storage.set(experimentName, enabled);
|
|
222
|
+
getValueFromStorage(experimentName: ExperimentName): boolean|undefined {
|
|
223
|
+
return this.#storage.get(experimentName);
|
|
209
224
|
}
|
|
210
225
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
this.
|
|
214
|
-
|
|
226
|
+
setEnabled(experimentName: ExperimentName, enabled: boolean): void {
|
|
227
|
+
if (this.#isHostExperiment(experimentName)) {
|
|
228
|
+
this.#hostExperiments.get(experimentName)?.setEnabled(enabled);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (this.#isExperiment(experimentName)) {
|
|
232
|
+
this.#storage.set(experimentName, enabled);
|
|
233
|
+
return;
|
|
215
234
|
}
|
|
235
|
+
throw new Error(`Unknown experiment '${experimentName}'`);
|
|
216
236
|
}
|
|
217
237
|
|
|
238
|
+
// Only applicable to legacy experiments.
|
|
218
239
|
enableExperimentsByDefault(experimentNames: ExperimentName[]): void {
|
|
219
240
|
for (const experimentName of experimentNames) {
|
|
220
|
-
this
|
|
241
|
+
if (!this.#isExperiment(experimentName)) {
|
|
242
|
+
throw new Error(`Unknown (legacy) experiment '${experimentName}'`);
|
|
243
|
+
}
|
|
221
244
|
this.#enabledByDefault.add(experimentName);
|
|
222
245
|
}
|
|
223
246
|
}
|
|
224
247
|
|
|
248
|
+
// Only applicable to legacy experiments.
|
|
225
249
|
setServerEnabledExperiments(experiments: string[]): void {
|
|
226
250
|
for (const experiment of experiments) {
|
|
227
251
|
const experimentName = experiment as ExperimentName;
|
|
228
|
-
this
|
|
252
|
+
if (!this.#isExperiment(experimentName)) {
|
|
253
|
+
throw new Error(`Unknown (legacy) experiment '${experimentName}'`);
|
|
254
|
+
}
|
|
229
255
|
this.#serverEnabled.add(experimentName);
|
|
230
256
|
}
|
|
231
257
|
}
|
|
232
258
|
|
|
233
259
|
enableForTest(experimentName: ExperimentName): void {
|
|
234
|
-
this
|
|
235
|
-
|
|
260
|
+
if (!this.#isHostExperiment(experimentName) && !this.#isExperiment(experimentName)) {
|
|
261
|
+
throw new Error(`Unknown experiment '${experimentName}'`);
|
|
262
|
+
}
|
|
263
|
+
this.#enabledForTests.add(experimentName);
|
|
236
264
|
}
|
|
237
265
|
|
|
238
266
|
disableForTest(experimentName: ExperimentName): void {
|
|
239
|
-
this
|
|
240
|
-
|
|
267
|
+
if (!this.#isHostExperiment(experimentName) && !this.#isExperiment(experimentName)) {
|
|
268
|
+
throw new Error(`Unknown experiment '${experimentName}'`);
|
|
269
|
+
}
|
|
270
|
+
this.#enabledForTests.delete(experimentName);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
isEnabledForTest(experimentName: ExperimentName): boolean {
|
|
274
|
+
return this.#enabledForTests.has(experimentName);
|
|
241
275
|
}
|
|
242
276
|
|
|
243
277
|
clearForTest(): void {
|
|
244
278
|
this.#experiments = [];
|
|
279
|
+
this.#hostExperiments.clear();
|
|
245
280
|
this.#experimentNames.clear();
|
|
246
|
-
this.#
|
|
281
|
+
this.#enabledForTests.clear();
|
|
247
282
|
this.#enabledByDefault.clear();
|
|
248
283
|
this.#serverEnabled.clear();
|
|
249
284
|
}
|
|
@@ -252,10 +287,12 @@ export class ExperimentsSupport {
|
|
|
252
287
|
this.#storage.cleanUpStaleExperiments(this.#experimentNames);
|
|
253
288
|
}
|
|
254
289
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
290
|
+
#isHostExperiment(experimentName: ExperimentName): boolean {
|
|
291
|
+
return this.#hostExperiments.has(experimentName);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
#isExperiment(experimentName: ExperimentName): boolean {
|
|
295
|
+
return this.#experimentNames.has(experimentName);
|
|
259
296
|
}
|
|
260
297
|
}
|
|
261
298
|
|
|
@@ -332,6 +369,44 @@ export class Experiment {
|
|
|
332
369
|
}
|
|
333
370
|
}
|
|
334
371
|
|
|
372
|
+
export class HostExperiment {
|
|
373
|
+
name: ExperimentName;
|
|
374
|
+
title: string;
|
|
375
|
+
readonly #experiments: ExperimentsSupport;
|
|
376
|
+
// This is the name of the corresponding Chromium flag (in chrome/browser/about_flags.cc).
|
|
377
|
+
// It is NOT the the name of the corresponding Chromium `base::Feature`.
|
|
378
|
+
aboutFlag: string;
|
|
379
|
+
#isEnabled: boolean;
|
|
380
|
+
docLink?: Platform.DevToolsPath.UrlString;
|
|
381
|
+
readonly feedbackLink?: Platform.DevToolsPath.UrlString;
|
|
382
|
+
|
|
383
|
+
constructor(params: {
|
|
384
|
+
name: ExperimentName,
|
|
385
|
+
title: string,
|
|
386
|
+
experiments: ExperimentsSupport,
|
|
387
|
+
aboutFlag: string,
|
|
388
|
+
isEnabled: boolean,
|
|
389
|
+
docLink?: Platform.DevToolsPath.UrlString,
|
|
390
|
+
feedbackLink?: Platform.DevToolsPath.UrlString,
|
|
391
|
+
}) {
|
|
392
|
+
this.name = params.name;
|
|
393
|
+
this.title = params.title;
|
|
394
|
+
this.#experiments = params.experiments;
|
|
395
|
+
this.aboutFlag = params.aboutFlag;
|
|
396
|
+
this.#isEnabled = params.isEnabled;
|
|
397
|
+
this.docLink = params.docLink;
|
|
398
|
+
this.feedbackLink = params.feedbackLink;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
isEnabled(): boolean {
|
|
402
|
+
return this.#experiments.isEnabledForTest(this.name) || this.#isEnabled;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
setEnabled(enabled: boolean): void {
|
|
406
|
+
this.#isEnabled = enabled;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
335
410
|
/** This must be constructed after the query parameters have been parsed. **/
|
|
336
411
|
export const experiments = new ExperimentsSupport();
|
|
337
412
|
|
|
@@ -524,6 +599,10 @@ interface ConsoleInsightsTeasers {
|
|
|
524
599
|
allowWithoutGpu: boolean;
|
|
525
600
|
}
|
|
526
601
|
|
|
602
|
+
interface DevToolsProtocolMonitor {
|
|
603
|
+
enabled: boolean;
|
|
604
|
+
}
|
|
605
|
+
|
|
527
606
|
/**
|
|
528
607
|
* The host configuration that we expect from the DevTools back-end.
|
|
529
608
|
*
|
|
@@ -575,6 +654,7 @@ export type HostConfig = Platform.TypeScriptUtilities.RecursivePartial<{
|
|
|
575
654
|
devToolsAiAssistanceContextSelectionAgent: HostConfigAiAssistanceContextSelectionAgent,
|
|
576
655
|
devToolsConsoleInsightsTeasers: ConsoleInsightsTeasers,
|
|
577
656
|
devToolsGeminiRebranding: HostConfigGeminiRebranding,
|
|
657
|
+
devToolsProtocolMonitor: DevToolsProtocolMonitor,
|
|
578
658
|
}>;
|
|
579
659
|
|
|
580
660
|
/**
|
|
@@ -908,6 +908,11 @@ export class CSSMatchedStyles {
|
|
|
908
908
|
return domCascade ? domCascade.propertyState(property) : null;
|
|
909
909
|
}
|
|
910
910
|
|
|
911
|
+
isPropertyOverriddenByAnimation(property: CSSProperty): boolean {
|
|
912
|
+
const domCascade = this.#styleToDOMCascade.get(property.ownerStyle);
|
|
913
|
+
return domCascade?.isPropertyOverriddenByAnimation(property) ?? false;
|
|
914
|
+
}
|
|
915
|
+
|
|
911
916
|
resetActiveProperties(): void {
|
|
912
917
|
Platform.assertNotNullOrUndefined(this.#mainDOMCascade);
|
|
913
918
|
Platform.assertNotNullOrUndefined(this.#pseudoDOMCascades);
|
|
@@ -961,6 +966,7 @@ class NodeCascade {
|
|
|
961
966
|
readonly styles: CSSStyleDeclaration[];
|
|
962
967
|
readonly #isInherited: boolean;
|
|
963
968
|
readonly propertiesState = new Map<CSSProperty, PropertyState>();
|
|
969
|
+
readonly propertiesOverriddenByAnimation = new Set<CSSProperty>();
|
|
964
970
|
readonly activeProperties = new Map<string, CSSProperty>();
|
|
965
971
|
readonly #node: DOMNode;
|
|
966
972
|
constructor(
|
|
@@ -974,6 +980,7 @@ class NodeCascade {
|
|
|
974
980
|
|
|
975
981
|
computeActiveProperties(): void {
|
|
976
982
|
this.propertiesState.clear();
|
|
983
|
+
this.propertiesOverriddenByAnimation.clear();
|
|
977
984
|
this.activeProperties.clear();
|
|
978
985
|
|
|
979
986
|
for (let i = this.styles.length - 1; i >= 0; i--) {
|
|
@@ -1082,6 +1089,10 @@ class NodeCascade {
|
|
|
1082
1089
|
|
|
1083
1090
|
if (activeProperty) {
|
|
1084
1091
|
this.propertiesState.set(activeProperty, PropertyState.OVERLOADED);
|
|
1092
|
+
if (propertyWithHigherSpecificity.ownerStyle.type === Type.Animation ||
|
|
1093
|
+
propertyWithHigherSpecificity.ownerStyle.type === Type.Transition) {
|
|
1094
|
+
this.propertiesOverriddenByAnimation.add(activeProperty);
|
|
1095
|
+
}
|
|
1085
1096
|
}
|
|
1086
1097
|
this.propertiesState.set(propertyWithHigherSpecificity, PropertyState.ACTIVE);
|
|
1087
1098
|
this.activeProperties.set(canonicalName, propertyWithHigherSpecificity);
|
|
@@ -1176,6 +1187,7 @@ function* forEach<T>(array: T[], startAfter?: T): Generator<T> {
|
|
|
1176
1187
|
|
|
1177
1188
|
class DOMInheritanceCascade {
|
|
1178
1189
|
readonly #propertiesState = new Map<CSSProperty, PropertyState>();
|
|
1190
|
+
readonly #propertiesOverriddenByAnimation = new Set<CSSProperty>();
|
|
1179
1191
|
readonly #availableCSSVariables = new Map<NodeCascade, Map<string, CSSVariableValue|null>>();
|
|
1180
1192
|
readonly #computedCSSVariables = new Map<NodeCascade, Map<string, CSSVariableValue|CSSAttributeValue|null>>();
|
|
1181
1193
|
readonly #styleToNodeCascade = new Map<CSSStyleDeclaration, NodeCascade>();
|
|
@@ -1568,9 +1580,15 @@ class DOMInheritanceCascade {
|
|
|
1568
1580
|
return this.#propertiesState.get(property) || null;
|
|
1569
1581
|
}
|
|
1570
1582
|
|
|
1583
|
+
isPropertyOverriddenByAnimation(property: CSSProperty): boolean {
|
|
1584
|
+
this.ensureInitialized();
|
|
1585
|
+
return this.#propertiesOverriddenByAnimation.has(property);
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1571
1588
|
reset(): void {
|
|
1572
1589
|
this.#initialized = false;
|
|
1573
1590
|
this.#propertiesState.clear();
|
|
1591
|
+
this.#propertiesOverriddenByAnimation.clear();
|
|
1574
1592
|
this.#availableCSSVariables.clear();
|
|
1575
1593
|
this.#computedCSSVariables.clear();
|
|
1576
1594
|
}
|
|
@@ -1587,11 +1605,20 @@ class DOMInheritanceCascade {
|
|
|
1587
1605
|
for (const [property, state] of nodeCascade.propertiesState) {
|
|
1588
1606
|
if (state === PropertyState.OVERLOADED) {
|
|
1589
1607
|
this.#propertiesState.set(property, PropertyState.OVERLOADED);
|
|
1608
|
+
if (nodeCascade.propertiesOverriddenByAnimation.has(property)) {
|
|
1609
|
+
this.#propertiesOverriddenByAnimation.add(property);
|
|
1610
|
+
}
|
|
1590
1611
|
continue;
|
|
1591
1612
|
}
|
|
1592
1613
|
const canonicalName = cssMetadata().canonicalPropertyName(property.name);
|
|
1593
1614
|
if (activeProperties.has(canonicalName)) {
|
|
1594
1615
|
this.#propertiesState.set(property, PropertyState.OVERLOADED);
|
|
1616
|
+
const activeProperty = activeProperties.get(canonicalName);
|
|
1617
|
+
if (activeProperty &&
|
|
1618
|
+
(activeProperty.ownerStyle.type === Type.Animation ||
|
|
1619
|
+
activeProperty.ownerStyle.type === Type.Transition)) {
|
|
1620
|
+
this.#propertiesOverriddenByAnimation.add(property);
|
|
1621
|
+
}
|
|
1595
1622
|
continue;
|
|
1596
1623
|
}
|
|
1597
1624
|
activeProperties.set(canonicalName, property);
|
|
@@ -328,13 +328,35 @@ export class MainImpl {
|
|
|
328
328
|
return {syncedStorage, globalStorage, localStorage};
|
|
329
329
|
}
|
|
330
330
|
|
|
331
|
+
#migrateValueFromLegacyToHostExperiment(
|
|
332
|
+
legacyExperimentName: Root.ExperimentNames.ExperimentName, hostExperiment: Root.Runtime.HostExperiment): void {
|
|
333
|
+
const value = Root.Runtime.experiments.getValueFromStorage(legacyExperimentName);
|
|
334
|
+
if (value !== undefined && hostExperiment.aboutFlag) {
|
|
335
|
+
// Set the host experiment to the same value as the legacy experiment.
|
|
336
|
+
hostExperiment.setEnabled(value);
|
|
337
|
+
// Set the chrome flag to the same value as the legacy experiment.
|
|
338
|
+
Host.InspectorFrontendHost.InspectorFrontendHostInstance.setChromeFlag(hostExperiment.aboutFlag, value);
|
|
339
|
+
// The legacy experiment will be cleaned up by `cleanUpStaleExperiments`.
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
331
343
|
#initializeExperiments(): void {
|
|
332
344
|
Root.Runtime.experiments.register(
|
|
333
345
|
Root.ExperimentNames.ExperimentName.CAPTURE_NODE_CREATION_STACKS, 'Capture node creation stacks');
|
|
334
346
|
Root.Runtime.experiments.register(Root.ExperimentNames.ExperimentName.LIVE_HEAP_PROFILE, 'Live heap profile');
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
347
|
+
|
|
348
|
+
const enableProtocolMonitor = (Root.Runtime.hostConfig.devToolsProtocolMonitor?.enabled ?? false) ||
|
|
349
|
+
Boolean(Root.Runtime.Runtime.queryParam('isChromeForTesting'));
|
|
350
|
+
const protocolMonitorExperiment = Root.Runtime.experiments.registerHostExperiment({
|
|
351
|
+
name: Root.ExperimentNames.ExperimentName.PROTOCOL_MONITOR,
|
|
352
|
+
title: 'Protocol Monitor',
|
|
353
|
+
aboutFlag: 'devtools-protocol-monitor',
|
|
354
|
+
isEnabled: enableProtocolMonitor,
|
|
355
|
+
docLink: 'https://developer.chrome.com/blog/new-in-devtools-92/#protocol-monitor' as
|
|
356
|
+
Platform.DevToolsPath.UrlString,
|
|
357
|
+
});
|
|
358
|
+
this.#migrateValueFromLegacyToHostExperiment(
|
|
359
|
+
Root.ExperimentNames.ExperimentName.PROTOCOL_MONITOR, protocolMonitorExperiment);
|
|
338
360
|
Root.Runtime.experiments.register(
|
|
339
361
|
Root.ExperimentNames.ExperimentName.SAMPLING_HEAP_PROFILER_TIMELINE, 'Sampling heap profiler timeline');
|
|
340
362
|
Root.Runtime.experiments.register(
|
|
@@ -403,9 +425,6 @@ export class MainImpl {
|
|
|
403
425
|
Root.Runtime.experiments.enableExperimentsByDefault([
|
|
404
426
|
Root.ExperimentNames.ExperimentName.FULL_ACCESSIBILITY_TREE,
|
|
405
427
|
Root.ExperimentNames.ExperimentName.USE_SOURCE_MAP_SCOPES,
|
|
406
|
-
...(Root.Runtime.Runtime.queryParam('isChromeForTesting') ?
|
|
407
|
-
[Root.ExperimentNames.ExperimentName.PROTOCOL_MONITOR] :
|
|
408
|
-
[]),
|
|
409
428
|
]);
|
|
410
429
|
|
|
411
430
|
Root.Runtime.experiments.cleanUpStaleExperiments();
|
|
@@ -413,7 +432,6 @@ export class MainImpl {
|
|
|
413
432
|
if (enabledExperiments) {
|
|
414
433
|
Root.Runtime.experiments.setServerEnabledExperiments(enabledExperiments.split(';'));
|
|
415
434
|
}
|
|
416
|
-
Root.Runtime.experiments.enableExperimentsTransiently([]);
|
|
417
435
|
|
|
418
436
|
if (Host.InspectorFrontendHost.isUnderTest()) {
|
|
419
437
|
const testParam = Root.Runtime.Runtime.queryParam('test');
|
|
@@ -8,6 +8,7 @@ import * as Host from '../../../core/host/host.js';
|
|
|
8
8
|
import * as i18n from '../../../core/i18n/i18n.js';
|
|
9
9
|
import * as Buttons from '../../../ui/components/buttons/buttons.js';
|
|
10
10
|
import * as uiI18n from '../../../ui/i18n/i18n.js';
|
|
11
|
+
import {Link} from '../../../ui/kit/kit.js';
|
|
11
12
|
import * as UI from '../../../ui/legacy/legacy.js';
|
|
12
13
|
|
|
13
14
|
import nodeConnectionsPanelStyles from './nodeConnectionsPanel.css.js';
|
|
@@ -94,8 +95,8 @@ export class NodeConnectionsView extends UI.Widget.VBox implements UI.ListWidget
|
|
|
94
95
|
this.element.classList.add('network-discovery-view');
|
|
95
96
|
|
|
96
97
|
const networkDiscoveryFooter = this.element.createChild('div', 'network-discovery-footer');
|
|
97
|
-
const documentationLink =
|
|
98
|
-
'https://nodejs.org/en/docs/inspector/', i18nString(UIStrings.nodejsDebuggingGuide), undefined,
|
|
98
|
+
const documentationLink = Link.create(
|
|
99
|
+
'https://nodejs.org/en/docs/inspector/', i18nString(UIStrings.nodejsDebuggingGuide), undefined,
|
|
99
100
|
'node-js-debugging');
|
|
100
101
|
networkDiscoveryFooter.appendChild(
|
|
101
102
|
uiI18n.getFormatLocalizedString(str_, UIStrings.specifyNetworkEndpointAnd, {PH1: documentationLink}));
|
|
@@ -1242,6 +1242,43 @@ inspectorBackend.registerType("ServiceWorker.ServiceWorkerRegistration", [{"name
|
|
|
1242
1242
|
inspectorBackend.registerType("ServiceWorker.ServiceWorkerVersion", [{"name": "versionId", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "registrationId", "type": "string", "optional": false, "description": "", "typeRef": "ServiceWorker.RegistrationID"}, {"name": "scriptURL", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "runningStatus", "type": "string", "optional": false, "description": "", "typeRef": "ServiceWorker.ServiceWorkerVersionRunningStatus"}, {"name": "status", "type": "string", "optional": false, "description": "", "typeRef": "ServiceWorker.ServiceWorkerVersionStatus"}, {"name": "scriptLastModified", "type": "number", "optional": true, "description": "The Last-Modified header value of the main script.", "typeRef": null}, {"name": "scriptResponseTime", "type": "number", "optional": true, "description": "The time at which the response headers of the main script were received from the server. For cached script it is the last time the cache entry was validated.", "typeRef": null}, {"name": "controlledClients", "type": "array", "optional": true, "description": "", "typeRef": "Target.TargetID"}, {"name": "targetId", "type": "string", "optional": true, "description": "", "typeRef": "Target.TargetID"}, {"name": "routerRules", "type": "string", "optional": true, "description": "", "typeRef": null}]);
|
|
1243
1243
|
inspectorBackend.registerType("ServiceWorker.ServiceWorkerErrorMessage", [{"name": "errorMessage", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "registrationId", "type": "string", "optional": false, "description": "", "typeRef": "ServiceWorker.RegistrationID"}, {"name": "versionId", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "sourceURL", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "lineNumber", "type": "number", "optional": false, "description": "", "typeRef": null}, {"name": "columnNumber", "type": "number", "optional": false, "description": "", "typeRef": null}]);
|
|
1244
1244
|
|
|
1245
|
+
// SmartCardEmulation.
|
|
1246
|
+
inspectorBackend.registerEnum("SmartCardEmulation.ResultCode", {Success: "success", RemovedCard: "removed-card", ResetCard: "reset-card", UnpoweredCard: "unpowered-card", UnresponsiveCard: "unresponsive-card", UnsupportedCard: "unsupported-card", ReaderUnavailable: "reader-unavailable", SharingViolation: "sharing-violation", NotTransacted: "not-transacted", NoSmartcard: "no-smartcard", ProtoMismatch: "proto-mismatch", SystemCancelled: "system-cancelled", NotReady: "not-ready", Cancelled: "cancelled", InsufficientBuffer: "insufficient-buffer", InvalidHandle: "invalid-handle", InvalidParameter: "invalid-parameter", InvalidValue: "invalid-value", NoMemory: "no-memory", Timeout: "timeout", UnknownReader: "unknown-reader", UnsupportedFeature: "unsupported-feature", NoReadersAvailable: "no-readers-available", ServiceStopped: "service-stopped", NoService: "no-service", CommError: "comm-error", InternalError: "internal-error", ServerTooBusy: "server-too-busy", Unexpected: "unexpected", Shutdown: "shutdown", UnknownCard: "unknown-card", Unknown: "unknown"});
|
|
1247
|
+
inspectorBackend.registerEnum("SmartCardEmulation.ShareMode", {Shared: "shared", Exclusive: "exclusive", Direct: "direct"});
|
|
1248
|
+
inspectorBackend.registerEnum("SmartCardEmulation.Disposition", {LeaveCard: "leave-card", ResetCard: "reset-card", UnpowerCard: "unpower-card", EjectCard: "eject-card"});
|
|
1249
|
+
inspectorBackend.registerEnum("SmartCardEmulation.ConnectionState", {Absent: "absent", Present: "present", Swallowed: "swallowed", Powered: "powered", Negotiable: "negotiable", Specific: "specific"});
|
|
1250
|
+
inspectorBackend.registerEnum("SmartCardEmulation.Protocol", {T0: "t0", T1: "t1", Raw: "raw"});
|
|
1251
|
+
inspectorBackend.registerEvent("SmartCardEmulation.establishContextRequested", ["requestId"]);
|
|
1252
|
+
inspectorBackend.registerEvent("SmartCardEmulation.releaseContextRequested", ["requestId", "contextId"]);
|
|
1253
|
+
inspectorBackend.registerEvent("SmartCardEmulation.listReadersRequested", ["requestId", "contextId"]);
|
|
1254
|
+
inspectorBackend.registerEvent("SmartCardEmulation.getStatusChangeRequested", ["requestId", "contextId", "readerStates", "timeout"]);
|
|
1255
|
+
inspectorBackend.registerEvent("SmartCardEmulation.cancelRequested", ["requestId", "contextId"]);
|
|
1256
|
+
inspectorBackend.registerEvent("SmartCardEmulation.connectRequested", ["requestId", "contextId", "reader", "shareMode", "preferredProtocols"]);
|
|
1257
|
+
inspectorBackend.registerEvent("SmartCardEmulation.disconnectRequested", ["requestId", "handle", "disposition"]);
|
|
1258
|
+
inspectorBackend.registerEvent("SmartCardEmulation.transmitRequested", ["requestId", "handle", "data", "protocol"]);
|
|
1259
|
+
inspectorBackend.registerEvent("SmartCardEmulation.controlRequested", ["requestId", "handle", "controlCode", "data"]);
|
|
1260
|
+
inspectorBackend.registerEvent("SmartCardEmulation.getAttribRequested", ["requestId", "handle", "attribId"]);
|
|
1261
|
+
inspectorBackend.registerEvent("SmartCardEmulation.setAttribRequested", ["requestId", "handle", "attribId", "data"]);
|
|
1262
|
+
inspectorBackend.registerEvent("SmartCardEmulation.statusRequested", ["requestId", "handle"]);
|
|
1263
|
+
inspectorBackend.registerEvent("SmartCardEmulation.beginTransactionRequested", ["requestId", "handle"]);
|
|
1264
|
+
inspectorBackend.registerEvent("SmartCardEmulation.endTransactionRequested", ["requestId", "handle", "disposition"]);
|
|
1265
|
+
inspectorBackend.registerCommand("SmartCardEmulation.enable", [], [], "Enables the |SmartCardEmulation| domain.");
|
|
1266
|
+
inspectorBackend.registerCommand("SmartCardEmulation.disable", [], [], "Disables the |SmartCardEmulation| domain.");
|
|
1267
|
+
inspectorBackend.registerCommand("SmartCardEmulation.reportEstablishContextResult", [{"name": "requestId", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "contextId", "type": "number", "optional": false, "description": "", "typeRef": null}], [], "Reports the successful result of a |SCardEstablishContext| call. This maps to: PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#gaa1b8970169fd4883a6dc4a8f43f19b67 Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardestablishcontext");
|
|
1268
|
+
inspectorBackend.registerCommand("SmartCardEmulation.reportReleaseContextResult", [{"name": "requestId", "type": "string", "optional": false, "description": "", "typeRef": null}], [], "Reports the successful result of a |SCardReleaseContext| call. This maps to: PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#ga6aabcba7744c5c9419fdd6404f73a934 Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardreleasecontext");
|
|
1269
|
+
inspectorBackend.registerCommand("SmartCardEmulation.reportListReadersResult", [{"name": "requestId", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "readers", "type": "array", "optional": false, "description": "", "typeRef": "string"}], [], "Reports the successful result of a |SCardListReaders| call. This maps to: PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#ga93b07815789b3cf2629d439ecf20f0d9 Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardlistreadersa");
|
|
1270
|
+
inspectorBackend.registerCommand("SmartCardEmulation.reportGetStatusChangeResult", [{"name": "requestId", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "readerStates", "type": "array", "optional": false, "description": "", "typeRef": "SmartCardEmulation.ReaderStateOut"}], [], "Reports the successful result of a |SCardGetStatusChange| call. This maps to: PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#ga33247d5d1257d59e55647c3bb717db24 Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardgetstatuschangea");
|
|
1271
|
+
inspectorBackend.registerCommand("SmartCardEmulation.reportBeginTransactionResult", [{"name": "requestId", "type": "string", "optional": false, "description": "", "typeRef": null}], [], "Reports the result of a |SCardBeginTransaction| call. On success, this creates a new transaction object. This maps to: PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#gaddb835dce01a0da1d6ca02d33ee7d861 Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardbegintransaction");
|
|
1272
|
+
inspectorBackend.registerCommand("SmartCardEmulation.reportPlainResult", [{"name": "requestId", "type": "string", "optional": false, "description": "", "typeRef": null}], [], "Reports the successful result of a call that returns only a result code. Used for: |SCardCancel|, |SCardDisconnect|, |SCardSetAttrib|, |SCardEndTransaction|. This maps to: 1. SCardCancel PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#gaacbbc0c6d6c0cbbeb4f4debf6fbeeee6 Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardcancel 2. SCardDisconnect PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#ga4be198045c73ec0deb79e66c0ca1738a Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scarddisconnect 3. SCardSetAttrib PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#ga060f0038a4ddfd5dd2b8fadf3c3a2e4f Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardsetattrib 4. SCardEndTransaction PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#gae8742473b404363e5c587f570d7e2f3b Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardendtransaction");
|
|
1273
|
+
inspectorBackend.registerCommand("SmartCardEmulation.reportConnectResult", [{"name": "requestId", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "handle", "type": "number", "optional": false, "description": "", "typeRef": null}, {"name": "activeProtocol", "type": "string", "optional": true, "description": "", "typeRef": "SmartCardEmulation.Protocol"}], [], "Reports the successful result of a |SCardConnect| call. This maps to: PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#ga4e515829752e0a8dbc4d630696a8d6a5 Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardconnecta");
|
|
1274
|
+
inspectorBackend.registerCommand("SmartCardEmulation.reportDataResult", [{"name": "requestId", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "data", "type": "string", "optional": false, "description": "", "typeRef": null}], [], "Reports the successful result of a call that sends back data on success. Used for |SCardTransmit|, |SCardControl|, and |SCardGetAttrib|. This maps to: 1. SCardTransmit PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#ga9a2d77242a271310269065e64633ab99 Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardtransmit 2. SCardControl PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#gac3454d4657110fd7f753b2d3d8f4e32f Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardcontrol 3. SCardGetAttrib PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#gaacfec51917255b7a25b94c5104961602 Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardgetattrib");
|
|
1275
|
+
inspectorBackend.registerCommand("SmartCardEmulation.reportStatusResult", [{"name": "requestId", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "readerName", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "state", "type": "string", "optional": false, "description": "", "typeRef": "SmartCardEmulation.ConnectionState"}, {"name": "atr", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "protocol", "type": "string", "optional": true, "description": "", "typeRef": "SmartCardEmulation.Protocol"}], [], "Reports the successful result of a |SCardStatus| call. This maps to: PC/SC Lite: https://pcsclite.apdu.fr/api/group__API.html#gae49c3c894ad7ac12a5b896bde70d0382 Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardstatusa");
|
|
1276
|
+
inspectorBackend.registerCommand("SmartCardEmulation.reportError", [{"name": "requestId", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "resultCode", "type": "string", "optional": false, "description": "", "typeRef": "SmartCardEmulation.ResultCode"}], [], "Reports an error result for the given request.");
|
|
1277
|
+
inspectorBackend.registerType("SmartCardEmulation.ReaderStateFlags", [{"name": "unaware", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "ignore", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "changed", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "unknown", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "unavailable", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "empty", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "present", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "exclusive", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "inuse", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "mute", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "unpowered", "type": "boolean", "optional": true, "description": "", "typeRef": null}]);
|
|
1278
|
+
inspectorBackend.registerType("SmartCardEmulation.ProtocolSet", [{"name": "t0", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "t1", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "raw", "type": "boolean", "optional": true, "description": "", "typeRef": null}]);
|
|
1279
|
+
inspectorBackend.registerType("SmartCardEmulation.ReaderStateIn", [{"name": "reader", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "currentState", "type": "object", "optional": false, "description": "", "typeRef": "SmartCardEmulation.ReaderStateFlags"}, {"name": "currentInsertionCount", "type": "number", "optional": false, "description": "", "typeRef": null}]);
|
|
1280
|
+
inspectorBackend.registerType("SmartCardEmulation.ReaderStateOut", [{"name": "reader", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "eventState", "type": "object", "optional": false, "description": "", "typeRef": "SmartCardEmulation.ReaderStateFlags"}, {"name": "eventCount", "type": "number", "optional": false, "description": "", "typeRef": null}, {"name": "atr", "type": "string", "optional": false, "description": "", "typeRef": null}]);
|
|
1281
|
+
|
|
1245
1282
|
// Storage.
|
|
1246
1283
|
inspectorBackend.registerEnum("Storage.StorageType", {Cookies: "cookies", File_systems: "file_systems", Indexeddb: "indexeddb", Local_storage: "local_storage", Shader_cache: "shader_cache", Websql: "websql", Service_workers: "service_workers", Cache_storage: "cache_storage", Interest_groups: "interest_groups", Shared_storage: "shared_storage", Storage_buckets: "storage_buckets", All: "all", Other: "other"});
|
|
1247
1284
|
inspectorBackend.registerEnum("Storage.InterestGroupAccessType", {Join: "join", Leave: "leave", Update: "update", Loaded: "loaded", Bid: "bid", Win: "win", AdditionalBid: "additionalBid", AdditionalBidWin: "additionalBidWin", TopLevelBid: "topLevelBid", TopLevelAdditionalBid: "topLevelAdditionalBid", Clear: "clear"});
|