Module: wine Branch: master Commit: 1a7bf2e0fff0ecde25be2d9fb06f911f709d834b URL: http://source.winehq.org/git/wine.git/?a=commit;h=1a7bf2e0fff0ecde25be2d9fb0...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Jan 18 21:53:25 2008 +0100
shdocvw: Use more flexible mechanism instead of WB_WM_NAVIGATE2.
---
dlls/shdocvw/dochost.c | 33 ++++++++++++++++++++++++++------- dlls/shdocvw/iexplore.c | 2 ++ dlls/shdocvw/navigate.c | 9 ++++++++- dlls/shdocvw/oleobject.c | 2 ++ dlls/shdocvw/shdocvw.h | 20 ++++++++++++++++---- 5 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/dlls/shdocvw/dochost.c b/dlls/shdocvw/dochost.c index f64ae09..c3a22f4 100644 --- a/dlls/shdocvw/dochost.c +++ b/dlls/shdocvw/dochost.c @@ -25,6 +25,27 @@ WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
static ATOM doc_view_atom = 0;
+void push_dochost_task(DocHost *This, task_header_t *task, task_proc_t proc, BOOL send) +{ + task->proc = proc; + + /* FIXME: Don't use lParam */ + if(send) + SendMessageW(This->frame_hwnd, WM_DOCHOSTTASK, 0, (LPARAM)task); + else + PostMessageW(This->frame_hwnd, WM_DOCHOSTTASK, 0, (LPARAM)task); +} + +LRESULT process_dochost_task(DocHost *This, LPARAM lparam) +{ + task_header_t *task = (task_header_t*)lparam; + + task->proc(This, task); + + heap_free(task); + return 0; +} + static void navigate_complete(DocHost *This) { IDispatch *disp = NULL; @@ -59,7 +80,7 @@ static void navigate_complete(DocHost *This) IDispatch_Release(disp); }
-static LRESULT navigate2(DocHost *This) +void object_available(DocHost *This) { IHlinkTarget *hlink; HRESULT hres; @@ -68,25 +89,25 @@ static LRESULT navigate2(DocHost *This)
if(!This->document) { WARN("document == NULL\n"); - return 0; + return; }
hres = IUnknown_QueryInterface(This->document, &IID_IHlinkTarget, (void**)&hlink); if(FAILED(hres)) { FIXME("Could not get IHlinkTarget interface\n"); - return 0; + return; }
hres = IHlinkTarget_Navigate(hlink, 0, NULL); IHlinkTarget_Release(hlink); if(FAILED(hres)) { FIXME("Navigate failed\n"); - return 0; + return; }
navigate_complete(This);
- return 0; + return; }
static LRESULT resize_document(DocHost *This, LONG width, LONG height) @@ -117,8 +138,6 @@ static LRESULT WINAPI doc_view_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM l switch(msg) { case WM_SIZE: return resize_document(This, LOWORD(lParam), HIWORD(lParam)); - case WB_WM_NAVIGATE2: - return navigate2(This); }
return DefWindowProcW(hwnd, msg, wParam, lParam); diff --git a/dlls/shdocvw/iexplore.c b/dlls/shdocvw/iexplore.c index e6387d5..ca2c868 100644 --- a/dlls/shdocvw/iexplore.c +++ b/dlls/shdocvw/iexplore.c @@ -77,6 +77,8 @@ ie_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) return iewnd_OnDestroy(This); case WM_SIZE: return iewnd_OnSize(This, LOWORD(lparam), HIWORD(lparam)); + case WM_DOCHOSTTASK: + return process_dochost_task(&This->doc_host, lparam); } return DefWindowProcW(hwnd, msg, wparam, lparam); } diff --git a/dlls/shdocvw/navigate.c b/dlls/shdocvw/navigate.c index 37245f7..4bf21a5 100644 --- a/dlls/shdocvw/navigate.c +++ b/dlls/shdocvw/navigate.c @@ -269,10 +269,16 @@ static HRESULT WINAPI BindStatusCallback_OnDataAvailable(IBindStatusCallback *if return E_NOTIMPL; }
+static void object_available_proc(DocHost *This, task_header_t *task) +{ + object_available(This); +} + static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallback *iface, REFIID riid, IUnknown *punk) { BindStatusCallback *This = BINDSC_THIS(iface); + task_header_t *task; IOleObject *oleobj; HRESULT hres;
@@ -302,7 +308,8 @@ static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallback * /* FIXME: Call SetAdvise */ /* FIXME: Call Invoke(DISPID_READYSTATE) */
- PostMessageW(This->doc_host->hwnd, WB_WM_NAVIGATE2, 0, 0); + task = heap_alloc(sizeof(*task)); + push_dochost_task(This->doc_host, task, object_available_proc, FALSE);
return S_OK; } diff --git a/dlls/shdocvw/oleobject.c b/dlls/shdocvw/oleobject.c index f07460f..8d05b77 100644 --- a/dlls/shdocvw/oleobject.c +++ b/dlls/shdocvw/oleobject.c @@ -61,6 +61,8 @@ static LRESULT WINAPI shell_embedding_proc(HWND hwnd, UINT msg, WPARAM wParam, L switch(msg) { case WM_SIZE: return resize_window(This, LOWORD(lParam), HIWORD(lParam)); + case WM_DOCHOSTTASK: + return process_dochost_task(&This->doc_host, lParam); }
return DefWindowProcW(hwnd, msg, wParam, lParam); diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h index 5b9ed46..bc4c2a1 100644 --- a/dlls/shdocvw/shdocvw.h +++ b/dlls/shdocvw/shdocvw.h @@ -51,6 +51,7 @@ extern HRESULT SHDOCVW_GetShellInstanceObjectClassObject(REFCLSID rclsid, */
typedef struct ConnectionPoint ConnectionPoint; +typedef struct DocHost DocHost;
typedef struct { const IConnectionPointContainerVtbl *lpConnectionPointContainerVtbl; @@ -62,7 +63,15 @@ typedef struct { IUnknown *impl; } ConnectionPointContainer;
-typedef struct { +struct _task_header_t; + +typedef void (*task_proc_t)(DocHost*, struct _task_header_t*); + +typedef struct _task_header_t { + task_proc_t proc; +} task_header_t; + +struct DocHost { const IOleClientSiteVtbl *lpOleClientSiteVtbl; const IOleInPlaceSiteVtbl *lpOleInPlaceSiteVtbl; const IDocHostUIHandler2Vtbl *lpDocHostUIHandlerVtbl; @@ -92,7 +101,7 @@ typedef struct { VARIANT_BOOL offline;
ConnectionPointContainer cps; -} DocHost; +};
struct WebBrowser { /* Interfaces available via WebBrowser object */ @@ -198,17 +207,20 @@ HRESULT WebBrowserV2_Create(IUnknown*,REFIID,void**);
void create_doc_view_hwnd(DocHost*); void deactivate_document(DocHost*); +void object_available(DocHost*); void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*); HRESULT navigate_url(DocHost*,LPCWSTR,const VARIANT*,const VARIANT*,VARIANT*,VARIANT*); HRESULT go_home(DocHost*);
+#define WM_DOCHOSTTASK (WM_USER+0x300) +void push_dochost_task(DocHost*,task_header_t*,task_proc_t,BOOL); +LRESULT process_dochost_task(DocHost*,LPARAM); + HRESULT InternetExplorer_Create(IUnknown*,REFIID,void**); void InternetExplorer_WebBrowser_Init(InternetExplorer*);
HRESULT CUrlHistory_Create(IUnknown*,REFIID,void**);
-#define WB_WM_NAVIGATE2 (WM_USER+100) - #define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl)))
/**********************************************************************