Skip to content

Commit 13a93a1

Browse files
danilsomsikovDevtools-frontend LUCI CQ
authored andcommitted
Recognize <select> in <devtools-toolbar> as a ToolbarComboBox
Bug: 388730998 Change-Id: I3145b8ef50c34c064f2c64da3830dc9f6d439c29 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6298061 Auto-Submit: Danil Somsikov <[email protected]> Reviewed-by: Benedikt Meurer <[email protected]> Commit-Queue: Benedikt Meurer <[email protected]>
1 parent 41d3bc2 commit 13a93a1

File tree

3 files changed

+46
-42
lines changed

3 files changed

+46
-42
lines changed

front_end/panels/protocol_monitor/JSONEditor.test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// found in the LICENSE file.
44

55
import * as Host from '../../core/host/host.js';
6+
import * as SDK from '../../core/sdk/sdk.js';
67
import {
78
dispatchClickEvent,
89
dispatchKeyDownEvent,
@@ -510,21 +511,20 @@ describeWithEnvironment('JSONEditor', () => {
510511
const editorWidget = new ProtocolMonitor.ProtocolMonitor.EditorWidget();
511512
const jsonEditor = editorWidget.jsonEditor;
512513
jsonEditor.targetId = 'value2';
513-
const dataGrid = new ProtocolMonitor.ProtocolMonitor.ProtocolMonitorDataGrid(split);
514-
const selector = dataGrid.selector;
515-
516-
selector.createOption('Option 1', 'value1');
517-
selector.createOption('Option 2', 'value2');
518-
selector.createOption('Option 3', 'value3');
514+
sinon.stub(SDK.TargetManager.TargetManager.instance(), 'targets').returns([
515+
{id: () => 'value1'} as SDK.Target.Target,
516+
{id: () => 'value2'} as SDK.Target.Target,
517+
]);
518+
const view = sinon.stub();
519+
const dataGrid = new ProtocolMonitor.ProtocolMonitor.ProtocolMonitorDataGrid(split, view);
519520

520521
split.setMainWidget(dataGrid);
521522
split.setSidebarWidget(editorWidget);
522523

523524
split.toggleSidebar();
524-
await RenderCoordinator.done();
525+
await RenderCoordinator.done({waitForWork: true});
525526

526-
// Should be index 1 because the targetId equals "value2" which corresponds to the index number 1
527-
assert.deepEqual(selector.selectedIndex(), 1);
527+
assert.deepEqual(view.lastCall.firstArg.selectedTargetId, 'value2');
528528
});
529529

530530
// Flaky test.

front_end/panels/protocol_monitor/ProtocolMonitor.ts

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,10 @@ export interface ViewInput {
191191
onFilterChanged: (e: CustomEvent<string>) => void;
192192
onCommandChange: (e: CustomEvent<string>) => void;
193193
onCommandSubmitted: (e: CustomEvent<string>) => void;
194+
onTargetChange: (e: Event) => void;
194195
showHideSidebarButton: UI.Toolbar.ToolbarButton;
195-
selector: UI.Toolbar.ToolbarComboBox;
196+
targets: SDK.Target.Target[];
197+
selectedTargetId: string;
196198
}
197199

198200
export interface ViewOutput {}
@@ -206,9 +208,8 @@ export class ProtocolMonitorDataGrid extends Common.ObjectWrapper.eventMixin<Eve
206208
private readonly messageForId = new Map<number, Message>();
207209
private readonly filterParser: TextUtils.TextUtils.FilterParser;
208210
#filterKeys = ['method', 'request', 'response', 'target', 'session'];
209-
readonly selector: UI.Toolbar.ToolbarComboBox;
210211
#commandAutocompleteSuggestionProvider = new CommandAutocompleteSuggestionProvider();
211-
#selectedTargetId?: string;
212+
#selectedTargetId: string;
212213
#command = '';
213214
#hideInputBar = false;
214215
#showHideSidebarButton: UI.Toolbar.ToolbarButton;
@@ -333,7 +334,17 @@ export class ProtocolMonitorDataGrid extends Common.ObjectWrapper.eventMixin<Eve
333334
${input.commandSuggestions.map(c => html`<option value=${c}></option>`)}
334335
</datalist>
335336
</devtools-toolbar-input>
336-
${input.selector.element}
337+
<select class="target-selector"
338+
title=${i18nString(UIStrings.selectTarget)}
339+
style=${styleMap({display: input.hideInputBar ? 'none' : 'flex'})}
340+
jslog=${VisualLogging.dropDown('target-selector').track({change: true})}
341+
@change=${input.onTargetChange}>
342+
${input.targets.map(target => html`
343+
<option jslog=${VisualLogging.item('target').track({click: true})}
344+
value=${target.id()} ?selected=${target.id() === input.selectedTargetId}>
345+
${target.name()} (${target.inspectedURL()})
346+
</option>`)}
347+
</select>
337348
</devtools-toolbar>`,
338349
target,
339350
{host: input}
@@ -346,7 +357,6 @@ export class ProtocolMonitorDataGrid extends Common.ObjectWrapper.eventMixin<Eve
346357
this.started = false;
347358
this.startTime = 0;
348359
this.contentElement.classList.add('protocol-monitor');
349-
this.selector = this.#createTargetSelector();
350360

351361
this.#filterKeys = ['method', 'request', 'response', 'type', 'target', 'session'];
352362
this.filterParser = new TextUtils.TextUtils.FilterParser(this.#filterKeys);
@@ -355,7 +365,6 @@ export class ProtocolMonitorDataGrid extends Common.ObjectWrapper.eventMixin<Eve
355365
i18nString(UIStrings.showCDPCommandEditor), i18nString(UIStrings.hideCDPCommandEditor),
356366
i18nString(UIStrings.CDPCommandEditorShown), i18nString(UIStrings.CDPCommandEditorHidden),
357367
'protocol-monitor.toggle-command-editor');
358-
const tabSelector = this.selector.element;
359368

360369
const populateToolbarInput = (): void => {
361370
const editorWidget = splitWidget.sidebarWidget();
@@ -365,11 +374,7 @@ export class ProtocolMonitorDataGrid extends Common.ObjectWrapper.eventMixin<Eve
365374
const commandJson = editorWidget.jsonEditor.getCommandJson();
366375
const targetId = editorWidget.jsonEditor.targetId;
367376
if (targetId) {
368-
const selectedIndex = this.selector.options().findIndex(option => option.value === targetId);
369-
if (selectedIndex !== -1) {
370-
this.selector.setSelectedIndex(selectedIndex);
371-
this.#selectedTargetId = targetId;
372-
}
377+
this.#selectedTargetId = targetId;
373378
}
374379
if (commandJson) {
375380
this.#command = commandJson;
@@ -381,18 +386,21 @@ export class ProtocolMonitorDataGrid extends Common.ObjectWrapper.eventMixin<Eve
381386
if (event.data === 'OnlyMain') {
382387
populateToolbarInput();
383388
this.#hideInputBar = false;
384-
tabSelector?.setAttribute('style', 'display:flex');
385389
} else {
386390
const {command, parameters} = parseCommandInput(this.#command);
387391
this.dispatchEventToListeners(
388392
Events.COMMAND_CHANGE,
389393
{command, parameters, targetId: this.#selectedTargetId});
390394
this.#hideInputBar = true;
391-
tabSelector?.setAttribute('style', 'display:none');
392395
}
393396
this.requestUpdate();
394397
}));
398+
this.#selectedTargetId = 'main';
395399
this.performUpdate();
400+
SDK.TargetManager.TargetManager.instance().addEventListener(
401+
SDK.TargetManager.Events.AVAILABLE_TARGETS_CHANGED, () => {
402+
this.requestUpdate();
403+
});
396404
}
397405

398406
override performUpdate(): void {
@@ -439,8 +447,14 @@ export class ProtocolMonitorDataGrid extends Common.ObjectWrapper.eventMixin<Eve
439447
this.#filter = e.detail;
440448
this.requestUpdate();
441449
},
450+
onTargetChange: (e: Event) => {
451+
if (e.target instanceof HTMLSelectElement) {
452+
this.#selectedTargetId = e.target.value;
453+
}
454+
},
442455
showHideSidebarButton: this.#showHideSidebarButton,
443-
selector: this.selector,
456+
targets: SDK.TargetManager.TargetManager.instance().targets(),
457+
selectedTargetId: this.#selectedTargetId,
444458
};
445459
const viewOutput = {};
446460
this.#view(viewInput, viewOutput, this.contentElement);
@@ -487,23 +501,6 @@ export class ProtocolMonitorDataGrid extends Common.ObjectWrapper.eventMixin<Eve
487501
}, {jslogContext: 'documentation'});
488502
}
489503

490-
#createTargetSelector(): UI.Toolbar.ToolbarComboBox {
491-
const selector = new UI.Toolbar.ToolbarComboBox(() => {
492-
this.#selectedTargetId = selector.selectedOption()?.value;
493-
}, i18nString(UIStrings.selectTarget), undefined, 'target-selector');
494-
selector.element.classList.add('target-selector');
495-
const targetManager = SDK.TargetManager.TargetManager.instance();
496-
const syncTargets = (): void => {
497-
selector.removeOptions();
498-
for (const target of targetManager.targets()) {
499-
selector.createOption(`${target.name()} (${target.inspectedURL()})`, target.id(), 'target');
500-
}
501-
};
502-
targetManager.addEventListener(SDK.TargetManager.Events.AVAILABLE_TARGETS_CHANGED, syncTargets);
503-
syncTargets();
504-
return selector;
505-
}
506-
507504
onCommandSend(command: string, parameters: object, target?: string): void {
508505
const test = ProtocolClient.InspectorBackend.test;
509506
const targetManager = SDK.TargetManager.TargetManager.instance();

front_end/ui/legacy/Toolbar.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ export class Toolbar extends HTMLElement {
120120
item = new ToolbarButton('', undefined, undefined, undefined, element);
121121
} else if (element instanceof ToolbarInputElement) {
122122
item = element.item;
123+
} else if (element instanceof HTMLSelectElement) {
124+
item = new ToolbarComboBox(null, element.title, undefined, undefined, element);
123125
} else {
124126
item = new ToolbarItem(element);
125127
}
@@ -1139,8 +1141,13 @@ export interface ItemsProvider {
11391141
}
11401142

11411143
export class ToolbarComboBox extends ToolbarItem<void, HTMLSelectElement> {
1142-
constructor(changeHandler: ((arg0: Event) => void)|null, title: string, className?: string, jslogContext?: string) {
1143-
super(document.createElement('select'));
1144+
constructor(
1145+
changeHandler: ((arg0: Event) => void)|null, title: string, className?: string, jslogContext?: string,
1146+
element?: HTMLSelectElement) {
1147+
if (!element) {
1148+
element = document.createElement('select');
1149+
}
1150+
super(element);
11441151
if (changeHandler) {
11451152
this.element.addEventListener('change', changeHandler, false);
11461153
}

0 commit comments

Comments
 (0)