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 /**********************************************************************
33 * Implement the IOleObject interface for the WebBrowser control
36 #define OLEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleObject, iface)
38 static HRESULT WINAPI
OleObject_QueryInterface(IOleObject
*iface
, REFIID riid
, void **ppv
)
40 WebBrowser
*This
= OLEOBJ_THIS(iface
);
41 return IWebBrowser_QueryInterface(WEBBROWSER(This
), riid
, ppv
);
44 static ULONG WINAPI
OleObject_AddRef(IOleObject
*iface
)
46 WebBrowser
*This
= OLEOBJ_THIS(iface
);
47 return IWebBrowser_AddRef(WEBBROWSER(This
));
50 static ULONG WINAPI
OleObject_Release(IOleObject
*iface
)
52 WebBrowser
*This
= OLEOBJ_THIS(iface
);
53 return IWebBrowser_Release(WEBBROWSER(This
));
56 static HRESULT WINAPI
OleObject_SetClientSite(IOleObject
*iface
, LPOLECLIENTSITE pClientSite
)
58 WebBrowser
*This
= OLEOBJ_THIS(iface
);
60 TRACE("(%p)->(%p)\n", This
, pClientSite
);
62 if(This
->client
== pClientSite
)
66 IOleClientSite_Release(This
->client
);
69 IOleClientSite_AddRef(pClientSite
);
71 This
->client
= pClientSite
;
75 static HRESULT WINAPI
OleObject_GetClientSite(IOleObject
*iface
, LPOLECLIENTSITE
*ppClientSite
)
77 WebBrowser
*This
= OLEOBJ_THIS(iface
);
79 TRACE("(%p)->(%p)\n", This
, ppClientSite
);
85 IOleClientSite_AddRef(This
->client
);
86 *ppClientSite
= This
->client
;
91 static HRESULT WINAPI
OleObject_SetHostNames(IOleObject
*iface
, LPCOLESTR szContainerApp
,
92 LPCOLESTR szContainerObj
)
94 WebBrowser
*This
= OLEOBJ_THIS(iface
);
95 FIXME("(%p)->(%s, %s)\n", This
, debugstr_w(szContainerApp
), debugstr_w(szContainerObj
));
99 static HRESULT WINAPI
OleObject_Close(IOleObject
*iface
, DWORD dwSaveOption
)
101 WebBrowser
*This
= OLEOBJ_THIS(iface
);
102 FIXME("(%p)->(%ld)\n", This
, dwSaveOption
);
106 static HRESULT WINAPI
OleObject_SetMoniker(IOleObject
*iface
, DWORD dwWhichMoniker
, IMoniker
* pmk
)
108 WebBrowser
*This
= OLEOBJ_THIS(iface
);
109 FIXME("(%p)->(%ld, %p)\n", This
, dwWhichMoniker
, pmk
);
113 static HRESULT WINAPI
OleObject_GetMoniker(IOleObject
*iface
, DWORD dwAssign
,
114 DWORD dwWhichMoniker
, LPMONIKER
*ppmk
)
116 WebBrowser
*This
= OLEOBJ_THIS(iface
);
117 FIXME("(%p)->(%ld, %ld, %p)\n", This
, dwAssign
, dwWhichMoniker
, ppmk
);
121 static HRESULT WINAPI
OleObject_InitFromData(IOleObject
*iface
, LPDATAOBJECT pDataObject
,
122 BOOL fCreation
, DWORD dwReserved
)
124 WebBrowser
*This
= OLEOBJ_THIS(iface
);
125 FIXME("(%p)->(%p, %d, %ld)\n", This
, pDataObject
, fCreation
, dwReserved
);
129 static HRESULT WINAPI
OleObject_GetClipboardData(IOleObject
*iface
, DWORD dwReserved
,
130 LPDATAOBJECT
*ppDataObject
)
132 WebBrowser
*This
= OLEOBJ_THIS(iface
);
133 FIXME("(%p)->(%ld, %p)\n", This
, dwReserved
, ppDataObject
);
137 static HRESULT WINAPI
OleObject_DoVerb(IOleObject
*iface
, LONG iVerb
, struct tagMSG
* lpmsg
,
138 LPOLECLIENTSITE pActiveSite
, LONG lindex
, HWND hwndParent
, LPCRECT lprcPosRect
)
140 WebBrowser
*This
= OLEOBJ_THIS(iface
);
143 TRACE("(%p)->(%ld %p %p %ld %p %p)\n", This
, iVerb
, lpmsg
, pActiveSite
, lindex
, hwndParent
,
148 case OLEIVERB_INPLACEACTIVATE
: {
149 IOleInPlaceSite
*inplace
;
151 TRACE("OLEIVERB_INPLACEACTIVATE\n");
156 hres
= IOleClientSite_QueryInterface(pActiveSite
, &IID_IOleInPlaceSite
, (void**)&inplace
);
158 WARN("Could not get IOleInPlaceSite\n");
162 hres
= IOleInPlaceSite_CanInPlaceActivate(inplace
);
164 WARN("CanInPlaceActivate returned: %08lx\n", hres
);
165 IOleInPlaceSite_Release(inplace
);
169 hres
= IOleInPlaceSite_GetWindow(inplace
, &This
->iphwnd
);
171 This
->iphwnd
= hwndParent
;
173 IOleInPlaceSite_OnInPlaceActivate(inplace
);
175 IOleInPlaceSite_GetWindowContext(inplace
, &This
->frame
, &This
->uiwindow
,
176 &This
->pos_rect
, &This
->clip_rect
,
179 IOleInPlaceSite_Release(inplace
);
182 IOleClientSite_ShowObject(This
->client
);
183 IOleClientSite_GetContainer(This
->client
, &This
->container
);
187 IOleInPlaceFrame_GetWindow(This
->frame
, &This
->frame_hwnd
);
192 FIXME("stub for %ld\n", iVerb
);
199 static HRESULT WINAPI
OleObject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**ppEnumOleVerb
)
201 WebBrowser
*This
= OLEOBJ_THIS(iface
);
202 TRACE("(%p)->(%p)\n", This
, ppEnumOleVerb
);
203 return OleRegEnumVerbs(&CLSID_WebBrowser
, ppEnumOleVerb
);
206 static HRESULT WINAPI
OleObject_Update(IOleObject
*iface
)
208 WebBrowser
*This
= OLEOBJ_THIS(iface
);
209 FIXME("(%p)\n", This
);
213 static HRESULT WINAPI
OleObject_IsUpToDate(IOleObject
*iface
)
215 WebBrowser
*This
= OLEOBJ_THIS(iface
);
216 FIXME("(%p)\n", This
);
220 static HRESULT WINAPI
OleObject_GetUserClassID(IOleObject
*iface
, CLSID
* pClsid
)
222 WebBrowser
*This
= OLEOBJ_THIS(iface
);
223 FIXME("(%p)->(%p)\n", This
, pClsid
);
227 static HRESULT WINAPI
OleObject_GetUserType(IOleObject
*iface
, DWORD dwFormOfType
,
228 LPOLESTR
* pszUserType
)
230 WebBrowser
*This
= OLEOBJ_THIS(iface
);
231 TRACE("(%p, %ld, %p)\n", This
, dwFormOfType
, pszUserType
);
232 return OleRegGetUserType(&CLSID_WebBrowser
, dwFormOfType
, pszUserType
);
235 static HRESULT WINAPI
OleObject_SetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
237 WebBrowser
*This
= OLEOBJ_THIS(iface
);
238 FIXME("(%p)->(%lx %p)\n", This
, dwDrawAspect
, psizel
);
242 static HRESULT WINAPI
OleObject_GetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
244 WebBrowser
*This
= OLEOBJ_THIS(iface
);
245 FIXME("(%p)->(%lx, %p)\n", This
, dwDrawAspect
, psizel
);
249 static HRESULT WINAPI
OleObject_Advise(IOleObject
*iface
, IAdviseSink
*pAdvSink
,
250 DWORD
* pdwConnection
)
252 WebBrowser
*This
= OLEOBJ_THIS(iface
);
253 FIXME("(%p)->(%p, %p)\n", This
, pAdvSink
, pdwConnection
);
257 static HRESULT WINAPI
OleObject_Unadvise(IOleObject
*iface
, DWORD dwConnection
)
259 WebBrowser
*This
= OLEOBJ_THIS(iface
);
260 FIXME("(%p)->(%ld)\n", This
, dwConnection
);
264 static HRESULT WINAPI
OleObject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**ppenumAdvise
)
266 WebBrowser
*This
= OLEOBJ_THIS(iface
);
267 FIXME("(%p)->(%p)\n", This
, ppenumAdvise
);
271 static HRESULT WINAPI
OleObject_GetMiscStatus(IOleObject
*iface
, DWORD dwAspect
, DWORD
*pdwStatus
)
273 WebBrowser
*This
= OLEOBJ_THIS(iface
);
276 TRACE("(%p)->(%lx, %p)\n", This
, dwAspect
, pdwStatus
);
278 hres
= OleRegGetMiscStatus(&CLSID_WebBrowser
, dwAspect
, pdwStatus
);
286 static HRESULT WINAPI
OleObject_SetColorScheme(IOleObject
*iface
, LOGPALETTE
* pLogpal
)
288 WebBrowser
*This
= OLEOBJ_THIS(iface
);
289 FIXME("(%p)->(%p)\n", This
, pLogpal
);
295 static const IOleObjectVtbl OleObjectVtbl
=
297 OleObject_QueryInterface
,
300 OleObject_SetClientSite
,
301 OleObject_GetClientSite
,
302 OleObject_SetHostNames
,
304 OleObject_SetMoniker
,
305 OleObject_GetMoniker
,
306 OleObject_InitFromData
,
307 OleObject_GetClipboardData
,
311 OleObject_IsUpToDate
,
312 OleObject_GetUserClassID
,
313 OleObject_GetUserType
,
318 OleObject_EnumAdvise
,
319 OleObject_GetMiscStatus
,
320 OleObject_SetColorScheme
323 /**********************************************************************
324 * Implement the IOleInPlaceObject interface
327 #define INPLACEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceObject, iface)
329 static HRESULT WINAPI
OleInPlaceObject_QueryInterface(IOleInPlaceObject
*iface
,
330 REFIID riid
, LPVOID
*ppobj
)
332 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
333 return IWebBrowser_QueryInterface(WEBBROWSER(This
), riid
, ppobj
);
336 static ULONG WINAPI
OleInPlaceObject_AddRef(IOleInPlaceObject
*iface
)
338 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
339 return IWebBrowser_AddRef(WEBBROWSER(This
));
342 static ULONG WINAPI
OleInPlaceObject_Release(IOleInPlaceObject
*iface
)
344 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
345 return IWebBrowser_Release(WEBBROWSER(This
));
348 static HRESULT WINAPI
OleInPlaceObject_GetWindow(IOleInPlaceObject
*iface
, HWND
* phwnd
)
350 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
352 FIXME("(%p)->(%p)\n", This
, phwnd
);
355 /* Create a fake window to fool MFC into believing that we actually
356 * have an implemented browser control. Avoids the assertion.
359 hwnd
= CreateWindowA("BUTTON", "Web Control",
360 WS_HSCROLL
| WS_VSCROLL
| WS_OVERLAPPEDWINDOW
,
361 CW_USEDEFAULT
, CW_USEDEFAULT
, 600,
362 400, NULL
, NULL
, NULL
, NULL
);
365 TRACE ("Returning hwnd = %d\n", hwnd
);
371 static HRESULT WINAPI
OleInPlaceObject_ContextSensitiveHelp(IOleInPlaceObject
*iface
,
374 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
375 FIXME("(%p)->(%x)\n", This
, fEnterMode
);
379 static HRESULT WINAPI
OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject
*iface
)
381 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
382 FIXME("(%p)\n", This
);
386 static HRESULT WINAPI
OleInPlaceObject_UIDeactivate(IOleInPlaceObject
*iface
)
388 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
389 FIXME("(%p)\n", This
);
393 static HRESULT WINAPI
OleInPlaceObject_SetObjectRects(IOleInPlaceObject
*iface
,
394 LPCRECT lprcPosRect
, LPCRECT lprcClipRect
)
396 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
397 FIXME("(%p)->(%p %p)\n", This
, lprcPosRect
, lprcClipRect
);
401 static HRESULT WINAPI
OleInPlaceObject_ReactivateAndUndo(IOleInPlaceObject
*iface
)
403 WebBrowser
*This
= INPLACEOBJ_THIS(iface
);
404 FIXME("(%p)\n", This
);
408 #undef INPLACEOBJ_THIS
410 static const IOleInPlaceObjectVtbl OleInPlaceObjectVtbl
=
412 OleInPlaceObject_QueryInterface
,
413 OleInPlaceObject_AddRef
,
414 OleInPlaceObject_Release
,
415 OleInPlaceObject_GetWindow
,
416 OleInPlaceObject_ContextSensitiveHelp
,
417 OleInPlaceObject_InPlaceDeactivate
,
418 OleInPlaceObject_UIDeactivate
,
419 OleInPlaceObject_SetObjectRects
,
420 OleInPlaceObject_ReactivateAndUndo
423 /**********************************************************************
424 * Implement the IOleControl interface
427 #define CONTROL_THIS(iface) DEFINE_THIS(WebBrowser, OleControl, iface)
429 static HRESULT WINAPI
OleControl_QueryInterface(IOleControl
*iface
,
430 REFIID riid
, LPVOID
*ppobj
)
432 WebBrowser
*This
= CONTROL_THIS(iface
);
433 return IWebBrowser_QueryInterface(WEBBROWSER(This
), riid
, ppobj
);
436 static ULONG WINAPI
OleControl_AddRef(IOleControl
*iface
)
438 WebBrowser
*This
= CONTROL_THIS(iface
);
439 return IWebBrowser_AddRef(WEBBROWSER(This
));
442 static ULONG WINAPI
OleControl_Release(IOleControl
*iface
)
444 WebBrowser
*This
= CONTROL_THIS(iface
);
445 return IWebBrowser_Release(WEBBROWSER(This
));
448 static HRESULT WINAPI
OleControl_GetControlInfo(IOleControl
*iface
, LPCONTROLINFO pCI
)
450 WebBrowser
*This
= CONTROL_THIS(iface
);
451 FIXME("(%p)->(%p)\n", This
, pCI
);
455 static HRESULT WINAPI
OleControl_OnMnemonic(IOleControl
*iface
, struct tagMSG
*pMsg
)
457 WebBrowser
*This
= CONTROL_THIS(iface
);
458 FIXME("(%p)->(%p)\n", This
, pMsg
);
462 static HRESULT WINAPI
OleControl_OnAmbientPropertyChange(IOleControl
*iface
, DISPID dispID
)
464 WebBrowser
*This
= CONTROL_THIS(iface
);
465 FIXME("(%p)->(%ld)\n", This
, dispID
);
469 static HRESULT WINAPI
OleControl_FreezeEvents(IOleControl
*iface
, BOOL bFreeze
)
471 WebBrowser
*This
= CONTROL_THIS(iface
);
472 FIXME("(%p)->(%x)\n", This
, bFreeze
);
478 static const IOleControlVtbl OleControlVtbl
=
480 OleControl_QueryInterface
,
483 OleControl_GetControlInfo
,
484 OleControl_OnMnemonic
,
485 OleControl_OnAmbientPropertyChange
,
486 OleControl_FreezeEvents
489 void WebBrowser_OleObject_Init(WebBrowser
*This
)
491 This
->lpOleObjectVtbl
= &OleObjectVtbl
;
492 This
->lpOleInPlaceObjectVtbl
= &OleInPlaceObjectVtbl
;
493 This
->lpOleControlVtbl
= &OleControlVtbl
;
496 This
->container
= NULL
;
498 This
->frame_hwnd
= NULL
;
500 This
->uiwindow
= NULL
;
502 memset(&This
->pos_rect
, 0, sizeof(RECT
));
503 memset(&This
->clip_rect
, 0, sizeof(RECT
));
504 memset(&This
->frameinfo
, 0, sizeof(OLEINPLACEFRAMEINFO
));
507 void WebBrowser_OleObject_Destroy(WebBrowser
*This
)
510 IOleClientSite_Release(This
->client
);
512 IOleContainer_Release(This
->container
);
514 IOleInPlaceFrame_Release(This
->frame
);
516 IOleInPlaceUIWindow_Release(This
->uiwindow
);