Jacek Caban : mshtml: Store inner window directly in HTMLDocumentNode.

Alexandre Julliard julliard at winehq.org
Mon Jul 30 14:18:52 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jul 30 15:55:30 2012 +0200

mshtml: Store inner window directly in HTMLDocumentNode.

---

 dlls/mshtml/htmldoc.c        |   19 ++++++++++++++-----
 dlls/mshtml/htmlwindow.c     |    6 ++++--
 dlls/mshtml/mshtml_private.h |    4 +++-
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index a43522a..86615df 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -2091,8 +2091,13 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
         detach_plugin_host(LIST_ENTRY(list_head(&This->plugin_hosts), PluginHost, entry));
 
     if(This->nsdoc) {
+        assert(!This->window);
         release_document_mutation(This);
         nsIDOMHTMLDocument_Release(This->nsdoc);
+    }else if(This->window) {
+        /* document fragments own reference to inner window */
+        IHTMLWindow2_Release(&This->window->base.IHTMLWindow2_iface);
+        This->window = NULL;
     }
 
     heap_free(This->event_vector);
@@ -2124,6 +2129,7 @@ static void HTMLDocumentNode_unlink(HTMLDOMNode *iface)
         release_document_mutation(This);
         This->nsdoc = NULL;
         nsIDOMHTMLDocument_Release(nsdoc);
+        This->window = NULL;
     }
 }
 
@@ -2238,7 +2244,7 @@ static dispex_static_data_t HTMLDocumentNode_dispex = {
     HTMLDocumentNode_iface_tids
 };
 
-static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLOuterWindow *window)
+static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLInnerWindow *window)
 {
     HTMLDocumentNode *doc;
 
@@ -2249,7 +2255,8 @@ static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLOuterWindo
     doc->ref = 1;
     doc->basedoc.doc_node = doc;
     doc->basedoc.doc_obj = doc_obj;
-    doc->basedoc.window = window;
+    doc->basedoc.window = window->base.outer_window;
+    doc->window = window;
 
     init_dispex(&doc->node.dispex, (IUnknown*)&doc->node.IHTMLDOMNode_iface,
             &HTMLDocumentNode_dispex);
@@ -2264,7 +2271,7 @@ static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLOuterWindo
     return doc;
 }
 
-HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_obj, HTMLOuterWindow *window, HTMLDocumentNode **ret)
+HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_obj, HTMLInnerWindow *window, HTMLDocumentNode **ret)
 {
     HTMLDocumentNode *doc;
 
@@ -2272,7 +2279,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
     if(!doc)
         return E_OUTOFMEMORY;
 
-    if(!doc_obj->basedoc.window || window == doc_obj->basedoc.window)
+    if(!doc_obj->basedoc.window || window->base.outer_window == doc_obj->basedoc.window)
         doc->basedoc.cp_container.forward_container = &doc_obj->basedoc.cp_container;
 
     HTMLDOMNode_Init(doc, &doc->node, (nsIDOMNode*)nsdoc);
@@ -2294,10 +2301,12 @@ HRESULT create_document_fragment(nsIDOMNode *nsnode, HTMLDocumentNode *doc_node,
 {
     HTMLDocumentNode *doc_frag;
 
-    doc_frag = alloc_doc_node(doc_node->basedoc.doc_obj, doc_node->basedoc.window);
+    doc_frag = alloc_doc_node(doc_node->basedoc.doc_obj, doc_node->window);
     if(!doc_frag)
         return E_OUTOFMEMORY;
 
+    IHTMLWindow2_AddRef(&doc_frag->window->base.IHTMLWindow2_iface);
+
     HTMLDOMNode_Init(doc_node, &doc_frag->node, nsnode);
     doc_frag->node.vtbl = &HTMLDocumentFragmentImplVtbl;
     doc_frag->node.cp_container = &doc_frag->basedoc.cp_container;
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 3ade07e..dd25263 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -239,8 +239,10 @@ static void release_inner_window(HTMLInnerWindow *This)
     abort_window_bindings(This);
     release_script_hosts(This);
 
-    if(This->doc)
+    if(This->doc) {
+        This->doc->window = NULL;
         htmldoc_release(&This->doc->basedoc);
+    }
 
     release_dispex(&This->dispex);
 
@@ -2745,7 +2747,7 @@ HRESULT update_window_doc(HTMLInnerWindow *window)
         return E_FAIL;
     }
 
-    hres = create_doc_from_nsdoc(nshtmldoc, outer_window->doc_obj, outer_window, &window->doc);
+    hres = create_doc_from_nsdoc(nshtmldoc, outer_window->doc_obj, window, &window->doc);
     nsIDOMHTMLDocument_Release(nshtmldoc);
     if(FAILED(hres))
         return hres;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index b636685..0bc9d4a 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -679,6 +679,8 @@ struct HTMLDocumentNode {
 
     LONG ref;
 
+    HTMLInnerWindow *window;
+
     nsIDOMHTMLDocument *nsdoc;
     BOOL content_ready;
     event_target_t *body_event_target;
@@ -700,7 +702,7 @@ struct HTMLDocumentNode {
 
 HRESULT HTMLDocument_Create(IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
 HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
-HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocumentObj*,HTMLOuterWindow*,HTMLDocumentNode**) DECLSPEC_HIDDEN;
+HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocumentObj*,HTMLInnerWindow*,HTMLDocumentNode**) DECLSPEC_HIDDEN;
 HRESULT create_document_fragment(nsIDOMNode*,HTMLDocumentNode*,HTMLDocumentNode**) DECLSPEC_HIDDEN;
 
 HRESULT HTMLOuterWindow_Create(HTMLDocumentObj*,nsIDOMWindow*,HTMLOuterWindow*,HTMLOuterWindow**) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list