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