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