ChangeSet ID: 21514 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/11/28 14:12:49
Modified files: dlls/shdocvw : dochost.c shdocvw.h webbrowser.c
Log message: Jacek Caban jacek@codeweavers.com Activate document object.
Patch: http://cvs.winehq.org/patch.py?id=21514
Old revision New revision Changes Path 1.4 1.5 +77 -0 wine/dlls/shdocvw/dochost.c 1.35 1.36 +4 -0 wine/dlls/shdocvw/shdocvw.h 1.29 1.30 +6 -0 wine/dlls/shdocvw/webbrowser.c
Index: wine/dlls/shdocvw/dochost.c diff -u -p wine/dlls/shdocvw/dochost.c:1.4 wine/dlls/shdocvw/dochost.c:1.5 --- wine/dlls/shdocvw/dochost.c:1.4 28 Nov 2005 20:12:49 -0000 +++ wine/dlls/shdocvw/dochost.c 28 Nov 2005 20:12:49 -0000 @@ -18,11 +18,83 @@
#include "wine/debug.h" #include "shdocvw.h" +#include "hlink.h" +#include "exdispid.h"
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
static ATOM doc_view_atom = 0;
+static void navigate_complete(WebBrowser *This) +{ + IDispatch *disp, *docdisp = NULL; + DISPPARAMS dispparams; + VARIANTARG params[2]; + VARIANT url; + HRESULT hres; + + hres = IOleClientSite_QueryInterface(This->client, &IID_IDispatch, (void**)&disp); + if(FAILED(hres)) + return; + + hres = IUnknown_QueryInterface(This->document, &IID_IDispatch, (void**)&docdisp); + if(FAILED(hres)) + FIXME("Could not get IDispatch interface\n"); + + dispparams.cArgs = 2; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = params; + + V_VT(params) = (VT_BYREF|VT_VARIANT); + V_BYREF(params) = &url; + + V_VT(params+1) = VT_DISPATCH; + V_DISPATCH(params+1) = docdisp; + + V_VT(&url) = VT_BSTR; + V_BSTR(&url) = This->url; + + IDispatch_Invoke(disp, DISPID_NAVIGATECOMPLETE2, &IID_NULL, LOCALE_SYSTEM_DEFAULT, + DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); + IDispatch_Invoke(disp, DISPID_DOCUMENTCOMPLETE, &IID_NULL, LOCALE_SYSTEM_DEFAULT, + DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); + + IDispatch_Release(disp); + if(docdisp) + IDispatch_Release(docdisp); +} + +static LRESULT navigate2(WebBrowser *This) +{ + IHlinkTarget *hlink; + HRESULT hres; + + TRACE("(%p)\n", This); + + if(!This->document) { + WARN("document == NULL\n"); + return 0; + } + + hres = IUnknown_QueryInterface(This->document, &IID_IHlinkTarget, (void**)&hlink); + if(FAILED(hres)) { + FIXME("Could not get IHlinkTarget interface\n"); + return 0; + } + + hres = IHlinkTarget_Navigate(hlink, 0, NULL); + IHlinkTarget_Release(hlink); + if(FAILED(hres)) { + FIXME("Navigate failed\n"); + return 0; + } + + navigate_complete(This); + + return 0; +} + static LRESULT WINAPI doc_view_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { WebBrowser *This; @@ -37,6 +109,11 @@ static LRESULT WINAPI doc_view_proc(HWND This = GetPropW(hwnd, wszTHIS); }
+ switch(msg) { + case WB_WM_NAVIGATE2: + return navigate2(This); + } + return DefWindowProcA(hwnd, msg, wParam, lParam); }
Index: wine/dlls/shdocvw/shdocvw.h diff -u -p wine/dlls/shdocvw/shdocvw.h:1.35 wine/dlls/shdocvw/shdocvw.h:1.36 --- wine/dlls/shdocvw/shdocvw.h:1.35 28 Nov 2005 20:12:50 -0000 +++ wine/dlls/shdocvw/shdocvw.h 28 Nov 2005 20:12:50 -0000 @@ -91,6 +91,8 @@ typedef struct { IOleContainer *container; IOleDocumentView *view;
+ LPOLESTR url; + /* window context */
HWND iphwnd; @@ -152,6 +154,8 @@ HRESULT WebBrowser_Create(IUnknown*,REFI
void create_doc_view_hwnd(WebBrowser *This);
+#define WB_WM_NAVIGATE2 (WM_USER+100) + #define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl)))
/********************************************************************** Index: wine/dlls/shdocvw/webbrowser.c diff -u -p wine/dlls/shdocvw/webbrowser.c:1.29 wine/dlls/shdocvw/webbrowser.c:1.30 --- wine/dlls/shdocvw/webbrowser.c:1.29 28 Nov 2005 20:12:50 -0000 +++ wine/dlls/shdocvw/webbrowser.c 28 Nov 2005 20:12:50 -0000 @@ -128,6 +128,7 @@ static ULONG WINAPI WebBrowser_Release(I WebBrowser_Events_Destroy(This); WebBrowser_ClientSite_Destroy(This);
+ SysFreeString(This->url); HeapFree(GetProcessHeap(), 0, This); SHDOCVW_UnlockModule(); } @@ -551,6 +552,8 @@ static HRESULT WINAPI WebBrowser_Navigat return hres; }
+ This->url = SysAllocString(V_BSTR(URL)); + hres = IUnknown_QueryInterface(This->document, &IID_IOleObject, (void**)&oleobj); if(FAILED(hres)) return hres; @@ -558,6 +561,8 @@ static HRESULT WINAPI WebBrowser_Navigat hres = IOleObject_SetClientSite(oleobj, CLIENTSITE(This)); IOleObject_Release(oleobj);
+ PostMessageW(This->doc_view_hwnd, WB_WM_NAVIGATE2, 0, 0); + return hres; }
@@ -783,6 +788,7 @@ HRESULT WebBrowser_Create(IUnknown *pOut ret->ref = 0;
ret->document = NULL; + ret->url = NULL;
WebBrowser_OleObject_Init(ret); WebBrowser_ViewObject_Init(ret);