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.
- package/.agents/skills/devtools-verification/SKILL.md +19 -0
- package/.agents/skills/{repro-flaky-tests → fix-tests}/SKILL.md +2 -2
- package/front_end/core/sdk/DOMModel.ts +3 -5
- package/front_end/core/sdk/NetworkManager.ts +2 -2
- package/front_end/core/sdk/OverlayModel.ts +11 -12
- package/front_end/core/sdk/SourceMapScopeChainEntry.ts +84 -32
- package/front_end/models/emulation/DeviceModeModel.ts +1 -1
- package/front_end/models/issues_manager/CookieIssue.ts +0 -13
- package/front_end/models/source_map_scopes/NamesResolver.ts +11 -3
- package/front_end/models/source_map_scopes/ScopeChainModel.ts +10 -6
- package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingView.ts +281 -3
- package/front_end/panels/accessibility/accessibilityAnnouncementRecordingView.css +85 -0
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +1 -2
- package/front_end/panels/animation/AnimationTimeline.ts +1 -1
- package/front_end/panels/application/CrashReportContextView.ts +1 -1
- package/front_end/panels/application/IndexedDBViews.ts +1 -1
- package/front_end/panels/application/KeyValueStorageItemsView.ts +1 -0
- package/front_end/panels/application/components/AdsView.ts +63 -1
- package/front_end/panels/application/components/adsView.css +11 -1
- package/front_end/panels/common/CommentThreadWidget.ts +1 -16
- package/front_end/panels/common/commentThreadWidget.css +0 -12
- package/front_end/panels/elements/CSSRuleValidator.ts +1 -1
- package/front_end/panels/elements/ElementsPanel.ts +4 -4
- package/front_end/panels/elements/ElementsTreeElement.ts +7 -2
- package/front_end/panels/elements/ElementsTreeOutline.ts +14 -26
- package/front_end/panels/elements/elementsTreeOutline.css +4 -4
- package/front_end/panels/lighthouse/LighthouseController.ts +1 -1
- package/front_end/panels/mobile_throttling/NetworkPanelIndicator.ts +1 -1
- package/front_end/panels/mobile_throttling/ThrottlingManager.ts +1 -1
- package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +1 -1
- package/front_end/panels/recorder/StepView.ts +19 -4
- package/front_end/panels/recorder/TimelineSection.ts +1 -1
- package/front_end/panels/settings/BackendLinkingSettingsTab.ts +2 -1
- package/front_end/panels/settings/EditFileSystemView.ts +1 -1
- package/front_end/panels/sources/CallStackSidebarPane.ts +1 -1
- package/front_end/panels/sources/DebuggerPlugin.ts +1 -1
- package/front_end/panels/timeline/components/DetailsView.ts +3 -3
- package/front_end/panels/timeline/components/OriginMap.ts +1 -1
- package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -3
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/ui/components/buttons/Button.ts +19 -1
- package/front_end/ui/legacy/ContextMenu.ts +16 -1
- package/front_end/ui/legacy/PlusButton.ts +5 -6
- package/front_end/ui/legacy/Treeoutline.ts +2 -0
- package/front_end/ui/legacy/Widget.ts +33 -0
- package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +3 -0
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +14 -4
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +22 -25
- package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
- package/package.json +1 -1
- package/.agents/skills/devtools-ci/SKILL.md +0 -65
- package/.agents/skills/evaluate-ai-css-completion/SKILL.md +0 -143
- package/.agents/skills/evaluate-ai-css-completion/scripts/evaluate.js +0 -104
- package/.agents/skills/fixing-skipped-tests/SKILL.md +0 -32
- package/.agents/skills/gerrit-cli/SKILL.md +0 -74
- package/.agents/skills/gerrit-cli/references/commands.md +0 -169
- package/.agents/skills/gerrit-cli/references/workflows.md +0 -63
- package/.agents/skills/gerrit-cli/scripts/import_upstream.py +0 -85
- 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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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>
|
|
@@ -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
|
-
|
|
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:
|
|
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
|
-
.
|
|
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
|
-
|
|
241
|
-
|
|
239
|
+
output.button = el as MenuButton | undefined;
|
|
240
|
+
})}
|
|
242
241
|
slot="trailing-button"
|
|
243
242
|
.iconName=${'plus'}
|
|
244
|
-
.
|
|
243
|
+
.accessibleLabel=${input.title}
|
|
245
244
|
.jslogContext=${input.jslogContext}
|
|
246
245
|
.populateMenuCall=${input.populateMenuCall}>
|
|
247
246
|
</devtools-menu-button>`,
|
|
248
|
-
|
|
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
|
|