Jacek Caban : mshtml: Added IHTMLDocument2::put_onmouseover implementation.

Alexandre Julliard julliard at winehq.org
Mon Oct 13 06:37:15 CDT 2008


Module: wine
Branch: master
Commit: 3cae9a77784fc0b01358bd9f16271621b8f75338
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3cae9a77784fc0b01358bd9f16271621b8f75338

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Oct 10 15:46:20 2008 -0500

mshtml: Added IHTMLDocument2::put_onmouseover implementation.

---

 dlls/mshtml/htmldoc.c        |   10 ++++++++--
 dlls/mshtml/htmlevent.c      |   32 +++++++++++++++++---------------
 dlls/mshtml/htmlevent.h      |   12 +++++++++++-
 dlls/mshtml/mshtml_private.h |    1 +
 4 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index b757a80..b9cafe5 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -31,6 +31,7 @@
 #include "wine/debug.h"
 
 #include "mshtml_private.h"
+#include "htmlevent.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
@@ -197,6 +198,9 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
         if(This->window)
             IHTMLWindow2_Release(HTMLWINDOW2(This->window));
 
+        if(This->event_target)
+            release_event_target(This->event_target);
+
         heap_free(This->mime);
         detach_selection(This);
         detach_ranges(This);
@@ -1068,8 +1072,10 @@ static HRESULT WINAPI HTMLDocument_get_onmouseout(IHTMLDocument2 *iface, VARIANT
 static HRESULT WINAPI HTMLDocument_put_onmouseover(IHTMLDocument2 *iface, VARIANT v)
 {
     HTMLDocument *This = HTMLDOC_THIS(iface);
-    FIXME("(%p)\n", This);
-    return E_NOTIMPL;
+
+    TRACE("(%p)\n", This);
+
+    return set_doc_event(This, EVENTID_MOUSEOVER, &v);
 }
 
 static HRESULT WINAPI HTMLDocument_get_onmouseover(IHTMLDocument2 *iface, VARIANT *p)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 2b05eb7..05c5296 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -430,37 +430,39 @@ void fire_event(HTMLDocument *doc, eventid_t eid, nsIDOMNode *target)
     }
 }
 
-static HRESULT set_node_event_disp(HTMLDOMNode *node, eventid_t eid, IDispatch *disp)
+static HRESULT set_event_handler_disp(event_target_t **event_target, HTMLDocument *doc, eventid_t eid, IDispatch *disp)
 {
-    if(!node->event_target)
-        node->event_target = heap_alloc_zero(sizeof(event_target_t));
-    else if(node->event_target->event_table[eid])
-        IDispatch_Release(node->event_target->event_table[eid]);
+    if(!*event_target)
+        *event_target = heap_alloc_zero(sizeof(event_target_t));
+    else if((*event_target)->event_table[eid])
+        IDispatch_Release((*event_target)->event_table[eid]);
 
+    (*event_target)->event_table[eid] = disp;
+    if(!disp)
+        return S_OK;
     IDispatch_AddRef(disp);
-    node->event_target->event_table[eid] = disp;
 
     if(event_info[eid].flags & EVENT_DEFAULTLISTENER) {
-        if(!node->doc->nscontainer->event_vector) {
-            node->doc->nscontainer->event_vector = heap_alloc_zero(EVENTID_LAST*sizeof(BOOL));
-            if(!node->doc->nscontainer->event_vector)
+        if(!doc->nscontainer->event_vector) {
+            doc->nscontainer->event_vector = heap_alloc_zero(EVENTID_LAST*sizeof(BOOL));
+            if(!doc->nscontainer->event_vector)
                 return E_OUTOFMEMORY;
         }
 
-        if(!node->doc->nscontainer->event_vector[eid]) {
-            node->doc->nscontainer->event_vector[eid] = TRUE;
-            add_nsevent_listener(node->doc->nscontainer, event_info[eid].name);
+        if(!doc->nscontainer->event_vector[eid]) {
+            doc->nscontainer->event_vector[eid] = TRUE;
+            add_nsevent_listener(doc->nscontainer, event_info[eid].name);
         }
     }
 
     return S_OK;
 }
 
-HRESULT set_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)
+HRESULT set_event_handler(event_target_t **event_target, HTMLDocument *doc, eventid_t eid, VARIANT *var)
 {
     switch(V_VT(var)) {
     case VT_DISPATCH:
-        return set_node_event_disp(node, eid, V_DISPATCH(var));
+        return set_event_handler_disp(event_target, doc, eid, V_DISPATCH(var));
 
     default:
         FIXME("not supported vt=%d\n", V_VT(var));
@@ -494,7 +496,7 @@ void check_event_attr(HTMLDocument *doc, nsIDOMElement *nselem)
             disp = script_parse_event(doc, attr_value);
             if(disp) {
                 node = get_node(doc, (nsIDOMNode*)nselem, TRUE);
-                set_node_event_disp(node, i, disp);
+                set_event_handler_disp(&node->event_target, node->doc, i, disp);
                 IDispatch_Release(disp);
             }
         }
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 7b01dd7..f4a99c3 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -29,4 +29,14 @@ eventid_t str_to_eid(LPCWSTR);
 void check_event_attr(HTMLDocument*,nsIDOMElement*);
 void release_event_target(event_target_t*);
 void fire_event(HTMLDocument*,eventid_t,nsIDOMNode*);
-HRESULT set_node_event(HTMLDOMNode*,eventid_t,VARIANT*);
+HRESULT set_event_handler(event_target_t**,HTMLDocument*,eventid_t,VARIANT*);
+
+static inline HRESULT set_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)
+{
+    return set_event_handler(&node->event_target, node->doc, eid, var);
+}
+
+static inline HRESULT set_doc_event(HTMLDocument *doc, eventid_t eid, VARIANT *var)
+{
+    return set_event_handler(&doc->event_target, doc, eid, var);
+}
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index a58cfef..09a5d60 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -276,6 +276,7 @@ struct HTMLDocument {
 
     DWORD update;
 
+    event_target_t *event_target;
     ConnectionPointContainer cp_container;
     ConnectionPoint cp_htmldocevents;
     ConnectionPoint cp_htmldocevents2;




More information about the wine-cvs mailing list