Reviewed by Darin.
authorbdakin <bdakin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 27 Jan 2007 00:03:56 +0000 (00:03 +0000)
committerbdakin <bdakin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 27 Jan 2007 00:03:56 +0000 (00:03 +0000)
        Fix for <rdar://problem/4956565> REGRESSION: After scrolling frame,
        hovering over link in this frame doesn't change cursor to pointing
        hand

        The mouseMove event was not being propagated correctly after using
        the mouse to scroll the frame because m_mousePressed was never
        getting set to false.

        * page/EventHandler.cpp:
        (WebCore::EventHandler::handleMousePressEvent): This code does not
        belong here.
        * page/EventHandler.h: lastEventIsMouseUp() is only ever relevant
        in EventHandlerMac, so it can just be a static function there.
        * page/mac/EventHandlerMac.mm:
        (WebCore::lastEventIsMouseUp): Make this static.
        (WebCore::EventHandler::passMouseDownEventToWidget): Here is where
        we need to set m_mousePressed to false if lastEventIsMouseUp() is
        true.

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

WebCore/ChangeLog
WebCore/page/EventHandler.cpp
WebCore/page/EventHandler.h
WebCore/page/mac/EventHandlerMac.mm

index 7bdecb5b6ea89d669ec7130cf660a71b6935e781..e5d3c87ee4241e64fb061d26d45756e0778dd94d 100644 (file)
@@ -1,3 +1,26 @@
+2007-01-26  Beth Dakin  <bdakin@apple.com>
+
+        Reviewed by Darin.
+
+        Fix for <rdar://problem/4956565> REGRESSION: After scrolling frame, 
+        hovering over link in this frame doesn't change cursor to pointing 
+        hand
+
+        The mouseMove event was not being propagated correctly after using 
+        the mouse to scroll the frame because m_mousePressed was never 
+        getting set to false.
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleMousePressEvent): This code does not 
+        belong here.
+        * page/EventHandler.h: lastEventIsMouseUp() is only ever relevant 
+        in EventHandlerMac, so it can just be a static function there.
+        * page/mac/EventHandlerMac.mm:
+        (WebCore::lastEventIsMouseUp): Make this static.
+        (WebCore::EventHandler::passMouseDownEventToWidget): Here is where 
+        we need to set m_mousePressed to false if lastEventIsMouseUp() is 
+        true.
+
 2007-01-26  David Hyatt  <hyatt@apple.com>
 
         Fix for style regression caused by strictness checking of the number of properties.  This caused code like:
index bac7b2c912c6ecc306cf6a53bade0a2884c4b48a..8188040c16a1dc158b8b698d940a9ddd2840761a 100644 (file)
@@ -747,14 +747,6 @@ bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
             swallowEvent = true;
         else
             swallowEvent = handleMousePressEvent(mev);
-        
-        // Many AK widgets run their own event loops and consume events while the mouse is down.
-        // When they finish, currentEvent is the mouseUp that they exited on.  We need to update
-        // the khtml state with this mouseUp, which khtml never saw.
-        // If this event isn't a mouseUp, we assume that the mouseUp will be coming later.  There
-        // is a hole here if the widget consumes the mouseUp and subsequent events.
-        if (lastEventIsMouseUp())
-            m_mousePressed = false;
     }
 
     return swallowEvent;
index 7c5a5308f362e413dfb874a7461268c75ac038ad..011a1af8815b46b785adb658f4f5147e8773be98 100644 (file)
@@ -166,8 +166,6 @@ private:
 
     void hoverTimerFired(Timer<EventHandler>*);
 
-    bool lastEventIsMouseUp() const;
-
     static bool canMouseDownStartSelect(Node*);
 
     void handleAutoscroll(RenderObject*);
index 068b9688febfb6b7eadda7605fd05a26cf889338..7f18f9d4206cea5a853902b78dbc05f3532d8023 100644 (file)
@@ -202,6 +202,24 @@ bool EventHandler::passWidgetMouseDownEventToWidget(RenderWidget* renderWidget)
     return passMouseDownEventToWidget(renderWidget->widget());
 }
 
+static bool lastEventIsMouseUp()
+{
+    // Many AK widgets run their own event loops and consume events while the mouse is down.
+    // When they finish, currentEvent is the mouseUp that they exited on.  We need to update
+    // the khtml state with this mouseUp, which khtml never saw.  This method lets us detect
+    // that state.
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    NSEvent *currentEventAfterHandlingMouseDown = [NSApp currentEvent];
+    if (currentEvent != currentEventAfterHandlingMouseDown &&
+        [currentEventAfterHandlingMouseDown type] == NSLeftMouseUp &&
+        [currentEventAfterHandlingMouseDown timestamp] >= [currentEvent timestamp])
+            return true;
+    END_BLOCK_OBJC_EXCEPTIONS;
+
+    return false;
+}
+
 bool EventHandler::passMouseDownEventToWidget(Widget* widget)
 {
     // FIXME: this method always returns true
@@ -272,28 +290,18 @@ bool EventHandler::passMouseDownEventToWidget(Widget* widget)
     // Remember which view we sent the event to, so we can direct the release event properly.
     m_mouseDownView = view;
     m_mouseDownWasInSubframe = false;
-
-    END_BLOCK_OBJC_EXCEPTIONS;
-
-    return true;
-}
-
-bool EventHandler::lastEventIsMouseUp() const
-{
-    // Many AK widgets run their own event loops and consume events while the mouse is down.
+    
+    // Many AppKit widgets run their own event loops and consume events while the mouse is down.
     // When they finish, currentEvent is the mouseUp that they exited on.  We need to update
-    // the khtml state with this mouseUp, which khtml never saw.  This method lets us detect
-    // that state.
+    // the EventHandler state with this mouseUp, which we never saw.
+    // If this event isn't a mouseUp, we assume that the mouseUp will be coming later.  There
+    // is a hole here if the widget consumes both the mouseUp and subsequent events.
+    if (lastEventIsMouseUp())
+        m_mousePressed = false;
 
-    BEGIN_BLOCK_OBJC_EXCEPTIONS;
-    NSEvent *currentEventAfterHandlingMouseDown = [NSApp currentEvent];
-    if (currentEvent != currentEventAfterHandlingMouseDown &&
-        [currentEventAfterHandlingMouseDown type] == NSLeftMouseUp &&
-        [currentEventAfterHandlingMouseDown timestamp] >= [currentEvent timestamp])
-            return true;
     END_BLOCK_OBJC_EXCEPTIONS;
 
-    return false;
+    return true;
 }
     
 // Note that this does the same kind of check as [target isDescendantOf:superview].