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
@@ -9,6 +9,7 @@ import type * as Common from '../../core/common/common.js';
9
9
  import * as i18n from '../../core/i18n/i18n.js';
10
10
  import type * as Platform from '../../core/platform/platform.js';
11
11
  import * as Buttons from '../../ui/components/buttons/buttons.js';
12
+ import {Link} from '../../ui/kit/kit.js';
12
13
  import * as UI from '../../ui/legacy/legacy.js';
13
14
 
14
15
  import {type LighthouseController, type Preset, Presets, RuntimeSettings} from './LighthouseController.js';
@@ -87,8 +88,8 @@ export class StartView extends UI.Widget.Widget {
87
88
  labelEl.textContent = label;
88
89
 
89
90
  if (runtimeSetting.learnMore) {
90
- const link = UI.XLink.XLink.create(
91
- runtimeSetting.learnMore, i18nString(UIStrings.learnMore), 'lighthouse-learn-more', undefined, 'learn-more');
91
+ const link =
92
+ Link.create(runtimeSetting.learnMore, i18nString(UIStrings.learnMore), 'lighthouse-learn-more', 'learn-more');
92
93
  labelEl.append(link);
93
94
  }
94
95
  parentElement.appendChild(labelEl);
@@ -111,8 +112,8 @@ export class StartView extends UI.Widget.Widget {
111
112
  runtimeSetting.setting as Common.Settings.Setting<boolean>, runtimeSetting.description());
112
113
  toolbar.appendToolbarItem(control);
113
114
  if (runtimeSetting.learnMore) {
114
- const link = UI.XLink.XLink.create(
115
- runtimeSetting.learnMore, i18nString(UIStrings.learnMore), 'lighthouse-learn-more', undefined, 'learn-more');
115
+ const link =
116
+ Link.create(runtimeSetting.learnMore, i18nString(UIStrings.learnMore), 'lighthouse-learn-more', 'learn-more');
116
117
  link.style.margin = '5px';
117
118
  control.element.appendChild(link);
118
119
  }
@@ -135,8 +136,8 @@ export class StartView extends UI.Widget.Widget {
135
136
  control.setTitle(runtimeSetting.description());
136
137
  toolbar.appendToolbarItem(control);
137
138
  if (runtimeSetting.learnMore) {
138
- const link = UI.XLink.XLink.create(
139
- runtimeSetting.learnMore, i18nString(UIStrings.learnMore), 'lighthouse-learn-more', undefined, 'learn-more');
139
+ const link =
140
+ Link.create(runtimeSetting.learnMore, i18nString(UIStrings.learnMore), 'lighthouse-learn-more', 'learn-more');
140
141
  link.style.marginLeft = '5px';
141
142
  link.style.display = 'inline-flex';
142
143
  link.style.height = 'revert';
@@ -6,6 +6,7 @@
6
6
  import * as Common from '../../core/common/common.js';
7
7
  import * as i18n from '../../core/i18n/i18n.js';
8
8
  import type * as Platform from '../../core/platform/platform.js';
9
+ import {Link} from '../../ui/kit/kit.js';
9
10
  import * as UI from '../../ui/legacy/legacy.js';
10
11
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
11
12
 
@@ -59,8 +60,8 @@ export class LinearMemoryInspectorPane extends Common.ObjectWrapper.eventMixin<E
59
60
 
60
61
  const description = placeholder.createChild('div', 'empty-state-description');
61
62
  description.createChild('span').textContent = i18nString(UIStrings.memoryInspectorExplanation);
62
- const link = UI.XLink.XLink.create(
63
- MEMORY_INSPECTOR_EXPLANATION_URL, i18nString(UIStrings.learnMore), undefined, undefined, 'learn-more');
63
+ const link =
64
+ Link.create(MEMORY_INSPECTOR_EXPLANATION_URL, i18nString(UIStrings.learnMore), undefined, 'learn-more');
64
65
  description.appendChild(link);
65
66
 
66
67
  return placeholder;
@@ -4,7 +4,6 @@
4
4
  /* eslint-disable @devtools/no-lit-render-outside-of-view */
5
5
  /* eslint-disable @devtools/no-imperative-dom-api */
6
6
 
7
- import '../../ui/kit/kit.js';
8
7
  import '../../ui/legacy/legacy.js';
9
8
  import '../../ui/components/tooltips/tooltips.js';
10
9
 
@@ -16,6 +15,7 @@ import * as SDK from '../../core/sdk/sdk.js';
16
15
  import * as Logs from '../../models/logs/logs.js';
17
16
  import * as Buttons from '../../ui/components/buttons/buttons.js';
18
17
  import * as uiI18n from '../../ui/i18n/i18n.js';
18
+ import {Link} from '../../ui/kit/kit.js';
19
19
  import * as UI from '../../ui/legacy/legacy.js';
20
20
  import {Directives, html, type LitTemplate, nothing, render} from '../../ui/lit/lit.js';
21
21
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
@@ -575,8 +575,7 @@ export class RequestConditionsDrawer extends UI.Widget.VBox implements
575
575
  const titles = content.createChild('div', 'blocked-url-edit-row');
576
576
  const label = titles.createChild('label');
577
577
  if (Root.Runtime.hostConfig.devToolsIndividualRequestThrottling?.enabled) {
578
- const learnMore = UI.XLink.XLink.create(
579
- PATTERN_API_DOCS_URL, i18nString(UIStrings.learnMore), undefined, undefined, 'learn-more');
578
+ const learnMore = Link.create(PATTERN_API_DOCS_URL, i18nString(UIStrings.learnMore), undefined, 'learn-more');
580
579
  learnMore.title = i18nString(UIStrings.learnMoreLabel);
581
580
  titles.append('\xA0', learnMore);
582
581
  label.textContent = i18nString(UIStrings.textEditPattern);
@@ -7,7 +7,7 @@ import * as Host from '../../core/host/host.js';
7
7
  import * as i18n from '../../core/i18n/i18n.js';
8
8
  import type * as SDK from '../../core/sdk/sdk.js';
9
9
  import * as Protocol from '../../generated/protocol.js';
10
- import {Icon} from '../../ui/kit/kit.js';
10
+ import {Icon, Link} from '../../ui/kit/kit.js';
11
11
  import * as Components from '../../ui/legacy/components/utils/utils.js';
12
12
  import * as UI from '../../ui/legacy/legacy.js';
13
13
 
@@ -146,9 +146,8 @@ export class SignedExchangeInfoView extends UI.Widget.VBox {
146
146
 
147
147
  const titleElement = document.createDocumentFragment();
148
148
  titleElement.createChild('div', 'header-name').textContent = i18nString(UIStrings.signedHttpExchange);
149
- const learnMoreNode = UI.XLink.XLink.create(
150
- 'https://github.com/WICG/webpackage', i18nString(UIStrings.learnmore), 'header-toggle', undefined,
151
- 'learn-more');
149
+ const learnMoreNode = Link.create(
150
+ 'https://github.com/WICG/webpackage', i18nString(UIStrings.learnmore), 'header-toggle', 'learn-more');
152
151
  titleElement.appendChild(learnMoreNode);
153
152
  const headerCategory = new Category(root, titleElement);
154
153
  if (signedExchangeInfo.header) {
@@ -131,7 +131,7 @@
131
131
  color: var(--sys-color-token-subtle);
132
132
  }
133
133
 
134
- x-link .inline-icon {
134
+ devtools-link .inline-icon {
135
135
  padding-right: 3px;
136
136
  }
137
137
 
@@ -454,7 +454,7 @@ function renderTextEditor(input: ViewInput, output: ViewOutput): Lit.TemplateRes
454
454
  // clang-format off
455
455
  return html`
456
456
  <div class="text-editor" jslog=${VisualLogging.textField().track({change: true})}>
457
- <devtools-text-editor .state=${input.editorState} ${Lit.Directives.ref((editor: Element | undefined) => {
457
+ <devtools-text-editor .state=${input.editorState} ${Lit.Directives.ref(editor => {
458
458
  if (!editor || !(editor instanceof TextEditor.TextEditor.TextEditor)) {
459
459
  return;
460
460
  }
@@ -645,7 +645,7 @@ function renderSections(input: ViewInput): Lit.LitTemplate {
645
645
  )}
646
646
  </div>
647
647
  `;
648
- // clang-format on
648
+ // clang-format on
649
649
  }
650
650
 
651
651
  function renderHeader(input: ViewInput): Lit.LitTemplate {
@@ -225,6 +225,11 @@
225
225
  width: fit-content;
226
226
  }
227
227
 
228
+ .settings-title:focus-visible {
229
+ outline: 2px solid var(--sys-color-state-focus-ring);
230
+ outline-offset: 2px;
231
+ }
232
+
228
233
  .settings {
229
234
  margin-top: 4px;
230
235
  display: flex;
@@ -323,18 +323,19 @@ export class SecurityPanelSidebar extends UI.Widget.VBox {
323
323
  const icon = isOverviewElement ?
324
324
  getSecurityStateIconForOverview(securityState, `lock-icon lock-icon-${securityState}`) :
325
325
  getSecurityStateIconForDetailedView(securityState, `security-property security-property-${securityState}`);
326
- const elementTitle = isOverviewElement ? ((): Element => {
327
- const title = document.createElement('span');
328
- title.classList.add('title');
329
- title.textContent = i18nString(UIStrings.overview);
330
- return title;
331
- })() : createHighlightedUrl(element.origin() ?? Platform.DevToolsPath.EmptyUrlString, securityState);
332
326
 
333
327
  element.setLeadingIcons([icon]);
334
- if (element.listItemElement.lastChild) {
335
- element.listItemElement.removeChild(element.listItemElement.lastChild);
328
+
329
+ if (isOverviewElement) {
330
+ element.title = i18nString(UIStrings.overview);
331
+ } else {
332
+ const elementTitle =
333
+ createHighlightedUrl(element.origin() ?? Platform.DevToolsPath.EmptyUrlString, securityState);
334
+ if (element.listItemElement.lastChild) {
335
+ element.listItemElement.removeChild(element.listItemElement.lastChild);
336
+ }
337
+ element.listItemElement.appendChild(elementTitle);
336
338
  }
337
- element.listItemElement.appendChild(elementTitle);
338
339
  }
339
340
  }
340
341
  }
@@ -482,7 +482,8 @@ export class AISettingsTab extends UI.Widget.VBox {
482
482
 
483
483
  if (this.#aiAssistanceSetting) {
484
484
  const aiAssistanceData: AiSettingParams = {
485
- settingName: i18n.i18n.lockedString('AI assistance'),
485
+ settingName: i18n.i18n.lockedString(
486
+ AiAssistanceModel.AiUtils.isGeminiBranding() ? 'Gemini in Chrome DevTools' : 'AI assistance'),
486
487
  iconName: AiAssistanceModel.AiUtils.getIconName(),
487
488
  settingDescription: this.#getAiAssistanceSettingDescription(),
488
489
  enableSettingText: i18nString(UIStrings.enableAiAssistance),
@@ -3,14 +3,12 @@
3
3
  // found in the LICENSE file.
4
4
  /* eslint-disable @devtools/no-imperative-dom-api */
5
5
 
6
- import '../../ui/kit/kit.js';
7
-
8
6
  import * as Common from '../../core/common/common.js';
9
7
  import * as Host from '../../core/host/host.js';
10
8
  import * as i18n from '../../core/i18n/i18n.js';
11
9
  import * as Platform from '../../core/platform/platform.js';
12
10
  import * as Buttons from '../../ui/components/buttons/buttons.js';
13
- import {createIcon, type Icon} from '../../ui/kit/kit.js';
11
+ import {createIcon, type Icon, Link} from '../../ui/kit/kit.js';
14
12
  import * as SettingsUI from '../../ui/legacy/components/settings_ui/settings_ui.js';
15
13
  import * as UI from '../../ui/legacy/legacy.js';
16
14
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
@@ -146,9 +144,9 @@ export class KeybindsSettingsTab extends UI.Widget.VBox implements UI.ListContro
146
144
  UI.ARIAUtils.setLabel(this.list.element, i18nString(UIStrings.keyboardShortcutsList));
147
145
  const footer = document.createElement('div');
148
146
  footer.classList.add('keybinds-footer');
149
- const docsLink = UI.XLink.XLink.create(
147
+ const docsLink = Link.create(
150
148
  'https://developer.chrome.com/docs/devtools/shortcuts/', i18nString(UIStrings.FullListOfDevtoolsKeyboard),
151
- undefined, undefined, 'learn-more');
149
+ undefined, 'learn-more');
152
150
  docsLink.classList.add('docs-link');
153
151
  footer.appendChild(docsLink);
154
152
  const restoreDefaultShortcutsButton =
@@ -14,7 +14,7 @@ import * as Root from '../../core/root/root.js';
14
14
  import * as GreenDev from '../../models/greendev/greendev.js';
15
15
  import * as Buttons from '../../ui/components/buttons/buttons.js';
16
16
  import * as UIHelpers from '../../ui/helpers/helpers.js';
17
- import {type Card, createIcon} from '../../ui/kit/kit.js';
17
+ import {type Card, createIcon, Link} from '../../ui/kit/kit.js';
18
18
  import * as SettingsUI from '../../ui/legacy/components/settings_ui/settings_ui.js';
19
19
  import * as Components from '../../ui/legacy/components/utils/utils.js';
20
20
  import * as UI from '../../ui/legacy/legacy.js';
@@ -383,7 +383,7 @@ export class GenericSettingsTab extends UI.Widget.VBox implements SettingsTab {
383
383
 
384
384
  export class ExperimentsSettingsTab extends UI.Widget.VBox implements SettingsTab {
385
385
  #experimentsSection: Card|undefined;
386
- private readonly experimentToControl = new Map<Root.Runtime.Experiment, HTMLElement>();
386
+ private readonly experimentToControl = new Map<Root.Runtime.Experiment|Root.Runtime.HostExperiment, HTMLElement>();
387
387
  private readonly containerElement: HTMLElement;
388
388
 
389
389
  constructor() {
@@ -452,12 +452,16 @@ export class ExperimentsSettingsTab extends UI.Widget.VBox implements SettingsTa
452
452
  return subsection;
453
453
  }
454
454
 
455
- private createExperimentCheckbox(experiment: Root.Runtime.Experiment): HTMLParagraphElement {
455
+ private createExperimentCheckbox(experiment: Root.Runtime.Experiment|Root.Runtime.HostExperiment):
456
+ HTMLParagraphElement {
456
457
  const checkbox =
457
458
  UI.UIUtils.CheckboxLabel.createWithStringLiteral(experiment.title, experiment.isEnabled(), experiment.name);
458
459
  checkbox.classList.add('experiment-label');
459
460
  checkbox.name = experiment.name;
460
461
  function listener(): void {
462
+ if (experiment instanceof Root.Runtime.HostExperiment) {
463
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.setChromeFlag(experiment.aboutFlag, checkbox.checked);
464
+ }
461
465
  experiment.setEnabled(checkbox.checked);
462
466
  Host.userMetrics.experimentChanged(experiment.name, experiment.isEnabled());
463
467
  UI.InspectorView.InspectorView.instance().displayReloadRequiredWarning(
@@ -487,8 +491,7 @@ export class ExperimentsSettingsTab extends UI.Widget.VBox implements SettingsTa
487
491
  }
488
492
 
489
493
  if (experiment.feedbackLink) {
490
- const link = UI.XLink.XLink.create(
491
- experiment.feedbackLink, undefined, undefined, undefined, `${experiment.name}-feedback`);
494
+ const link = Link.create(experiment.feedbackLink, undefined, undefined, `${experiment.name}-feedback`);
492
495
  link.textContent = i18nString(UIStrings.sendFeedback);
493
496
  link.classList.add('feedback-link');
494
497
 
@@ -499,7 +502,7 @@ export class ExperimentsSettingsTab extends UI.Widget.VBox implements SettingsTa
499
502
  }
500
503
 
501
504
  highlightObject(experiment: Object): void {
502
- if (experiment instanceof Root.Runtime.Experiment) {
505
+ if (experiment instanceof Root.Runtime.Experiment || experiment instanceof Root.Runtime.HostExperiment) {
503
506
  const element = this.experimentToControl.get(experiment);
504
507
  if (element) {
505
508
  PanelUtils.highlightElement(element);
@@ -534,10 +537,12 @@ export class ActionDelegate implements UI.ActionRegistration.ActionDelegate {
534
537
  return false;
535
538
  }
536
539
  }
537
- export class Revealer implements Common.Revealer.Revealer<Root.Runtime.Experiment|Common.Settings.Setting<unknown>> {
538
- async reveal(object: Root.Runtime.Experiment|Common.Settings.Setting<unknown>): Promise<void> {
540
+ export class Revealer implements
541
+ Common.Revealer.Revealer<Root.Runtime.Experiment|Root.Runtime.HostExperiment|Common.Settings.Setting<unknown>> {
542
+ async reveal(object: Root.Runtime.Experiment|Root.Runtime.HostExperiment|Common.Settings.Setting<unknown>):
543
+ Promise<void> {
539
544
  const context = UI.Context.Context.instance();
540
- if (object instanceof Root.Runtime.Experiment) {
545
+ if (object instanceof Root.Runtime.Experiment || object instanceof Root.Runtime.HostExperiment) {
541
546
  Host.InspectorFrontendHost.InspectorFrontendHostInstance.bringToFront();
542
547
  await SettingsScreen.showSettingsScreen({name: 'experiments'});
543
548
  const experimentsSettingsTab = context.flavor(ExperimentsSettingsTab);
@@ -277,6 +277,7 @@ Common.Revealer.registerRevealer({
277
277
  return [
278
278
  Common.Settings.Setting,
279
279
  Root.Runtime.Experiment,
280
+ Root.Runtime.HostExperiment,
280
281
  ];
281
282
  },
282
283
  destination: undefined,
@@ -38,6 +38,7 @@ import type * as Protocol from '../../generated/protocol.js';
38
38
  import * as Bindings from '../../models/bindings/bindings.js';
39
39
  import * as Persistence from '../../models/persistence/persistence.js';
40
40
  import * as SourceMapScopes from '../../models/source_map_scopes/source_map_scopes.js';
41
+ import * as StackTrace from '../../models/stack_trace/stack_trace.js';
41
42
  import * as Workspace from '../../models/workspace/workspace.js';
42
43
  import {Icon} from '../../ui/kit/kit.js';
43
44
  import * as UI from '../../ui/legacy/legacy.js';
@@ -243,6 +244,7 @@ export class CallStackSidebarPane extends UI.View.SimpleView implements UI.Conte
243
244
  this.showMoreMessageElement.classList.add('hidden');
244
245
  this.items.replaceAll([]);
245
246
  UI.Context.Context.instance().setFlavor(SDK.DebuggerModel.CallFrame, null);
247
+ UI.Context.Context.instance().setFlavor(StackTrace.StackTrace.DebuggableFrameFlavor, null);
246
248
  return;
247
249
  }
248
250
 
@@ -432,6 +434,14 @@ export class CallStackSidebarPane extends UI.View.SimpleView implements UI.Conte
432
434
  if (debuggerCallFrame && oldItem !== item) {
433
435
  debuggerCallFrame.debuggerModel.setSelectedCallFrame(debuggerCallFrame);
434
436
  UI.Context.Context.instance().setFlavor(SDK.DebuggerModel.CallFrame, debuggerCallFrame);
437
+ UI.Context.Context.instance().setFlavor(
438
+ StackTrace.StackTrace.DebuggableFrameFlavor,
439
+ StackTrace.StackTrace.DebuggableFrameFlavor.for({
440
+ uiSourceCode: item.uiLocation?.uiSourceCode,
441
+ line: uiLocation.lineNumber,
442
+ column: uiLocation.columnNumber ?? -1,
443
+ sdkFrame: debuggerCallFrame,
444
+ }));
435
445
  if (oldItem) {
436
446
  this.refreshItem(oldItem);
437
447
  }
@@ -15,6 +15,7 @@ import * as Bindings from '../../models/bindings/bindings.js';
15
15
  import * as Breakpoints from '../../models/breakpoints/breakpoints.js';
16
16
  import * as Formatter from '../../models/formatter/formatter.js';
17
17
  import * as SourceMapScopes from '../../models/source_map_scopes/source_map_scopes.js';
18
+ import * as StackTrace from '../../models/stack_trace/stack_trace.js';
18
19
  import * as TextUtils from '../../models/text_utils/text_utils.js';
19
20
  import * as Workspace from '../../models/workspace/workspace.js';
20
21
  import * as CodeMirror from '../../third_party/codemirror.next/codemirror.next.js';
@@ -249,7 +250,8 @@ export class DebuggerPlugin extends Plugin {
249
250
  this.ignoreListCallback = this.showIgnoreListInfobarIfNeeded.bind(this);
250
251
  Workspace.IgnoreListManager.IgnoreListManager.instance().addChangeListener(this.ignoreListCallback);
251
252
 
252
- UI.Context.Context.instance().addFlavorChangeListener(SDK.DebuggerModel.CallFrame, this.callFrameChanged, this);
253
+ UI.Context.Context.instance().addFlavorChangeListener(
254
+ StackTrace.StackTrace.DebuggableFrameFlavor, this.callFrameChanged, this);
253
255
  this.liveLocationPool = new Bindings.LiveLocation.LiveLocationPool();
254
256
 
255
257
  this.updateScriptFiles();
@@ -649,11 +651,11 @@ export class DebuggerPlugin extends Plugin {
649
651
  return null;
650
652
  }
651
653
 
652
- const selectedCallFrame =
653
- (UI.Context.Context.instance().flavor(SDK.DebuggerModel.CallFrame) as SDK.DebuggerModel.CallFrame);
654
- if (!selectedCallFrame) {
654
+ const debuggableFrame = UI.Context.Context.instance().flavor(StackTrace.StackTrace.DebuggableFrameFlavor);
655
+ if (!debuggableFrame) {
655
656
  return null;
656
657
  }
658
+ const selectedCallFrame = debuggableFrame.sdkFrame;
657
659
 
658
660
  let textPosition = editor.editor.posAtCoords(event);
659
661
  if (!textPosition) {
@@ -729,8 +731,9 @@ export class DebuggerPlugin extends Plugin {
729
731
  }
730
732
  objectPopoverHelper =
731
733
  await ObjectUI.ObjectPopoverHelper.ObjectPopoverHelper.buildObjectPopover(result.object, popover);
732
- const potentiallyUpdatedCallFrame = UI.Context.Context.instance().flavor(SDK.DebuggerModel.CallFrame);
733
- if (!objectPopoverHelper || selectedCallFrame !== potentiallyUpdatedCallFrame) {
734
+ const potentiallyUpdatedCallFrame =
735
+ UI.Context.Context.instance().flavor(StackTrace.StackTrace.DebuggableFrameFlavor);
736
+ if (!objectPopoverHelper || debuggableFrame !== potentiallyUpdatedCallFrame) {
734
737
  debuggerModel.runtimeModel().releaseObjectGroup('popover');
735
738
  if (objectPopoverHelper) {
736
739
  objectPopoverHelper.dispose();
@@ -988,10 +991,11 @@ export class DebuggerPlugin extends Plugin {
988
991
  if (!executionContext) {
989
992
  return null;
990
993
  }
991
- const callFrame = UI.Context.Context.instance().flavor(SDK.DebuggerModel.CallFrame);
992
- if (!callFrame) {
994
+ const debuggableFrame = UI.Context.Context.instance().flavor(StackTrace.StackTrace.DebuggableFrameFlavor);
995
+ if (!debuggableFrame) {
993
996
  return null;
994
997
  }
998
+ const callFrame = debuggableFrame.sdkFrame;
995
999
  const url = this.uiSourceCode.url();
996
1000
 
997
1001
  const rawLocationToEditorOffset: (location: SDK.DebuggerModel.Location|null) => Promise<number|null> = location =>
@@ -1058,10 +1062,11 @@ export class DebuggerPlugin extends Plugin {
1058
1062
  if (!executionContext || !this.editor) {
1059
1063
  return;
1060
1064
  }
1061
- const callFrame = UI.Context.Context.instance().flavor(SDK.DebuggerModel.CallFrame);
1062
- if (!callFrame) {
1065
+ const debuggableFrame = UI.Context.Context.instance().flavor(StackTrace.StackTrace.DebuggableFrameFlavor);
1066
+ if (!debuggableFrame) {
1063
1067
  return;
1064
1068
  }
1069
+ const callFrame = debuggableFrame.sdkFrame;
1065
1070
  const start = callFrame.functionLocation() || callFrame.location();
1066
1071
  const debuggerModel = callFrame.debuggerModel;
1067
1072
 
@@ -1651,10 +1656,11 @@ export class DebuggerPlugin extends Plugin {
1651
1656
 
1652
1657
  private async callFrameChanged(): Promise<void> {
1653
1658
  this.liveLocationPool.disposeAll();
1654
- const callFrame = UI.Context.Context.instance().flavor(SDK.DebuggerModel.CallFrame);
1655
- if (!callFrame) {
1659
+ const debuggableFrame = UI.Context.Context.instance().flavor(StackTrace.StackTrace.DebuggableFrameFlavor);
1660
+ if (!debuggableFrame) {
1656
1661
  this.setExecutionLocation(null);
1657
1662
  } else {
1663
+ const callFrame = debuggableFrame.sdkFrame;
1658
1664
  await Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance().createCallFrameLiveLocation(
1659
1665
  callFrame.location(), async (liveLocation: Bindings.LiveLocation.LiveLocation) => {
1660
1666
  const uiLocation = await liveLocation.uiLocation();
@@ -34,6 +34,7 @@ import * as i18n from '../../core/i18n/i18n.js';
34
34
  import * as SDK from '../../core/sdk/sdk.js';
35
35
  import * as Protocol from '../../generated/protocol.js';
36
36
  import * as SourceMapScopes from '../../models/source_map_scopes/source_map_scopes.js';
37
+ import * as StackTrace from '../../models/stack_trace/stack_trace.js';
37
38
  import * as ObjectUI from '../../ui/legacy/components/object_ui/object_ui.js';
38
39
  import * as Components from '../../ui/legacy/components/utils/utils.js';
39
40
  import * as UI from '../../ui/legacy/legacy.js';
@@ -93,7 +94,7 @@ export class ScopeChainSidebarPane extends UI.Widget.VBox implements UI.ContextF
93
94
  this.infoElement = document.createElement('div');
94
95
  this.infoElement.className = 'gray-info-message';
95
96
  this.infoElement.tabIndex = -1;
96
- this.flavorChanged(UI.Context.Context.instance().flavor(SDK.DebuggerModel.CallFrame));
97
+ this.flavorChanged(UI.Context.Context.instance().flavor(StackTrace.StackTrace.DebuggableFrameFlavor));
97
98
  }
98
99
 
99
100
  static instance(): ScopeChainSidebarPane {
@@ -103,7 +104,7 @@ export class ScopeChainSidebarPane extends UI.Widget.VBox implements UI.ContextF
103
104
  return scopeChainSidebarPaneInstance;
104
105
  }
105
106
 
106
- flavorChanged(callFrame: SDK.DebuggerModel.CallFrame|null): void {
107
+ flavorChanged(callFrame: StackTrace.StackTrace.DebuggableFrameFlavor|null): void {
107
108
  this.#scopeChainModel?.dispose();
108
109
  this.#scopeChainModel = null;
109
110
 
@@ -116,7 +117,7 @@ export class ScopeChainSidebarPane extends UI.Widget.VBox implements UI.ContextF
116
117
  // is happening (see https://crbug.com/1162416).
117
118
  this.infoElement.textContent = i18nString(UIStrings.loading);
118
119
 
119
- this.#scopeChainModel = new SourceMapScopes.ScopeChainModel.ScopeChainModel(callFrame);
120
+ this.#scopeChainModel = new SourceMapScopes.ScopeChainModel.ScopeChainModel(callFrame.sdkFrame);
120
121
  this.#scopeChainModel.addEventListener(
121
122
  SourceMapScopes.ScopeChainModel.Events.SCOPE_CHAIN_UPDATED, event => this.buildScopeTreeOutline(event.data),
122
123
  this);
@@ -16,6 +16,7 @@ import * as Persistence from '../../models/persistence/persistence.js';
16
16
  import * as TextUtils from '../../models/text_utils/text_utils.js';
17
17
  import * as Workspace from '../../models/workspace/workspace.js';
18
18
  import * as uiI18n from '../../ui/i18n/i18n.js';
19
+ import {Link} from '../../ui/kit/kit.js';
19
20
  import * as UI from '../../ui/legacy/legacy.js';
20
21
  import * as Snippets from '../snippets/snippets.js';
21
22
 
@@ -188,8 +189,7 @@ export class FilesNavigatorView extends NavigatorView {
188
189
  this.setPlaceholder(placeholder);
189
190
  placeholder.link = 'https://developer.chrome.com/docs/devtools/workspaces/' as Platform.DevToolsPath.UrlString;
190
191
 
191
- const link =
192
- UI.XLink.XLink.create('https://goo.gle/devtools-automatic-workspace-folders', 'com.chrome.devtools.json');
192
+ const link = Link.create('https://goo.gle/devtools-automatic-workspace-folders', 'com.chrome.devtools.json');
193
193
  this.#automaticFileSystemNudge =
194
194
  uiI18n.getFormatLocalizedString(str_, UIStrings.automaticWorkspaceNudge, {PH1: link});
195
195
  this.#automaticFileSystemNudge.classList.add('automatic-file-system-nudge');
@@ -41,6 +41,7 @@ import * as Protocol from '../../generated/protocol.js';
41
41
  import * as Badges from '../../models/badges/badges.js';
42
42
  import * as Bindings from '../../models/bindings/bindings.js';
43
43
  import * as Breakpoints from '../../models/breakpoints/breakpoints.js';
44
+ import * as StackTrace from '../../models/stack_trace/stack_trace.js';
44
45
  import * as Workspace from '../../models/workspace/workspace.js';
45
46
  import * as PanelCommon from '../../panels/common/common.js';
46
47
  import * as ObjectUI from '../../ui/legacy/components/object_ui/object_ui.js';
@@ -325,7 +326,8 @@ export class SourcesPanel extends UI.Panel.Panel implements
325
326
  .moduleSetting('breakpoints-active')
326
327
  .addChangeListener(this.breakpointsActiveStateChanged, this);
327
328
  UI.Context.Context.instance().addFlavorChangeListener(SDK.Target.Target, this.onCurrentTargetChanged, this);
328
- UI.Context.Context.instance().addFlavorChangeListener(SDK.DebuggerModel.CallFrame, this.callFrameChanged, this);
329
+ UI.Context.Context.instance().addFlavorChangeListener(
330
+ StackTrace.StackTrace.DebuggableFrameFlavor, this.callFrameChanged, this);
329
331
  SDK.TargetManager.TargetManager.instance().addModelListener(
330
332
  SDK.DebuggerModel.DebuggerModel, SDK.DebuggerModel.Events.DebuggerWasEnabled, this.debuggerWasEnabled, this);
331
333
  SDK.TargetManager.TargetManager.instance().addModelListener(
@@ -696,16 +698,17 @@ export class SourcesPanel extends UI.Panel.Panel implements
696
698
  }
697
699
 
698
700
  private async callFrameChanged(): Promise<void> {
699
- const callFrame = UI.Context.Context.instance().flavor(SDK.DebuggerModel.CallFrame);
701
+ const callFrame = UI.Context.Context.instance().flavor(StackTrace.StackTrace.DebuggableFrameFlavor);
700
702
  if (!callFrame) {
701
703
  return;
702
704
  }
703
705
  if (this.executionLineLocation) {
704
706
  this.executionLineLocation.dispose();
705
707
  }
708
+ // TODO(crbug.com/465879478): Remove LiveLocation once `DebuggableFrameFlavor` is backed by a "real" StackTrace.
706
709
  this.executionLineLocation =
707
710
  await Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance().createCallFrameLiveLocation(
708
- callFrame.location(), this.executionLineChanged.bind(this), this.liveLocationPool);
711
+ callFrame.sdkFrame.location(), this.executionLineChanged.bind(this), this.liveLocationPool);
709
712
  }
710
713
 
711
714
  private async updateDebuggerButtonsAndStatus(): Promise<void> {
@@ -11,7 +11,7 @@ import * as Workspace from '../../models/workspace/workspace.js';
11
11
  import type * as CodeMirror from '../../third_party/codemirror.next/codemirror.next.js';
12
12
  import * as Tooltips from '../../ui/components/tooltips/tooltips.js';
13
13
  import * as uiI18n from '../../ui/i18n/i18n.js';
14
- import {Icon} from '../../ui/kit/kit.js';
14
+ import {Icon, Link} from '../../ui/kit/kit.js';
15
15
  import * as SourceFrame from '../../ui/legacy/components/source_frame/source_frame.js';
16
16
  import * as UI from '../../ui/legacy/legacy.js';
17
17
  import {html} from '../../ui/lit/lit.js';
@@ -639,7 +639,7 @@ export class TabbedEditorContainer extends Common.ObjectWrapper.ObjectWrapper<Ev
639
639
  tooltip.append(uiI18n.getFormatLocalizedString(
640
640
  str_, UIStrings.changesWereNotSavedToFileSystemToSaveAddFolderToWorkspace, {PH1: link}));
641
641
  } else {
642
- const link = UI.XLink.XLink.create('https://developer.chrome.com/docs/devtools/workspaces/', 'Workspace');
642
+ const link = Link.create('https://developer.chrome.com/docs/devtools/workspaces/', 'Workspace');
643
643
  tooltip.append(uiI18n.getFormatLocalizedString(
644
644
  str_, UIStrings.changesWereNotSavedToFileSystemToSaveSetUpYourWorkspace, {PH1: link}));
645
645
  }
@@ -8,6 +8,7 @@ import * as i18n from '../../core/i18n/i18n.js';
8
8
  import * as Root from '../../core/root/root.js';
9
9
  import * as SDK from '../../core/sdk/sdk.js';
10
10
  import * as Breakpoints from '../../models/breakpoints/breakpoints.js';
11
+ import * as StackTrace from '../../models/stack_trace/stack_trace.js';
11
12
  import * as Workspace from '../../models/workspace/workspace.js';
12
13
  import * as ObjectUI from '../../ui/legacy/components/object_ui/object_ui.js';
13
14
  import * as QuickOpen from '../../ui/legacy/components/quick_open/quick_open.js';
@@ -1984,7 +1985,7 @@ UI.Context.registerListener({
1984
1985
 
1985
1986
  UI.Context.registerListener({
1986
1987
  contextTypes() {
1987
- return [SDK.DebuggerModel.CallFrame];
1988
+ return [StackTrace.StackTrace.DebuggableFrameFlavor];
1988
1989
  },
1989
1990
  async loadListener() {
1990
1991
  const Sources = await loadSourcesModule();
@@ -56,6 +56,7 @@ import * as Adorners from '../../ui/components/adorners/adorners.js';
56
56
  import * as Dialogs from '../../ui/components/dialogs/dialogs.js';
57
57
  import * as LegacyWrapper from '../../ui/components/legacy_wrapper/legacy_wrapper.js';
58
58
  import * as Snackbars from '../../ui/components/snackbars/snackbars.js';
59
+ import {Link} from '../../ui/kit/kit.js';
59
60
  import * as PerfUI from '../../ui/legacy/components/perf_ui/perf_ui.js';
60
61
  import * as SettingsUI from '../../ui/legacy/components/settings_ui/settings_ui.js';
61
62
  import * as UI from '../../ui/legacy/legacy.js';
@@ -1340,7 +1341,7 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
1340
1341
  const thirdPartyCheckbox =
1341
1342
  this.createSettingCheckbox(this.#thirdPartyTracksSetting, i18nString(UIStrings.showDataAddedByExtensions));
1342
1343
 
1343
- const localLink = UI.XLink.XLink.create(
1344
+ const localLink = Link.create(
1344
1345
  'https://developer.chrome.com/docs/devtools/performance/extension', i18nString(UIStrings.learnMore));
1345
1346
  // Has to be done in JS because the element is inserted into the
1346
1347
  // checkbox's shadow DOM so any styling into timelinePanel.css would
@@ -50,6 +50,7 @@ import * as CodeHighlighter from '../../ui/components/code_highlighter/code_high
50
50
  // eslint-disable-next-line @devtools/es-modules-import
51
51
  import codeHighlighterStyles from '../../ui/components/code_highlighter/codeHighlighter.css.js';
52
52
  import * as uiI18n from '../../ui/i18n/i18n.js';
53
+ import {Link} from '../../ui/kit/kit.js';
53
54
  import * as PerfUI from '../../ui/legacy/components/perf_ui/perf_ui.js';
54
55
  // eslint-disable-next-line @devtools/es-modules-import
55
56
  import imagePreviewStyles from '../../ui/legacy/components/utils/imagePreview.css.js';
@@ -833,8 +834,7 @@ export class TimelineUIUtils {
833
834
  }
834
835
 
835
836
  const html = UI.Fragment.html`<div>${
836
- UI.XLink.XLink.create(
837
- link, i18nString(UIStrings.learnMore), undefined, undefined, 'learn-more')} about ${name}.</div>`;
837
+ Link.create(link, i18nString(UIStrings.learnMore), undefined, 'learn-more')} about ${name}.</div>`;
838
838
  return html as HTMLElement;
839
839
  }
840
840
 
@@ -8,7 +8,7 @@ import * as Platform from '../../../core/platform/platform.js';
8
8
  import type * as Protocol from '../../../generated/protocol.js';
9
9
  import * as Trace from '../../../models/trace/trace.js';
10
10
  import * as uiI18n from '../../../ui/i18n/i18n.js';
11
- import * as UI from '../../../ui/legacy/legacy.js';
11
+ import {Link} from '../../../ui/kit/kit.js';
12
12
 
13
13
  // *********************************************************************
14
14
  // At the moment this file consists of helpers to aid in the rendering
@@ -84,9 +84,9 @@ export function buildWarningElementsForEvent(
84
84
  const span = document.createElement('span');
85
85
  switch (warning) {
86
86
  case 'FORCED_REFLOW': {
87
- const forcedReflowLink = UI.XLink.XLink.create(
87
+ const forcedReflowLink = Link.create(
88
88
  'https://developers.google.com/web/fundamentals/performance/rendering/avoid-large-complex-layouts-and-layout-thrashing#avoid-forced-synchronous-layouts',
89
- i18nString(UIStrings.forcedReflow), undefined, undefined, 'forced-reflow');
89
+ i18nString(UIStrings.forcedReflow), undefined, 'forced-reflow');
90
90
  span.appendChild(
91
91
  uiI18n.getFormatLocalizedString(str_, UIStrings.sIsALikelyPerformanceBottleneck, {PH1: forcedReflowLink}));
92
92
  break;
@@ -102,16 +102,16 @@ export function buildWarningElementsForEvent(
102
102
  }
103
103
 
104
104
  case 'LONG_TASK': {
105
- const longTaskLink = UI.XLink.XLink.create(
106
- 'https://web.dev/optimize-long-tasks/', i18nString(UIStrings.longTask), undefined, undefined, 'long-tasks');
105
+ const longTaskLink = Link.create(
106
+ 'https://web.dev/optimize-long-tasks/', i18nString(UIStrings.longTask), undefined, 'long-tasks');
107
107
  span.appendChild(uiI18n.getFormatLocalizedString(
108
108
  str_, UIStrings.sTookS,
109
109
  {PH1: longTaskLink, PH2: i18n.TimeUtilities.millisToString((duration || 0), true)}));
110
110
  break;
111
111
  }
112
112
  case 'LONG_INTERACTION': {
113
- const longInteractionINPLink = UI.XLink.XLink.create(
114
- 'https://web.dev/inp', i18nString(UIStrings.longInteractionINP), undefined, undefined, 'long-interaction');
113
+ const longInteractionINPLink =
114
+ Link.create('https://web.dev/inp', i18nString(UIStrings.longInteractionINP), undefined, 'long-interaction');
115
115
  span.appendChild(uiI18n.getFormatLocalizedString(
116
116
  str_, UIStrings.sIsLikelyPoorPageResponsiveness, {PH1: longInteractionINPLink}));
117
117
  break;