diff --git a/dlls/shdocvw/dochost.c b/dlls/shdocvw/dochost.c index f64ae090e29..c3a22f461df 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 e6387d50937..ca2c868d13d 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 37245f7bbc7..4bf21a54cea 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 f07460fee07..8d05b775257 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 5b9ed460be9..bc4c2a1708a 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))) /**********************************************************************