chrome-devtools-frontend 1.0.1698733 → 1.0.1699061

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 (59) hide show
  1. package/.agents/skills/devtools-verification/SKILL.md +19 -0
  2. package/.agents/skills/{repro-flaky-tests → fix-tests}/SKILL.md +2 -2
  3. package/front_end/core/sdk/DOMModel.ts +3 -5
  4. package/front_end/core/sdk/NetworkManager.ts +2 -2
  5. package/front_end/core/sdk/OverlayModel.ts +11 -12
  6. package/front_end/core/sdk/SourceMapScopeChainEntry.ts +84 -32
  7. package/front_end/models/emulation/DeviceModeModel.ts +1 -1
  8. package/front_end/models/issues_manager/CookieIssue.ts +0 -13
  9. package/front_end/models/source_map_scopes/NamesResolver.ts +11 -3
  10. package/front_end/models/source_map_scopes/ScopeChainModel.ts +10 -6
  11. package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingView.ts +281 -3
  12. package/front_end/panels/accessibility/accessibilityAnnouncementRecordingView.css +85 -0
  13. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +1 -2
  14. package/front_end/panels/animation/AnimationTimeline.ts +1 -1
  15. package/front_end/panels/application/CrashReportContextView.ts +1 -1
  16. package/front_end/panels/application/IndexedDBViews.ts +1 -1
  17. package/front_end/panels/application/KeyValueStorageItemsView.ts +1 -0
  18. package/front_end/panels/application/components/AdsView.ts +63 -1
  19. package/front_end/panels/application/components/adsView.css +11 -1
  20. package/front_end/panels/common/CommentThreadWidget.ts +1 -16
  21. package/front_end/panels/common/commentThreadWidget.css +0 -12
  22. package/front_end/panels/elements/CSSRuleValidator.ts +1 -1
  23. package/front_end/panels/elements/ElementsPanel.ts +4 -4
  24. package/front_end/panels/elements/ElementsTreeElement.ts +7 -2
  25. package/front_end/panels/elements/ElementsTreeOutline.ts +14 -26
  26. package/front_end/panels/elements/elementsTreeOutline.css +4 -4
  27. package/front_end/panels/lighthouse/LighthouseController.ts +1 -1
  28. package/front_end/panels/mobile_throttling/NetworkPanelIndicator.ts +1 -1
  29. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +1 -1
  30. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +1 -1
  31. package/front_end/panels/recorder/StepView.ts +19 -4
  32. package/front_end/panels/recorder/TimelineSection.ts +1 -1
  33. package/front_end/panels/settings/BackendLinkingSettingsTab.ts +2 -1
  34. package/front_end/panels/settings/EditFileSystemView.ts +1 -1
  35. package/front_end/panels/sources/CallStackSidebarPane.ts +1 -1
  36. package/front_end/panels/sources/DebuggerPlugin.ts +1 -1
  37. package/front_end/panels/timeline/components/DetailsView.ts +3 -3
  38. package/front_end/panels/timeline/components/OriginMap.ts +1 -1
  39. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -3
  40. package/front_end/third_party/chromium/README.chromium +1 -1
  41. package/front_end/ui/components/buttons/Button.ts +19 -1
  42. package/front_end/ui/legacy/ContextMenu.ts +16 -1
  43. package/front_end/ui/legacy/PlusButton.ts +5 -6
  44. package/front_end/ui/legacy/Treeoutline.ts +2 -0
  45. package/front_end/ui/legacy/Widget.ts +33 -0
  46. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +3 -0
  47. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +14 -4
  48. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +22 -25
  49. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
  50. package/package.json +1 -1
  51. package/.agents/skills/devtools-ci/SKILL.md +0 -65
  52. package/.agents/skills/evaluate-ai-css-completion/SKILL.md +0 -143
  53. package/.agents/skills/evaluate-ai-css-completion/scripts/evaluate.js +0 -104
  54. package/.agents/skills/fixing-skipped-tests/SKILL.md +0 -32
  55. package/.agents/skills/gerrit-cli/SKILL.md +0 -74
  56. package/.agents/skills/gerrit-cli/references/commands.md +0 -169
  57. package/.agents/skills/gerrit-cli/references/workflows.md +0 -63
  58. package/.agents/skills/gerrit-cli/scripts/import_upstream.py +0 -85
  59. package/front_end/models/issues_manager/descriptions/cookieExcludeBlockedWithinRelatedWebsiteSet.md +0 -4
@@ -16,10 +16,6 @@ import commentThreadWidgetStyles from './commentThreadWidget.css.js';
16
16
  const {html, render, Directives: {createRef, ref}} = Lit;
17
17
 
18
18
  const UIStrings = {
19
- /**
20
- * @description Link text in the info tooltip for learning more about comments sent to the agent.
21
- */
22
- learnMore: 'Learn more',
23
19
  /**
24
20
  * @description Text next to the checkmark in the comment thread header indicating that comments have been sent to
25
21
  * the agent.
@@ -49,7 +45,7 @@ const UIStringsNotTranslate = {
49
45
  * @description Disclaimer text in the comment thread info tooltip.
50
46
  */
51
47
  inputDisclaimer:
52
- 'Comment strings, DOM hierarchy snippets, tracked CSS and DOM changes, Visual Element (VE) paths and signatures, and tracked presenter changes are sent to the connected third-party agent to assist with debugging and code updates.',
48
+ 'Comment strings, DOM hierarchy snippets, tracked CSS and DOM changes, Visual Element (VE) paths and signatures, and tracked presenter changes are sent to the connected third-party agent to assist with debugging and code updates',
53
49
  } as const;
54
50
 
55
51
  const str_ = i18n.i18n.registerUIStrings('panels/common/CommentThreadWidget.ts', UIStrings);
@@ -61,7 +57,6 @@ export interface ViewInput {
61
57
  comments: CommentManager.CommentManager.Comment[];
62
58
  commentText: string;
63
59
  textAreaRef: Lit.Directives.Ref<HTMLTextAreaElement>;
64
- onLearnMoreClick: () => void;
65
60
  onAddComment: (text: string) => void;
66
61
  onCommentTextChange: (event: Event) => void;
67
62
  }
@@ -139,11 +134,6 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
139
134
  >
140
135
  <div class="info-tooltip-container">
141
136
  ${lockedString(UIStringsNotTranslate.inputDisclaimer)}
142
- <button
143
- class="tooltip-link"
144
- role="link"
145
- @click=${input.onLearnMoreClick}
146
- >${i18nString(UIStrings.learnMore)}</button>
147
137
  </div>
148
138
  </devtools-tooltip>
149
139
  <devtools-button
@@ -187,10 +177,6 @@ export class CommentThreadWidget extends UI.Widget.Widget {
187
177
  this.requestUpdate();
188
178
  }
189
179
 
190
- #handleLearnMoreClick = (): void => {
191
- // TODO: wire up the learn more click
192
- };
193
-
194
180
  #handleAddComment = (text: string): void => {
195
181
  const commentText = text.trim();
196
182
  if (commentText && this.onAddComment) {
@@ -212,7 +198,6 @@ export class CommentThreadWidget extends UI.Widget.Widget {
212
198
  comments: this.#comments,
213
199
  commentText: this.#commentText,
214
200
  textAreaRef: this.#textAreaRef,
215
- onLearnMoreClick: this.#handleLearnMoreClick,
216
201
  onAddComment: this.#handleAddComment,
217
202
  onCommentTextChange: this.#handleCommentTextChange,
218
203
  };
@@ -153,18 +153,6 @@
153
153
  padding: var(--sys-size-4) var(--sys-size-5);
154
154
  }
155
155
 
156
- .tooltip-link {
157
- display: block;
158
- margin-top: var(--sys-size-4);
159
- color: var(--sys-color-primary);
160
- padding-left: 0;
161
- background: none;
162
- border: none;
163
- font: inherit;
164
- text-decoration: underline;
165
- cursor: pointer;
166
- }
167
-
168
156
  .selected-item-text {
169
157
  overflow: hidden;
170
158
  white-space: nowrap;
@@ -72,7 +72,7 @@ const UIStrings = {
72
72
  * @example {Arial} PH5
73
73
  */
74
74
  fontVariationSettingsWarning:
75
- 'Value for setting "{PH1}" {PH2} is outside the supported range [{PH3}, {PH4}] for font-family "{PH5}"',
75
+ 'Value for setting "{PH1}" {PH2} is outside the supported range [{PH3}, {PH4}] for font-family "{PH5}".',
76
76
  /**
77
77
  * @description The message shown in the Styles tab when the user hovers over a property declaration that has no effect on flex or grid child items.
78
78
  * @example {flex} CONTAINER_DISPLAY_NAME
@@ -868,7 +868,8 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
868
868
 
869
869
  // If any of these properties are undefined or reset to an invalid value,
870
870
  // this means the search/highlight request is outdated.
871
- const highlightRequestValid = this.searchConfig && this.searchResults && (this.currentSearchResultIndex !== -1);
871
+ const highlightRequestValid =
872
+ this.searchConfig && this.searchResults && (this.currentSearchResultIndex === index);
872
873
  if (highlightRequestValid) {
873
874
  this.highlightCurrentSearchResult();
874
875
  }
@@ -877,12 +878,11 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
877
878
  }
878
879
 
879
880
  void searchResult.node.scrollIntoView();
880
- if (searchResult.node) {
881
- this.#domTreeWidget.highlightMatch(searchResult.node, this.searchConfig?.query);
882
- }
881
+ this.#domTreeWidget.highlightMatch(searchResult.node, this.searchConfig?.query);
883
882
  }
884
883
 
885
884
  private hideSearchHighlights(): void {
885
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(this.#targetManager);
886
886
  if (!this.searchResults?.length || this.currentSearchResultIndex === -1) {
887
887
  return;
888
888
  }
@@ -1821,11 +1821,16 @@ export class ElementsTreeWidget extends UI.Widget.Widget {
1821
1821
  }
1822
1822
  }
1823
1823
 
1824
- hideSearchHighlights(): void {
1824
+ #clearHighlights(): void {
1825
1825
  Highlighting.HighlightManager.HighlightManager.instance().removeHighlights(this.#highlights);
1826
1826
  this.#highlights = [];
1827
1827
  }
1828
1828
 
1829
+ hideSearchHighlights(): void {
1830
+ this.#searchQuery = null;
1831
+ this.#clearHighlights();
1832
+ }
1833
+
1829
1834
  setInClipboard(inClipboard: boolean): void {
1830
1835
  if (this.inClipboard === inClipboard) {
1831
1836
  return;
@@ -2949,7 +2954,7 @@ export class ElementsTreeWidget extends UI.Widget.Widget {
2949
2954
  }
2950
2955
 
2951
2956
  #highlightSearchResults(): void {
2952
- this.hideSearchHighlights();
2957
+ this.#clearHighlights();
2953
2958
 
2954
2959
  if (!this.searchQuery) {
2955
2960
  return;
@@ -919,6 +919,7 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
919
919
  // clang-format off
920
920
  return html`
921
921
  <li role="treeitem"
922
+ selectable=${input.selectEnabled ? 'true' : 'false'}
922
923
  ?selected=${isSelected && !input.selectedClosingTag}
923
924
  class=${classes}
924
925
  style=${styleMap({'--indent': `${computeLeftIndent(depth, isExpandable)}px`})}
@@ -933,8 +934,7 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
933
934
  @dragleave=${on(onDragLeave)}
934
935
  @drop=${on(onDrop)}
935
936
  @dragend=${on(onDragEnd)}
936
- jslog=${treeItemJslog(undefined, true)}>
937
- ${UI.Widget.widget(ElementsTreeWidget, {
937
+ jslog=${treeItemJslog(undefined, true)}>${UI.Widget.widget(ElementsTreeWidget, {
938
938
  node,
939
939
  isClosingTag: false,
940
940
  renderSelection: false,
@@ -976,32 +976,28 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
976
976
  }
977
977
  },
978
978
  updateRecord: input.updateRecordForNode?.(node) ?? null,
979
- })}
980
- ${hasChildren ? html`
981
- <ul role="group">
979
+ })}${hasChildren ? html`<ul role="group">
982
980
  ${UI.TreeOutline.ifExpanded(html`
983
981
  ${node.adoptedStyleSheetsForNode.length > 0 ? renderAdoptedStyleSheets(node, depth + 1) : nothing}
984
982
  ${repeat(children, child => child.id, child => renderNode(child, depth + 1))}
985
983
  ${remainingChildrenCount > 0 ? html`
986
984
  <li role="treeitem"
985
+ selectable="false"
987
986
  class="elements-tree-expand-all"
988
987
  style=${styleMap({'--indent': `${computeLeftIndent(depth + 1, false)}px`})}
989
- jslog=${treeItemJslog('show-all-nodes')}>
990
- <devtools-button
988
+ jslog=${treeItemJslog('show-all-nodes')}><devtools-button
991
989
  .variant=${Buttons.Button.Variant.OUTLINED}
992
990
  title=${i18nString(UIStrings.showAllNodesDMore, {PH1: remainingChildrenCount})}
993
991
  @click=${on((event: Event) => {
994
992
  event.stopPropagation();
995
993
  input.onExpandAllChildren?.(node);
996
- })}>
997
- ${i18nString(UIStrings.showAllNodesDMore, {PH1: remainingChildrenCount})}
998
- </devtools-button>
999
- </li>
994
+ })}>${i18nString(UIStrings.showAllNodesDMore, {PH1: remainingChildrenCount})}</devtools-button></li>
1000
995
  ` : nothing}
1001
996
  ${node.isInsertionPoint() ? node.distributedNodes().map(distributedNode => renderShortcut(distributedNode, depth + 1)) : nothing}
1002
997
  ${node instanceof SDK.DOMModel.DOMDocument ? renderTopLayerContainer(node, depth + 1) : nothing}
1003
998
  ${needsClosingTag ? html`
1004
999
  <li role="treeitem"
1000
+ selectable=${input.selectEnabled ? 'true' : 'false'}
1005
1001
  ?selected=${isSelected && Boolean(input.selectedClosingTag)}
1006
1002
  class=${classMap({
1007
1003
  selected: isSelected && Boolean(input.selectedClosingTag),
@@ -1018,8 +1014,7 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
1018
1014
  @dragover=${on(onClosingTagDragOver)}
1019
1015
  @dragleave=${on(onDragLeave)}
1020
1016
  @drop=${on(onClosingTagDrop)}
1021
- @dragend=${on(onDragEnd)}>
1022
- ${UI.Widget.widget(ElementsTreeWidget, {
1017
+ @dragend=${on(onDragEnd)}>${UI.Widget.widget(ElementsTreeWidget, {
1023
1018
  node,
1024
1019
  isClosingTag: true,
1025
1020
  renderSelection: false,
@@ -1037,13 +1032,10 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
1037
1032
  }
1038
1033
  },
1039
1034
  updateRecord: input.updateRecordForNode?.(node) ?? null,
1040
- })}
1041
- </li>
1035
+ })}</li>
1042
1036
  ` : nothing}
1043
1037
  `)}
1044
- </ul>
1045
- ` : nothing}
1046
- </li>
1038
+ </ul>` : nothing}</li>
1047
1039
  `;
1048
1040
  // clang-format on
1049
1041
  };
@@ -1096,19 +1088,16 @@ export const DECLARATIVE_VIEW: View = (input: ViewInput, _output: ViewOutput, ta
1096
1088
  const root = input.rootDOMNode;
1097
1089
  return html`
1098
1090
  <li role="treeitem"
1091
+ selectable="false"
1099
1092
  class="elements-tree-expand-all"
1100
1093
  style=${styleMap({'--indent': `${computeLeftIndent(0, false)}px`})}
1101
- jslog=${treeItemJslog('show-all-nodes')}>
1102
- <devtools-button
1094
+ jslog=${treeItemJslog('show-all-nodes')}><devtools-button
1103
1095
  .variant=${Buttons.Button.Variant.OUTLINED}
1104
1096
  title=${i18nString(UIStrings.showAllNodesDMore, {PH1: remaining})}
1105
1097
  @click=${on((event: Event) => {
1106
1098
  event.stopPropagation();
1107
1099
  input.onExpandAllChildren?.(root);
1108
- })}>
1109
- ${i18nString(UIStrings.showAllNodesDMore, {PH1: remaining})}
1110
- </devtools-button>
1111
- </li>
1100
+ })}>${i18nString(UIStrings.showAllNodesDMore, {PH1: remaining})}</devtools-button></li>
1112
1101
  `;
1113
1102
  })() : nothing}
1114
1103
  ${input.omitRootDOMNode && input.rootDOMNode instanceof SDK.DOMModel.DOMDocument ? renderTopLayerContainer(input.rootDOMNode, 0) : nothing}
@@ -2326,9 +2315,8 @@ export class DOMTreeWidget extends UI.Widget.Widget {
2326
2315
  this.#searchMatchQuery = query ?? null;
2327
2316
  if (this.selectedDOMNode() !== node) {
2328
2317
  this.selectDOMNode(node, /* focus= */ false);
2329
- } else {
2330
- this.performUpdate();
2331
2318
  }
2319
+ this.performUpdate();
2332
2320
  }
2333
2321
 
2334
2322
  hideMatchHighlights(node: SDK.DOMModel.DOMNode): void {
@@ -88,6 +88,10 @@
88
88
  display: flex;
89
89
  }
90
90
 
91
+ .elements-disclosure li .tree-element-title {
92
+ display: contents;
93
+ }
94
+
91
95
  .elements-disclosure li.parent:not(.always-parent) {
92
96
  /** Keep it in sync with ElementsTreeElements.updateDecorations **/
93
97
  margin-left: calc(-1 * var(--sys-size-6));
@@ -629,7 +633,3 @@ li.hovered:not(.always-parent) + ol.children:not(.shadow-root) {
629
633
  .tree-outline-disclosure li.in-clipboard .highlight {
630
634
  outline: 1px dotted var(--sys-color-divider);
631
635
  }
632
-
633
- .tree-outline-disclosure li.elements-tree-expand-all {
634
- margin: var(--sys-size-2) 0;
635
- }
@@ -40,7 +40,7 @@ const UIStrings = {
40
40
  /**
41
41
  * @description Help text in the Lighthouse panel.
42
42
  */
43
- atLeastOneCategoryMustBeSelected: 'At least one category must be selected.',
43
+ atLeastOneCategoryMustBeSelected: 'At least one category must be selected',
44
44
  /**
45
45
  * @description Text in sidebar of the Application panel.
46
46
  */
@@ -15,7 +15,7 @@ const UIStrings = {
15
15
  /**
16
16
  * @description Icon title for warning indicator in the Network panel title.
17
17
  */
18
- requestsMayBeOverridden: 'Requests may be overridden locally. See the Sources panel',
18
+ requestsMayBeOverridden: 'Requests may be overridden locally. See the Sources panel.',
19
19
  /**
20
20
  * @description Icon title for warning indicator in the Network panel title.
21
21
  */
@@ -42,7 +42,7 @@ const UIStrings = {
42
42
  /**
43
43
  * @description Tooltip text in throttling manager of the Performance panel.
44
44
  */
45
- excessConcurrency: 'Exceeding the default value may degrade system performance.',
45
+ excessConcurrency: 'Exceeding the default value may degrade system performance',
46
46
  /**
47
47
  * @description Tooltip text in throttling manager of the Performance panel.
48
48
  */
@@ -159,7 +159,7 @@ const UIStrings = {
159
159
  * @description Text to explain why the user should run the CPU calibration process.
160
160
  */
161
161
  calibrationCTA:
162
- 'To use the CPU throttling presets, run the calibration process to determine the ideal throttling rate for your device.',
162
+ 'To use the CPU throttling presets, run the calibration process to determine the ideal throttling rate for your device',
163
163
  /**
164
164
  * @description Text to explain what CPU throttling presets are.
165
165
  */
@@ -18,6 +18,7 @@ import stepViewStyles from './stepView.css.js';
18
18
  import {TimelineSection} from './TimelineSection.js';
19
19
 
20
20
  const {html} = Lit;
21
+ const {ifDefined} = Lit.Directives;
21
22
  const {widget} = UI.Widget;
22
23
 
23
24
  const UIStrings = {
@@ -276,8 +277,7 @@ function renderStepActions(input: ViewInput): Lit.TemplateResult|null {
276
277
  return html`
277
278
  <devtools-menu-button
278
279
  class="step-actions"
279
- title=${i18nString(UIStrings.openStepActions)}
280
- aria-label=${i18nString(UIStrings.openStepActions)}
280
+ .accessibleLabel=${i18nString(UIStrings.openStepActions)}
281
281
  .populateMenuCall=${input.populateStepContextMenu}
282
282
  @keydown=${(event: Event) => {
283
283
  event.stopPropagation();
@@ -312,6 +312,8 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
312
312
  section: input.section,
313
313
  });
314
314
  const subtitle = input.step ? getSelectorPreview(input.step) : getSectionPreview(input.section);
315
+ const breakpointTitle =
316
+ input.hasBreakpoint ? i18nString(UIStrings.removeBreakpoint) : i18nString(UIStrings.addBreakpoint);
315
317
 
316
318
  // clang-format off
317
319
  Lit.render(
@@ -347,13 +349,26 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
347
349
  }
348
350
  }}
349
351
  class=${Lit.Directives.classMap(stepClasses)}>
350
- <svg slot="icon" width="24" height="24" class="icon">
352
+ <svg slot="icon" width="24" height="24" class="icon"
353
+ role=${input.step ? 'button' : 'presentation'}
354
+ aria-label=${ifDefined(input.step ? breakpointTitle : undefined)}
355
+ aria-hidden=${ifDefined(input.step ? undefined : 'true')}
356
+ tabindex=${ifDefined(input.step ? 0 : undefined)}
357
+ @click=${input.step ? input.onBreakpointClick : undefined}
358
+ @keydown=${input.step ? (event: KeyboardEvent) => {
359
+ if (event.key === 'Enter' || event.key === ' ') {
360
+ input.onBreakpointClick();
361
+ event.preventDefault();
362
+ event.stopPropagation();
363
+ }
364
+ } : undefined}
365
+ jslog=${ifDefined(input.step ? VisualLogging.action('breakpoint').track({click: true}) : undefined)}>
351
366
  <circle class="circle-icon"/>
352
367
  <g class="error-icon">
353
368
  <path d="M1.5 1.5L6.5 6.5" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
354
369
  <path d="M1.5 6.5L6.5 1.5" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
355
370
  </g>
356
- <path @click=${input.onBreakpointClick} jslog=${VisualLogging.action('breakpoint').track({click: true})} class="breakpoint-icon" d="M2.5 5.5H17.7098L21.4241 12L17.7098 18.5H2.5V5.5Z"/>
371
+ <path class="breakpoint-icon" d="M2.5 5.5H17.7098L21.4241 12L17.7098 18.5H2.5V5.5Z"/>
357
372
  </svg>
358
373
  <div class="summary">
359
374
  <div class="title-container ${isExpandable ? 'action' : ''}"
@@ -37,7 +37,7 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
37
37
  <div class=${Lit.Directives.classMap(classes)}>
38
38
  <div class="overlay"></div>
39
39
  <div class="icon"><slot name="icon"></slot></div>
40
- <svg width="24" height="100%" class="bar">
40
+ <svg width="24" height="100%" class="bar" aria-hidden="true">
41
41
  <rect class="line" x="7" y="0" width="2" height="100%" />
42
42
  </svg>
43
43
  <slot></slot>
@@ -93,7 +93,7 @@ const UIStrings = {
93
93
  /**
94
94
  * @description Warning message displayed below the backend linking rules table when one or more rules are invalid.
95
95
  */
96
- invalidRulesWarning: 'Invalid rules will not be applied or saved.',
96
+ invalidRulesWarning: 'Invalid rules will not be applied or saved',
97
97
  } as const;
98
98
 
99
99
  const str_ = i18n.i18n.registerUIStrings('panels/settings/BackendLinkingSettingsTab.ts', UIStrings);
@@ -168,6 +168,7 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
168
168
  name=${i18nString(UIStrings.rulesSectionHeading)}
169
169
  striped
170
170
  inline
171
+ deletable
171
172
  @delete=${() => {}}
172
173
  @create=${onCreate}>
173
174
  <table>
@@ -78,7 +78,7 @@ export const DEFAULT_VIEW: View = (input, _output, target) => {
78
78
  @create=${input.onCreate}
79
79
  class="exclude-subfolders-table"
80
80
  parts="excluded-folder-row-with-error"
81
- inline striped>
81
+ inline striped deletable>
82
82
  <table>
83
83
  <thead>
84
84
  <tr>
@@ -79,7 +79,7 @@ const UIStrings = {
79
79
  * @description Error message that is displayed in UI when a file needed for debugging information for a call frame is missing
80
80
  * @example {src/myapp.debug.wasm.dwp} PH1
81
81
  */
82
- debugFileNotFound: 'Failed to load debug file "{PH1}".',
82
+ debugFileNotFound: 'Failed to load debug file "{PH1}"',
83
83
  /**
84
84
  * @description A context menu item in the call stack sidebar pane. "Restart" is a verb and
85
85
  * "frame" is a noun. "Frame" refers to an individual item in the call stack, i.e. a call frame.
@@ -138,7 +138,7 @@ const UIStrings = {
138
138
  * @description Error message that is displayed in UI when a file needed for debugging information for a call frame is missing.
139
139
  * @example {src/myapp.debug.wasm.dwp} PH1
140
140
  */
141
- debugFileNotFound: 'Failed to load debug file "{PH1}".',
141
+ debugFileNotFound: 'Failed to load debug file "{PH1}"',
142
142
  /**
143
143
  * @description Error message that is displayed when no debug info could be loaded.
144
144
  * @example {app.wasm} PH1
@@ -25,7 +25,7 @@ const UIStrings = {
25
25
  * @description Warning message indicating that an event is likely a performance bottleneck in the Performance panel.
26
26
  * @example {Forced reflow} PH1
27
27
  */
28
- sIsALikelyPerformanceBottleneck: '{PH1} is a likely performance bottleneck.',
28
+ sIsALikelyPerformanceBottleneck: '{PH1} is a likely performance bottleneck',
29
29
  /**
30
30
  * @description Warning message in the Performance panel for an idle callback function that took longer to execute than its predefined deadline.
31
31
  * @example {10ms} PH1
@@ -36,7 +36,7 @@ const UIStrings = {
36
36
  * @example {Task} PH1
37
37
  * @example {10ms} PH2
38
38
  */
39
- sTookS: '{PH1} took {PH2}.',
39
+ sTookS: '{PH1} took {PH2}',
40
40
  /**
41
41
  * @description Label in the Performance panel for a task that took a long time.
42
42
  */
@@ -49,7 +49,7 @@ const UIStrings = {
49
49
  * @description Warning message in the Performance panel indicating that an interaction caused poor responsiveness.
50
50
  * @example {Long interaction} PH1
51
51
  */
52
- sIsLikelyPoorPageResponsiveness: '{PH1} indicates poor page responsiveness.',
52
+ sIsLikelyPoorPageResponsiveness: '{PH1} indicates poor page responsiveness',
53
53
  /**
54
54
  * @description Label for the WebSocket sub-protocol in the event details view of the Performance panel.
55
55
  */
@@ -115,7 +115,7 @@ export const DEFAULT_VIEW: View = (input, _output, target) => {
115
115
  }
116
116
  // clang-format off
117
117
  Lit.render(html`
118
- <devtools-data-grid striped inline
118
+ <devtools-data-grid striped inline deletable
119
119
  @click=${(e: Event) => { e.stopPropagation(); }}
120
120
  @create=${input.onCreate}>
121
121
  <table>
@@ -57,7 +57,7 @@ const UIStrings = {
57
57
  * @description Accessible label for the button to expand an insight to view details in the Performance panel sidebar.
58
58
  * @example {LCP breakdown} PH1
59
59
  */
60
- viewDetails: 'View details for {PH1} insight.',
60
+ viewDetails: 'View details for {PH1} insight',
61
61
  } as const;
62
62
 
63
63
  const str_ = i18n.i18n.registerUIStrings('panels/timeline/components/insights/BaseInsightComponent.ts', UIStrings);
@@ -108,8 +108,7 @@ const DEFAULT_VIEW: View = (input, _output, target) => {
108
108
 
109
109
  let ariaLabel = `${i18nString(UIStrings.viewDetails, {PH1: model.title})}`;
110
110
  if (estimatedSavingsAriaLabel) {
111
- // space prefix is deliberate to add a gap after the view details text
112
- ariaLabel += ` ${estimatedSavingsAriaLabel}`;
111
+ ariaLabel += `. ${estimatedSavingsAriaLabel}`;
113
112
  }
114
113
 
115
114
  function renderInsightContent(): Lit.LitTemplate {
@@ -1,7 +1,7 @@
1
1
  Name: Dependencies sourced from the upstream `chromium` repository
2
2
  URL: Internal
3
3
  Version: N/A
4
- Revision: 87625275b7c30150efc10c7dbf7c86982459704f
4
+ Revision: 02dcd5e6b2a012fb40e5273996867ae1a87574d0
5
5
  Update Mechanism: Manual (https://crbug.com/428069060)
6
6
  License: BSD-3-Clause
7
7
  License File: LICENSE
@@ -48,6 +48,7 @@ interface ButtonState {
48
48
  variant: Variant;
49
49
  size?: Size;
50
50
  reducedFocusRing?: boolean;
51
+ buttonTitle?: string;
51
52
  disabled: boolean;
52
53
  toggled?: boolean;
53
54
  toggleOnClick?: boolean;
@@ -80,7 +81,14 @@ interface CommonButtonData {
80
81
  spinner?: boolean;
81
82
  type?: ButtonType;
82
83
  value?: string;
84
+ /**
85
+ * Sets title on the host and, unless buttonTitle is provided, the internal <button> element.
86
+ */
83
87
  title?: string;
88
+ /**
89
+ * Sets title on the internal <button> element, taking precedence over title.
90
+ */
91
+ buttonTitle?: string;
84
92
  jslogContext?: string;
85
93
  longClickable?: boolean;
86
94
  inverseColorTheme?: boolean;
@@ -166,6 +174,7 @@ export class Button extends HTMLElement {
166
174
  if (data.title) {
167
175
  this.title = data.title;
168
176
  }
177
+ this.#props.buttonTitle = data.buttonTitle;
169
178
 
170
179
  if (data.accessibleLabel) {
171
180
  this.accessibleLabel = data.accessibleLabel;
@@ -245,6 +254,15 @@ export class Button extends HTMLElement {
245
254
  this.#render();
246
255
  }
247
256
 
257
+ get buttonTitle(): string|undefined {
258
+ return this.#props.buttonTitle;
259
+ }
260
+
261
+ set buttonTitle(buttonTitle: string|undefined) {
262
+ this.#props.buttonTitle = buttonTitle;
263
+ this.#render();
264
+ }
265
+
248
266
  get disabled(): boolean {
249
267
  return this.#props.disabled;
250
268
  }
@@ -396,7 +414,7 @@ export class Button extends HTMLElement {
396
414
  Lit.render(
397
415
  html`
398
416
  <style>${buttonStyles}</style>
399
- <button title=${ifDefined(this.title || undefined)}
417
+ <button title=${ifDefined(this.buttonTitle || this.title || undefined)}
400
418
  ?disabled=${this.#props.disabled}
401
419
  class=${classMap(classes)}
402
420
  aria-pressed=${ifDefined(this.#props.toggled)}
@@ -989,6 +989,7 @@ export class ContextMenu extends SubMenu {
989
989
  * @property keepOpen -Reflects the `"keep-open"` attribute.
990
990
  * @property iconName - Reflects the `"icon-name"` attribute.
991
991
  * @property disabled - Reflects the `"disabled"` attribute.
992
+ * @property accessibleLabel - Sets the accessible name and tooltip on the internal button.
992
993
  * @attribute soft-menu - Whether to use the soft menu implementation.
993
994
  * @attribute keep-open - Whether the menu should stay open after an item is clicked.
994
995
  * @attribute icon-name - Name of the icon to display on the button.
@@ -1001,6 +1002,7 @@ export class MenuButton extends HTMLElement {
1001
1002
  readonly #shadow = this.attachShadow({mode: 'open'});
1002
1003
  #triggerTimeoutId?: number;
1003
1004
  #populateMenuCall?: (arg0: ContextMenu) => void;
1005
+ #accessibleLabel?: string;
1004
1006
 
1005
1007
  /**
1006
1008
  * Sets the callback function used to populate the context menu when the button is clicked.
@@ -1010,6 +1012,17 @@ export class MenuButton extends HTMLElement {
1010
1012
  this.#populateMenuCall = populateCall;
1011
1013
  }
1012
1014
 
1015
+ set accessibleLabel(accessibleLabel: string|undefined) {
1016
+ this.#accessibleLabel = accessibleLabel;
1017
+ if (this.iconName) {
1018
+ this.#render();
1019
+ }
1020
+ }
1021
+
1022
+ get accessibleLabel(): string|undefined {
1023
+ return this.#accessibleLabel;
1024
+ }
1025
+
1013
1026
  /**
1014
1027
  * Reflects the `soft-menu` attribute. If true, uses the `SoftContextMenu` implementation.
1015
1028
  * @default false
@@ -1120,13 +1133,15 @@ export class MenuButton extends HTMLElement {
1120
1133
  if (!this.iconName) {
1121
1134
  throw new Error('<devtools-menu-button> expects an icon.');
1122
1135
  }
1136
+ const accessibleLabel = this.accessibleLabel ?? this.title;
1123
1137
 
1124
1138
  // clang-format off
1125
1139
  render(html`
1126
1140
  <devtools-button .disabled=${this.disabled}
1127
1141
  .iconName=${this.iconName}
1128
1142
  .variant=${Buttons.Button.Variant.ICON}
1129
- .title=${this.title}
1143
+ .accessibleLabel=${accessibleLabel}
1144
+ .buttonTitle=${accessibleLabel}
1130
1145
  aria-haspopup='menu'
1131
1146
  @click=${this.#triggerContextMenu}>
1132
1147
  </devtools-button>`,
@@ -233,19 +233,18 @@ interface PlusButtonViewInput {
233
233
  */
234
234
  export const PLUS_BUTTON_VIEW =
235
235
  (input: PlusButtonViewInput, output: {button?: MenuButton}, target: HTMLElement): void => {
236
- render(
237
- html`
236
+ render(html`
238
237
  <devtools-menu-button
239
238
  ${Directives.ref(el => {
240
- output.button = el as MenuButton | undefined;
241
- })}
239
+ output.button = el as MenuButton | undefined;
240
+ })}
242
241
  slot="trailing-button"
243
242
  .iconName=${'plus'}
244
- .title=${input.title}
243
+ .accessibleLabel=${input.title}
245
244
  .jslogContext=${input.jslogContext}
246
245
  .populateMenuCall=${input.populateMenuCall}>
247
246
  </devtools-menu-button>`,
248
- target);
247
+ target);
249
248
  };
250
249
 
251
250
  /**
@@ -1678,6 +1678,8 @@ class TreeViewTreeElement extends TreeElement {
1678
1678
  this.#clonedClasses.add(className);
1679
1679
  }
1680
1680
  this.hidden = hasBooleanAttribute(this.configElement, 'hidden');
1681
+ this.selectable =
1682
+ !this.configElement.hasAttribute('selectable') || hasBooleanAttribute(this.configElement, 'selectable');
1681
1683
  this.updateExpansionFromAttribute();
1682
1684
  }
1683
1685