Skip to content

Commit 53d6f3e

Browse files
danilsomsikovDevtools-frontend LUCI CQ
authored andcommitted
Remove one of two toolbar comboboxes. We had ToolbarCombobox and ToolbarComboBox
The former is a base class of ToolbarMenuButton, and otherwise is only used in the NetworkLogView, with a use case that better fits ToolbarMenuButton. Therefore, keeping ToolbarComboBox and removing the ToolbarCombobox, but folding it into the ToolbarMenuButton and migrating the NetworkLogView to it. Had to update NetworkLogView test as these were reliant on the soft context menu DOM structure. Bug: 301364727 Change-Id: I2b2d6791335d58b3b6d7150e3dff47aec47e0f65 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6291332 Auto-Submit: Danil Somsikov <[email protected]> Commit-Queue: Danil Somsikov <[email protected]> Reviewed-by: Benedikt Meurer <[email protected]>
1 parent 5ec6f5a commit 53d6f3e

File tree

3 files changed

+130
-173
lines changed

3 files changed

+130
-173
lines changed

front_end/panels/network/NetworkLogView.test.ts

Lines changed: 47 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import * as Common from '../../core/common/common.js';
55
import * as Host from '../../core/host/host.js';
66
import * as i18n from '../../core/i18n/i18n.js';
77
import * as Platform from '../../core/platform/platform.js';
8+
import {assertNotNullOrUndefined} from '../../core/platform/platform.js';
89
import * as Root from '../../core/root/root.js';
910
import * as SDK from '../../core/sdk/sdk.js';
1011
import * as Protocol from '../../generated/protocol.js';
@@ -13,13 +14,10 @@ import * as Logs from '../../models/logs/logs.js';
1314
import {
1415
findMenuItemWithLabel,
1516
getContextMenuForElement,
17+
getMenu,
1618
getMenuItemLabels,
1719
} from '../../testing/ContextMenuHelpers.js';
18-
import {
19-
dispatchClickEvent,
20-
dispatchMouseUpEvent,
21-
raf,
22-
} from '../../testing/DOMHelpers.js';
20+
import {dispatchClickEvent, raf} from '../../testing/DOMHelpers.js';
2321
import {createTarget, registerNoopActions, stubNoopSettings} from '../../testing/EnvironmentHelpers.js';
2422
import {expectCalled} from '../../testing/ExpectStubCall.js';
2523
import {stubFileManager} from '../../testing/FileManagerHelpers.js';
@@ -386,42 +384,45 @@ describeWithMockConnection('NetworkLogView', () => {
386384
rootNode.children.map(n => (n as Network.NetworkDataGridNode.NetworkNode).request()?.url()),
387385
[urlString`chrome-extension://url1`, urlString`url2`]);
388386

389-
const dropdown = await openMoreTypesDropdown(filterBar, networkLogView);
387+
const dropdown = await getMoreTypesDropdown(filterBar);
390388
if (!dropdown) {
391389
return;
392390
}
393-
const softMenu = getSoftMenu();
394-
const hideExtensionURL = getDropdownItem(softMenu, 'Hide extension URLs');
395-
assert.isFalse(hideExtensionURL.hasAttribute('checked'));
396-
dispatchMouseUpEvent(hideExtensionURL);
397-
await raf();
398-
assert.isTrue(hideExtensionURL.hasAttribute('checked'));
391+
let softMenu = getMenu(() => dropdown.click());
392+
let hideExtensionURL = getDropdownItem(softMenu, 'Hide extension URLs');
393+
assert.isFalse(hideExtensionURL.buildDescriptor().checked);
394+
softMenu.invokeHandler(hideExtensionURL.id());
395+
softMenu.discard();
396+
397+
softMenu = getMenu(() => dropdown.click());
398+
hideExtensionURL = getDropdownItem(softMenu, 'Hide extension URLs');
399+
assert.isTrue(hideExtensionURL.buildDescriptor().checked);
399400

400401
assert.deepEqual(
401402
rootNode.children.map(n => (n as Network.NetworkDataGridNode.NetworkNode).request()?.url()), [urlString`url2`]);
402403

403-
dropdown.discard();
404+
softMenu.discard();
404405
});
405406

406407
it('displays correct count for more filters', async () => {
407408
Root.Runtime.experiments.enableForTest(Root.Runtime.ExperimentName.NETWORK_PANEL_FILTER_BAR_REDESIGN);
408409
let filterBar;
409410
({filterBar, networkLogView} = createEnvironment());
410-
const dropdown = await openMoreTypesDropdown(filterBar, networkLogView);
411+
const dropdown = await getMoreTypesDropdown(filterBar);
411412
if (!dropdown) {
412413
return;
413414
}
414415

415416
assert.strictEqual(getMoreFiltersActiveCount(filterBar), '0');
416417
assert.isTrue(getCountAdorner(filterBar)?.classList.contains('hidden'));
417418

418-
const softMenu = getSoftMenu();
419+
const softMenu = getMenu(() => dropdown.click());
419420
await selectMoreFiltersOption(softMenu, 'Hide extension URLs');
420421

421422
assert.strictEqual(getMoreFiltersActiveCount(filterBar), '1');
422423
assert.isFalse(getCountAdorner(filterBar)?.classList.contains('hidden'));
423424

424-
dropdown.discard();
425+
softMenu.discard();
425426
});
426427

427428
it('can filter requests with blocked response cookies from checkbox', async () => {
@@ -460,67 +461,66 @@ describeWithMockConnection('NetworkLogView', () => {
460461
rootNode.children.map(n => (n as Network.NetworkDataGridNode.NetworkNode).request()?.url()),
461462
[urlString`url1`, urlString`url2`]);
462463

463-
const dropdown = await openMoreTypesDropdown(filterBar, networkLogView);
464+
const dropdown = await getMoreTypesDropdown(filterBar);
464465
if (!dropdown) {
465466
return;
466467
}
467-
const softMenu = getSoftMenu();
468-
const blockedResponseCookies = getDropdownItem(softMenu, 'Blocked response cookies');
469-
assert.isFalse(blockedResponseCookies.hasAttribute('checked'));
470-
dispatchMouseUpEvent(blockedResponseCookies);
471-
await raf();
472-
assert.isTrue(blockedResponseCookies.hasAttribute('checked'));
468+
let softMenu = getMenu(() => dropdown.click());
469+
let blockedResponseCookies = getDropdownItem(softMenu, 'Blocked response cookies');
470+
assert.isFalse(blockedResponseCookies.buildDescriptor().checked);
471+
softMenu.invokeHandler(blockedResponseCookies.id());
472+
softMenu.discard();
473+
474+
softMenu = getMenu(() => dropdown.click());
475+
blockedResponseCookies = getDropdownItem(softMenu, 'Blocked response cookies');
476+
assert.isTrue(blockedResponseCookies.buildDescriptor().checked);
473477

474478
assert.deepEqual(rootNode.children.map(n => (n as Network.NetworkDataGridNode.NetworkNode).request()?.url()), [
475479
urlString`url1`,
476480
]);
477481

478-
dropdown.discard();
482+
softMenu.discard();
479483
});
480484

481485
it('lists selected options in more filters tooltip', async () => {
482486
Root.Runtime.experiments.enableForTest(Root.Runtime.ExperimentName.NETWORK_PANEL_FILTER_BAR_REDESIGN);
483487
let filterBar;
484488
({filterBar, networkLogView} = createEnvironment());
485489

486-
const dropdown = await openMoreTypesDropdown(filterBar, networkLogView);
490+
const dropdown = await getMoreTypesDropdown(filterBar);
487491
assert.exists(dropdown);
488492

489-
const button = dropdown.element().querySelector('.toolbar-button');
490-
assert.instanceOf(button, HTMLElement);
491-
assert.strictEqual(button.title, 'Show only/hide requests');
493+
assert.strictEqual(dropdown.title, 'Show only/hide requests');
492494

493-
const softMenu = getSoftMenu();
495+
const softMenu = getMenu(() => dropdown.click());
494496
await selectMoreFiltersOption(softMenu, 'Blocked response cookies');
495497
await selectMoreFiltersOption(softMenu, 'Hide extension URLs');
496498

497-
assert.strictEqual(button.title, 'Hide extension URLs, Blocked response cookies');
499+
assert.strictEqual(dropdown.title, 'Hide extension URLs, Blocked response cookies');
498500

499-
dropdown.discard();
501+
softMenu.discard();
500502
});
501503

502504
it('updates tooltip to default when more filters option deselected', async () => {
503505
Root.Runtime.experiments.enableForTest(Root.Runtime.ExperimentName.NETWORK_PANEL_FILTER_BAR_REDESIGN);
504506
let filterBar;
505507
({filterBar, networkLogView} = createEnvironment());
506508

507-
const dropdown = await openMoreTypesDropdown(filterBar, networkLogView);
509+
const dropdown = await getMoreTypesDropdown(filterBar);
508510
assert.exists(dropdown);
509511

510-
const button = dropdown.element().querySelector('.toolbar-button');
511-
assert.instanceOf(button, HTMLElement);
512-
assert.strictEqual(button.title, 'Show only/hide requests');
512+
assert.strictEqual(dropdown.title, 'Show only/hide requests');
513513

514-
const softMenu = getSoftMenu();
514+
const softMenu = getMenu(() => dropdown.click());
515515
await selectMoreFiltersOption(softMenu, 'Blocked response cookies');
516516

517-
assert.strictEqual(button.title, 'Blocked response cookies');
517+
assert.strictEqual(dropdown.title, 'Blocked response cookies');
518518

519519
await selectMoreFiltersOption(softMenu, 'Blocked response cookies');
520520

521-
assert.strictEqual(button.title, 'Show only/hide requests');
521+
assert.strictEqual(dropdown.title, 'Show only/hide requests');
522522

523-
dropdown.discard();
523+
softMenu.discard();
524524
});
525525

526526
it('can remove requests', async () => {
@@ -977,15 +977,9 @@ function getCheckbox(filterBar: UI.FilterBar.FilterBar, title: string) {
977977
return checkbox;
978978
}
979979

980-
async function openMoreTypesDropdown(
981-
filterBar: UI.FilterBar.FilterBar, networkLogView: Network.NetworkLogView.NetworkLogView):
982-
Promise<Network.NetworkLogView.MoreFiltersDropDownUI|undefined> {
983-
const button = filterBar.element.querySelector('[aria-label="Show only/hide requests dropdown"]')
984-
?.querySelector('.toolbar-button');
985-
button?.dispatchEvent(new Event('click'));
986-
await raf();
987-
const dropdown = networkLogView.getMoreFiltersDropdown();
988-
return dropdown;
980+
async function getMoreTypesDropdown(filterBar: UI.FilterBar.FilterBar): Promise<HTMLElement> {
981+
return filterBar.element.querySelector('[aria-label="Show only/hide requests dropdown"]')
982+
?.querySelector('.toolbar-button') as HTMLElement;
989983
}
990984

991985
function getCountAdorner(filterBar: UI.FilterBar.FilterBar): HTMLElement|null {
@@ -1000,22 +994,15 @@ function getMoreFiltersActiveCount(filterBar: UI.FilterBar.FilterBar): string {
1000994
return count;
1001995
}
1002996

1003-
function getSoftMenu(): HTMLElement {
1004-
const container = document.querySelector('div[data-devtools-glass-pane]');
1005-
const softMenu = container!.shadowRoot!.querySelector('.soft-context-menu');
1006-
assert.instanceOf(softMenu, HTMLElement);
1007-
return softMenu;
1008-
}
1009-
1010-
function getDropdownItem(softMenu: HTMLElement, label: string) {
1011-
const item = softMenu?.querySelector(`[aria-label^="${label}"]`);
1012-
assert.instanceOf(item, HTMLElement);
997+
function getDropdownItem(softMenu: UI.ContextMenu.ContextMenu, label: string) {
998+
const item = findMenuItemWithLabel(softMenu.defaultSection(), label);
999+
assertNotNullOrUndefined(item);
10131000
return item;
10141001
}
10151002

1016-
async function selectMoreFiltersOption(softMenu: HTMLElement, option: string) {
1003+
async function selectMoreFiltersOption(softMenu: UI.ContextMenu.ContextMenu, option: string) {
10171004
const item = getDropdownItem(softMenu, option);
1018-
dispatchMouseUpEvent(item);
1005+
softMenu.invokeHandler(item.id());
10191006
await raf();
10201007
}
10211008

front_end/panels/network/NetworkLogView.ts

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2652,10 +2652,10 @@ export const overrideFilter = {
26522652

26532653
export type Filter = (request: SDK.NetworkRequest.NetworkRequest) => boolean;
26542654

2655-
export class MoreFiltersDropDownUI extends
2656-
Common.ObjectWrapper.ObjectWrapper<UI.FilterBar.FilterUIEventTypes> implements UI.FilterBar.FilterUI {
2655+
export class MoreFiltersDropDownUI extends Common.ObjectWrapper.ObjectWrapper<UI.FilterBar.FilterUIEventTypes>
2656+
implements UI.FilterBar.FilterUI {
26572657
private readonly filterElement: HTMLDivElement;
2658-
private readonly dropDownButton: UI.Toolbar.ToolbarCombobox;
2658+
private readonly dropDownButton: UI.Toolbar.ToolbarMenuButton;
26592659
private networkHideDataURLSetting: Common.Settings.Setting<boolean>;
26602660
private networkHideChromeExtensionsSetting: Common.Settings.Setting<boolean>;
26612661
private networkShowBlockedCookiesOnlySetting: Common.Settings.Setting<boolean>;
@@ -2691,75 +2691,66 @@ export class MoreFiltersDropDownUI extends
26912691
this.activeFiltersCountAdorner.classList.add('active-filters-count');
26922692
this.updateActiveFiltersCount();
26932693

2694-
this.dropDownButton = new UI.Toolbar.ToolbarCombobox(i18nString(UIStrings.showOnlyHideRequests));
2694+
this.dropDownButton = new UI.Toolbar.ToolbarMenuButton(
2695+
this.showMoreFiltersContextMenu.bind(this), /* isIconDropdown=*/ false, /* useSoftMenu=*/ true,
2696+
/* jslogContext=*/ undefined, /* iconName=*/ undefined,
2697+
/* keepOpen=*/ true);
2698+
this.dropDownButton.setTitle(i18nString(UIStrings.showOnlyHideRequests));
26952699
this.dropDownButton.setText(i18nString(UIStrings.moreFilters));
26962700
this.dropDownButton.setAdorner(this.activeFiltersCountAdorner);
26972701
this.filterElement.appendChild(this.dropDownButton.element);
26982702
this.dropDownButton.element.classList.add('dropdown-filterbar');
2699-
this.dropDownButton.addEventListener(
2700-
UI.Toolbar.ToolbarButton.Events.CLICK, this.showMoreFiltersContextMenu.bind(this));
2701-
UI.ARIAUtils.markAsMenuButton(this.dropDownButton.element);
27022703
this.updateTooltip();
27032704
}
27042705

27052706
#onSettingChanged(): void {
27062707
this.dispatchEventToListeners(UI.FilterBar.FilterUIEvents.FILTER_CHANGED);
27072708
}
27082709

2709-
showMoreFiltersContextMenu(event: Common.EventTarget.EventTargetEvent<Event>): void {
2710-
const mouseEvent = event.data;
2711-
2710+
showMoreFiltersContextMenu(contextMenu: UI.ContextMenu.ContextMenu): void {
27122711
this.networkHideDataURLSetting.addChangeListener(this.#onSettingChanged.bind(this));
27132712
this.networkHideChromeExtensionsSetting.addChangeListener(this.#onSettingChanged.bind(this));
27142713
this.networkShowBlockedCookiesOnlySetting.addChangeListener(this.#onSettingChanged.bind(this));
27152714
this.networkOnlyBlockedRequestsSetting.addChangeListener(this.#onSettingChanged.bind(this));
27162715
this.networkOnlyThirdPartySetting.addChangeListener(this.#onSettingChanged.bind(this));
2717-
this.contextMenu = new UI.ContextMenu.ContextMenu(mouseEvent, {
2718-
useSoftMenu: true,
2719-
keepOpen: true,
2720-
x: this.dropDownButton.element.getBoundingClientRect().left,
2721-
y: this.dropDownButton.element.getBoundingClientRect().top + (this.dropDownButton.element).offsetHeight,
2722-
});
27232716

2724-
this.contextMenu.defaultSection().appendCheckboxItem(
2717+
contextMenu.defaultSection().appendCheckboxItem(
27252718
i18nString(UIStrings.hideDataUrls),
27262719
() => this.networkHideDataURLSetting.set(!this.networkHideDataURLSetting.get()), {
27272720
checked: this.networkHideDataURLSetting.get(),
27282721
tooltip: i18nString(UIStrings.hidesDataAndBlobUrls),
27292722
jslogContext: 'hide-data-urls',
27302723
});
2731-
this.contextMenu.defaultSection().appendCheckboxItem(
2724+
contextMenu.defaultSection().appendCheckboxItem(
27322725
i18nString(UIStrings.chromeExtensions),
27332726
() => this.networkHideChromeExtensionsSetting.set(!this.networkHideChromeExtensionsSetting.get()), {
27342727
checked: this.networkHideChromeExtensionsSetting.get(),
27352728
tooltip: i18nString(UIStrings.hideChromeExtension),
27362729
jslogContext: 'hide-extension-urls',
27372730
});
2738-
this.contextMenu.defaultSection().appendSeparator();
2731+
contextMenu.defaultSection().appendSeparator();
27392732

2740-
this.contextMenu.defaultSection().appendCheckboxItem(
2733+
contextMenu.defaultSection().appendCheckboxItem(
27412734
i18nString(UIStrings.hasBlockedCookies),
27422735
() => this.networkShowBlockedCookiesOnlySetting.set(!this.networkShowBlockedCookiesOnlySetting.get()), {
27432736
checked: this.networkShowBlockedCookiesOnlySetting.get(),
27442737
tooltip: i18nString(UIStrings.onlyShowRequestsWithBlockedCookies),
27452738
jslogContext: 'only-blocked-response-cookies',
27462739
});
2747-
this.contextMenu.defaultSection().appendCheckboxItem(
2740+
contextMenu.defaultSection().appendCheckboxItem(
27482741
i18nString(UIStrings.blockedRequests),
27492742
() => this.networkOnlyBlockedRequestsSetting.set(!this.networkOnlyBlockedRequestsSetting.get()), {
27502743
checked: this.networkOnlyBlockedRequestsSetting.get(),
27512744
tooltip: i18nString(UIStrings.onlyShowBlockedRequests),
27522745
jslogContext: 'only-blocked-requests',
27532746
});
2754-
this.contextMenu.defaultSection().appendCheckboxItem(
2747+
contextMenu.defaultSection().appendCheckboxItem(
27552748
i18nString(UIStrings.thirdParty),
27562749
() => this.networkOnlyThirdPartySetting.set(!this.networkOnlyThirdPartySetting.get()), {
27572750
checked: this.networkOnlyThirdPartySetting.get(),
27582751
tooltip: i18nString(UIStrings.onlyShowThirdPartyRequests),
27592752
jslogContext: 'only-3rd-party-requests',
27602753
});
2761-
2762-
void this.contextMenu.show();
27632754
}
27642755

27652756
selectedFilters(): string[] {
@@ -2788,12 +2779,6 @@ export class MoreFiltersDropDownUI extends
27882779
}
27892780
}
27902781

2791-
discard(): void {
2792-
if (this.contextMenu) {
2793-
this.contextMenu.discard();
2794-
}
2795-
}
2796-
27972782
isActive(): boolean {
27982783
return this.selectedFilters().length !== 0;
27992784
}

0 commit comments

Comments
 (0)