Jacek Caban : mshtml: Use IUri instead of wine_url in before_async_open.

Alexandre Julliard julliard at winehq.org
Fri Jun 24 13:54:01 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jun 23 13:45:34 2011 +0200

mshtml: Use IUri instead of wine_url in before_async_open.

---

 dlls/mshtml/nsio.c |   51 ++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 9473754..b47a643 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -126,7 +126,7 @@ HRESULT nsuri_to_url(LPCWSTR nsuri, BOOL ret_empty, BSTR *ret)
     return S_OK;
 }
 
-static BOOL exec_shldocvw_67(HTMLDocumentObj *doc, LPCWSTR url)
+static BOOL exec_shldocvw_67(HTMLDocumentObj *doc, BSTR url)
 {
     IOleCommandTarget *cmdtrg = NULL;
     HRESULT hres;
@@ -136,13 +136,12 @@ static BOOL exec_shldocvw_67(HTMLDocumentObj *doc, LPCWSTR url)
         VARIANT varUrl, varRes;
 
         V_VT(&varUrl) = VT_BSTR;
-        V_BSTR(&varUrl) = SysAllocString(url);
+        V_BSTR(&varUrl) = url;
         V_VT(&varRes) = VT_BOOL;
 
         hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 67, 0, &varUrl, &varRes);
 
         IOleCommandTarget_Release(cmdtrg);
-        SysFreeString(V_BSTR(&varUrl));
 
         if(SUCCEEDED(hres) && !V_BOOL(&varRes)) {
             TRACE("got VARIANT_FALSE, do not load\n");
@@ -153,11 +152,10 @@ static BOOL exec_shldocvw_67(HTMLDocumentObj *doc, LPCWSTR url)
     return TRUE;
 }
 
-static BOOL before_async_open(nsChannel *channel, NSContainer *container)
+static nsresult before_async_open(nsChannel *channel, NSContainer *container, BOOL *cancel)
 {
     HTMLDocumentObj *doc = container->doc;
     DWORD hlnf = 0;
-    BOOL cancel;
     HRESULT hres;
 
     if(!doc) {
@@ -169,14 +167,31 @@ static BOOL before_async_open(nsChannel *channel, NSContainer *container)
         doc = container_iter->doc;
     }
 
-    if(!doc->client)
-        return TRUE;
+    if(!doc->client) {
+        *cancel = TRUE;
+        return NS_OK;
+    }
 
-    if(!hlnf && !exec_shldocvw_67(doc, channel->uri->wine_url))
-        return FALSE;
+    if(!hlnf) {
+        BSTR display_uri;
+        BOOL b;
+
+        hres = IUri_GetDisplayUri(channel->uri->uri, &display_uri);
+        if(FAILED(hres))
+            return NS_ERROR_FAILURE;
 
-    hres = hlink_frame_navigate(&doc->basedoc, channel->uri->wine_url, channel, hlnf, &cancel);
-    return FAILED(hres) || cancel;
+        b = !exec_shldocvw_67(doc, display_uri);
+        SysFreeString(display_uri);
+        if(b) {
+            *cancel = FALSE;
+            return NS_OK;
+        }
+    }
+
+    hres = hlink_frame_navigate(&doc->basedoc, channel->uri->wine_url, channel, hlnf, cancel);
+    if(FAILED(hres))
+        *cancel = TRUE;
+    return NS_OK;
 }
 
 HRESULT load_nsuri(HTMLWindow *window, nsWineURI *uri, nsChannelBSC *channelbsc, DWORD flags)
@@ -948,7 +963,7 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
 {
     nsChannel *This = impl_from_nsIHttpChannel(iface);
     HTMLWindow *window = NULL;
-    BOOL open = TRUE;
+    BOOL cancel = FALSE;
     nsresult nsres = NS_OK;
 
     TRACE("(%p)->(%p %p) opening %s\n", This, aListener, aContext, debugstr_w(This->uri->wine_url));
@@ -967,7 +982,9 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
             if(This->uri->container->doc)
                 FIXME("nscontainer->doc = %p\n", This->uri->container->doc);
 
-            b = before_async_open(This, This->uri->container);
+            nsres = before_async_open(This, This->uri->container, &b);
+            if(NS_FAILED(nsres))
+                return nsres;
             if(b)
                 FIXME("Navigation not cancelled\n");
             return NS_ERROR_UNEXPECTED;
@@ -1003,17 +1020,17 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
                 This->content_type = heap_strdupWtoA(window->doc_obj->mime);
             }
 
-            open = FALSE;
+            cancel = TRUE;
         }else {
-            open = !before_async_open(This, window->doc_obj->nscontainer);
-            if(!open) {
+            nsres = before_async_open(This, window->doc_obj->nscontainer, &cancel);
+            if(NS_SUCCEEDED(nsres)  && cancel) {
                 TRACE("canceled\n");
                 nsres = NS_ERROR_UNEXPECTED;
             }
         }
     }
 
-    if(open)
+    if(!cancel)
         nsres = async_open(This, window, This->uri->is_doc_uri, aListener, aContext);
 
     if(NS_SUCCEEDED(nsres) && This->load_group) {




More information about the wine-cvs mailing list