2 * Implementation of IOleObject interfaces for WebBrowser control
8 * Copyright 2001 John R. Sheets (for CodeWeavers)
9 * Copyright 2005 Jacek Caban
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
32 static ATOM shell_embedding_atom = 0;
34 static LRESULT WINAPI shell_embedding_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
36 return DefWindowProcA(hwnd, msg, wParam, lParam);
39 static void create_shell_embedding_hwnd(WebBrowser *This)
41 IOleInPlaceSite *inplace;
45 static const WCHAR wszShellEmbedding[] =
46 {'S','h','e','l','l',' ','E','m','b','e','d','d','i','n','g',0};
48 if(!shell_embedding_atom) {
49 static WNDCLASSEXW wndclass = {
53 0, 0 /* native uses 8 */, NULL, NULL, NULL,
54 (HBRUSH)COLOR_WINDOWFRAME, NULL,
58 wndclass.hInstance = shdocvw_hinstance;
60 RegisterClassExW(&wndclass);
63 hres = IOleClientSite_QueryInterface(This->client, &IID_IOleInPlaceSite, (void**)&inplace);
65 IOleInPlaceSite_GetWindow(inplace, &parent);
66 IOleInPlaceSite_Release(inplace);
69 This->shell_embedding_hwnd = CreateWindowExW(0, wszShellEmbedding, wszShellEmbedding,
70 WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP | WS_MAXIMIZEBOX,
72 NULL, shdocvw_hinstance, This);
75 /**********************************************************************
76 * Implement the IOleObject interface for the WebBrowser control
79 #define OLEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleObject, iface)
81 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
83 WebBrowser *This = OLEOBJ_THIS(iface);
84 return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppv);
87 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
89 WebBrowser *This = OLEOBJ_THIS(iface);
90 return IWebBrowser_AddRef(WEBBROWSER(This));
93 static ULONG WINAPI OleObject_Release(IOleObject *iface)
95 WebBrowser *This = OLEOBJ_THIS(iface);
96 return IWebBrowser_Release(WEBBROWSER(This));
99 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE pClientSite)
101 WebBrowser *This = OLEOBJ_THIS(iface);
103 TRACE("(%p)->(%p)\n", This, pClientSite);
105 if(This->client == pClientSite)
108 if(This->doc_view_hwnd)
109 DestroyWindow(This->doc_view_hwnd);
110 if(This->shell_embedding_hwnd)
111 DestroyWindow(This->shell_embedding_hwnd);
114 IOleClientSite_Release(This->client);
116 This->client = pClientSite;
120 IOleClientSite_AddRef(pClientSite);
122 create_shell_embedding_hwnd(This);
127 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, LPOLECLIENTSITE *ppClientSite)
129 WebBrowser *This = OLEOBJ_THIS(iface);
131 TRACE("(%p)->(%p)\n", This, ppClientSite);
137 IOleClientSite_AddRef(This->client);
138 *ppClientSite = This->client;
143 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp,
144 LPCOLESTR szContainerObj)
146 WebBrowser *This = OLEOBJ_THIS(iface);
147 FIXME("(%p)->(%s, %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
151 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
153 WebBrowser *This = OLEOBJ_THIS(iface);
154 FIXME("(%p)->(%ld)\n", This, dwSaveOption);
158 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker* pmk)
160 WebBrowser *This = OLEOBJ_THIS(iface);
161 FIXME("(%p)->(%ld, %p)\n", This, dwWhichMoniker, pmk);
165 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign,
166 DWORD dwWhichMoniker, LPMONIKER *ppmk)
168 WebBrowser *This = OLEOBJ_THIS(iface);
169 FIXME("(%p)->(%ld, %ld, %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
173 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, LPDATAOBJECT pDataObject,
174 BOOL fCreation, DWORD dwReserved)
176 WebBrowser *This = OLEOBJ_THIS(iface);
177 FIXME("(%p)->(%p, %d, %ld)\n", This, pDataObject, fCreation, dwReserved);
181 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved,
182 LPDATAOBJECT *ppDataObject)
184 WebBrowser *This = OLEOBJ_THIS(iface);
185 FIXME("(%p)->(%ld, %p)\n", This, dwReserved, ppDataObject);
189 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, struct tagMSG* lpmsg,
190 LPOLECLIENTSITE pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
192 WebBrowser *This = OLEOBJ_THIS(iface);
195 TRACE("(%p)->(%ld %p %p %ld %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent,
200 case OLEIVERB_INPLACEACTIVATE: {
201 IOleInPlaceSite *inplace;
203 TRACE("OLEIVERB_INPLACEACTIVATE\n");
208 hres = IOleClientSite_QueryInterface(pActiveSite, &IID_IOleInPlaceSite, (void**)&inplace);
210 WARN("Could not get IOleInPlaceSite\n");
214 hres = IOleInPlaceSite_CanInPlaceActivate(inplace);
216 WARN("CanInPlaceActivate returned: %08lx\n", hres);
217 IOleInPlaceSite_Release(inplace);
221 hres = IOleInPlaceSite_GetWindow(inplace, &This->iphwnd);
223 This->iphwnd = hwndParent;
225 IOleInPlaceSite_OnInPlaceActivate(inplace);
227 IOleInPlaceSite_GetWindowContext(inplace, &This->frame, &This->uiwindow,
228 &This->pos_rect, &This->clip_rect,
232 IOleInPlaceSite_Release(inplace);
234 SetWindowPos(This->shell_embedding_hwnd, NULL,
235 This->pos_rect.left, This->pos_rect.top,
236 This->pos_rect.right-This->pos_rect.left,
237 This->pos_rect.bottom-This->pos_rect.top,
238 SWP_NOZORDER | SWP_SHOWWINDOW);
242 IOleClientSite_ShowObject(This->client);
243 IOleClientSite_GetContainer(This->client, &This->container);
247 IOleInPlaceFrame_GetWindow(This->frame, &This->frame_hwnd);
252 FIXME("stub for %ld\n", iVerb);
259 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
261 WebBrowser *This = OLEOBJ_THIS(iface);
262 TRACE("(%p)->(%p)\n", This, ppEnumOleVerb);
263 return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb);
266 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
268 WebBrowser *This = OLEOBJ_THIS(iface);
269 FIXME("(%p)\n", This);
273 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
275 WebBrowser *This = OLEOBJ_THIS(iface);
276 FIXME("(%p)\n", This);
280 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID* pClsid)
282 WebBrowser *This = OLEOBJ_THIS(iface);
283 FIXME("(%p)->(%p)\n", This, pClsid);
287 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType,
288 LPOLESTR* pszUserType)
290 WebBrowser *This = OLEOBJ_THIS(iface);
291 TRACE("(%p, %ld, %p)\n", This, dwFormOfType, pszUserType);
292 return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType);
295 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
297 WebBrowser *This = OLEOBJ_THIS(iface);
298 FIXME("(%p)->(%lx %p)\n", This, dwDrawAspect, psizel);
302 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
304 WebBrowser *This = OLEOBJ_THIS(iface);
305 FIXME("(%p)->(%lx, %p)\n", This, dwDrawAspect, psizel);
309 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink,
310 DWORD* pdwConnection)
312 WebBrowser *This = OLEOBJ_THIS(iface);
313 FIXME("(%p)->(%p, %p)\n", This, pAdvSink, pdwConnection);
317 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
319 WebBrowser *This = OLEOBJ_THIS(iface);
320 FIXME("(%p)->(%ld)\n", This, dwConnection);
324 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
326 WebBrowser *This = OLEOBJ_THIS(iface);
327 FIXME("(%p)->(%p)\n", This, ppenumAdvise);
331 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
333 WebBrowser *This = OLEOBJ_THIS(iface);
336 TRACE("(%p)->(%lx, %p)\n", This, dwAspect, pdwStatus);
338 hres = OleRegGetMiscStatus(&CLSID_WebBrowser, dwAspect, pdwStatus);
346 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE* pLogpal)
348 WebBrowser *This = OLEOBJ_THIS(iface);
349 FIXME("(%p)->(%p)\n", This, pLogpal);
355 static const IOleObjectVtbl OleObjectVtbl =
357 OleObject_QueryInterface,
360 OleObject_SetClientSite,
361 OleObject_GetClientSite,
362 OleObject_SetHostNames,
364 OleObject_SetMoniker,
365 OleObject_GetMoniker,
366 OleObject_InitFromData,
367 OleObject_GetClipboardData,
371 OleObject_IsUpToDate,
372 OleObject_GetUserClassID,
373 OleObject_GetUserType,
378 OleObject_EnumAdvise,
379 OleObject_GetMiscStatus,
380 OleObject_SetColorScheme
383 /**********************************************************************
384 * Implement the IOleInPlaceObject interface
387 #define INPLACEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceObject, iface)
389 static HRESULT WINAPI OleInPlaceObject_QueryInterface(IOleInPlaceObject *iface,
390 REFIID riid, LPVOID *ppobj)
392 WebBrowser *This = INPLACEOBJ_THIS(iface);
393 return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj);
396 static ULONG WINAPI OleInPlaceObject_AddRef(IOleInPlaceObject *iface)
398 WebBrowser *This = INPLACEOBJ_THIS(iface);
399 return IWebBrowser_AddRef(WEBBROWSER(This));
402 static ULONG WINAPI OleInPlaceObject_Release(IOleInPlaceObject *iface)
404 WebBrowser *This = INPLACEOBJ_THIS(iface);
405 return IWebBrowser_Release(WEBBROWSER(This));
408 static HRESULT WINAPI OleInPlaceObject_GetWindow(IOleInPlaceObject *iface, HWND* phwnd)
410 WebBrowser *This = INPLACEOBJ_THIS(iface);
412 FIXME("(%p)->(%p)\n", This, phwnd);
415 /* Create a fake window to fool MFC into believing that we actually
416 * have an implemented browser control. Avoids the assertion.
419 hwnd = CreateWindowA("BUTTON", "Web Control",
420 WS_HSCROLL | WS_VSCROLL | WS_OVERLAPPEDWINDOW,
421 CW_USEDEFAULT, CW_USEDEFAULT, 600,
422 400, NULL, NULL, NULL, NULL);
425 TRACE ("Returning hwnd = %d\n", hwnd);
431 static HRESULT WINAPI OleInPlaceObject_ContextSensitiveHelp(IOleInPlaceObject *iface,
434 WebBrowser *This = INPLACEOBJ_THIS(iface);
435 FIXME("(%p)->(%x)\n", This, fEnterMode);
439 static HRESULT WINAPI OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject *iface)
441 WebBrowser *This = INPLACEOBJ_THIS(iface);
442 FIXME("(%p)\n", This);
446 static HRESULT WINAPI OleInPlaceObject_UIDeactivate(IOleInPlaceObject *iface)
448 WebBrowser *This = INPLACEOBJ_THIS(iface);
449 FIXME("(%p)\n", This);
453 static HRESULT WINAPI OleInPlaceObject_SetObjectRects(IOleInPlaceObject *iface,
454 LPCRECT lprcPosRect, LPCRECT lprcClipRect)
456 WebBrowser *This = INPLACEOBJ_THIS(iface);
457 FIXME("(%p)->(%p %p)\n", This, lprcPosRect, lprcClipRect);
461 static HRESULT WINAPI OleInPlaceObject_ReactivateAndUndo(IOleInPlaceObject *iface)
463 WebBrowser *This = INPLACEOBJ_THIS(iface);
464 FIXME("(%p)\n", This);
468 #undef INPLACEOBJ_THIS
470 static const IOleInPlaceObjectVtbl OleInPlaceObjectVtbl =
472 OleInPlaceObject_QueryInterface,
473 OleInPlaceObject_AddRef,
474 OleInPlaceObject_Release,
475 OleInPlaceObject_GetWindow,
476 OleInPlaceObject_ContextSensitiveHelp,
477 OleInPlaceObject_InPlaceDeactivate,
478 OleInPlaceObject_UIDeactivate,
479 OleInPlaceObject_SetObjectRects,
480 OleInPlaceObject_ReactivateAndUndo
483 /**********************************************************************
484 * Implement the IOleControl interface
487 #define CONTROL_THIS(iface) DEFINE_THIS(WebBrowser, OleControl, iface)
489 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface,
490 REFIID riid, LPVOID *ppobj)
492 WebBrowser *This = CONTROL_THIS(iface);
493 return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj);
496 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
498 WebBrowser *This = CONTROL_THIS(iface);
499 return IWebBrowser_AddRef(WEBBROWSER(This));
502 static ULONG WINAPI OleControl_Release(IOleControl *iface)
504 WebBrowser *This = CONTROL_THIS(iface);
505 return IWebBrowser_Release(WEBBROWSER(This));
508 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, LPCONTROLINFO pCI)
510 WebBrowser *This = CONTROL_THIS(iface);
511 FIXME("(%p)->(%p)\n", This, pCI);
515 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, struct tagMSG *pMsg)
517 WebBrowser *This = CONTROL_THIS(iface);
518 FIXME("(%p)->(%p)\n", This, pMsg);
522 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
524 WebBrowser *This = CONTROL_THIS(iface);
525 FIXME("(%p)->(%ld)\n", This, dispID);
529 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
531 WebBrowser *This = CONTROL_THIS(iface);
532 FIXME("(%p)->(%x)\n", This, bFreeze);
538 static const IOleControlVtbl OleControlVtbl =
540 OleControl_QueryInterface,
543 OleControl_GetControlInfo,
544 OleControl_OnMnemonic,
545 OleControl_OnAmbientPropertyChange,
546 OleControl_FreezeEvents
549 void WebBrowser_OleObject_Init(WebBrowser *This)
551 This->lpOleObjectVtbl = &OleObjectVtbl;
552 This->lpOleInPlaceObjectVtbl = &OleInPlaceObjectVtbl;
553 This->lpOleControlVtbl = &OleControlVtbl;
556 This->container = NULL;
558 This->frame_hwnd = NULL;
560 This->uiwindow = NULL;
561 This->shell_embedding_hwnd = NULL;
563 memset(&This->pos_rect, 0, sizeof(RECT));
564 memset(&This->clip_rect, 0, sizeof(RECT));
565 memset(&This->frameinfo, 0, sizeof(OLEINPLACEFRAMEINFO));
568 void WebBrowser_OleObject_Destroy(WebBrowser *This)
571 IOleObject_SetClientSite(OLEOBJ(This), NULL);
573 IOleContainer_Release(This->container);
575 IOleInPlaceFrame_Release(This->frame);
577 IOleInPlaceUIWindow_Release(This->uiwindow);