Jacek Caban : mshtml: Added IHTMLWindow::open implementation.
Alexandre Julliard
julliard at winehq.org
Mon Jan 9 14:24:31 CST 2012
Module: wine
Branch: master
Commit: d870b8c3e37f91e885dabc99eca4b0e05539e486
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d870b8c3e37f91e885dabc99eca4b0e05539e486
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Jan 9 17:56:54 2012 +0100
mshtml: Added IHTMLWindow::open implementation.
---
dlls/mshtml/binding.h | 1 +
dlls/mshtml/htmlwindow.c | 43 ++++++++++++++++++++++++++++++-
dlls/mshtml/mshtml_private.h | 1 +
dlls/mshtml/navigate.c | 57 ++++++++++++++++++++++++++++++++++++++++++
dlls/mshtml/tests/htmldoc.c | 4 ---
5 files changed, 100 insertions(+), 6 deletions(-)
diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h
index 0d7a3a7..dfb14cf 100644
--- a/dlls/mshtml/binding.h
+++ b/dlls/mshtml/binding.h
@@ -108,6 +108,7 @@ HRESULT load_nsuri(HTMLWindow*,nsWineURI*,nsChannelBSC*,DWORD) DECLSPEC_HIDDEN;
HRESULT set_moniker(HTMLDocument*,IMoniker*,IBindCtx*,nsChannelBSC*,BOOL) DECLSPEC_HIDDEN;
void prepare_for_binding(HTMLDocument*,IMoniker*,BOOL) DECLSPEC_HIDDEN;
HRESULT super_navigate(HTMLWindow*,IUri*,const WCHAR*,BYTE*,DWORD) DECLSPEC_HIDDEN;
+HRESULT navigate_new_window(HTMLWindow*,IUri*,const WCHAR*,IHTMLWindow2**) DECLSPEC_HIDDEN;
HRESULT create_channelbsc(IMoniker*,const WCHAR*,BYTE*,DWORD,nsChannelBSC**) DECLSPEC_HIDDEN;
HRESULT channelbsc_load_stream(nsChannelBSC*,IStream*) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index f907776..654f2e0 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -26,6 +26,7 @@
#include "ole2.h"
#include "mshtmdid.h"
#include "shlguid.h"
+#include "shobjidl.h"
#define NO_SHLWAPI_REG
#include "shlwapi.h"
@@ -776,9 +777,47 @@ static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
BSTR features, VARIANT_BOOL replace, IHTMLWindow2 **pomWindowResult)
{
HTMLWindow *This = impl_from_IHTMLWindow2(iface);
- FIXME("(%p)->(%s %s %s %x %p)\n", This, debugstr_w(url), debugstr_w(name),
+ INewWindowManager *new_window_mgr;
+ IUri *uri;
+ HRESULT hres;
+
+ TRACE("(%p)->(%s %s %s %x %p)\n", This, debugstr_w(url), debugstr_w(name),
debugstr_w(features), replace, pomWindowResult);
- return E_NOTIMPL;
+
+ if(!This->doc_obj)
+ return E_UNEXPECTED;
+
+ if(name && *name == '_') {
+ FIXME("Unsupported name %s\n", debugstr_w(name));
+ return E_NOTIMPL;
+ }
+
+ hres = do_query_service((IUnknown*)This->doc_obj->client, &SID_SNewWindowManager, &IID_INewWindowManager,
+ (void**)&new_window_mgr);
+ if(FAILED(hres)) {
+ FIXME("No INewWindowManager\n");
+ return E_NOTIMPL;
+ }
+
+ hres = INewWindowManager_EvaluateNewWindow(new_window_mgr, url, name, This->url,
+ features, !!replace, This->doc_obj->has_popup ? 0 : NWMF_FIRST, 0);
+ INewWindowManager_Release(new_window_mgr);
+ This->doc_obj->has_popup = TRUE;
+ if(FAILED(hres)) {
+ *pomWindowResult = NULL;
+ return S_OK;
+ }
+
+ if(This->uri)
+ hres = CoInternetCombineUrlEx(This->uri, url, URL_ESCAPE_SPACES_ONLY|URL_DONT_ESCAPE_EXTRA_INFO, &uri, 0);
+ else
+ hres = CreateUri(url, 0, 0, &uri);
+ if(FAILED(hres))
+ return hres;
+
+ hres = navigate_new_window(This, uri, name, pomWindowResult);
+ IUri_Release(uri);
+ return hres;
}
static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 0c6d73f..5480435 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -466,6 +466,7 @@ struct HTMLDocumentObj {
BOOL is_webbrowser;
BOOL container_locked;
BOOL focus;
+ BOOL has_popup;
INT download_state;
USERMODE usermode;
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index bfee591..f5375e4 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -33,6 +33,8 @@
#include "shlguid.h"
#include "wininet.h"
#include "shlwapi.h"
+#include "htiface.h"
+#include "shdeprecated.h"
#include "wine/debug.h"
@@ -44,6 +46,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define CONTENT_LENGTH "Content-Length"
#define UTF16_STR "utf-16"
+static const WCHAR emptyW[] = {0};
+
struct nsProtocolStream {
nsIInputStream nsIInputStream_iface;
@@ -1977,6 +1981,59 @@ HRESULT super_navigate(HTMLWindow *window, IUri *uri, const WCHAR *headers, BYTE
return S_OK;
}
+HRESULT navigate_new_window(HTMLWindow *window, IUri *uri, const WCHAR *name, IHTMLWindow2 **ret)
+{
+ IWebBrowser2 *web_browser;
+ IHTMLWindow2 *new_window;
+ IBindCtx *bind_ctx;
+ nsChannelBSC *bsc;
+ HRESULT hres;
+
+ hres = create_channelbsc(NULL, NULL, NULL, 0, &bsc);
+ if(FAILED(hres))
+ return hres;
+
+ hres = CreateAsyncBindCtx(0, &bsc->bsc.IBindStatusCallback_iface, NULL, &bind_ctx);
+ if(FAILED(hres)) {
+ IBindStatusCallback_Release(&bsc->bsc.IBindStatusCallback_iface);
+ return hres;
+ }
+
+ hres = CoCreateInstance(&CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
+ &IID_IWebBrowser2, (void**)&web_browser);
+ if(SUCCEEDED(hres)) {
+ ITargetFramePriv2 *target_frame_priv;
+
+ hres = IWebBrowser_QueryInterface(web_browser, &IID_ITargetFramePriv2, (void**)&target_frame_priv);
+ if(SUCCEEDED(hres)) {
+ hres = ITargetFramePriv2_AggregatedNavigation2(target_frame_priv,
+ HLNF_DISABLEWINDOWRESTRICTIONS|HLNF_OPENINNEWWINDOW, bind_ctx, &bsc->bsc.IBindStatusCallback_iface,
+ name, uri, emptyW);
+ ITargetFramePriv2_Release(target_frame_priv);
+
+ if(SUCCEEDED(hres))
+ hres = do_query_service((IUnknown*)web_browser, &SID_SHTMLWindow, &IID_IHTMLWindow2, (void**)&new_window);
+ }
+ if(FAILED(hres)) {
+ IWebBrowser2_Quit(web_browser);
+ IWebBrowser2_Release(web_browser);
+ }
+ }else {
+ WARN("Could not create InternetExplorer instance: %08x\n", hres);
+ }
+
+ IBindStatusCallback_Release(&bsc->bsc.IBindStatusCallback_iface);
+ IBindCtx_Release(bind_ctx);
+ if(FAILED(hres))
+ return hres;
+
+ IWebBrowser2_put_Visible(web_browser, VARIANT_TRUE);
+ IWebBrowser2_Release(web_browser);
+
+ *ret = new_window;
+ return S_OK;
+}
+
HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url, nsChannel *nschannel, DWORD hlnf, BOOL *cancel)
{
IHlinkFrame *hlink_frame;
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index d72eb1b..174b448 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -5194,19 +5194,15 @@ static void test_open_window(IHTMLDocument2 *doc)
CHECK_CALLED(TranslateUrl);
if(!called_EvaluateNewWindow) {
- todo_wine
win_skip("INewWindowManager not supported\n");
if(SUCCEEDED(hres) && new_window)
IHTMLWindow2_Release(new_window);
IHTMLWindow2_Release(window);
return;
}
- todo_wine
CHECK_CALLED(EvaluateNewWindow);
- todo_wine
ok(hres == S_OK, "open failed: %08x\n", hres);
- todo_wine
ok(new_window == NULL, "new_window != NULL\n");
IHTMLWindow2_Release(window);
More information about the wine-cvs
mailing list