Bug 1428676 Part 2 - Rename menulist-button to menulist-button-orig and make behavior of menulist-button like menulist on Mac. r?mats draft
authorLouis Chang <lochang@mozilla.com>
Fri, 12 Jan 2018 17:18:10 +0800
changeset 719525 ae3791ef15310dd9dfe84c4edad144112a7a2aa2
parent 719524 09c00e0caeca162c5df19fd1571130d4ddb2bd33
child 719526 e40c3159771b1e1ba305b2ce7ad5768cb02214fa
push id95280
push userlochang@mozilla.com
push dateFri, 12 Jan 2018 09:19:41 +0000
reviewersmats
bugs1428676
milestone59.0a1
Bug 1428676 Part 2 - Rename menulist-button to menulist-button-orig and make behavior of menulist-button like menulist on Mac. r?mats MozReview-Commit-ID: CB9ZaGd4ZJ1
widget/cocoa/nsNativeThemeCocoa.mm
--- a/widget/cocoa/nsNativeThemeCocoa.mm
+++ b/widget/cocoa/nsNativeThemeCocoa.mm
@@ -2643,17 +2643,27 @@ nsNativeThemeCocoa::DrawWidgetBackground
       DrawStatusBar(cgContext, macRect, aFrame);
       break;
 
     case NS_THEME_MENULIST:
     case NS_THEME_MENULIST_TEXTFIELD:
       DrawDropdown(cgContext, macRect, eventState, aWidgetType, aFrame);
       break;
 
-    case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON: {
+      if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+        DrawDropdown(cgContext, macRect, eventState, aWidgetType, aFrame);
+      } else {
+        DrawButton(cgContext, kThemeArrowButton, macRect, false, kThemeButtonOn,
+                   kThemeAdornmentArrowDownArrow, eventState, aFrame);
+      }
+      break;
+    }
+
+    case NS_THEME_MENULIST_BUTTON_ORIG:
       DrawButton(cgContext, kThemeArrowButton, macRect, false, kThemeButtonOn,
                  kThemeAdornmentArrowDownArrow, eventState, aFrame);
       break;
 
     case NS_THEME_GROUPBOX: {
       HIThemeGroupBoxDrawInfo gdi = { 0, kThemeStateActive, kHIThemeGroupBoxKindPrimary };
       HIThemeDrawGroupBox(&macRect, &gdi, cgContext, HITHEME_ORIENTATION);
       break;
@@ -3063,16 +3073,17 @@ nsNativeThemeCocoa::CreateWebRenderComma
     case NS_THEME_TOOLBARBUTTON:
     case NS_THEME_SEPARATOR:
     case NS_THEME_TOOLBAR:
     case NS_THEME_WINDOW_TITLEBAR:
     case NS_THEME_STATUSBAR:
     case NS_THEME_MENULIST:
     case NS_THEME_MENULIST_TEXTFIELD:
     case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON_ORIG:
     case NS_THEME_GROUPBOX:
     case NS_THEME_TEXTFIELD:
     case NS_THEME_NUMBER_INPUT:
     case NS_THEME_SEARCHFIELD:
     case NS_THEME_PROGRESSBAR:
     case NS_THEME_PROGRESSBAR_VERTICAL:
     case NS_THEME_METERBAR:
     case NS_THEME_TREETWISTY:
@@ -3228,16 +3239,17 @@ nsNativeThemeCocoa::GetWidgetBorder(nsDe
       // nsCheckboxRadioFrame::GetIntrinsicWidth and nsCheckboxRadioFrame::GetIntrinsicHeight
       // assume a border width of 2px.
       aResult->SizeTo(2, 2, 2, 2);
       break;
     }
 
     case NS_THEME_MENULIST:
     case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON_ORIG:
       *aResult = DirectionAwareMargin(kAquaDropdownBorder, aFrame);
       break;
 
     case NS_THEME_MENULIST_TEXTFIELD:
       *aResult = DirectionAwareMargin(kAquaComboboxBorder, aFrame);
       break;
 
     case NS_THEME_NUMBER_INPUT:
@@ -3352,16 +3364,17 @@ nsNativeThemeCocoa::GetWidgetOverflow(ns
     case NS_THEME_TOOLBARBUTTON:
     case NS_THEME_NUMBER_INPUT:
     case NS_THEME_TEXTFIELD:
     case NS_THEME_TEXTFIELD_MULTILINE:
     case NS_THEME_SEARCHFIELD:
     case NS_THEME_LISTBOX:
     case NS_THEME_MENULIST:
     case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON_ORIG:
     case NS_THEME_MENULIST_TEXTFIELD:
     case NS_THEME_CHECKBOX:
     case NS_THEME_RADIO:
     case NS_THEME_TAB:
     case NS_THEME_FOCUS_OUTLINE:
     {
       overflow.SizeTo(kMaxFocusRingWidth,
                       kMaxFocusRingWidth,
@@ -3480,16 +3493,17 @@ nsNativeThemeCocoa::GetMinimumWidgetSize
       }
       aResult->SizeTo(buttonWidth, buttonHeight);
       *aIsOverridable = true;
       break;
     }
 
     case NS_THEME_MENULIST:
     case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON_ORIG:
     {
       SInt32 popupHeight = 0;
       ::GetThemeMetric(kThemeMetricPopupButtonHeight, &popupHeight);
       aResult->SizeTo(0, popupHeight);
       break;
     }
 
     case NS_THEME_NUMBER_INPUT:
@@ -3795,26 +3809,29 @@ nsNativeThemeCocoa::ThemeChanged()
   return NS_OK;
 }
 
 bool
 nsNativeThemeCocoa::ThemeSupportsWidget(nsPresContext* aPresContext, nsIFrame* aFrame,
                                       uint8_t aWidgetType)
 {
   // if this is a dropdown button in a combobox the answer is always no
-  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)) {
     nsIFrame* parentFrame = aFrame->GetParent();
     if (parentFrame && parentFrame->IsComboboxControlFrame())
       return false;
   }
 
   switch (aWidgetType) {
     // Combobox dropdowns don't support native theming in vertical mode.
     case NS_THEME_MENULIST:
     case NS_THEME_MENULIST_BUTTON:
+    case NS_THEME_MENULIST_BUTTON_ORIG:
     case NS_THEME_MENULIST_TEXT:
     case NS_THEME_MENULIST_TEXTFIELD:
       if (aFrame && aFrame->GetWritingMode().IsVertical()) {
         return false;
       }
       MOZ_FALLTHROUGH;
 
     case NS_THEME_LISTBOX:
@@ -3928,26 +3945,32 @@ nsNativeThemeCocoa::ThemeSupportsWidget(
   return false;
 }
 
 bool
 nsNativeThemeCocoa::WidgetIsContainer(uint8_t aWidgetType)
 {
   // flesh this out at some point
   switch (aWidgetType) {
-   case NS_THEME_MENULIST_BUTTON:
-   case NS_THEME_RADIO:
-   case NS_THEME_CHECKBOX:
-   case NS_THEME_PROGRESSBAR:
-   case NS_THEME_METERBAR:
-   case NS_THEME_RANGE:
-   case NS_THEME_MAC_HELP_BUTTON:
-   case NS_THEME_MAC_DISCLOSURE_BUTTON_OPEN:
-   case NS_THEME_MAC_DISCLOSURE_BUTTON_CLOSED:
-    return false;
+    case NS_THEME_MENULIST_BUTTON: {
+      if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+        return true;
+      }
+      MOZ_FALLTHROUGH;
+    }
+    case NS_THEME_MENULIST_BUTTON_ORIG:
+    case NS_THEME_RADIO:
+    case NS_THEME_CHECKBOX:
+    case NS_THEME_PROGRESSBAR:
+    case NS_THEME_METERBAR:
+    case NS_THEME_RANGE:
+    case NS_THEME_MAC_HELP_BUTTON:
+    case NS_THEME_MAC_DISCLOSURE_BUTTON_OPEN:
+    case NS_THEME_MAC_DISCLOSURE_BUTTON_CLOSED:
+      return false;
   }
   return true;
 }
 
 bool
 nsNativeThemeCocoa::ThemeDrawsFocusForWidget(uint8_t aWidgetType)
 {
   if (aWidgetType == NS_THEME_MENULIST ||