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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 #include "wine/debug.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
34 HWND WINAPI SHSetParentHwnd(HWND hWnd, HWND hWndParent);
36 static ATOM shell_embedding_atom = 0;
38 static LRESULT resize_window(WebBrowser *This, LONG width, LONG height)
40 if(This->doc_host.hwnd)
41 SetWindowPos(This->doc_host.hwnd, NULL, 0, 0, width, height,
42 SWP_NOZORDER | SWP_NOACTIVATE);
47 static LRESULT WINAPI shell_embedding_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
51 static const WCHAR wszTHIS[] = {'T','H','I','S',0};
53 if(msg == WM_CREATE) {
54 This = *(WebBrowser**)lParam;
55 SetPropW(hwnd, wszTHIS, This);
57 This = GetPropW(hwnd, wszTHIS);
62 return resize_window(This, LOWORD(lParam), HIWORD(lParam));
65 return DefWindowProcW(hwnd, msg, wParam, lParam);
68 static void create_shell_embedding_hwnd(WebBrowser *This)
70 IOleInPlaceSite *inplace;
74 static const WCHAR wszShellEmbedding[] =
75 {'S','h','e','l','l',' ','E','m','b','e','d','d','i','n','g',0};
77 if(!shell_embedding_atom) {
78 static WNDCLASSEXW wndclass = {
82 0, 0 /* native uses 8 */, NULL, NULL, NULL,
83 (HBRUSH)COLOR_WINDOWFRAME, NULL,
87 wndclass.hInstance = shdocvw_hinstance;
89 RegisterClassExW(&wndclass);
92 hres = IOleClientSite_QueryInterface(This->client, &IID_IOleInPlaceSite, (void**)&inplace);
94 IOleInPlaceSite_GetWindow(inplace, &parent);
95 IOleInPlaceSite_Release(inplace);
98 This->doc_host.frame_hwnd = This->shell_embedding_hwnd = CreateWindowExW(
100 wszShellEmbedding, wszShellEmbedding,
101 WS_CLIPSIBLINGS | WS_CLIPCHILDREN
102 | (parent ? WS_CHILD | WS_TABSTOP : WS_POPUP | WS_MAXIMIZEBOX),
104 NULL, shdocvw_hinstance, This);
106 TRACE("parent=%p hwnd=%p\n", parent, This->shell_embedding_hwnd);
109 static HRESULT activate_inplace(WebBrowser *This, IOleClientSite *active_site, HWND parent_hwnd)
119 hres = IOleClientSite_QueryInterface(active_site, &IID_IOleInPlaceSite,
120 (void**)&This->inplace);
122 WARN("Could not get IOleInPlaceSite\n");
126 hres = IOleInPlaceSite_CanInPlaceActivate(This->inplace);
128 WARN("CanInPlaceActivate returned: %08x\n", hres);
129 IOleInPlaceSite_Release(This->inplace);
133 hres = IOleInPlaceSite_GetWindow(This->inplace, &parent_hwnd);
135 SHSetParentHwnd(This->shell_embedding_hwnd, parent_hwnd);
137 IOleInPlaceSite_OnInPlaceActivate(This->inplace);
139 IOleInPlaceSite_GetWindowContext(This->inplace, &This->frame, &This->uiwindow,
140 &This->pos_rect, &This->clip_rect,
143 SetWindowPos(This->shell_embedding_hwnd, NULL,
144 This->pos_rect.left, This->pos_rect.top,
145 This->pos_rect.right-This->pos_rect.left,
146 This->pos_rect.bottom-This->pos_rect.top,
147 SWP_NOZORDER | SWP_SHOWWINDOW);
150 IOleClientSite_ShowObject(This->client);
151 IOleClientSite_GetContainer(This->client, &This->container);
155 IOleInPlaceFrame_GetWindow(This->frame, &This->frame_hwnd);
160 static HRESULT activate_ui(WebBrowser *This, IOleClientSite *active_site, HWND parent_hwnd)
164 static const WCHAR wszitem[] = {'i','t','e','m',0};
169 hres = activate_inplace(This, active_site, parent_hwnd);
173 IOleInPlaceSite_OnUIActivate(This->inplace);
176 IOleInPlaceFrame_SetActiveObject(This->frame, ACTIVEOBJ(This), wszitem);
178 IOleInPlaceUIWindow_SetActiveObject(This->uiwindow, ACTIVEOBJ(This), wszitem);
181 IOleInPlaceFrame_SetMenu(This->frame, NULL, NULL, This->shell_embedding_hwnd);
183 SetFocus(This->shell_embedding_hwnd);
188 /**********************************************************************
189 * Implement the IOleObject interface for the WebBrowser control
192 #define OLEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleObject, iface)
194 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
196 WebBrowser *This = OLEOBJ_THIS(iface);
197 return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppv);
200 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
202 WebBrowser *This = OLEOBJ_THIS(iface);
203 return IWebBrowser_AddRef(WEBBROWSER(This));
206 static ULONG WINAPI OleObject_Release(IOleObject *iface)
208 WebBrowser *This = OLEOBJ_THIS(iface);
209 return IWebBrowser_Release(WEBBROWSER(This));
212 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE pClientSite)
214 WebBrowser *This = OLEOBJ_THIS(iface);
215 IOleContainer *container;
218 TRACE("(%p)->(%p)\n", This, pClientSite);
220 if(This->client == pClientSite)
223 if(This->doc_host.hwnd) {
224 DestroyWindow(This->doc_host.hwnd);
225 This->doc_host.hwnd = NULL;
227 if(This->shell_embedding_hwnd) {
228 DestroyWindow(This->shell_embedding_hwnd);
229 This->shell_embedding_hwnd = NULL;
233 IOleInPlaceSite_Release(This->inplace);
234 This->inplace = NULL;
237 if(This->doc_host.hostui)
238 IDocHostUIHandler_Release(This->doc_host.hostui);
240 IOleClientSite_Release(This->client);
243 if(This->doc_host.document)
244 deactivate_document(&This->doc_host);
249 This->client = pClientSite;
250 IOleClientSite_AddRef(pClientSite);
252 hres = IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler,
253 (void**)&This->doc_host.hostui);
255 This->doc_host.hostui = NULL;
257 hres = IOleClientSite_GetContainer(This->client, &container);
258 if(SUCCEEDED(hres)) {
259 ITargetContainer *target_container;
261 hres = IOleContainer_QueryInterface(container, &IID_ITargetContainer,
262 (void**)&target_container);
263 if(SUCCEEDED(hres)) {
264 FIXME("Unsupported ITargetContainer\n");
265 ITargetContainer_Release(target_container);
268 IOleContainer_Release(container);
271 create_shell_embedding_hwnd(This);
276 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, LPOLECLIENTSITE *ppClientSite)
278 WebBrowser *This = OLEOBJ_THIS(iface);
280 TRACE("(%p)->(%p)\n", This, ppClientSite);
286 IOleClientSite_AddRef(This->client);
287 *ppClientSite = This->client;
292 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp,
293 LPCOLESTR szContainerObj)
295 WebBrowser *This = OLEOBJ_THIS(iface);
296 FIXME("(%p)->(%s, %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
300 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
302 WebBrowser *This = OLEOBJ_THIS(iface);
303 FIXME("(%p)->(%d)\n", This, dwSaveOption);
307 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker* pmk)
309 WebBrowser *This = OLEOBJ_THIS(iface);
310 FIXME("(%p)->(%d, %p)\n", This, dwWhichMoniker, pmk);
314 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign,
315 DWORD dwWhichMoniker, LPMONIKER *ppmk)
317 WebBrowser *This = OLEOBJ_THIS(iface);
318 FIXME("(%p)->(%d, %d, %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
322 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, LPDATAOBJECT pDataObject,
323 BOOL fCreation, DWORD dwReserved)
325 WebBrowser *This = OLEOBJ_THIS(iface);
326 FIXME("(%p)->(%p, %d, %d)\n", This, pDataObject, fCreation, dwReserved);
330 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved,
331 LPDATAOBJECT *ppDataObject)
333 WebBrowser *This = OLEOBJ_THIS(iface);
334 FIXME("(%p)->(%d, %p)\n", This, dwReserved, ppDataObject);
338 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, struct tagMSG* lpmsg,
339 LPOLECLIENTSITE pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
341 WebBrowser *This = OLEOBJ_THIS(iface);
343 TRACE("(%p)->(%d %p %p %d %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent,
349 TRACE("OLEIVERB_SHOW\n");
350 return activate_ui(This, pActiveSite, hwndParent);
351 case OLEIVERB_UIACTIVATE:
352 TRACE("OLEIVERB_UIACTIVATE\n");
353 return activate_ui(This, pActiveSite, hwndParent);
354 case OLEIVERB_INPLACEACTIVATE:
355 TRACE("OLEIVERB_INPLACEACTIVATE\n");
356 return activate_inplace(This, pActiveSite, hwndParent);
358 FIXME("stub for %d\n", iVerb);
365 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
367 WebBrowser *This = OLEOBJ_THIS(iface);
368 TRACE("(%p)->(%p)\n", This, ppEnumOleVerb);
369 return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb);
372 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
374 WebBrowser *This = OLEOBJ_THIS(iface);
375 FIXME("(%p)\n", This);
379 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
381 WebBrowser *This = OLEOBJ_THIS(iface);
382 FIXME("(%p)\n", This);
386 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID* pClsid)
388 WebBrowser *This = OLEOBJ_THIS(iface);
389 FIXME("(%p)->(%p)\n", This, pClsid);
393 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType,
394 LPOLESTR* pszUserType)
396 WebBrowser *This = OLEOBJ_THIS(iface);
397 TRACE("(%p, %d, %p)\n", This, dwFormOfType, pszUserType);
398 return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType);
401 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
403 WebBrowser *This = OLEOBJ_THIS(iface);
405 TRACE("(%p)->(%x %p)\n", This, dwDrawAspect, psizel);
407 /* Tests show that dwDrawAspect is ignored */
408 memcpy(&This->extent, psizel, sizeof(SIZEL));
412 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
414 WebBrowser *This = OLEOBJ_THIS(iface);
416 TRACE("(%p)->(%x, %p)\n", This, dwDrawAspect, psizel);
418 /* Tests show that dwDrawAspect is ignored */
419 memcpy(psizel, &This->extent, sizeof(SIZEL));
423 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink,
424 DWORD* pdwConnection)
426 WebBrowser *This = OLEOBJ_THIS(iface);
427 FIXME("(%p)->(%p, %p)\n", This, pAdvSink, pdwConnection);
431 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
433 WebBrowser *This = OLEOBJ_THIS(iface);
434 FIXME("(%p)->(%d)\n", This, dwConnection);
438 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
440 WebBrowser *This = OLEOBJ_THIS(iface);
441 FIXME("(%p)->(%p)\n", This, ppenumAdvise);
445 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
447 WebBrowser *This = OLEOBJ_THIS(iface);
449 TRACE("(%p)->(%x, %p)\n", This, dwAspect, pdwStatus);
451 *pdwStatus = OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
452 |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE;
457 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE* pLogpal)
459 WebBrowser *This = OLEOBJ_THIS(iface);
460 FIXME("(%p)->(%p)\n", This, pLogpal);
466 static const IOleObjectVtbl OleObjectVtbl =
468 OleObject_QueryInterface,
471 OleObject_SetClientSite,
472 OleObject_GetClientSite,
473 OleObject_SetHostNames,
475 OleObject_SetMoniker,
476 OleObject_GetMoniker,
477 OleObject_InitFromData,
478 OleObject_GetClipboardData,
482 OleObject_IsUpToDate,
483 OleObject_GetUserClassID,
484 OleObject_GetUserType,
489 OleObject_EnumAdvise,
490 OleObject_GetMiscStatus,
491 OleObject_SetColorScheme
494 /**********************************************************************
495 * Implement the IOleInPlaceObject interface
498 #define INPLACEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceObject, iface)
500 static HRESULT WINAPI OleInPlaceObject_QueryInterface(IOleInPlaceObject *iface,
501 REFIID riid, LPVOID *ppobj)
503 WebBrowser *This = INPLACEOBJ_THIS(iface);
504 return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj);
507 static ULONG WINAPI OleInPlaceObject_AddRef(IOleInPlaceObject *iface)
509 WebBrowser *This = INPLACEOBJ_THIS(iface);
510 return IWebBrowser_AddRef(WEBBROWSER(This));
513 static ULONG WINAPI OleInPlaceObject_Release(IOleInPlaceObject *iface)
515 WebBrowser *This = INPLACEOBJ_THIS(iface);
516 return IWebBrowser_Release(WEBBROWSER(This));
519 static HRESULT WINAPI OleInPlaceObject_GetWindow(IOleInPlaceObject *iface, HWND* phwnd)
521 WebBrowser *This = INPLACEOBJ_THIS(iface);
523 TRACE("(%p)->(%p)\n", This, phwnd);
525 *phwnd = This->shell_embedding_hwnd;
529 static HRESULT WINAPI OleInPlaceObject_ContextSensitiveHelp(IOleInPlaceObject *iface,
532 WebBrowser *This = INPLACEOBJ_THIS(iface);
533 FIXME("(%p)->(%x)\n", This, fEnterMode);
537 static HRESULT WINAPI OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject *iface)
539 WebBrowser *This = INPLACEOBJ_THIS(iface);
540 FIXME("(%p)\n", This);
544 static HRESULT WINAPI OleInPlaceObject_UIDeactivate(IOleInPlaceObject *iface)
546 WebBrowser *This = INPLACEOBJ_THIS(iface);
547 FIXME("(%p)\n", This);
551 static HRESULT WINAPI OleInPlaceObject_SetObjectRects(IOleInPlaceObject *iface,
552 LPCRECT lprcPosRect, LPCRECT lprcClipRect)
554 WebBrowser *This = INPLACEOBJ_THIS(iface);
556 TRACE("(%p)->(%p %p)\n", This, lprcPosRect, lprcClipRect);
558 memcpy(&This->pos_rect, lprcPosRect, sizeof(RECT));
561 memcpy(&This->clip_rect, lprcClipRect, sizeof(RECT));
563 if(This->shell_embedding_hwnd) {
564 SetWindowPos(This->shell_embedding_hwnd, NULL,
565 lprcPosRect->left, lprcPosRect->top,
566 lprcPosRect->right-lprcPosRect->left,
567 lprcPosRect->bottom-lprcPosRect->top,
568 SWP_NOZORDER | SWP_NOACTIVATE);
574 static HRESULT WINAPI OleInPlaceObject_ReactivateAndUndo(IOleInPlaceObject *iface)
576 WebBrowser *This = INPLACEOBJ_THIS(iface);
577 FIXME("(%p)\n", This);
581 #undef INPLACEOBJ_THIS
583 static const IOleInPlaceObjectVtbl OleInPlaceObjectVtbl =
585 OleInPlaceObject_QueryInterface,
586 OleInPlaceObject_AddRef,
587 OleInPlaceObject_Release,
588 OleInPlaceObject_GetWindow,
589 OleInPlaceObject_ContextSensitiveHelp,
590 OleInPlaceObject_InPlaceDeactivate,
591 OleInPlaceObject_UIDeactivate,
592 OleInPlaceObject_SetObjectRects,
593 OleInPlaceObject_ReactivateAndUndo
596 /**********************************************************************
597 * Implement the IOleControl interface
600 #define CONTROL_THIS(iface) DEFINE_THIS(WebBrowser, OleControl, iface)
602 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface,
603 REFIID riid, LPVOID *ppobj)
605 WebBrowser *This = CONTROL_THIS(iface);
606 return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj);
609 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
611 WebBrowser *This = CONTROL_THIS(iface);
612 return IWebBrowser_AddRef(WEBBROWSER(This));
615 static ULONG WINAPI OleControl_Release(IOleControl *iface)
617 WebBrowser *This = CONTROL_THIS(iface);
618 return IWebBrowser_Release(WEBBROWSER(This));
621 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, LPCONTROLINFO pCI)
623 WebBrowser *This = CONTROL_THIS(iface);
625 TRACE("(%p)->(%p)\n", This, pCI);
627 /* Tests show that this function should be not implemented */
631 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, struct tagMSG *pMsg)
633 WebBrowser *This = CONTROL_THIS(iface);
634 FIXME("(%p)->(%p)\n", This, pMsg);
638 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
640 WebBrowser *This = CONTROL_THIS(iface);
641 FIXME("(%p)->(%d)\n", This, dispID);
645 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
647 WebBrowser *This = CONTROL_THIS(iface);
648 FIXME("(%p)->(%x)\n", This, bFreeze);
654 static const IOleControlVtbl OleControlVtbl =
656 OleControl_QueryInterface,
659 OleControl_GetControlInfo,
660 OleControl_OnMnemonic,
661 OleControl_OnAmbientPropertyChange,
662 OleControl_FreezeEvents
665 #define ACTIVEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceActiveObject, iface)
667 static HRESULT WINAPI InPlaceActiveObject_QueryInterface(IOleInPlaceActiveObject *iface,
668 REFIID riid, void **ppv)
670 WebBrowser *This = ACTIVEOBJ_THIS(iface);
671 return IWebBrowser2_QueryInterface(WEBBROWSER2(This), riid, ppv);
674 static ULONG WINAPI InPlaceActiveObject_AddRef(IOleInPlaceActiveObject *iface)
676 WebBrowser *This = ACTIVEOBJ_THIS(iface);
677 return IWebBrowser2_AddRef(WEBBROWSER2(This));
680 static ULONG WINAPI InPlaceActiveObject_Release(IOleInPlaceActiveObject *iface)
682 WebBrowser *This = ACTIVEOBJ_THIS(iface);
683 return IWebBrowser2_Release(WEBBROWSER2(This));
686 static HRESULT WINAPI InPlaceActiveObject_GetWindow(IOleInPlaceActiveObject *iface,
689 WebBrowser *This = ACTIVEOBJ_THIS(iface);
690 return IOleInPlaceObject_GetWindow(INPLACEOBJ(This), phwnd);
693 static HRESULT WINAPI InPlaceActiveObject_ContextSensitiveHelp(IOleInPlaceActiveObject *iface,
696 WebBrowser *This = ACTIVEOBJ_THIS(iface);
697 return IOleInPlaceObject_ContextSensitiveHelp(INPLACEOBJ(This), fEnterMode);
700 static HRESULT WINAPI InPlaceActiveObject_TranslateAccelerator(IOleInPlaceActiveObject *iface,
703 WebBrowser *This = ACTIVEOBJ_THIS(iface);
704 FIXME("(%p)->(%p)\n", This, lpmsg);
708 static HRESULT WINAPI InPlaceActiveObject_OnFrameWindowActivate(IOleInPlaceActiveObject *iface,
711 WebBrowser *This = ACTIVEOBJ_THIS(iface);
712 FIXME("(%p)->(%x)\n", This, fActivate);
716 static HRESULT WINAPI InPlaceActiveObject_OnDocWindowActivate(IOleInPlaceActiveObject *iface,
719 WebBrowser *This = ACTIVEOBJ_THIS(iface);
720 FIXME("(%p)->(%x)\n", This, fActivate);
724 static HRESULT WINAPI InPlaceActiveObject_ResizeBorder(IOleInPlaceActiveObject *iface,
725 LPCRECT lprcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fFrameWindow)
727 WebBrowser *This = ACTIVEOBJ_THIS(iface);
728 FIXME("(%p)->(%p %p %x)\n", This, lprcBorder, pUIWindow, fFrameWindow);
732 static HRESULT WINAPI InPlaceActiveObject_EnableModeless(IOleInPlaceActiveObject *iface,
735 WebBrowser *This = ACTIVEOBJ_THIS(iface);
736 FIXME("(%p)->(%x)\n", This, fEnable);
740 #undef ACTIVEOBJ_THIS
742 static const IOleInPlaceActiveObjectVtbl OleInPlaceActiveObjectVtbl = {
743 InPlaceActiveObject_QueryInterface,
744 InPlaceActiveObject_AddRef,
745 InPlaceActiveObject_Release,
746 InPlaceActiveObject_GetWindow,
747 InPlaceActiveObject_ContextSensitiveHelp,
748 InPlaceActiveObject_TranslateAccelerator,
749 InPlaceActiveObject_OnFrameWindowActivate,
750 InPlaceActiveObject_OnDocWindowActivate,
751 InPlaceActiveObject_ResizeBorder,
752 InPlaceActiveObject_EnableModeless
755 #define OLECMD_THIS(iface) DEFINE_THIS(WebBrowser, OleCommandTarget, iface)
757 static HRESULT WINAPI WBOleCommandTarget_QueryInterface(IOleCommandTarget *iface,
758 REFIID riid, void **ppv)
760 WebBrowser *This = OLECMD_THIS(iface);
761 return IWebBrowser2_QueryInterface(WEBBROWSER(This), riid, ppv);
764 static ULONG WINAPI WBOleCommandTarget_AddRef(IOleCommandTarget *iface)
766 WebBrowser *This = OLECMD_THIS(iface);
767 return IWebBrowser2_AddRef(WEBBROWSER(This));
770 static ULONG WINAPI WBOleCommandTarget_Release(IOleCommandTarget *iface)
772 WebBrowser *This = OLECMD_THIS(iface);
773 return IWebBrowser2_Release(WEBBROWSER(This));
776 static HRESULT WINAPI WBOleCommandTarget_QueryStatus(IOleCommandTarget *iface,
777 const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
779 WebBrowser *This = OLECMD_THIS(iface);
780 FIXME("(%p)->(%s %u %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds,
785 static HRESULT WINAPI WBOleCommandTarget_Exec(IOleCommandTarget *iface,
786 const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn,
789 WebBrowser *This = OLECMD_THIS(iface);
790 FIXME("(%p)->(%s %d %d %p %p)\n", This, debugstr_guid(pguidCmdGroup), nCmdID,
791 nCmdexecopt, pvaIn, pvaOut);
797 static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
798 WBOleCommandTarget_QueryInterface,
799 WBOleCommandTarget_AddRef,
800 WBOleCommandTarget_Release,
801 WBOleCommandTarget_QueryStatus,
802 WBOleCommandTarget_Exec
805 void WebBrowser_OleObject_Init(WebBrowser *This)
807 This->lpOleObjectVtbl = &OleObjectVtbl;
808 This->lpOleInPlaceObjectVtbl = &OleInPlaceObjectVtbl;
809 This->lpOleControlVtbl = &OleControlVtbl;
810 This->lpOleInPlaceActiveObjectVtbl = &OleInPlaceActiveObjectVtbl;
811 This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;
814 This->inplace = NULL;
815 This->container = NULL;
816 This->frame_hwnd = NULL;
818 This->uiwindow = NULL;
819 This->shell_embedding_hwnd = NULL;
821 memset(&This->pos_rect, 0, sizeof(RECT));
822 memset(&This->clip_rect, 0, sizeof(RECT));
823 memset(&This->frameinfo, 0, sizeof(OLEINPLACEFRAMEINFO));
825 This->extent.cx = 1323;
826 This->extent.cy = 529;
829 void WebBrowser_OleObject_Destroy(WebBrowser *This)
832 IOleObject_SetClientSite(OLEOBJ(This), NULL);
834 IOleContainer_Release(This->container);
836 IOleInPlaceFrame_Release(This->frame);
838 IOleInPlaceUIWindow_Release(This->uiwindow);