[GM3Restyling] Use old button implementaiton for toolbar select menu

Bug: 330213829
Change-Id: Ia8fad07286eb06ee97f032485a4100f06bb6bee4
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/5587883
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Auto-Submit: Kateryna Prokopenko <kprokopenko@chromium.org>
Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
diff --git a/front_end/entrypoints/main/MainImpl.ts b/front_end/entrypoints/main/MainImpl.ts
index 87b089c..3fab27f 100644
--- a/front_end/entrypoints/main/MainImpl.ts
+++ b/front_end/entrypoints/main/MainImpl.ts
@@ -777,7 +777,9 @@
 export class MainMenuItem implements UI.Toolbar.Provider {
   readonly #itemInternal: UI.Toolbar.ToolbarMenuButton;
   constructor() {
-    this.#itemInternal = new UI.Toolbar.ToolbarMenuButton(this.#handleContextMenu.bind(this), true, 'main-menu');
+    this.#itemInternal = new UI.Toolbar.ToolbarMenuButton(
+        this.#handleContextMenu.bind(this), /* isIconDropdown */ true, /* useSoftMenu */ true, 'main-menu');
+    this.#itemInternal.setGlyph('dots-vertical');
     this.#itemInternal.element.classList.add('main-menu');
     this.#itemInternal.setTitle(i18nString(UIStrings.customizeAndControlDevtools));
   }
diff --git a/front_end/panels/console/ConsoleView.ts b/front_end/panels/console/ConsoleView.ts
index cc5139f..029a3e0 100644
--- a/front_end/panels/console/ConsoleView.ts
+++ b/front_end/panels/console/ConsoleView.ts
@@ -1650,9 +1650,7 @@
     ]));
 
     this.levelMenuButton =
-        new UI.Toolbar.ToolbarMenuButton(this.appendLevelMenuItems.bind(this), undefined, 'log-level');
-    this.levelMenuButton.setGlyph('');
-    this.levelMenuButton.turnIntoSelect();
+        new UI.Toolbar.ToolbarMenuButton(this.appendLevelMenuItems.bind(this), undefined, undefined, 'log-level');
 
     this.updateLevelMenuButtonText();
     this.messageLevelFiltersSetting.addChangeListener(this.updateLevelMenuButtonText.bind(this));
diff --git a/front_end/panels/emulation/DeviceModeToolbar.ts b/front_end/panels/emulation/DeviceModeToolbar.ts
index cdb35df..b3955ad 100644
--- a/front_end/panels/emulation/DeviceModeToolbar.ts
+++ b/front_end/panels/emulation/DeviceModeToolbar.ts
@@ -190,7 +190,7 @@
  * than in the DevTools panel itself. Therefore, we need to fall back to using the
  * built-in tooltip by setting the title attribute on the button's element.
  */
-function setTitleForButton(button: UI.Toolbar.ToolbarButton, title: string): void {
+function setTitleForButton(button: UI.Toolbar.ToolbarButton|UI.Toolbar.ToolbarMenuButton, title: string): void {
   button.setTitle(title);
   button.element.title = title;
 }
@@ -314,9 +314,8 @@
   private fillLeftToolbar(toolbar: UI.Toolbar.Toolbar): void {
     toolbar.appendToolbarItem(this.wrapToolbarItem(this.createEmptyToolbarElement()));
     this.deviceSelectItem =
-        new UI.Toolbar.ToolbarMenuButton(this.appendDeviceMenuItems.bind(this), undefined, 'device');
-    this.deviceSelectItem.setGlyph('');
-    this.deviceSelectItem.turnIntoSelect(true);
+        new UI.Toolbar.ToolbarMenuButton(this.appendDeviceMenuItems.bind(this), undefined, undefined, 'device');
+    this.deviceSelectItem.turnShrinkable();
     this.deviceSelectItem.setDarkText();
     toolbar.appendToolbarItem(this.deviceSelectItem);
   }
@@ -335,30 +334,26 @@
 
   private fillRightToolbar(toolbar: UI.Toolbar.Toolbar): void {
     toolbar.appendToolbarItem(this.wrapToolbarItem(this.createEmptyToolbarElement()));
-    this.scaleItem = new UI.Toolbar.ToolbarMenuButton(this.appendScaleMenuItems.bind(this), undefined, 'scale');
+    this.scaleItem =
+        new UI.Toolbar.ToolbarMenuButton(this.appendScaleMenuItems.bind(this), undefined, undefined, 'scale');
     setTitleForButton(this.scaleItem, i18nString(UIStrings.zoom));
-    this.scaleItem.setGlyph('');
-    this.scaleItem.turnIntoSelect();
     this.scaleItem.setDarkText();
     toolbar.appendToolbarItem(this.scaleItem);
 
     toolbar.appendToolbarItem(this.wrapToolbarItem(this.createEmptyToolbarElement()));
 
-    this.deviceScaleItem =
-        new UI.Toolbar.ToolbarMenuButton(this.appendDeviceScaleMenuItems.bind(this), undefined, 'device-pixel-ratio');
+    this.deviceScaleItem = new UI.Toolbar.ToolbarMenuButton(
+        this.appendDeviceScaleMenuItems.bind(this), undefined, undefined, 'device-pixel-ratio');
     this.deviceScaleItem.setVisible(this.showDeviceScaleFactorSetting.get());
     setTitleForButton(this.deviceScaleItem, i18nString(UIStrings.devicePixelRatio));
-    this.deviceScaleItem.setGlyph('');
-    this.deviceScaleItem.turnIntoSelect();
     this.deviceScaleItem.setDarkText();
     toolbar.appendToolbarItem(this.deviceScaleItem);
 
     toolbar.appendToolbarItem(this.wrapToolbarItem(this.createEmptyToolbarElement()));
-    this.uaItem = new UI.Toolbar.ToolbarMenuButton(this.appendUserAgentMenuItems.bind(this), undefined, 'device-type');
+    this.uaItem =
+        new UI.Toolbar.ToolbarMenuButton(this.appendUserAgentMenuItems.bind(this), undefined, undefined, 'device-type');
     this.uaItem.setVisible(this.showUserAgentTypeSetting.get());
     setTitleForButton(this.uaItem, i18nString(UIStrings.deviceType));
-    this.uaItem.setGlyph('');
-    this.uaItem.turnIntoSelect();
     this.uaItem.setDarkText();
     toolbar.appendToolbarItem(this.uaItem);
 
@@ -380,10 +375,8 @@
 
     // Show posture toolbar menu for foldable devices.
     toolbar.appendToolbarItem(this.wrapToolbarItem(this.createEmptyToolbarElement()));
-    this.postureItem =
-        new UI.Toolbar.ToolbarMenuButton(this.appendDevicePostureItems.bind(this), undefined, 'device-posture');
-    this.postureItem.setGlyph('');
-    this.postureItem.turnIntoSelect();
+    this.postureItem = new UI.Toolbar.ToolbarMenuButton(
+        this.appendDevicePostureItems.bind(this), undefined, undefined, 'device-posture');
     this.postureItem.setDarkText();
     setTitleForButton(this.postureItem, i18nString(UIStrings.devicePosture));
     toolbar.appendToolbarItem(this.postureItem);
@@ -413,7 +406,7 @@
   private fillOptionsToolbar(toolbar: UI.Toolbar.Toolbar): void {
     toolbar.appendToolbarItem(this.wrapToolbarItem(this.createEmptyToolbarElement()));
     const moreOptionsButton =
-        new UI.Toolbar.ToolbarMenuButton(this.appendOptionsMenuItems.bind(this), undefined, 'more-options');
+        new UI.Toolbar.ToolbarMenuButton(this.appendOptionsMenuItems.bind(this), undefined, undefined, 'more-options');
     setTitleForButton(moreOptionsButton, i18nString(UIStrings.moreOptions));
     toolbar.appendToolbarItem(moreOptionsButton);
   }
diff --git a/front_end/panels/mobile_throttling/ThrottlingManager.ts b/front_end/panels/mobile_throttling/ThrottlingManager.ts
index 110e2fc..c374a8a 100644
--- a/front_end/panels/mobile_throttling/ThrottlingManager.ts
+++ b/front_end/panels/mobile_throttling/ThrottlingManager.ts
@@ -227,10 +227,8 @@
   }
 
   createMobileThrottlingButton(): UI.Toolbar.ToolbarMenuButton {
-    const button = new UI.Toolbar.ToolbarMenuButton(appendItems, undefined, 'mobile-throttling');
+    const button = new UI.Toolbar.ToolbarMenuButton(appendItems, undefined, undefined, 'mobile-throttling');
     button.setTitle(i18nString(UIStrings.throttling));
-    button.setGlyph('');
-    button.turnIntoSelect();
     button.setDarkText();
 
     let options: ConditionsList = [];
diff --git a/front_end/panels/sources/SourcesPanel.ts b/front_end/panels/sources/SourcesPanel.ts
index 354370c..279c8dd 100644
--- a/front_end/panels/sources/SourcesPanel.ts
+++ b/front_end/panels/sources/SourcesPanel.ts
@@ -248,8 +248,9 @@
     tabbedPane.headerElement().setAttribute(
         'jslog',
         `${VisualLogging.toolbar('navigator').track({keydown: 'ArrowUp|ArrowLeft|ArrowDown|ArrowRight|Enter|Space'})}`);
-    const navigatorMenuButton =
-        new UI.Toolbar.ToolbarMenuButton(this.populateNavigatorMenu.bind(this), true, 'more-options');
+    const navigatorMenuButton = new UI.Toolbar.ToolbarMenuButton(
+        this.populateNavigatorMenu.bind(this), /* isIconDropdown */ true, /* useSoftMenu */ true, 'more-options');
+    navigatorMenuButton.setGlyph('dots-vertical');
     navigatorMenuButton.setTitle(i18nString(UIStrings.moreOptions));
     tabbedPane.rightToolbar().appendToolbarItem(navigatorMenuButton);
     tabbedPane.addEventListener(
diff --git a/front_end/ui/legacy/Toolbar.ts b/front_end/ui/legacy/Toolbar.ts
index ed9964c..55e3c59 100644
--- a/front_end/ui/legacy/Toolbar.ts
+++ b/front_end/ui/legacy/Toolbar.ts
@@ -655,6 +655,79 @@
   }
 }
 
+export class ToolbarCombobox extends ToolbarItem<ToolbarButton.EventTypes> {
+  private readonly glyphElement: IconButton.Icon.Icon;
+  private textElement: HTMLElement;
+  private text?: string;
+  private glyph?: string;
+
+  constructor(title: string, isIconDropdown?: boolean, jslogContext?: string) {
+    const element = document.createElement('button');
+    element.classList.add('toolbar-button');
+    super(element);
+    this.element.addEventListener('click', this.clicked.bind(this), false);
+    this.element.addEventListener('mousedown', this.mouseDown.bind(this), false);
+
+    this.glyphElement = new IconButton.Icon.Icon();
+    this.glyphElement.className = 'toolbar-glyph hidden';
+    this.element.appendChild(this.glyphElement);
+    this.textElement = this.element.createChild('div', 'toolbar-text hidden');
+
+    this.setTitle(title);
+    if (jslogContext) {
+      this.element.setAttribute('jslog', `${VisualLogging.action().track({click: true}).context(jslogContext)}`);
+    }
+    this.title = '';
+    if (!isIconDropdown) {
+      this.element.classList.add('toolbar-has-dropdown');
+      const dropdownArrowIcon = IconButton.Icon.create('triangle-down', 'toolbar-dropdown-arrow');
+      this.element.appendChild(dropdownArrowIcon);
+    }
+  }
+
+  setText(text: string): void {
+    if (this.text === text) {
+      return;
+    }
+    this.textElement.textContent = text;
+    this.textElement.classList.toggle('hidden', !text);
+    this.text = text;
+  }
+
+  setGlyph(glyph: string): void {
+    if (this.glyph === glyph) {
+      return;
+    }
+    this.glyphElement.name = !glyph ? null : glyph;
+    this.glyphElement.classList.toggle('hidden', !glyph);
+    this.element.classList.toggle('toolbar-has-glyph', Boolean(glyph));
+    this.glyph = glyph;
+  }
+
+  setDarkText(): void {
+    this.element.classList.add('dark-text');
+  }
+
+  turnShrinkable(): void {
+    this.element.classList.add('toolbar-has-dropdown-shrinkable');
+  }
+
+  clicked(event: Event): void {
+    if (!this.enabled) {
+      return;
+    }
+    this.dispatchEventToListeners(ToolbarButton.Events.Click, event);
+    event.consume();
+  }
+
+  protected mouseDown(event: MouseEvent): void {
+    if (!this.enabled) {
+      return;
+    }
+    this.dispatchEventToListeners(ToolbarButton.Events.MouseDown, event);
+  }
+}
+
 export namespace ToolbarButton {
   export const enum Events {
     Click = 'Click',
@@ -855,12 +928,14 @@
   }
 }
 
-export class ToolbarMenuButton extends ToolbarButton {
+export class ToolbarMenuButton extends ToolbarCombobox {
   private readonly contextMenuHandler: (arg0: ContextMenu) => void;
   private readonly useSoftMenu: boolean;
   private triggerTimeout?: number;
-  constructor(contextMenuHandler: (arg0: ContextMenu) => void, useSoftMenu?: boolean, jslogContext?: string) {
-    super('', 'dots-vertical', undefined, jslogContext);
+  constructor(
+      contextMenuHandler: (arg0: ContextMenu) => void, isIconDropdown?: boolean, useSoftMenu?: boolean,
+      jslogContext?: string) {
+    super('', isIconDropdown, jslogContext);
     if (jslogContext) {
       this.element.setAttribute('jslog', `${VisualLogging.dropDown().track({click: true}).context(jslogContext)}`);
     }
diff --git a/front_end/ui/legacy/ViewManager.ts b/front_end/ui/legacy/ViewManager.ts
index c96db6a..4fb5920 100644
--- a/front_end/ui/legacy/ViewManager.ts
+++ b/front_end/ui/legacy/ViewManager.ts
@@ -638,7 +638,9 @@
   }
 
   enableMoreTabsButton(): ToolbarMenuButton {
-    const moreTabsButton = new ToolbarMenuButton(this.appendTabsToMenu.bind(this), undefined, 'more-tabs');
+    const moreTabsButton =
+        new ToolbarMenuButton(this.appendTabsToMenu.bind(this), /* isIconDropdown */ true, undefined, 'more-tabs');
+    moreTabsButton.setGlyph('dots-vertical');
     this.tabbedPaneInternal.leftToolbar().appendToolbarItem(moreTabsButton);
     this.tabbedPaneInternal.disableOverflowMenu();
     return moreTabsButton;
diff --git a/front_end/ui/legacy/softDropDownButton.css b/front_end/ui/legacy/softDropDownButton.css
index 56d2ffe..1e2c3d34 100644
--- a/front_end/ui/legacy/softDropDownButton.css
+++ b/front_end/ui/legacy/softDropDownButton.css
@@ -5,20 +5,24 @@
  */
 
 button.soft-dropdown {
-  height: 26px;
+  height: var(--sys-size-9);
   text-align: left;
   position: relative;
   border: none;
   background: none;
   max-width: 120px;
+
+  devtools-icon {
+    top: 1px;
+  }
 }
 
 button.soft-dropdown[disabled] {
-  opacity: 50%;
+  background: var(--sys-color-state-disabled-container);
+  color: var(--sys-color-state-disabled);
 }
 
 button.soft-dropdown > .title {
-  padding-right: 5px;
   flex: 0 1 auto;
   overflow: hidden;
   text-overflow: ellipsis;
diff --git a/front_end/ui/legacy/toolbar.css b/front_end/ui/legacy/toolbar.css
index 186d99c..093e63e 100644
--- a/front_end/ui/legacy/toolbar.css
+++ b/front_end/ui/legacy/toolbar.css
@@ -83,7 +83,7 @@
 .toolbar-dropdown-arrow {
   pointer-events: none;
   flex: none;
-  margin-left: -4px;
+  top: 1px;
 }
 
 .toolbar-button.dark-text .toolbar-dropdown-arrow {
@@ -127,8 +127,39 @@
 
 .toolbar-has-dropdown {
   justify-content: space-between;
-  padding: 0 3px 0 5px;
-  border: 1px solid transparent;
+  height: var(--sys-size-9);
+  padding: 0 var(--sys-size-3) 0 var(--sys-size-5);
+  gap: var(--sys-size-2);
+  border-radius: var(--sys-shape-corner-extra-small);
+
+  &:hover::after,
+  &:active::before {
+    content: "";
+    height: 100%;
+    width: 100%;
+    border-radius: inherit;
+    position: absolute;
+    top: 0;
+    left: 0;
+  }
+
+  &:hover::after {
+    background-color: var(--sys-color-state-hover-on-subtle);
+  }
+
+  &:active::before {
+    background-color: var(--sys-color-state-ripple-neutral-on-subtle);
+  }
+
+  &:focus-visible {
+    border: 2px solid var(--sys-color-state-focus-ring);
+  }
+
+  &[disabled] {
+    pointer-events: none;
+    background-color: var(--sys-color-state-disabled-container);
+    color: var(--sys-color-state-disabled);
+  }
 }
 
 .toolbar-has-dropdown-shrinkable {
@@ -136,7 +167,7 @@
 }
 
 .toolbar-has-dropdown .toolbar-text {
-  margin: 0 4px 0 0;
+  margin: 0;
   text-overflow: ellipsis;
   flex: auto;
   overflow: hidden;
@@ -159,7 +190,7 @@
   outline: auto 5px -webkit-focus-ring-color;
 }
 
-:not(.toolbar-render-as-links) .toolbar-button:focus-visible::before {
+:not(.toolbar-render-as-links) .toolbar-button:not(.toolbar-has-dropdown):focus-visible::before {
   position: absolute;
   top: 2px;
   bottom: 2px;
@@ -319,20 +350,25 @@
   margin-bottom: 2px;
 }
 
-select.toolbar-item:disabled {
-  opacity: 50%;
-}
-
 button.toolbar-item:focus-visible,
 select.toolbar-item:focus-visible {
   background: var(--sys-color-state-hover-on-subtle);
   border-radius: 2px;
+
+  &.toolbar-has-dropdown {
+    background: none;
+    border-radius: var(--sys-shape-corner-extra-small);
+  }
 }
 
 select.toolbar-item:focus-visible > * {
   background: var(--sys-color-cdt-base-container);
   border-radius: 7px;
 }
+
+select.toolbar-item:not(.toolbar-has-dropdown):disabled {
+  opacity: 50%;
+}
 /* Input */
 
 .toolbar-input {