Jacek Caban : mshtml: Added IDOMMouseEvent:: toElement property implementation.

Alexandre Julliard julliard at winehq.org
Wed Feb 21 18:39:41 CST 2018


Module: wine
Branch: master
Commit: c0d248f2a5c167d228c4024feea2ec713abc42ed
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c0d248f2a5c167d228c4024feea2ec713abc42ed

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Feb 21 15:19:56 2018 +0100

mshtml: Added IDOMMouseEvent::toElement property implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/htmlevent.c     | 33 ++++++++++++++++++++++++++++-----
 dlls/mshtml/tests/events.js |  1 +
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 6c75475..e9a4731 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -138,6 +138,10 @@ typedef struct {
 #define EVENT_HASDEFAULTHANDLERS 0x0020
 #define EVENT_FIXME              0x0040
 
+/* mouse event flags for fromElement and toElement implementation */
+#define EVENT_MOUSE_TO_RELATED   0x0100
+#define EVENT_MOUSE_FROM_RELATED 0x0200
+
 static const event_info_t event_info[] = {
     {abortW,             EVENT_TYPE_EVENT,     DISPID_EVMETH_ONABORT,
         EVENT_BIND_TO_BODY},
@@ -186,11 +190,11 @@ static const event_info_t event_info[] = {
     {mousedownW,         EVENT_TYPE_MOUSE,     DISPID_EVMETH_ONMOUSEDOWN,
         EVENT_DEFAULTLISTENER | EVENT_BUBBLES | EVENT_CANCELABLE},
     {mousemoveW,         EVENT_TYPE_MOUSE,     DISPID_EVMETH_ONMOUSEMOVE,
-        EVENT_DEFAULTLISTENER | EVENT_BUBBLES | EVENT_CANCELABLE},
+        EVENT_DEFAULTLISTENER | EVENT_BUBBLES | EVENT_CANCELABLE | EVENT_MOUSE_FROM_RELATED},
     {mouseoutW,          EVENT_TYPE_MOUSE,     DISPID_EVMETH_ONMOUSEOUT,
-        EVENT_DEFAULTLISTENER | EVENT_BUBBLES | EVENT_CANCELABLE},
+        EVENT_DEFAULTLISTENER | EVENT_BUBBLES | EVENT_CANCELABLE | EVENT_MOUSE_TO_RELATED},
     {mouseoverW,         EVENT_TYPE_MOUSE,     DISPID_EVMETH_ONMOUSEOVER,
-        EVENT_DEFAULTLISTENER | EVENT_BUBBLES | EVENT_CANCELABLE},
+        EVENT_DEFAULTLISTENER | EVENT_BUBBLES | EVENT_CANCELABLE | EVENT_MOUSE_FROM_RELATED},
     {mouseupW,           EVENT_TYPE_MOUSE,     DISPID_EVMETH_ONMOUSEUP,
         EVENT_DEFAULTLISTENER | EVENT_BUBBLES | EVENT_CANCELABLE},
     {mousewheelW,        EVENT_TYPE_MOUSE,     DISPID_EVMETH_ONMOUSEWHEEL,
@@ -1583,8 +1587,27 @@ static HRESULT WINAPI DOMMouseEvent_get_fromElement(IDOMMouseEvent *iface, IHTML
 static HRESULT WINAPI DOMMouseEvent_get_toElement(IDOMMouseEvent *iface, IHTMLElement **p)
 {
     DOMEvent *This = impl_from_IDOMMouseEvent(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+    IEventTarget  *related_target = NULL;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    if(This->event_id != EVENTID_LAST) {
+        HRESULT hres = S_OK;
+        if(event_info[This->event_id].flags & EVENT_MOUSE_TO_RELATED)
+            hres = IDOMMouseEvent_get_relatedTarget(&This->IDOMMouseEvent_iface, &related_target);
+        else if(event_info[This->event_id].flags & EVENT_MOUSE_FROM_RELATED)
+            hres = IDOMEvent_get_target(&This->IDOMEvent_iface, &related_target);
+        if(FAILED(hres))
+            return hres;
+    }
+
+    if(!related_target) {
+        *p = NULL;
+        return S_OK;
+    }
+
+    IEventTarget_QueryInterface(related_target, &IID_IHTMLElement, (void**)p);
+    return S_OK;
 }
 
 static HRESULT WINAPI DOMMouseEvent_get_x(IDOMMouseEvent *iface, LONG *p)
diff --git a/dlls/mshtml/tests/events.js b/dlls/mshtml/tests/events.js
index 677e8e7..a15ee51 100644
--- a/dlls/mshtml/tests/events.js
+++ b/dlls/mshtml/tests/events.js
@@ -632,6 +632,7 @@ function test_mouse_event() {
     ok(e.pageY === 0, "pageY = " + e.pageY);
     ok(e.which === 1, "which = " + e.which);
     ok(e.relatedTarget === null, "relatedTarget = " + e.relatedTarget);
+    ok(e.toElement === null, "toElement = " + e.toElement);
 
     e.initMouseEvent("test", true, true, window, 1, 2, 3, 4, 5, false, false, false, false, 1, document);
     ok(e.type === "test", "type = " + e.type);




More information about the wine-cvs mailing list