chrome-devtools-frontend 1.0.1534717 → 1.0.1536371

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 (95) hide show
  1. package/docs/contributing/images/issues-nearestslo.png +0 -0
  2. package/docs/contributing/issues.md +32 -58
  3. package/eslint.config.mjs +1 -0
  4. package/front_end/core/common/Console.ts +1 -8
  5. package/front_end/core/common/ParsedURL.ts +10 -20
  6. package/front_end/core/common/SegmentedRange.ts +1 -2
  7. package/front_end/core/common/StringOutputStream.ts +1 -4
  8. package/front_end/core/host/InspectorFrontendHost.ts +6 -0
  9. package/front_end/core/host/UserMetrics.ts +5 -1
  10. package/front_end/core/i18n/i18nImpl.ts +0 -24
  11. package/front_end/core/protocol_client/CDPConnection.ts +53 -5
  12. package/front_end/core/protocol_client/protocol_client.ts +2 -0
  13. package/front_end/core/sdk/AnimationModel.ts +1 -2
  14. package/front_end/core/sdk/CSSMatchedStyles.ts +2 -2
  15. package/front_end/core/sdk/CSSModel.ts +1 -1
  16. package/front_end/core/sdk/CSSProperty.ts +3 -6
  17. package/front_end/core/sdk/CSSStyleDeclaration.ts +4 -4
  18. package/front_end/core/sdk/DebuggerModel.ts +1 -2
  19. package/front_end/core/sdk/EnhancedTracesParser.ts +4 -0
  20. package/front_end/core/sdk/SourceMap.ts +2 -3
  21. package/front_end/devtools_compatibility.js +32 -24
  22. package/front_end/entrypoints/node_app/NodeConnectionsPanel.ts +2 -1
  23. package/front_end/generated/InspectorBackendCommands.js +1 -2
  24. package/front_end/generated/SupportedCSSProperties.js +57 -0
  25. package/front_end/generated/protocol.ts +0 -27
  26. package/front_end/panels/accessibility/AccessibilityNodeView.ts +18 -17
  27. package/front_end/panels/accessibility/AccessibilitySidebarView.ts +9 -12
  28. package/front_end/panels/ai_assistance/PatchWidget.ts +39 -40
  29. package/front_end/panels/ai_assistance/components/ChatView.ts +5 -4
  30. package/front_end/panels/ai_assistance/components/ExploreWidget.ts +0 -2
  31. package/front_end/panels/application/AppManifestView.ts +7 -6
  32. package/front_end/panels/application/ApplicationPanelSidebar.ts +4 -4
  33. package/front_end/panels/application/OpenedWindowDetailsView.ts +6 -6
  34. package/front_end/panels/application/StorageView.ts +9 -8
  35. package/front_end/panels/application/components/BackForwardCacheView.ts +333 -314
  36. package/front_end/panels/application/components/ProtocolHandlersView.ts +3 -2
  37. package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +2 -1
  38. package/front_end/panels/autofill/AutofillView.ts +2 -3
  39. package/front_end/panels/browser_debugger/ObjectEventListenersSidebarPane.ts +8 -8
  40. package/front_end/panels/changes/CombinedDiffView.ts +13 -14
  41. package/front_end/panels/common/BadgeNotification.ts +2 -1
  42. package/front_end/panels/common/GdpSignUpDialog.ts +2 -1
  43. package/front_end/panels/console/ConsoleInsightTeaser.ts +13 -2
  44. package/front_end/panels/console/ConsolePinPane.ts +12 -7
  45. package/front_end/panels/console/ConsoleView.ts +1 -0
  46. package/front_end/panels/console/consoleView.css +0 -1
  47. package/front_end/panels/developer_resources/DeveloperResourcesView.ts +9 -9
  48. package/front_end/panels/elements/ComputedStyleWidget.ts +7 -7
  49. package/front_end/panels/elements/ElementsTreeOutline.ts +1 -1
  50. package/front_end/panels/elements/EventListenersWidget.ts +9 -9
  51. package/front_end/panels/elements/NodeStackTraceWidget.ts +6 -6
  52. package/front_end/panels/elements/PlatformFontsWidget.ts +5 -5
  53. package/front_end/panels/elements/PropertiesWidget.ts +8 -8
  54. package/front_end/panels/layer_viewer/Layers3DView.ts +2 -1
  55. package/front_end/panels/layer_viewer/PaintProfilerView.ts +3 -3
  56. package/front_end/panels/network/RequestCookiesView.ts +2 -1
  57. package/front_end/panels/network/RequestTimingView.ts +2 -1
  58. package/front_end/panels/network/components/DirectSocketConnectionView.ts +4 -6
  59. package/front_end/panels/recorder/RecorderController.ts +34 -23
  60. package/front_end/panels/recorder/components/CreateRecordingView.ts +249 -240
  61. package/front_end/panels/security/CookieControlsView.ts +74 -67
  62. package/front_end/panels/security/CookieReportView.ts +18 -16
  63. package/front_end/panels/security/IPProtectionView.ts +1 -2
  64. package/front_end/panels/security/SecurityPanel.ts +19 -19
  65. package/front_end/panels/settings/AISettingsTab.ts +2 -1
  66. package/front_end/panels/settings/KeybindsSettingsTab.ts +6 -0
  67. package/front_end/panels/settings/components/SyncSection.ts +2 -1
  68. package/front_end/panels/sources/DebuggerPausedMessage.ts +4 -3
  69. package/front_end/panels/sources/ResourceOriginPlugin.ts +3 -2
  70. package/front_end/panels/sources/SourcesNavigator.ts +2 -1
  71. package/front_end/panels/sources/TabbedEditorContainer.ts +3 -2
  72. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +9 -9
  73. package/front_end/panels/timeline/TimelineSelectorStatsView.ts +36 -36
  74. package/front_end/panels/timeline/TimelineUIUtils.ts +3 -2
  75. package/front_end/panels/timeline/components/DetailsView.ts +5 -4
  76. package/front_end/panels/timeline/components/FieldSettingsDialog.ts +2 -1
  77. package/front_end/panels/timeline/components/LiveMetricsView.ts +5 -4
  78. package/front_end/panels/timeline/components/MetricCompareStrings.ts +25 -24
  79. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +1 -2
  80. package/front_end/panels/timeline/components/insights/LCPDiscovery.ts +2 -1
  81. package/front_end/third_party/chromium/README.chromium +1 -1
  82. package/front_end/ui/components/docs/tooltip/basic.ts +1 -1
  83. package/front_end/ui/components/tooltips/Tooltip.ts +32 -17
  84. package/front_end/ui/i18n/i18n.ts +31 -0
  85. package/front_end/ui/legacy/SoftDropDown.ts +1 -12
  86. package/front_end/ui/legacy/ViewManager.ts +2 -4
  87. package/front_end/ui/legacy/Widget.ts +33 -17
  88. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +2 -1
  89. package/front_end/ui/legacy/legacy.ts +0 -2
  90. package/front_end/ui/visual_logging/KnownContextValues.ts +5 -0
  91. package/mcp/mcp.ts +1 -0
  92. package/package.json +1 -1
  93. package/front_end/ui/components/docs/recorder_create_recording_view/basic.html +0 -20
  94. package/front_end/ui/components/docs/recorder_create_recording_view/basic.ts +0 -27
  95. package/front_end/ui/legacy/ThrottledWidget.ts +0 -48
@@ -19,6 +19,7 @@ import * as Marked from '../../../third_party/marked/marked.js';
19
19
  import * as Buttons from '../../../ui/components/buttons/buttons.js';
20
20
  import type * as MarkdownView from '../../../ui/components/markdown_view/markdown_view.js';
21
21
  import type {MarkdownLitRenderer} from '../../../ui/components/markdown_view/MarkdownView.js';
22
+ import * as uiI18n from '../../../ui/i18n/i18n.js';
22
23
  import * as UI from '../../../ui/legacy/legacy.js';
23
24
  import * as Lit from '../../../ui/lit/lit.js';
24
25
  import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
@@ -1546,16 +1547,16 @@ function renderConsentViewContents(): Lit.TemplateResult {
1546
1547
  return html`${i18nString(UIStrings.notAvailableInIncognitoMode)}`;
1547
1548
  }
1548
1549
  if (config.devToolsAiAssistancePerformanceAgent?.enabled) {
1549
- consentViewContents = i18n.i18n.getFormatLocalizedString(
1550
+ consentViewContents = uiI18n.getFormatLocalizedString(
1550
1551
  str_, UIStrings.turnOnForStylesRequestsPerformanceAndFiles, {PH1: settingsLink});
1551
1552
  } else if (config.devToolsAiAssistanceFileAgent?.enabled) {
1552
1553
  consentViewContents =
1553
- i18n.i18n.getFormatLocalizedString(str_, UIStrings.turnOnForStylesRequestsAndFiles, {PH1: settingsLink});
1554
+ uiI18n.getFormatLocalizedString(str_, UIStrings.turnOnForStylesRequestsAndFiles, {PH1: settingsLink});
1554
1555
  } else if (config.devToolsAiAssistanceNetworkAgent?.enabled) {
1555
1556
  consentViewContents =
1556
- i18n.i18n.getFormatLocalizedString(str_, UIStrings.turnOnForStylesAndRequests, {PH1: settingsLink});
1557
+ uiI18n.getFormatLocalizedString(str_, UIStrings.turnOnForStylesAndRequests, {PH1: settingsLink});
1557
1558
  } else {
1558
- consentViewContents = i18n.i18n.getFormatLocalizedString(str_, UIStrings.turnOnForStyles, {PH1: settingsLink});
1559
+ consentViewContents = uiI18n.getFormatLocalizedString(str_, UIStrings.turnOnForStyles, {PH1: settingsLink});
1559
1560
  }
1560
1561
 
1561
1562
  return html`${consentViewContents}`;
@@ -2,7 +2,6 @@
2
2
  // Copyright 2025 The Chromium Authors
3
3
  // Use of this source code is governed by a BSD-style license that can be
4
4
  // found in the LICENSE file.
5
- /* eslint-disable @devtools/no-lit-render-outside-of-view */
6
5
 
7
6
  import * as i18n from '../../../core/i18n/i18n.js';
8
7
  import * as Root from '../../../core/root/root.js';
@@ -105,7 +104,6 @@ export const DEFAULT_VIEW = (
105
104
  </div>
106
105
  `,
107
106
  target,
108
- { host: target },
109
107
  );
110
108
  // clang-format on
111
109
  };
@@ -11,6 +11,7 @@ import * as SDK from '../../core/sdk/sdk.js';
11
11
  import type * as Protocol from '../../generated/protocol.js';
12
12
  import * as Buttons from '../../ui/components/buttons/buttons.js';
13
13
  import * as IconButton from '../../ui/components/icon_button/icon_button.js';
14
+ import * as uiI18n from '../../ui/i18n/i18n.js';
14
15
  import * as InlineEditor from '../../ui/legacy/components/inline_editor/inline_editor.js';
15
16
  import * as Components from '../../ui/legacy/components/utils/utils.js';
16
17
  import * as UI from '../../ui/legacy/legacy.js';
@@ -704,7 +705,7 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
704
705
  Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(recommendedId);
705
706
  });
706
707
  suggestedIdNote.appendChild(
707
- i18n.i18n.getFormatLocalizedString(str_, UIStrings.appIdNote, {PH1: suggestedIdSpan, PH2: copyButton}));
708
+ uiI18n.getFormatLocalizedString(str_, UIStrings.appIdNote, {PH1: suggestedIdSpan, PH2: copyButton}));
708
709
  }
709
710
  } else {
710
711
  this.identitySection.removeField(i18nString(UIStrings.computedAppId));
@@ -781,7 +782,7 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
781
782
  'https://web.dev/maskable-icon/', i18nString(UIStrings.documentationOnMaskableIcons), undefined, undefined,
782
783
  'learn-more');
783
784
  this.iconsSection.appendRow().appendChild(
784
- i18n.i18n.getFormatLocalizedString(str_, UIStrings.needHelpReadOurS, {PH1: documentationLink}));
785
+ uiI18n.getFormatLocalizedString(str_, UIStrings.needHelpReadOurS, {PH1: documentationLink}));
785
786
 
786
787
  let squareSizedIconAvailable = false;
787
788
  for (const icon of icons) {
@@ -938,8 +939,8 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
938
939
  const wco = document.createElement('code');
939
940
  wco.classList.add('wco');
940
941
  wco.textContent = 'window-controls-overlay';
941
- wcoStatusMessage.appendChild(i18n.i18n.getFormatLocalizedString(
942
- str_, UIStrings.wcoFound, {PH1: wco, PH2: displayOverrideText, PH3: link}));
942
+ wcoStatusMessage.appendChild(
943
+ uiI18n.getFormatLocalizedString(str_, UIStrings.wcoFound, {PH1: wco, PH2: displayOverrideText, PH3: link}));
943
944
 
944
945
  if (this.overlayModel) {
945
946
  await this.appendWindowControlsToSection(this.overlayModel, url, stringProperty('theme_color'));
@@ -950,14 +951,14 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
950
951
  wcoStatusMessage.appendChild(infoIcon);
951
952
 
952
953
  wcoStatusMessage.appendChild(
953
- i18n.i18n.getFormatLocalizedString(str_, UIStrings.wcoNotFound, {PH1: displayOverrideText}));
954
+ uiI18n.getFormatLocalizedString(str_, UIStrings.wcoNotFound, {PH1: displayOverrideText}));
954
955
  }
955
956
 
956
957
  const wcoDocumentationLink = UI.XLink.XLink.create(
957
958
  'https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/window-controls-overlay',
958
959
  i18nString(UIStrings.customizePwaTitleBar), undefined, undefined, 'customize-pwa-tittle-bar');
959
960
  this.windowControlsSection.appendRow().appendChild(
960
- i18n.i18n.getFormatLocalizedString(str_, UIStrings.wcoNeedHelpReadMore, {PH1: wcoDocumentationLink}));
961
+ uiI18n.getFormatLocalizedString(str_, UIStrings.wcoNeedHelpReadMore, {PH1: wcoDocumentationLink}));
961
962
 
962
963
  this.dispatchEventToListeners(Events.MANIFEST_RENDERED);
963
964
  }
@@ -2478,7 +2478,7 @@ class FrameWindowTreeElement extends ApplicationPanelTreeElement {
2478
2478
  this.targetInfo = targetInfo;
2479
2479
  if (this.view) {
2480
2480
  this.view.setTargetInfo(targetInfo);
2481
- this.view.update();
2481
+ this.view.requestUpdate();
2482
2482
  }
2483
2483
  }
2484
2484
 
@@ -2487,7 +2487,7 @@ class FrameWindowTreeElement extends ApplicationPanelTreeElement {
2487
2487
  this.isWindowClosed = true;
2488
2488
  if (this.view) {
2489
2489
  this.view.setIsWindowClosed(true);
2490
- this.view.update();
2490
+ this.view.requestUpdate();
2491
2491
  }
2492
2492
  }
2493
2493
 
@@ -2496,7 +2496,7 @@ class FrameWindowTreeElement extends ApplicationPanelTreeElement {
2496
2496
  if (!this.view) {
2497
2497
  this.view = new OpenedWindowDetailsView(this.targetInfo, this.isWindowClosed);
2498
2498
  } else {
2499
- this.view.update();
2499
+ this.view.requestUpdate();
2500
2500
  }
2501
2501
  this.showView(this.view);
2502
2502
  Host.userMetrics.panelShown('frame-window');
@@ -2525,7 +2525,7 @@ class WorkerTreeElement extends ApplicationPanelTreeElement {
2525
2525
  if (!this.view) {
2526
2526
  this.view = new WorkerDetailsView(this.targetInfo);
2527
2527
  } else {
2528
- this.view.update();
2528
+ this.view.requestUpdate();
2529
2529
  }
2530
2530
  this.showView(this.view);
2531
2531
  Host.userMetrics.panelShown('frame-worker');
@@ -136,7 +136,7 @@ async function maybeCreateLinkToElementsPanel(
136
136
  return linkElement;
137
137
  }
138
138
 
139
- export class OpenedWindowDetailsView extends UI.ThrottledWidget.ThrottledWidget {
139
+ export class OpenedWindowDetailsView extends UI.Widget.VBox {
140
140
  private targetInfo: Protocol.Target.TargetInfo;
141
141
  private isWindowClosed: boolean;
142
142
  private readonly reportView: UI.ReportView.ReportView;
@@ -169,10 +169,10 @@ export class OpenedWindowDetailsView extends UI.ThrottledWidget.ThrottledWidget
169
169
  this.securitySection.setFieldVisible(i18nString(UIStrings.openerFrame), false);
170
170
  this.hasDOMAccessValue = this.securitySection.appendField(i18nString(UIStrings.accessToOpener));
171
171
  UI.Tooltip.Tooltip.install(this.hasDOMAccessValue, i18nString(UIStrings.showsWhetherTheOpenedWindowIs));
172
- this.update();
172
+ this.requestUpdate();
173
173
  }
174
174
 
175
- override async doUpdate(): Promise<void> {
175
+ override async performUpdate(): Promise<void> {
176
176
  this.reportView.setTitle(this.buildTitle());
177
177
  this.#urlFieldValue.textContent = this.targetInfo.url;
178
178
  this.#urlFieldValue.title = this.targetInfo.url;
@@ -208,7 +208,7 @@ export class OpenedWindowDetailsView extends UI.ThrottledWidget.ThrottledWidget
208
208
  }
209
209
  }
210
210
 
211
- export class WorkerDetailsView extends UI.ThrottledWidget.ThrottledWidget {
211
+ export class WorkerDetailsView extends UI.Widget.VBox {
212
212
  private readonly targetInfo: Protocol.Target.TargetInfo;
213
213
  private readonly reportView: UI.ReportView.ReportView;
214
214
  private readonly documentSection: UI.ReportView.Section;
@@ -239,7 +239,7 @@ export class WorkerDetailsView extends UI.ThrottledWidget.ThrottledWidget {
239
239
 
240
240
  this.isolationSection = this.reportView.appendSection(i18nString(UIStrings.securityIsolation));
241
241
  this.coepPolicy = this.isolationSection.appendField(i18nString(UIStrings.crossoriginEmbedderPolicy));
242
- this.update();
242
+ this.requestUpdate();
243
243
  }
244
244
 
245
245
  workerTypeToString(type: string): Common.UIString.LocalizedString {
@@ -295,7 +295,7 @@ export class WorkerDetailsView extends UI.ThrottledWidget.ThrottledWidget {
295
295
  }
296
296
  }
297
297
 
298
- override async doUpdate(): Promise<void> {
298
+ override async performUpdate(): Promise<void> {
299
299
  await this.updateCoopCoepStatus();
300
300
  }
301
301
  }
@@ -10,6 +10,7 @@ import * as SDK from '../../core/sdk/sdk.js';
10
10
  import * as Protocol from '../../generated/protocol.js';
11
11
  import type * as Buttons from '../../ui/components/buttons/buttons.js';
12
12
  import * as IconButton from '../../ui/components/icon_button/icon_button.js';
13
+ import * as uiI18n from '../../ui/i18n/i18n.js';
13
14
  import * as PerfUI from '../../ui/legacy/components/perf_ui/perf_ui.js';
14
15
  import * as UI from '../../ui/legacy/legacy.js';
15
16
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
@@ -146,7 +147,7 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
146
147
  /**
147
148
  * @implements {SDK.TargetManager.Observer}
148
149
  */
149
- export class StorageView extends UI.ThrottledWidget.ThrottledWidget {
150
+ export class StorageView extends UI.Widget.VBox {
150
151
  private pieColors: Map<Protocol.Storage.StorageType, string>;
151
152
  private reportView: UI.ReportView.ReportView;
152
153
  private target: SDK.Target.Target|null;
@@ -163,9 +164,10 @@ export class StorageView extends UI.ThrottledWidget.ThrottledWidget {
163
164
  private quotaOverrideEditor: HTMLInputElement;
164
165
  private quotaOverrideErrorMessage: HTMLElement;
165
166
  private clearButton: Buttons.Button.Button;
167
+ private readonly throttler = new Common.Throttler.Throttler(1000);
166
168
 
167
169
  constructor() {
168
- super(true, 1000);
170
+ super({useShadowDom: true});
169
171
  this.registerRequiredCSS(storageViewStyles);
170
172
 
171
173
  this.contentElement.classList.add('clear-storage-container');
@@ -341,7 +343,7 @@ export class StorageView extends UI.ThrottledWidget.ThrottledWidget {
341
343
  this.quotaOverrideCheckbox.checked = false;
342
344
  this.quotaOverrideErrorMessage.textContent = '';
343
345
  }
344
- void this.doUpdate();
346
+ void this.performUpdate();
345
347
  }
346
348
 
347
349
  private updateStorageKey(mainStorageKey: string): void {
@@ -355,7 +357,7 @@ export class StorageView extends UI.ThrottledWidget.ThrottledWidget {
355
357
  this.quotaOverrideCheckbox.checked = false;
356
358
  this.quotaOverrideErrorMessage.textContent = '';
357
359
  }
358
- void this.doUpdate();
360
+ void this.performUpdate();
359
361
  }
360
362
 
361
363
  private async applyQuotaOverrideFromInputField(): Promise<void> {
@@ -489,7 +491,7 @@ export class StorageView extends UI.ThrottledWidget.ThrottledWidget {
489
491
  }
490
492
  }
491
493
 
492
- override async doUpdate(): Promise<void> {
494
+ override async performUpdate(): Promise<void> {
493
495
  if (!this.securityOrigin || !this.target) {
494
496
  this.quotaRow.textContent = '';
495
497
  this.populatePieChart(0, []);
@@ -509,8 +511,7 @@ export class StorageView extends UI.ThrottledWidget.ThrottledWidget {
509
511
  const formattedQuotaAsString = i18nString(UIStrings.storageWithCustomMarker, {PH1: quotaAsString});
510
512
  const quota =
511
513
  quotaOverridden ? UI.Fragment.Fragment.build`<b>${formattedQuotaAsString}</b>`.element() : quotaAsString;
512
- const element =
513
- i18n.i18n.getFormatLocalizedString(str_, UIStrings.storageQuotaUsed, {PH1: usageAsString, PH2: quota});
514
+ const element = uiI18n.getFormatLocalizedString(str_, UIStrings.storageQuotaUsed, {PH1: usageAsString, PH2: quota});
514
515
  this.quotaRow.appendChild(element);
515
516
  UI.Tooltip.Tooltip.install(
516
517
  this.quotaRow,
@@ -542,7 +543,7 @@ export class StorageView extends UI.ThrottledWidget.ThrottledWidget {
542
543
  this.populatePieChart(response.usage, slices);
543
544
  }
544
545
 
545
- this.update();
546
+ void this.throttler.schedule(this.requestUpdate.bind(this));
546
547
  }
547
548
 
548
549
  private populatePieChart(total: number, slices: PerfUI.PieChart.Slice[]): void {