Fix for bug 9222, cursor is wrong when mousing over overflow scrollbars in...
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Sep 2006 06:46:35 +0000 (06:46 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Sep 2006 06:46:35 +0000 (06:46 +0000)
        selectCursor checks for whether or not a scrollbar was hit.  Also stub out a mouseMoved method for
        scrollbars to provide hover feedback if needed.

        Reviewed by Eric

        * page/FrameView.cpp:
        (WebCore::selectCursor):
        (WebCore::FrameView::handleMouseMoveEvent):
        * platform/ScrollBar.h:
        (WebCore::ScrollBar::mouseMoved):

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

WebCore/ChangeLog
WebCore/page/FrameView.cpp
WebCore/platform/ScrollBar.h
WebCore/rendering/RenderLayer.cpp

index b43fb08736b72c550da91297660f0e8a3795b813..26c5eb20c79884b6759aa4c66215e051165b785d 100644 (file)
@@ -1,3 +1,17 @@
+2006-09-27  David Hyatt  <hyatt@apple.com>
+
+        Fix for bug 9222, cursor is wrong when mousing over overflow scrollbars in textareas.  Make sure
+        selectCursor checks for whether or not a scrollbar was hit.  Also stub out a mouseMoved method for
+        scrollbars to provide hover feedback if needed.
+
+        Reviewed by Eric
+
+        * page/FrameView.cpp:
+        (WebCore::selectCursor):
+        (WebCore::FrameView::handleMouseMoveEvent):
+        * platform/ScrollBar.h:
+        (WebCore::ScrollBar::mouseMoved):
+
 2006-09-27  MorganL  <morganl.webkit@yahoo.com>
 
         Reviewed by Maciej and Adam, landed by Adam
index a94bb3c71c0bfc95fca147a37c51ef7d1f00bb7a..2be880b05e48cd30ef24914729c952861599d85f 100644 (file)
@@ -40,6 +40,7 @@
 #include "MouseEventWithHitTestResults.h"
 #include "OverflowEvent.h"
 #include "PlatformKeyboardEvent.h"
+#include "PlatformScrollBar.h"
 #include "PlatformWheelEvent.h"
 #include "RenderArena.h"
 #include "RenderPart.h"
@@ -98,6 +99,7 @@ public:
         underMouse = 0;
         oldUnder = 0;
         oldSubframe = 0;
+        oldScrollBar = 0;
         linkPressed = false;
         useSlowRepaints = false;
         slowRepaintObjectCount = 0;
@@ -128,6 +130,7 @@ public:
     RefPtr<Node> underMouse;
     RefPtr<Node> oldUnder;
     RefPtr<Frame> oldSubframe;
+    RefPtr<PlatformScrollBar> oldScrollBar;
 
     bool borderTouched : 1;
     bool borderStart : 1;
@@ -690,7 +693,7 @@ static Cursor selectCursor(const MouseEventWithHitTestResults& event, Frame* fra
             bool inResizer = false;
             if (frame->view() && layer && layer->isPointInResizeControl(frame->view()->viewportToContents(event.event().pos())))
                 inResizer = true;
-            if ((editable || (renderer && renderer->isText() && renderer->canSelect())) && !inResizer)
+            if ((editable || (renderer && renderer->isText() && renderer->canSelect())) && !inResizer && !RenderLayer::gScrollBar)
                 return iBeamCursor();
             // FIXME: If the point is in a layer's overflow scrollbars, we should use the pointer cursor
             return pointerCursor();
@@ -783,9 +786,12 @@ void FrameView::handleMouseMoveEvent(const PlatformMouseEvent& mouseEvent)
     
     if (newSubframe && d->oldSubframe != newSubframe)
         m_frame->passSubframeEventToSubframe(mev, newSubframe.get());
-    else
+    else {
+        if (RenderLayer::gScrollBar && !d->mousePressed)
+            RenderLayer::gScrollBar->mouseMoved(mouseEvent); // Handle hover effects on platforms that support visual feedback on scrollbar hovering.
         setCursor(selectCursor(mev, m_frame.get(), d->mousePressed));
-    
+    }
+
     d->oldSubframe = newSubframe;
 }
 
@@ -1148,8 +1154,10 @@ bool FrameView::dispatchMouseEvent(const AtomicString& eventType, Node* targetNo
 
     // mouseout/mouseover
     if (setUnder) {
-        if (d->oldUnder && d->oldUnder->document() != frame()->document())
+        if (d->oldUnder && d->oldUnder->document() != frame()->document()) {
             d->oldUnder = 0;
+            d->oldScrollBar = 0;
+        }
 
         if (d->oldUnder != targetNode) {
             // send mouseout event to the old node
@@ -1160,6 +1168,13 @@ bool FrameView::dispatchMouseEvent(const AtomicString& eventType, Node* targetNo
                 EventTargetNodeCast(targetNode)->dispatchMouseEvent(mouseEvent, mouseoverEvent, 0, d->oldUnder.get());
         }
         d->oldUnder = targetNode;
+                
+        if (d->oldScrollBar != RenderLayer::gScrollBar) {
+            // Send mouse exited to the old scrollbar.
+            if (d->oldScrollBar)
+                d->oldScrollBar->mouseExited();
+            d->oldScrollBar = RenderLayer::gScrollBar;
+        }
     }
 
     bool swallowEvent = false;
index cf4c9b54d54be7f3cfe3d3cb1854d25fae1796d8..fc042c273505bb58659513742e58fa1b652eda07 100644 (file)
 #ifndef ScrollBar_h
 #define ScrollBar_h
 
+#include "Shared.h"
+
 namespace WebCore {
 
 class GraphicsContext;
 class IntRect;
 class ScrollBar;
+class PlatformMouseEvent;
 
 // These match the numbers we use over in WebKit (WebFrameView.m).
 #define LINE_STEP   40
@@ -58,7 +61,7 @@ public:
     virtual void valueChanged(ScrollBar*) = 0;
 };
 
-class ScrollBar {
+class ScrollBar : public Shared<ScrollBar> {
 protected:
     ScrollBar(ScrollBarClient*, ScrollBarOrientation);
 
@@ -90,6 +93,12 @@ public:
         return true;
     }
 
+    // These methods are used for platform scrollbars to give :hover feedback.  They will not get called
+    // when the mouse went down in a scrollbar, since it is assumed the scrollbar will start
+    // grabbing all events in that case anyway.
+    virtual void mouseMoved(const PlatformMouseEvent&) {};
+    virtual void mouseExited() {};
+
 protected:
     virtual void updateThumbPosition() = 0;
     virtual void updateThumbProportion() = 0;
index 82da0fae4956224de6e9778710b478c2b822a572..d8c2ab8f943128649c140938790b8051cfff0878 100644 (file)
@@ -898,6 +898,7 @@ ScrollBar* RenderLayer::createScrollbar(ScrollBarOrientation orientation)
 {
     if (ScrollBar::hasPlatformScrollBars()) {
         PlatformScrollBar* widget = new PlatformScrollBar(this, orientation);
+        widget->ref();
         m_object->element()->document()->view()->addChild(widget);
         return widget;
     }
@@ -911,7 +912,7 @@ void RenderLayer::destroyScrollbar(ScrollBarOrientation orientation)
     if (orientation == HorizontalScrollBar) {
         if (m_hBar->isWidget()) {
             m_object->element()->document()->view()->removeChild(horizontalScrollbarWidget());
-            delete m_hBar;
+            m_hBar->deref();
             m_hBar = 0;
         }
         
@@ -919,7 +920,7 @@ void RenderLayer::destroyScrollbar(ScrollBarOrientation orientation)
     } else {
         if (m_vBar->isWidget()) {
             m_object->element()->document()->view()->removeChild(verticalScrollbarWidget());
-            delete m_vBar;
+            m_vBar->deref();
             m_vBar = 0;
         }