Jacek Caban : mshtml: Moved event_vector to HTMLDocumentNode.

Alexandre Julliard julliard at winehq.org
Wed Oct 28 10:12:23 CDT 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Oct 27 21:10:02 2009 +0100

mshtml: Moved event_vector to HTMLDocumentNode.

---

 dlls/mshtml/htmldoc.c        |    1 +
 dlls/mshtml/htmlevent.c      |   23 ++++++++++++-----------
 dlls/mshtml/htmlevent.h      |    6 +++---
 dlls/mshtml/htmlwindow.c     |    1 -
 dlls/mshtml/mshtml_private.h |    4 ++--
 dlls/mshtml/nsevents.c       |    6 +++---
 6 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index a5422f2..bc20a2d 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1777,6 +1777,7 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
         nsIDOMHTMLDocument_Release(This->nsdoc);
     }
 
+    heap_free(This->event_vector);
     destroy_htmldoc(&This->basedoc);
 }
 
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index d1cc6b7..345fd83 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -921,7 +921,8 @@ static BOOL alloc_handler_vector(event_target_t *event_target, eventid_t eid, in
     return TRUE;
 }
 
-static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLWindow *window, eventid_t eid, IDispatch *disp)
+static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLDocumentNode *doc,
+        eventid_t eid, IDispatch *disp)
 {
     event_target_t *event_target;
 
@@ -940,23 +941,23 @@ static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLWin
         return S_OK;
     IDispatch_AddRef(disp);
 
-    if(window->nswindow && (event_info[eid].flags & EVENT_DEFAULTLISTENER)) {
-        if(!window->event_vector) {
-            window->event_vector = heap_alloc_zero(EVENTID_LAST*sizeof(BOOL));
-            if(!window->event_vector)
+    if(doc->nsdoc && (event_info[eid].flags & EVENT_DEFAULTLISTENER)) {
+        if(!doc->event_vector) {
+            doc->event_vector = heap_alloc_zero(EVENTID_LAST*sizeof(BOOL));
+            if(!doc->event_vector)
                 return E_OUTOFMEMORY;
         }
 
-        if(!window->event_vector[eid]) {
-            window->event_vector[eid] = TRUE;
-            add_nsevent_listener(window, event_info[eid].name);
+        if(!doc->event_vector[eid]) {
+            doc->event_vector[eid] = TRUE;
+            add_nsevent_listener(doc, event_info[eid].name);
         }
     }
 
     return S_OK;
 }
 
-HRESULT set_event_handler(event_target_t **event_target, HTMLDocument *doc, eventid_t eid, VARIANT *var)
+HRESULT set_event_handler(event_target_t **event_target, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var)
 {
     switch(V_VT(var)) {
     case VT_NULL:
@@ -967,7 +968,7 @@ HRESULT set_event_handler(event_target_t **event_target, HTMLDocument *doc, even
         break;
 
     case VT_DISPATCH:
-        return set_event_handler_disp(event_target, doc->window, 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));
@@ -1048,7 +1049,7 @@ void check_event_attr(HTMLDocumentNode *doc, nsIDOMElement *nselem)
             disp = script_parse_event(doc->basedoc.window, attr_value);
             if(disp) {
                 node = get_node(doc, (nsIDOMNode*)nselem, TRUE);
-                set_event_handler_disp(get_node_event_target(node), node->doc->basedoc.window, i, disp);
+                set_event_handler_disp(get_node_event_target(node), node->doc, i, disp);
                 IDispatch_Release(disp);
             }
         }
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 21e7ff0..d0332ee 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -42,7 +42,7 @@ eventid_t str_to_eid(LPCWSTR);
 void check_event_attr(HTMLDocumentNode*,nsIDOMElement*);
 void release_event_target(event_target_t*);
 void fire_event(HTMLDocumentNode*,eventid_t,nsIDOMNode*,nsIDOMEvent*);
-HRESULT set_event_handler(event_target_t**,HTMLDocument*,eventid_t,VARIANT*);
+HRESULT set_event_handler(event_target_t**,HTMLDocumentNode*,eventid_t,VARIANT*);
 HRESULT get_event_handler(event_target_t**,eventid_t,VARIANT*);
 HRESULT attach_event(event_target_t**,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*);
 HRESULT dispatch_event(HTMLDOMNode*,const WCHAR*,VARIANT*,VARIANT_BOOL*);
@@ -55,7 +55,7 @@ static inline event_target_t **get_node_event_target(HTMLDOMNode *node)
 
 static inline HRESULT set_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)
 {
-    return set_event_handler(get_node_event_target(node), &node->doc->basedoc, eid, var);
+    return set_event_handler(get_node_event_target(node), node->doc, eid, var);
 }
 
 static inline HRESULT get_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)
@@ -75,7 +75,7 @@ static inline HRESULT get_doc_event(HTMLDocument *doc, eventid_t eid, VARIANT *v
 
 static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
 {
-    return set_event_handler(&window->event_target, &window->doc_obj->basedoc, eid, var);
+    return set_event_handler(&window->event_target, window->doc, eid, var);
 }
 
 static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index c66f245..9b8dda3 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -189,7 +189,6 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
         windowref_release(This->window_ref);
 
         heap_free(This->global_props);
-        heap_free(This->event_vector);
         release_script_hosts(This);
         list_remove(&This->entry);
         release_dispex(&This->dispex);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index e3a12b2..d0fdb29 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -226,7 +226,6 @@ struct HTMLWindow {
 
     event_target_t *event_target;
     IHTMLEventObj *event;
-    BOOL *event_vector;
 
     SCRIPTMODE scriptmode;
     struct list script_hosts;
@@ -487,6 +486,7 @@ struct HTMLDocumentNode {
 
     IInternetSecurityManager *secmgr;
     nsDocumentEventListener *nsevent_listener;
+    BOOL *event_vector;
 
     mutation_queue_t *mutation_queue;
     mutation_queue_t *mutation_queue_tail;
@@ -652,7 +652,7 @@ nsresult get_nsinterface(nsISupports*,REFIID,void**);
 
 void init_nsevents(HTMLDocumentNode*);
 void release_nsevents(HTMLDocumentNode*);
-void add_nsevent_listener(HTMLWindow*,LPCWSTR);
+void add_nsevent_listener(HTMLDocumentNode*,LPCWSTR);
 
 void set_window_bscallback(HTMLWindow*,nsChannelBSC*);
 void set_current_mon(HTMLWindow*,IMoniker*);
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c
index 3aef738..aa87442 100644
--- a/dlls/mshtml/nsevents.c
+++ b/dlls/mshtml/nsevents.c
@@ -282,18 +282,18 @@ static void init_listener(nsEventListener *This, nsDocumentEventListener *listen
     This->This = listener;
 }
 
-void add_nsevent_listener(HTMLWindow *window, LPCWSTR type)
+void add_nsevent_listener(HTMLDocumentNode *doc, LPCWSTR type)
 {
     nsIDOMEventTarget *target;
     nsresult nsres;
 
-    nsres = nsIDOMWindow_QueryInterface(window->nswindow, &IID_nsIDOMEventTarget, (void**)&target);
+    nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target);
     if(NS_FAILED(nsres)) {
         ERR("Could not get nsIDOMEventTarget interface: %08x\n", nsres);
         return;
     }
 
-    init_event(target, type, NSEVENTLIST(&window->doc->nsevent_listener->htmlevent_listener), TRUE);
+    init_event(target, type, NSEVENTLIST(&doc->nsevent_listener->htmlevent_listener), TRUE);
     nsIDOMEventTarget_Release(target);
 }
 




More information about the wine-cvs mailing list