chrome-devtools-frontend 1.0.1625854 → 1.0.1626437
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/front_end/core/host/AidaClient.ts +1 -1
- package/front_end/core/host/AidaClientTypes.ts +2 -0
- package/front_end/core/host/AidaGcaTranslation.ts +2 -2
- package/front_end/core/sdk/CSSMetadata.ts +60 -55
- package/front_end/core/sdk/CSSPropertyParserMatchers.ts +11 -2
- package/front_end/models/ai_assistance/StorageItem.ts +16 -0
- package/front_end/models/ai_assistance/agents/StorageAgent.ts +82 -0
- package/front_end/models/ai_assistance/ai_assistance.ts +4 -0
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +9 -37
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +26 -3
- package/front_end/models/javascript_metadata/NativeFunctions.js +0 -4
- package/front_end/models/web_mcp/WebMCPModel.ts +11 -2
- package/front_end/panels/ai_assistance/ai_assistance-meta.ts +6 -1
- package/front_end/panels/application/WebMCPView.ts +74 -16
- package/front_end/panels/application/webMCPView.css +13 -2
- package/front_end/panels/elements/StandaloneStylesContainer.ts +3 -0
- package/front_end/panels/elements/StylePropertyTreeElement.ts +35 -2
- package/front_end/panels/elements/StylesContainer.ts +1 -0
- package/front_end/panels/elements/StylesSidebarPane.ts +10 -4
- package/front_end/panels/emulation/DeviceModeToolbar.ts +7 -3
- package/front_end/panels/sources/ScopeChainSidebarPane.ts +5 -1
- package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +179 -145
- package/front_end/panels/timeline/timelineTreeView.css +2 -2
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/ui/components/tooltips/Tooltip.ts +3 -3
- package/front_end/ui/visual_logging/KnownContextValues.ts +1 -0
- package/package.json +1 -1
|
@@ -49,6 +49,7 @@ import * as ObjectUI from '../../ui/legacy/components/object_ui/object_ui.js';
|
|
|
49
49
|
import objectValueStyles from '../../ui/legacy/components/object_ui/objectValue.css.js';
|
|
50
50
|
import * as Components from '../../ui/legacy/components/utils/utils.js';
|
|
51
51
|
import * as UI from '../../ui/legacy/legacy.js';
|
|
52
|
+
import {Directives, html, render} from '../../ui/lit/lit.js';
|
|
52
53
|
import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
|
|
53
54
|
|
|
54
55
|
import {UISourceCodeFrame} from './UISourceCodeFrame.js';
|
|
@@ -95,25 +96,98 @@ const UIStrings = {
|
|
|
95
96
|
const str_ = i18n.i18n.registerUIStrings('panels/sources/WatchExpressionsSidebarPane.ts', UIStrings);
|
|
96
97
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
97
98
|
let watchExpressionsSidebarPaneInstance: WatchExpressionsSidebarPane;
|
|
99
|
+
const {repeat} = Directives;
|
|
100
|
+
interface ViewInput {
|
|
101
|
+
onCopyWatchExpression(watchExpression: WatchExpression): void;
|
|
102
|
+
onDeleteAll(): unknown;
|
|
103
|
+
onAddExpression(): unknown;
|
|
104
|
+
watchExpressions: WatchExpression[];
|
|
105
|
+
}
|
|
106
|
+
type View = (input: ViewInput, output: object, target: HTMLElement) => void;
|
|
107
|
+
export const DEFAULT_VIEW: View = (input, output, target) => {
|
|
108
|
+
const onContextMenu = (watchExpression: WatchExpression|undefined, event: Event): void => {
|
|
109
|
+
const contextMenu = new UI.ContextMenu.ContextMenu(event);
|
|
110
|
+
const isEditing = input.watchExpressions.some(e => e.isEditing());
|
|
111
|
+
|
|
112
|
+
if (!isEditing) {
|
|
113
|
+
contextMenu.debugSection().appendItem(
|
|
114
|
+
i18nString(UIStrings.addWatchExpression), input.onAddExpression, {jslogContext: 'add-watch-expression'});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (input.watchExpressions.length > 1) {
|
|
118
|
+
contextMenu.debugSection().appendItem(
|
|
119
|
+
i18nString(UIStrings.deleteAllWatchExpressions), input.onDeleteAll,
|
|
120
|
+
{jslogContext: 'delete-all-watch-expressions'});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (watchExpression) {
|
|
124
|
+
if (!watchExpression.isEditing()) {
|
|
125
|
+
contextMenu.editSection().appendItem(
|
|
126
|
+
i18nString(UIStrings.deleteWatchExpression), watchExpression.updateExpression.bind(watchExpression, null),
|
|
127
|
+
{jslogContext: 'delete-watch-expression'});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (!watchExpression.isEditing() && watchExpression.result &&
|
|
131
|
+
(watchExpression.result.type === 'number' || watchExpression.result.type === 'string')) {
|
|
132
|
+
contextMenu.clipboardSection().appendItem(
|
|
133
|
+
i18nString(UIStrings.copyValue), () => input.onCopyWatchExpression(watchExpression),
|
|
134
|
+
{jslogContext: 'copy-watch-expression-value'});
|
|
135
|
+
}
|
|
98
136
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
137
|
+
contextMenu.appendApplicableItems(watchExpression.result);
|
|
138
|
+
}
|
|
139
|
+
void contextMenu.show();
|
|
140
|
+
event.consume();
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
for (const watchExpression of input.watchExpressions) {
|
|
144
|
+
watchExpression.treeElement().listItemElement.oncontextmenu = onContextMenu.bind(undefined, watchExpression);
|
|
145
|
+
watchExpression.treeElement().childrenListElement.oncontextmenu = onContextMenu.bind(undefined, watchExpression);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
render(
|
|
149
|
+
// clang-format off
|
|
150
|
+
html`
|
|
151
|
+
${input.watchExpressions.length === 0
|
|
152
|
+
? html`<div class=gray-info-message tabindex=-1 >
|
|
153
|
+
${i18nString(UIStrings.noWatchExpressions)}
|
|
154
|
+
</div>`
|
|
155
|
+
: html`<devtools-tree hide-overflow show-selection-on-keyboard-focus .template=${html`
|
|
156
|
+
<ul role=tree class="source-code object-properties-section">
|
|
157
|
+
<style>${ObjectUI.ObjectPropertiesSection.objectValueStyles}</style>
|
|
158
|
+
<style>${ObjectUI.ObjectPropertiesSection.objectPropertiesSectionStyles}</style>
|
|
159
|
+
<style>${watchExpressionsSidebarPaneStyles}</style>
|
|
160
|
+
${repeat(input.watchExpressions,
|
|
161
|
+
e => html`<devtools-tree-wrapper .treeElement=${e.treeElement()}></devtools-tree-wrapper>`)}
|
|
162
|
+
</ul>`}>
|
|
163
|
+
</devtools-tree>`
|
|
164
|
+
}`,
|
|
165
|
+
// clang-format on
|
|
166
|
+
target, {
|
|
167
|
+
container: {
|
|
168
|
+
classes: ['watch-expressions'],
|
|
169
|
+
attributes: {
|
|
170
|
+
jslog: `${VisualLogging.section('sources.watch')}`,
|
|
171
|
+
'aria-label': i18nString(UIStrings.addWatchExpression)
|
|
172
|
+
},
|
|
173
|
+
listeners: {contextmenu: onContextMenu.bind(undefined, undefined)}
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
export class WatchExpressionsSidebarPane extends UI.Widget.VBox implements UI.ActionRegistration.ActionDelegate,
|
|
179
|
+
UI.Toolbar.ItemsProvider {
|
|
102
180
|
#watchExpressions: WatchExpression[];
|
|
103
|
-
private emptyElement!: HTMLElement;
|
|
104
181
|
#watchExpressionsSetting: Common.Settings.Setting<string[]>;
|
|
105
182
|
private readonly addButton: UI.Toolbar.ToolbarButton;
|
|
106
183
|
private readonly refreshButton: UI.Toolbar.ToolbarButton;
|
|
107
|
-
private readonly treeOutline: ObjectUI.ObjectPropertiesSection.ObjectPropertiesSectionsTreeOutline;
|
|
108
|
-
private readonly expandController: ObjectUI.ObjectPropertiesSection.ObjectPropertiesSectionsTreeExpandController;
|
|
109
184
|
private readonly linkifier: Components.Linkifier.Linkifier;
|
|
185
|
+
#view: View;
|
|
186
|
+
#expandControllers = new Map<string, ObjectUI.ObjectPropertiesSection.ObjectTreeExpansionTracker>();
|
|
110
187
|
constructor() {
|
|
111
188
|
super({useShadowDom: true});
|
|
112
189
|
this.registerRequiredCSS(watchExpressionsSidebarPaneStyles, objectValueStyles);
|
|
113
190
|
|
|
114
|
-
// TODO(szuend): Replace with a Set once the web test
|
|
115
|
-
// panels/sources/debugger-ui/watch-expressions-preserve-expansion.js is either converted
|
|
116
|
-
// to an e2e test or no longer accesses this variable directly.
|
|
117
191
|
this.#watchExpressions = [];
|
|
118
192
|
this.#watchExpressionsSetting =
|
|
119
193
|
Common.Settings.Settings.instance().createLocalSetting<string[]>('watch-expressions', []);
|
|
@@ -127,24 +201,15 @@ export class WatchExpressionsSidebarPane extends UI.Widget.VBox implements
|
|
|
127
201
|
this.refreshButton = new UI.Toolbar.ToolbarButton(
|
|
128
202
|
i18nString(UIStrings.refreshWatchExpressions), 'refresh', undefined, 'refresh-watch-expressions');
|
|
129
203
|
this.refreshButton.setSize(Buttons.Button.Size.SMALL);
|
|
130
|
-
this.refreshButton.addEventListener(UI.Toolbar.ToolbarButton.Events.CLICK, this
|
|
131
|
-
|
|
132
|
-
this.contentElement.classList.add('watch-expressions');
|
|
133
|
-
this.contentElement.setAttribute('jslog', `${VisualLogging.section('sources.watch')}`);
|
|
134
|
-
this.contentElement.addEventListener('contextmenu', this.contextMenu.bind(this), false);
|
|
135
|
-
this.treeOutline = new ObjectUI.ObjectPropertiesSection.ObjectPropertiesSectionsTreeOutline();
|
|
136
|
-
this.treeOutline.registerRequiredCSS(watchExpressionsSidebarPaneStyles);
|
|
137
|
-
this.treeOutline.setHideOverflow(true);
|
|
138
|
-
|
|
139
|
-
this.treeOutline.setShowSelectionOnKeyboardFocus(/* show */ true);
|
|
140
|
-
this.expandController =
|
|
141
|
-
new ObjectUI.ObjectPropertiesSection.ObjectPropertiesSectionsTreeExpandController(this.treeOutline);
|
|
204
|
+
this.refreshButton.addEventListener(UI.Toolbar.ToolbarButton.Events.CLICK, this.#refreshExpressions, this);
|
|
142
205
|
|
|
143
|
-
UI.Context.Context.instance().addFlavorChangeListener(SDK.RuntimeModel.ExecutionContext, this.requestUpdate, this);
|
|
144
206
|
UI.Context.Context.instance().addFlavorChangeListener(
|
|
145
|
-
|
|
207
|
+
SDK.RuntimeModel.ExecutionContext, this.#refreshExpressions, this);
|
|
208
|
+
UI.Context.Context.instance().addFlavorChangeListener(
|
|
209
|
+
StackTrace.StackTrace.DebuggableFrameFlavor, this.#refreshExpressions, this);
|
|
146
210
|
this.linkifier = new Components.Linkifier.Linkifier();
|
|
147
|
-
this
|
|
211
|
+
this.#view = DEFAULT_VIEW;
|
|
212
|
+
this.#refreshExpressions();
|
|
148
213
|
}
|
|
149
214
|
|
|
150
215
|
static instance(): WatchExpressionsSidebarPane {
|
|
@@ -162,15 +227,6 @@ export class WatchExpressionsSidebarPane extends UI.Widget.VBox implements
|
|
|
162
227
|
return [this.addButton, this.refreshButton];
|
|
163
228
|
}
|
|
164
229
|
|
|
165
|
-
override focus(): void {
|
|
166
|
-
if (this.hasFocus()) {
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
if (this.#watchExpressions.length > 0) {
|
|
170
|
-
this.treeOutline.forceSelect();
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
230
|
private saveExpressions(): void {
|
|
175
231
|
const toSave = [];
|
|
176
232
|
for (let i = 0; i < this.#watchExpressions.length; i++) {
|
|
@@ -185,102 +241,99 @@ export class WatchExpressionsSidebarPane extends UI.Widget.VBox implements
|
|
|
185
241
|
|
|
186
242
|
private async addButtonClicked(): Promise<void> {
|
|
187
243
|
await UI.ViewManager.ViewManager.instance().showView('sources.watch');
|
|
188
|
-
this.
|
|
189
|
-
this.
|
|
244
|
+
const watchExpression = this.createWatchExpression(null);
|
|
245
|
+
this.requestUpdate();
|
|
246
|
+
// This synchronization is only needed because startEditing is imperative and
|
|
247
|
+
// requires the tree element to be in the DOM. This can be removed once the
|
|
248
|
+
// prompt is migrated to Lit.
|
|
249
|
+
await this.updateComplete;
|
|
250
|
+
watchExpression.startEditing();
|
|
190
251
|
}
|
|
191
252
|
|
|
192
|
-
|
|
253
|
+
#refreshExpressions(): void {
|
|
193
254
|
this.linkifier.reset();
|
|
194
|
-
this
|
|
195
|
-
|
|
255
|
+
for (const expression of this.#watchExpressions) {
|
|
256
|
+
expression.removeEventListener(Events.EXPRESSION_UPDATED, this.watchExpressionUpdated, this);
|
|
257
|
+
}
|
|
196
258
|
this.#watchExpressions = [];
|
|
197
|
-
this.emptyElement = this.contentElement.createChild('div', 'gray-info-message');
|
|
198
|
-
this.emptyElement.textContent = i18nString(UIStrings.noWatchExpressions);
|
|
199
|
-
this.emptyElement.tabIndex = -1;
|
|
200
259
|
const watchExpressionStrings = this.#watchExpressionsSetting.get();
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
260
|
+
|
|
261
|
+
const oldExpandControllers = this.#expandControllers;
|
|
262
|
+
this.#expandControllers = new Map();
|
|
263
|
+
|
|
204
264
|
for (let i = 0; i < watchExpressionStrings.length; ++i) {
|
|
205
265
|
const expression = watchExpressionStrings[i];
|
|
206
266
|
if (!expression) {
|
|
207
267
|
continue;
|
|
208
268
|
}
|
|
209
269
|
|
|
270
|
+
const controller = oldExpandControllers.get(expression);
|
|
271
|
+
if (controller) {
|
|
272
|
+
this.#expandControllers.set(expression, controller);
|
|
273
|
+
}
|
|
274
|
+
|
|
210
275
|
this.createWatchExpression(expression);
|
|
211
276
|
}
|
|
277
|
+
this.requestUpdate();
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
override async performUpdate(): Promise<void> {
|
|
212
281
|
await Promise.all(this.#watchExpressions.map(we => we.updateComplete));
|
|
282
|
+
this.#view(
|
|
283
|
+
{
|
|
284
|
+
watchExpressions: this.watchExpressions,
|
|
285
|
+
onDeleteAll: this.deleteAllButtonClicked.bind(this),
|
|
286
|
+
onAddExpression: this.addButtonClicked.bind(this),
|
|
287
|
+
onCopyWatchExpression: watchExpression => {
|
|
288
|
+
if (watchExpression.result?.description) {
|
|
289
|
+
Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(watchExpression.result.description);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
{}, this.contentElement);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
#getExpandController(expression: string|null): ObjectUI.ObjectPropertiesSection.ObjectTreeExpansionTracker {
|
|
297
|
+
if (expression === null) {
|
|
298
|
+
return new ObjectUI.ObjectPropertiesSection.ObjectTreeExpansionTracker();
|
|
299
|
+
}
|
|
300
|
+
let expandController = this.#expandControllers.get(expression);
|
|
301
|
+
if (!expandController) {
|
|
302
|
+
expandController = new ObjectUI.ObjectPropertiesSection.ObjectTreeExpansionTracker();
|
|
303
|
+
this.#expandControllers.set(expression, expandController);
|
|
304
|
+
}
|
|
305
|
+
return expandController;
|
|
213
306
|
}
|
|
214
307
|
|
|
215
308
|
private createWatchExpression(expression: string|null): WatchExpression {
|
|
216
|
-
this
|
|
217
|
-
const watchExpression = new WatchExpression(expression,
|
|
218
|
-
UI.ARIAUtils.setLabel(this.contentElement, i18nString(UIStrings.addWatchExpression));
|
|
309
|
+
const expandController = this.#getExpandController(expression);
|
|
310
|
+
const watchExpression = new WatchExpression(expression, expandController, this.linkifier);
|
|
219
311
|
watchExpression.addEventListener(Events.EXPRESSION_UPDATED, this.watchExpressionUpdated, this);
|
|
220
|
-
this.treeOutline.appendChild(watchExpression.treeElement());
|
|
221
312
|
this.#watchExpressions.push(watchExpression);
|
|
222
313
|
return watchExpression;
|
|
223
314
|
}
|
|
224
315
|
|
|
225
316
|
private watchExpressionUpdated({data: watchExpression}: Common.EventTarget.EventTargetEvent<WatchExpression>): void {
|
|
226
|
-
|
|
317
|
+
const expression = watchExpression.expression();
|
|
318
|
+
if (!expression) {
|
|
227
319
|
Platform.ArrayUtilities.removeElement(this.#watchExpressions, watchExpression);
|
|
228
|
-
this.treeOutline.removeChild(watchExpression.treeElement());
|
|
229
|
-
this.emptyElement.classList.toggle('hidden', Boolean(this.#watchExpressions.length));
|
|
230
|
-
if (this.#watchExpressions.length === 0) {
|
|
231
|
-
this.treeOutline.element.remove();
|
|
232
|
-
}
|
|
233
320
|
}
|
|
234
321
|
|
|
235
322
|
this.saveExpressions();
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
private contextMenu(event: MouseEvent): void {
|
|
239
|
-
const contextMenu = new UI.ContextMenu.ContextMenu(event);
|
|
240
|
-
this.populateContextMenu(contextMenu, event);
|
|
241
|
-
void contextMenu.show();
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
private populateContextMenu(contextMenu: UI.ContextMenu.ContextMenu, event: MouseEvent): void {
|
|
245
|
-
let isEditing = false;
|
|
246
|
-
for (const watchExpression of this.#watchExpressions) {
|
|
247
|
-
isEditing = isEditing || watchExpression.isEditing();
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (!isEditing) {
|
|
251
|
-
contextMenu.debugSection().appendItem(
|
|
252
|
-
i18nString(UIStrings.addWatchExpression), this.addButtonClicked.bind(this),
|
|
253
|
-
{jslogContext: 'add-watch-expression'});
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
if (this.#watchExpressions.length > 1) {
|
|
257
|
-
contextMenu.debugSection().appendItem(
|
|
258
|
-
i18nString(UIStrings.deleteAllWatchExpressions), this.deleteAllButtonClicked.bind(this),
|
|
259
|
-
{jslogContext: 'delete-all-watch-expressions'});
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
const treeElement = this.treeOutline.treeElementFromEvent(event);
|
|
263
|
-
if (!treeElement) {
|
|
264
|
-
return;
|
|
265
|
-
}
|
|
266
|
-
const currentWatchExpression =
|
|
267
|
-
this.#watchExpressions.find(watchExpression => treeElement.hasAncestorOrSelf(watchExpression.treeElement()));
|
|
268
|
-
if (currentWatchExpression) {
|
|
269
|
-
currentWatchExpression.populateContextMenu(contextMenu, event);
|
|
270
|
-
}
|
|
323
|
+
this.requestUpdate();
|
|
271
324
|
}
|
|
272
325
|
|
|
273
326
|
private deleteAllButtonClicked(): void {
|
|
274
327
|
this.#watchExpressions = [];
|
|
275
328
|
this.saveExpressions();
|
|
276
|
-
this
|
|
329
|
+
this.#refreshExpressions();
|
|
277
330
|
}
|
|
278
331
|
|
|
279
332
|
private async focusAndAddExpressionToWatch(expression: string): Promise<void> {
|
|
280
333
|
await UI.ViewManager.ViewManager.instance().showView('sources.watch');
|
|
281
334
|
this.createWatchExpression(expression);
|
|
282
335
|
this.saveExpressions();
|
|
283
|
-
this
|
|
336
|
+
this.#refreshExpressions();
|
|
284
337
|
}
|
|
285
338
|
|
|
286
339
|
handleAction(_context: UI.Context.Context, _actionId: string): boolean {
|
|
@@ -326,32 +379,35 @@ export class WatchExpression extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
|
326
379
|
private nameElement!: Element;
|
|
327
380
|
private valueElement!: Element;
|
|
328
381
|
#expression: string|null;
|
|
329
|
-
|
|
382
|
+
readonly #expandController: ObjectUI.ObjectPropertiesSection.ObjectTreeExpansionTracker;
|
|
330
383
|
private element: HTMLDivElement;
|
|
331
384
|
private editing: boolean;
|
|
332
385
|
private linkifier: Components.Linkifier.Linkifier;
|
|
333
386
|
private textPrompt?: ObjectPropertyPrompt;
|
|
334
|
-
|
|
387
|
+
#result?: SDK.RemoteObject.RemoteObject|null;
|
|
335
388
|
private preventClickTimeout?: number;
|
|
336
389
|
#updateComplete: Promise<void> = Promise.resolve();
|
|
337
390
|
constructor(
|
|
338
|
-
expression: string|null,
|
|
339
|
-
expandController: ObjectUI.ObjectPropertiesSection.ObjectPropertiesSectionsTreeExpandController,
|
|
391
|
+
expression: string|null, expandController: ObjectUI.ObjectPropertiesSection.ObjectTreeExpansionTracker,
|
|
340
392
|
linkifier: Components.Linkifier.Linkifier) {
|
|
341
393
|
super();
|
|
342
394
|
|
|
343
395
|
this.#expression = expression;
|
|
344
|
-
this
|
|
396
|
+
this.#expandController = expandController;
|
|
345
397
|
this.element = document.createElement('div');
|
|
346
398
|
this.element.classList.add('watch-expression');
|
|
347
399
|
this.element.classList.add('monospace');
|
|
348
400
|
this.editing = false;
|
|
349
401
|
this.linkifier = linkifier;
|
|
350
402
|
|
|
351
|
-
this.createWatchExpression();
|
|
403
|
+
void this.createWatchExpression();
|
|
352
404
|
this.update();
|
|
353
405
|
}
|
|
354
406
|
|
|
407
|
+
get result(): SDK.RemoteObject.RemoteObject|null {
|
|
408
|
+
return this.#result ?? null;
|
|
409
|
+
}
|
|
410
|
+
|
|
355
411
|
get updateComplete(): Promise<void> {
|
|
356
412
|
return this.#updateComplete;
|
|
357
413
|
}
|
|
@@ -392,16 +448,17 @@ export class WatchExpression extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
|
392
448
|
update(): void {
|
|
393
449
|
const currentExecutionContext = UI.Context.Context.instance().flavor(SDK.RuntimeModel.ExecutionContext);
|
|
394
450
|
if (currentExecutionContext && this.#expression) {
|
|
395
|
-
this.#updateComplete = this.#evaluateExpression(currentExecutionContext, this.#expression)
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
451
|
+
this.#updateComplete = this.#evaluateExpression(currentExecutionContext, this.#expression)
|
|
452
|
+
.then(async result => {
|
|
453
|
+
if ('object' in result) {
|
|
454
|
+
await this.createWatchExpression(result.object, result.exceptionDetails);
|
|
455
|
+
} else {
|
|
456
|
+
await this.createWatchExpression();
|
|
457
|
+
}
|
|
458
|
+
})
|
|
459
|
+
.catch(() => {});
|
|
402
460
|
} else {
|
|
403
|
-
this.createWatchExpression();
|
|
404
|
-
this.#updateComplete = Promise.resolve();
|
|
461
|
+
this.#updateComplete = this.createWatchExpression();
|
|
405
462
|
}
|
|
406
463
|
}
|
|
407
464
|
|
|
@@ -454,8 +511,8 @@ export class WatchExpression extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
|
454
511
|
}
|
|
455
512
|
|
|
456
513
|
updateExpression(newExpression: string|null): void {
|
|
457
|
-
if (this.#expression) {
|
|
458
|
-
this
|
|
514
|
+
if (this.#expression !== newExpression && newExpression) {
|
|
515
|
+
this.#expandController.clear();
|
|
459
516
|
}
|
|
460
517
|
this.#expression = newExpression;
|
|
461
518
|
this.update();
|
|
@@ -468,13 +525,13 @@ export class WatchExpression extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
|
468
525
|
this.updateExpression(null);
|
|
469
526
|
}
|
|
470
527
|
|
|
471
|
-
createWatchExpression(
|
|
472
|
-
void {
|
|
473
|
-
this
|
|
528
|
+
async createWatchExpression(
|
|
529
|
+
result?: SDK.RemoteObject.RemoteObject, exceptionDetails?: Protocol.Runtime.ExceptionDetails): Promise<void> {
|
|
530
|
+
this.#result = result || null;
|
|
474
531
|
|
|
475
532
|
this.element.removeChildren();
|
|
476
533
|
const oldTreeElement = this.#treeElement;
|
|
477
|
-
this
|
|
534
|
+
await this.#createWatchExpressionTreeElement(result, exceptionDetails);
|
|
478
535
|
if (oldTreeElement?.parent) {
|
|
479
536
|
const root = oldTreeElement.parent;
|
|
480
537
|
const index = root.indexOfChild(oldTreeElement);
|
|
@@ -530,20 +587,20 @@ export class WatchExpression extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
|
530
587
|
return headerElement;
|
|
531
588
|
}
|
|
532
589
|
|
|
533
|
-
|
|
534
|
-
expressionValue?: SDK.RemoteObject.RemoteObject,
|
|
590
|
+
async #createWatchExpressionTreeElement(
|
|
591
|
+
expressionValue?: SDK.RemoteObject.RemoteObject,
|
|
592
|
+
exceptionDetails?: Protocol.Runtime.ExceptionDetails): Promise<void> {
|
|
535
593
|
const headerElement = this.createWatchExpressionHeader(expressionValue, exceptionDetails);
|
|
536
594
|
|
|
537
595
|
if (!exceptionDetails && expressionValue && expressionValue.hasChildren && !expressionValue.customPreview()) {
|
|
538
596
|
headerElement.classList.add('watch-expression-object-header');
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
this.
|
|
546
|
-
(this.#expression as string), (this.#treeElement as ObjectUI.ObjectPropertiesSection.RootElement));
|
|
597
|
+
const objectTree = new ObjectUI.ObjectPropertiesSection.ObjectTree(expressionValue, {
|
|
598
|
+
readOnly: true,
|
|
599
|
+
propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
|
|
600
|
+
expansionTracker: this.#expandController,
|
|
601
|
+
});
|
|
602
|
+
await this.#expandController.apply(objectTree);
|
|
603
|
+
this.#treeElement = new ObjectUI.ObjectPropertiesSection.RootElement(objectTree, this.linkifier);
|
|
547
604
|
this.#treeElement.toggleOnClick = false;
|
|
548
605
|
this.#treeElement.listItemElement.addEventListener('click', this.onSectionClick.bind(this), false);
|
|
549
606
|
this.#treeElement.listItemElement.addEventListener('dblclick', this.dblClickOnWatchExpression.bind(this));
|
|
@@ -593,29 +650,6 @@ export class WatchExpression extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
|
593
650
|
}
|
|
594
651
|
}
|
|
595
652
|
|
|
596
|
-
populateContextMenu(contextMenu: UI.ContextMenu.ContextMenu, event: Event): void {
|
|
597
|
-
if (!this.isEditing()) {
|
|
598
|
-
contextMenu.editSection().appendItem(
|
|
599
|
-
i18nString(UIStrings.deleteWatchExpression), this.updateExpression.bind(this, null),
|
|
600
|
-
{jslogContext: 'delete-watch-expression'});
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
if (!this.isEditing() && this.result && (this.result.type === 'number' || this.result.type === 'string')) {
|
|
604
|
-
contextMenu.clipboardSection().appendItem(
|
|
605
|
-
i18nString(UIStrings.copyValue), this.copyValueButtonClicked.bind(this),
|
|
606
|
-
{jslogContext: 'copy-watch-expression-value'});
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
const target = UI.UIUtils.deepElementFromEvent(event);
|
|
610
|
-
if (target && this.valueElement.isSelfOrAncestor(target) && this.result) {
|
|
611
|
-
contextMenu.appendApplicableItems(this.result);
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
private copyValueButtonClicked(): void {
|
|
616
|
-
Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(this.valueElement.textContent);
|
|
617
|
-
}
|
|
618
|
-
|
|
619
653
|
private static readonly watchObjectGroupId = 'watch-group';
|
|
620
654
|
}
|
|
621
655
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
.timeline-tree-view .data-grid .data-container {
|
|
21
|
-
overflow
|
|
21
|
+
overflow: scroll;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
.timeline-tree-view .data-grid.data-grid-fits-viewport .corner {
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
.timeline-tree-view .data-grid table.data {
|
|
29
|
+
width: max-content;
|
|
29
30
|
background: var(--sys-color-cdt-base-container);
|
|
30
31
|
}
|
|
31
32
|
|
|
@@ -111,7 +112,6 @@
|
|
|
111
112
|
|
|
112
113
|
.timeline-tree-view .data-grid .name-container .activity-link {
|
|
113
114
|
flex: auto;
|
|
114
|
-
text-align: right;
|
|
115
115
|
overflow: hidden;
|
|
116
116
|
text-overflow: ellipsis;
|
|
117
117
|
margin-left: 5px;
|
|
@@ -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: 6bd698412997c22fb10551e3080f738503d6869b
|
|
5
5
|
Update Mechanism: Manual (https://crbug.com/428069060)
|
|
6
6
|
License: BSD-3-Clause
|
|
7
7
|
License File: LICENSE
|
|
@@ -627,9 +627,9 @@ export class Tooltip extends HTMLElement {
|
|
|
627
627
|
throw new Error('Anchor must be an HTMLElement.');
|
|
628
628
|
}
|
|
629
629
|
this.#anchor = anchor;
|
|
630
|
-
if (this.variant === 'rich' &&
|
|
631
|
-
console.warn(
|
|
632
|
-
|
|
630
|
+
if (this.variant === 'rich' && !detailsAnchor) {
|
|
631
|
+
console.warn(
|
|
632
|
+
`"aria-details" was not defined for tooltip ${id}. For rich tooltips "aria-details" should be defined.`);
|
|
633
633
|
}
|
|
634
634
|
}
|
|
635
635
|
|
package/package.json
CHANGED