Jacek Caban : mshtml: Detach more document objects in detach_inner_window.

Alexandre Julliard julliard at winehq.org
Mon Mar 11 16:29:53 CDT 2019


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Mar 11 14:22:44 2019 +0100

mshtml: Detach more document objects in detach_inner_window.

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

---

 dlls/mshtml/htmldoc.c        | 38 +++++++++++++++++++++++---------------
 dlls/mshtml/htmlwindow.c     |  8 +++-----
 dlls/mshtml/mshtml_private.h |  1 +
 3 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 722f26c..100dc97 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -4885,31 +4885,39 @@ static HRESULT HTMLDocumentNode_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
     return S_OK;
 }
 
-static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
+void detach_document_node(HTMLDocumentNode *doc)
 {
-    HTMLDocumentNode *This = impl_from_HTMLDOMNode(iface);
     unsigned i;
 
-    for(i=0; i < This->elem_vars_cnt; i++)
-        heap_free(This->elem_vars[i]);
-    heap_free(This->elem_vars);
+    while(!list_empty(&doc->plugin_hosts))
+        detach_plugin_host(LIST_ENTRY(list_head(&doc->plugin_hosts), PluginHost, entry));
 
-    detach_events(This);
-    if(This->catmgr)
-        ICatInformation_Release(This->catmgr);
+    detach_events(doc);
+    detach_selection(doc);
+    detach_ranges(doc);
 
-    detach_selection(This);
-    detach_ranges(This);
+    for(i=0; i < doc->elem_vars_cnt; i++)
+        heap_free(doc->elem_vars[i]);
+    heap_free(doc->elem_vars);
+    doc->elem_vars_cnt = 0;
 
-    while(!list_empty(&This->plugin_hosts))
-        detach_plugin_host(LIST_ENTRY(list_head(&This->plugin_hosts), PluginHost, entry));
+    if(doc->catmgr) {
+        ICatInformation_Release(doc->catmgr);
+        doc->catmgr = NULL;
+    }
 
-    if(!This->nsdoc && This->window) {
+    if(!doc->nsdoc && doc->window) {
         /* document fragments own reference to inner window */
-        IHTMLWindow2_Release(&This->window->base.IHTMLWindow2_iface);
-        This->window = NULL;
+        IHTMLWindow2_Release(&doc->window->base.IHTMLWindow2_iface);
+        doc->window = NULL;
     }
+}
+
+static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
+{
+    HTMLDocumentNode *This = impl_from_HTMLDOMNode(iface);
 
+    detach_document_node(This);
     heap_free(This->event_vector);
     ConnectionPointContainer_Destroy(&This->basedoc.cp_container);
 }
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 41df57f..ffd4424 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -126,15 +126,13 @@ static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIAN
 static void detach_inner_window(HTMLInnerWindow *window)
 {
     HTMLOuterWindow *outer_window = window->base.outer_window;
+    HTMLDocumentNode *doc = window->doc;
 
     if(outer_window && outer_window->doc_obj && outer_window == outer_window->doc_obj->basedoc.window)
         window->doc->basedoc.cp_container.forward_container = NULL;
 
-    if(window->doc) {
-        detach_events(window->doc);
-        while(!list_empty(&window->doc->plugin_hosts))
-            detach_plugin_host(LIST_ENTRY(list_head(&window->doc->plugin_hosts), PluginHost, entry));
-    }
+    if(doc)
+        detach_document_node(doc);
 
     abort_window_bindings(window);
     remove_target_tasks(window->task_magic);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index a0b3fea..cef745e 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -975,6 +975,7 @@ HRESULT HTMLTxtRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLTxtRange**) DECL
 IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet*) DECLSPEC_HIDDEN;
 IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetList*) DECLSPEC_HIDDEN;
 
+void detach_document_node(HTMLDocumentNode*) DECLSPEC_HIDDEN;
 void detach_selection(HTMLDocumentNode*) DECLSPEC_HIDDEN;
 void detach_ranges(HTMLDocumentNode*) DECLSPEC_HIDDEN;
 HRESULT get_node_text(HTMLDOMNode*,BSTR*) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list