Jacek Caban : mshtml: Store nsIDOMHTMLDocument in HTMLDocument.

Alexandre Julliard julliard at winehq.org
Thu Oct 9 07:42:42 CDT 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Oct  8 13:27:25 2008 -0500

mshtml: Store nsIDOMHTMLDocument in HTMLDocument.

---

 dlls/mshtml/htmldoc.c        |    4 ++++
 dlls/mshtml/mshtml_private.h |    2 ++
 dlls/mshtml/navigate.c       |    4 +++-
 dlls/mshtml/nsembed.c        |   41 ++++++++++++++++++++++++++++++++++++++++-
 dlls/mshtml/nsevents.c       |    1 +
 5 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index ebb6538..9ac6f2e 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -204,6 +204,8 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
 
         ConnectionPointContainer_Destroy(&This->cp_container);
 
+        if(This->nsdoc)
+            nsIDOMHTMLDocument_Release(This->nsdoc);
         if(This->nscontainer)
             NSContainer_Release(This->nscontainer);
 
@@ -1636,6 +1638,8 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
     init_dispex(&ret->dispex, (IUnknown*)HTMLDOC(ret), &HTMLDocument_dispex);
 
     ret->nscontainer = NSContainer_Create(ret, NULL);
+    update_nsdocument(ret);
+
     ret->window = HTMLWindow_Create(ret);
 
     get_thread_hwnd();
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index b90d07a..cac1117 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -246,6 +246,7 @@ struct HTMLDocument {
 
     NSContainer *nscontainer;
     HTMLWindow *window;
+    nsIDOMHTMLDocument *nsdoc;
 
     IOleClientSite *client;
     IDocHostUIHandler *hostui;
@@ -530,6 +531,7 @@ void get_editor_controller(NSContainer*);
 void init_nsevents(NSContainer*);
 void add_nsevent_listener(NSContainer*,LPCWSTR);
 nsresult get_nsinterface(nsISupports*,REFIID,void**);
+void update_nsdocument(HTMLDocument*);
 
 void check_event_attr(HTMLDocument*,nsIDOMElement*);
 void release_event_target(event_target_t*);
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index d019e29..0a543a7 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -883,8 +883,10 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
                 FIXME("OnStartRequest failed: %08x\n", nsres);
 
             /* events are reset when a new document URI is loaded, so re-initialise them here */
-            if(This->bsc.doc && This->bsc.doc->bscallback == This && This->bsc.doc->nscontainer)
+            if(This->bsc.doc && This->bsc.doc->bscallback == This && This->bsc.doc->nscontainer) {
+                update_nsdocument(This->bsc.doc);
                 init_nsevents(This->bsc.doc->nscontainer);
+            }
         }
 
         This->bsc.readed += This->nsstream->buf_size;
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 78563d3..94707c2 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -866,6 +866,39 @@ void set_ns_editmode(NSContainer *This)
     nsIWebBrowser_SetParentURIContentListener(This->webbrowser, NSURICL(This));
 }
 
+void update_nsdocument(HTMLDocument *doc)
+{
+    nsIDOMHTMLDocument *nsdoc;
+    nsIDOMDocument *nsdomdoc;
+    nsresult nsres;
+
+    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(nsdoc == doc->nsdoc) {
+        nsIDOMHTMLDocument_Release(nsdoc);
+        return;
+    }
+
+    if(doc->nsdoc)
+        nsIDOMHTMLDocument_Release(doc->nsdoc);
+
+    doc->nsdoc = nsdoc;
+}
+
 void close_gecko(void)
 {
     TRACE("()\n");
@@ -963,8 +996,14 @@ static nsresult NSAPI nsWebBrowserChrome_SetStatus(nsIWebBrowserChrome *iface,
         PRUint32 statusType, const PRUnichar *status)
 {
     NSContainer *This = NSWBCHROME_THIS(iface);
+
     TRACE("(%p)->(%d %s)\n", This, statusType, debugstr_w(status));
-    return NS_ERROR_NOT_IMPLEMENTED;
+
+    /* FIXME: This hack should be removed when we'll load all pages by URLMoniker */
+    if(This->doc)
+        update_nsdocument(This->doc);
+
+    return NS_OK;
 }
 
 static nsresult NSAPI nsWebBrowserChrome_GetWebBrowser(nsIWebBrowserChrome *iface,
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c
index d0f5079..e79ec4e 100644
--- a/dlls/mshtml/nsevents.c
+++ b/dlls/mshtml/nsevents.c
@@ -139,6 +139,7 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
     if(!This->doc)
         return NS_OK;
 
+    update_nsdocument(This->doc);
     connect_scripts(This->doc);
     setup_nswindow(This->doc->window);
 




More information about the wine-cvs mailing list