<rdar://problem/5537289> REGRESSION: Dragging a link or an image from an IFrame cause...
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Nov 2007 03:57:45 +0000 (03:57 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Nov 2007 03:57:45 +0000 (03:57 +0000)
Reviewed by John S.

EventHandler needs to reset these fields when a drag terminates, otherwise
EventHandler is left in an inconsistent state when a drag is initiated on a
page with multiple frames.

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

WebCore/ChangeLog
WebCore/page/EventHandler.cpp
WebCore/page/EventHandler.h

index cd2ee16..2515036 100644 (file)
 
 2007-11-12  Oliver Hunt  <oliver@apple.com>
 
+        Reviewed by John S.
+
+        <rdar://problem/5537289> REGRESSION: Dragging a link or an image from an IFrame causes the page to not respond to clicks afterwards (15460)
+        
+        EventHandler needs to reset these fields when a drag terminates, otherwise
+        EventHandler is left in an inconsistent state when a drag is initiated on a
+        page with multiple frames.
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::cancelDragAndDrop):
+        (WebCore::EventHandler::performDragAndDrop):
+        (WebCore::EventHandler::clearDragState):
+        * page/EventHandler.h:
+
+2007-11-12  Oliver Hunt  <oliver@apple.com>
+
         Reviewed by Darin and Antti.
 
         Return behaviour for 0 sized pattern back to what it was prior to r27704
index 9da32e3..38f6e2b 100644 (file)
@@ -1014,7 +1014,7 @@ bool EventHandler::handleMouseMoveEvent(const PlatformMouseEvent& mouseEvent, Hi
     bool swallowEvent = false;
     Node* targetNode = m_capturingMouseEventsNode ? m_capturingMouseEventsNode.get() : mev.targetNode();
     RefPtr<Frame> newSubframe = subframeForTargetNode(targetNode);
-    
+
     // We want mouseouts to happen first, from the inside out.  First send a move event to the last subframe so that it will fire mouseouts.
     if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree()->isDescendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe)
         passMouseMoveEventToSubframe(mev, m_lastMouseMoveEventSubframe.get());
@@ -1177,7 +1177,7 @@ void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, Clipboard*
         else
             dispatchDragEvent(dragleaveEvent, m_dragTarget.get(), event, clipboard);
     }
-    m_dragTarget = 0;
+    clearDragState();
 }
 
 bool EventHandler::performDragAndDrop(const PlatformMouseEvent& event, Clipboard* clipboard)
@@ -1191,10 +1191,19 @@ bool EventHandler::performDragAndDrop(const PlatformMouseEvent& event, Clipboard
         else
             accept = dispatchDragEvent(dropEvent, m_dragTarget.get(), event, clipboard);
     }
-    m_dragTarget = 0;
+    clearDragState();
     return accept;
 }
 
+void EventHandler::clearDragState()
+{
+    m_dragTarget = 0;
+    m_capturingMouseEventsNode = 0;
+#if PLATFORM(MAC)
+    m_sendingEventToSubview = false;
+#endif
+}
+
 Node* EventHandler::nodeUnderMouse() const
 {
     return m_nodeUnderMouse.get();
index 72277f6..3e2e231 100644 (file)
@@ -222,6 +222,7 @@ private:
 
     bool handleDrag(const MouseEventWithHitTestResults&);
     bool handleMouseUp(const MouseEventWithHitTestResults&);
+    void clearDragState();
 
     bool dispatchDragSrcEvent(const AtomicString& eventType, const PlatformMouseEvent&);