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.
Files changed (107) hide show
  1. package/.stylelintrc.json +1 -1
  2. package/AUTHORS +1 -0
  3. package/docs/contributing/settings-experiments-features.md +5 -2
  4. package/front_end/core/common/Settings.ts +1 -1
  5. package/front_end/core/host/InspectorFrontendHostAPI.ts +7 -1
  6. package/front_end/core/host/InspectorFrontendHostStub.ts +10 -0
  7. package/front_end/core/host/UserMetrics.ts +15 -0
  8. package/front_end/core/root/Runtime.ts +119 -39
  9. package/front_end/core/sdk/CSSMatchedStyles.ts +27 -0
  10. package/front_end/entrypoints/main/MainImpl.ts +25 -7
  11. package/front_end/entrypoints/node_app/app/NodeConnectionsPanel.ts +3 -2
  12. package/front_end/generated/InspectorBackendCommands.ts +37 -0
  13. package/front_end/generated/protocol-mapping.d.ts +257 -0
  14. package/front_end/generated/protocol-proxy-api.d.ts +256 -0
  15. package/front_end/generated/protocol.ts +359 -0
  16. package/front_end/models/ai_assistance/AiConversation.ts +31 -10
  17. package/front_end/models/ai_assistance/AiHistoryStorage.ts +1 -0
  18. package/front_end/models/ai_assistance/agents/AiAgent.ts +29 -5
  19. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.snapshot.txt +73 -0
  20. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +141 -0
  21. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +3 -3
  22. package/front_end/models/ai_assistance/agents/StylingAgent.ts +5 -4
  23. package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
  24. package/front_end/models/issues_manager/CorsIssue.ts +0 -3
  25. package/front_end/models/javascript_metadata/NativeFunctions.js +5 -0
  26. package/front_end/models/live-metrics/LiveMetrics.ts +31 -51
  27. package/front_end/models/stack_trace/StackTrace.ts +41 -0
  28. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +72 -6
  29. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +1 -0
  30. package/front_end/panels/ai_assistance/components/ChatInput.ts +24 -2
  31. package/front_end/panels/ai_assistance/components/ChatMessage.ts +6 -4
  32. package/front_end/panels/ai_assistance/components/ChatView.ts +5 -6
  33. package/front_end/panels/ai_assistance/components/chatView.css +10 -0
  34. package/front_end/panels/application/StorageView.ts +3 -3
  35. package/front_end/panels/application/preloading/components/preloadingDisabledInfobar.css +1 -1
  36. package/front_end/panels/common/AiCodeGenerationUpgradeDialog.ts +32 -16
  37. package/front_end/panels/common/aiCodeCompletionSummaryToolbar.css +1 -1
  38. package/front_end/panels/console/ConsoleContextSelector.ts +4 -3
  39. package/front_end/panels/console/ConsoleFormat.ts +31 -2
  40. package/front_end/panels/console/ConsoleInsightTeaser.ts +6 -1
  41. package/front_end/panels/elements/ElementsTreeElement.ts +46 -2
  42. package/front_end/panels/elements/ElementsTreeOutline.ts +1 -1
  43. package/front_end/panels/elements/StylePropertyTreeElement.ts +63 -0
  44. package/front_end/panels/elements/StylesSidebarPane.ts +17 -2
  45. package/front_end/panels/elements/stylePropertiesTreeOutline.css +4 -0
  46. package/front_end/panels/issues/AffectedMetadataAllowedSitesView.ts +3 -3
  47. package/front_end/panels/layer_viewer/Layers3DView.ts +2 -1
  48. package/front_end/panels/lighthouse/LighthouseStartView.ts +7 -6
  49. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +3 -2
  50. package/front_end/panels/network/RequestConditionsDrawer.ts +2 -3
  51. package/front_end/panels/network/SignedExchangeInfoView.ts +3 -4
  52. package/front_end/panels/network/components/HeaderSectionRow.css +1 -1
  53. package/front_end/panels/recorder/components/RecordingView.ts +2 -2
  54. package/front_end/panels/recorder/components/recordingView.css +5 -0
  55. package/front_end/panels/security/SecurityPanelSidebar.ts +10 -9
  56. package/front_end/panels/settings/AISettingsTab.ts +2 -1
  57. package/front_end/panels/settings/KeybindsSettingsTab.ts +3 -5
  58. package/front_end/panels/settings/SettingsScreen.ts +14 -9
  59. package/front_end/panels/settings/settings-meta.ts +1 -0
  60. package/front_end/panels/sources/CallStackSidebarPane.ts +10 -0
  61. package/front_end/panels/sources/DebuggerPlugin.ts +18 -12
  62. package/front_end/panels/sources/ScopeChainSidebarPane.ts +4 -3
  63. package/front_end/panels/sources/SourcesNavigator.ts +2 -2
  64. package/front_end/panels/sources/SourcesPanel.ts +6 -3
  65. package/front_end/panels/sources/TabbedEditorContainer.ts +2 -2
  66. package/front_end/panels/sources/sources-meta.ts +2 -1
  67. package/front_end/panels/timeline/TimelinePanel.ts +2 -1
  68. package/front_end/panels/timeline/TimelineUIUtils.ts +2 -2
  69. package/front_end/panels/timeline/components/DetailsView.ts +7 -7
  70. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -2
  71. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +4 -4
  72. package/front_end/panels/whats_new/ReleaseNoteText.ts +11 -11
  73. package/front_end/panels/whats_new/releaseNoteView.css +1 -1
  74. package/front_end/panels/whats_new/resources/WNDT.md +6 -6
  75. package/front_end/third_party/chromium/README.chromium +1 -1
  76. package/front_end/third_party/puppeteer/README.chromium +2 -2
  77. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/TargetManager.d.ts.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/TargetManager.js +30 -25
  79. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/TargetManager.js.map +1 -1
  80. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  81. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  82. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  83. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  84. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +30 -21
  85. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/TargetManager.d.ts.map +1 -1
  86. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/TargetManager.js +31 -26
  87. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/TargetManager.js.map +1 -1
  88. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  89. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  90. package/front_end/third_party/puppeteer/package/package.json +3 -3
  91. package/front_end/third_party/puppeteer/package/src/cdp/TargetManager.ts +45 -44
  92. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  93. package/front_end/ui/components/buttons/Button.ts +2 -2
  94. package/front_end/ui/components/panel_feedback/PreviewToggle.ts +1 -1
  95. package/front_end/ui/components/panel_feedback/panelFeedback.css +1 -1
  96. package/front_end/ui/kit/link/Link.ts +31 -0
  97. package/front_end/ui/legacy/LinkContextMenuProvider.ts +3 -5
  98. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +2 -2
  99. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +336 -250
  100. package/front_end/ui/legacy/inspectorCommon.css +0 -1
  101. package/front_end/ui/legacy/legacy.ts +0 -4
  102. package/front_end/ui/visual_logging/KnownContextValues.ts +4 -0
  103. package/front_end/ui/visual_logging/LoggingDriver.ts +10 -6
  104. package/mcp/HostBindings.ts +6 -0
  105. package/package.json +1 -1
  106. package/front_end/ui/legacy/XElement.ts +0 -41
  107. package/front_end/ui/legacy/XLink.ts +0 -128
package/.stylelintrc.json CHANGED
@@ -16,7 +16,7 @@
16
16
  "selector-type-no-unknown": [
17
17
  true,
18
18
  {
19
- "ignoreTypes": ["/^devtools-/", "/^dt-/", "x-link"]
19
+ "ignoreTypes": ["/^devtools-/", "/^dt-/"]
20
20
  }
21
21
  ],
22
22
  "selector-class-pattern": null,
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: Adding new DevTools experiments is deprecated, please use a `base::Feature` instead.
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 recordPerformanceHistogram
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 #enabledTransiently = new Set<ExperimentName>();
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
- const result = [];
170
- for (const experiment of this.#experiments) {
171
- if (!this.#enabledTransiently.has(experiment.name)) {
172
- result.push(experiment);
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
- return result;
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.#experimentNames.has(experimentName)) {
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.checkExperiment(experimentName);
191
- // Check for explicitly disabled #experiments first - the code could call setEnable(false) on the experiment enabled
192
- // by default and we should respect that.
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.#enabledTransiently.has(experimentName) || this.#enabledByDefault.has(experimentName)) {
197
- return true;
198
- }
199
- if (this.#serverEnabled.has(experimentName)) {
200
- return true;
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
- setEnabled(experimentName: ExperimentName, enabled: boolean): void {
207
- this.checkExperiment(experimentName);
208
- this.#storage.set(experimentName, enabled);
222
+ getValueFromStorage(experimentName: ExperimentName): boolean|undefined {
223
+ return this.#storage.get(experimentName);
209
224
  }
210
225
 
211
- enableExperimentsTransiently(experimentNames: ExperimentName[]): void {
212
- for (const experimentName of experimentNames) {
213
- this.checkExperiment(experimentName);
214
- this.#enabledTransiently.add(experimentName);
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.checkExperiment(experimentName);
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.checkExperiment(experimentName);
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.checkExperiment(experimentName);
235
- this.#enabledTransiently.add(experimentName);
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.checkExperiment(experimentName);
240
- this.#enabledTransiently.delete(experimentName);
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.#enabledTransiently.clear();
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
- private checkExperiment(experimentName: ExperimentName): void {
256
- if (!this.#experimentNames.has(experimentName)) {
257
- throw new Error(`Unknown experiment '${experimentName}'`);
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
- Root.Runtime.experiments.register(
336
- Root.ExperimentNames.ExperimentName.PROTOCOL_MONITOR, 'Protocol Monitor',
337
- 'https://developer.chrome.com/blog/new-in-devtools-92/#protocol-monitor');
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 = UI.XLink.XLink.create(
98
- 'https://nodejs.org/en/docs/inspector/', i18nString(UIStrings.nodejsDebuggingGuide), undefined, 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"});