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