chrome-devtools-frontend 1.0.1544076 → 1.0.1547147

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 (178) hide show
  1. package/config/typescript/tsconfig.eslint.json +1 -0
  2. package/docs/styleguide/ux/styles.md +1 -1
  3. package/eslint.config.mjs +1 -1
  4. package/front_end/Images/src/arrow-down.svg +8 -1
  5. package/front_end/Images/src/arrow-up.svg +8 -1
  6. package/front_end/core/common/ParsedURL.ts +1 -1
  7. package/front_end/core/common/common.ts +0 -2
  8. package/front_end/core/host/AidaClient.ts +1 -1
  9. package/front_end/core/host/InspectorFrontendHostAPI.ts +0 -1
  10. package/front_end/core/host/UserMetrics.ts +0 -5
  11. package/front_end/core/platform/HostRuntime.ts +18 -0
  12. package/front_end/core/platform/KeyboardUtilities.ts +2 -2
  13. package/front_end/core/platform/StringUtilities.ts +1 -1
  14. package/front_end/core/platform/api/HostRuntime.ts +20 -0
  15. package/front_end/core/platform/api/api.ts +7 -0
  16. package/front_end/core/platform/browser/HostRuntime.ts +14 -0
  17. package/front_end/core/platform/browser/browser.ts +7 -0
  18. package/front_end/core/platform/node/HostRuntime.ts +13 -0
  19. package/front_end/core/platform/node/node.ts +7 -0
  20. package/front_end/core/platform/platform.ts +2 -2
  21. package/front_end/core/protocol_client/CDPConnection.ts +3 -3
  22. package/front_end/core/protocol_client/DevToolsCDPConnection.ts +2 -1
  23. package/front_end/core/sdk/CSSMetadata.ts +17 -5
  24. package/front_end/core/sdk/NetworkManager.ts +6 -8
  25. package/front_end/core/sdk/NetworkRequest.ts +4 -0
  26. package/front_end/core/sdk/SDKModel.ts +4 -2
  27. package/front_end/core/sdk/SourceMapScopesInfo.ts +141 -23
  28. package/front_end/core/sdk/Target.ts +5 -14
  29. package/front_end/core/sdk/TargetManager.ts +39 -18
  30. package/front_end/core/sdk/sdk-meta.ts +62 -0
  31. package/front_end/devtools_compatibility.js +0 -1
  32. package/front_end/entrypoints/main/MainImpl.ts +2 -2
  33. package/front_end/foundation/Universe.ts +2 -2
  34. package/front_end/generated/Deprecation.ts +11 -0
  35. package/front_end/generated/InspectorBackendCommands.ts +3 -6
  36. package/front_end/generated/SupportedCSSProperties.js +4 -25
  37. package/front_end/generated/protocol-mapping.d.ts +0 -15
  38. package/front_end/generated/protocol-proxy-api.d.ts +0 -11
  39. package/front_end/generated/protocol.ts +5 -36
  40. package/front_end/models/ai_assistance/AiConversation.ts +188 -0
  41. package/front_end/models/ai_assistance/AiHistoryStorage.ts +1 -172
  42. package/front_end/models/ai_assistance/ConversationHandler.ts +5 -5
  43. package/front_end/models/ai_assistance/agents/AiAgent.ts +1 -3
  44. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +6 -2
  45. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +1 -1
  46. package/front_end/models/ai_assistance/agents/StylingAgent.ts +3 -9
  47. package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
  48. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +313 -313
  49. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +8 -6
  50. package/front_end/models/ai_assistance/performance/AICallTree.snapshot.txt +33 -33
  51. package/front_end/models/ai_assistance/performance/AICallTree.ts +9 -3
  52. package/front_end/models/bindings/CSSWorkspaceBinding.ts +5 -3
  53. package/front_end/models/bindings/SASSSourceMapping.ts +6 -4
  54. package/front_end/models/cpu_profile/CPUProfileDataModel.ts +10 -7
  55. package/front_end/models/crux-manager/CrUXManager.ts +7 -4
  56. package/front_end/models/issues_manager/GenericIssue.ts +12 -9
  57. package/front_end/models/javascript_metadata/NativeFunctions.js +4 -0
  58. package/front_end/models/trace/handlers/SamplesHandler.ts +3 -0
  59. package/front_end/models/trace/helpers/Trace.ts +13 -0
  60. package/front_end/models/trace/types/TraceEvents.ts +2 -1
  61. package/front_end/models/trace_source_maps_resolver/SourceMapsResolver.ts +29 -0
  62. package/front_end/models/workspace/IgnoreListManager.ts +1 -2
  63. package/front_end/models/workspace/UISourceCode.ts +50 -0
  64. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +11 -10
  65. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +8 -0
  66. package/front_end/panels/ai_assistance/components/ChatView.ts +2 -2
  67. package/front_end/panels/ai_assistance/components/UserActionRow.ts +2 -1
  68. package/front_end/panels/animation/AnimationTimeline.ts +0 -8
  69. package/front_end/panels/application/ApplicationPanelSidebar.ts +6 -7
  70. package/front_end/panels/application/{components/FrameDetailsView.ts → FrameDetailsView.ts} +140 -171
  71. package/front_end/panels/application/{components/OriginTrialTreeView.ts → OriginTrialTreeView.ts} +9 -9
  72. package/front_end/panels/application/application.ts +4 -0
  73. package/front_end/panels/application/components/StackTrace.ts +89 -88
  74. package/front_end/panels/application/components/components.ts +2 -4
  75. package/front_end/panels/application/{components/frameDetailsReportView.css → frameDetailsReportView.css} +5 -1
  76. package/front_end/panels/common/AiCodeGenerationTeaser.ts +80 -0
  77. package/front_end/panels/common/BadgeNotification.ts +2 -1
  78. package/front_end/panels/common/DOMLinkifier.ts +7 -2
  79. package/front_end/panels/common/GdpSignUpDialog.ts +2 -1
  80. package/front_end/panels/common/common.ts +2 -1
  81. package/front_end/panels/console/ConsolePrompt.ts +3 -1
  82. package/front_end/panels/console/ConsoleViewport.ts +1 -2
  83. package/front_end/panels/elements/ElementIssueUtils.ts +2 -2
  84. package/front_end/panels/elements/ElementStatePaneWidget.ts +2 -1
  85. package/front_end/panels/elements/StylePropertiesSection.ts +1 -1
  86. package/front_end/panels/elements/StylePropertyTreeElement.ts +23 -19
  87. package/front_end/panels/elements/StylesSidebarPane.ts +1 -1
  88. package/front_end/panels/elements/cssValueTraceView.css +1 -1
  89. package/front_end/panels/elements/elements-meta.ts +1 -22
  90. package/front_end/panels/explain/components/ConsoleInsight.ts +44 -57
  91. package/front_end/panels/explain/components/consoleInsight.css +46 -1
  92. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +1 -2
  93. package/front_end/panels/lighthouse/LighthouseProtocolService.ts +3 -6
  94. package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +19 -0
  95. package/front_end/panels/network/RequestConditionsDrawer.ts +54 -24
  96. package/front_end/panels/network/networkLogView.css +11 -0
  97. package/front_end/panels/network/networkTimingTable.css +8 -6
  98. package/front_end/panels/network/requestConditionsDrawer.css +10 -1
  99. package/front_end/panels/profiler/ProfilesPanel.ts +1 -2
  100. package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +2 -1
  101. package/front_end/panels/settings/KeybindsSettingsTab.ts +20 -21
  102. package/front_end/panels/settings/SettingsScreen.ts +3 -2
  103. package/front_end/panels/sources/CoveragePlugin.ts +5 -5
  104. package/front_end/panels/sources/Plugin.ts +1 -1
  105. package/front_end/panels/sources/ProfilePlugin.ts +22 -14
  106. package/front_end/panels/sources/UISourceCodeFrame.ts +2 -1
  107. package/front_end/panels/sources/sources-meta.ts +0 -62
  108. package/front_end/panels/timeline/README.md +1 -9
  109. package/front_end/panels/timeline/ThreadAppender.ts +0 -7
  110. package/front_end/panels/timeline/TimelinePanel.ts +1 -1
  111. package/front_end/panels/timeline/TimelineUIUtils.ts +2 -0
  112. package/front_end/panels/timeline/components/ExportTraceOptions.ts +15 -1
  113. package/front_end/panels/timeline/components/LiveMetricsView.ts +51 -6
  114. package/front_end/panels/timeline/components/MetricCard.ts +2 -2
  115. package/front_end/panels/timeline/components/exportTraceOptions.css +11 -2
  116. package/front_end/panels/timeline/components/insights/NodeLink.ts +2 -3
  117. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +2 -1
  118. package/front_end/panels/timeline/timeline-meta.ts +0 -10
  119. package/front_end/panels/timeline/timeline.ts +0 -2
  120. package/front_end/panels/whats_new/ReleaseNoteView.ts +2 -1
  121. package/front_end/panels/whats_new/WhatsNewImpl.ts +3 -2
  122. package/front_end/third_party/chromium/README.chromium +1 -1
  123. package/front_end/tsconfig.json +1 -0
  124. package/front_end/ui/components/buttons/Button.docs.ts +6 -5
  125. package/front_end/ui/components/markdown_view/MarkdownLinksMap.ts +1 -0
  126. package/front_end/ui/components/snackbars/Snackbars.docs.ts +1 -1
  127. package/front_end/ui/components/spinners/Spinners.docs.ts +1 -1
  128. package/front_end/ui/components/survey_link/SurveyLink.docs.ts +2 -1
  129. package/front_end/ui/components/switch/Switch.docs.ts +1 -1
  130. package/front_end/ui/components/tooltips/Tooltip.docs.ts +3 -3
  131. package/front_end/ui/helpers/OpenInNewTab.ts +87 -0
  132. package/front_end/ui/helpers/helpers.ts +5 -0
  133. package/front_end/ui/legacy/ARIAUtils.ts +2 -2
  134. package/front_end/ui/legacy/ActionRegistration.ts +11 -0
  135. package/front_end/ui/legacy/ContextMenu.docs.ts +12 -11
  136. package/front_end/ui/legacy/RadioButton.docs.ts +1 -1
  137. package/front_end/ui/legacy/SelectMenu.docs.ts +1 -1
  138. package/front_end/ui/legacy/Slider.docs.ts +1 -1
  139. package/front_end/ui/legacy/SoftDropDown.ts +2 -2
  140. package/front_end/ui/legacy/TextPrompt.ts +3 -2
  141. package/front_end/ui/legacy/Treeoutline.ts +2 -1
  142. package/front_end/ui/legacy/UIUtils.ts +11 -43
  143. package/front_end/ui/legacy/Widget.ts +3 -2
  144. package/front_end/ui/legacy/XLink.ts +4 -4
  145. package/front_end/ui/legacy/components/color_picker/ContrastDetails.ts +2 -1
  146. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +2 -2
  147. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +144 -143
  148. package/front_end/ui/legacy/components/perf_ui/LineLevelProfile.ts +62 -39
  149. package/front_end/ui/legacy/components/perf_ui/OverviewGrid.ts +1 -1
  150. package/front_end/ui/legacy/components/perf_ui/TimelineGrid.ts +2 -2
  151. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +2 -7
  152. package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +1 -2
  153. package/front_end/ui/legacy/components/utils/Linkifier.ts +2 -1
  154. package/front_end/ui/legacy/inspectorCommon.css +2 -2
  155. package/front_end/ui/legacy/legacy.ts +2 -0
  156. package/front_end/ui/visual_logging/KnownContextValues.ts +1 -0
  157. package/mcp/tsconfig.json +16 -0
  158. package/package.json +2 -2
  159. package/front_end/core/common/Linkifier.ts +0 -55
  160. package/front_end/panels/explain/components/consoleInsightSourcesList.css +0 -51
  161. package/front_end/panels/timeline/CLSLinkifier.ts +0 -58
  162. package/front_end/ui/components/docs/README.md +0 -6
  163. package/front_end/ui/components/docs/building-ui-documentation/ComponentEvents.md +0 -54
  164. package/front_end/ui/components/docs/building-ui-documentation/ComponentPerformance.md +0 -136
  165. package/front_end/ui/components/docs/building-ui-documentation/CreatingComponents.md +0 -242
  166. package/front_end/ui/components/docs/building-ui-documentation/README.md +0 -23
  167. package/front_end/ui/components/docs/building-ui-documentation/StylingComponents.md +0 -66
  168. package/front_end/ui/components/docs/building-ui-documentation/TestingComponents.md +0 -111
  169. package/front_end/ui/components/docs/component_docs.ts +0 -24
  170. package/front_end/ui/components/docs/component_docs_styles.css +0 -53
  171. package/front_end/ui/components/docs/create_breadcrumbs.ts +0 -44
  172. package/front_end/ui/components/docs/slider/basic.html +0 -20
  173. package/front_end/ui/components/docs/switch/basic.html +0 -20
  174. /package/front_end/models/issues_manager/descriptions/{genericFormAriaLabelledByToNonExistingId.md → genericFormAriaLabelledByToNonExistingIdError.md} +0 -0
  175. /package/front_end/models/issues_manager/descriptions/{genericFormLabelHasNeitherForNorNestedInput.md → genericFormLabelHasNeitherForNorNestedInputError.md} +0 -0
  176. /package/front_end/panels/application/{components/originTrialTokenRows.css → originTrialTokenRows.css} +0 -0
  177. /package/front_end/panels/application/{components/originTrialTreeView.css → originTrialTreeView.css} +0 -0
  178. /package/front_end/{core/platform → ui/legacy}/DOMUtilities.ts +0 -0
@@ -9,13 +9,14 @@ import * as i18n from '../../../core/i18n/i18n.js';
9
9
  import type * as SDK from '../../../core/sdk/sdk.js';
10
10
  import type * as Protocol from '../../../generated/protocol.js';
11
11
  import * as Components from '../../../ui/legacy/components/utils/utils.js';
12
- import * as Lit from '../../../ui/lit/lit.js';
12
+ import * as UI from '../../../ui/legacy/legacy.js';
13
+ import {html, nothing, render, type TemplateResult} from '../../../ui/lit/lit.js';
13
14
  import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
14
15
 
15
16
  import stackTraceLinkButtonStyles from './stackTraceLinkButton.css.js';
16
17
  import stackTraceRowStyles from './stackTraceRow.css.js';
17
18
 
18
- const {html} = Lit;
19
+ const {widgetConfig} = UI.Widget;
19
20
 
20
21
  const UIStrings = {
21
22
  /**
@@ -40,7 +41,10 @@ const str_ = i18n.i18n.registerUIStrings('panels/application/components/StackTra
40
41
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
41
42
 
42
43
  export interface StackTraceData {
43
- frame: SDK.ResourceTreeModel.ResourceTreeFrame;
44
+ creationStackTraceData: {
45
+ creationStackTrace: Protocol.Runtime.StackTrace|null,
46
+ creationStackTraceTarget: SDK.Target.Target|null,
47
+ };
44
48
  buildStackTraceRows: (
45
49
  stackTrace: Protocol.Runtime.StackTrace,
46
50
  target: SDK.Target.Target|null,
@@ -51,92 +55,97 @@ export interface StackTraceData {
51
55
  ) => Array<Components.JSPresentationUtils.StackTraceRegularRow|Components.JSPresentationUtils.StackTraceAsyncRow>;
52
56
  }
53
57
 
54
- interface StackTraceRowData {
55
- stackTraceRowItem: Components.JSPresentationUtils.StackTraceRegularRow;
58
+ interface StackTraceRowViewInput {
59
+ stackTraceRowItem: Components.JSPresentationUtils.StackTraceRegularRow|null;
56
60
  }
57
61
 
58
- export class StackTraceRow extends HTMLElement {
59
- readonly #shadow = this.attachShadow({mode: 'open'});
60
-
61
- #stackTraceRowItem: Components.JSPresentationUtils.StackTraceRegularRow|null = null;
62
-
63
- set data(data: StackTraceRowData) {
64
- this.#stackTraceRowItem = data.stackTraceRowItem;
65
- this.#render();
62
+ type StackTraceRowView = (input: StackTraceRowViewInput, output: undefined, target: HTMLElement) => void;
63
+ const ROW_DEFAULT_VIEW: StackTraceRowView = (input, output, target) => {
64
+ if (!input.stackTraceRowItem) {
65
+ return;
66
+ }
67
+ // clang-format off
68
+ render(html`
69
+ <style>${stackTraceRowStyles}</style>
70
+ <div class="stack-trace-row">
71
+ <div class="stack-trace-function-name text-ellipsis" title=${input.stackTraceRowItem.functionName}>
72
+ ${input.stackTraceRowItem.functionName}
73
+ </div>
74
+ <div class="stack-trace-source-location">
75
+ ${input.stackTraceRowItem.link ? html`
76
+ <div class="text-ellipsis">\xA0@\xA0${input.stackTraceRowItem.link}</div>` :
77
+ nothing}
78
+ </div>
79
+ </div>`, target);
80
+ // clang-format on
81
+ };
82
+
83
+ export class StackTraceRow extends UI.Widget.Widget {
84
+ constructor(element?: HTMLElement, view = ROW_DEFAULT_VIEW) {
85
+ super(element, {useShadowDom: true});
86
+ this.#view = view;
66
87
  }
67
88
 
68
- #render(): void {
69
- if (!this.#stackTraceRowItem) {
70
- return;
71
- }
72
- Lit.render(
73
- html`
74
- <style>${stackTraceRowStyles}</style>
75
- <div class="stack-trace-row">
76
- <div class="stack-trace-function-name text-ellipsis" title=${this.#stackTraceRowItem.functionName}>
77
- ${this.#stackTraceRowItem.functionName}
78
- </div>
79
- <div class="stack-trace-source-location">
80
- ${
81
- this.#stackTraceRowItem.link ?
82
- html`<div class="text-ellipsis">\xA0@\xA0${this.#stackTraceRowItem.link}</div>` :
83
- Lit.nothing}
84
- </div>
85
- </div>
86
- `,
87
- this.#shadow, {host: this});
89
+ stackTraceRowItem: Components.JSPresentationUtils.StackTraceRegularRow|null = null;
90
+ #view: StackTraceRowView;
91
+
92
+ override performUpdate(): void {
93
+ this.#view(this, undefined, this.contentElement);
88
94
  }
89
95
  }
90
96
 
91
- interface StackTraceLinkButtonData {
97
+ interface StackTraceLinkViewInput {
92
98
  onShowAllClick: () => void;
93
- hiddenCallFramesCount: number;
99
+ hiddenCallFramesCount: number|null;
94
100
  expandedView: boolean;
95
101
  }
96
102
 
97
- export class StackTraceLinkButton extends HTMLElement {
98
- readonly #shadow = this.attachShadow({mode: 'open'});
99
-
100
- #onShowAllClick: () => void = () => {};
101
- #hiddenCallFramesCount: number|null = null;
102
- #expandedView = false;
103
-
104
- set data(data: StackTraceLinkButtonData) {
105
- this.#onShowAllClick = data.onShowAllClick;
106
- this.#hiddenCallFramesCount = data.hiddenCallFramesCount;
107
- this.#expandedView = data.expandedView;
108
- this.#render();
103
+ type StackTraceLinkView = (input: StackTraceLinkViewInput, output: undefined, target: HTMLElement) => void;
104
+ const LINK_DEFAULT_VIEW: StackTraceLinkView = (input, output, target) => {
105
+ if (!input.hiddenCallFramesCount) {
106
+ return;
107
+ }
108
+ const linkText = input.expandedView ? i18nString(UIStrings.showLess) :
109
+ i18nString(UIStrings.showSMoreFrames, {n: input.hiddenCallFramesCount});
110
+ // clang-format off
111
+ render(html`
112
+ <style>${stackTraceLinkButtonStyles}</style>
113
+ <div class="stack-trace-row">
114
+ <button class="link" @click=${() => input.onShowAllClick()}>
115
+ ${linkText}
116
+ </button>
117
+ </div>`, target);
118
+ // clang-format on
119
+ };
120
+
121
+ export class StackTraceLinkButton extends UI.Widget.Widget {
122
+ onShowAllClick: () => void = () => {};
123
+ hiddenCallFramesCount: number|null = null;
124
+ expandedView = false;
125
+ #view: StackTraceLinkView;
126
+
127
+ constructor(element?: HTMLElement, view = LINK_DEFAULT_VIEW) {
128
+ super(element, {useShadowDom: true});
129
+ this.#view = view;
109
130
  }
110
131
 
111
- #render(): void {
112
- if (!this.#hiddenCallFramesCount) {
113
- return;
114
- }
115
- const linkText = this.#expandedView ? i18nString(UIStrings.showLess) :
116
- i18nString(UIStrings.showSMoreFrames, {n: this.#hiddenCallFramesCount});
117
- Lit.render(
118
- html`
119
- <style>${stackTraceLinkButtonStyles}</style>
120
- <div class="stack-trace-row">
121
- <button class="link" @click=${() => this.#onShowAllClick()}>
122
- ${linkText}
123
- </button>
124
- </div>
125
- `,
126
- this.#shadow, {host: this});
132
+ override performUpdate(): void {
133
+ this.#view(this, undefined, this.contentElement);
127
134
  }
128
135
  }
129
136
 
130
- export class StackTrace extends HTMLElement {
131
- readonly #shadow = this.attachShadow({mode: 'open'});
137
+ export class StackTrace extends UI.Widget.Widget {
132
138
  readonly #linkifier = new Components.Linkifier.Linkifier();
133
139
  #stackTraceRows:
134
140
  Array<Components.JSPresentationUtils.StackTraceRegularRow|Components.JSPresentationUtils.StackTraceAsyncRow> = [];
135
141
  #showHidden = false;
136
142
 
143
+ constructor(element?: HTMLElement) {
144
+ super(element, {useShadowDom: true});
145
+ }
146
+
137
147
  set data(data: StackTraceData) {
138
- const frame = data.frame;
139
- const {creationStackTrace, creationStackTraceTarget} = frame.getCreationStackTraceData();
148
+ const {creationStackTrace, creationStackTraceTarget} = data.creationStackTraceData;
140
149
  if (creationStackTrace) {
141
150
  this.#stackTraceRows = data.buildStackTraceRows(
142
151
  creationStackTrace, creationStackTraceTarget, this.#linkifier, true,
@@ -158,7 +167,7 @@ export class StackTrace extends HTMLElement {
158
167
  this.#render();
159
168
  }
160
169
 
161
- createRowTemplates(): Lit.TemplateResult[] {
170
+ createRowTemplates(): TemplateResult[] {
162
171
  const expandableRows = [];
163
172
  let hiddenCallFramesCount = 0;
164
173
  for (const item of this.#stackTraceRows) {
@@ -174,9 +183,9 @@ export class StackTrace extends HTMLElement {
174
183
  if (this.#showHidden || !ignoreListHide) {
175
184
  if ('functionName' in item) {
176
185
  expandableRows.push(html`
177
- <devtools-stack-trace-row data-stack-trace-row .data=${{
178
- stackTraceRowItem: item,
179
- }}></devtools-stack-trace-row>`);
186
+ <devtools-widget data-stack-trace-row .widgetConfig=${widgetConfig(StackTraceRow, {
187
+ stackTraceRowItem: item
188
+ })}></devtools-widget>`);
180
189
  }
181
190
  if ('asyncDescription' in item) {
182
191
  expandableRows.push(html`
@@ -192,7 +201,11 @@ export class StackTrace extends HTMLElement {
192
201
  // Disabled until https://crbug.com/1079231 is fixed.
193
202
  // clang-format off
194
203
  expandableRows.push(html`
195
- <devtools-stack-trace-link-button data-stack-trace-row .data=${{onShowAllClick: this.#onToggleShowAllClick.bind(this), hiddenCallFramesCount, expandedView: this.#showHidden}}></devtools-stack-trace-link-button>
204
+ <devtools-widget data-stack-trace-row .widgetConfig=${widgetConfig(StackTraceLinkButton, {
205
+ onShowAllClick: this.#onToggleShowAllClick.bind(this),
206
+ hiddenCallFramesCount,
207
+ expandedView: this.#showHidden})}>
208
+ </devtools-widget>
196
209
  `);
197
210
  // clang-format on
198
211
  }
@@ -204,34 +217,22 @@ export class StackTrace extends HTMLElement {
204
217
  if (!this.#stackTraceRows.length) {
205
218
  // Disabled until https://crbug.com/1079231 is fixed.
206
219
  // clang-format off
207
- Lit.render(
220
+ render(
208
221
  html`
209
222
  <span>${i18nString(UIStrings.cannotRenderStackTrace)}</span>
210
223
  `,
211
- this.#shadow, {host: this});
224
+ this.contentElement, {host: this});
212
225
  return;
213
226
  }
214
227
 
215
228
  const expandableRows = this.createRowTemplates();
216
- Lit.render(
229
+ render(
217
230
  html`
218
231
  <devtools-expandable-list .data=${{rows: expandableRows, title: i18nString(UIStrings.creationStackTrace)}}
219
232
  jslog=${VisualLogging.tree()}>
220
233
  </devtools-expandable-list>
221
234
  `,
222
- this.#shadow, {host: this});
235
+ this.contentElement, {host: this});
223
236
  // clang-format on
224
237
  }
225
238
  }
226
-
227
- customElements.define('devtools-stack-trace-row', StackTraceRow);
228
- customElements.define('devtools-stack-trace-link-button', StackTraceLinkButton);
229
- customElements.define('devtools-resources-stack-trace', StackTrace);
230
-
231
- declare global {
232
- interface HTMLElementTagNameMap {
233
- 'devtools-stack-trace-row': StackTraceRow;
234
- 'devtools-stack-trace-link-button': StackTraceLinkButton;
235
- 'devtools-resources-stack-trace': StackTrace;
236
- }
237
- }
@@ -5,9 +5,8 @@
5
5
  import * as BackForwardCacheView from './BackForwardCacheView.js';
6
6
  import * as BounceTrackingMitigationsView from './BounceTrackingMitigationsView.js';
7
7
  import * as EndpointsGrid from './EndpointsGrid.js';
8
- import * as FrameDetailsView from './FrameDetailsView.js';
9
8
  import * as InterestGroupAccessGrid from './InterestGroupAccessGrid.js';
10
- import * as OriginTrialTreeView from './OriginTrialTreeView.js';
9
+ import * as PermissionsPolicySection from './PermissionsPolicySection.js';
11
10
  import * as ProtocolHandlersView from './ProtocolHandlersView.js';
12
11
  import * as ReportsGrid from './ReportsGrid.js';
13
12
  import * as ServiceWorkerRouterView from './ServiceWorkerRouterView.js';
@@ -21,9 +20,8 @@ export {
21
20
  BackForwardCacheView,
22
21
  BounceTrackingMitigationsView,
23
22
  EndpointsGrid,
24
- FrameDetailsView,
25
23
  InterestGroupAccessGrid,
26
- OriginTrialTreeView,
24
+ PermissionsPolicySection,
27
25
  ProtocolHandlersView,
28
26
  ReportsGrid,
29
27
  ServiceWorkerRouterView,
@@ -4,6 +4,10 @@
4
4
  * found in the LICENSE file.
5
5
  */
6
6
 
7
+ :host {
8
+ overflow: auto;
9
+ }
10
+
7
11
  .text-ellipsis {
8
12
  overflow: hidden;
9
13
  text-overflow: ellipsis;
@@ -111,4 +115,4 @@ button.text-link {
111
115
  color: linktext;
112
116
  text-decoration-color: linktext;
113
117
  }
114
- }
118
+ }
@@ -0,0 +1,80 @@
1
+ // Copyright 2025 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import * as Host from '../../core/host/host.js';
6
+ import * as i18n from '../../core/i18n/i18n.js';
7
+ import * as UI from '../../ui/legacy/legacy.js';
8
+ import {html, render} from '../../ui/lit/lit.js';
9
+
10
+ const UIStringsNotTranslate = {
11
+ /**
12
+ * @description Text for teaser to generate code.
13
+ */
14
+ ctrlItoGenerateCode: 'ctrl-i to generate code',
15
+ /**
16
+ * @description Text for teaser to generate code in Mac.
17
+ */
18
+ cmdItoGenerateCode: 'cmd-i to generate code',
19
+ /**
20
+ * Text for teaser when generating suggestion.
21
+ */
22
+ generating: 'Generating... (esc to cancel)',
23
+ } as const;
24
+
25
+ const lockedString = i18n.i18n.lockedString;
26
+
27
+ export interface ViewInput {
28
+ loading: boolean;
29
+ }
30
+
31
+ export type View = (input: ViewInput, output: object, target: HTMLElement) => void;
32
+
33
+ export const DEFAULT_VIEW: View = (input, _output, target) => {
34
+ const toGenerateCode = Host.Platform.isMac() ? lockedString(UIStringsNotTranslate.cmdItoGenerateCode) :
35
+ lockedString(UIStringsNotTranslate.ctrlItoGenerateCode);
36
+ const teaserLabel = input.loading ? lockedString(UIStringsNotTranslate.generating) : toGenerateCode;
37
+ // clang-format off
38
+ render(
39
+ html`
40
+ <div class="ai-code-generation-teaser">
41
+ &nbsp;${teaserLabel}
42
+ </div>
43
+ `, target
44
+ );
45
+ // clang-format on
46
+ };
47
+
48
+ export class AiCodeGenerationTeaser extends UI.Widget.Widget {
49
+ readonly #view: View;
50
+
51
+ #loading = false;
52
+
53
+ constructor(view?: View) {
54
+ super();
55
+ this.markAsExternallyManaged();
56
+ this.#view = view ?? DEFAULT_VIEW;
57
+ this.requestUpdate();
58
+ }
59
+
60
+ override performUpdate(): void {
61
+ const output = {};
62
+ this.#view(
63
+ {
64
+ loading: this.#loading,
65
+ },
66
+ output, this.contentElement);
67
+ }
68
+
69
+ get loading(): boolean {
70
+ return this.#loading;
71
+ }
72
+
73
+ set loading(loading: boolean) {
74
+ if (loading === this.#loading) {
75
+ return;
76
+ }
77
+ this.#loading = loading;
78
+ this.requestUpdate();
79
+ }
80
+ }
@@ -7,6 +7,7 @@ import * as Host from '../../core/host/host.js';
7
7
  import * as i18n from '../../core/i18n/i18n.js';
8
8
  import * as Badges from '../../models/badges/badges.js';
9
9
  import * as Buttons from '../../ui/components/buttons/buttons.js';
10
+ import * as UIHelpers from '../../ui/helpers/helpers.js';
10
11
  import * as uiI18n from '../../ui/i18n/i18n.js';
11
12
  import * as UI from '../../ui/legacy/legacy.js';
12
13
  import * as Lit from '../../ui/lit/lit.js';
@@ -290,7 +291,7 @@ export class BadgeNotification extends UI.Widget.Widget {
290
291
  label: i18nString(UIStrings.viewProfile),
291
292
  jslogContext: 'view-profile',
292
293
  onClick: () => {
293
- UI.UIUtils.openInNewTab(Host.GdpClient.GOOGLE_DEVELOPER_PROGRAM_PROFILE_LINK);
294
+ UIHelpers.openInNewTab(Host.GdpClient.GOOGLE_DEVELOPER_PROGRAM_PROFILE_LINK);
294
295
  }
295
296
  }
296
297
  ],
@@ -24,7 +24,12 @@ const UIStrings = {
24
24
  const str_ = i18n.i18n.registerUIStrings('panels/common/DOMLinkifier.ts', UIStrings);
25
25
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
26
26
 
27
- export interface Options extends Common.Linkifier.Options {
27
+ export interface Options {
28
+ tooltip?: string;
29
+ preventKeyboardFocus?: boolean;
30
+ textContent?: string;
31
+ // Dynamic links include hyperlinks and anchorlinks -- links that navigate the content.
32
+ isDynamicLink?: boolean;
28
33
  hiddenClassList?: string[];
29
34
  disabled?: boolean;
30
35
  }
@@ -236,7 +241,7 @@ export class DeferredDOMNodeLink extends UI.Widget.Widget {
236
241
 
237
242
  let linkifierInstance: Linkifier;
238
243
 
239
- export class Linkifier implements Common.Linkifier.Linkifier {
244
+ export class Linkifier {
240
245
  static instance(opts: {
241
246
  forceNew: boolean|null,
242
247
  } = {forceNew: null}): Linkifier {
@@ -12,6 +12,7 @@ import * as Geometry from '../../models/geometry/geometry.js';
12
12
  import * as Buttons from '../../ui/components/buttons/buttons.js';
13
13
  import * as Snackbars from '../../ui/components/snackbars/snackbars.js';
14
14
  import type * as Switch from '../../ui/components/switch/switch.js';
15
+ import * as UIHelpers from '../../ui/helpers/helpers.js';
15
16
  import * as uiI18n from '../../ui/i18n/i18n.js';
16
17
  import * as UI from '../../ui/legacy/legacy.js';
17
18
  import {html, render} from '../../ui/lit/lit.js';
@@ -168,7 +169,7 @@ export const DEFAULT_VIEW: View = (input, _output, target): void => {
168
169
  .title=${i18nString(UIStrings.learnMoreAccessibleText)}
169
170
  .variant=${Buttons.Button.Variant.OUTLINED}
170
171
  .jslogContext=${'learn-more'}
171
- @click=${() => UI.UIUtils.openInNewTab(GDP_PROGRAM_URL as Platform.DevToolsPath.UrlString)}>${i18nString(UIStrings.learnMore)}</devtools-button>
172
+ @click=${() => UIHelpers.openInNewTab(GDP_PROGRAM_URL as Platform.DevToolsPath.UrlString)}>${i18nString(UIStrings.learnMore)}</devtools-button>
172
173
  <div class="right-buttons">
173
174
  <devtools-button
174
175
  .variant=${Buttons.Button.Variant.TONAL}
@@ -69,7 +69,7 @@ export class TypeToAllowDialog {
69
69
  UI.UIUtils.createTextButton(i18nString(UIStrings.cancel), () => resolve(false), {jslogContext: 'cancel'});
70
70
 
71
71
  const allowButton = UI.UIUtils.createTextButton(i18nString(UIStrings.allow), () => {
72
- resolve(input.value === options.typePhrase);
72
+ resolve(input.value === options.typePhrase || input.value === `'${options.typePhrase}'`);
73
73
  }, {jslogContext: 'confirm', variant: Buttons.Button.Variant.PRIMARY});
74
74
  allowButton.disabled = true;
75
75
 
@@ -95,6 +95,7 @@ export class TypeToAllowDialog {
95
95
  }
96
96
 
97
97
  export {AiCodeCompletionTeaser} from './AiCodeCompletionTeaser.js';
98
+ export {AiCodeGenerationTeaser} from './AiCodeGenerationTeaser.js';
98
99
  export {FreDialog} from './FreDialog.js';
99
100
  export {GdpSignUpDialog} from './GdpSignUpDialog.js';
100
101
  export {AiCodeCompletionDisclaimer} from './AiCodeCompletionDisclaimer.js';
@@ -448,7 +448,9 @@ export class ConsolePrompt extends Common.ObjectWrapper.eventMixin<EventTypes, t
448
448
  }
449
449
 
450
450
  private async handleEnter(forceEvaluate?: boolean): Promise<void> {
451
- if (this.#selfXssWarningShown && this.text() === i18nString(UIStrings.allowPasting)) {
451
+ if (this.#selfXssWarningShown &&
452
+ (this.text() === i18nString(UIStrings.allowPasting) ||
453
+ this.text() === `'${i18nString(UIStrings.allowPasting)}'`)) {
452
454
  Common.Console.Console.instance().log(this.text());
453
455
  this.editor.dispatch({
454
456
  changes: {from: 0, to: this.editor.state.doc.length},
@@ -215,8 +215,7 @@ export class ConsoleViewport {
215
215
  private updateFocusedItem(focusLastChild?: boolean): void {
216
216
  const selectedElement = this.renderedElementAt(this.virtualSelectedIndex);
217
217
  const changed = this.lastSelectedElement !== selectedElement;
218
- const containerHasFocus =
219
- this.#contentElement === Platform.DOMUtilities.deepActiveElement(this.element.ownerDocument);
218
+ const containerHasFocus = this.#contentElement === UI.DOMUtilities.deepActiveElement(this.element.ownerDocument);
220
219
  if (this.lastSelectedElement && changed) {
221
220
  this.lastSelectedElement.classList.remove('console-selected');
222
221
  }
@@ -124,11 +124,11 @@ function getTooltipFromGenericIssue(errorType: Protocol.Audits.GenericIssueError
124
124
  return i18nString(UIStrings.formAutocompleteAttributeEmptyError);
125
125
  case Protocol.Audits.GenericIssueErrorType.FormEmptyIdAndNameAttributesForInputError:
126
126
  return i18nString(UIStrings.formEmptyIdAndNameAttributesForInputError);
127
- case Protocol.Audits.GenericIssueErrorType.FormAriaLabelledByToNonExistingId:
127
+ case Protocol.Audits.GenericIssueErrorType.FormAriaLabelledByToNonExistingIdError:
128
128
  return i18nString(UIStrings.formAriaLabelledByToNonExistingId);
129
129
  case Protocol.Audits.GenericIssueErrorType.FormInputAssignedAutocompleteValueToIdOrNameAttributeError:
130
130
  return i18nString(UIStrings.formInputAssignedAutocompleteValueToIdOrNameAttributeError);
131
- case Protocol.Audits.GenericIssueErrorType.FormLabelHasNeitherForNorNestedInput:
131
+ case Protocol.Audits.GenericIssueErrorType.FormLabelHasNeitherForNorNestedInputError:
132
132
  return i18nString(UIStrings.formLabelHasNeitherForNorNestedInput);
133
133
  case Protocol.Audits.GenericIssueErrorType.FormLabelForMatchesNonExistingIdError:
134
134
  return i18nString(UIStrings.formLabelForMatchesNonExistingIdError);
@@ -5,6 +5,7 @@
5
5
  import * as i18n from '../../core/i18n/i18n.js';
6
6
  import * as SDK from '../../core/sdk/sdk.js';
7
7
  import * as Buttons from '../../ui/components/buttons/buttons.js';
8
+ import * as UIHelpers from '../../ui/helpers/helpers.js';
8
9
  import * as UI from '../../ui/legacy/legacy.js';
9
10
  import {html, render, type TemplateResult} from '../../ui/lit/lit.js';
10
11
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
@@ -108,7 +109,7 @@ export const DEFAULT_VIEW: View = (input, _output, target) => {
108
109
  jslog=${VisualLogging.toggle('emulate-page-focus').track({change: true})} ${bindToSetting('emulate-page-focus')}>${
109
110
  i18nString(UIStrings.emulateFocusedPage)}</devtools-checkbox>
110
111
  <devtools-button
111
- @click=${() => UI.UIUtils.openInNewTab('https://developer.chrome.com/docs/devtools/rendering/apply-effects#emulate_a_focused_page')}
112
+ @click=${() => UIHelpers.openInNewTab('https://developer.chrome.com/docs/devtools/rendering/apply-effects#emulate_a_focused_page')}
112
113
  .data=${{
113
114
  variant: Buttons.Button.Variant.ICON,
114
115
  iconName: 'help',
@@ -839,7 +839,7 @@ export class StylePropertiesSection {
839
839
 
840
840
  this.#ancestorRuleListElement.prepend(atRuleElement);
841
841
  this.#ancestorClosingBracesElement.prepend(this.indentElement(this.createClosingBrace(), 0));
842
- this.nestingLevel++;
842
+ this.nestingLevel = 1;
843
843
  }
844
844
  }
845
845
 
@@ -1610,9 +1610,8 @@ export class LengthRenderer extends rendererBase(SDK.CSSPropertyParserMatchers.L
1610
1610
  valueElement.tabIndex = -1;
1611
1611
  valueElement.textContent = match.text;
1612
1612
 
1613
- if (!context.tracing) {
1614
- void this.#attachPopover(valueElement, match, context);
1615
- }
1613
+ const tooltip = this.#getTooltip(valueElement, match, context);
1614
+
1616
1615
  const evaluation = context.tracing?.applyEvaluation([], () => {
1617
1616
  return {
1618
1617
  placeholder: [valueElement],
@@ -1620,7 +1619,11 @@ export class LengthRenderer extends rendererBase(SDK.CSSPropertyParserMatchers.L
1620
1619
  };
1621
1620
  });
1622
1621
 
1623
- return evaluation ?? [valueElement];
1622
+ if (evaluation) {
1623
+ return evaluation;
1624
+ }
1625
+
1626
+ return tooltip ? [valueElement, tooltip] : [valueElement];
1624
1627
  }
1625
1628
 
1626
1629
  async #applyEvaluation(
@@ -1635,25 +1638,26 @@ export class LengthRenderer extends rendererBase(SDK.CSSPropertyParserMatchers.L
1635
1638
  return false;
1636
1639
  }
1637
1640
 
1638
- async #attachPopover(
1639
- valueElement: HTMLElement, match: SDK.CSSPropertyParser.Match, context: RenderingContext): Promise<void> {
1640
- const pixelValue = await resolveValues(this.#stylesPane, this.#propertyName, match, context, match.text);
1641
- if (!pixelValue) {
1642
- return;
1643
- }
1644
-
1641
+ #getTooltip(valueElement: HTMLElement, match: SDK.CSSPropertyParser.Match, context: RenderingContext):
1642
+ Tooltips.Tooltip.Tooltip|undefined {
1645
1643
  const tooltipId = this.#treeElement?.getTooltipId('length');
1646
- if (tooltipId) {
1647
- valueElement.setAttribute('aria-details', tooltipId);
1648
- const tooltip = new Tooltips.Tooltip.Tooltip(
1649
- {anchor: valueElement, variant: 'rich', id: tooltipId, jslogContext: 'length-popover'});
1650
- tooltip.appendChild(document.createTextNode(pixelValue[0]));
1651
- valueElement.insertAdjacentElement('afterend', tooltip);
1644
+ if (!tooltipId) {
1645
+ return undefined;
1652
1646
  }
1653
- this.popOverAttachedForTest();
1647
+ valueElement.setAttribute('aria-details', tooltipId);
1648
+ const tooltip = new Tooltips.Tooltip.Tooltip(
1649
+ {anchor: valueElement, variant: 'rich', id: tooltipId, jslogContext: 'length-popover'});
1650
+ tooltip.addEventListener('beforetoggle', () => this.getTooltipValue(tooltip, match, context), {once: true});
1651
+ return tooltip;
1654
1652
  }
1655
1653
 
1656
- popOverAttachedForTest(): void {
1654
+ async getTooltipValue(
1655
+ tooltip: Tooltips.Tooltip.Tooltip, match: SDK.CSSPropertyParser.Match, context: RenderingContext): Promise<void> {
1656
+ const pixelValue = await resolveValues(this.#stylesPane, this.#propertyName, match, context, match.text);
1657
+ if (!pixelValue) {
1658
+ return;
1659
+ }
1660
+ tooltip.appendChild(document.createTextNode(pixelValue[0]));
1657
1661
  }
1658
1662
  }
1659
1663
 
@@ -370,7 +370,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
370
370
  }
371
371
 
372
372
  private sectionsContainerKeyDown(event: Event): void {
373
- const activeElement = Platform.DOMUtilities.deepActiveElement(this.sectionsContainer.contentElement.ownerDocument);
373
+ const activeElement = UI.DOMUtilities.deepActiveElement(this.sectionsContainer.contentElement.ownerDocument);
374
374
  if (!activeElement) {
375
375
  return;
376
376
  }
@@ -85,6 +85,6 @@
85
85
  }
86
86
  }
87
87
 
88
- ::highlight(css-value-tracing) {
88
+ :host::highlight(css-value-tracing) {
89
89
  background-color: var(--sys-color-tonal-container);
90
90
  }
@@ -7,7 +7,6 @@ import * as i18n from '../../core/i18n/i18n.js';
7
7
  import * as Root from '../../core/root/root.js';
8
8
  import * as SDK from '../../core/sdk/sdk.js';
9
9
  import * as UI from '../../ui/legacy/legacy.js';
10
- import type * as PanelsCommon from '../common/common.js';
11
10
 
12
11
  import type * as Elements from './elements.js';
13
12
 
@@ -178,14 +177,6 @@ function maybeRetrieveContextTypes<T = unknown>(getClassCallBack: (elementsModul
178
177
  return getClassCallBack(loadedElementsModule);
179
178
  }
180
179
 
181
- let loadedPanelsCommonModule: (typeof PanelsCommon|undefined);
182
- async function loadPanelsCommonModule(): Promise<typeof PanelsCommon> {
183
- if (!loadedPanelsCommonModule) {
184
- loadedPanelsCommonModule = await import('../common/common.js');
185
- }
186
- return loadedPanelsCommonModule;
187
- }
188
-
189
180
  UI.ViewManager.registerViewExtension({
190
181
  location: UI.ViewManager.ViewLocationValues.PANEL,
191
182
  id: 'elements',
@@ -463,6 +454,7 @@ UI.ActionRegistration.registerActionExtension({
463
454
  platform: UI.ActionRegistration.Platforms.MAC,
464
455
  },
465
456
  ],
457
+ configurableBindings: false,
466
458
  });
467
459
 
468
460
  UI.ActionRegistration.registerActionExtension({
@@ -698,16 +690,3 @@ UI.UIUtils.registerRenderer({
698
690
  return Elements.ElementsTreeOutlineRenderer.Renderer.instance();
699
691
  },
700
692
  });
701
-
702
- Common.Linkifier.registerLinkifier({
703
- contextTypes() {
704
- return [
705
- SDK.DOMModel.DOMNode,
706
- SDK.DOMModel.DeferredDOMNode,
707
- ];
708
- },
709
- async loadLinkifier() {
710
- const PanelsCommon = await loadPanelsCommonModule();
711
- return PanelsCommon.DOMLinkifier.Linkifier.instance();
712
- },
713
- });