diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 5fed4af2c2f..2cb22da12c1 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -666,6 +666,7 @@ void release_nsio(void);
BOOL install_wine_gecko(BOOL);
HRESULT nsuri_to_url(LPCWSTR,BOOL,BSTR*);
+HRESULT create_doc_uri(HTMLWindow*,WCHAR*,nsIWineURI**);
HRESULT hlink_frame_navigate(HTMLDocument*,LPCWSTR,nsIInputStream*,DWORD);
HRESULT navigate_url(HTMLWindow*,const WCHAR*,const WCHAR*);
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 66be2fc2d36..a68987dde85 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -1236,6 +1236,10 @@ HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url,
HRESULT navigate_url(HTMLWindow *window, const WCHAR *new_url, const WCHAR *base_url)
{
WCHAR url[INTERNET_MAX_URL_LENGTH];
+ nsIWebNavigation *web_navigation;
+ nsIDocShell *doc_shell;
+ nsIWineURI *uri;
+ nsresult nsres;
HRESULT hres;
if(!new_url) {
@@ -1262,9 +1266,38 @@ HRESULT navigate_url(HTMLWindow *window, const WCHAR *new_url, const WCHAR *base
}
}
- hres = hlink_frame_navigate(&window->doc->basedoc, url, NULL, 0);
- if(FAILED(hres))
- FIXME("hlink_frame_navigate failed: %08x\n", hres);
+ if(window->doc_obj && window == window->doc_obj->basedoc.window) {
+ hres = hlink_frame_navigate(&window->doc->basedoc, url, NULL, 0);
+ if(SUCCEEDED(hres))
+ return S_OK;
+ TRACE("hlink_frame_navigate failed: %08x\n", hres);
+ }
- return hres;
+ nsres = get_nsinterface((nsISupports*)window->nswindow, &IID_nsIWebNavigation, (void**)&web_navigation);
+ if(NS_FAILED(nsres)) {
+ ERR("Could not get nsIWebNavigation interface: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIWebNavigation_QueryInterface(web_navigation, &IID_nsIDocShell, (void**)&doc_shell);
+ nsIWebNavigation_Release(web_navigation);
+ if(NS_FAILED(nsres)) {
+ ERR("Could not get nsIDocShell: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ hres = create_doc_uri(window, url, &uri);
+ if(FAILED(hres)) {
+ nsIDocShell_Release(doc_shell);
+ return hres;
+ }
+
+ nsres = nsIDocShell_LoadURI(doc_shell, (nsIURI*)uri, NULL, 0, FALSE);
+ nsIDocShell_Release(doc_shell);
+ if(NS_FAILED(nsres)) {
+ WARN("LoadURI failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl
index 9d0bb309dbd..3612613652c 100644
--- a/dlls/mshtml/nsiface.idl
+++ b/dlls/mshtml/nsiface.idl
@@ -142,6 +142,14 @@ typedef nsISupports nsIStyleSheet;
typedef nsISupports nsIStyleRule;
typedef nsISupports nsIVariant;
typedef nsISupports nsIDOMUserDataHandler;
+typedef nsISupports nsIDocShellLoadInfo;
+typedef nsISupports nsISHEntry;
+typedef nsISupports nsIPresShell;
+typedef nsISupports nsIContentViewer;
+typedef nsISupports nsIDocumentCharsetInfo;
+typedef nsISupports nsILayoutHistoryState;
+typedef nsISupports nsISecureBrowserUI;
+typedef nsISupports nsIDOMStorage;
[
object,
@@ -2650,6 +2658,88 @@ interface nsIHTMLEditor : nsISupports
nsresult SetReturnInParagraphCreatesNewParagraph([in] PRBool prb);
}
+[
+ object,
+ uuid(8adfb831-1053-4a19-884d-bcdad7277b4b),
+ local
+ /* NOT_FROZEN */
+]
+interface nsIDocShell : nsISupports
+{
+ nsresult LoadURI(nsIURI *uri, nsIDocShellLoadInfo *loadInfo, PRUint32 aLoadFlags, PRBool firstParty);
+ nsresult LoadStream(nsIInputStream *aStream, nsIURI *aURI, const nsACString *aContentType,
+ const nsACString *aContentCharset, nsIDocShellLoadInfo *aLoadInfo);
+ nsresult InternalLoad(nsIURI *aURI, nsIURI *aReferrer, nsISupports *aOwner, PRUint32 aFlags, const PRUnichar *aWindowTarget,
+ const char *aTypeHint, nsIInputStream *aPostDataStream, nsIInputStream *aHeadersStream, PRUint32 aLoadFlags,
+ nsISHEntry *aSHEntry, PRBool firstParty, nsIDocShell **aDocShell, nsIRequest **aRequest);
+ nsresult CreateLoadInfo(nsIDocShellLoadInfo **loadInfo);
+ nsresult PrepareForNewContentModel();
+ nsresult SetCurrentURI(nsIURI *aURI);
+ nsresult FirePageHideNotification(PRBool isUnload);
+ nsresult GetPresContext(void /*nsPresContext*/ **aPresContext);
+ nsresult GetPresShell(nsIPresShell **aPresShell);
+ nsresult GetEldestPresShell(nsIPresShell **aEldestPresShell);
+ nsresult GetContentViewer(nsIContentViewer **aContentViewer);
+ nsresult GetChromeEventHandler(nsIDOMEventTarget **aChromeEventHandler);
+ nsresult SetChromeEventHandler(nsIDOMEventTarget *aChromeEventHandler);
+ nsresult GetDocumentCharsetInfo(nsIDocumentCharsetInfo **aDocumentCharsetInfo);
+ nsresult SetDocumentCharsetInfo(nsIDocumentCharsetInfo *aDocumentCharsetInfo);
+ nsresult GetAllowPlugins(PRBool *aAllowPlugins);
+ nsresult SetAllowPlugins(PRBool aAllowPlugins);
+ nsresult GetAllowJavascript(PRBool *aAllowJavascript);
+ nsresult SetAllowJavascript(PRBool aAllowJavascript);
+ nsresult GetAllowMetaRedirects(PRBool *aAllowMetaRedirects);
+ nsresult SetAllowMetaRedirects(PRBool aAllowMetaRedirects);
+ nsresult GetAllowSubframes(PRBool *aAllowSubframes);
+ nsresult SetAllowSubframes(PRBool aAllowSubframes);
+ nsresult GetAllowImages(PRBool *aAllowImages);
+ nsresult SetAllowImages(PRBool aAllowImages);
+ nsresult GetAllowDNSPrefetch(PRBool *aAllowDNSPrefetch);
+ nsresult SetAllowDNSPrefetch(PRBool aAllowDNSPrefetch);
+ nsresult GetDocShellEnumerator(PRInt32 aItemType, PRInt32 aDirection, nsISimpleEnumerator **_retval);
+ nsresult GetAppType(PRUint32 *aAppType);
+ nsresult SetAppType(PRUint32 aAppType);
+ nsresult GetAllowAuth(PRBool *aAllowAuth);
+ nsresult SetAllowAuth(PRBool aAllowAuth);
+ nsresult GetZoom(float *aZoom);
+ nsresult SetZoom(float aZoom);
+ nsresult GetMarginWidth(PRInt32 *aMarginWidth);
+ nsresult SetMarginWidth(PRInt32 aMarginWidth);
+ nsresult GetMarginHeight(PRInt32 *aMarginHeight);
+ nsresult SetMarginHeight(PRInt32 aMarginHeight);
+ nsresult TabToTreeOwner(PRBool forward, PRBool *tookFocus);
+ nsresult GetBusyFlags(PRUint32 *aBusyFlags);
+ nsresult GetLoadType(PRUint32 *aLoadType);
+ nsresult SetLoadType(PRUint32 aLoadType);
+ nsresult IsBeingDestroyed(PRBool *_retval);
+ nsresult GetIsExecutingOnLoadHandler(PRBool *aIsExecutingOnLoadHandler);
+ nsresult GetLayoutHistoryState(nsILayoutHistoryState **aLayoutHistoryState);
+ nsresult SetLayoutHistoryState(nsILayoutHistoryState *aLayoutHistoryState);
+ nsresult GetShouldSaveLayoutState(PRBool *aShouldSaveLayoutState);
+ nsresult GetSecurityUI(nsISecureBrowserUI **aSecurityUI);
+ nsresult SetSecurityUI(nsISecureBrowserUI *aSecurityUI);
+ nsresult SuspendRefreshURIs();
+ nsresult ResumeRefreshURIs();
+ nsresult BeginRestore(nsIContentViewer *viewer, PRBool top);
+ nsresult FinishRestore();
+ nsresult GetRestoringDocument(PRBool *aRestoringDocument);
+ nsresult GetUseErrorPages(PRBool *aUseErrorPages);
+ nsresult SetUseErrorPages(PRBool aUseErrorPages);
+ nsresult GetPreviousTransIndex(PRInt32 *aPreviousTransIndex);
+ nsresult GetLoadedTransIndex(PRInt32 *aLoadedTransIndex);
+ nsresult HistoryPurged(PRInt32 numEntries);
+ nsresult GetSessionStorageForURI(nsIURI *uri, nsIDOMStorage **_retval);
+ nsresult GetSessionStorageForPrincipal(nsIPrincipal *principal, PRBool create, nsIDOMStorage **_retval);
+ nsresult AddSessionStorage(nsIPrincipal *principal, nsIDOMStorage *storage);
+ nsresult GetCurrentDocumentChannel(nsIChannel * *aCurrentDocumentChannel);
+ nsresult SetChildOffset(PRUint32 offset);
+ nsresult GetIsInUnload(PRBool *aIsInUnload);
+ nsresult GetChannelIsUnsafe(PRBool *aChannelIsUnsafe);
+ void DetachEditorFromWindow();
+ nsresult GetIsOffScreenBrowser(PRBool *aIsOffScreenBrowser);
+ nsresult SetIsOffScreenBrowser(PRBool aIsOffScreenBrowser);
+}
+
[
object,
uuid(365d600b-868a-452a-8de8-f46fad8fee53),
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 3772e61141d..ec214ca9e88 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -2365,6 +2365,22 @@ static nsresult create_uri(nsIURI *uri, HTMLWindow *window, NSContainer *contain
return NS_OK;
}
+HRESULT create_doc_uri(HTMLWindow *window, WCHAR *url, nsIWineURI **ret)
+{
+ nsIWineURI *uri;
+ nsresult nsres;
+
+ nsres = create_uri(NULL, window, window->doc_obj->nscontainer, &uri);
+ if(NS_FAILED(nsres))
+ return E_FAIL;
+
+ nsIWineURI_SetWineURL(uri, url);
+ nsIWineURI_SetIsDocumentURI(uri, TRUE);
+
+ *ret = uri;
+ return S_OK;
+}
+
typedef struct {
const nsIProtocolHandlerVtbl *lpProtocolHandlerVtbl;