Jacek Caban : mshtml: Pass external connection to WebBrowser host, if possible.
Alexandre Julliard
julliard at winehq.org
Thu Sep 19 17:21:07 CDT 2013
Module: wine
Branch: master
Commit: d36ffab315de831dd3e430ee9320584d4db171a7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d36ffab315de831dd3e430ee9320584d4db171a7
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Sep 19 16:13:06 2013 +0200
mshtml: Pass external connection to WebBrowser host, if possible.
---
dlls/mshtml/mshtml_private.h | 1 +
dlls/mshtml/navigate.c | 85 ++++++++++++++++++++++++++++++++++++++++++
dlls/mshtml/oleobj.c | 2 +-
3 files changed, 87 insertions(+), 1 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index f3c3b28..df7b600 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -965,6 +965,7 @@ void do_ns_command(HTMLDocument*,const char*,nsICommandParams*) DECLSPEC_HIDDEN;
void update_doc(HTMLDocument*,DWORD) DECLSPEC_HIDDEN;
void update_title(HTMLDocumentObj*) DECLSPEC_HIDDEN;
+void set_document_navigation(HTMLDocumentObj*,BOOL) DECLSPEC_HIDDEN;
HRESULT do_query_service(IUnknown*,REFGUID,REFIID,void**) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 444abbc..2c0666e 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -1625,6 +1625,89 @@ static BOOL is_supported_doc_mime(const WCHAR *mime)
return ret;
}
+static IUri *get_moniker_uri(IMoniker *mon)
+{
+ IUriContainer *uri_container;
+ IUri *ret = NULL;
+ HRESULT hres;
+
+ hres = IMoniker_QueryInterface(mon, &IID_IUriContainer, (void**)&uri_container);
+ if(SUCCEEDED(hres)) {
+ hres = IUriContainer_GetIUri(uri_container, &ret);
+ IUriContainer_Release(uri_container);
+ if(FAILED(hres))
+ return NULL;
+ }else {
+ FIXME("No IUriContainer\n");
+ }
+
+ return ret;
+}
+
+static void handle_extern_mime_navigation(nsChannelBSC *This)
+{
+ IWebBrowserPriv2IE8 *webbrowser_priv;
+ IOleCommandTarget *cmdtrg;
+ HTMLDocumentObj *doc_obj;
+ IBindCtx *bind_ctx;
+ IUri *uri;
+ VARIANT flags;
+ HRESULT hres;
+
+ if(!This->bsc.window || !This->bsc.window->base.outer_window || !This->bsc.window->base.outer_window->doc_obj)
+ return;
+
+ doc_obj = This->bsc.window->base.outer_window->doc_obj;
+
+ hres = IOleClientSite_QueryInterface(doc_obj->client, &IID_IOleCommandTarget, (void**)&cmdtrg);
+ if(SUCCEEDED(hres)) {
+ IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 62, 0, NULL, NULL);
+ IOleCommandTarget_Release(cmdtrg);
+ }
+
+ set_document_navigation(doc_obj, FALSE);
+
+ if(!doc_obj->webbrowser) {
+ FIXME("unimplemented in non-webbrowser mode\n");
+ return;
+ }
+
+ uri = get_moniker_uri(This->bsc.mon);
+ if(!uri)
+ return;
+
+ hres = CreateBindCtx(0, &bind_ctx);
+ if(FAILED(hres)) {
+ IUri_Release(uri);
+ return;
+ }
+
+ V_VT(&flags) = VT_I4;
+ V_I4(&flags) = navHyperlink;
+
+ hres = IUnknown_QueryInterface(doc_obj->webbrowser, &IID_IWebBrowserPriv2IE8, (void**)&webbrowser_priv);
+ if(SUCCEEDED(hres)) {
+ hres = IWebBrowserPriv2IE8_NavigateWithBindCtx2(webbrowser_priv, uri, &flags, NULL, NULL, NULL, bind_ctx, NULL);
+ IWebBrowserPriv2IE8_Release(webbrowser_priv);
+ }else {
+ IWebBrowserPriv *webbrowser_priv_old;
+ VARIANT uriv;
+
+ hres = IUnknown_QueryInterface(doc_obj->webbrowser, &IID_IWebBrowserPriv, (void**)&webbrowser_priv_old);
+ if(SUCCEEDED(hres)) {
+ V_VT(&uriv) = VT_BSTR;
+ IUri_GetDisplayUri(uri, &V_BSTR(&uriv));
+
+ hres = IWebBrowserPriv_NavigateWithBindCtx(webbrowser_priv_old, &uriv, &flags, NULL, NULL, NULL, bind_ctx, NULL);
+
+ SysFreeString(V_BSTR(&uriv));
+ IWebBrowserPriv_Release(webbrowser_priv_old);
+ }
+ }
+
+ IUri_Release(uri);
+}
+
static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCWSTR status_text)
{
nsChannelBSC *This = nsChannelBSC_from_BSCallback(bsc);
@@ -1634,6 +1717,8 @@ static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCW
if(This->is_doc_channel && !is_supported_doc_mime(status_text)) {
FIXME("External MIME: %s\n", debugstr_w(status_text));
+ handle_extern_mime_navigation(This);
+
This->nschannel = NULL;
}
diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c
index fded548..1a123ac 100644
--- a/dlls/mshtml/oleobj.c
+++ b/dlls/mshtml/oleobj.c
@@ -210,7 +210,7 @@ void call_docview_84(HTMLDocumentObj *doc)
FIXME("handle result\n");
}
-static void set_document_navigation(HTMLDocumentObj *doc, BOOL doc_can_navigate)
+void set_document_navigation(HTMLDocumentObj *doc, BOOL doc_can_navigate)
{
VARIANT var;
More information about the wine-cvs
mailing list