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>
29 //#include "htiframe.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw
);
36 HWND WINAPI
SHSetParentHwnd(HWND hWnd
, HWND hWndParent
);
38 static ATOM shell_embedding_atom
= 0;
40 static LRESULT
resize_window(WebBrowser
*This
, LONG width
, LONG height
)
42 if(This
->doc_host
.hwnd
)
43 SetWindowPos(This
->doc_host
.hwnd
, NULL
, 0, 0, width
, height
,
44 SWP_NOZORDER
| SWP_NOACTIVATE
);
49 static LRESULT WINAPI
shell_embedding_proc(HWND hwnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
53 static const WCHAR wszTHIS
[] = {'T','H','I','S',0};
55 if(msg
== WM_CREATE
) {
56 This
= *(WebBrowser
**)lParam
;
57 SetPropW(hwnd
, wszTHIS
, This
);
59 This
= GetPropW(hwnd
, wszTHIS
);
64 return resize_window(This
, LOWORD(lParam
), HIWORD(lParam
));
66 return process_dochost_task(&This
->doc_host
, lParam
);
69 return DefWindowProcW(hwnd
, msg
, wParam
, lParam
);
72 static void create_shell_embedding_hwnd(WebBrowser
*This
)
74 IOleInPlaceSite
*inplace
;
78 static const WCHAR wszShellEmbedding
[] =
79 {'S','h','e','l','l',' ','E','m','b','e','d','d','i','n','g',0};
81 if(!shell_embedding_atom
) {
82 static WNDCLASSEXW wndclass
= {
86 0, 0 /* native uses 8 */, NULL
, NULL
, NULL
,
87 (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
,
91 wndclass
.hInstance
= shdocvw_hinstance
;
93 RegisterClassExW(&wndclass
);
96 hres
= IOleClientSite_QueryInterface(This
->client
, &IID_IOleInPlaceSite
, (void**)&inplace
);
98 IOleInPlaceSite_GetWindow(inplace
, &parent
);
99 IOleInPlaceSite_Release(inplace
);
102 This
->doc_host
.frame_hwnd
= This
->shell_embedding_hwnd
= CreateWindowExW(
104 wszShellEmbedding
, wszShellEmbedding
,
105 WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
106 | (parent
? WS_CHILD
| WS_TABSTOP
: WS_POPUP
| WS_MAXIMIZEBOX
),
108 NULL
, shdocvw_hinstance
, This
);
110 TRACE("parent=%p hwnd=%p\n", parent
, This
->shell_embedding_hwnd
);
113 static HRESULT
activate_inplace(WebBrowser
*This
, IOleClientSite
*active_site
)
124 hres
= IOleClientSite_QueryInterface(active_site
, &IID_IOleInPlaceSite
,
125 (void**)&This
->inplace
);
127 WARN("Could not get IOleInPlaceSite\n");
131 hres
= IOleInPlaceSite_CanInPlaceActivate(This
->inplace
);
133 WARN("CanInPlaceActivate returned: %08x\n", hres
);
134 IOleInPlaceSite_Release(This
->inplace
);
138 hres
= IOleInPlaceSite_GetWindow(This
->inplace
, &parent_hwnd
);
140 SHSetParentHwnd(This
->shell_embedding_hwnd
, parent_hwnd
);
142 IOleInPlaceSite_OnInPlaceActivate(This
->inplace
);
144 This
->frameinfo
.cb
= sizeof(OLEINPLACEFRAMEINFO
);
145 IOleInPlaceSite_GetWindowContext(This
->inplace
, &This
->doc_host
.frame
, &This
->uiwindow
,
146 &This
->pos_rect
, &This
->clip_rect
,
149 SetWindowPos(This
->shell_embedding_hwnd
, NULL
,
150 This
->pos_rect
.left
, This
->pos_rect
.top
,
151 This
->pos_rect
.right
-This
->pos_rect
.left
,
152 This
->pos_rect
.bottom
-This
->pos_rect
.top
,
153 SWP_NOZORDER
| SWP_SHOWWINDOW
);
156 IOleContainer
*container
;
158 IOleClientSite_ShowObject(This
->client
);
160 hres
= IOleClientSite_GetContainer(This
->client
, &container
);
161 if(SUCCEEDED(hres
)) {
163 IOleContainer_Release(This
->container
);
164 This
->container
= container
;
168 if(This
->doc_host
.frame
)
169 IOleInPlaceFrame_GetWindow(This
->doc_host
.frame
, &This
->frame_hwnd
);
174 static HRESULT
activate_ui(WebBrowser
*This
, IOleClientSite
*active_site
)
178 static const WCHAR wszitem
[] = {'i','t','e','m',0};
182 if(This
->shell_embedding_hwnd
)
183 ShowWindow(This
->shell_embedding_hwnd
, SW_SHOW
);
187 hres
= activate_inplace(This
, active_site
);
191 IOleInPlaceSite_OnUIActivate(This
->inplace
);
193 if(This
->doc_host
.frame
)
194 IOleInPlaceFrame_SetActiveObject(This
->doc_host
.frame
, ACTIVEOBJ(This
), wszitem
);
196 IOleInPlaceUIWindow_SetActiveObject(This
->uiwindow
, ACTIVEOBJ(This
), wszitem
);
198 if(This
->doc_host
.frame
)
199 IOleInPlaceFrame_SetMenu(This
->doc_host
.frame
, NULL
, NULL
, This
->shell_embedding_hwnd
);
201 SetFocus(This
->shell_embedding_hwnd
);
206 static HRESULT
get_client_disp_property(IOleClientSite
*client
, DISPID dispid
, VARIANT
*res
)
208 IDispatch
*disp
= NULL
;
209 DISPPARAMS dispparams
= {NULL
, 0};
217 hres
= IOleClientSite_QueryInterface(client
, &IID_IDispatch
, (void**)&disp
);
219 TRACE("Could not get IDispatch\n");
223 hres
= IDispatch_Invoke(disp
, dispid
, &IID_NULL
, LOCALE_SYSTEM_DEFAULT
,
224 DISPATCH_PROPERTYGET
, &dispparams
, res
, NULL
, NULL
);
226 IDispatch_Release(disp
);
231 static HRESULT
on_offlineconnected_change(WebBrowser
*This
)
235 get_client_disp_property(This
->client
, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
, &offline
);
237 if(V_VT(&offline
) == VT_BOOL
)
238 IWebBrowser2_put_Offline(WEBBROWSER2(This
), V_BOOL(&offline
));
239 else if(V_VT(&offline
) != VT_EMPTY
)
240 WARN("wrong V_VT(silent) %d\n", V_VT(&offline
));
245 static HRESULT
on_silent_change(WebBrowser
*This
)
249 get_client_disp_property(This
->client
, DISPID_AMBIENT_SILENT
, &silent
);
251 if(V_VT(&silent
) == VT_BOOL
)
252 IWebBrowser2_put_Silent(WEBBROWSER2(This
), V_BOOL(&silent
));
253 else if(V_VT(&silent
) != VT_EMPTY
)
254 WARN("wrong V_VT(silent) %d\n", V_VT(&silent
));
259 static void release_client_site(WebBrowser
*This
)
261 release_dochost_client(&This
->doc_host
);
263 if(This
->shell_embedding_hwnd
) {
264 DestroyWindow(This
->shell_embedding_hwnd
);
265 This
->shell_embedding_hwnd
= NULL
;
269 IOleInPlaceSite_Release(This
->inplace
);
270 This
->inplace
= NULL
;
273 if(This
->container
) {
274 IOleContainer_Release(This
->container
);
275 This
->container
= NULL
;
279 IOleInPlaceUIWindow_Release(This
->uiwindow
);
280 This
->uiwindow
= NULL
;
284 IOleClientSite_Release(This
->client
);
289 /**********************************************************************
290 * Implement the IOleObject interface for the WebBrowser control
293 #define OLEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleObject, iface)
295 static HRESULT WINAPI
OleObject_QueryInterface(IOleObject
*iface
, REFIID riid
, void **ppv
)
297 WebBrowser
*This
= OLEOBJ_THIS(iface
);
298 return IWebBrowser_QueryInterface(WEBBROWSER(This
), riid
, ppv
);
301 static ULONG WINAPI
OleObject_AddRef(IOleObject
*iface
)
303 WebBrowser
*This
= OLEOBJ_THIS(iface
);
304 return IWebBrowser_AddRef(WEBBROWSER(This
));
307 static ULONG WINAPI
OleObject_Release(IOleObject
*iface
)
309 WebBrowser
*This
= OLEOBJ_THIS(iface
);
310 return IWebBrowser_Release(WEBBROWSER(This
));
313 static HRESULT WINAPI
OleObject_SetClientSite(IOleObject
*iface
, LPOLECLIENTSITE pClientSite
)
315 WebBrowser
*This
= OLEOBJ_THIS(iface
);
316 IDocHostUIHandler
*hostui
;
317 IOleContainer
*container
;
321 TRACE("(%p)->(%p)\n", This
, pClientSite
);
323 if(This
->client
== pClientSite
)
326 release_client_site(This
);
329 if(This
->doc_host
.document
)
330 deactivate_document(&This
->doc_host
);
334 IOleClientSite_AddRef(pClientSite
);
335 This
->client
= pClientSite
;
337 hres
= IOleClientSite_QueryInterface(This
->client
, &IID_IDispatch
,
340 This
->doc_host
.client_disp
= disp
;
342 hres
= IOleClientSite_QueryInterface(This
->client
, &IID_IDocHostUIHandler
,
345 This
->doc_host
.hostui
= hostui
;
347 hres
= IOleClientSite_GetContainer(This
->client
, &container
);
348 if(SUCCEEDED(hres
)) {
349 ITargetContainer
*target_container
;
351 hres
= IOleContainer_QueryInterface(container
, &IID_ITargetContainer
,
352 (void**)&target_container
);
353 if(SUCCEEDED(hres
)) {
354 FIXME("Unsupported ITargetContainer\n");
355 ITargetContainer_Release(target_container
);
358 IOleContainer_Release(container
);
361 create_shell_embedding_hwnd(This
);
363 on_offlineconnected_change(This
);
364 on_silent_change(This
);
369 static HRESULT WINAPI
OleObject_GetClientSite(IOleObject
*iface
, LPOLECLIENTSITE
*ppClientSite
)
371 WebBrowser
*This
= OLEOBJ_THIS(iface
);
373 TRACE("(%p)->(%p)\n", This
, ppClientSite
);
379 IOleClientSite_AddRef(This
->client
);
380 *ppClientSite
= This
->client
;
385 static HRESULT WINAPI
OleObject_SetHostNames(IOleObject
*iface
, LPCOLESTR szContainerApp
,
386 LPCOLESTR szContainerObj
)
388 WebBrowser
*This
= OLEOBJ_THIS(iface
);
390 TRACE("(%p)->(%s, %s)\n", This
, debugstr_w(szContainerApp
), debugstr_w(szContainerObj
));
392 /* We have nothing to do here. */
396 static HRESULT WINAPI
OleObject_Close(IOleObject
*iface
, DWORD dwSaveOption
)
398 WebBrowser
*This
= OLEOBJ_THIS(iface
);
399 FIXME("(%p)->(%d)\n", This
, dwSaveOption
);
403 static HRESULT WINAPI
OleObject_SetMoniker(IOleObject
*iface
, DWORD dwWhichMoniker
, IMoniker
* pmk
)
405 WebBrowser
*This
= OLEOBJ_THIS(iface
);
406 FIXME("(%p)->(%d, %p)\n", This
, dwWhichMoniker
, pmk
);
410 static HRESULT WINAPI
OleObject_GetMoniker(IOleObject
*iface
, DWORD dwAssign
,
411 DWORD dwWhichMoniker
, LPMONIKER
*ppmk
)
413 WebBrowser
*This
= OLEOBJ_THIS(iface
);
414 FIXME("(%p)->(%d, %d, %p)\n", This
, dwAssign
, dwWhichMoniker
, ppmk
);
418 static HRESULT WINAPI
OleObject_InitFromData(IOleObject
*iface
, LPDATAOBJECT pDataObject
,
419 BOOL fCreation
, DWORD dwReserved
)
421 WebBrowser
*This
= OLEOBJ_THIS(iface
);
422 FIXME("(%p)->(%p, %d, %d)\n", This
, pDataObject
, fCreation
, dwReserved
);
426 static HRESULT WINAPI
OleObject_GetClipboardData(IOleObject
*iface
, DWORD dwReserved
,
427 LPDATAOBJECT
*ppDataObject
)
429 WebBrowser
*This
= OLEOBJ_THIS(iface
);
430 FIXME("(%p)->(%d, %p)\n", This
, dwReserved
, ppDataObject
);
434 static HRESULT WINAPI
OleObject_DoVerb(IOleObject
*iface
, LONG iVerb
, struct tagMSG
* lpmsg
,
435 LPOLECLIENTSITE pActiveSite
, LONG lindex
, HWND hwndParent
, LPCRECT lprcPosRect
)
437 WebBrowser
*This
= OLEOBJ_THIS(iface
);
439 TRACE("(%p)->(%d %p %p %d %p %p)\n", This
, iVerb
, lpmsg
, pActiveSite
, lindex
, hwndParent
,
445 TRACE("OLEIVERB_SHOW\n");
446 return activate_ui(This
, pActiveSite
);
447 case OLEIVERB_UIACTIVATE
:
448 TRACE("OLEIVERB_UIACTIVATE\n");
449 return activate_ui(This
, pActiveSite
);
450 case OLEIVERB_INPLACEACTIVATE
:
451 TRACE("OLEIVERB_INPLACEACTIVATE\n");
452 return activate_inplace(This
, pActiveSite
);
454 TRACE("OLEIVERB_HIDE\n");
455 if(This
->shell_embedding_hwnd
)
456 ShowWindow(This
->shell_embedding_hwnd
, SW_HIDE
);
459 FIXME("stub for %d\n", iVerb
);
466 static HRESULT WINAPI
OleObject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**ppEnumOleVerb
)
468 WebBrowser
*This
= OLEOBJ_THIS(iface
);
469 TRACE("(%p)->(%p)\n", This
, ppEnumOleVerb
);
470 return OleRegEnumVerbs(&CLSID_WebBrowser
, ppEnumOleVerb
);
473 static HRESULT WINAPI
OleObject_Update(IOleObject
*iface
)
475 WebBrowser
*This
= OLEOBJ_THIS(iface
);
476 FIXME("(%p)\n", This
);
480 static HRESULT WINAPI
OleObject_IsUpToDate(IOleObject
*iface
)
482 WebBrowser
*This
= OLEOBJ_THIS(iface
);
483 FIXME("(%p)\n", This
);
487 static HRESULT WINAPI
OleObject_GetUserClassID(IOleObject
*iface
, CLSID
* pClsid
)
489 WebBrowser
*This
= OLEOBJ_THIS(iface
);
490 FIXME("(%p)->(%p)\n", This
, pClsid
);
494 static HRESULT WINAPI
OleObject_GetUserType(IOleObject
*iface
, DWORD dwFormOfType
,
495 LPOLESTR
* pszUserType
)
497 WebBrowser
*This
= OLEOBJ_THIS(iface
);
498 TRACE("(%p, %d, %p)\n", This
, dwFormOfType
, pszUserType
);
499 return OleRegGetUserType(&CLSID_WebBrowser
, dwFormOfType
, pszUserType
);
502 static HRESULT WINAPI
OleObject_SetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
504 WebBrowser
*This
= OLEOBJ_THIS(iface
);
506 TRACE("(%p)->(%x %p)\n", This
, dwDrawAspect
, psizel
);
508 /* Tests show that dwDrawAspect is ignored */
509 This
->extent
= *psizel
;
513 static HRESULT WINAPI
OleObject_GetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
515 WebBrowser
*This
= OLEOBJ_THIS(iface
);
517 TRACE("(%p)->(%x, %p)\n", This
, dwDrawAspect
, psizel
);
519 /* Tests show that dwDrawAspect is ignored */
520 *psizel
= This
->extent
;
524 static HRESULT WINAPI
OleObject_Advise(IOleObject
*iface
, IAdviseSink
*pAdvSink
,
525 DWORD
* pdwConnection
)
527 WebBrowser
*This
= OLEOBJ_THIS(iface
);
528 FIXME("(%p)->(%p, %p)\n", This
, pAdvSink
, pdwConnection
);
532 static HRESULT WINAPI
OleObject_Unadvise(IOleObject
*iface
, DWORD dwConnection
)
534 WebBrowser
*This
= OLEOBJ_THIS(iface
);
535 FIXME("(%p)->(%d)\n", This
, dwConnection
);
539 static HRESULT WINAPI
OleObject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**ppenumAdvise
)
541 WebBrowser
*This
= OLEOBJ_THIS(iface
);
542 FIXME("(%p)->(%p)\n", This
, ppenumAdvise
);
546 static HRESULT WINAPI
OleObject_GetMiscStatus(IOleObject
*iface
, DWORD dwAspect
, DWORD
*pdwStatus
)
548 WebBrowser
*This
= OLEOBJ_THIS(iface
);
550 TRACE("(%p)->(%x, %p)\n", This
, dwAspect
, pdwStatus
);
552 *pdwStatus
= OLEMISC_SETCLIENTSITEFIRST
|OLEMISC_ACTIVATEWHENVISIBLE
|OLEMISC_INSIDEOUT
553 |OLEMISC_CANTLINKINSIDE
|OLEMISC_RECOMPOSEONRESIZE
;
558 static HRESULT WINAPI
OleObject_SetColorScheme(IOleObject
*iface
, LOGPALETTE
* pLogpal
)
560 WebBrowser
*This
= OLEOBJ_THIS(iface
);
561 FIXME("(%p)->(%p)\n", This
, pLogpal
);
567 static const IOleObjectVtbl OleObjectVtbl
=
569 OleObject_QueryInterface
,
572 OleObject_SetClientSite
,
573 OleObject_GetClientSite
,
574 OleObject_SetHostNames
,
576 OleObject_SetMoniker
,
577 OleObject_GetMoniker
,
578 OleObject_InitFromData
,
579 OleObject_GetClipboardData
,
583 OleObject_IsUpToDate
,
584 OleObject_GetUserClassID
,
585 OleObject_GetUserType
,
590 OleObject_EnumAdvise
,
591 OleObject_GetMiscStatus
,
592 OleObject_SetColorScheme
595 /**********************************************************************
596 * Implement the IOleInPlaceObject interface
599 #define INPLACEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceObject, iface)
601 static HRESULT WINAPI
OleInPlaceObject_QueryInterface(IOleInPlaceObject
*iface
,
602 REFIID riid
, LPVOID
*ppobj
)
604 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
605 return IWebBrowser_QueryInterface(WEBBROWSER(This
), riid
, ppobj
);
608 static ULONG WINAPI
OleInPlaceObject_AddRef(IOleInPlaceObject
*iface
)
610 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
611 return IWebBrowser_AddRef(WEBBROWSER(This
));
614 static ULONG WINAPI
OleInPlaceObject_Release(IOleInPlaceObject
*iface
)
616 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
617 return IWebBrowser_Release(WEBBROWSER(This
));
620 static HRESULT WINAPI
OleInPlaceObject_GetWindow(IOleInPlaceObject
*iface
, HWND
* phwnd
)
622 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
624 TRACE("(%p)->(%p)\n", This
, phwnd
);
626 *phwnd
= This
->shell_embedding_hwnd
;
630 static HRESULT WINAPI
OleInPlaceObject_ContextSensitiveHelp(IOleInPlaceObject
*iface
,
633 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
634 FIXME("(%p)->(%x)\n", This
, fEnterMode
);
638 static HRESULT WINAPI
OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject
*iface
)
640 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
641 FIXME("(%p)\n", This
);
644 IOleInPlaceSite_Release(This
->inplace
);
645 This
->inplace
= NULL
;
651 static HRESULT WINAPI
OleInPlaceObject_UIDeactivate(IOleInPlaceObject
*iface
)
653 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
654 FIXME("(%p)\n", This
);
658 static HRESULT WINAPI
OleInPlaceObject_SetObjectRects(IOleInPlaceObject
*iface
,
659 LPCRECT lprcPosRect
, LPCRECT lprcClipRect
)
661 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
663 TRACE("(%p)->(%p %p)\n", This
, lprcPosRect
, lprcClipRect
);
665 This
->pos_rect
= *lprcPosRect
;
668 This
->clip_rect
= *lprcClipRect
;
670 if(This
->shell_embedding_hwnd
) {
671 SetWindowPos(This
->shell_embedding_hwnd
, NULL
,
672 lprcPosRect
->left
, lprcPosRect
->top
,
673 lprcPosRect
->right
-lprcPosRect
->left
,
674 lprcPosRect
->bottom
-lprcPosRect
->top
,
675 SWP_NOZORDER
| SWP_NOACTIVATE
);
681 static HRESULT WINAPI
OleInPlaceObject_ReactivateAndUndo(IOleInPlaceObject
*iface
)
683 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
684 FIXME("(%p)\n", This
);
688 #undef INPLACEOBJ_THIS
690 static const IOleInPlaceObjectVtbl OleInPlaceObjectVtbl
=
692 OleInPlaceObject_QueryInterface
,
693 OleInPlaceObject_AddRef
,
694 OleInPlaceObject_Release
,
695 OleInPlaceObject_GetWindow
,
696 OleInPlaceObject_ContextSensitiveHelp
,
697 OleInPlaceObject_InPlaceDeactivate
,
698 OleInPlaceObject_UIDeactivate
,
699 OleInPlaceObject_SetObjectRects
,
700 OleInPlaceObject_ReactivateAndUndo
703 /**********************************************************************
704 * Implement the IOleControl interface
707 #define CONTROL_THIS(iface) DEFINE_THIS(WebBrowser, OleControl, iface)
709 static HRESULT WINAPI
OleControl_QueryInterface(IOleControl
*iface
,
710 REFIID riid
, LPVOID
*ppobj
)
712 WebBrowser
*This
= CONTROL_THIS(iface
);
713 return IWebBrowser_QueryInterface(WEBBROWSER(This
), riid
, ppobj
);
716 static ULONG WINAPI
OleControl_AddRef(IOleControl
*iface
)
718 WebBrowser
*This
= CONTROL_THIS(iface
);
719 return IWebBrowser_AddRef(WEBBROWSER(This
));
722 static ULONG WINAPI
OleControl_Release(IOleControl
*iface
)
724 WebBrowser
*This
= CONTROL_THIS(iface
);
725 return IWebBrowser_Release(WEBBROWSER(This
));
728 static HRESULT WINAPI
OleControl_GetControlInfo(IOleControl
*iface
, LPCONTROLINFO pCI
)
730 WebBrowser
*This
= CONTROL_THIS(iface
);
732 TRACE("(%p)->(%p)\n", This
, pCI
);
734 /* Tests show that this function should be not implemented */
738 static HRESULT WINAPI
OleControl_OnMnemonic(IOleControl
*iface
, struct tagMSG
*pMsg
)
740 WebBrowser
*This
= CONTROL_THIS(iface
);
741 FIXME("(%p)->(%p)\n", This
, pMsg
);
745 static HRESULT WINAPI
OleControl_OnAmbientPropertyChange(IOleControl
*iface
, DISPID dispID
)
747 WebBrowser
*This
= CONTROL_THIS(iface
);
749 TRACE("(%p)->(%d)\n", This
, dispID
);
753 /* Unknown means multiple properties changed, so check them all.
754 * BUT the Webbrowser OleControl object doesn't appear to do this.
757 case DISPID_AMBIENT_DLCONTROL
:
759 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
:
760 return on_offlineconnected_change(This
);
761 case DISPID_AMBIENT_SILENT
:
762 return on_silent_change(This
);
765 FIXME("Unknown dispID %d\n", dispID
);
769 static HRESULT WINAPI
OleControl_FreezeEvents(IOleControl
*iface
, BOOL bFreeze
)
771 WebBrowser
*This
= CONTROL_THIS(iface
);
772 FIXME("(%p)->(%x)\n", This
, bFreeze
);
778 static const IOleControlVtbl OleControlVtbl
=
780 OleControl_QueryInterface
,
783 OleControl_GetControlInfo
,
784 OleControl_OnMnemonic
,
785 OleControl_OnAmbientPropertyChange
,
786 OleControl_FreezeEvents
789 #define ACTIVEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceActiveObject, iface)
791 static HRESULT WINAPI
InPlaceActiveObject_QueryInterface(IOleInPlaceActiveObject
*iface
,
792 REFIID riid
, void **ppv
)
794 WebBrowser
*This
= ACTIVEOBJ_THIS(iface
);
795 return IWebBrowser2_QueryInterface(WEBBROWSER2(This
), riid
, ppv
);
798 static ULONG WINAPI
InPlaceActiveObject_AddRef(IOleInPlaceActiveObject
*iface
)
800 WebBrowser
*This
= ACTIVEOBJ_THIS(iface
);
801 return IWebBrowser2_AddRef(WEBBROWSER2(This
));
804 static ULONG WINAPI
InPlaceActiveObject_Release(IOleInPlaceActiveObject
*iface
)
806 WebBrowser
*This
= ACTIVEOBJ_THIS(iface
);
807 return IWebBrowser2_Release(WEBBROWSER2(This
));
810 static HRESULT WINAPI
InPlaceActiveObject_GetWindow(IOleInPlaceActiveObject
*iface
,
813 WebBrowser
*This
= ACTIVEOBJ_THIS(iface
);
814 return IOleInPlaceObject_GetWindow(INPLACEOBJ(This
), phwnd
);
817 static HRESULT WINAPI
InPlaceActiveObject_ContextSensitiveHelp(IOleInPlaceActiveObject
*iface
,
820 WebBrowser
*This
= ACTIVEOBJ_THIS(iface
);
821 return IOleInPlaceObject_ContextSensitiveHelp(INPLACEOBJ(This
), fEnterMode
);
824 static HRESULT WINAPI
InPlaceActiveObject_TranslateAccelerator(IOleInPlaceActiveObject
*iface
,
827 WebBrowser
*This
= ACTIVEOBJ_THIS(iface
);
828 FIXME("(%p)->(%p)\n", This
, lpmsg
);
832 static HRESULT WINAPI
InPlaceActiveObject_OnFrameWindowActivate(IOleInPlaceActiveObject
*iface
,
835 WebBrowser
*This
= ACTIVEOBJ_THIS(iface
);
836 FIXME("(%p)->(%x)\n", This
, fActivate
);
840 static HRESULT WINAPI
InPlaceActiveObject_OnDocWindowActivate(IOleInPlaceActiveObject
*iface
,
843 WebBrowser
*This
= ACTIVEOBJ_THIS(iface
);
844 FIXME("(%p)->(%x)\n", This
, fActivate
);
848 static HRESULT WINAPI
InPlaceActiveObject_ResizeBorder(IOleInPlaceActiveObject
*iface
,
849 LPCRECT lprcBorder
, IOleInPlaceUIWindow
*pUIWindow
, BOOL fFrameWindow
)
851 WebBrowser
*This
= ACTIVEOBJ_THIS(iface
);
852 FIXME("(%p)->(%p %p %x)\n", This
, lprcBorder
, pUIWindow
, fFrameWindow
);
856 static HRESULT WINAPI
InPlaceActiveObject_EnableModeless(IOleInPlaceActiveObject
*iface
,
859 WebBrowser
*This
= ACTIVEOBJ_THIS(iface
);
860 FIXME("(%p)->(%x)\n", This
, fEnable
);
864 #undef ACTIVEOBJ_THIS
866 static const IOleInPlaceActiveObjectVtbl OleInPlaceActiveObjectVtbl
= {
867 InPlaceActiveObject_QueryInterface
,
868 InPlaceActiveObject_AddRef
,
869 InPlaceActiveObject_Release
,
870 InPlaceActiveObject_GetWindow
,
871 InPlaceActiveObject_ContextSensitiveHelp
,
872 InPlaceActiveObject_TranslateAccelerator
,
873 InPlaceActiveObject_OnFrameWindowActivate
,
874 InPlaceActiveObject_OnDocWindowActivate
,
875 InPlaceActiveObject_ResizeBorder
,
876 InPlaceActiveObject_EnableModeless
879 #define OLECMD_THIS(iface) DEFINE_THIS(WebBrowser, OleCommandTarget, iface)
881 static HRESULT WINAPI
WBOleCommandTarget_QueryInterface(IOleCommandTarget
*iface
,
882 REFIID riid
, void **ppv
)
884 WebBrowser
*This
= OLECMD_THIS(iface
);
885 return IWebBrowser2_QueryInterface(WEBBROWSER(This
), riid
, ppv
);
888 static ULONG WINAPI
WBOleCommandTarget_AddRef(IOleCommandTarget
*iface
)
890 WebBrowser
*This
= OLECMD_THIS(iface
);
891 return IWebBrowser2_AddRef(WEBBROWSER(This
));
894 static ULONG WINAPI
WBOleCommandTarget_Release(IOleCommandTarget
*iface
)
896 WebBrowser
*This
= OLECMD_THIS(iface
);
897 return IWebBrowser2_Release(WEBBROWSER(This
));
900 static HRESULT WINAPI
WBOleCommandTarget_QueryStatus(IOleCommandTarget
*iface
,
901 const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
903 WebBrowser
*This
= OLECMD_THIS(iface
);
904 IOleCommandTarget
*cmdtrg
;
907 TRACE("(%p)->(%s %u %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
,
910 if(!This
->doc_host
.document
)
913 /* NOTE: There are probably some commands that we should handle here
914 * instead of forwarding to document object. */
916 hres
= IUnknown_QueryInterface(This
->doc_host
.document
, &IID_IOleCommandTarget
, (void**)&cmdtrg
);
920 hres
= IOleCommandTarget_QueryStatus(cmdtrg
, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
921 IOleCommandTarget_Release(cmdtrg
);
926 static HRESULT WINAPI
WBOleCommandTarget_Exec(IOleCommandTarget
*iface
,
927 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
,
930 WebBrowser
*This
= OLECMD_THIS(iface
);
931 FIXME("(%p)->(%s %d %d %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), nCmdID
,
932 nCmdexecopt
, pvaIn
, pvaOut
);
938 static const IOleCommandTargetVtbl OleCommandTargetVtbl
= {
939 WBOleCommandTarget_QueryInterface
,
940 WBOleCommandTarget_AddRef
,
941 WBOleCommandTarget_Release
,
942 WBOleCommandTarget_QueryStatus
,
943 WBOleCommandTarget_Exec
946 void WebBrowser_OleObject_Init(WebBrowser
*This
)
952 /* default aspect ratio is 96dpi / 96dpi */
954 dpi_x
= GetDeviceCaps(hdc
, LOGPIXELSX
);
955 dpi_y
= GetDeviceCaps(hdc
, LOGPIXELSY
);
958 This
->lpOleObjectVtbl
= &OleObjectVtbl
;
959 This
->lpOleInPlaceObjectVtbl
= &OleInPlaceObjectVtbl
;
960 This
->lpOleControlVtbl
= &OleControlVtbl
;
961 This
->lpOleInPlaceActiveObjectVtbl
= &OleInPlaceActiveObjectVtbl
;
962 This
->lpOleCommandTargetVtbl
= &OleCommandTargetVtbl
;
964 /* Default size is 50x20 pixels, in himetric units */
965 This
->extent
.cx
= MulDiv( 50, 2540, dpi_x
);
966 This
->extent
.cy
= MulDiv( 20, 2540, dpi_y
);
969 void WebBrowser_OleObject_Destroy(WebBrowser
*This
)
971 release_client_site(This
);