REGRESSION (WK2): Holding down Option while dragging scrollbar thumb has no effect...
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Apr 2011 07:26:53 +0000 (07:26 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Apr 2011 07:26:53 +0000 (07:26 +0000)
https://bugs.webkit.org/show_bug.cgi?id=59315

Reviewed by Maciej Stachowiak.

* platform/Scrollbar.cpp:
(WebCore::Scrollbar::Scrollbar): Initialize new member variables.
(WebCore::Scrollbar::moveThumb): Added a boolean draggingDocument parameter. When true, the document
is scrolled a distance equal to the change in the mouse position.
(WebCore::Scrollbar::mouseMoved): Check with the theme whether the mouse move event should drag
the document rather than the thumb, and pass the result to moveThumb.
(WebCore::Scrollbar::mouseUp): Reset m_draggingDocument.
* platform/Scrollbar.h:
* platform/ScrollbarTheme.h:
(WebCore::ScrollbarTheme::shouldDragDocumentInsteadOfThumb): Added. The base class implementation
returns false.
* platform/mac/ScrollbarThemeMac.h:
* platform/mac/ScrollbarThemeMac.mm:
(WebCore::ScrollbarThemeMac::shouldDragDocumentInsteadOfThumb): Overridden to return true if the
Option key is down.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@84767 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/Scrollbar.cpp
Source/WebCore/platform/Scrollbar.h
Source/WebCore/platform/ScrollbarTheme.h
Source/WebCore/platform/mac/ScrollbarThemeMac.h
Source/WebCore/platform/mac/ScrollbarThemeMac.mm

index d0f90ef..ffb5474 100644 (file)
@@ -1,3 +1,26 @@
+2011-04-25  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Maciej Stachowiak.
+
+        REGRESSION (WK2): Holding down Option while dragging scrollbar thumb has no effect (should make scroll distance equal mouse translation)
+        https://bugs.webkit.org/show_bug.cgi?id=59315
+
+        * platform/Scrollbar.cpp:
+        (WebCore::Scrollbar::Scrollbar): Initialize new member variables.
+        (WebCore::Scrollbar::moveThumb): Added a boolean draggingDocument parameter. When true, the document
+        is scrolled a distance equal to the change in the mouse position.
+        (WebCore::Scrollbar::mouseMoved): Check with the theme whether the mouse move event should drag
+        the document rather than the thumb, and pass the result to moveThumb.
+        (WebCore::Scrollbar::mouseUp): Reset m_draggingDocument.
+        * platform/Scrollbar.h:
+        * platform/ScrollbarTheme.h:
+        (WebCore::ScrollbarTheme::shouldDragDocumentInsteadOfThumb): Added. The base class implementation
+        returns false.
+        * platform/mac/ScrollbarThemeMac.h:
+        * platform/mac/ScrollbarThemeMac.mm:
+        (WebCore::ScrollbarThemeMac::shouldDragDocumentInsteadOfThumb): Overridden to return true if the
+        Option key is down.
+
 2011-04-24  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Sam Weinig.
index e59b763..a1d7916 100644 (file)
@@ -33,6 +33,7 @@
 #include "FrameView.h"
 #include "GraphicsContext.h"
 #include "PlatformMouseEvent.h"
+#include "ScrollAnimator.h"
 #include "ScrollableArea.h"
 #include "ScrollbarTheme.h"
 
@@ -77,6 +78,8 @@ Scrollbar::Scrollbar(ScrollableArea* scrollableArea, ScrollbarOrientation orient
     , m_hoveredPart(NoPart)
     , m_pressedPart(NoPart)
     , m_pressedPos(0)
+    , m_draggingDocument(false)
+    , m_documentDragPos(0)
     , m_enabled(true)
     , m_scrollTimer(this, &Scrollbar::autoscrollTimerFired)
     , m_overlapsResizer(false)
@@ -253,14 +256,38 @@ ScrollGranularity Scrollbar::pressedPartScrollGranularity()
     return ScrollByPage;
 }
 
-void Scrollbar::moveThumb(int pos)
+void Scrollbar::moveThumb(int pos, bool draggingDocument)
 {
+    if (!m_scrollableArea)
+        return;
+
+    int delta = pos - m_pressedPos;
+
+    if (draggingDocument) {
+        if (m_draggingDocument)
+            delta = pos - m_documentDragPos;
+        m_draggingDocument = true;
+        FloatPoint currentPosition = m_scrollableArea->scrollAnimator()->currentPosition();
+        int destinationPosition = (m_orientation == HorizontalScrollbar ? currentPosition.x() : currentPosition.y()) + delta;
+        if (delta > 0)
+            destinationPosition = min(destinationPosition + delta, maximum());
+        else if (delta < 0)
+            destinationPosition = max(destinationPosition + delta, 0);
+        m_scrollableArea->scrollToOffsetWithoutAnimation(m_orientation, destinationPosition);
+        m_documentDragPos = pos;
+        return;
+    }
+
+    if (m_draggingDocument) {
+        delta += m_pressedPos - m_documentDragPos;
+        m_draggingDocument = false;
+    }
+
     // Drag the thumb.
     int thumbPos = theme()->thumbPosition(this);
     int thumbLen = theme()->thumbLength(this);
     int trackLen = theme()->trackLength(this);
     int maxPos = trackLen - thumbLen;
-    int delta = pos - m_pressedPos;
     if (delta > 0)
         delta = min(maxPos - thumbPos, delta);
     else if (delta < 0)
@@ -268,8 +295,7 @@ void Scrollbar::moveThumb(int pos)
     
     if (delta) {
         float newPosition = static_cast<float>(thumbPos + delta) * maximum() / (trackLen - thumbLen);
-        if (m_scrollableArea)
-            m_scrollableArea->scrollToOffsetWithoutAnimation(m_orientation, newPosition);
+        m_scrollableArea->scrollToOffsetWithoutAnimation(m_orientation, newPosition);
     }
 }
 
@@ -307,7 +333,7 @@ bool Scrollbar::mouseMoved(const PlatformMouseEvent& evt)
         } else {
             moveThumb(m_orientation == HorizontalScrollbar ? 
                       convertFromContainingWindow(evt.pos()).x() :
-                      convertFromContainingWindow(evt.pos()).y());
+                      convertFromContainingWindow(evt.pos()).y(), theme()->shouldDragDocumentInsteadOfThumb(this, evt));
         }
         return true;
     }
@@ -347,6 +373,7 @@ bool Scrollbar::mouseUp()
 {
     setPressedPart(NoPart);
     m_pressedPos = 0;
+    m_draggingDocument = false;
     stopTimerIfNeeded();
 
     if (parent() && parent()->isFrameView())
index 161f51e..4a4a60a 100644 (file)
@@ -140,7 +140,7 @@ protected:
     ScrollDirection pressedPartScrollDirection();
     ScrollGranularity pressedPartScrollGranularity();
     
-    void moveThumb(int pos);
+    void moveThumb(int pos, bool draggingDocument = false);
 
     ScrollableArea* m_scrollableArea;
     ScrollbarOrientation m_orientation;
@@ -158,7 +158,9 @@ protected:
     ScrollbarPart m_hoveredPart;
     ScrollbarPart m_pressedPart;
     int m_pressedPos;
-    
+    bool m_draggingDocument;
+    int m_documentDragPos;
+
     bool m_enabled;
 
     Timer<Scrollbar> m_scrollTimer;
index f5a10b7..dbd24b8 100644 (file)
@@ -81,6 +81,7 @@ public:
 
     virtual bool shouldCenterOnThumb(Scrollbar*, const PlatformMouseEvent&) { return false; }
     virtual bool shouldSnapBackToDragOrigin(Scrollbar*, const PlatformMouseEvent&) { return false; }
+    virtual bool shouldDragDocumentInsteadOfThumb(Scrollbar*, const PlatformMouseEvent&) { return false; }
     virtual int thumbPosition(Scrollbar*) { return 0; } // The position of the thumb relative to the track.
     virtual int thumbLength(Scrollbar*) { return 0; } // The length of the thumb along the axis of the scrollbar.
     virtual int trackPosition(Scrollbar*) { return 0; } // The position of the track relative to the scrollbar.
index bd56808..ca91249 100644 (file)
@@ -69,6 +69,7 @@ protected:
     virtual int minimumThumbLength(Scrollbar*);
     
     virtual bool shouldCenterOnThumb(Scrollbar*, const PlatformMouseEvent&);
+    virtual bool shouldDragDocumentInsteadOfThumb(Scrollbar*, const PlatformMouseEvent&);
     
 public:
     void preferencesChanged();
index 932a6f0..0e57cd6 100644 (file)
@@ -406,6 +406,11 @@ bool ScrollbarThemeMac::shouldCenterOnThumb(Scrollbar*, const PlatformMouseEvent
     return evt.altKey();
 }
 
+bool ScrollbarThemeMac::shouldDragDocumentInsteadOfThumb(Scrollbar*, const PlatformMouseEvent& event)
+{
+    return event.altKey();
+}
+
 static int scrollbarPartToHIPressedState(ScrollbarPart part)
 {
     switch (part) {