Jacek Caban : mshtml: Use load group to find NSContainer in AsyncOpen if URI has no associated container .

Alexandre Julliard julliard at winehq.org
Mon Mar 10 07:16:52 CDT 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sat Mar  8 20:15:30 2008 +0100

mshtml: Use load group to find NSContainer in AsyncOpen if URI has no associated container.

---

 dlls/mshtml/nsio.c |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 52 insertions(+), 1 deletions(-)

diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index f684f2a..d55546d 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -634,6 +634,48 @@ static HRESULT create_mon_for_nschannel(nsChannel *channel, IMoniker **mon)
     return hres;
 }
 
+static NSContainer *get_nscontainer_from_load_group(nsChannel *This)
+{
+    NSContainer *container;
+    nsIChannel *channel;
+    nsIRequest *req;
+    nsIWineURI *wine_uri;
+    nsIURI *uri;
+    nsresult nsres;
+
+    nsres = nsILoadGroup_GetDefaultLoadRequest(This->load_group, &req);
+    if(NS_FAILED(nsres)) {
+        ERR("GetDefaultLoadRequest failed: %08x\n", nsres);
+        return NULL;
+    }
+
+    nsres = nsIRequest_QueryInterface(req, &IID_nsIChannel, (void**)&channel);
+    nsIRequest_Release(req);
+    if(NS_FAILED(nsres)) {
+        WARN("Could not get nsIChannel interface: %08x\n", nsres);
+        return NULL;
+    }
+
+    nsres = nsIChannel_GetURI(channel, &uri);
+    nsIChannel_Release(channel);
+    if(NS_FAILED(nsres)) {
+        ERR("GetURI failed: %08x\n", nsres);
+        return NULL;
+    }
+
+    nsres = nsIURI_QueryInterface(uri, &IID_nsIWineURI, (void**)&wine_uri);
+    nsIURI_Release(uri);
+    if(NS_FAILED(nsres)) {
+        TRACE("Could not get nsIWineURI: %08x\n", nsres);
+        return NULL;
+    }
+
+    nsIWineURI_GetNSContainer(wine_uri, &container);
+    nsIWineURI_Release(wine_uri);
+
+    return container;
+}
+
 static nsresult async_open_doc_uri(nsChannel *This, NSContainer *container,
         nsIStreamListener *listener, nsISupports *context, BOOL *open)
 {
@@ -774,6 +816,13 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
     TRACE("(%p)->(%p %p)\n", This, aListener, aContext);
 
     nsIWineURI_GetNSContainer(This->uri, &container);
+
+    if(!container && This->load_group) {
+        container = get_nscontainer_from_load_group(This);
+        if(container)
+            nsIWineURI_SetNSContainer(This->uri, container);
+    }
+
     if(!container) {
         TRACE("container = NULL\n");
         return This->channel
@@ -2043,7 +2092,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
     }
 
     nsACString_Init(&spec_str, spec);
-    nsres = nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, &uri);
+    nsres = nsIIOService_NewURI(nsio, &spec_str, aOriginCharset, aBaseURI, &uri);
     nsACString_Finish(&spec_str);
     if(NS_FAILED(nsres))
         TRACE("NewURI failed: %08x\n", nsres);
@@ -2058,6 +2107,8 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
         }
     }
 
+    TRACE("nscontainer = %p\n", nscontainer);
+
     nsres = create_uri(uri, nscontainer, &wine_uri);
     *_retval = (nsIURI*)wine_uri;
 




More information about the wine-cvs mailing list