chrome-devtools-frontend 1.0.1571007 → 1.0.1572937

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 (168) hide show
  1. package/agents/prompts/README.md +18 -0
  2. package/agents/prompts/devtools-imports.md +47 -0
  3. package/agents/prompts/verification.md +27 -0
  4. package/front_end/Images/geminiInDevTools.png +0 -0
  5. package/front_end/Images/geminiInDevTools_2x.png +0 -0
  6. package/front_end/Images/src/database-off.svg +1 -0
  7. package/front_end/Images/src/lock-person.svg +1 -1
  8. package/front_end/core/common/Debouncer.ts +10 -1
  9. package/front_end/core/common/SettingRegistration.ts +1 -1
  10. package/front_end/core/host/AidaClient.ts +8 -0
  11. package/front_end/core/host/InspectorFrontendHostAPI.ts +0 -6
  12. package/front_end/core/host/UserMetrics.ts +1 -31
  13. package/front_end/core/root/ExperimentNames.ts +30 -0
  14. package/front_end/core/root/Runtime.ts +47 -48
  15. package/front_end/core/root/root.ts +2 -0
  16. package/front_end/core/sdk/CSSModel.ts +36 -13
  17. package/front_end/core/sdk/CSSProperty.ts +1 -1
  18. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +9 -0
  19. package/front_end/core/sdk/CookieModel.ts +2 -1
  20. package/front_end/core/sdk/DOMModel.ts +1 -1
  21. package/front_end/core/sdk/DebuggerModel.ts +1 -1
  22. package/front_end/core/sdk/OverlayModel.ts +3 -2
  23. package/front_end/core/sdk/SourceMap.ts +1 -1
  24. package/front_end/devtools_compatibility.js +0 -6
  25. package/front_end/entrypoints/main/MainImpl.ts +44 -24
  26. package/front_end/entrypoints/main/main-meta.ts +1 -1
  27. package/front_end/generated/SupportedCSSProperties.js +6 -14
  28. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +0 -180
  29. package/front_end/models/ai_assistance/ai_assistance.ts +0 -2
  30. package/front_end/models/breakpoints/BreakpointManager.ts +3 -3
  31. package/front_end/models/issues_manager/ContrastCheckTrigger.ts +2 -2
  32. package/front_end/models/javascript_metadata/NativeFunctions.js +8 -0
  33. package/front_end/models/source_map_scopes/NamesResolver.ts +1 -1
  34. package/front_end/models/trace/EventsSerializer.ts +5 -1
  35. package/front_end/models/trace/ModelImpl.ts +0 -4
  36. package/front_end/models/trace/types/TraceEvents.ts +4 -0
  37. package/front_end/panels/accessibility/AXBreadcrumbsPane.ts +1 -1
  38. package/front_end/panels/accessibility/AccessibilitySidebarView.ts +1 -1
  39. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +8 -63
  40. package/front_end/panels/ai_assistance/PatchWidget.ts +10 -15
  41. package/front_end/panels/ai_assistance/SelectWorkspaceDialog.ts +5 -4
  42. package/front_end/panels/ai_assistance/aiAssistancePanel.css +0 -16
  43. package/front_end/panels/ai_assistance/ai_assistance.ts +0 -1
  44. package/front_end/panels/ai_assistance/components/ChatMessage.ts +3 -2
  45. package/front_end/panels/ai_assistance/components/ChatView.ts +123 -108
  46. package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +1 -145
  47. package/front_end/panels/application/DeviceBoundSessionsModel.ts +23 -1
  48. package/front_end/panels/application/DeviceBoundSessionsTreeElement.ts +23 -0
  49. package/front_end/panels/application/FrameDetailsView.ts +12 -10
  50. package/front_end/panels/application/components/BackForwardCacheView.ts +6 -8
  51. package/front_end/panels/application/components/BounceTrackingMitigationsView.ts +4 -3
  52. package/front_end/panels/application/components/ProtocolHandlersView.ts +5 -6
  53. package/front_end/panels/application/components/ReportsGrid.ts +9 -9
  54. package/front_end/panels/application/components/SharedStorageAccessGrid.ts +5 -4
  55. package/front_end/panels/application/components/TrustTokensView.ts +4 -6
  56. package/front_end/panels/application/preloading/PreloadingView.ts +9 -8
  57. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +237 -230
  58. package/front_end/panels/application/preloading/components/PreloadingGrid.ts +3 -2
  59. package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +6 -10
  60. package/front_end/panels/application/resourcesSidebar.css +8 -0
  61. package/front_end/panels/autofill/AutofillView.ts +4 -3
  62. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +3 -5
  63. package/front_end/panels/common/AiCodeCompletionTeaser.ts +5 -5
  64. package/front_end/panels/common/AiCodeGenerationTeaser.ts +35 -4
  65. package/front_end/panels/common/BadgeNotification.ts +17 -14
  66. package/front_end/panels/common/GdpSignUpDialog.ts +5 -6
  67. package/front_end/panels/common/GeminiRebrandPromoDialog.ts +192 -0
  68. package/front_end/panels/common/aiCodeGenerationTeaser.css +16 -1
  69. package/front_end/panels/common/common.ts +1 -0
  70. package/front_end/panels/common/geminiRebrandPromoDialog.css +47 -0
  71. package/front_end/panels/console/ConsoleInsightTeaser.ts +10 -11
  72. package/front_end/panels/console/ErrorStackParser.ts +11 -16
  73. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +2 -2
  74. package/front_end/panels/css_overview/CSSOverviewModel.ts +1 -1
  75. package/front_end/panels/elements/ComputedStyleModel.ts +16 -65
  76. package/front_end/panels/elements/ComputedStyleWidget.ts +3 -3
  77. package/front_end/panels/elements/ElementsPanel.ts +35 -5
  78. package/front_end/panels/elements/ElementsSidebarPane.ts +1 -1
  79. package/front_end/panels/elements/ElementsTreeOutline.ts +1 -1
  80. package/front_end/panels/elements/PlatformFontsWidget.ts +1 -1
  81. package/front_end/panels/elements/StylePropertiesSection.ts +16 -8
  82. package/front_end/panels/elements/StylePropertyTreeElement.ts +67 -32
  83. package/front_end/panels/elements/StylesSidebarPane.ts +28 -11
  84. package/front_end/panels/elements/components/CSSHintDetailsView.ts +3 -2
  85. package/front_end/panels/elements/components/CSSPropertyDocsView.ts +3 -2
  86. package/front_end/panels/elements/elements-meta.ts +1 -1
  87. package/front_end/panels/emulation/DeviceModeWrapper.ts +101 -62
  88. package/front_end/panels/explain/components/ConsoleInsight.ts +27 -23
  89. package/front_end/panels/explain/components/consoleInsight.css +1 -1
  90. package/front_end/panels/issues/IssueView.ts +6 -6
  91. package/front_end/panels/network/RequestConditionsDrawer.ts +4 -3
  92. package/front_end/panels/network/RequestCookiesView.ts +3 -4
  93. package/front_end/panels/network/RequestTimingView.ts +6 -10
  94. package/front_end/panels/network/components/HeaderSectionRow.ts +3 -2
  95. package/front_end/panels/network/components/RequestHeaderSection.ts +3 -1
  96. package/front_end/panels/network/components/RequestHeadersView.css +2 -2
  97. package/front_end/panels/network/components/RequestHeadersView.ts +7 -6
  98. package/front_end/panels/profiler/HeapProfileView.ts +3 -3
  99. package/front_end/panels/profiler/HeapSnapshotView.ts +2 -2
  100. package/front_end/panels/profiler/profiler-meta.ts +3 -3
  101. package/front_end/panels/protocol_monitor/protocol_monitor-meta.ts +1 -1
  102. package/front_end/panels/recorder/RecorderController.ts +7 -13
  103. package/front_end/panels/recorder/components/CreateRecordingView.ts +6 -6
  104. package/front_end/panels/recorder/components/RecordingView.ts +0 -38
  105. package/front_end/panels/recorder/components/ReplaySection.ts +0 -14
  106. package/front_end/panels/recorder/components/StepEditor.ts +2 -40
  107. package/front_end/panels/recorder/recorderController.css +4 -4
  108. package/front_end/panels/security/CookieControlsView.ts +2 -2
  109. package/front_end/panels/security/CookieReportView.ts +21 -21
  110. package/front_end/panels/security/cookieControlsView.css +1 -1
  111. package/front_end/panels/security/cookieReportView.css +1 -1
  112. package/front_end/panels/settings/AISettingsTab.ts +13 -15
  113. package/front_end/panels/settings/components/SyncSection.ts +4 -3
  114. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +4 -12
  115. package/front_end/panels/settings/settings-meta.ts +1 -1
  116. package/front_end/panels/sources/BreakpointEditDialog.ts +4 -3
  117. package/front_end/panels/sources/CallStackSidebarPane.ts +4 -1
  118. package/front_end/panels/sources/FilteredUISourceCodeListProvider.ts +1 -1
  119. package/front_end/panels/sources/NavigatorView.ts +4 -4
  120. package/front_end/panels/sources/SourcesPanel.ts +7 -4
  121. package/front_end/panels/sources/components/HeadersView.ts +2 -2
  122. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +3 -2
  123. package/front_end/panels/timeline/ThreadAppender.ts +2 -1
  124. package/front_end/panels/timeline/TimelineController.ts +4 -3
  125. package/front_end/panels/timeline/TimelinePanel.ts +7 -4
  126. package/front_end/panels/timeline/TimelineUIUtils.ts +2 -2
  127. package/front_end/panels/timeline/components/ExportTraceOptions.ts +4 -4
  128. package/front_end/panels/timeline/components/FieldSettingsDialog.ts +13 -6
  129. package/front_end/panels/timeline/components/LiveMetricsView.ts +13 -9
  130. package/front_end/panels/timeline/components/exportTraceOptions.css +1 -1
  131. package/front_end/panels/timeline/components/fieldSettingsDialog.css +1 -1
  132. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -19
  133. package/front_end/panels/timeline/components/insights/InsightRenderer.ts +3 -4
  134. package/front_end/panels/timeline/components/insights/baseInsightComponent.css +0 -5
  135. package/front_end/panels/timeline/components/liveMetricsView.css +1 -1
  136. package/front_end/panels/whats_new/ReleaseNoteView.ts +4 -3
  137. package/front_end/third_party/chromium/README.chromium +1 -1
  138. package/front_end/ui/components/buttons/button.css +4 -0
  139. package/front_end/ui/components/markdown_view/CodeBlock.ts +3 -6
  140. package/front_end/ui/components/markdown_view/MarkdownLink.ts +3 -4
  141. package/front_end/ui/components/panel_feedback/PanelFeedback.ts +3 -4
  142. package/front_end/ui/components/panel_feedback/PreviewToggle.ts +10 -7
  143. package/front_end/ui/components/panel_feedback/panelFeedback.css +2 -2
  144. package/front_end/ui/components/panel_feedback/previewToggle.css +2 -2
  145. package/front_end/ui/components/text_editor/AiCodeGenerationParser.ts +27 -8
  146. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +36 -6
  147. package/front_end/ui/kit/link/Link.ts +1 -14
  148. package/front_end/ui/legacy/ActionRegistration.ts +1 -1
  149. package/front_end/ui/legacy/ContextMenu.ts +2 -2
  150. package/front_end/ui/legacy/EmptyWidget.ts +3 -3
  151. package/front_end/ui/legacy/LinkContextMenuProvider.ts +42 -0
  152. package/front_end/ui/legacy/ViewRegistration.ts +1 -1
  153. package/front_end/ui/legacy/XLink.ts +0 -27
  154. package/front_end/ui/legacy/components/color_picker/ContrastDetails.ts +1 -1
  155. package/front_end/ui/legacy/components/color_picker/ContrastOverlay.ts +5 -4
  156. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +2 -2
  157. package/front_end/ui/legacy/components/perf_ui/perf_ui-meta.ts +1 -1
  158. package/front_end/ui/legacy/inspectorCommon.css +2 -1
  159. package/front_end/ui/legacy/legacy.ts +3 -1
  160. package/front_end/ui/visual_logging/KnownContextValues.ts +4 -1
  161. package/front_end/ui/visual_logging/LoggingDriver.ts +3 -0
  162. package/package.json +1 -1
  163. package/front_end/models/ai_assistance/ArtifactsManager.ts +0 -67
  164. package/front_end/panels/ai_assistance/components/ArtifactsViewer.ts +0 -183
  165. package/front_end/panels/ai_assistance/components/CollapsibleAssistanceContentWidget.ts +0 -89
  166. package/front_end/panels/ai_assistance/components/PerformanceAgentFlameChart.ts +0 -133
  167. package/front_end/panels/ai_assistance/components/artifactsViewer.css +0 -15
  168. package/front_end/panels/ai_assistance/components/collapsibleAssistanceContentWidget.css +0 -32
@@ -151,7 +151,8 @@ export class ThreadAppender implements TrackAppender {
151
151
  #headerAppended = false;
152
152
  readonly threadType: Trace.Handlers.Threads.ThreadType = Trace.Handlers.Threads.ThreadType.MAIN_THREAD;
153
153
  readonly isOnMainFrame: boolean;
154
- #showAllEventsEnabled = Root.Runtime.experiments.isEnabled('timeline-show-all-events');
154
+ #showAllEventsEnabled =
155
+ Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.TIMELINE_SHOW_ALL_EVENTS);
155
156
  #url = '';
156
157
  #headerNestingLevel: number|null = null;
157
158
  constructor(
@@ -229,7 +229,7 @@ export class TimelineController implements Tracing.TracingManager.TracingManager
229
229
  // 'disabled-by-default-v8.cpu_profiler'
230
230
  // └ default: on, option: enableJSSampling
231
231
  const categoriesArray = [
232
- Root.Runtime.experiments.isEnabled('timeline-show-all-events') ? '*' : '-*',
232
+ Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.TIMELINE_SHOW_ALL_EVENTS) ? '*' : '-*',
233
233
  Trace.Types.Events.Categories.Console,
234
234
  Trace.Types.Events.Categories.Loading,
235
235
  Trace.Types.Events.Categories.UserTiming,
@@ -251,13 +251,14 @@ export class TimelineController implements Tracing.TracingManager.TracingManager
251
251
  'navigation,rail',
252
252
  ];
253
253
 
254
- if (Root.Runtime.experiments.isEnabled('timeline-v8-runtime-call-stats') && options.enableJSSampling) {
254
+ if (Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.TIMELINE_V8_RUNTIME_CALL_STATS) &&
255
+ options.enableJSSampling) {
255
256
  categoriesArray.push(disabledByDefault('v8.runtime_stats_sampling'));
256
257
  }
257
258
  if (options.enableJSSampling) {
258
259
  categoriesArray.push(disabledByDefault('v8.cpu_profiler'));
259
260
  }
260
- if (Root.Runtime.experiments.isEnabled('timeline-invalidation-tracking')) {
261
+ if (Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.TIMELINE_INVALIDATION_TRACKING)) {
261
262
  categoriesArray.push(disabledByDefault('devtools.timeline.invalidationTracking'));
262
263
  }
263
264
  if (options.capturePictures) {
@@ -732,9 +732,11 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
732
732
 
733
733
  #instantiateNewModel(): Trace.TraceModel.Model {
734
734
  const config = Trace.Types.Configuration.defaults();
735
- config.showAllEvents = Root.Runtime.experiments.isEnabled('timeline-show-all-events');
736
- config.includeRuntimeCallStats = Root.Runtime.experiments.isEnabled('timeline-v8-runtime-call-stats');
737
- config.debugMode = Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.TIMELINE_DEBUG_MODE);
735
+ config.showAllEvents =
736
+ Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.TIMELINE_SHOW_ALL_EVENTS);
737
+ config.includeRuntimeCallStats =
738
+ Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.TIMELINE_V8_RUNTIME_CALL_STATS);
739
+ config.debugMode = Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.TIMELINE_DEBUG_MODE);
738
740
 
739
741
  const traceEngineModel = Trace.TraceModel.Model.createWithAllHandlers(config);
740
742
 
@@ -2089,7 +2091,8 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
2089
2091
 
2090
2092
  #applyActiveFilters(traceIsGeneric: boolean, exclusiveFilter: Trace.Extras.TraceFilter.TraceFilter|null = null):
2091
2093
  void {
2092
- if (traceIsGeneric || Root.Runtime.experiments.isEnabled('timeline-show-all-events')) {
2094
+ if (traceIsGeneric ||
2095
+ Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.TIMELINE_SHOW_ALL_EVENTS)) {
2093
2096
  return;
2094
2097
  }
2095
2098
 
@@ -505,7 +505,7 @@ export class TimelineUIUtils {
505
505
  static getGetDebugModeEnabled(): boolean {
506
506
  if (TimelineUIUtils.debugModeEnabled === undefined) {
507
507
  TimelineUIUtils.debugModeEnabled =
508
- Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.TIMELINE_DEBUG_MODE);
508
+ Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.TIMELINE_DEBUG_MODE);
509
509
  }
510
510
  return TimelineUIUtils.debugModeEnabled;
511
511
  }
@@ -1527,7 +1527,7 @@ export class TimelineUIUtils {
1527
1527
  await TimelineUIUtils.generateCauses(event, contentHelper, parsedTrace);
1528
1528
  }
1529
1529
 
1530
- if (Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.TIMELINE_DEBUG_MODE)) {
1530
+ if (Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.TIMELINE_DEBUG_MODE)) {
1531
1531
  TimelineUIUtils.renderEventJson(event, contentHelper);
1532
1532
  }
1533
1533
 
@@ -3,6 +3,7 @@
3
3
  // found in the LICENSE file.
4
4
  /* eslint-disable @devtools/no-lit-render-outside-of-view */
5
5
 
6
+ import '../../../ui/kit/kit.js';
6
7
  import '../../../ui/components/tooltips/tooltips.js';
7
8
  import '../../../ui/components/buttons/buttons.js';
8
9
 
@@ -14,7 +15,6 @@ import * as Dialogs from '../../../ui/components/dialogs/dialogs.js';
14
15
  import * as ComponentHelpers from '../../../ui/components/helpers/helpers.js';
15
16
  import * as UI from '../../../ui/legacy/legacy.js';
16
17
  import * as Lit from '../../../ui/lit/lit.js';
17
- import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
18
18
 
19
19
  import exportTraceOptionsStyles from './exportTraceOptions.css.js';
20
20
 
@@ -299,12 +299,12 @@ export class ExportTraceOptions extends HTMLElement {
299
299
  ${this.#renderCheckbox('compress-with-gzip', this.#shouldCompressCheckbox, i18nString(UIStrings.shouldCompress), this.#state.shouldCompress)}
300
300
  <div class='export-trace-options-row export-trace-options-row-last'>
301
301
  <div class="export-trace-explanation">
302
- <x-link
302
+ <devtools-link
303
303
  href="https://developer.chrome.com/docs/devtools/performance/save-trace"
304
304
  class=devtools-link
305
- jslog=${VisualLogging.link().track({click: true, keydown:'Enter|Space'}).context('save-trace-explanation')}>
305
+ .jslogContext=${'save-trace-explanation'}>
306
306
  ${i18nString(UIStrings.explanation)}
307
- </x-link>
307
+ </devtools-link>
308
308
  </div>
309
309
  <devtools-button
310
310
  class="setup-button"
@@ -3,6 +3,7 @@
3
3
  // found in the LICENSE file.
4
4
  /* eslint-disable @devtools/no-lit-render-outside-of-view */
5
5
 
6
+ import '../../../ui/kit/kit.js';
6
7
  import './OriginMap.js';
7
8
 
8
9
  import * as i18n from '../../../core/i18n/i18n.js';
@@ -12,7 +13,6 @@ import * as Dialogs from '../../../ui/components/dialogs/dialogs.js';
12
13
  import * as ComponentHelpers from '../../../ui/components/helpers/helpers.js';
13
14
  import * as Input from '../../../ui/components/input/input.js';
14
15
  import * as uiI18n from '../../../ui/i18n/i18n.js';
15
- import * as UI from '../../../ui/legacy/legacy.js';
16
16
  import * as Lit from '../../../ui/lit/lit.js';
17
17
  import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
18
18
 
@@ -332,10 +332,6 @@ export class FieldSettingsDialog extends HTMLElement {
332
332
  }
333
333
 
334
334
  #render = (): void => {
335
- const linkEl =
336
- UI.XLink.XLink.create('https://developer.chrome.com/docs/crux', i18n.i18n.lockedString('Chrome UX Report'));
337
- const descriptionEl = uiI18n.getFormatLocalizedString(str_, UIStrings.fetchAggregated, {PH1: linkEl});
338
-
339
335
  // clang-format off
340
336
  const output = html`
341
337
  <style>${fieldSettingsDialogStyles}</style>
@@ -356,7 +352,18 @@ export class FieldSettingsDialog extends HTMLElement {
356
352
  })}
357
353
  >
358
354
  <div class="content">
359
- <div>${descriptionEl}</div>
355
+ <div>
356
+ ${uiI18n.getFormatLocalizedStringTemplate(
357
+ str_,
358
+ UIStrings.fetchAggregated,
359
+ {
360
+ PH1: html`<devtools-link
361
+ href="https://developer.chrome.com/docs/crux"
362
+ >${i18n.i18n.lockedString('Chrome UX Report')}</devtools-link
363
+ >`,
364
+ },
365
+ )}
366
+ </div>
360
367
  <div class="privacy-disclosure">
361
368
  <h3 class="section-title">${i18nString(UIStrings.privacyDisclosure)}</h3>
362
369
  <div>${i18nString(UIStrings.whenPerformanceIsShown)}</div>
@@ -867,10 +867,10 @@ export class LiveMetricsView extends LegacyWrapper.LegacyWrapper.WrappableCompon
867
867
  tmp.searchParams.set('device', device);
868
868
  const cruxVis = `${tmp.origin}/#/${tmp.search}`;
869
869
  return html`
870
- (<x-link href=${cruxVis}
870
+ (<devtools-link href=${cruxVis}
871
871
  class="local-field-link"
872
872
  title=${i18nString(UIStrings.fieldDataHistoryTooltip)}
873
- >${i18nString(UIStrings.fieldDataHistoryLink)}</x-link>)
873
+ >${i18nString(UIStrings.fieldDataHistoryLink)}</devtools-link>)
874
874
  `;
875
875
  }
876
876
 
@@ -904,13 +904,17 @@ export class LiveMetricsView extends LegacyWrapper.LegacyWrapper.WrappableCompon
904
904
  return this.#renderCollectionPeriod();
905
905
  }
906
906
 
907
- const linkEl =
908
- UI.XLink.XLink.create('https://developer.chrome.com/docs/crux', i18n.i18n.lockedString('Chrome UX Report'));
909
- const messageEl = uiI18n.getFormatLocalizedString(str_, UIStrings.seeHowYourLocalMetricsCompare, {PH1: linkEl});
910
-
907
+ // clang-format off
911
908
  return html`
912
- <div class="field-data-message">${messageEl}</div>
909
+ <div class="field-data-message">
910
+ ${uiI18n.getFormatLocalizedStringTemplate(
911
+ str_,
912
+ UIStrings.seeHowYourLocalMetricsCompare,
913
+ { PH1: html`<devtools-link href="https://developer.chrome.com/docs/crux">${i18n.i18n.lockedString('Chrome UX Report')}</devtools-link>` },
914
+ )}
915
+ </div>
913
916
  `;
917
+ // clang-format on
914
918
  }
915
919
 
916
920
  #renderLogSection(): Lit.LitTemplate {
@@ -1174,11 +1178,11 @@ export class LiveMetricsView extends LegacyWrapper.LegacyWrapper.WrappableCompon
1174
1178
  ${this.#renderInpCard()}
1175
1179
  </div>
1176
1180
  </div>
1177
- <x-link
1181
+ <devtools-link
1178
1182
  href=${helpLink}
1179
1183
  class="local-field-link"
1180
1184
  title=${i18nString(UIStrings.localFieldLearnMoreTooltip)}
1181
- >${i18nString(UIStrings.localFieldLearnMoreLink)}</x-link>
1185
+ >${i18nString(UIStrings.localFieldLearnMoreLink)}</devtools-link>
1182
1186
  ${this.#renderLogSection()}
1183
1187
  </main>
1184
1188
  <aside class="next-steps" aria-labelledby="next-steps-section-title">
@@ -34,7 +34,7 @@
34
34
  white-space: normal;
35
35
  }
36
36
 
37
- x-link {
37
+ devtools-link {
38
38
  color: var(--sys-color-primary);
39
39
  text-decoration-line: underline;
40
40
  }
@@ -104,7 +104,7 @@ input[type="text"][disabled] {
104
104
  color: var(--color-error-text);
105
105
  }
106
106
 
107
- x-link {
107
+ devtools-link {
108
108
  color: var(--sys-color-primary);
109
109
  text-decoration-line: underline;
110
110
  }
@@ -69,7 +69,6 @@ interface ViewInput {
69
69
  internalName: string;
70
70
  model: InsightModel;
71
71
  selected: boolean;
72
- isAIAssistanceContext: boolean;
73
72
  showAskAI: boolean;
74
73
  estimatedSavingsString: string|null;
75
74
  estimatedSavingsAriaLabel: string|null;
@@ -88,7 +87,6 @@ const DEFAULT_VIEW: View = (input, output, target) => {
88
87
  selected,
89
88
  estimatedSavingsString,
90
89
  estimatedSavingsAriaLabel,
91
- isAIAssistanceContext,
92
90
  showAskAI,
93
91
  dispatchInsightToggle,
94
92
  renderContent,
@@ -98,8 +96,7 @@ const DEFAULT_VIEW: View = (input, output, target) => {
98
96
 
99
97
  const containerClasses = Lit.Directives.classMap({
100
98
  insight: true,
101
- closed: !selected || isAIAssistanceContext,
102
- 'ai-assistance-context': isAIAssistanceContext,
99
+ closed: !selected,
103
100
  });
104
101
 
105
102
  let ariaLabel = `${i18nString(UIStrings.viewDetails, {PH1: model.title})}`;
@@ -139,10 +136,6 @@ const DEFAULT_VIEW: View = (input, output, target) => {
139
136
  }
140
137
 
141
138
  function renderHoverIcon(): Lit.LitTemplate {
142
- if (isAIAssistanceContext) {
143
- return Lit.nothing;
144
- }
145
-
146
139
  const containerClasses = Lit.Directives.classMap({
147
140
  'insight-hover-icon': true,
148
141
  active: selected,
@@ -205,10 +198,6 @@ export interface BaseInsightData {
205
198
  export abstract class BaseInsightComponent<T extends InsightModel> extends UI.Widget.Widget {
206
199
  #view: View;
207
200
  abstract internalName: string;
208
-
209
- // Tracks if this component is rendered withing the AI assistance panel.
210
- // Currently only relevant to GreenDev.
211
- #isAIAssistanceContext = false;
212
201
  #selected = false;
213
202
  #model: T|null = null;
214
203
  #agentFocus: AIAssistance.AIContext.AgentFocus|null = null;
@@ -243,11 +232,6 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends UI.Wi
243
232
  return false;
244
233
  }
245
234
 
246
- set isAIAssistanceContext(isAIAssistanceContext: boolean) {
247
- this.#isAIAssistanceContext = isAIAssistanceContext;
248
- this.requestUpdate();
249
- }
250
-
251
235
  set selected(selected: boolean) {
252
236
  if (!this.#selected && selected) {
253
237
  const options = this.getOverlayOptionsForInitialOverlays();
@@ -408,7 +392,6 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends UI.Wi
408
392
  selected: this.#selected,
409
393
  estimatedSavingsString: this.getEstimatedSavingsString(),
410
394
  estimatedSavingsAriaLabel: this.#getEstimatedSavingsAriaLabel(),
411
- isAIAssistanceContext: this.#isAIAssistanceContext,
412
395
  showAskAI: this.#canShowAskAI(),
413
396
  dispatchInsightToggle: () => this.#dispatchInsightToggle(),
414
397
  renderContent: () => this.renderContent(),
@@ -514,7 +497,7 @@ export abstract class BaseInsightComponent<T extends InsightModel> extends UI.Wi
514
497
  }
515
498
 
516
499
  #canShowAskAI(): boolean {
517
- if (this.#isAIAssistanceContext || !this.hasAskAiSupport()) {
500
+ if (!this.hasAskAiSupport()) {
518
501
  return false;
519
502
  }
520
503
 
@@ -61,9 +61,9 @@ export class InsightRenderer {
61
61
  renderInsightToWidgetElement(
62
62
  parsedTrace: Trace.TraceModel.ParsedTrace, insightSet: Trace.Insights.Types.InsightSet,
63
63
  model: Trace.Insights.Types.InsightModel, insightName: string,
64
- options: Partial<Pick<
65
- BaseInsightComponent<Trace.Insights.Types.InsightModel>,
66
- 'selected'|'agentFocus'|'fieldMetrics'|'isAIAssistanceContext'>>): InsightWidgetElement {
64
+ options: Partial<
65
+ Pick<BaseInsightComponent<Trace.Insights.Types.InsightModel>, 'selected'|'agentFocus'|'fieldMetrics'>>):
66
+ InsightWidgetElement {
67
67
  let widgetElement = this.#insightWidgetCache.get(model);
68
68
  if (!widgetElement) {
69
69
  widgetElement = document.createElement('devtools-widget') as InsightWidgetElement;
@@ -85,7 +85,6 @@ export class InsightRenderer {
85
85
  insightSetKey: insightSet.id,
86
86
  agentFocus: options.agentFocus ?? null,
87
87
  fieldMetrics: options.fieldMetrics ?? null,
88
- isAIAssistanceContext: options.isAIAssistanceContext ?? false,
89
88
  });
90
89
 
91
90
  return widgetElement;
@@ -60,11 +60,6 @@
60
60
  }
61
61
  }
62
62
 
63
- .insight.ai-assistance-context {
64
- display: block;
65
- min-width: 200px;
66
- }
67
-
68
63
  .insight-hover-icon {
69
64
  position: absolute;
70
65
  top: var(--sys-size-5);
@@ -300,7 +300,7 @@
300
300
  font-weight: var(--ref-typeface-weight-medium);
301
301
  }
302
302
 
303
- x-link {
303
+ devtools-link {
304
304
  color: var(--sys-color-primary);
305
305
  text-decoration-line: underline;
306
306
  }
@@ -3,6 +3,7 @@
3
3
  // found in the LICENSE file.
4
4
 
5
5
  import '../../ui/components/markdown_view/markdown_view.js';
6
+ import '../../ui/kit/kit.js';
6
7
 
7
8
  import * as i18n from '../../core/i18n/i18n.js';
8
9
  import type * as Platform from '../../core/platform/platform.js';
@@ -87,14 +88,14 @@ export class ReleaseNoteView extends UI.Panel.Panel {
87
88
  <div class="video-container">
88
89
  ${releaseNote.videoLinks.map((value: {description: string, link: Platform.DevToolsPath.UrlString, type?: VideoType}) => {
89
90
  return html`
90
- <x-link
91
+ <devtools-link
91
92
  href=${value.link}
92
- jslog=${VisualLogging.link().track({click: true}).context('learn-more')}>
93
+ .jslogContext=${'learn-more'}>
93
94
  <div class="video">
94
95
  <img class="thumbnail" src=${input.getThumbnailPath(value.type ?? VideoType.WHATS_NEW)}>
95
96
  <div class="thumbnail-description"><span>${value.description}</span></div>
96
97
  </div>
97
- </x-link>
98
+ </devtools-link>
98
99
  `;
99
100
  })}
100
101
  </div>
@@ -1,7 +1,7 @@
1
1
  Name: Dependencies sourced from the upstream `chromium` repository
2
2
  URL: https://chromium.googlesource.com/chromium/src
3
3
  Version: N/A
4
- Revision: 45ca275b4749431e27f80dc5defcf893accdf583
4
+ Revision: 1eaa7f85927d5066cf8a8c7dfc076e8b2b3665d6
5
5
  Update Mechanism: Manual (https://crbug.com/428069060)
6
6
  License: BSD-3-Clause
7
7
  License File: LICENSE
@@ -83,6 +83,10 @@ button {
83
83
  border: none;
84
84
  overflow: hidden;
85
85
 
86
+ devtools-icon {
87
+ color: var(--override-button-icon-color, var(--icon-default));
88
+ }
89
+
86
90
  &.small {
87
91
  --button-height: var(--sys-size-9);
88
92
  --button-width: var(--sys-size-9);
@@ -3,7 +3,7 @@
3
3
  // found in the LICENSE file.
4
4
  /* eslint-disable @devtools/no-lit-render-outside-of-view, @devtools/enforce-custom-element-definitions-location */
5
5
 
6
- import '../../../ui/legacy/legacy.js'; // for x-link
6
+ import '../../../ui/kit/kit.js';
7
7
 
8
8
  import * as i18n from '../../../core/i18n/i18n.js';
9
9
  import * as CodeMirror from '../../../third_party/codemirror.next/codemirror.next.js';
@@ -204,12 +204,9 @@ export class CodeBlock extends HTMLElement {
204
204
  #renderNotice(): Lit.TemplateResult {
205
205
  // clang-format off
206
206
  return html`<p class="notice">
207
- <x-link class="link" href="https://support.google.com/legal/answer/13505487" jslog=${
208
- VisualLogging.link('code-disclaimer').track({
209
- click: true,
210
- })}>
207
+ <devtools-link class="link" href="https://support.google.com/legal/answer/13505487" .jslogContext=${'code-disclaimer'}>
211
208
  ${i18nString(UIStrings.disclaimer)}
212
- </x-link>
209
+ </devtools-link>
213
210
  </p>`;
214
211
  // clang-format on
215
212
  }
@@ -3,10 +3,9 @@
3
3
  // found in the LICENSE file.
4
4
  /* eslint-disable @devtools/no-lit-render-outside-of-view, @devtools/enforce-custom-element-definitions-location */
5
5
 
6
- import '../../legacy/legacy.js'; // Required for <x-link>.
6
+ import '../../kit/kit.js';
7
7
 
8
8
  import {html, render} from '../../lit/lit.js';
9
- import * as VisualLogging from '../../visual_logging/visual_logging.js';
10
9
 
11
10
  import markdownLinkStyles from './markdownLink.css.js';
12
11
  import {getMarkdownLink} from './MarkdownLinksMap.js';
@@ -38,8 +37,8 @@ export class MarkdownLink extends HTMLElement {
38
37
  // clang-format off
39
38
  const output = html`
40
39
  <style>${markdownLinkStyles}</style>
41
- <x-link class="devtools-link" href=${this.#linkUrl} jslog=${VisualLogging.link().track({click: true})}
42
- >${this.#linkText}</x-link>`;
40
+ <devtools-link class="devtools-link" href=${this.#linkUrl}
41
+ >${this.#linkText}</devtools-link>`;
43
42
  render(output, this.#shadow, {host: this});
44
43
  // clang-format on
45
44
  }
@@ -3,13 +3,12 @@
3
3
  // found in the LICENSE file.
4
4
  /* eslint-disable @devtools/no-lit-render-outside-of-view, @devtools/enforce-custom-element-definitions-location */
5
5
 
6
- import '../../legacy/legacy.js';
6
+ import '../../kit/kit.js';
7
7
 
8
8
  import * as i18n from '../../../core/i18n/i18n.js';
9
9
  import * as Platform from '../../../core/platform/platform.js';
10
10
  import * as ComponentHelpers from '../../components/helpers/helpers.js';
11
11
  import {html, render} from '../../lit/lit.js';
12
- import * as VisualLogging from '../../visual_logging/visual_logging.js';
13
12
 
14
13
  import panelFeedbackStyles from './panelFeedback.css.js';
15
14
 
@@ -68,14 +67,14 @@ export class PanelFeedback extends HTMLElement {
68
67
  <h2 class="flex">
69
68
  <devtools-icon name="experiment" class="extra-large" style="color: var(--icon-primary);"></devtools-icon> ${i18nString(UIStrings.previewFeature)}
70
69
  </h2>
71
- <p>${i18nString(UIStrings.previewText)} <x-link href=${this.#props.feedbackUrl} jslog=${VisualLogging.link('feedback').track({click: true})}>${i18nString(UIStrings.previewTextFeedbackLink)}</x-link></p>
70
+ <p>${i18nString(UIStrings.previewText)} <devtools-link href=${this.#props.feedbackUrl} .jslogContext=${'feedback'}>${i18nString(UIStrings.previewTextFeedbackLink)}</devtools-link></p>
72
71
  <div class="video">
73
72
  <div class="thumbnail">
74
73
  <img src=${videoThumbnailUrl} role="presentation" />
75
74
  </div>
76
75
  <div class="video-description">
77
76
  <h3>${i18nString(UIStrings.videoAndDocumentation)}</h3>
78
- <x-link class="quick-start-link" href=${this.#props.quickStartUrl} jslog=${VisualLogging.link('css-overview.quick-start').track({click: true})}>${this.#props.quickStartLinkText}</x-link>
77
+ <devtools-link class="quick-start-link" href=${this.#props.quickStartUrl} .jslogContext=${'css-overview.quick-start'}>${this.#props.quickStartLinkText}</devtools-link>
79
78
  </div>
80
79
  </div>
81
80
  </div>
@@ -4,6 +4,7 @@
4
4
  /* eslint-disable @devtools/no-lit-render-outside-of-view, @devtools/enforce-custom-element-definitions-location */
5
5
 
6
6
  import '../../../ui/legacy/legacy.js';
7
+ import '../../../ui/kit/kit.js';
7
8
 
8
9
  import * as i18n from '../../../core/i18n/i18n.js';
9
10
  import * as Root from '../../../core/root/root.js';
@@ -15,7 +16,7 @@ export interface PreviewToggleData {
15
16
  name: string;
16
17
  helperText: string|null;
17
18
  feedbackURL: string|null;
18
- experiment: Root.Runtime.ExperimentName;
19
+ experiment: Root.ExperimentNames.ExperimentName;
19
20
  learnMoreURL?: string;
20
21
  onChangeCallback?: (checked: boolean) => void;
21
22
  }
@@ -45,7 +46,7 @@ export class PreviewToggle extends HTMLElement {
45
46
  #helperText: string|null = null;
46
47
  #feedbackURL: string|null = null;
47
48
  #learnMoreURL: string|undefined;
48
- #experiment = '';
49
+ #experiment: Root.ExperimentNames.ExperimentName|'' = '';
49
50
  #onChangeCallback?: (checked: boolean) => void;
50
51
 
51
52
  set data(data: PreviewToggleData) {
@@ -59,7 +60,7 @@ export class PreviewToggle extends HTMLElement {
59
60
  }
60
61
 
61
62
  #render(): void {
62
- const checked = Root.Runtime.experiments.isEnabled(this.#experiment);
63
+ const checked = this.#experiment && Root.Runtime.experiments.isEnabled(this.#experiment);
63
64
  // Disabled until https://crbug.com/1079231 is fixed.
64
65
  // clang-format off
65
66
  render(
@@ -75,14 +76,14 @@ export class PreviewToggle extends HTMLElement {
75
76
  </devtools-checkbox>
76
77
  <div class="spacer"></div>
77
78
  ${this.#feedbackURL && !this.#helperText
78
- ? html`<div class="feedback"><x-link class="x-link" href=${this.#feedbackURL}>${i18nString(UIStrings.shortFeedbackLink)}</x-link></div>`
79
+ ? html`<div class="feedback"><devtools-link class="devtools-link" href=${this.#feedbackURL} jslogContext=${'feedback'}>${i18nString(UIStrings.shortFeedbackLink)}</devtools-link></div>`
79
80
  : nothing}
80
81
  ${this.#learnMoreURL
81
- ? html`<div class="learn-more"><x-link class="x-link" href=${this.#learnMoreURL}>${i18nString(UIStrings.learnMoreLink)}</x-link></div>`
82
+ ? html`<div class="learn-more"><devtools-link class="devtools-link" href=${this.#learnMoreURL} jslogContext=${'learn-more'}>${i18nString(UIStrings.learnMoreLink)}</devtools-link></div>`
82
83
  : nothing}
83
84
  <div class="helper">
84
85
  ${this.#helperText && this.#feedbackURL
85
- ? html`<p>${this.#helperText} <x-link class="x-link" href=${this.#feedbackURL}>${i18nString(UIStrings.previewTextFeedbackLink)}</x-link></p>`
86
+ ? html`<p>${this.#helperText} <devtools-link class="devtools-link" href=${this.#feedbackURL} jslogContext=${'feedback'}>${i18nString(UIStrings.previewTextFeedbackLink)}</devtools-link></p>`
86
87
  : nothing}
87
88
  </div>
88
89
  </div>`,
@@ -95,7 +96,9 @@ export class PreviewToggle extends HTMLElement {
95
96
 
96
97
  #checkboxChanged(event: Event): void {
97
98
  const checked = (event.target as HTMLInputElement).checked;
98
- Root.Runtime.experiments.setEnabled(this.#experiment, checked);
99
+ if (this.#experiment) {
100
+ Root.Runtime.experiments.setEnabled(this.#experiment, checked);
101
+ }
99
102
  this.#onChangeCallback?.(checked);
100
103
  }
101
104
  }
@@ -54,7 +54,7 @@ h3 {
54
54
  gap: 20px;
55
55
  }
56
56
 
57
- x-link {
57
+ devtools-link {
58
58
  color: var(--sys-color-primary);
59
59
  text-decoration-line: underline;
60
60
  }
@@ -72,7 +72,7 @@ x-link.quick-start-link {
72
72
  }
73
73
 
74
74
  @media (forced-colors: active) {
75
- x-link {
75
+ devtools-link {
76
76
  color: linktext;
77
77
  }
78
78
  }
@@ -30,12 +30,12 @@
30
30
  flex: 1;
31
31
  }
32
32
 
33
- .x-link {
33
+ .devtools-link {
34
34
  color: var(--sys-color-primary);
35
35
  text-decoration-line: underline;
36
36
  margin: 0 4px;
37
37
  }
38
38
 
39
- .feedback .x-link {
39
+ .feedback .devtools-link {
40
40
  color: var(--sys-color-token-subtle);
41
41
  }
@@ -9,6 +9,11 @@ const BLOCK_COMMENT_START_PATTERN = /^\/\*+\s*/;
9
9
  const BLOCK_COMMENT_END_PATTERN = /\s*\*+\/$/;
10
10
  const BLOCK_COMMENT_LINE_PREFIX_PATTERN = /^\s*\*\s?/;
11
11
 
12
+ export interface CommentNodeInfo {
13
+ text: string;
14
+ to: number;
15
+ }
16
+
12
17
  function findLastNonWhitespacePos(state: CodeMirror.EditorState, cursorPosition: number): number {
13
18
  const line = state.doc.lineAt(cursorPosition);
14
19
  const textBefore = line.text.substring(0, cursorPosition - line.from);
@@ -23,8 +28,8 @@ function resolveCommentNode(state: CodeMirror.EditorState, cursorPosition: numbe
23
28
  // The bias of -1 makes it check the character to the left of the position.
24
29
  const node = tree.resolveInner(lookupPos, -1);
25
30
  const nodeType = node.type.name;
26
- // Check if the node type is a comment AND the cursor is within the node's range.
27
- if (nodeType.includes('Comment') && cursorPosition >= node.to) {
31
+ // Check if the node type is a comment
32
+ if (nodeType.includes('Comment')) {
28
33
  if (!nodeType.includes('BlockComment')) {
29
34
  return node;
30
35
  }
@@ -48,7 +53,14 @@ function resolveCommentNode(state: CodeMirror.EditorState, cursorPosition: numbe
48
53
 
49
54
  function extractBlockComment(rawText: string): string|undefined {
50
55
  // Remove /* and */, whitespace, and common leading asterisks on new lines
51
- let cleaned = rawText.replace(BLOCK_COMMENT_START_PATTERN, '').replace(BLOCK_COMMENT_END_PATTERN, '');
56
+ if (!rawText.match(BLOCK_COMMENT_START_PATTERN)) {
57
+ return;
58
+ }
59
+ let cleaned = rawText.replace(BLOCK_COMMENT_START_PATTERN, '');
60
+ if (!cleaned.match(BLOCK_COMMENT_END_PATTERN)) {
61
+ return;
62
+ }
63
+ cleaned = cleaned.replace(BLOCK_COMMENT_END_PATTERN, '');
52
64
  // Remove leading " * " from multi-line block comments
53
65
  cleaned = cleaned.split('\n').map(line => line.replace(BLOCK_COMMENT_LINE_PREFIX_PATTERN, '')).join('\n').trim();
54
66
  return cleaned;
@@ -59,19 +71,26 @@ function extractLineComment(rawText: string): string {
59
71
  }
60
72
 
61
73
  export class AiCodeGenerationParser {
62
- static extractCommentText(state: CodeMirror.EditorState, cursorPosition: number): string|undefined {
74
+ static extractCommentNodeInfo(state: CodeMirror.EditorState, cursorPosition: number): CommentNodeInfo|undefined {
63
75
  const node = resolveCommentNode(state, cursorPosition);
64
76
  if (!node) {
65
77
  return;
66
78
  }
67
79
  const nodeType = node.type.name;
68
80
  const rawText = state.doc.sliceString(node.from, node.to);
81
+ let text = '';
69
82
  if (nodeType.includes('LineComment')) {
70
- return extractLineComment(rawText);
83
+ text = extractLineComment(rawText);
84
+ } else if (nodeType.includes('BlockComment')) {
85
+ text = extractBlockComment(rawText) ?? '';
86
+ } else {
87
+ text = rawText;
71
88
  }
72
- if (nodeType.includes('BlockComment')) {
73
- return extractBlockComment(rawText);
89
+
90
+ if (!Boolean(text)) {
91
+ return;
74
92
  }
75
- return rawText;
93
+
94
+ return {text, to: node.to};
76
95
  }
77
96
  }