Jacek Caban : mshtml: Moved Wine[Add|Remove] Observer calls to HTMLDocumentNode constructor/destructor.

Alexandre Julliard julliard at winehq.org
Thu Oct 22 10:39:54 CDT 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Oct 21 21:28:39 2009 +0200

mshtml: Moved Wine[Add|Remove]Observer calls to HTMLDocumentNode constructor/destructor.

---

 dlls/mshtml/htmldoc.c        |    8 +++---
 dlls/mshtml/mshtml_private.h |    3 +-
 dlls/mshtml/mutation.c       |   57 ++++++++++++++++++++----------------------
 dlls/mshtml/nsembed.c        |    2 -
 4 files changed, 32 insertions(+), 38 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index f6cb876..5e34ced 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1769,8 +1769,10 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
     detach_ranges(This);
     release_nodes(This);
 
-    if(This->nsdoc)
+    if(This->nsdoc) {
+        release_mutation(This);
         nsIDOMHTMLDocument_Release(This->nsdoc);
+    }
 
     destroy_htmldoc(&This->basedoc);
 }
@@ -1811,7 +1813,6 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
     doc->basedoc.doc_node = doc;
     doc->basedoc.doc_obj = doc_obj;
 
-    init_mutation(doc);
     init_dispex(&doc->node.dispex, (IUnknown*)HTMLDOMNODE(&doc->node), &HTMLDocumentNode_dispex);
     init_doc(&doc->basedoc, (IUnknown*)HTMLDOMNODE(&doc->node), DISPATCHEX(&doc->node.dispex));
     HTMLDocumentNode_SecMgr_Init(doc);
@@ -1819,6 +1820,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
 
     nsIDOMHTMLDocument_AddRef(nsdoc);
     doc->nsdoc = nsdoc;
+    init_mutation(doc);
 
     doc->basedoc.window = window;
 
@@ -1887,8 +1889,6 @@ static ULONG WINAPI CustomDoc_Release(ICustomDoc *iface)
         set_document_bscallback(&This->basedoc, NULL);
         set_current_mon(&This->basedoc, NULL);
         if(This->basedoc.doc_node) {
-            if(This->basedoc.doc_node->nsdoc)
-                remove_mutation_observer(This->basedoc.doc_node);
             This->basedoc.doc_node->basedoc.doc_obj = NULL;
             IHTMLDocument2_Release(HTMLDOC(&This->basedoc.doc_node->basedoc));
         }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 92688e1..85421d1 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -601,8 +601,7 @@ NSContainer *NSContainer_Create(HTMLDocumentObj*,NSContainer*);
 void NSContainer_Release(NSContainer*);
 
 void init_mutation(HTMLDocumentNode*);
-void set_mutation_observer(HTMLDocumentNode*);
-void remove_mutation_observer(HTMLDocumentNode*);
+void release_mutation(HTMLDocumentNode*);
 
 void HTMLDocument_LockContainer(HTMLDocumentObj*,BOOL);
 void show_context_menu(HTMLDocumentObj*,DWORD,POINT*,IDispatch*);
diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c
index f2c510a..20ef121 100644
--- a/dlls/mshtml/mutation.c
+++ b/dlls/mshtml/mutation.c
@@ -40,36 +40,6 @@ enum {
     MUTATION_SCRIPT
 };
 
-void set_mutation_observer(HTMLDocumentNode *doc)
-{
-    nsIDOMNSDocument *nsdoc;
-    nsresult nsres;
-
-    nsres = nsIDOMHTMLDocument_QueryInterface(doc->nsdoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
-    if(NS_FAILED(nsres)) {
-        ERR("Could not get nsIDOMNSDocument: %08x\n", nsres);
-        return;
-    }
-
-    nsIDOMNSDocument_WineAddObserver(nsdoc, NSDOCOBS(doc));
-    nsIDOMNSDocument_Release(nsdoc);
-}
-
-void remove_mutation_observer(HTMLDocumentNode *doc)
-{
-    nsIDOMNSDocument *nsdoc;
-    nsresult nsres;
-
-    nsres = nsIDOMHTMLDocument_QueryInterface(doc->nsdoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
-    if(NS_FAILED(nsres)) {
-        ERR("Could not get nsIDOMNSDocument: %08x\n", nsres);
-        return;
-    }
-
-    nsIDOMNSDocument_WineRemoveObserver(nsdoc, NSDOCOBS(doc));
-    nsIDOMNSDocument_Release(nsdoc);
-}
-
 #define IE_MAJOR_VERSION 7
 #define IE_MINOR_VERSION 0
 
@@ -612,6 +582,33 @@ static const nsIDocumentObserverVtbl nsDocumentObserverVtbl = {
 
 void init_mutation(HTMLDocumentNode *doc)
 {
+    nsIDOMNSDocument *nsdoc;
+    nsresult nsres;
+
     doc->lpIDocumentObserverVtbl  = &nsDocumentObserverVtbl;
     doc->lpIRunnableVtbl          = &nsRunnableVtbl;
+
+    nsres = nsIDOMHTMLDocument_QueryInterface(doc->nsdoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
+    if(NS_FAILED(nsres)) {
+        ERR("Could not get nsIDOMNSDocument: %08x\n", nsres);
+        return;
+    }
+
+    nsIDOMNSDocument_WineAddObserver(nsdoc, NSDOCOBS(doc));
+    nsIDOMNSDocument_Release(nsdoc);
+}
+
+void release_mutation(HTMLDocumentNode *doc)
+{
+    nsIDOMNSDocument *nsdoc;
+    nsresult nsres;
+
+    nsres = nsIDOMHTMLDocument_QueryInterface(doc->nsdoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
+    if(NS_FAILED(nsres)) {
+        ERR("Could not get nsIDOMNSDocument: %08x\n", nsres);
+        return;
+    }
+
+    nsIDOMNSDocument_WineRemoveObserver(nsdoc, NSDOCOBS(doc));
+    nsIDOMNSDocument_Release(nsdoc);
 }
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 565b688..463c4ee 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -838,7 +838,6 @@ void update_nsdocument(HTMLDocumentObj *doc)
 
     if(doc->basedoc.doc_node && doc->basedoc.doc_node->nsdoc) {
         doc_node = doc->basedoc.doc_node;
-        remove_mutation_observer(doc_node);
         doc_node->basedoc.doc_obj = NULL;
         IHTMLDocument2_Release(HTMLDOC(&doc_node->basedoc));
         doc->basedoc.doc_node = NULL;
@@ -856,7 +855,6 @@ void update_nsdocument(HTMLDocumentObj *doc)
         return;
     }
 
-    set_mutation_observer(doc_node);
     doc->basedoc.doc_node = doc_node;
     window_set_docnode(doc->basedoc.window, doc_node);
 }




More information about the wine-cvs mailing list