dbghelp: Implemented TI_GET_COUNT in SymGetTypeInfo for function.
[wine] / dlls / shdocvw / oleobject.c
1 /*
2  * Implementation of IOleObject interfaces for WebBrowser control
3  *
4  * - IOleObject
5  * - IOleInPlaceObject
6  * - IOleControl
7  *
8  * Copyright 2001 John R. Sheets (for CodeWeavers)
9  * Copyright 2005 Jacek Caban
10  *
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.
15  *
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.
20  *
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
24  */
25
26 #include <string.h>
27 #include "wine/debug.h"
28 #include "shdocvw.h"
29
30 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
31
32 static ATOM shell_embedding_atom = 0;
33
34 static LRESULT resize_window(WebBrowser *This, LONG width, LONG height)
35 {
36     if(This->doc_view_hwnd)
37         SetWindowPos(This->doc_view_hwnd, NULL, 0, 0, width, height,
38                      SWP_NOZORDER | SWP_NOACTIVATE);
39
40     return 0;
41 }
42
43 static LRESULT WINAPI shell_embedding_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
44 {
45     WebBrowser *This;
46
47     static const WCHAR wszTHIS[] = {'T','H','I','S',0};
48
49     if(msg == WM_CREATE) {
50         This = *(WebBrowser**)lParam;
51         SetPropW(hwnd, wszTHIS, This);
52     }else {
53         This = GetPropW(hwnd, wszTHIS);
54     }
55
56     switch(msg) {
57     case WM_SIZE:
58         return resize_window(This, LOWORD(lParam), HIWORD(lParam));
59     }
60
61     return DefWindowProcA(hwnd, msg, wParam, lParam);
62 }
63
64 static void create_shell_embedding_hwnd(WebBrowser *This)
65 {
66     IOleInPlaceSite *inplace;
67     HWND parent = NULL;
68     HRESULT hres;
69
70     static const WCHAR wszShellEmbedding[] =
71         {'S','h','e','l','l',' ','E','m','b','e','d','d','i','n','g',0};
72
73     if(!shell_embedding_atom) {
74         static WNDCLASSEXW wndclass = {
75             sizeof(wndclass),
76             CS_DBLCLKS,
77             shell_embedding_proc,
78             0, 0 /* native uses 8 */, NULL, NULL, NULL,
79             (HBRUSH)COLOR_WINDOWFRAME, NULL,
80             wszShellEmbedding,
81             NULL
82         };
83         wndclass.hInstance = shdocvw_hinstance;
84
85         RegisterClassExW(&wndclass);
86     }
87
88     hres = IOleClientSite_QueryInterface(This->client, &IID_IOleInPlaceSite, (void**)&inplace);
89     if(SUCCEEDED(hres)) {
90         IOleInPlaceSite_GetWindow(inplace, &parent);
91         IOleInPlaceSite_Release(inplace);
92     }
93
94     This->shell_embedding_hwnd = CreateWindowExW(0, wszShellEmbedding, wszShellEmbedding,
95          WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP | WS_MAXIMIZEBOX,
96          0, 0, 0, 0, parent,
97          NULL, shdocvw_hinstance, This);
98 }
99
100 /**********************************************************************
101  * Implement the IOleObject interface for the WebBrowser control
102  */
103
104 #define OLEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleObject, iface)
105
106 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
107 {
108     WebBrowser *This = OLEOBJ_THIS(iface);
109     return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppv);
110 }
111
112 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
113 {
114     WebBrowser *This = OLEOBJ_THIS(iface);
115     return IWebBrowser_AddRef(WEBBROWSER(This));
116 }
117
118 static ULONG WINAPI OleObject_Release(IOleObject *iface)
119 {
120     WebBrowser *This = OLEOBJ_THIS(iface);
121     return IWebBrowser_Release(WEBBROWSER(This));
122 }
123
124 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE pClientSite)
125 {
126     WebBrowser *This = OLEOBJ_THIS(iface);
127     HRESULT hres;
128
129     TRACE("(%p)->(%p)\n", This, pClientSite);
130
131     if(This->client == pClientSite)
132         return S_OK;
133
134     if(This->doc_view_hwnd) {
135         DestroyWindow(This->doc_view_hwnd);
136         This->doc_view_hwnd = NULL;
137     }
138     if(This->shell_embedding_hwnd) {
139         DestroyWindow(This->shell_embedding_hwnd);
140         This->shell_embedding_hwnd = NULL;
141     }
142
143     if(This->hostui)
144         IDocHostUIHandler_Release(This->hostui);
145     if(This->client)
146         IOleClientSite_Release(This->client);
147
148     if(!pClientSite) {
149         if(This->document)
150             deactivate_document(This);
151         This->client = NULL;
152         return S_OK;
153     }
154
155     This->client = pClientSite;
156     IOleClientSite_AddRef(pClientSite);
157
158     hres = IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler,
159                                          (void**)&This->hostui);
160     if(FAILED(hres))
161         This->hostui = NULL;
162
163     create_shell_embedding_hwnd(This);
164
165     return S_OK;
166 }
167
168 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, LPOLECLIENTSITE *ppClientSite)
169 {
170     WebBrowser *This = OLEOBJ_THIS(iface);
171
172     TRACE("(%p)->(%p)\n", This, ppClientSite);
173
174     if(!ppClientSite)
175         return E_INVALIDARG;
176
177     if(This->client)
178         IOleClientSite_AddRef(This->client);
179     *ppClientSite = This->client;
180
181     return S_OK;
182 }
183
184 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp,
185         LPCOLESTR szContainerObj)
186 {
187     WebBrowser *This = OLEOBJ_THIS(iface);
188     FIXME("(%p)->(%s, %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
189     return E_NOTIMPL;
190 }
191
192 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
193 {
194     WebBrowser *This = OLEOBJ_THIS(iface);
195     FIXME("(%p)->(%ld)\n", This, dwSaveOption);
196     return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker* pmk)
200 {
201     WebBrowser *This = OLEOBJ_THIS(iface);
202     FIXME("(%p)->(%ld, %p)\n", This, dwWhichMoniker, pmk);
203     return E_NOTIMPL;
204 }
205
206 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign,
207         DWORD dwWhichMoniker, LPMONIKER *ppmk)
208 {
209     WebBrowser *This = OLEOBJ_THIS(iface);
210     FIXME("(%p)->(%ld, %ld, %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
211     return E_NOTIMPL;
212 }
213
214 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, LPDATAOBJECT pDataObject,
215         BOOL fCreation, DWORD dwReserved)
216 {
217     WebBrowser *This = OLEOBJ_THIS(iface);
218     FIXME("(%p)->(%p, %d, %ld)\n", This, pDataObject, fCreation, dwReserved);
219     return E_NOTIMPL;
220 }
221
222 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved,
223         LPDATAOBJECT *ppDataObject)
224 {
225     WebBrowser *This = OLEOBJ_THIS(iface);
226     FIXME("(%p)->(%ld, %p)\n", This, dwReserved, ppDataObject);
227     return E_NOTIMPL;
228 }
229
230 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, struct tagMSG* lpmsg,
231         LPOLECLIENTSITE pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
232 {
233     WebBrowser *This = OLEOBJ_THIS(iface);
234     HRESULT hres;
235
236     static const WCHAR wszitem[] = {'i','t','e','m',0};
237
238     TRACE("(%p)->(%ld %p %p %ld %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent,
239             lprcPosRect);
240
241     switch (iVerb)
242     {
243     case OLEIVERB_SHOW:
244     case OLEIVERB_INPLACEACTIVATE: {
245         IOleInPlaceSite *inplace;
246
247         TRACE("OLEIVERB_INPLACEACTIVATE\n");
248
249         if(!pActiveSite)
250             return E_INVALIDARG;
251
252         hres = IOleClientSite_QueryInterface(pActiveSite, &IID_IOleInPlaceSite, (void**)&inplace);
253         if(FAILED(hres)) {
254             WARN("Could not get IOleInPlaceSite\n");
255             return hres;
256         }
257
258         hres = IOleInPlaceSite_CanInPlaceActivate(inplace);
259         if(hres != S_OK) {
260             WARN("CanInPlaceActivate returned: %08lx\n", hres);
261             IOleInPlaceSite_Release(inplace);
262             return E_FAIL;
263         }
264
265         hres = IOleInPlaceSite_GetWindow(inplace, &This->iphwnd);
266         if(FAILED(hres))
267             This->iphwnd = hwndParent;
268
269         IOleInPlaceSite_OnInPlaceActivate(inplace);
270
271         IOleInPlaceSite_GetWindowContext(inplace, &This->frame, &This->uiwindow,
272                                          &This->pos_rect, &This->clip_rect,
273                                          &This->frameinfo);
274
275
276         if(iVerb == OLEIVERB_INPLACEACTIVATE)
277             IOleInPlaceSite_Release(inplace);
278
279         SetWindowPos(This->shell_embedding_hwnd, NULL,
280                      This->pos_rect.left, This->pos_rect.top,
281                      This->pos_rect.right-This->pos_rect.left,
282                      This->pos_rect.bottom-This->pos_rect.top,
283                      SWP_NOZORDER | SWP_SHOWWINDOW);
284
285         if(This->client) {
286             IOleClientSite_ShowObject(This->client);
287             IOleClientSite_GetContainer(This->client, &This->container);
288         }
289
290         if(This->frame)
291             IOleInPlaceFrame_GetWindow(This->frame, &This->frame_hwnd);
292
293         if(iVerb == OLEIVERB_INPLACEACTIVATE)
294             return S_OK;
295
296         TRACE("OLEIVERB_SHOW\n");
297
298         IOleInPlaceSite_OnUIActivate(inplace);
299         IOleInPlaceSite_Release(inplace);
300
301         IOleInPlaceFrame_SetActiveObject(This->frame, ACTIVEOBJ(This), wszitem);
302
303         /* TODO:
304          * IOleInPlaceFrmae_SetMenu
305          */
306
307         return S_OK;
308     }
309     default:
310         FIXME("stub for %ld\n", iVerb);
311         break;
312     }
313
314     return E_NOTIMPL;
315 }
316
317 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
318 {
319     WebBrowser *This = OLEOBJ_THIS(iface);
320     TRACE("(%p)->(%p)\n", This, ppEnumOleVerb);
321     return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb);
322 }
323
324 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
325 {
326     WebBrowser *This = OLEOBJ_THIS(iface);
327     FIXME("(%p)\n", This);
328     return E_NOTIMPL;
329 }
330
331 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
332 {
333     WebBrowser *This = OLEOBJ_THIS(iface);
334     FIXME("(%p)\n", This);
335     return E_NOTIMPL;
336 }
337
338 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID* pClsid)
339 {
340     WebBrowser *This = OLEOBJ_THIS(iface);
341     FIXME("(%p)->(%p)\n", This, pClsid);
342     return E_NOTIMPL;
343 }
344
345 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType,
346         LPOLESTR* pszUserType)
347 {
348     WebBrowser *This = OLEOBJ_THIS(iface);
349     TRACE("(%p, %ld, %p)\n", This, dwFormOfType, pszUserType);
350     return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType);
351 }
352
353 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
354 {
355     WebBrowser *This = OLEOBJ_THIS(iface);
356     FIXME("(%p)->(%lx %p)\n", This, dwDrawAspect, psizel);
357     return E_NOTIMPL;
358 }
359
360 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
361 {
362     WebBrowser *This = OLEOBJ_THIS(iface);
363     FIXME("(%p)->(%lx, %p)\n", This, dwDrawAspect, psizel);
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink,
368         DWORD* pdwConnection)
369 {
370     WebBrowser *This = OLEOBJ_THIS(iface);
371     FIXME("(%p)->(%p, %p)\n", This, pAdvSink, pdwConnection);
372     return E_NOTIMPL;
373 }
374
375 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
376 {
377     WebBrowser *This = OLEOBJ_THIS(iface);
378     FIXME("(%p)->(%ld)\n", This, dwConnection);
379     return E_NOTIMPL;
380 }
381
382 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
383 {
384     WebBrowser *This = OLEOBJ_THIS(iface);
385     FIXME("(%p)->(%p)\n", This, ppenumAdvise);
386     return S_OK;
387 }
388
389 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
390 {
391     WebBrowser *This = OLEOBJ_THIS(iface);
392     HRESULT hres;
393
394     TRACE("(%p)->(%lx, %p)\n", This, dwAspect, pdwStatus);
395
396     hres = OleRegGetMiscStatus(&CLSID_WebBrowser, dwAspect, pdwStatus);
397
398     if (FAILED(hres))
399         *pdwStatus = 0;
400
401     return S_OK;
402 }
403
404 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE* pLogpal)
405 {
406     WebBrowser *This = OLEOBJ_THIS(iface);
407     FIXME("(%p)->(%p)\n", This, pLogpal);
408     return E_NOTIMPL;
409 }
410
411 #undef OLEOBJ_THIS
412
413 static const IOleObjectVtbl OleObjectVtbl =
414 {
415     OleObject_QueryInterface,
416     OleObject_AddRef,
417     OleObject_Release,
418     OleObject_SetClientSite,
419     OleObject_GetClientSite,
420     OleObject_SetHostNames,
421     OleObject_Close,
422     OleObject_SetMoniker,
423     OleObject_GetMoniker,
424     OleObject_InitFromData,
425     OleObject_GetClipboardData,
426     OleObject_DoVerb,
427     OleObject_EnumVerbs,
428     OleObject_Update,
429     OleObject_IsUpToDate,
430     OleObject_GetUserClassID,
431     OleObject_GetUserType,
432     OleObject_SetExtent,
433     OleObject_GetExtent,
434     OleObject_Advise,
435     OleObject_Unadvise,
436     OleObject_EnumAdvise,
437     OleObject_GetMiscStatus,
438     OleObject_SetColorScheme
439 };
440
441 /**********************************************************************
442  * Implement the IOleInPlaceObject interface
443  */
444
445 #define INPLACEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceObject, iface)
446
447 static HRESULT WINAPI OleInPlaceObject_QueryInterface(IOleInPlaceObject *iface,
448         REFIID riid, LPVOID *ppobj)
449 {
450     WebBrowser *This = INPLACEOBJ_THIS(iface);
451     return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj);
452 }
453
454 static ULONG WINAPI OleInPlaceObject_AddRef(IOleInPlaceObject *iface)
455 {
456     WebBrowser *This = INPLACEOBJ_THIS(iface);
457     return IWebBrowser_AddRef(WEBBROWSER(This));
458 }
459
460 static ULONG WINAPI OleInPlaceObject_Release(IOleInPlaceObject *iface)
461 {
462     WebBrowser *This = INPLACEOBJ_THIS(iface);
463     return IWebBrowser_Release(WEBBROWSER(This));
464 }
465
466 static HRESULT WINAPI OleInPlaceObject_GetWindow(IOleInPlaceObject *iface, HWND* phwnd)
467 {
468     WebBrowser *This = INPLACEOBJ_THIS(iface);
469
470     TRACE("(%p)->(%p)\n", This, phwnd);
471
472     *phwnd = This->shell_embedding_hwnd;
473     return S_OK;
474 }
475
476 static HRESULT WINAPI OleInPlaceObject_ContextSensitiveHelp(IOleInPlaceObject *iface,
477         BOOL fEnterMode)
478 {
479     WebBrowser *This = INPLACEOBJ_THIS(iface);
480     FIXME("(%p)->(%x)\n", This, fEnterMode);
481     return E_NOTIMPL;
482 }
483
484 static HRESULT WINAPI OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject *iface)
485 {
486     WebBrowser *This = INPLACEOBJ_THIS(iface);
487     FIXME("(%p)\n", This);
488     return E_NOTIMPL;
489 }
490
491 static HRESULT WINAPI OleInPlaceObject_UIDeactivate(IOleInPlaceObject *iface)
492 {
493     WebBrowser *This = INPLACEOBJ_THIS(iface);
494     FIXME("(%p)\n", This);
495     return E_NOTIMPL;
496 }
497
498 static HRESULT WINAPI OleInPlaceObject_SetObjectRects(IOleInPlaceObject *iface,
499         LPCRECT lprcPosRect, LPCRECT lprcClipRect)
500 {
501     WebBrowser *This = INPLACEOBJ_THIS(iface);
502
503     TRACE("(%p)->(%p %p)\n", This, lprcPosRect, lprcClipRect);
504
505     if(This->shell_embedding_hwnd) {
506         SetWindowPos(This->shell_embedding_hwnd, NULL,
507                      lprcPosRect->left, lprcPosRect->top,
508                      lprcPosRect->right-lprcPosRect->left,
509                      lprcPosRect->bottom-lprcPosRect->top,
510                      SWP_NOZORDER | SWP_NOACTIVATE);
511     }
512
513     return S_OK;
514 }
515
516 static HRESULT WINAPI OleInPlaceObject_ReactivateAndUndo(IOleInPlaceObject *iface)
517 {
518     WebBrowser *This = INPLACEOBJ_THIS(iface);
519     FIXME("(%p)\n", This);
520     return E_NOTIMPL;
521 }
522
523 #undef INPLACEOBJ_THIS
524
525 static const IOleInPlaceObjectVtbl OleInPlaceObjectVtbl =
526 {
527     OleInPlaceObject_QueryInterface,
528     OleInPlaceObject_AddRef,
529     OleInPlaceObject_Release,
530     OleInPlaceObject_GetWindow,
531     OleInPlaceObject_ContextSensitiveHelp,
532     OleInPlaceObject_InPlaceDeactivate,
533     OleInPlaceObject_UIDeactivate,
534     OleInPlaceObject_SetObjectRects,
535     OleInPlaceObject_ReactivateAndUndo
536 };
537
538 /**********************************************************************
539  * Implement the IOleControl interface
540  */
541
542 #define CONTROL_THIS(iface) DEFINE_THIS(WebBrowser, OleControl, iface)
543
544 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface,
545         REFIID riid, LPVOID *ppobj)
546 {
547     WebBrowser *This = CONTROL_THIS(iface);
548     return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj);
549 }
550
551 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
552 {
553     WebBrowser *This = CONTROL_THIS(iface);
554     return IWebBrowser_AddRef(WEBBROWSER(This));
555 }
556
557 static ULONG WINAPI OleControl_Release(IOleControl *iface)
558 {
559     WebBrowser *This = CONTROL_THIS(iface);
560     return IWebBrowser_Release(WEBBROWSER(This));
561 }
562
563 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, LPCONTROLINFO pCI)
564 {
565     WebBrowser *This = CONTROL_THIS(iface);
566     FIXME("(%p)->(%p)\n", This, pCI);
567     return E_NOTIMPL;
568 }
569
570 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, struct tagMSG *pMsg)
571 {
572     WebBrowser *This = CONTROL_THIS(iface);
573     FIXME("(%p)->(%p)\n", This, pMsg);
574     return E_NOTIMPL;
575 }
576
577 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
578 {
579     WebBrowser *This = CONTROL_THIS(iface);
580     FIXME("(%p)->(%ld)\n", This, dispID);
581     return E_NOTIMPL;
582 }
583
584 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
585 {
586     WebBrowser *This = CONTROL_THIS(iface);
587     FIXME("(%p)->(%x)\n", This, bFreeze);
588     return E_NOTIMPL;
589 }
590
591 #undef CONTROL_THIS
592
593 static const IOleControlVtbl OleControlVtbl =
594 {
595     OleControl_QueryInterface,
596     OleControl_AddRef,
597     OleControl_Release,
598     OleControl_GetControlInfo,
599     OleControl_OnMnemonic,
600     OleControl_OnAmbientPropertyChange,
601     OleControl_FreezeEvents
602 };
603
604 #define ACTIVEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceActiveObject, iface)
605
606 static HRESULT WINAPI InPlaceActiveObject_QueryInterface(IOleInPlaceActiveObject *iface,
607                                                             REFIID riid, void **ppv)
608 {
609     WebBrowser *This = ACTIVEOBJ_THIS(iface);
610     return IWebBrowser2_QueryInterface(WEBBROWSER2(This), riid, ppv);
611 }
612
613 static ULONG WINAPI InPlaceActiveObject_AddRef(IOleInPlaceActiveObject *iface)
614 {
615     WebBrowser *This = ACTIVEOBJ_THIS(iface);
616     return IWebBrowser2_AddRef(WEBBROWSER2(This));
617 }
618
619 static ULONG WINAPI InPlaceActiveObject_Release(IOleInPlaceActiveObject *iface)
620 {
621     WebBrowser *This = ACTIVEOBJ_THIS(iface);
622     return IWebBrowser2_Release(WEBBROWSER2(This));
623 }
624
625 static HRESULT WINAPI InPlaceActiveObject_GetWindow(IOleInPlaceActiveObject *iface,
626                                                     HWND *phwnd)
627 {
628     WebBrowser *This = ACTIVEOBJ_THIS(iface);
629     return IOleInPlaceObject_GetWindow(INPLACEOBJ(This), phwnd);
630 }
631
632 static HRESULT WINAPI InPlaceActiveObject_ContextSensitiveHelp(IOleInPlaceActiveObject *iface,
633                                                                BOOL fEnterMode)
634 {
635     WebBrowser *This = ACTIVEOBJ_THIS(iface);
636     return IOleInPlaceObject_ContextSensitiveHelp(INPLACEOBJ(This), fEnterMode);
637 }
638
639 static HRESULT WINAPI InPlaceActiveObject_TranslateAccelerator(IOleInPlaceActiveObject *iface,
640                                                                LPMSG lpmsg)
641 {
642     WebBrowser *This = ACTIVEOBJ_THIS(iface);
643     FIXME("(%p)->(%p)\n", This, lpmsg);
644     return E_NOTIMPL;
645 }
646
647 static HRESULT WINAPI InPlaceActiveObject_OnFrameWindowActivate(IOleInPlaceActiveObject *iface,
648                                                                 BOOL fActivate)
649 {
650     WebBrowser *This = ACTIVEOBJ_THIS(iface);
651     FIXME("(%p)->(%x)\n", This, fActivate);
652     return E_NOTIMPL;
653 }
654
655 static HRESULT WINAPI InPlaceActiveObject_OnDocWindowActivate(IOleInPlaceActiveObject *iface,
656                                                               BOOL fActivate)
657 {
658     WebBrowser *This = ACTIVEOBJ_THIS(iface);
659     FIXME("(%p)->(%x)\n", This, fActivate);
660     return E_NOTIMPL;
661 }
662
663 static HRESULT WINAPI InPlaceActiveObject_ResizeBorder(IOleInPlaceActiveObject *iface,
664         LPCRECT lprcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fFrameWindow)
665 {
666     WebBrowser *This = ACTIVEOBJ_THIS(iface);
667     FIXME("(%p)->(%p %p %x)\n", This, lprcBorder, pUIWindow, fFrameWindow);
668     return E_NOTIMPL;
669 }
670
671 static HRESULT WINAPI InPlaceActiveObject_EnableModeless(IOleInPlaceActiveObject *iface,
672                                                          BOOL fEnable)
673 {
674     WebBrowser *This = ACTIVEOBJ_THIS(iface);
675     FIXME("(%p)->(%x)\n", This, fEnable);
676     return E_NOTIMPL;
677 }
678
679 #undef ACTIVEOBJ_THIS
680
681 static const IOleInPlaceActiveObjectVtbl OleInPlaceActiveObjectVtbl = {
682     InPlaceActiveObject_QueryInterface,
683     InPlaceActiveObject_AddRef,
684     InPlaceActiveObject_Release,
685     InPlaceActiveObject_GetWindow,
686     InPlaceActiveObject_ContextSensitiveHelp,
687     InPlaceActiveObject_TranslateAccelerator,
688     InPlaceActiveObject_OnFrameWindowActivate,
689     InPlaceActiveObject_OnDocWindowActivate,
690     InPlaceActiveObject_ResizeBorder,
691     InPlaceActiveObject_EnableModeless
692 };
693
694 #define OLECMD_THIS(iface) DEFINE_THIS(WebBrowser, WBOleCommandTarget, iface)
695
696 static HRESULT WINAPI WBOleCommandTarget_QueryInterface(IOleCommandTarget *iface,
697         REFIID riid, void **ppv)
698 {
699     WebBrowser *This = OLECMD_THIS(iface);
700     return IWebBrowser2_QueryInterface(WEBBROWSER(This), riid, ppv);
701 }
702
703 static ULONG WINAPI WBOleCommandTarget_AddRef(IOleCommandTarget *iface)
704 {
705     WebBrowser *This = OLECMD_THIS(iface);
706     return IWebBrowser2_AddRef(WEBBROWSER(This));
707 }
708
709 static ULONG WINAPI WBOleCommandTarget_Release(IOleCommandTarget *iface)
710 {
711     WebBrowser *This = OLECMD_THIS(iface);
712     return IWebBrowser2_Release(WEBBROWSER(This));
713 }
714
715 static HRESULT WINAPI WBOleCommandTarget_QueryStatus(IOleCommandTarget *iface,
716         const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
717 {
718     WebBrowser *This = OLECMD_THIS(iface);
719     FIXME("(%p)->(%s %lu %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds,
720           pCmdText);
721     return E_NOTIMPL;
722 }
723
724 static HRESULT WINAPI WBOleCommandTarget_Exec(IOleCommandTarget *iface,
725         const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn,
726         VARIANT *pvaOut)
727 {
728     WebBrowser *This = OLECMD_THIS(iface);
729     FIXME("(%p)->(%s %ld %ld %p %p)\n", This, debugstr_guid(pguidCmdGroup), nCmdID,
730           nCmdexecopt, pvaIn, pvaOut);
731     return E_NOTIMPL;
732 }
733
734 #undef OLECMD_THIS
735
736 static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
737     WBOleCommandTarget_QueryInterface,
738     WBOleCommandTarget_AddRef,
739     WBOleCommandTarget_Release,
740     WBOleCommandTarget_QueryStatus,
741     WBOleCommandTarget_Exec
742 };
743
744 void WebBrowser_OleObject_Init(WebBrowser *This)
745 {
746     This->lpOleObjectVtbl              = &OleObjectVtbl;
747     This->lpOleInPlaceObjectVtbl       = &OleInPlaceObjectVtbl;
748     This->lpOleControlVtbl             = &OleControlVtbl;
749     This->lpOleInPlaceActiveObjectVtbl = &OleInPlaceActiveObjectVtbl;
750     This->lpWBOleCommandTargetVtbl     = &OleCommandTargetVtbl;
751
752     This->client = NULL;
753     This->container = NULL;
754     This->iphwnd = NULL;
755     This->frame_hwnd = NULL;
756     This->frame = NULL;
757     This->uiwindow = NULL;
758     This->shell_embedding_hwnd = NULL;
759
760     memset(&This->pos_rect, 0, sizeof(RECT));
761     memset(&This->clip_rect, 0, sizeof(RECT));
762     memset(&This->frameinfo, 0, sizeof(OLEINPLACEFRAMEINFO));
763 }
764
765 void WebBrowser_OleObject_Destroy(WebBrowser *This)
766 {
767     if(This->client)
768         IOleObject_SetClientSite(OLEOBJ(This), NULL);
769     if(This->container)
770         IOleContainer_Release(This->container);
771     if(This->frame)
772         IOleInPlaceFrame_Release(This->frame);
773     if(This->uiwindow)
774         IOleInPlaceUIWindow_Release(This->uiwindow);
775 }