Title: [200176] releases/WebKitGTK/webkit-2.12/Source/WebCore
Revision
200176
Author
[email protected]
Date
2016-04-27 23:49:01 -0700 (Wed, 27 Apr 2016)

Log Message

Merge r200173 - [GTK] Overlay scrollbars with steppers enabled render incorrectly
https://bugs.webkit.org/show_bug.cgi?id=156988

Reviewed by Michael Catanzaro.

Fix rendering of scrollbars when using GTK+ themes having stepper buttons.

* platform/gtk/RenderThemeGadget.cpp:
(WebCore::RenderThemeBoxGadget::RenderThemeBoxGadget): Receive the box orientation as constructor parameter.
(WebCore::RenderThemeBoxGadget::preferredSize): Fix the preferred size calculation taking into account the box orientation.
(WebCore::RenderThemeScrollbarGadget::renderStepper): New method to render scrollbar steppers.
* platform/gtk/RenderThemeGadget.h:
(WebCore::RenderThemeGadget::context): Make this public instead of protected.
* platform/gtk/ScrollAnimatorGtk.cpp:
(WebCore::ScrollAnimatorGtk::updateOverlayScrollbarsOpacity): Invalidate the whole scrollbars instead of just
the thumb when opacity changes, because themes can actually render the trough or even stepper buttons when in
indicator mode too.
* platform/gtk/ScrollbarThemeGtk.cpp:
(WebCore::ScrollbarThemeGtk::hasButtons): Properly implement this method instead of returning true unconditionally.
(WebCore::contentsGadgetForLayout): Pass orientation to RenderThemeBoxGadget constructor.
(WebCore::ScrollbarThemeGtk::trackRect): Fix the calculation of the track rect taking stepper buttons into account.
(WebCore::ScrollbarThemeGtk::backButtonRect): Fix the calculation of the stepper button rectangle.
(WebCore::ScrollbarThemeGtk::forwardButtonRect): Ditto.
(WebCore::ScrollbarThemeGtk::paint): Use RenderThemeScrollbarGadget::renderStepper() to render the stepper
buttons, and fix the calculation of the steppers button rectangle.
(WebCore::ScrollbarThemeGtk::handleMousePressEvent): Handle clicks on stepper buttons.
(WebCore::ScrollbarThemeGtk::scrollbarThickness): Fix the calculation of the scrollbar thickness.
(WebCore::ScrollbarThemeGtk::minimumThumbLength): Pass orientation to RenderThemeBoxGadget constructor.
* platform/gtk/ScrollbarThemeGtk.h:
* rendering/RenderThemeGtk.cpp:
(WebCore::menuListColor): Ditto.
(WebCore::RenderThemeGtk::popupInternalPaddingBox): Ditto.
(WebCore::RenderThemeGtk::paintMenuList): Ditto.

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog (200175 => 200176)


--- releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog	2016-04-28 06:46:49 UTC (rev 200175)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog	2016-04-28 06:49:01 UTC (rev 200176)
@@ -1,5 +1,41 @@
 2016-04-27  Carlos Garcia Campos  <[email protected]>
 
+        [GTK] Overlay scrollbars with steppers enabled render incorrectly
+        https://bugs.webkit.org/show_bug.cgi?id=156988
+
+        Reviewed by Michael Catanzaro.
+
+        Fix rendering of scrollbars when using GTK+ themes having stepper buttons.
+
+        * platform/gtk/RenderThemeGadget.cpp:
+        (WebCore::RenderThemeBoxGadget::RenderThemeBoxGadget): Receive the box orientation as constructor parameter.
+        (WebCore::RenderThemeBoxGadget::preferredSize): Fix the preferred size calculation taking into account the box orientation.
+        (WebCore::RenderThemeScrollbarGadget::renderStepper): New method to render scrollbar steppers.
+        * platform/gtk/RenderThemeGadget.h:
+        (WebCore::RenderThemeGadget::context): Make this public instead of protected.
+        * platform/gtk/ScrollAnimatorGtk.cpp:
+        (WebCore::ScrollAnimatorGtk::updateOverlayScrollbarsOpacity): Invalidate the whole scrollbars instead of just
+        the thumb when opacity changes, because themes can actually render the trough or even stepper buttons when in
+        indicator mode too.
+        * platform/gtk/ScrollbarThemeGtk.cpp:
+        (WebCore::ScrollbarThemeGtk::hasButtons): Properly implement this method instead of returning true unconditionally.
+        (WebCore::contentsGadgetForLayout): Pass orientation to RenderThemeBoxGadget constructor.
+        (WebCore::ScrollbarThemeGtk::trackRect): Fix the calculation of the track rect taking stepper buttons into account.
+        (WebCore::ScrollbarThemeGtk::backButtonRect): Fix the calculation of the stepper button rectangle.
+        (WebCore::ScrollbarThemeGtk::forwardButtonRect): Ditto.
+        (WebCore::ScrollbarThemeGtk::paint): Use RenderThemeScrollbarGadget::renderStepper() to render the stepper
+        buttons, and fix the calculation of the steppers button rectangle.
+        (WebCore::ScrollbarThemeGtk::handleMousePressEvent): Handle clicks on stepper buttons.
+        (WebCore::ScrollbarThemeGtk::scrollbarThickness): Fix the calculation of the scrollbar thickness.
+        (WebCore::ScrollbarThemeGtk::minimumThumbLength): Pass orientation to RenderThemeBoxGadget constructor.
+        * platform/gtk/ScrollbarThemeGtk.h:
+        * rendering/RenderThemeGtk.cpp:
+        (WebCore::menuListColor): Ditto.
+        (WebCore::RenderThemeGtk::popupInternalPaddingBox): Ditto.
+        (WebCore::RenderThemeGtk::paintMenuList): Ditto.
+
+2016-04-27  Carlos Garcia Campos  <[email protected]>
+
         Unreviewed. Fix compatibility issue with 2.12.1 regarding local storage access from file URLs.
 
         * page/SecurityOrigin.cpp:

Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/RenderThemeGadget.cpp (200175 => 200176)


--- releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/RenderThemeGadget.cpp	2016-04-28 06:46:49 UTC (rev 200175)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/RenderThemeGadget.cpp	2016-04-28 06:49:01 UTC (rev 200176)
@@ -199,8 +199,9 @@
     gtk_render_focus(m_context.get(), cr, rect.x(), rect.y(), rect.width(), rect.height());
 }
 
-RenderThemeBoxGadget::RenderThemeBoxGadget(const RenderThemeGadget::Info& info, const Vector<RenderThemeGadget::Info> children, RenderThemeGadget* parent)
+RenderThemeBoxGadget::RenderThemeBoxGadget(const RenderThemeGadget::Info& info, GtkOrientation orientation, const Vector<RenderThemeGadget::Info> children, RenderThemeGadget* parent)
     : RenderThemeGadget(info, parent, Vector<RenderThemeGadget::Info>(), 0)
+    , m_orientation(orientation)
 {
     m_children.reserveCapacity(children.size());
     unsigned index = 0;
@@ -210,10 +211,21 @@
 
 IntSize RenderThemeBoxGadget::preferredSize() const
 {
-    IntSize minSize = RenderThemeGadget::preferredSize();
-    for (const auto& child : m_children)
-        minSize += child->preferredSize();
-    return minSize;
+    IntSize childrenSize;
+    for (const auto& child : m_children) {
+        IntSize childSize = child->preferredSize();
+        switch (m_orientation) {
+        case GTK_ORIENTATION_HORIZONTAL:
+            childrenSize.setWidth(childrenSize.width() + childSize.width());
+            childrenSize.setHeight(std::max(childrenSize.height(), childSize.height()));
+            break;
+        case GTK_ORIENTATION_VERTICAL:
+            childrenSize.setWidth(std::max(childrenSize.width(), childSize.width()));
+            childrenSize.setHeight(childrenSize.height() + childSize.height());
+            break;
+        }
+    }
+    return RenderThemeGadget::preferredSize().expandedTo(childrenSize);
 }
 
 RenderThemeTextFieldGadget::RenderThemeTextFieldGadget(const RenderThemeGadget::Info& info, RenderThemeGadget* parent, const Vector<RenderThemeGadget::Info> siblings, unsigned position)
@@ -348,6 +360,27 @@
         m_steppers |= Steppers::SecondaryForward;
 }
 
+void RenderThemeScrollbarGadget::renderStepper(cairo_t* cr, const FloatRect& paintRect, RenderThemeGadget* stepperGadget, GtkOrientation orientation, Steppers stepper)
+{
+    FloatRect contentsRect;
+    stepperGadget->render(cr, paintRect, &contentsRect);
+    double angle;
+    switch (stepper) {
+    case Steppers::Backward:
+    case Steppers::SecondaryBackward:
+        angle = orientation == GTK_ORIENTATION_VERTICAL ? 0 : 3 * (G_PI / 2);
+        break;
+    case Steppers::Forward:
+    case Steppers::SecondaryForward:
+        angle = orientation == GTK_ORIENTATION_VERTICAL ? G_PI / 2 : G_PI;
+        break;
+    }
+
+    int stepperSize = std::max(contentsRect.width(), contentsRect.height());
+    gtk_render_arrow(stepperGadget->context(), cr, angle, contentsRect.x() + (contentsRect.width() - stepperSize) / 2,
+        contentsRect.y() + (contentsRect.height() - stepperSize) / 2, stepperSize);
+}
+
 } // namespace WebCore
 
 #endif // GTK_CHECK_VERSION(3, 20, 0)

Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/RenderThemeGadget.h (200175 => 200176)


--- releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/RenderThemeGadget.h	2016-04-28 06:46:49 UTC (rev 200175)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/RenderThemeGadget.h	2016-04-28 06:49:01 UTC (rev 200176)
@@ -75,8 +75,9 @@
     Color backgroundColor() const;
     double opacity() const;
 
+    GtkStyleContext* context() const { return m_context.get(); }
+
 protected:
-    GtkStyleContext* context() const { return m_context.get(); }
     GtkBorder marginBox() const;
     GtkBorder borderBox() const;
     GtkBorder paddingBox() const;
@@ -86,7 +87,7 @@
 
 class RenderThemeBoxGadget final : public RenderThemeGadget {
 public:
-    RenderThemeBoxGadget(const RenderThemeGadget::Info&, const Vector<RenderThemeGadget::Info> children, RenderThemeGadget* parent = nullptr);
+    RenderThemeBoxGadget(const RenderThemeGadget::Info&, GtkOrientation, const Vector<RenderThemeGadget::Info> children, RenderThemeGadget* parent = nullptr);
 
     IntSize preferredSize() const override;
 
@@ -94,6 +95,7 @@
 
 private:
     Vector<std::unique_ptr<RenderThemeGadget>> m_children;
+    GtkOrientation m_orientation { GTK_ORIENTATION_HORIZONTAL };
 };
 
 class RenderThemeTextFieldGadget final : public RenderThemeGadget {
@@ -159,6 +161,8 @@
     };
     OptionSet<Steppers> steppers() const { return m_steppers; };
 
+    void renderStepper(cairo_t*, const FloatRect&, RenderThemeGadget*, GtkOrientation, Steppers);
+
 private:
     OptionSet<Steppers> m_steppers;
 };

Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/ScrollAnimatorGtk.cpp (200175 => 200176)


--- releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/ScrollAnimatorGtk.cpp	2016-04-28 06:46:49 UTC (rev 200175)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/ScrollAnimatorGtk.cpp	2016-04-28 06:49:01 UTC (rev 200176)
@@ -153,13 +153,13 @@
     if (m_verticalOverlayScrollbar && m_overlayScrollbarAnimationCurrent != m_verticalOverlayScrollbar->opacity()) {
         m_verticalOverlayScrollbar->setOpacity(m_overlayScrollbarAnimationCurrent);
         if (m_verticalOverlayScrollbar->hoveredPart() == NoPart)
-            ScrollbarTheme::theme().invalidatePart(*m_verticalOverlayScrollbar, ThumbPart);
+            m_verticalOverlayScrollbar->invalidate();
     }
 
     if (m_horizontalOverlayScrollbar && m_overlayScrollbarAnimationCurrent != m_horizontalOverlayScrollbar->opacity()) {
         m_horizontalOverlayScrollbar->setOpacity(m_overlayScrollbarAnimationCurrent);
         if (m_horizontalOverlayScrollbar->hoveredPart() == NoPart)
-            ScrollbarTheme::theme().invalidatePart(*m_horizontalOverlayScrollbar, ThumbPart);
+            m_horizontalOverlayScrollbar->invalidate();
     }
 }
 

Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/ScrollbarThemeGtk.cpp (200175 => 200176)


--- releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/ScrollbarThemeGtk.cpp	2016-04-28 06:46:49 UTC (rev 200175)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/ScrollbarThemeGtk.cpp	2016-04-28 06:49:01 UTC (rev 200176)
@@ -129,6 +129,11 @@
 }
 #endif // GTK_CHECK_VERSION(3, 20, 0)
 
+bool ScrollbarThemeGtk::hasButtons(Scrollbar& scrollbar)
+{
+    return scrollbar.enabled() && (m_hasBackButtonStartPart || m_hasForwardButtonEndPart || m_hasBackButtonEndPart || m_hasForwardButtonStartPart);
+}
+
 #if GTK_CHECK_VERSION(3, 20, 0)
 static GtkStateFlags scrollbarPartStateFlags(Scrollbar& scrollbar, ScrollbarPart part, bool painting = false)
 {
@@ -185,7 +190,7 @@
     return RenderThemeGadget::create(info);
 }
 
-static std::unique_ptr<RenderThemeBoxGadget> contentsGadgetForLayout(Scrollbar& scrollbar, RenderThemeGadget* parent, IntRect& contentsRect, Vector<int, 4> steppersPosition)
+static std::unique_ptr<RenderThemeBoxGadget> contentsGadgetForLayout(Scrollbar& scrollbar, RenderThemeGadget* parent, IntRect& contentsRect, Vector<int, 4>& steppersPosition)
 {
     Vector<RenderThemeGadget::Info> children;
     auto steppers = static_cast<RenderThemeScrollbarGadget*>(parent)->steppers();
@@ -207,7 +212,8 @@
         children.append({ RenderThemeGadget::Type::Generic, "button", scrollbarPartStateFlags(scrollbar, ForwardButtonEndPart), { "down" } });
     }
     RenderThemeGadget::Info info = { RenderThemeGadget::Type::Generic, "contents", GTK_STATE_FLAG_NORMAL, { } };
-    auto contentsGadget = std::make_unique<RenderThemeBoxGadget>(info, children, parent);
+    auto contentsGadget = std::make_unique<RenderThemeBoxGadget>(info, scrollbar.orientation() == VerticalScrollbar ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL,
+        children, parent);
 
     GtkBorder scrollbarContentsBox = parent->contentsBox();
     GtkBorder contentsContentsBox = contentsGadget->contentsBox();
@@ -230,16 +236,24 @@
     auto contentsGadget = contentsGadgetForLayout(scrollbar, scrollbarGadget.get(), rect, steppersPosition);
 
     if (steppersPosition[0] != -1) {
-        if (scrollbar.orientation() == VerticalScrollbar)
-            rect.move(0, contentsGadget->child(steppersPosition[0])->preferredSize().height());
-        else
-            rect.move(contentsGadget->child(steppersPosition[0])->preferredSize().width(), 0);
+        IntSize stepperSize = contentsGadget->child(steppersPosition[0])->preferredSize();
+        if (scrollbar.orientation() == VerticalScrollbar) {
+            rect.move(0, stepperSize.height());
+            rect.contract(0, stepperSize.height());
+        } else {
+            rect.move(stepperSize.width(), 0);
+            rect.contract(stepperSize.width(), 0);
+        }
     }
     if (steppersPosition[1] != -1) {
-        if (scrollbar.orientation() == VerticalScrollbar)
-            rect.move(0, contentsGadget->child(steppersPosition[1])->preferredSize().height());
-        else
-            rect.move(contentsGadget->child(steppersPosition[1])->preferredSize().width(), 0);
+        IntSize stepperSize = contentsGadget->child(steppersPosition[1])->preferredSize();
+        if (scrollbar.orientation() == VerticalScrollbar) {
+            rect.move(0, stepperSize.height());
+            rect.contract(0, stepperSize.height());
+        } else {
+            rect.move(stepperSize.width(), 0);
+            rect.contract(stepperSize.width(), 0);
+        }
     }
     if (steppersPosition[2] != -1) {
         if (scrollbar.orientation() == VerticalScrollbar)
@@ -327,18 +341,16 @@
 
     // Secondary back.
     if (steppersPosition[1] != -1) {
-        if (scrollbar.orientation() == VerticalScrollbar)
-            rect.move(0, contentsGadget->child(steppersPosition[1])->preferredSize().height());
-        else
-            rect.move(contentsGadget->child(steppersPosition[1])->preferredSize().width(), 0);
+        IntSize preferredSize = contentsGadget->child(steppersPosition[1])->preferredSize();
+        if (scrollbar.orientation() == VerticalScrollbar) {
+            rect.move(0, preferredSize.height());
+            rect.contract(0, preferredSize.height());
+        } else {
+            rect.move(preferredSize.width(), 0);
+            rect.contract(0, preferredSize.width());
+        }
     }
 
-    IntSize preferredSize = contentsGadget->child(steppersPosition[2])->preferredSize();
-    if (scrollbar.orientation() == VerticalScrollbar)
-        rect.contract(0, preferredSize.height());
-    else
-        rect.contract(preferredSize.width(), 0);
-
     if (steppersPosition[3] != -1) {
         if (scrollbar.orientation() == VerticalScrollbar)
             rect.contract(0, contentsGadget->child(steppersPosition[3])->preferredSize().height());
@@ -346,10 +358,11 @@
             rect.contract(contentsGadget->child(steppersPosition[3])->preferredSize().width(), 0);
     }
 
+    IntSize preferredSize = contentsGadget->child(steppersPosition[2])->preferredSize();
     if (scrollbar.orientation() == VerticalScrollbar)
-        rect.move(0, rect.height());
+        rect.move(0, rect.height() - preferredSize.height());
     else
-        rect.move(rect.width(), 0);
+        rect.move(rect.width() - preferredSize.width(), 0);
 
     return IntRect(rect.location(), preferredSize);
 }
@@ -366,15 +379,30 @@
     auto contentsGadget = contentsGadgetForLayout(scrollbar, scrollbarGadget.get(), rect, steppersPosition);
 
     if (steppersPosition[0] != -1) {
-        if (scrollbar.orientation() == VerticalScrollbar)
-            rect.move(0, contentsGadget->child(steppersPosition[0])->preferredSize().height());
-        else
-            rect.move(contentsGadget->child(steppersPosition[0])->preferredSize().width(), 0);
+        IntSize preferredSize = contentsGadget->child(steppersPosition[0])->preferredSize();
+        if (scrollbar.orientation() == VerticalScrollbar) {
+            rect.move(0, preferredSize.height());
+            rect.contract(0, preferredSize.height());
+        } else {
+            rect.move(preferredSize.width(), 0);
+            rect.contract(preferredSize.width(), 0);
+        }
     }
 
-    if (part == ForwardButtonStartPart)
-        return IntRect(rect.location(), contentsGadget->child(1)->preferredSize());
+    if (steppersPosition[1] != -1) {
+        IntSize preferredSize = contentsGadget->child(steppersPosition[1])->preferredSize();
+        if (part == ForwardButtonStartPart)
+            return IntRect(rect.location(), preferredSize);
 
+        if (scrollbar.orientation() == VerticalScrollbar) {
+            rect.move(0, preferredSize.height());
+            rect.contract(0, preferredSize.height());
+        } else {
+            rect.move(preferredSize.width(), 0);
+            rect.contract(preferredSize.width(), 0);
+        }
+    }
+
     // Forward button.
     IntSize preferredSize = contentsGadget->child(steppersPosition[3])->preferredSize();
     if (scrollbar.orientation() == VerticalScrollbar)
@@ -442,6 +470,9 @@
     if (graphicsContext.paintingDisabled())
         return false;
 
+    if (!scrollbar.enabled())
+        return true;
+
     double opacity = scrollbar.hoveredPart() == NoPart ? scrollbar.opacity() : 1;
     if (!opacity)
         return true;
@@ -495,7 +526,8 @@
         steppersPosition[3] = children.size();
         children.append({ RenderThemeGadget::Type::Generic, "button", scrollbarPartStateFlags(scrollbar, ForwardButtonEndPart), { "down" } });
     }
-    auto contentsGadget = std::make_unique<RenderThemeBoxGadget>(info, children, scrollbarGadget.get());
+    auto contentsGadget = std::make_unique<RenderThemeBoxGadget>(info, scrollbar.orientation() == VerticalScrollbar ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL,
+        children, scrollbarGadget.get());
     RenderThemeGadget* troughGadget = contentsGadget->child(troughPosition);
 
     if (opacity != 1) {
@@ -507,52 +539,79 @@
     FloatRect contentsRect;
     scrollbarGadget->render(graphicsContext.platformContext()->cr(), rect, &contentsRect);
     contentsGadget->render(graphicsContext.platformContext()->cr(), contentsRect, &contentsRect);
-    troughGadget->render(graphicsContext.platformContext()->cr(), contentsRect, &contentsRect);
-    FloatRect buttonRect = contentsRect;
+
     if (steppers.contains(RenderThemeScrollbarGadget::Steppers::Backward)) {
         RenderThemeGadget* buttonGadget = contentsGadget->child(steppersPosition[0]);
+        FloatRect buttonRect = contentsRect;
         if (scrollbar.orientation() == VerticalScrollbar)
             buttonRect.setHeight(buttonGadget->preferredSize().height());
         else
             buttonRect.setWidth(buttonGadget->preferredSize().width());
-        buttonGadget->render(graphicsContext.platformContext()->cr(), buttonRect);
-        if (scrollbar.orientation() == VerticalScrollbar)
-            buttonRect.move(0, buttonRect.height());
-        else
-            buttonRect.move(buttonRect.width(), 0);
+        static_cast<RenderThemeScrollbarGadget*>(scrollbarGadget.get())->renderStepper(graphicsContext.platformContext()->cr(), buttonRect, buttonGadget,
+            scrollbar.orientation() == VerticalScrollbar ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL, RenderThemeScrollbarGadget::Steppers::Backward);
+        if (scrollbar.orientation() == VerticalScrollbar) {
+            contentsRect.move(0, buttonRect.height());
+            contentsRect.contract(0, buttonRect.height());
+        } else {
+            contentsRect.move(buttonRect.width(), 0);
+            contentsRect.contract(buttonRect.width(), 0);
+        }
     }
     if (steppers.contains(RenderThemeScrollbarGadget::Steppers::SecondaryForward)) {
         RenderThemeGadget* buttonGadget = contentsGadget->child(steppersPosition[1]);
+        FloatRect buttonRect = contentsRect;
         if (scrollbar.orientation() == VerticalScrollbar)
             buttonRect.setHeight(buttonGadget->preferredSize().height());
         else
             buttonRect.setWidth(buttonGadget->preferredSize().width());
-        buttonGadget->render(graphicsContext.platformContext()->cr(), buttonRect);
+        static_cast<RenderThemeScrollbarGadget*>(scrollbarGadget.get())->renderStepper(graphicsContext.platformContext()->cr(), buttonRect, buttonGadget,
+            scrollbar.orientation() == VerticalScrollbar ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL, RenderThemeScrollbarGadget::Steppers::SecondaryForward);
+        if (scrollbar.orientation() == VerticalScrollbar) {
+            contentsRect.move(0, buttonRect.height());
+            contentsRect.contract(0, buttonRect.height());
+        } else {
+            contentsRect.move(buttonRect.width(), 0);
+            contentsRect.contract(buttonRect.width(), 0);
+        }
+    }
+
+    if (steppers.contains(RenderThemeScrollbarGadget::Steppers::Forward)) {
+        RenderThemeGadget* buttonGadget = contentsGadget->child(steppersPosition[3]);
+        FloatRect buttonRect = contentsRect;
+        if (scrollbar.orientation() == VerticalScrollbar) {
+            buttonRect.setHeight(buttonGadget->preferredSize().height());
+            buttonRect.move(0, contentsRect.height() - buttonRect.height());
+        } else {
+            buttonRect.setWidth(buttonGadget->preferredSize().width());
+            buttonRect.move(contentsRect.width() - buttonRect.width(), 0);
+        }
+        static_cast<RenderThemeScrollbarGadget*>(scrollbarGadget.get())->renderStepper(graphicsContext.platformContext()->cr(), buttonRect, buttonGadget,
+            scrollbar.orientation() == VerticalScrollbar ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL, RenderThemeScrollbarGadget::Steppers::Forward);
         if (scrollbar.orientation() == VerticalScrollbar)
-            buttonRect.move(0, contentsRect.height());
+            contentsRect.contract(0, buttonRect.height());
         else
-            buttonRect.move(contentsRect.width(), 0);
+            contentsRect.contract(buttonRect.width(), 0);
     }
     if (steppers.contains(RenderThemeScrollbarGadget::Steppers::SecondaryBackward)) {
         RenderThemeGadget* buttonGadget = contentsGadget->child(steppersPosition[2]);
-        if (scrollbar.orientation() == VerticalScrollbar)
+        FloatRect buttonRect = contentsRect;
+        if (scrollbar.orientation() == VerticalScrollbar) {
             buttonRect.setHeight(buttonGadget->preferredSize().height());
-        else
+            buttonRect.move(0, contentsRect.height() - buttonRect.height());
+        } else {
             buttonRect.setWidth(buttonGadget->preferredSize().width());
-        buttonGadget->render(graphicsContext.platformContext()->cr(), buttonRect);
+            buttonRect.move(contentsRect.width() - buttonRect.width(), 0);
+        }
+        static_cast<RenderThemeScrollbarGadget*>(scrollbarGadget.get())->renderStepper(graphicsContext.platformContext()->cr(), buttonRect, buttonGadget,
+            scrollbar.orientation() == VerticalScrollbar ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL, RenderThemeScrollbarGadget::Steppers::SecondaryBackward);
         if (scrollbar.orientation() == VerticalScrollbar)
-            buttonRect.move(0, buttonRect.height());
+            contentsRect.contract(0, buttonRect.height());
         else
-            buttonRect.move(buttonRect.width(), 0);
+            contentsRect.contract(buttonRect.width(), 0);
     }
-    if (steppers.contains(RenderThemeScrollbarGadget::Steppers::Forward)) {
-        RenderThemeGadget* buttonGadget = contentsGadget->child(steppersPosition[3]);
-        if (scrollbar.orientation() == VerticalScrollbar)
-            buttonRect.setHeight(buttonGadget->preferredSize().height());
-        else
-            buttonRect.setWidth(buttonGadget->preferredSize().width());
-        buttonGadget->render(graphicsContext.platformContext()->cr(), buttonRect);
-    }
+
+    troughGadget->render(graphicsContext.platformContext()->cr(), contentsRect, &contentsRect);
+
     if (int thumbSize = thumbLength(scrollbar)) {
         info.name = "slider";
         info.state = scrollbarPartStateFlags(scrollbar, ThumbPart);
@@ -758,6 +817,11 @@
         if (event.button() != RightButton)
             return ScrollbarButtonPressAction::StartDrag;
         break;
+    case BackButtonStartPart:
+    case ForwardButtonStartPart:
+    case BackButtonEndPart:
+    case ForwardButtonEndPart:
+        return ScrollbarButtonPressAction::Scroll;
     default:
         break;
     }
@@ -788,12 +852,13 @@
         children.append({ RenderThemeGadget::Type::Generic, "button", GTK_STATE_FLAG_NORMAL, { "up" } });
     if (steppers.contains(RenderThemeScrollbarGadget::Steppers::Forward))
         children.append({ RenderThemeGadget::Type::Generic, "button", GTK_STATE_FLAG_NORMAL, { "down" } });
-    auto contentsGadget = std::make_unique<RenderThemeBoxGadget>(info, children, scrollbarGadget.get());
+    auto contentsGadget = std::make_unique<RenderThemeBoxGadget>(info, GTK_ORIENTATION_VERTICAL, children, scrollbarGadget.get());
     info.name = "slider";
     auto sliderGadget = RenderThemeGadget::create(info, contentsGadget->child(troughPositon));
     IntSize preferredSize = scrollbarGadget->preferredSize();
-    preferredSize += contentsGadget->preferredSize();
-    preferredSize += sliderGadget->preferredSize();
+    IntSize contentsPreferredSize = contentsGadget->preferredSize();
+    contentsPreferredSize = contentsPreferredSize.expandedTo(sliderGadget->preferredSize());
+    preferredSize += contentsPreferredSize;
 
     return preferredSize.width();
 }
@@ -818,7 +883,7 @@
     info.state = GTK_STATE_FLAG_NORMAL;
     info.classList.clear();
     Vector<RenderThemeGadget::Info> children = {{ RenderThemeGadget::Type::Generic, "trough", GTK_STATE_FLAG_PRELIGHT, { } } };
-    auto contentsGadget = std::make_unique<RenderThemeBoxGadget>(info, children, scrollbarGadget.get());
+    auto contentsGadget = std::make_unique<RenderThemeBoxGadget>(info, GTK_ORIENTATION_VERTICAL, children, scrollbarGadget.get());
     info.name = "slider";
     IntSize minSize = RenderThemeGadget::create(info, contentsGadget->child(0))->minimumSize();
     return scrollbar.orientation() == VerticalScrollbar ? minSize.height() : minSize.width();
@@ -852,6 +917,11 @@
 {
     return IntRect();
 }
+
+bool ScrollbarThemeGtk::hasButtons(Scrollbar&)
+{
+    return false;
+}
 #endif // GTK_API_VERSION_2
 
 }

Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/ScrollbarThemeGtk.h (200175 => 200176)


--- releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/ScrollbarThemeGtk.h	2016-04-28 06:46:49 UTC (rev 200175)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/ScrollbarThemeGtk.h	2016-04-28 06:49:01 UTC (rev 200176)
@@ -37,7 +37,7 @@
 public:
     virtual ~ScrollbarThemeGtk();
 
-    virtual bool hasButtons(Scrollbar&) override { return true; }
+    virtual bool hasButtons(Scrollbar&) override;
     virtual bool hasThumb(Scrollbar&) override;
     virtual IntRect backButtonRect(Scrollbar&, ScrollbarPart, bool) override;
     virtual IntRect forwardButtonRect(Scrollbar&, ScrollbarPart, bool) override;

Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderThemeGtk.cpp (200175 => 200176)


--- releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderThemeGtk.cpp	2016-04-28 06:46:49 UTC (rev 200175)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderThemeGtk.cpp	2016-04-28 06:49:01 UTC (rev 200176)
@@ -783,7 +783,7 @@
     };
     info.name = "box";
     info.classList = { "horizontal", "linked" };
-    return RenderThemeBoxGadget(info, children, comboGadget.get()).child(0)->color();
+    return RenderThemeBoxGadget(info, GTK_ORIENTATION_HORIZONTAL, children, comboGadget.get()).child(0)->color();
 #else
     GRefPtr<GtkStyleContext> parentStyleContext = createStyleContext(ComboBox);
     GRefPtr<GtkStyleContext> buttonStyleContext = createStyleContext(ComboBoxButton, parentStyleContext.get());
@@ -835,7 +835,7 @@
     };
     info.name = "box";
     info.classList = { "horizontal", "linked" };
-    auto boxGadget = std::make_unique<RenderThemeBoxGadget>(info, children, comboGadget.get());
+    auto boxGadget = std::make_unique<RenderThemeBoxGadget>(info, GTK_ORIENTATION_HORIZONTAL, children, comboGadget.get());
     RenderThemeGadget* buttonGadget = boxGadget->child(0);
     info.classList.removeLast();
     auto buttonBoxGadget = RenderThemeGadget::create(info, buttonGadget);
@@ -866,7 +866,7 @@
     };
     info.name = "box";
     info.classList = { "horizontal", "linked" };
-    auto boxGadget = std::make_unique<RenderThemeBoxGadget>(info, children, comboGadget.get());
+    auto boxGadget = std::make_unique<RenderThemeBoxGadget>(info, GTK_ORIENTATION_HORIZONTAL, children, comboGadget.get());
     RenderThemeGadget* buttonGadget = boxGadget->child(0);
     info.classList.removeLast();
     auto buttonBoxGadget = RenderThemeGadget::create(info, buttonGadget);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to