Reviewed by Adele.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 28 Jan 2006 01:18:54 +0000 (01:18 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 28 Jan 2006 01:18:54 +0000 (01:18 +0000)
        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=6075
          REGRESSION: event.relatedTarget not working, breaks menus at www.ati.com

        Test: fast/events/related-target.html

        * khtml/xml/NodeImpl.h:
        * khtml/xml/NodeImpl.cpp: (WebCore::NodeImpl::dispatchMouseEvent): Added a
        relatedTarget parameter to a couple overloads.

        * page/FrameView.cpp:
        (FrameView::viewportMouseMoveEvent): Moved code to set prevMouseX/Y out of here
        and into dispatchMouseEvent, because it now handles mouseout and mouseover events,
        and that's what these globals are used for. This fixes DumpRenderTree to work
        properly with mouseout and mouseover (because it delivers only mouse down and up,
        no mouse move events).
        (FrameView::dispatchMouseEvent): Passed in the "other" node as the related target
        for mouseout and mouseover events. Also set prevMouseX/Y.

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

WebCore/ChangeLog
WebCore/khtml/xml/NodeImpl.cpp
WebCore/khtml/xml/NodeImpl.h
WebCore/page/FrameView.cpp

index b3295a1df291b81c25e3529a6182bd1d9420b8e7..a17a88234fd2e7e6277645feb695a902463d646e 100644 (file)
@@ -1,3 +1,25 @@
+2006-01-27  Darin Adler  <darin@apple.com>
+
+        Reviewed by Adele.
+
+        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=6075
+          REGRESSION: event.relatedTarget not working, breaks menus at www.ati.com
+
+        Test: fast/events/related-target.html
+
+        * khtml/xml/NodeImpl.h:
+        * khtml/xml/NodeImpl.cpp: (WebCore::NodeImpl::dispatchMouseEvent): Added a
+        relatedTarget parameter to a couple overloads.
+
+        * page/FrameView.cpp:
+        (FrameView::viewportMouseMoveEvent): Moved code to set prevMouseX/Y out of here
+        and into dispatchMouseEvent, because it now handles mouseout and mouseover events,
+        and that's what these globals are used for. This fixes DumpRenderTree to work
+        properly with mouseout and mouseover (because it delivers only mouse down and up,
+        no mouse move events).
+        (FrameView::dispatchMouseEvent): Passed in the "other" node as the related target
+        for mouseout and mouseover events. Also set prevMouseX/Y.
+
 2006-01-27  David Hyatt  <hyatt@apple.com>
 
         Fix for 6867.  Rename QPixmap to Image and move it to platform/.
index 500855bf817527eb35d16e2e383c8041523b263b..90518846d9511520eb7bcb2a506935ed84655744 100644 (file)
@@ -649,7 +649,8 @@ bool NodeImpl::dispatchWindowEvent(const AtomicString &eventType, bool canBubble
     return r;
 }
 
-bool NodeImpl::dispatchMouseEvent(QMouseEvent *_mouse, const AtomicString &overrideType, int overrideDetail)
+bool NodeImpl::dispatchMouseEvent(QMouseEvent *_mouse, const AtomicString &overrideType,
+    int overrideDetail, NodeImpl* relatedTarget)
 {
     assert(!eventDispatchForbidden());
     int detail = overrideDetail; // defaults to 0
@@ -705,7 +706,8 @@ bool NodeImpl::dispatchMouseEvent(QMouseEvent *_mouse, const AtomicString &overr
     
     return dispatchMouseEvent(eventType, button, detail,
         clientX, clientY, screenX, screenY,
-        ctrlKey, altKey, shiftKey, metaKey);
+        ctrlKey, altKey, shiftKey, metaKey,
+        false, relatedTarget);
 }
 
 bool NodeImpl::dispatchSimulatedMouseEvent(const AtomicString &eventType)
@@ -718,7 +720,7 @@ bool NodeImpl::dispatchSimulatedMouseEvent(const AtomicString &eventType)
 
 bool NodeImpl::dispatchMouseEvent(const AtomicString &eventType, int button, int detail,
     int clientX, int clientY, int screenX, int screenY,
-    bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool isSimulated)
+    bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool isSimulated, NodeImpl* relatedTarget)
 {
     assert(!eventDispatchForbidden());
     if (disabled()) // Don't even send DOM events for disabled controls..
@@ -734,15 +736,16 @@ bool NodeImpl::dispatchMouseEvent(const AtomicString &eventType, int button, int
 
     bool cancelable = eventType != mousemoveEvent;
     
-    int exceptioncode = 0;
+    ExceptionCode ec = 0;
 
     bool swallowEvent = false;
 
-    RefPtr<EventImpl> me = new MouseEventImpl(eventType,true,cancelable,getDocument()->defaultView(),
-                   detail,screenX,screenY,clientX,clientY,ctrlKey,altKey,shiftKey,metaKey,
-                   button, 0, 0, isSimulated);
+    RefPtr<EventImpl> me = new MouseEventImpl(eventType, true, cancelable, getDocument()->defaultView(),
+        detail, screenX, screenY, clientX, clientY,
+        ctrlKey, altKey, shiftKey, metaKey, button,
+        relatedTarget, 0, isSimulated);
     
-    dispatchEvent(me, exceptioncode, true);
+    dispatchEvent(me, ec, true);
     bool defaultHandled = me->defaultHandled();
     bool defaultPrevented = me->defaultPrevented();
     if (defaultHandled || defaultPrevented)
@@ -752,14 +755,13 @@ bool NodeImpl::dispatchMouseEvent(const AtomicString &eventType, int button, int
     // of the DOM specs, but is used for compatibility with the ondblclick="" attribute.  This is treated
     // as a separate event in other DOM-compliant browsers like Firefox, and so we do the same.
     if (eventType == clickEvent && detail == 2) {
-        me = new MouseEventImpl(khtmlDblclickEvent,
-                                true, cancelable,getDocument()->defaultView(),
-                                detail, screenX, screenY, clientX, clientY,
-                                ctrlKey, altKey, shiftKey, metaKey,
-                                button, 0, 0, isSimulated);
+        me = new MouseEventImpl(khtmlDblclickEvent, true, cancelable, getDocument()->defaultView(),
+            detail, screenX, screenY, clientX, clientY,
+            ctrlKey, altKey, shiftKey, metaKey, button,
+            relatedTarget, 0, isSimulated);
         if (defaultHandled)
             me->setDefaultHandled();
-        dispatchEvent(me,exceptioncode,true);
+        dispatchEvent(me, ec, true);
         if (me->defaultHandled() || me->defaultPrevented())
             swallowEvent = true;
     }
@@ -774,21 +776,16 @@ bool NodeImpl::dispatchMouseEvent(const AtomicString &eventType, int button, int
 bool NodeImpl::dispatchUIEvent(const AtomicString &eventType, int detail)
 {
     assert(!eventDispatchForbidden());
-    assert (!( (eventType != DOMFocusInEvent &&
-                eventType != DOMFocusOutEvent &&
-                eventType != DOMActivateEvent)));
+    assert(eventType == DOMFocusInEvent || eventType == DOMFocusOutEvent || eventType == DOMActivateEvent);
 
     if (!getDocument())
         return false;
 
-    bool cancelable = false;
-    if (eventType == DOMActivateEvent)
-        cancelable = true;
+    bool cancelable = eventType == DOMActivateEvent;
 
     int exceptioncode = 0;
-
-    UIEventImpl *evt = new UIEventImpl(eventType, true, cancelable, getDocument()->defaultView(), detail);
-    return dispatchEvent(evt,exceptioncode,true);
+    UIEventImpl* evt = new UIEventImpl(eventType, true, cancelable, getDocument()->defaultView(), detail);
+    return dispatchEvent(evt, exceptioncode, true);
 }
 
 void NodeImpl::registerNodeList(NodeListImpl* list)
index 4781a64494024b39d748b0a63bc194e820d29ec6..1bf31d2947b332aba866ee9097656f4fe3bd7daa 100644 (file)
@@ -270,12 +270,13 @@ public:
     bool dispatchGenericEvent(PassRefPtr<EventImpl>, ExceptionCode&);
     bool dispatchHTMLEvent(const AtomicString& eventType, bool canBubble, bool cancelable);
     bool dispatchWindowEvent(const AtomicString& eventType, bool canBubble, bool cancelable);
-    bool dispatchMouseEvent(QMouseEvent*, const AtomicString& overrideType, int overrideDetail = 0);
+    bool dispatchMouseEvent(QMouseEvent*, const AtomicString& overrideType,
+        int overrideDetail = 0, NodeImpl* relatedTarget = 0);
     bool dispatchSimulatedMouseEvent(const AtomicString& eventType);
     bool dispatchMouseEvent(const AtomicString& eventType, int button, int detail,
         int clientX, int clientY, int screenX, int screenY,
         bool ctrlKey, bool altKey, bool shiftKey, bool metaKey,
-        bool isSimulated = false);
+        bool isSimulated = false, NodeImpl* relatedTarget = 0);
     bool dispatchUIEvent(const AtomicString& eventType, int detail = 0);
     bool dispatchSubtreeModifiedEvent(bool childrenChanged = true);
     bool dispatchKeyEvent(QKeyEvent*);
index 0d98e1f9f458e2df4161fb26a38acc7fe0aca34d..a9c6983548b7e60437ce65329c64b4ed945a40cd 100644 (file)
@@ -681,9 +681,6 @@ void FrameView::viewportMouseMoveEvent( QMouseEvent * _mouse )
     // execute the scheduled script. This is to make sure the mouseover events come after the mouseout events
     m_frame->executeScheduledScript();
 
-    d->prevMouseX = xm;
-    d->prevMouseY = ym;
-
     if (!swallowEvent) {
         MouseMoveEvent event(_mouse, xm, ym, mev.url, mev.target, mev.innerNode.get());
         QApplication::sendEvent(m_frame, &event);
@@ -1033,9 +1030,8 @@ void FrameView::restoreScrollBar ( )
 }
 
 
-bool FrameView::dispatchMouseEvent(const AtomicString &eventType, NodeImpl *targetNode, bool cancelable,
-                                  int detail,QMouseEvent *_mouse, bool setUnder,
-                                  int mouseEventType)
+bool FrameView::dispatchMouseEvent(const AtomicString &eventType, NodeImpl* targetNode, bool cancelable,
+    int detail, QMouseEvent *_mouse, bool setUnder, int mouseEventType)
 {
     // if the target node is a text node, dispatch on the parent node - rdar://4196646
     if (targetNode && targetNode->isTextNode())
@@ -1056,20 +1052,22 @@ bool FrameView::dispatchMouseEvent(const AtomicString &eventType, NodeImpl *targ
             // Also, there's no guarantee that the old under node is even around any more,
             // so we could be sending a mouseout to a node that never got a mouseover.
             RefPtr<NodeImpl> oldUnder;
-            if (d->prevMouseX >= 0 && d->prevMouseY >= 0) {
+            if (d->prevMouseX >= 0) {
                 NodeImpl::MouseEvent mev( _mouse->stateAfter(), static_cast<NodeImpl::MouseEventType>(mouseEventType));
-                m_frame->document()->prepareMouseEvent( true, d->prevMouseX, d->prevMouseY, &mev );
+                m_frame->document()->prepareMouseEvent(true, d->prevMouseX, d->prevMouseY, &mev);
                 oldUnder = mev.innerNode;
                 if (oldUnder && oldUnder->isTextNode())
                     oldUnder = oldUnder->parentNode();
             }
+            d->prevMouseX = clientX;
+            d->prevMouseY = clientY;
             if (oldUnder != targetNode) {
                 // send mouseout event to the old node
                 if (oldUnder)
-                    oldUnder->dispatchMouseEvent(_mouse, mouseoutEvent);
+                    oldUnder->dispatchMouseEvent(_mouse, mouseoutEvent, 0, targetNode);
                 // send mouseover event to the new node
                 if (targetNode)
-                    targetNode->dispatchMouseEvent(_mouse, mouseoverEvent);
+                    targetNode->dispatchMouseEvent(_mouse, mouseoverEvent, 0, oldUnder.get());
             }
         }
     }