Jacek Caban : mshtml: Moved HTMLDocumentNode creating to HTMLWindow_Create.

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


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

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

mshtml: Moved HTMLDocumentNode creating to HTMLWindow_Create.

---

 dlls/mshtml/htmldoc.c        |    6 ++++-
 dlls/mshtml/htmliframe.c     |   17 +-------------
 dlls/mshtml/htmlwindow.c     |   47 +++++++++++++++++++++++++++++++++++++-
 dlls/mshtml/mshtml_private.h |    3 +-
 dlls/mshtml/navigate.c       |    2 +-
 dlls/mshtml/nsembed.c        |   52 ------------------------------------------
 dlls/mshtml/nsevents.c       |    1 -
 7 files changed, 54 insertions(+), 74 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 5e34ced..3e07924 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1998,7 +1998,11 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
         return hres;
     }
 
-    update_nsdocument(doc);
+    if(!doc->basedoc.doc_node && doc->basedoc.window->doc) {
+        doc->basedoc.doc_node = doc->basedoc.window->doc;
+        htmldoc_addref(&doc->basedoc.doc_node->basedoc);
+    }
+
     get_thread_hwnd();
 
     return S_OK;
diff --git a/dlls/mshtml/htmliframe.c b/dlls/mshtml/htmliframe.c
index 7af0070..dc514d8 100644
--- a/dlls/mshtml/htmliframe.c
+++ b/dlls/mshtml/htmliframe.c
@@ -353,9 +353,7 @@ static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface,
 
     if(!This->content_window) {
         nsIDOMHTMLDocument *nshtmldoc;
-        HTMLDocumentNode *content_doc;
         nsIDOMDocument *nsdoc;
-        HTMLWindow *window;
         nsresult nsres;
         HRESULT hres;
 
@@ -377,23 +375,10 @@ static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface,
             return E_FAIL;
         }
 
-        hres = create_content_window(This, nshtmldoc, &window);
-        if(FAILED(hres)) {
-            nsIDOMHTMLDocument_Release(nshtmldoc);
-            return E_FAIL;
-        }
-
-        hres = create_doc_from_nsdoc(nshtmldoc, This->element.node.doc->basedoc.doc_obj, window, &content_doc);
+        hres = create_content_window(This, nshtmldoc, &This->content_window);
         nsIDOMHTMLDocument_Release(nshtmldoc);
-        if(SUCCEEDED(hres))
-            window_set_docnode(window, content_doc);
-        else
-            IHTMLWindow2_Release(HTMLWINDOW2(window));
-        htmldoc_release(&content_doc->basedoc);
         if(FAILED(hres))
             return hres;
-
-        This->content_window = window;
     }
 
     IHTMLWindow2_AddRef(HTMLWINDOW2(This->content_window));
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index fe7444a..91e0e34 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -36,7 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
 static struct list window_list = LIST_INIT(window_list);
 
-void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node)
+static void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node)
 {
     if(window->doc) {
         window->doc->basedoc.window = NULL;
@@ -45,6 +45,14 @@ void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node)
     window->doc = doc_node;
     if(doc_node)
         htmldoc_addref(&doc_node->basedoc);
+
+    if(window->doc_obj && window->doc_obj->basedoc.window == window) {
+        if(window->doc_obj->basedoc.doc_node)
+            htmldoc_release(&window->doc_obj->basedoc.doc_node->basedoc);
+        window->doc_obj->basedoc.doc_node = doc_node;
+        if(doc_node)
+            htmldoc_addref(&doc_node->basedoc);
+    }
 }
 
 #define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface)
@@ -1516,12 +1524,49 @@ HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTML
     window->scriptmode = SCRIPTMODE_GECKO;
     list_init(&window->script_hosts);
 
+    update_window_doc(window);
+
     list_add_head(&window_list, &window->entry);
 
     *ret = window;
     return S_OK;
 }
 
+void update_window_doc(HTMLWindow *window)
+{
+    nsIDOMHTMLDocument *nshtmldoc;
+    nsIDOMDocument *nsdoc;
+    nsresult nsres;
+
+    nsres = nsIDOMWindow_GetDocument(window->nswindow, &nsdoc);
+    if(NS_FAILED(nsres) || !nsdoc) {
+        ERR("GetDocument failed: %08x\n", nsres);
+        return;
+    }
+
+    nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMHTMLDocument, (void**)&nshtmldoc);
+    nsIDOMDocument_Release(nsdoc);
+    if(NS_FAILED(nsres)) {
+        ERR("Could not get nsIDOMHTMLDocument iface: %08x\n", nsres);
+        return;
+    }
+
+    if(!window->doc || window->doc->nsdoc != nshtmldoc) {
+        HTMLDocumentNode *doc;
+        HRESULT hres;
+
+        hres = create_doc_from_nsdoc(nshtmldoc, window->doc_obj, window, &doc);
+        if(SUCCEEDED(hres)) {
+            window_set_docnode(window, doc);
+            htmldoc_release(&doc->basedoc);
+        }else {
+            ERR("create_doc_from_nsdoc failed: %08x\n", hres);
+        }
+    }
+
+    nsIDOMHTMLDocument_Release(nshtmldoc);
+}
+
 HTMLWindow *nswindow_to_window(const nsIDOMWindow *nswindow)
 {
     HTMLWindow *iter;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 85421d1..8fc9b01 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -572,7 +572,7 @@ HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**);
 HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocumentObj*,HTMLWindow*,HTMLDocumentNode**);
 
 HRESULT HTMLWindow_Create(HTMLDocumentObj*,nsIDOMWindow*,HTMLWindow**);
-void window_set_docnode(HTMLWindow*,HTMLDocumentNode*);
+void update_window_doc(HTMLWindow*);
 HTMLWindow *nswindow_to_window(const nsIDOMWindow*);
 HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLWindow*);
 HTMLImageElementFactory *HTMLImageElementFactory_Create(HTMLWindow*);
@@ -647,7 +647,6 @@ void get_editor_controller(NSContainer*);
 void init_nsevents(NSContainer*);
 void add_nsevent_listener(HTMLWindow*,LPCWSTR);
 nsresult get_nsinterface(nsISupports*,REFIID,void**);
-void update_nsdocument(HTMLDocumentObj*);
 
 void set_document_bscallback(HTMLDocument*,nsChannelBSC*);
 void set_current_mon(HTMLDocument*,IMoniker*);
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 951b04d..33bf1c1 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -952,7 +952,7 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
 
             /* events are reset when a new document URI is loaded, so re-initialise them here */
             if(This->bsc.doc && This->bsc.doc->doc_obj->bscallback == This && This->bsc.doc->doc_obj->nscontainer) {
-                update_nsdocument(This->bsc.doc->doc_obj);
+                update_window_doc(This->bsc.doc->window);
                 init_nsevents(This->bsc.doc->doc_obj->nscontainer);
             }
         }
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 256c09a..f6efd26 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -807,58 +807,6 @@ void set_ns_editmode(NSContainer *This)
     nsIWebBrowser_SetParentURIContentListener(This->webbrowser, NSURICL(This));
 }
 
-void update_nsdocument(HTMLDocumentObj *doc)
-{
-    HTMLDocumentNode *doc_node;
-    nsIDOMHTMLDocument *nsdoc;
-    nsIDOMDocument *nsdomdoc;
-    nsresult nsres;
-    HRESULT hres;
-
-    if(!doc->nscontainer || !doc->nscontainer->navigation)
-        return;
-
-    nsres = nsIWebNavigation_GetDocument(doc->nscontainer->navigation, &nsdomdoc);
-    if(NS_FAILED(nsres) || !nsdomdoc) {
-        ERR("GetDocument failed: %08x\n", nsres);
-        return;
-    }
-
-    nsres = nsIDOMDocument_QueryInterface(nsdomdoc, &IID_nsIDOMHTMLDocument, (void**)&nsdoc);
-    nsIDOMDocument_Release(nsdomdoc);
-    if(NS_FAILED(nsres)) {
-        ERR("Could not get nsIDOMHTMLDocument iface: %08x\n", nsres);
-        return;
-    }
-
-    if(doc->basedoc.doc_node && nsdoc == doc->basedoc.doc_node->nsdoc) {
-        nsIDOMHTMLDocument_Release(nsdoc);
-        return;
-    }
-
-    if(doc->basedoc.doc_node && doc->basedoc.doc_node->nsdoc) {
-        doc_node = doc->basedoc.doc_node;
-        doc_node->basedoc.doc_obj = NULL;
-        IHTMLDocument2_Release(HTMLDOC(&doc_node->basedoc));
-        doc->basedoc.doc_node = NULL;
-    }
-
-    if(!nsdoc) {
-        doc->basedoc.doc_node = NULL;
-        window_set_docnode(doc->basedoc.window, NULL);
-        return;
-    }
-
-    hres = create_doc_from_nsdoc(nsdoc, doc, doc->basedoc.window, &doc_node);
-    if(FAILED(hres)) {
-        ERR("Could not create document: %08x\n", hres);
-        return;
-    }
-
-    doc->basedoc.doc_node = doc_node;
-    window_set_docnode(doc->basedoc.window, doc_node);
-}
-
 void close_gecko(void)
 {
     TRACE("()\n");
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c
index 2a0130a..e2758ce 100644
--- a/dlls/mshtml/nsevents.c
+++ b/dlls/mshtml/nsevents.c
@@ -137,7 +137,6 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
     if(!This->doc)
         return NS_OK;
 
-    update_nsdocument(This->doc);
     connect_scripts(This->doc->basedoc.window);
 
     if(This->editor_controller) {




More information about the wine-cvs mailing list