chrome-devtools-frontend 1.0.1543472 → 1.0.1545096

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 (166) hide show
  1. package/AUTHORS +1 -0
  2. package/config/typescript/tsconfig.eslint.json +1 -0
  3. package/front_end/core/common/ParsedURL.ts +1 -1
  4. package/front_end/core/common/common.ts +0 -2
  5. package/front_end/core/host/AidaClient.ts +10 -7
  6. package/front_end/core/host/DispatchHttpRequestClient.ts +18 -3
  7. package/front_end/core/protocol_client/CDPConnection.ts +3 -3
  8. package/front_end/core/protocol_client/DevToolsCDPConnection.ts +2 -1
  9. package/front_end/core/root/Runtime.ts +8 -7
  10. package/front_end/core/sdk/CPUThrottlingManager.ts +0 -4
  11. package/front_end/core/sdk/CSSMatchedStyles.ts +7 -9
  12. package/front_end/core/sdk/CSSMetadata.ts +17 -5
  13. package/front_end/core/sdk/CSSModel.ts +1 -1
  14. package/front_end/core/sdk/CSSRule.ts +18 -6
  15. package/front_end/core/sdk/ChildTargetManager.ts +2 -2
  16. package/front_end/core/sdk/NetworkManager.ts +6 -8
  17. package/front_end/core/sdk/NetworkRequest.ts +4 -0
  18. package/front_end/core/sdk/SDKModel.ts +4 -2
  19. package/front_end/core/sdk/TargetManager.ts +14 -15
  20. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshotLoader.ts +2 -0
  21. package/front_end/entrypoints/main/MainImpl.ts +0 -16
  22. package/front_end/foundation/Universe.ts +12 -1
  23. package/front_end/generated/Deprecation.ts +4 -0
  24. package/front_end/generated/InspectorBackendCommands.ts +2 -5
  25. package/front_end/generated/SupportedCSSProperties.js +0 -23
  26. package/front_end/generated/protocol-mapping.d.ts +0 -15
  27. package/front_end/generated/protocol-proxy-api.d.ts +0 -11
  28. package/front_end/generated/protocol.ts +2 -34
  29. package/front_end/models/ai_assistance/agents/AiAgent.ts +10 -8
  30. package/front_end/models/ai_assistance/agents/PatchAgent.ts +7 -1
  31. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +0 -5
  32. package/front_end/models/ai_assistance/agents/StylingAgent.ts +4 -8
  33. package/front_end/models/ai_code_completion/AiCodeCompletion.ts +1 -1
  34. package/front_end/models/ai_code_generation/AiCodeGeneration.ts +5 -3
  35. package/front_end/models/bindings/CSSWorkspaceBinding.ts +8 -7
  36. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +9 -8
  37. package/front_end/models/bindings/ResourceMapping.ts +57 -15
  38. package/front_end/models/live-metrics/LiveMetrics.ts +12 -20
  39. package/front_end/panels/accessibility/AccessibilityNodeView.ts +6 -2
  40. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +3 -2
  41. package/front_end/panels/ai_assistance/components/ChatView.ts +2 -4
  42. package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +2 -1
  43. package/front_end/panels/ai_assistance/components/UserActionRow.ts +2 -1
  44. package/front_end/panels/animation/AnimationTimeline.ts +6 -6
  45. package/front_end/panels/application/ApplicationPanelSidebar.ts +6 -7
  46. package/front_end/panels/application/{components/FrameDetailsView.ts → FrameDetailsView.ts} +134 -165
  47. package/front_end/panels/application/{components/OriginTrialTreeView.ts → OriginTrialTreeView.ts} +9 -9
  48. package/front_end/panels/application/application.ts +4 -0
  49. package/front_end/panels/application/components/ReportsGrid.ts +7 -2
  50. package/front_end/panels/application/components/SharedStorageAccessGrid.ts +5 -3
  51. package/front_end/panels/application/components/StackTrace.ts +5 -3
  52. package/front_end/panels/application/components/TrustTokensView.ts +7 -1
  53. package/front_end/panels/application/components/components.ts +2 -4
  54. package/front_end/panels/application/{components/frameDetailsReportView.css → frameDetailsReportView.css} +5 -1
  55. package/front_end/panels/application/preloading/PreloadingView.ts +10 -4
  56. package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +7 -11
  57. package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +15 -3
  58. package/front_end/panels/browser_debugger/DOMBreakpointsSidebarPane.ts +12 -13
  59. package/front_end/panels/common/BadgeNotification.ts +2 -1
  60. package/front_end/panels/{elements → common}/DOMLinkifier.ts +13 -8
  61. package/front_end/panels/common/GdpSignUpDialog.ts +2 -1
  62. package/front_end/panels/common/common.ts +1 -0
  63. package/front_end/panels/console/ConsoleViewMessage.ts +4 -4
  64. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +2 -1
  65. package/front_end/panels/elements/ElementStatePaneWidget.ts +2 -1
  66. package/front_end/panels/elements/ElementsTreeElement.ts +3 -1
  67. package/front_end/panels/elements/StylePropertiesSection.ts +52 -15
  68. package/front_end/panels/elements/StylePropertyTreeElement.ts +8 -3
  69. package/front_end/panels/elements/StylesSidebarPane.ts +24 -14
  70. package/front_end/panels/elements/elements-meta.ts +0 -13
  71. package/front_end/panels/elements/elements.ts +0 -3
  72. package/front_end/panels/explain/components/ConsoleInsight.ts +31 -20
  73. package/front_end/panels/issues/AffectedResourcesView.ts +2 -1
  74. package/front_end/panels/lighthouse/LighthouseProtocolService.ts +3 -6
  75. package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +2 -1
  76. package/front_end/panels/network/NetworkLogView.ts +1 -1
  77. package/front_end/panels/recorder/RecorderController.ts +7 -1
  78. package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +2 -1
  79. package/front_end/panels/settings/SettingsScreen.ts +3 -2
  80. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +42 -294
  81. package/front_end/panels/sources/DebuggerPausedMessage.ts +3 -3
  82. package/front_end/panels/sources/SourcesPanel.ts +5 -1
  83. package/front_end/panels/timeline/TimelineUIUtils.ts +3 -2
  84. package/front_end/panels/timeline/components/LiveMetricsView.ts +18 -6
  85. package/front_end/panels/timeline/components/MetricCard.ts +2 -2
  86. package/front_end/panels/timeline/components/insights/NodeLink.ts +4 -4
  87. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +2 -1
  88. package/front_end/panels/timeline/timeline-meta.ts +0 -10
  89. package/front_end/panels/timeline/timeline.ts +0 -2
  90. package/front_end/panels/whats_new/ReleaseNoteView.ts +2 -1
  91. package/front_end/panels/whats_new/WhatsNewImpl.ts +3 -2
  92. package/front_end/third_party/chromium/README.chromium +1 -1
  93. package/front_end/third_party/puppeteer/README.chromium +2 -2
  94. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.d.ts +1 -0
  95. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
  96. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.js +4 -1
  97. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.js.map +1 -1
  98. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkEventManager.d.ts +1 -0
  99. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkEventManager.d.ts.map +1 -1
  100. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkEventManager.js +8 -0
  101. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkEventManager.js.map +1 -1
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.js +22 -0
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.js.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +34 -6
  113. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.d.ts +1 -0
  114. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.js +4 -1
  116. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.js.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkEventManager.d.ts +1 -0
  118. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkEventManager.d.ts.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkEventManager.js +8 -0
  120. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkEventManager.js.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.js +22 -0
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.js.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  129. package/front_end/third_party/puppeteer/package/package.json +2 -2
  130. package/front_end/third_party/puppeteer/package/src/cdp/HTTPRequest.ts +5 -1
  131. package/front_end/third_party/puppeteer/package/src/cdp/NetworkEventManager.ts +16 -1
  132. package/front_end/third_party/puppeteer/package/src/cdp/NetworkManager.ts +28 -0
  133. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  134. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  135. package/front_end/tsconfig.json +1 -0
  136. package/front_end/ui/components/buttons/Button.docs.ts +6 -5
  137. package/front_end/ui/components/snackbars/Snackbars.docs.ts +1 -1
  138. package/front_end/ui/components/spinners/Spinners.docs.ts +1 -1
  139. package/front_end/ui/components/survey_link/SurveyLink.docs.ts +2 -1
  140. package/front_end/ui/components/switch/Switch.docs.ts +1 -1
  141. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +8 -5
  142. package/front_end/ui/components/tooltips/Tooltip.docs.ts +3 -3
  143. package/front_end/ui/helpers/OpenInNewTab.ts +87 -0
  144. package/front_end/ui/helpers/helpers.ts +5 -0
  145. package/front_end/ui/i18n/i18n.ts +16 -0
  146. package/front_end/ui/legacy/ContextMenu.docs.ts +12 -11
  147. package/front_end/ui/legacy/RadioButton.docs.ts +1 -1
  148. package/front_end/ui/legacy/SelectMenu.docs.ts +1 -1
  149. package/front_end/ui/legacy/Slider.docs.ts +1 -1
  150. package/front_end/ui/legacy/UIUtils.ts +1 -34
  151. package/front_end/ui/legacy/Widget.ts +56 -25
  152. package/front_end/ui/legacy/XLink.ts +4 -6
  153. package/front_end/ui/legacy/components/color_picker/ContrastDetails.ts +2 -1
  154. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +3 -1
  155. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +294 -336
  156. package/front_end/ui/legacy/components/utils/Linkifier.ts +2 -1
  157. package/front_end/ui/legacy/inspectorCommon.css +0 -4
  158. package/mcp/mcp.ts +1 -0
  159. package/mcp/tsconfig.json +16 -0
  160. package/package.json +2 -2
  161. package/front_end/core/common/Linkifier.ts +0 -55
  162. package/front_end/panels/timeline/CLSLinkifier.ts +0 -58
  163. package/front_end/ui/components/expandable_list/ExpandableList.docs.ts +0 -30
  164. /package/front_end/panels/application/{components/originTrialTokenRows.css → originTrialTokenRows.css} +0 -0
  165. /package/front_end/panels/application/{components/originTrialTreeView.css → originTrialTreeView.css} +0 -0
  166. /package/front_end/panels/{elements → common}/domLinkifier.css +0 -0
@@ -196,7 +196,7 @@ interface ViewInput {
196
196
  callbacks: {
197
197
  onClose: () => void,
198
198
  onSearch: () => void,
199
- onRating: (event: Event) => void,
199
+ onRating: (isPositive: boolean) => void,
200
200
  onReport: () => void,
201
201
  onGoToSignIn: () => void,
202
202
  onConsentReminderConfirmed: () => Promise<void>,
@@ -209,6 +209,8 @@ interface ViewInput {
209
209
 
210
210
  interface ViewOutput {
211
211
  referenceDetailsRef: Lit.Directives.Ref<HTMLDetailsElement>;
212
+ headerRef: Lit.Directives.Ref<HTMLHeadingElement>;
213
+ citationLinks: HTMLElement[];
212
214
  }
213
215
 
214
216
  const enum State {
@@ -297,7 +299,7 @@ function renderLearnMoreAboutInsights(): Lit.TemplateResult {
297
299
  // clang-format on
298
300
  }
299
301
 
300
- function maybeRenderSources(directCitationUrls: string[]): Lit.LitTemplate {
302
+ function maybeRenderSources(directCitationUrls: string[], output: ViewOutput): Lit.LitTemplate {
301
303
  if (!directCitationUrls.length) {
302
304
  return Lit.nothing;
303
305
  }
@@ -310,8 +312,8 @@ function maybeRenderSources(directCitationUrls: string[]): Lit.LitTemplate {
310
312
  <x-link
311
313
  href=${url}
312
314
  class="link"
313
- data-index=${index + 1}
314
315
  jslog=${VisualLogging.link('references.console-insights').track({click: true})}
316
+ ${Directives.ref(e => { output.citationLinks[index] = e as HTMLElement; })}
315
317
  >
316
318
  ${url}
317
319
  </x-link>
@@ -376,7 +378,7 @@ function renderInsight(
376
378
  ${isSearchRagResponse(insight.metadata) ? html`
377
379
  <details class="references" ${Directives.ref(output.referenceDetailsRef)} @toggle=${callbacks.onToggleReferenceDetails} jslog=${VisualLogging.expand('references').track({click: true})}>
378
380
  <summary>${i18nString(UIStrings.references)}</summary>
379
- ${maybeRenderSources(insight.directCitationUrls)}
381
+ ${maybeRenderSources(insight.directCitationUrls, output)}
380
382
  ${maybeRenderRelatedContent(insight.relatedUrls, insight.directCitationUrls)}
381
383
  </details>
382
384
  ` : Lit.nothing}
@@ -557,7 +559,7 @@ function renderInsightFooter(noLogging: ViewInput['noLogging'], selectedRating:
557
559
  .toggled=${selectedRating === true}
558
560
  .title=${i18nString(UIStrings.goodResponse)}
559
561
  .jslogContext=${'thumbs-up'}
560
- @click=${callbacks.onRating}
562
+ @click=${() => callbacks.onRating(true)}
561
563
  ></devtools-button>
562
564
  <devtools-button
563
565
  data-rating="false"
@@ -571,7 +573,7 @@ function renderInsightFooter(noLogging: ViewInput['noLogging'], selectedRating:
571
573
  .toggled=${selectedRating === false}
572
574
  .title=${i18nString(UIStrings.badResponse)}
573
575
  .jslogContext=${'thumbs-down'}
574
- @click=${callbacks.onRating}
576
+ @click=${() => callbacks.onRating(false)}
575
577
  ></devtools-button>
576
578
  <devtools-button
577
579
  .iconName=${'report'}
@@ -602,13 +604,15 @@ interface HeaderInput {
602
604
  onClose: ViewInput['callbacks']['onClose'];
603
605
  }
604
606
 
605
- function renderHeader({headerText, showIcon = false, showSpinner = false, onClose}: HeaderInput): Lit.LitTemplate {
607
+ function renderHeader(
608
+ {headerText, showIcon = false, showSpinner = false, onClose}: HeaderInput,
609
+ headerRef: Lit.Directives.Ref<HTMLHeadingElement>): Lit.LitTemplate {
606
610
  // clang-format off
607
611
  return html`
608
612
  <header>
609
613
  ${showIcon ? renderHeaderIcon() : Lit.nothing}
610
614
  <div class="filler">
611
- <h2 tabindex="-1">
615
+ <h2 tabindex="-1" ${Directives.ref(headerRef)}>
612
616
  ${headerText}
613
617
  </h2>
614
618
  ${showSpinner ? html`<devtools-spinner></devtools-spinner>` : Lit.nothing}
@@ -644,7 +648,9 @@ export class ConsoleInsight extends HTMLElement {
644
648
 
645
649
  // Main state.
646
650
  #state: StateData;
647
- #referenceDetailsRef = Lit.Directives.createRef<HTMLDetailsElement>();
651
+ #referenceDetailsRef = Directives.createRef<HTMLDetailsElement>();
652
+ #headerRef = Directives.createRef<HTMLHeadingElement>();
653
+ #citationLinks: HTMLElement[] = [];
648
654
  #areReferenceDetailsOpen = false;
649
655
 
650
656
  // Rating sub-form state.
@@ -694,8 +700,7 @@ export class ConsoleInsight extends HTMLElement {
694
700
  this.#areReferenceDetailsOpen = true;
695
701
  this.#render();
696
702
 
697
- const highlightedElement =
698
- this.#shadow.querySelector(`.sources-list x-link[data-index="${index}"]`) as HTMLElement | null;
703
+ const highlightedElement = this.#citationLinks[index - 1];
699
704
  if (highlightedElement) {
700
705
  UI.UIUtils.runCSSAnimationOnce(highlightedElement, 'highlighted');
701
706
  if (areDetailsAlreadyExpanded) {
@@ -856,7 +861,7 @@ export class ConsoleInsight extends HTMLElement {
856
861
  this.classList.add('closing');
857
862
  }
858
863
 
859
- #onRating(event: Event): void {
864
+ #onRating(isPositive: boolean): void {
860
865
  if (this.#state.type !== State.INSIGHT) {
861
866
  throw new Error('Unexpected state');
862
867
  }
@@ -868,7 +873,7 @@ export class ConsoleInsight extends HTMLElement {
868
873
  return;
869
874
  }
870
875
 
871
- this.#selectedRating = (event.target as HTMLElement).dataset.rating === 'true';
876
+ this.#selectedRating = isPositive;
872
877
  this.#render();
873
878
  if (this.#selectedRating) {
874
879
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.InsightRatedPositive);
@@ -1071,7 +1076,7 @@ export class ConsoleInsight extends HTMLElement {
1071
1076
 
1072
1077
  #focusHeader(): void {
1073
1078
  this.addEventListener('animationend', () => {
1074
- (this.#shadow.querySelector('header h2') as HTMLElement | undefined)?.focus();
1079
+ this.#headerRef.value?.focus();
1075
1080
  }, {once: true});
1076
1081
  }
1077
1082
 
@@ -1118,6 +1123,8 @@ export class ConsoleInsight extends HTMLElement {
1118
1123
  };
1119
1124
  const output: ViewOutput = {
1120
1125
  referenceDetailsRef: this.#referenceDetailsRef,
1126
+ headerRef: this.#headerRef,
1127
+ citationLinks: [],
1121
1128
  };
1122
1129
 
1123
1130
  // Future Widget view function starts here.
@@ -1132,21 +1139,23 @@ export class ConsoleInsight extends HTMLElement {
1132
1139
 
1133
1140
  switch (state.type) {
1134
1141
  case State.LOADING:
1135
- header = renderHeader({headerText: i18nString(UIStrings.generating), onClose});
1142
+ header = renderHeader({headerText: i18nString(UIStrings.generating), onClose}, output.headerRef);
1136
1143
  main = renderLoading();
1137
1144
  break;
1138
1145
  case State.INSIGHT:
1139
- header = renderHeader({headerText: i18nString(UIStrings.insight), onClose, showSpinner: !state.completed});
1146
+ header = renderHeader(
1147
+ {headerText: i18nString(UIStrings.insight), onClose, showSpinner: !state.completed}, output.headerRef);
1140
1148
  main = renderInsight(state, input.renderer, input.disableAnimations, callbacks, output);
1141
1149
  footer = renderInsightFooter(noLogging, input.selectedRating, callbacks);
1142
1150
  break;
1143
1151
  case State.ERROR:
1144
- header = renderHeader({headerText: i18nString(UIStrings.error), onClose});
1152
+ header = renderHeader({headerText: i18nString(UIStrings.error), onClose}, output.headerRef);
1145
1153
  main = renderError(i18nString(UIStrings.errorBody));
1146
1154
  footer = renderDisclaimerFooter(noLogging, onDisclaimerSettingsLink);
1147
1155
  break;
1148
1156
  case State.CONSENT_REMINDER:
1149
- header = renderHeader({headerText: 'Understand console messages with AI', onClose, showIcon: true});
1157
+ header = renderHeader(
1158
+ {headerText: 'Understand console messages with AI', onClose, showIcon: true}, output.headerRef);
1150
1159
  mainClasses['reminder-container'] = true;
1151
1160
  main = renderConsentReminder(noLogging);
1152
1161
  footer = renderConsentReminderFooter(callbacks.onReminderSettingsLink, callbacks.onConsentReminderConfirmed);
@@ -1157,12 +1166,12 @@ export class ConsoleInsight extends HTMLElement {
1157
1166
  break;
1158
1167
  case State.NOT_LOGGED_IN:
1159
1168
  case State.SYNC_IS_PAUSED:
1160
- header = renderHeader({headerText: i18nString(UIStrings.signInToUse), onClose});
1169
+ header = renderHeader({headerText: i18nString(UIStrings.signInToUse), onClose}, output.headerRef);
1161
1170
  main = renderNotLoggedIn();
1162
1171
  footer = renderSignInFooter(callbacks.onGoToSignIn);
1163
1172
  break;
1164
1173
  case State.OFFLINE:
1165
- header = renderHeader({headerText: i18nString(UIStrings.offlineHeader), onClose});
1174
+ header = renderHeader({headerText: i18nString(UIStrings.offlineHeader), onClose}, output.headerRef);
1166
1175
  main = renderError(i18nString(UIStrings.offline));
1167
1176
  footer = renderDisclaimerFooter(noLogging, onDisclaimerSettingsLink);
1168
1177
  break;
@@ -1188,6 +1197,8 @@ export class ConsoleInsight extends HTMLElement {
1188
1197
  });
1189
1198
  // clang-format on
1190
1199
 
1200
+ this.#citationLinks = output.citationLinks;
1201
+
1191
1202
  if (this.#referenceDetailsRef.value) {
1192
1203
  this.#referenceDetailsRef.value.open = this.#areReferenceDetailsOpen;
1193
1204
  }
@@ -17,6 +17,7 @@ import * as RequestLinkIcon from '../../ui/components/request_link_icon/request_
17
17
  import * as Components from '../../ui/legacy/components/utils/utils.js';
18
18
  import * as UI from '../../ui/legacy/legacy.js';
19
19
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
20
+ import * as PanelsCommon from '../common/common.js';
20
21
 
21
22
  import type {IssueView} from './IssueView.js';
22
23
 
@@ -230,7 +231,7 @@ export abstract class AffectedResourcesView extends UI.TreeOutline.TreeElement {
230
231
  }
231
232
 
232
233
  const deferredDOMNode = new SDK.DOMModel.DeferredDOMNode(target, backendNodeId);
233
- const anchorElement = (await Common.Linkifier.Linkifier.linkify(deferredDOMNode)) as HTMLElement;
234
+ const anchorElement = PanelsCommon.DOMLinkifier.Linkifier.instance().linkify(deferredDOMNode) as HTMLElement;
234
235
  anchorElement.textContent = nodeName;
235
236
  anchorElement.addEventListener('click', () => sendTelemetry());
236
237
  anchorElement.addEventListener('keydown', (event: Event) => {
@@ -275,12 +275,9 @@ export class ProtocolService implements ProtocolClient.CDPConnection.CDPConnecti
275
275
  // Instead, we ignore the ID coming from the worker when sending the command, but
276
276
  // patch it back in when sending the response back to the worker.
277
277
  void this.connection?.send(method, params, sessionId).then(response => {
278
- this.dispatchProtocolMessage({
279
- id,
280
- sessionId,
281
- result: 'result' in response ? response.result : undefined,
282
- error: 'error' in response ? response.error : undefined,
283
- });
278
+ const message =
279
+ 'result' in response ? {id, sessionId, result: response.result} : {id, sessionId, error: response.error};
280
+ this.dispatchProtocolMessage(message);
284
281
  });
285
282
  }
286
283
 
@@ -13,6 +13,7 @@ import * as Components from '../../ui/legacy/components/utils/utils.js';
13
13
  import * as UI from '../../ui/legacy/legacy.js';
14
14
  import * as ThemeSupport from '../../ui/legacy/theme_support/theme_support.js';
15
15
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
16
+ import * as PanelsCommon from '../common/common.js';
16
17
 
17
18
  import type {
18
19
  NodeDetailsJSON, ReportJSON, RunnerResultArtifacts, SourceLocationDetailsJSON} from './LighthouseReporterTypes.js';
@@ -148,7 +149,7 @@ export class LighthouseReportRenderer {
148
149
  continue;
149
150
  }
150
151
 
151
- const element = await Common.Linkifier.Linkifier.linkify(
152
+ const element = PanelsCommon.DOMLinkifier.Linkifier.instance().linkify(
152
153
  node, {tooltip: detailsItem.snippet, preventKeyboardFocus: undefined});
153
154
  UI.Tooltip.Tooltip.install(origHTMLElement, '');
154
155
 
@@ -2484,7 +2484,7 @@ export class NetworkLogView extends Common.ObjectWrapper.eventMixin<EventTypes,
2484
2484
  .replace(/"/g, '\\"')
2485
2485
  .replace(/[^a-zA-Z0-9\s_\-:=+~'\/.',?;()*`]/g, '^$&')
2486
2486
  .replace(/%(?=[a-zA-Z0-9_])/g, '%^')
2487
- .replace(/[^\S \r\n]/g, ' ')
2487
+ .replace(/[^ -~\r\n]/g, ' ')
2488
2488
  .replace(/\r?\n|\r/g, '^\n\n') +
2489
2489
  encapsChars;
2490
2490
  }
@@ -1179,7 +1179,13 @@ export class RecorderController extends LitElement {
1179
1179
  <div class="empty-state-header">${i18nString(UIStrings.header)}</div>
1180
1180
  <div class="empty-state-description">
1181
1181
  <span>${i18nString(UIStrings.recordingDescription)}</span>
1182
- ${UI.XLink.XLink.create(RECORDER_EXPLANATION_URL, i18nString(UIStrings.learnMore), 'x-link', undefined, 'learn-more')}
1182
+ <x-link
1183
+ class="x-link devtools-link"
1184
+ href=${RECORDER_EXPLANATION_URL}
1185
+ jslog=${VisualLogging.link()
1186
+ .track({ click: true, keydown: 'Enter|Space' })
1187
+ .context('learn-more')}
1188
+ >${i18nString(UIStrings.learnMore)}</x-link>
1183
1189
  </div>
1184
1190
  <devtools-button .variant=${Buttons.Button.Variant.TONAL} jslogContext=${Actions.RecorderActions.CREATE_RECORDING} @click=${this.#onCreateNewRecording}>${i18nString(UIStrings.createRecording)}</devtools-button>
1185
1191
  </div>
@@ -8,6 +8,7 @@ import '../../ui/components/cards/cards.js';
8
8
  import * as Common from '../../core/common/common.js';
9
9
  import * as i18n from '../../core/i18n/i18n.js';
10
10
  import * as Buttons from '../../ui/components/buttons/buttons.js';
11
+ import * as UIHelpers from '../../ui/helpers/helpers.js';
11
12
  import * as SettingsUI from '../../ui/legacy/components/settings_ui/settings_ui.js';
12
13
  import * as UI from '../../ui/legacy/legacy.js';
13
14
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
@@ -144,7 +145,7 @@ export class FrameworkIgnoreListSettingsTab extends UI.Widget.VBox implements
144
145
  };
145
146
  automaticallyIgnoreLinkButton.addEventListener(
146
147
  'click',
147
- () => UI.UIUtils.openInNewTab(
148
+ () => UIHelpers.openInNewTab(
148
149
  'https://developer.chrome.com/docs/devtools/settings/ignore-list/#skip-third-party'));
149
150
  automaticallyIgnoreListContainer.appendChild(automaticallyIgnoreLinkButton);
150
151
 
@@ -14,6 +14,7 @@ import * as Root from '../../core/root/root.js';
14
14
  import * as Buttons from '../../ui/components/buttons/buttons.js';
15
15
  import type * as Cards from '../../ui/components/cards/cards.js';
16
16
  import * as IconButton from '../../ui/components/icon_button/icon_button.js';
17
+ import * as UIHelpers from '../../ui/helpers/helpers.js';
17
18
  import * as SettingsUI from '../../ui/legacy/components/settings_ui/settings_ui.js';
18
19
  import * as Components from '../../ui/legacy/components/utils/utils.js';
19
20
  import * as UI from '../../ui/legacy/legacy.js';
@@ -497,7 +498,7 @@ export class ExperimentsSettingsTab extends UI.Widget.VBox implements SettingsTa
497
498
  jslogContext: `${experiment.name}-documentation`,
498
499
  title: i18nString(UIStrings.learnMore),
499
500
  };
500
- linkButton.addEventListener('click', () => UI.UIUtils.openInNewTab(experimentLink));
501
+ linkButton.addEventListener('click', () => UIHelpers.openInNewTab(experimentLink));
501
502
  linkButton.classList.add('link-icon');
502
503
 
503
504
  p.appendChild(linkButton);
@@ -542,7 +543,7 @@ export class ActionDelegate implements UI.ActionRegistration.ActionDelegate {
542
543
  void SettingsScreen.showSettingsScreen({focusTabHeader: true} as ShowSettingsScreenOptions);
543
544
  return true;
544
545
  case 'settings.documentation':
545
- UI.UIUtils.openInNewTab('https://developer.chrome.com/docs/devtools/');
546
+ UIHelpers.openInNewTab('https://developer.chrome.com/docs/devtools/');
546
547
  return true;
547
548
  case 'settings.shortcuts':
548
549
  void SettingsScreen.showSettingsScreen({name: 'keybinds', focusTabHeader: true});