Bug 1464723 part 3 - Have GTK widget support scrollcorner widget. r?karlt draft
authorXidorn Quan <me@upsuper.org>
Wed, 25 Jul 2018 22:32:33 +1000
changeset 822835 3163e29ee647bb1d3930871b21690fc68da8793a
parent 822834 ee7691f46e506db60d3a892024484f5080bc30ea
push id117479
push userxquan@mozilla.com
push dateThu, 26 Jul 2018 00:48:20 +0000
reviewerskarlt
bugs1464723
milestone63.0a1
Bug 1464723 part 3 - Have GTK widget support scrollcorner widget. r?karlt mix-blend-mode-parent-element-overflow-scroll.html is already broken if the scrollbars are transparent. This patch makes the scrollcorner trans- parent as well, which leads to failure of it on infra (where scrollbars are opaque by default). Thus its reference is updated so that it passes even if scrollbar is transparent. scrollbar-vertical-rl.html has the same problem, but it seems the only difference between test file and the reference is the background, so it makes no sense to update the reference. Also I don't really see what this test is really trying to check, thus I mark it failing for now. MozReview-Commit-ID: 2vaWispPwXc
testing/web-platform/meta/css/css-writing-modes/scrollbar-vertical-rl-ref.html.ini
testing/web-platform/tests/css/compositing/mix-blend-mode/reference/mix-blend-mode-parent-element-overflow-scroll-ref.html
widget/gtk/gtk3drawing.cpp
widget/gtk/gtkdrawing.h
widget/gtk/nsNativeThemeGTK.cpp
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/scrollbar-vertical-rl-ref.html.ini
@@ -0,0 +1,2 @@
+[scrollbar-vertical-rl.html]
+  expected: FAIL
--- a/testing/web-platform/tests/css/compositing/mix-blend-mode/reference/mix-blend-mode-parent-element-overflow-scroll-ref.html
+++ b/testing/web-platform/tests/css/compositing/mix-blend-mode/reference/mix-blend-mode-parent-element-overflow-scroll-ref.html
@@ -3,16 +3,17 @@
     <head>
         <meta charset="utf-8">
         <title>CSS Reftest Reference</title>
         <link rel="author" title="Mirela Budăeș" href="mailto:mbudaes@adobe.com">
         <link rel="author" title="Ion Roșca" href="mailto:rosca@adobe.com">
         <link rel="reviewer" title="Mihai Țică" href="mailto:mitica@adobe.com">
         <style type="text/css">
             .parent {
+                background: yellow;
                 width: 140px;
                 height: 140px;
                 position: relative;
                 z-index: 1;
                 overflow:scroll;
             }
             .blended {
                 background: lime;
--- a/widget/gtk/gtk3drawing.cpp
+++ b/widget/gtk/gtk3drawing.cpp
@@ -3251,23 +3251,30 @@ moz_gtk_widget_paint(WidgetNodeType widg
         break;
     case MOZ_GTK_SCROLLBAR_BUTTON:
         return moz_gtk_scrollbar_button_paint(cr, rect, state,
                                               (GtkScrollbarButtonFlags) flags,
                                               direction);
         break;
     case MOZ_GTK_SCROLLBAR_HORIZONTAL:
     case MOZ_GTK_SCROLLBAR_VERTICAL:
+    case MOZ_GTK_SCROLLBAR_JUNCTION:
         if (flags & MOZ_GTK_TRACK_OPAQUE) {
             GtkStyleContext* style =
                 GetStyleContext(MOZ_GTK_WINDOW, direction);
             AutoAddGtkStyleProvider addStyle(style, extra_style);
             gtk_render_background(style, cr,
                                   rect->x, rect->y, rect->width, rect->height);
         }
+        if (widget == MOZ_GTK_SCROLLBAR_JUNCTION) {
+          // Just draw the window background for junction for now. If we
+          // want to fully simulate what GTK+ does, we should probably
+          // also paint the junction CSS node.
+          return MOZ_GTK_SUCCESS;
+        }
         if (gtk_check_version(3,20,0) == nullptr) {
           return moz_gtk_scrollbar_paint(widget, cr, rect, state, direction);
         } else {
           WidgetNodeType trough_widget = (widget == MOZ_GTK_SCROLLBAR_HORIZONTAL) ?
               MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL : MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL;
           return moz_gtk_scrollbar_trough_paint(trough_widget, cr, rect,
                                                 state, direction);
         }
--- a/widget/gtk/gtkdrawing.h
+++ b/widget/gtk/gtkdrawing.h
@@ -178,16 +178,19 @@ typedef enum {
   MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL,
 
   /* Vertical GtkScrollbar counterparts */
   MOZ_GTK_SCROLLBAR_VERTICAL,
   MOZ_GTK_SCROLLBAR_CONTENTS_VERTICAL,
   MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL,
   MOZ_GTK_SCROLLBAR_THUMB_VERTICAL,
 
+  /* Paints the junction (scrollcorner) of a scrolled window. */
+  MOZ_GTK_SCROLLBAR_JUNCTION,
+
   /* Paints a GtkScale. */
   MOZ_GTK_SCALE_HORIZONTAL,
   MOZ_GTK_SCALE_VERTICAL,
   /* Paints a GtkScale trough. */
   MOZ_GTK_SCALE_CONTENTS_HORIZONTAL,
   MOZ_GTK_SCALE_CONTENTS_VERTICAL,
   MOZ_GTK_SCALE_TROUGH_HORIZONTAL,
   MOZ_GTK_SCALE_TROUGH_VERTICAL,
--- a/widget/gtk/nsNativeThemeGTK.cpp
+++ b/widget/gtk/nsNativeThemeGTK.cpp
@@ -428,16 +428,24 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
       // 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) {
         *aWidgetFlags = CheckBooleanAttr(aFrame, nsGkAtoms::parentfocused);
       }
     }
   }
 
+  auto maySetOpaqueFlag = [this, aFrame, aWidgetType, aWidgetFlags]() {
+    if (GetWidgetTransparency(aFrame, aWidgetType) == eOpaque) {
+      *aWidgetFlags = MOZ_GTK_TRACK_OPAQUE;
+    } else {
+      *aWidgetFlags = 0;
+    }
+  };
+
   switch (aWidgetType) {
   case NS_THEME_BUTTON:
     if (aWidgetFlags)
       *aWidgetFlags = GTK_RELIEF_NORMAL;
     aGtkWidgetType = MOZ_GTK_BUTTON;
     break;
   case NS_THEME_TOOLBARBUTTON:
   case NS_THEME_DUALBUTTON:
@@ -455,40 +463,38 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
   case NS_THEME_SCROLLBARBUTTON_UP:
   case NS_THEME_SCROLLBARBUTTON_DOWN:
   case NS_THEME_SCROLLBARBUTTON_LEFT:
   case NS_THEME_SCROLLBARBUTTON_RIGHT:
     aGtkWidgetType = MOZ_GTK_SCROLLBAR_BUTTON;
     break;
   case NS_THEME_SCROLLBAR_VERTICAL:
     aGtkWidgetType = MOZ_GTK_SCROLLBAR_VERTICAL;
-    if (GetWidgetTransparency(aFrame, aWidgetType) == eOpaque)
-        *aWidgetFlags = MOZ_GTK_TRACK_OPAQUE;
-    else
-        *aWidgetFlags = 0;
+    maySetOpaqueFlag();
     break;
   case NS_THEME_SCROLLBAR_HORIZONTAL:
     aGtkWidgetType = MOZ_GTK_SCROLLBAR_HORIZONTAL;
-    if (GetWidgetTransparency(aFrame, aWidgetType) == eOpaque)
-        *aWidgetFlags = MOZ_GTK_TRACK_OPAQUE;
-    else
-        *aWidgetFlags = 0;
+    maySetOpaqueFlag();
     break;
   case NS_THEME_SCROLLBARTRACK_HORIZONTAL:
     aGtkWidgetType = MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL;
     break;
   case NS_THEME_SCROLLBARTRACK_VERTICAL:
     aGtkWidgetType = MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL;
     break;
   case NS_THEME_SCROLLBARTHUMB_VERTICAL:
     aGtkWidgetType = MOZ_GTK_SCROLLBAR_THUMB_VERTICAL;
     break;
   case NS_THEME_SCROLLBARTHUMB_HORIZONTAL:
     aGtkWidgetType = MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL;
     break;
+  case NS_THEME_SCROLLCORNER:
+    aGtkWidgetType = MOZ_GTK_SCROLLBAR_JUNCTION;
+    maySetOpaqueFlag();
+    break;
   case NS_THEME_INNER_SPIN_BUTTON:
     aGtkWidgetType = MOZ_GTK_INNER_SPIN_BUTTON;
     break;
   case NS_THEME_SPINNER:
     aGtkWidgetType = MOZ_GTK_SPINBUTTON;
     break;
   case NS_THEME_SPINNER_UPBUTTON:
     aGtkWidgetType = MOZ_GTK_SPINBUTTON_UP;
@@ -1971,16 +1977,17 @@ nsNativeThemeGTK::ThemeSupportsWidget(ns
   case NS_THEME_SCROLLBARBUTTON_LEFT:
   case NS_THEME_SCROLLBARBUTTON_RIGHT:
   case NS_THEME_SCROLLBAR_HORIZONTAL:
   case NS_THEME_SCROLLBAR_VERTICAL:
   case NS_THEME_SCROLLBARTRACK_HORIZONTAL:
   case NS_THEME_SCROLLBARTRACK_VERTICAL:
   case NS_THEME_SCROLLBARTHUMB_HORIZONTAL:
   case NS_THEME_SCROLLBARTHUMB_VERTICAL:
+  case NS_THEME_SCROLLCORNER:
   case NS_THEME_NUMBER_INPUT:
   case NS_THEME_TEXTFIELD:
   case NS_THEME_TEXTFIELD_MULTILINE:
   case NS_THEME_RANGE:
   case NS_THEME_RANGE_THUMB:
   case NS_THEME_SCALE_HORIZONTAL:
   case NS_THEME_SCALETHUMB_HORIZONTAL:
   case NS_THEME_SCALE_VERTICAL:
@@ -2075,16 +2082,17 @@ nsNativeThemeGTK::GetWidgetTransparency(
   switch (aWidgetType) {
   // These widgets always draw a default background.
   case NS_THEME_MENUPOPUP:
   case NS_THEME_WINDOW:
   case NS_THEME_DIALOG:
     return eOpaque;
   case NS_THEME_SCROLLBAR_VERTICAL:
   case NS_THEME_SCROLLBAR_HORIZONTAL:
+  case NS_THEME_SCROLLCORNER:
 #ifdef MOZ_WIDGET_GTK
     // Make scrollbar tracks opaque on the window's scroll frame to prevent
     // leaf layers from overlapping. See bug 1179780.
     if (!(CheckBooleanAttr(aFrame, nsGkAtoms::root_) &&
           aFrame->PresContext()->IsRootContentDocument() &&
           IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XUL)))
       return eTransparent;
 #endif