Bug 1428676 Part 3 - Rename menulist-button to menulist-button-orig and make behavior of menulist-button like menulist on Linux. r?mats draft
authorlochang <lochang@mozilla.com>
Wed, 10 Jan 2018 15:17:50 +0800
changeset 719526 e40c3159771b1e1ba305b2ce7ad5768cb02214fa
parent 719525 ae3791ef15310dd9dfe84c4edad144112a7a2aa2
child 719527 46fad9985c854f6229257bfd4feb17ce1b7b271f
push id95280
push userlochang@mozilla.com
push dateFri, 12 Jan 2018 09:19:41 +0000
reviewersmats
bugs1428676
milestone59.0a1
Bug 1428676 Part 3 - Rename menulist-button to menulist-button-orig and make behavior of menulist-button like menulist on Linux. r?mats MozReview-Commit-ID: 41Y0BVQLVlc
widget/gtk/nsNativeThemeGTK.cpp
widget/headless/HeadlessThemeGTK.cpp
--- a/widget/gtk/nsNativeThemeGTK.cpp
+++ b/widget/gtk/nsNativeThemeGTK.cpp
@@ -262,17 +262,18 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
 
       aState->focused = TRUE;
       aState->depressed = TRUE; // see moz_gtk_entry_paint()
     } else if (aWidgetType == NS_THEME_BUTTON ||
                aWidgetType == NS_THEME_TOOLBARBUTTON ||
                aWidgetType == NS_THEME_DUALBUTTON ||
                aWidgetType == NS_THEME_TOOLBARBUTTON_DROPDOWN ||
                aWidgetType == NS_THEME_MENULIST ||
-               aWidgetType == NS_THEME_MENULIST_BUTTON) {
+               aWidgetType == NS_THEME_MENULIST_BUTTON ||
+               aWidgetType == NS_THEME_MENULIST_BUTTON_ORIG) {
       aState->active &= aState->inHover;
     }
 
     if (IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XUL)) {
       // For these widget types, some element (either a child or parent)
       // actually has element focus, so we check the focused attribute
       // to see whether to draw in the focused state.
       if (aWidgetType == NS_THEME_NUMBER_INPUT ||
@@ -369,26 +370,29 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
 
       // A button with drop down menu open or an activated toggle button
       // should always appear depressed.
       if (aWidgetType == NS_THEME_BUTTON ||
           aWidgetType == NS_THEME_TOOLBARBUTTON ||
           aWidgetType == NS_THEME_DUALBUTTON ||
           aWidgetType == NS_THEME_TOOLBARBUTTON_DROPDOWN ||
           aWidgetType == NS_THEME_MENULIST ||
-          aWidgetType == NS_THEME_MENULIST_BUTTON) {
+          aWidgetType == NS_THEME_MENULIST_BUTTON ||
+          aWidgetType == NS_THEME_MENULIST_BUTTON_ORIG) {
         bool menuOpen = IsOpenButton(aFrame);
         aState->depressed = IsCheckedButton(aFrame) || menuOpen;
         // we must not highlight buttons with open drop down menus on hover.
         aState->inHover = aState->inHover && !menuOpen;
       }
 
       // When the input field of the drop down button has focus, some themes
       // should draw focus for the drop down button as well.
-      if (aWidgetType == NS_THEME_MENULIST_BUTTON && aWidgetFlags) {
+      if ((aWidgetType == NS_THEME_MENULIST_BUTTON_ORIG && aWidgetFlags) ||
+          (aWidgetType == NS_THEME_MENULIST_BUTTON && aWidgetFlags &&
+            !mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled"))) {
         *aWidgetFlags = CheckBooleanAttr(aFrame, nsGkAtoms::parentfocused);
       }
     }
   }
 
   switch (aWidgetType) {
   case NS_THEME_BUTTON:
     if (aWidgetFlags)
@@ -563,24 +567,34 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
   case NS_THEME_TREETWISTYOPEN:
     aGtkWidgetType = MOZ_GTK_TREEVIEW_EXPANDER;
     if (aWidgetFlags)
       *aWidgetFlags = GTK_EXPANDER_EXPANDED;
     break;
   case NS_THEME_MENULIST:
     aGtkWidgetType = MOZ_GTK_DROPDOWN;
     if (aWidgetFlags)
-        *aWidgetFlags = IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XHTML);
+      *aWidgetFlags = IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XHTML);
     break;
   case NS_THEME_MENULIST_TEXT:
     return false; // nothing to do, but prevents the bg from being drawn
   case NS_THEME_MENULIST_TEXTFIELD:
     aGtkWidgetType = MOZ_GTK_DROPDOWN_ENTRY;
     break;
-  case NS_THEME_MENULIST_BUTTON:
+  case NS_THEME_MENULIST_BUTTON: {
+    if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+      aGtkWidgetType = MOZ_GTK_DROPDOWN;
+      if (aWidgetFlags)
+        *aWidgetFlags = IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XHTML);
+    } else {
+      aGtkWidgetType = MOZ_GTK_DROPDOWN_ARROW;
+    }
+    break;
+  }
+  case NS_THEME_MENULIST_BUTTON_ORIG:
     aGtkWidgetType = MOZ_GTK_DROPDOWN_ARROW;
     break;
   case NS_THEME_TOOLBARBUTTON_DROPDOWN:
   case NS_THEME_BUTTON_ARROW_DOWN:
   case NS_THEME_BUTTON_ARROW_UP:
   case NS_THEME_BUTTON_ARROW_NEXT:
   case NS_THEME_BUTTON_ARROW_PREVIOUS:
     aGtkWidgetType = MOZ_GTK_TOOLBARBUTTON_ARROW;
@@ -1381,17 +1395,23 @@ nsNativeThemeGTK::GetWidgetPadding(nsDev
     case NS_THEME_TOOLBARBUTTON:
     case NS_THEME_WINDOW_BUTTON_CLOSE:
     case NS_THEME_WINDOW_BUTTON_MINIMIZE:
     case NS_THEME_WINDOW_BUTTON_MAXIMIZE:
     case NS_THEME_WINDOW_BUTTON_RESTORE:
     case NS_THEME_DUALBUTTON:
     case NS_THEME_TAB_SCROLL_ARROW_BACK:
     case NS_THEME_TAB_SCROLL_ARROW_FORWARD:
-    case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON: {
+      if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+        return false;
+      }
+      MOZ_FALLTHROUGH;
+    }
+    case NS_THEME_MENULIST_BUTTON_ORIG:
     case NS_THEME_TOOLBARBUTTON_DROPDOWN:
     case NS_THEME_BUTTON_ARROW_UP:
     case NS_THEME_BUTTON_ARROW_DOWN:
     case NS_THEME_BUTTON_ARROW_NEXT:
     case NS_THEME_BUTTON_ARROW_PREVIOUS:
     case NS_THEME_RANGE_THUMB:
     // Radios and checkboxes return a fixed size in GetMinimumWidgetSize
     // and have a meaningful baseline, so they can't have
@@ -1578,17 +1598,17 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n
       break;
     case NS_THEME_TAB_SCROLL_ARROW_BACK:
     case NS_THEME_TAB_SCROLL_ARROW_FORWARD:
       {
         moz_gtk_get_tab_scroll_arrow_size(&aResult->width, &aResult->height);
         *aIsOverridable = false;
       }
       break;
-  case NS_THEME_MENULIST_BUTTON:
+  case NS_THEME_MENULIST_BUTTON_ORIG:
     {
       moz_gtk_get_combo_box_entry_button_size(&aResult->width,
                                               &aResult->height);
       *aIsOverridable = false;
     }
     break;
   case NS_THEME_MENUSEPARATOR:
     {
@@ -1614,16 +1634,25 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n
   case NS_THEME_BUTTON_ARROW_NEXT:
   case NS_THEME_BUTTON_ARROW_PREVIOUS:
     {
       moz_gtk_get_arrow_size(MOZ_GTK_TOOLBARBUTTON_ARROW,
                              &aResult->width, &aResult->height);
       *aIsOverridable = false;
     }
     break;
+  case NS_THEME_MENULIST_BUTTON: {
+    if (!mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+      moz_gtk_get_combo_box_entry_button_size(&aResult->width,
+                                              &aResult->height);
+      *aIsOverridable = false;
+      break;
+    }
+    MOZ_FALLTHROUGH;
+  }
   case NS_THEME_CHECKBOX_CONTAINER:
   case NS_THEME_RADIO_CONTAINER:
   case NS_THEME_CHECKBOX_LABEL:
   case NS_THEME_RADIO_LABEL:
   case NS_THEME_BUTTON:
   case NS_THEME_MENULIST:
   case NS_THEME_TOOLBARBUTTON:
   case NS_THEME_TREEHEADERCELL:
@@ -1907,17 +1936,23 @@ nsNativeThemeGTK::ThemeSupportsWidget(ns
   case NS_THEME_WINDOW_BUTTON_RESTORE:
   case NS_THEME_WINDOW_TITLEBAR:
   case NS_THEME_WINDOW_TITLEBAR_MAXIMIZED:
     // GtkHeaderBar is available on GTK 3.10+, which is used for styling
     // title bars and title buttons.
     return gtk_check_version(3, 10, 0) == nullptr &&
            !IsWidgetStyled(aPresContext, aFrame, aWidgetType);
 
-  case NS_THEME_MENULIST_BUTTON:
+  case NS_THEME_MENULIST_BUTTON: {
+    if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+      return !IsWidgetStyled(aPresContext, aFrame, aWidgetType);
+    }
+    MOZ_FALLTHROUGH;
+  }
+  case NS_THEME_MENULIST_BUTTON_ORIG:
     if (aFrame && aFrame->GetWritingMode().IsVertical()) {
       return false;
     }
     // "Native" dropdown buttons cause padding and margin problems, but only
     // in HTML so allow them in XUL.
     return (!aFrame || IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XUL)) &&
            !IsWidgetStyled(aPresContext, aFrame, aWidgetType);
 
@@ -1927,38 +1962,43 @@ nsNativeThemeGTK::ThemeSupportsWidget(ns
 
   return false;
 }
 
 NS_IMETHODIMP_(bool)
 nsNativeThemeGTK::WidgetIsContainer(uint8_t aWidgetType)
 {
   // XXXdwh At some point flesh all of this out.
-  if (aWidgetType == NS_THEME_MENULIST_BUTTON ||
+  if ((aWidgetType == NS_THEME_MENULIST_BUTTON &&
+        !mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) ||
+      aWidgetType == NS_THEME_MENULIST_BUTTON_ORIG ||
       aWidgetType == NS_THEME_RADIO ||
       aWidgetType == NS_THEME_RANGE_THUMB ||
       aWidgetType == NS_THEME_CHECKBOX ||
       aWidgetType == NS_THEME_TAB_SCROLL_ARROW_BACK ||
       aWidgetType == NS_THEME_TAB_SCROLL_ARROW_FORWARD ||
       aWidgetType == NS_THEME_BUTTON_ARROW_UP ||
       aWidgetType == NS_THEME_BUTTON_ARROW_DOWN ||
       aWidgetType == NS_THEME_BUTTON_ARROW_NEXT ||
       aWidgetType == NS_THEME_BUTTON_ARROW_PREVIOUS)
     return false;
   return true;
 }
 
 bool
 nsNativeThemeGTK::ThemeDrawsFocusForWidget(uint8_t aWidgetType)
 {
-   if (aWidgetType == NS_THEME_MENULIST ||
-      aWidgetType == NS_THEME_BUTTON || 
-      aWidgetType == NS_THEME_TREEHEADERCELL)
-    return true;
-  
+   if ((aWidgetType == NS_THEME_MENULIST_BUTTON &&
+         mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) ||
+       aWidgetType == NS_THEME_MENULIST ||
+       aWidgetType == NS_THEME_BUTTON ||
+       aWidgetType == NS_THEME_TREEHEADERCELL) {
+     return true;
+  }
+
   return false;
 }
 
 bool
 nsNativeThemeGTK::ThemeNeedsComboboxDropmarker()
 {
   return false;
 }
--- a/widget/headless/HeadlessThemeGTK.cpp
+++ b/widget/headless/HeadlessThemeGTK.cpp
@@ -82,17 +82,27 @@ HeadlessThemeGTK::GetWidgetBorder(nsDevi
       aResult->left = 6;
       break;
     case NS_THEME_MENULIST:
       aResult->top = 6;
       aResult->right = 22;
       aResult->bottom = 6;
       aResult->left = 7;
       break;
-    case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON: {
+      if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+        aResult->top = 6;
+        aResult->right = 22;
+        aResult->bottom = 6;
+        aResult->left = 7;
+        break;
+      }
+      MOZ_FALLTHROUGH;
+    }
+    case NS_THEME_MENULIST_BUTTON_ORIG:
       aResult->top = 1;
       aResult->right = 1;
       aResult->bottom = 1;
       aResult->left = 0;
       break;
     case NS_THEME_MENULIST_TEXTFIELD:
       aResult->top = 1;
       aResult->right = 0;
@@ -127,17 +137,23 @@ HeadlessThemeGTK::GetWidgetPadding(nsDev
     case NS_THEME_DUALBUTTON:
     case NS_THEME_TOOLBARBUTTON_DROPDOWN:
     case NS_THEME_BUTTON_ARROW_UP:
     case NS_THEME_BUTTON_ARROW_DOWN:
     case NS_THEME_BUTTON_ARROW_NEXT:
     case NS_THEME_BUTTON_ARROW_PREVIOUS:
     case NS_THEME_TAB_SCROLL_ARROW_BACK:
     case NS_THEME_TAB_SCROLL_ARROW_FORWARD:
-    case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON: {
+      if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+        return false;
+      }
+      MOZ_FALLTHROUGH;
+    }
+    case NS_THEME_MENULIST_BUTTON_ORIG:
     case NS_THEME_RANGE_THUMB:
     case NS_THEME_BUTTON_FOCUS:
       aResult->top = 0;
       aResult->right = 0;
       aResult->bottom = 0;
       aResult->left = 0;
       return true;
     case NS_THEME_MENUITEM:
@@ -262,17 +278,25 @@ HeadlessThemeGTK::GetMinimumWidgetSize(n
       aResult->width = 10;
       aResult->height = 31;
       *aIsOverridable = false;
       break;
     case NS_THEME_MENULIST:
       aResult->width = 44;
       aResult->height = 27;
       break;
-    case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON: {
+      if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+        aResult->width = 44;
+        aResult->height = 27;
+        break;
+      }
+      MOZ_FALLTHROUGH;
+    }
+    case NS_THEME_MENULIST_BUTTON_ORIG:
       aResult->width = 29;
       aResult->height = 28;
       *aIsOverridable = false;
       break;
     case NS_THEME_SCALETHUMB_HORIZONTAL:
     case NS_THEME_RANGE_THUMB:
       aResult->width = 14;
       aResult->height = 18;
@@ -397,27 +421,35 @@ HeadlessThemeGTK::ThemeSupportsWidget(ns
     case NS_THEME_MENUPOPUP:
     case NS_THEME_MENUITEM:
     case NS_THEME_CHECKMENUITEM:
     case NS_THEME_RADIOMENUITEM:
     case NS_THEME_MENUSEPARATOR:
     case NS_THEME_MENUARROW:
     case NS_THEME_GTK_INFO_BAR:
       return !IsWidgetStyled(aPresContext, aFrame, aWidgetType);
-    case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON: {
+      if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+        return !IsWidgetStyled(aPresContext, aFrame, aWidgetType);
+      }
+      MOZ_FALLTHROUGH;
+    }
+    case NS_THEME_MENULIST_BUTTON_ORIG:
       return (!aFrame || IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XUL)) &&
               !IsWidgetStyled(aPresContext, aFrame, aWidgetType);
   }
   return false;
 }
 
 NS_IMETHODIMP_(bool)
 HeadlessThemeGTK::WidgetIsContainer(uint8_t aWidgetType)
 {
-    if (aWidgetType == NS_THEME_MENULIST_BUTTON ||
+    if ((aWidgetType == NS_THEME_MENULIST_BUTTON &&
+          !mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) ||
+        aWidgetType == NS_THEME_MENULIST_BUTTON_ORIG ||
         aWidgetType == NS_THEME_RADIO ||
         aWidgetType == NS_THEME_RANGE_THUMB ||
         aWidgetType == NS_THEME_CHECKBOX ||
         aWidgetType == NS_THEME_TAB_SCROLL_ARROW_BACK ||
         aWidgetType == NS_THEME_TAB_SCROLL_ARROW_FORWARD ||
         aWidgetType == NS_THEME_BUTTON_ARROW_UP ||
         aWidgetType == NS_THEME_BUTTON_ARROW_DOWN ||
         aWidgetType == NS_THEME_BUTTON_ARROW_NEXT ||
@@ -426,17 +458,19 @@ HeadlessThemeGTK::WidgetIsContainer(uint
     return false;
   }
   return true;
 }
 
 bool
 HeadlessThemeGTK::ThemeDrawsFocusForWidget(uint8_t aWidgetType)
 {
-   if (aWidgetType == NS_THEME_MENULIST ||
+   if ((aWidgetType == NS_THEME_MENULIST_BUTTON &&
+          mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) ||
+       aWidgetType == NS_THEME_MENULIST ||
        aWidgetType == NS_THEME_BUTTON ||
        aWidgetType == NS_THEME_TREEHEADERCELL) {
     return true;
   }
   return false;
 }
 
 bool