Jacek Caban : mshtml: Properly handle navigation in containers supporting IWebBrowserApp.
Alexandre Julliard
julliard at winehq.org
Tue Nov 15 13:17:32 CST 2011
Module: wine
Branch: master
Commit: f86abedb40417c358f6ba85f51f6d6544c90bd73
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f86abedb40417c358f6ba85f51f6d6544c90bd73
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Nov 15 13:29:59 2011 +0100
mshtml: Properly handle navigation in containers supporting IWebBrowserApp.
---
dlls/ieframe/dochost.c | 7 ++++---
dlls/ieframe/shellbrowser.c | 38 ++++++++++++++++++++++++++++++++++++--
dlls/mshtml/mshtml_private.h | 1 +
dlls/mshtml/mutation.c | 3 +++
dlls/mshtml/navigate.c | 20 ++++++++++++++++++++
dlls/mshtml/oleobj.c | 16 +++++++++++++++-
6 files changed, 79 insertions(+), 6 deletions(-)
diff --git a/dlls/ieframe/dochost.c b/dlls/ieframe/dochost.c
index 5f60056..9c07cc8 100644
--- a/dlls/ieframe/dochost.c
+++ b/dlls/ieframe/dochost.c
@@ -192,12 +192,13 @@ void set_doc_state(DocHost *This, READYSTATE doc_state)
static void update_ready_state(DocHost *This, READYSTATE ready_state)
{
- if(ready_state > READYSTATE_LOADING && This->doc_state <= READYSTATE_LOADING)
+ if(ready_state > READYSTATE_LOADING && This->doc_state <= READYSTATE_LOADING && !This->browser_service /* FIXME */)
notif_complete(This, DISPID_NAVIGATECOMPLETE2);
if(ready_state == READYSTATE_COMPLETE && This->doc_state < READYSTATE_COMPLETE) {
set_doc_state(This, READYSTATE_COMPLETE);
- notif_complete(This, DISPID_DOCUMENTCOMPLETE);
+ if(!This->browser_service) /* FIXME: Not fully correct */
+ notif_complete(This, DISPID_DOCUMENTCOMPLETE);
}else {
set_doc_state(This, ready_state);
}
@@ -844,7 +845,7 @@ static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, D
if(ready_state == READYSTATE_COMPLETE && !This->doc_navigate)
advise_prop_notif(This, FALSE);
- push_ready_state_task(This, ready_state);
+ update_ready_state(This, ready_state);
break;
}
default:
diff --git a/dlls/ieframe/shellbrowser.c b/dlls/ieframe/shellbrowser.c
index 65e1cea..00ba786 100644
--- a/dlls/ieframe/shellbrowser.c
+++ b/dlls/ieframe/shellbrowser.c
@@ -787,8 +787,42 @@ static HRESULT WINAPI DocObjectService_FireDocumentComplete(
DWORD dwFlags)
{
ShellBrowser *This = impl_from_IDocObjectService(iface);
- FIXME("%p %p %x\n", This, pHTMLWindow, dwFlags);
- return E_NOTIMPL;
+ IHTMLPrivateWindow *priv_window;
+ VARIANTARG params[2];
+ DISPPARAMS dp = {params, NULL, 2, 0};
+ VARIANT url_var;
+ BSTR url;
+ HRESULT hres;
+
+ TRACE("%p %p %x\n", This, pHTMLWindow, dwFlags);
+
+ hres = IHTMLWindow2_QueryInterface(pHTMLWindow, &IID_IHTMLPrivateWindow, (void**)&priv_window);
+ if(FAILED(hres))
+ return hres;
+
+ hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &url);
+ IHTMLPrivateWindow_Release(priv_window);
+ if(FAILED(hres))
+ return hres;
+
+ TRACE("got URL %s\n", debugstr_w(url));
+
+ V_VT(params) = (VT_BYREF|VT_VARIANT);
+ V_BYREF(params) = &url;
+
+ V_VT(params+1) = VT_DISPATCH;
+ V_DISPATCH(params+1) = This->doc_host->disp;
+
+ V_VT(&url_var) = VT_BSTR;
+ V_BSTR(&url_var) = url;
+
+ TRACE(">>>\n");
+ call_sink(This->doc_host->cps.wbe2, DISPID_DOCUMENTCOMPLETE, &dp);
+ TRACE("<<<\n");
+
+ SysFreeString(url);
+ This->doc_host->busy = VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI DocObjectService_UpdateDesktopComponent(
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 90ba6ad..0915977 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -463,6 +463,7 @@ struct HTMLDocumentObj {
BOOL ui_active;
BOOL window_active;
BOOL hostui_setup;
+ BOOL is_webbrowser;
BOOL container_locked;
BOOL focus;
INT download_state;
diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c
index 0220849..ba98d41 100644
--- a/dlls/mshtml/mutation.c
+++ b/dlls/mshtml/mutation.c
@@ -265,6 +265,9 @@ static void parse_complete(HTMLDocumentObj *doc)
call_property_onchanged(&doc->basedoc.cp_propnotif, 1005);
call_explorer_69(doc);
+ if(doc->is_webbrowser && doc->usermode != EDITMODE)
+ IDocObjectService_FireNavigateComplete2(doc->doc_object_service, &doc->basedoc.window->IHTMLWindow2_iface, 0);
+
/* FIXME: IE7 calls EnableModelless(TRUE), EnableModelless(FALSE) and sets interactive state here */
}
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 8f1b334..ea1c650 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -1944,6 +1944,26 @@ HRESULT navigate_url(HTMLWindow *window, const WCHAR *new_url, const WCHAR *base
}
}
+ if(window->doc_obj->is_webbrowser && window->doc_obj && window == window->doc_obj->basedoc.window) {
+ BOOL cancel = FALSE;
+ IUri *uri;
+
+ hres = IDocObjectService_FireBeforeNavigate2(window->doc_obj->doc_object_service, NULL, url, 0x40,
+ NULL, NULL, 0, NULL, TRUE, &cancel);
+ if(SUCCEEDED(hres) && cancel) {
+ TRACE("Navigation canceled\n");
+ return S_OK;
+ }
+
+ hres = CreateUri(url, 0, 0, &uri);
+ if(FAILED(hres))
+ return hres;
+
+ hres = super_navigate(window, uri, NULL, NULL, 0);
+ IUri_Release(uri);
+ return hres;
+ }
+
if(window->doc_obj && window == window->doc_obj->basedoc.window) {
BOOL cancel;
diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c
index fa2694e..e5c0235 100644
--- a/dlls/mshtml/oleobj.c
+++ b/dlls/mshtml/oleobj.c
@@ -125,6 +125,7 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
}
memset(&This->doc_obj->hostinfo, 0, sizeof(DOCHOSTUIINFO));
+ This->doc_obj->is_webbrowser = FALSE;
if(!pClientSite)
return S_OK;
@@ -212,14 +213,27 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
if(SUCCEEDED(hres)) {
IDocObjectService *doc_object_service;
IBrowserService *browser_service;
+ IWebBrowser2 *wb;
hres = IServiceProvider_QueryService(sp, &IID_IShellBrowser,
&IID_IBrowserService, (void**)&browser_service);
if(SUCCEEDED(hres)) {
hres = IBrowserService_QueryInterface(browser_service,
&IID_IDocObjectService, (void**)&doc_object_service);
- if(SUCCEEDED(hres))
+ if(SUCCEEDED(hres)) {
This->doc_obj->doc_object_service = doc_object_service;
+
+ /*
+ * Some embedding routines, esp. in regards to use of IDocObjectService, differ if
+ * embedder supports IWebBrowserApp.
+ */
+ hres = IServiceProvider_QueryService(sp, &IID_IWebBrowserApp, &IID_IWebBrowser2, (void**)&wb);
+ if(SUCCEEDED(hres)) {
+ This->doc_obj->is_webbrowser = TRUE;
+ IWebBrowser2_Release(wb);
+ }
+ }
+
IBrowserService_Release(browser_service);
}
More information about the wine-cvs
mailing list