diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 019f66f1603..827b8129ed6 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -437,6 +437,7 @@ struct NSContainer {
typedef struct nsWineURI nsWineURI;
HRESULT set_wine_url(nsWineURI*,LPCWSTR);
+nsresult on_start_uri_open(NSContainer*,nsIURI*,PRBool*);
typedef struct {
const nsIHttpChannelVtbl *lpHttpChannelVtbl;
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 3415657fbcb..fa8aa41fedf 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -1124,41 +1124,12 @@ static nsrefcnt NSAPI nsURIContentListener_Release(nsIURIContentListener *iface)
return nsIWebBrowserChrome_Release(NSWBCHROME(This));
}
-static BOOL translate_url(HTMLDocumentObj *doc, nsIWineURI *nsuri)
-{
- OLECHAR *new_url = NULL, *url;
- BOOL ret = FALSE;
- LPCWSTR wine_url;
- HRESULT hres;
-
- if(!doc->hostui)
- return FALSE;
-
- nsIWineURI_GetWineURL(nsuri, &wine_url);
-
- url = heap_strdupW(wine_url);
- hres = IDocHostUIHandler_TranslateUrl(doc->hostui, 0, url, &new_url);
- heap_free(url);
- if(hres != S_OK || !new_url)
- return FALSE;
-
- if(strcmpW(url, new_url)) {
- FIXME("TranslateUrl returned new URL %s -> %s\n", debugstr_w(url), debugstr_w(new_url));
- ret = TRUE;
- }
-
- CoTaskMemFree(new_url);
- return ret;
-}
-
static nsresult NSAPI nsURIContentListener_OnStartURIOpen(nsIURIContentListener *iface,
nsIURI *aURI, PRBool *_retval)
{
NSContainer *This = NSURICL_THIS(iface);
- nsIWineURI *wine_uri;
nsACString spec_str;
const char *spec;
- BOOL is_doc_uri;
nsresult nsres;
nsACString_Init(&spec_str, NULL);
@@ -1169,22 +1140,9 @@ static nsresult NSAPI nsURIContentListener_OnStartURIOpen(nsIURIContentListener
nsACString_Finish(&spec_str);
- nsres = nsIURI_QueryInterface(aURI, &IID_nsIWineURI, (void**)&wine_uri);
- if(NS_FAILED(nsres)) {
- WARN("Could not get nsIWineURI interface: %08x\n", nsres);
- return NS_ERROR_NOT_IMPLEMENTED;
- }
-
- nsIWineURI_GetIsDocumentURI(wine_uri, &is_doc_uri);
-
- if(!is_doc_uri) {
- nsIWineURI_SetNSContainer(wine_uri, This);
- nsIWineURI_SetIsDocumentURI(wine_uri, TRUE);
-
- *_retval = translate_url(This->doc->basedoc.doc_obj, wine_uri);
- }
-
- nsIWineURI_Release(wine_uri);
+ nsres = on_start_uri_open(This, aURI, _retval);
+ if(NS_FAILED(nsres))
+ return nsres;
return !*_retval && This->content_listener
? nsIURIContentListener_OnStartURIOpen(This->content_listener, aURI, _retval)
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index b9e1e6090b0..c2866736648 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -150,6 +150,56 @@ static BOOL before_async_open(nsChannel *channel, NSContainer *container)
return hres != S_OK;
}
+static BOOL translate_url(HTMLDocumentObj *doc, nsWineURI *uri)
+{
+ OLECHAR *new_url = NULL, *url;
+ BOOL ret = FALSE;
+ HRESULT hres;
+
+ if(!doc->hostui)
+ return FALSE;
+
+ url = heap_strdupW(uri->wine_url);
+ hres = IDocHostUIHandler_TranslateUrl(doc->hostui, 0, url, &new_url);
+ heap_free(url);
+ if(hres != S_OK || !new_url)
+ return FALSE;
+
+ if(strcmpW(url, new_url)) {
+ FIXME("TranslateUrl returned new URL %s -> %s\n", debugstr_w(url), debugstr_w(new_url));
+ ret = TRUE;
+ }
+
+ CoTaskMemFree(new_url);
+ return ret;
+}
+
+nsresult on_start_uri_open(NSContainer *nscontainer, nsIURI *uri, PRBool *_retval)
+{
+ nsWineURI *wine_uri;
+ nsresult nsres;
+
+ *_retval = FALSE;
+
+ nsres = nsIURI_QueryInterface(uri, &IID_nsIWineURI, (void**)&wine_uri);
+ if(NS_FAILED(nsres)) {
+ WARN("Could not get nsWineURI: %08x\n", nsres);
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ if(!wine_uri->is_doc_uri) {
+ if(!wine_uri->container) {
+ nsIWebBrowserChrome_AddRef(NSWBCHROME(nscontainer));
+ wine_uri->container = nscontainer;
+ }
+
+ wine_uri->is_doc_uri = TRUE;
+ *_retval = translate_url(nscontainer->doc->basedoc.doc_obj, wine_uri);
+ }
+
+ nsIURI_Release(NSURI(wine_uri));
+ return NS_OK;
+}
HRESULT set_wine_url(nsWineURI *This, LPCWSTR url)
{
nsIWineURI_SetWineURL(NSWINEURI(This), url);