wine/dlls/shdocvw dochost.c shdocvw.h webbrowser.c

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 28 14:12:50 CST 2005


ChangeSet ID:	21514
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/11/28 14:12:49

Modified files:
	dlls/shdocvw   : dochost.c shdocvw.h webbrowser.c 

Log message:
	Jacek Caban <jacek at 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);



More information about the wine-cvs mailing list