wine/dlls/shdocvw dochost.c shdocvw.h webbrowser.c
ChangeSet ID: 21514 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard(a)winehq.org 2005/11/28 14:12:49 Modified files: dlls/shdocvw : dochost.c shdocvw.h webbrowser.c Log message: Jacek Caban <jacek(a)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);
participants (1)
-
Alexandre Julliard