Jacek Caban : mshtml: Use IUri as base URL in navigate_url.

Alexandre Julliard julliard at winehq.org
Fri Sep 21 14:22:40 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Sep 21 12:24:37 2012 +0200

mshtml: Use IUri as base URL in navigate_url.

---

 dlls/mshtml/binding.h        |    2 +-
 dlls/mshtml/htmlanchor.c     |    2 +-
 dlls/mshtml/htmldoc.c        |    2 +-
 dlls/mshtml/htmlframebase.c  |    2 +-
 dlls/mshtml/htmllocation.c   |    4 +-
 dlls/mshtml/mshtml_private.h |    2 +-
 dlls/mshtml/navigate.c       |   98 ++++++++++++++++++++++++-----------------
 dlls/mshtml/nsio.c           |    2 +-
 8 files changed, 65 insertions(+), 49 deletions(-)

diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h
index 0053e75..4d19c46 100644
--- a/dlls/mshtml/binding.h
+++ b/dlls/mshtml/binding.h
@@ -103,7 +103,7 @@ HRESULT create_redirect_nschannel(const WCHAR*,nsChannel*,nsChannel**) DECLSPEC_
 
 nsresult on_start_uri_open(NSContainer*,nsIURI*,cpp_bool*) DECLSPEC_HIDDEN;
 HRESULT hlink_frame_navigate(HTMLDocument*,LPCWSTR,nsChannel*,DWORD,BOOL*) DECLSPEC_HIDDEN;
-HRESULT create_doc_uri(HTMLOuterWindow*,WCHAR*,nsWineURI**) DECLSPEC_HIDDEN;
+HRESULT create_doc_uri(HTMLOuterWindow*,const WCHAR*,nsWineURI**) DECLSPEC_HIDDEN;
 HRESULT load_nsuri(HTMLOuterWindow*,nsWineURI*,nsChannelBSC*,DWORD) DECLSPEC_HIDDEN;
 HRESULT set_moniker(HTMLDocument*,IMoniker*,IBindCtx*,nsChannelBSC*,BOOL) DECLSPEC_HIDDEN;
 void prepare_for_binding(HTMLDocument*,IMoniker*,BOOL) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c
index fac2d63..b0ec97e 100644
--- a/dlls/mshtml/htmlanchor.c
+++ b/dlls/mshtml/htmlanchor.c
@@ -121,7 +121,7 @@ static HRESULT navigate_anchor(HTMLAnchorElement *This)
         if(*href) {
             if(!window)
                 window = This->element.node.doc->basedoc.window;
-            hres = navigate_url(window, href, window->url);
+            hres = navigate_url(window, href, window->uri);
         }else {
             TRACE("empty href\n");
             hres = S_OK;
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index a6bb56d..ff917d9 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -609,7 +609,7 @@ static HRESULT WINAPI HTMLDocument_put_URL(IHTMLDocument2 *iface, BSTR v)
         return E_FAIL;
     }
 
-    return navigate_url(This->window, v, This->window->url);
+    return navigate_url(This->window, v, This->window->uri);
 }
 
 static HRESULT WINAPI HTMLDocument_get_URL(IHTMLDocument2 *iface, BSTR *p)
diff --git a/dlls/mshtml/htmlframebase.c b/dlls/mshtml/htmlframebase.c
index bc00761..55a56db 100644
--- a/dlls/mshtml/htmlframebase.c
+++ b/dlls/mshtml/htmlframebase.c
@@ -135,7 +135,7 @@ static HRESULT WINAPI HTMLFrameBase_put_src(IHTMLFrameBase *iface, BSTR v)
         return E_FAIL;
     }
 
-    return navigate_url(This->content_window, v, This->element.node.doc->basedoc.window->url);
+    return navigate_url(This->content_window, v, This->element.node.doc->basedoc.window->uri);
 }
 
 static HRESULT WINAPI HTMLFrameBase_get_src(IHTMLFrameBase *iface, BSTR *p)
diff --git a/dlls/mshtml/htmllocation.c b/dlls/mshtml/htmllocation.c
index cde1fee..3ce0978 100644
--- a/dlls/mshtml/htmllocation.c
+++ b/dlls/mshtml/htmllocation.c
@@ -170,7 +170,7 @@ static HRESULT WINAPI HTMLLocation_put_href(IHTMLLocation *iface, BSTR v)
         return E_FAIL;
     }
 
-    return navigate_url(This->window->base.outer_window, v, This->window->base.outer_window->url);
+    return navigate_url(This->window->base.outer_window, v, This->window->base.outer_window->uri);
 }
 
 static HRESULT WINAPI HTMLLocation_get_href(IHTMLLocation *iface, BSTR *p)
@@ -570,7 +570,7 @@ static HRESULT WINAPI HTMLLocation_replace(IHTMLLocation *iface, BSTR bstr)
         return E_FAIL;
     }
 
-    return navigate_url(This->window->base.outer_window, bstr, This->window->base.outer_window->url);
+    return navigate_url(This->window->base.outer_window, bstr, This->window->base.outer_window->uri);
 }
 
 static HRESULT WINAPI HTMLLocation_assign(IHTMLLocation *iface, BSTR bstr)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index fa4e073..aec754f 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -775,7 +775,7 @@ void init_node_cc(void);
 HRESULT nsuri_to_url(LPCWSTR,BOOL,BSTR*) DECLSPEC_HIDDEN;
 BOOL compare_ignoring_frag(IUri*,IUri*) DECLSPEC_HIDDEN;
 
-HRESULT navigate_url(HTMLOuterWindow*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN;
+HRESULT navigate_url(HTMLOuterWindow*,const WCHAR*,IUri*) DECLSPEC_HIDDEN;
 HRESULT set_frame_doc(HTMLFrameBase*,nsIDOMDocument*) DECLSPEC_HIDDEN;
 
 void call_property_onchanged(ConnectionPoint*,DISPID) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 15c9e85..3b618e2 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -2245,61 +2245,28 @@ HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url, nsChannel *nschanne
     return hres;
 }
 
-HRESULT navigate_url(HTMLOuterWindow *window, const WCHAR *new_url, const WCHAR *base_url)
+HRESULT navigate_uri(HTMLOuterWindow *window, IUri *uri, const WCHAR *display_uri)
 {
-    WCHAR url[INTERNET_MAX_URL_LENGTH];
-    nsWineURI *uri;
+    nsWineURI *nsuri;
     HRESULT hres;
 
-    if(!new_url) {
-        *url = 0;
-    }else if(base_url) {
-        DWORD len = 0;
-
-        hres = CoInternetCombineUrl(base_url, new_url, URL_ESCAPE_SPACES_ONLY|URL_DONT_ESCAPE_EXTRA_INFO,
-                url, sizeof(url)/sizeof(WCHAR), &len, 0);
-        if(FAILED(hres))
-            return hres;
-    }else {
-        strcpyW(url, new_url);
-    }
-
-    if(window->doc_obj && window->doc_obj->hostui) {
-        OLECHAR *translated_url = NULL;
-
-        hres = IDocHostUIHandler_TranslateUrl(window->doc_obj->hostui, 0, url,
-                &translated_url);
-        if(hres == S_OK) {
-            TRACE("%08x %s -> %s\n", hres, debugstr_w(url), debugstr_w(translated_url));
-            strcpyW(url, translated_url);
-            CoTaskMemFree(translated_url);
-        }
-    }
-
     if(window->doc_obj && window->doc_obj->is_webbrowser && window == window->doc_obj->basedoc.window) {
         BOOL cancel = FALSE;
-        IUri *uri;
 
-        hres = IDocObjectService_FireBeforeNavigate2(window->doc_obj->doc_object_service, NULL, url, 0x40,
+        hres = IDocObjectService_FireBeforeNavigate2(window->doc_obj->doc_object_service, NULL, display_uri, 0x40,
                 NULL, NULL, 0, NULL, TRUE, &cancel);
         if(SUCCEEDED(hres) && cancel) {
             TRACE("Navigation canceled\n");
             return S_OK;
         }
 
-        hres = CreateUri(url, 0, 0, &uri);
-        if(FAILED(hres))
-            return hres;
-
-        hres = super_navigate(window, uri, NULL, NULL, 0);
-        IUri_Release(uri);
-        return hres;
+        return super_navigate(window, uri, NULL, NULL, 0);
     }
 
     if(window->doc_obj && window == window->doc_obj->basedoc.window) {
         BOOL cancel;
 
-        hres = hlink_frame_navigate(&window->base.inner_window->doc->basedoc, url, NULL, 0, &cancel);
+        hres = hlink_frame_navigate(&window->base.inner_window->doc->basedoc, display_uri, NULL, 0, &cancel);
         if(FAILED(hres))
             return hres;
 
@@ -2309,11 +2276,60 @@ HRESULT navigate_url(HTMLOuterWindow *window, const WCHAR *new_url, const WCHAR
         }
     }
 
-    hres = create_doc_uri(window, url, &uri);
+    hres = create_doc_uri(window, display_uri, &nsuri);
+    if(FAILED(hres))
+        return hres;
+
+    hres = load_nsuri(window, nsuri, NULL, LOAD_FLAGS_NONE);
+    nsISupports_Release((nsISupports*)nsuri);
+    return hres;
+}
+
+HRESULT navigate_url(HTMLOuterWindow *window, const WCHAR *new_url, IUri *base_uri)
+{
+    BSTR display_uri;
+    IUri *uri;
+    HRESULT hres;
+
+    if(new_url && base_uri)
+        hres = CoInternetCombineUrlEx(base_uri, new_url, URL_ESCAPE_SPACES_ONLY|URL_DONT_ESCAPE_EXTRA_INFO,
+                &uri, 0);
+    else
+        hres = CreateUri(new_url, 0, 0, &uri);
     if(FAILED(hres))
         return hres;
 
-    hres = load_nsuri(window, uri, NULL, LOAD_FLAGS_NONE);
-    nsISupports_Release((nsISupports*)uri);
+    hres = IUri_GetDisplayUri(uri, &display_uri);
+    if(FAILED(hres)) {
+        IUri_Release(uri);
+        return hres;
+    }
+
+    if(window->doc_obj && window->doc_obj->hostui) {
+        OLECHAR *translated_url = NULL;
+
+        hres = IDocHostUIHandler_TranslateUrl(window->doc_obj->hostui, 0, display_uri,
+                &translated_url);
+        if(hres == S_OK) {
+            TRACE("%08x %s -> %s\n", hres, debugstr_w(display_uri), debugstr_w(translated_url));
+            SysFreeString(display_uri);
+            IUri_Release(uri);
+            hres = CreateUri(translated_url, 0, 0, &uri);
+            CoTaskMemFree(translated_url);
+            if(FAILED(hres))
+                return hres;
+
+            hres = IUri_GetDisplayUri(uri, &display_uri);
+            if(FAILED(hres)) {
+                IUri_Release(uri);
+                return hres;
+            }
+        }
+    }
+
+    hres = navigate_uri(window, uri, display_uri);
+
+    IUri_Release(uri);
+    SysFreeString(display_uri);
     return hres;
 }
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 4b247ee..cf71ec5 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -2867,7 +2867,7 @@ static nsresult create_nsuri(IUri *iuri, HTMLOuterWindow *window, NSContainer *c
     return NS_OK;
 }
 
-HRESULT create_doc_uri(HTMLOuterWindow *window, WCHAR *url, nsWineURI **ret)
+HRESULT create_doc_uri(HTMLOuterWindow *window, const WCHAR *url, nsWineURI **ret)
 {
     nsWineURI *uri;
     IUri *iuri;




More information about the wine-cvs mailing list