2 * Copyright 2010 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "mshtml_private.h"
32 #include "pluginhost.h"
34 #include "wine/debug.h"
35 #include "wine/unicode.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
39 const IID IID_HTMLPluginContainer
=
40 {0xbd7a6050,0xb373,0x4f6f,{0xa4,0x93,0xdd,0x40,0xc5,0x23,0xa8,0x6a}};
42 static BOOL
check_load_safety(PluginHost
*host
)
44 DWORD policy_size
, policy
;
45 struct CONFIRMSAFETY cs
;
49 cs
.clsid
= host
->clsid
;
50 cs
.pUnk
= host
->plugin_unk
;
51 cs
.dwFlags
= CONFIRMSAFETYACTION_LOADOBJECT
;
53 hres
= IInternetHostSecurityManager_QueryCustomPolicy(HOSTSECMGR(host
->doc
),
54 &GUID_CUSTOM_CONFIRMOBJECTSAFETY
, &ppolicy
, &policy_size
, (BYTE
*)&cs
, sizeof(cs
), 0);
58 policy
= *(DWORD
*)ppolicy
;
59 CoTaskMemFree(ppolicy
);
60 return policy
== URLPOLICY_ALLOW
;
63 static void load_prop_bag(PluginHost
*host
, IPersistPropertyBag
*persist_prop_bag
)
65 IPropertyBag
*prop_bag
;
68 hres
= create_param_prop_bag(&prop_bag
);
72 if(prop_bag
&& !check_load_safety(host
)) {
73 IPropertyBag_Release(prop_bag
);
78 hres
= IPersistPropertyBag_Load(persist_prop_bag
, prop_bag
, NULL
);
79 IPropertyBag_Release(prop_bag
);
81 WARN("Load failed: %08x\n", hres
);
83 hres
= IPersistPropertyBag_InitNew(persist_prop_bag
);
85 WARN("InitNew failed: %08x\n", hres
);
89 static void load_plugin(PluginHost
*host
)
91 IPersistPropertyBag2
*persist_prop_bag2
;
92 IPersistPropertyBag
*persist_prop_bag
;
95 hres
= IUnknown_QueryInterface(host
->plugin_unk
, &IID_IPersistPropertyBag2
, (void**)&persist_prop_bag2
);
97 FIXME("Use IPersistPropertyBag2 iface\n");
98 IPersistPropertyBag2_Release(persist_prop_bag2
);
102 hres
= IUnknown_QueryInterface(host
->plugin_unk
, &IID_IPersistPropertyBag
, (void**)&persist_prop_bag
);
103 if(SUCCEEDED(hres
)) {
104 load_prop_bag(host
, persist_prop_bag
);
105 IPersistPropertyBag_Release(persist_prop_bag
);
109 FIXME("No IPersistPeropertyBag iface \n");
112 static void activate_plugin(PluginHost
*host
)
114 IClientSecurity
*client_security
;
115 IQuickActivate
*quick_activate
;
118 if(!host
->plugin_unk
)
121 /* Note native calls QI on plugin for an undocumented IID and CLSID_HTMLDocument */
123 /* FIXME: call FreezeEvents(TRUE) */
125 hres
= IUnknown_QueryInterface(host
->plugin_unk
, &IID_IClientSecurity
, (void**)&client_security
);
126 if(SUCCEEDED(hres
)) {
127 FIXME("Handle IClientSecurity\n");
128 IClientSecurity_Release(client_security
);
132 hres
= IUnknown_QueryInterface(host
->plugin_unk
, &IID_IQuickActivate
, (void**)&quick_activate
);
133 if(SUCCEEDED(hres
)) {
134 QACONTAINER container
= {sizeof(container
)};
135 QACONTROL control
= {sizeof(control
)};
137 container
.pClientSite
= &host
->IOleClientSite_iface
;
138 container
.dwAmbientFlags
= QACONTAINER_SUPPORTSMNEMONICS
|QACONTAINER_MESSAGEREFLECT
|QACONTAINER_USERMODE
;
139 container
.pAdviseSink
= &host
->IAdviseSinkEx_iface
;
140 container
.pPropertyNotifySink
= &host
->IPropertyNotifySink_iface
;
142 hres
= IQuickActivate_QuickActivate(quick_activate
, &container
, &control
);
144 FIXME("QuickActivate failed: %08x\n", hres
);
146 FIXME("No IQuickActivate\n");
153 void update_plugin_window(PluginHost
*host
, HWND hwnd
, const RECT
*rect
)
155 if(!hwnd
|| (host
->hwnd
&& host
->hwnd
!= hwnd
)) {
156 FIXME("unhandled hwnd\n");
162 activate_plugin(host
);
166 static inline PluginHost
*impl_from_IOleClientSite(IOleClientSite
*iface
)
168 return CONTAINING_RECORD(iface
, PluginHost
, IOleClientSite_iface
);
171 static HRESULT WINAPI
PHClientSite_QueryInterface(IOleClientSite
*iface
, REFIID riid
, void **ppv
)
173 PluginHost
*This
= impl_from_IOleClientSite(iface
);
175 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
176 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
177 *ppv
= &This
->IOleClientSite_iface
;
178 }else if(IsEqualGUID(&IID_IOleClientSite
, riid
)) {
179 TRACE("(%p)->(IID_IOleClientSite %p)\n", This
, ppv
);
180 *ppv
= &This
->IOleClientSite_iface
;
181 }else if(IsEqualGUID(&IID_IAdviseSink
, riid
)) {
182 TRACE("(%p)->(IID_IAdviseSink %p)\n", This
, ppv
);
183 *ppv
= &This
->IAdviseSinkEx_iface
;
184 }else if(IsEqualGUID(&IID_IAdviseSinkEx
, riid
)) {
185 TRACE("(%p)->(IID_IAdviseSinkEx %p)\n", This
, ppv
);
186 *ppv
= &This
->IAdviseSinkEx_iface
;
187 }else if(IsEqualGUID(&IID_IPropertyNotifySink
, riid
)) {
188 TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This
, ppv
);
189 *ppv
= &This
->IPropertyNotifySink_iface
;
190 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
191 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
192 *ppv
= &This
->IDispatch_iface
;
193 }else if(IsEqualGUID(&IID_IOleWindow
, riid
)) {
194 TRACE("(%p)->(IID_IOleWindow %p)\n", This
, ppv
);
195 *ppv
= &This
->IOleInPlaceSiteEx_iface
;
196 }else if(IsEqualGUID(&IID_IOleInPlaceSite
, riid
)) {
197 TRACE("(%p)->(IID_IOleInPlaceSite %p)\n", This
, ppv
);
198 *ppv
= &This
->IOleInPlaceSiteEx_iface
;
199 }else if(IsEqualGUID(&IID_IOleInPlaceSiteEx
, riid
)) {
200 TRACE("(%p)->(IID_IOleInPlaceSiteEx %p)\n", This
, ppv
);
201 *ppv
= &This
->IOleInPlaceSiteEx_iface
;
202 }else if(IsEqualGUID(&IID_IOleControlSite
, riid
)) {
203 TRACE("(%p)->(IID_IOleControlSite %p)\n", This
, ppv
);
204 *ppv
= &This
->IOleControlSite_iface
;
205 }else if(IsEqualGUID(&IID_IBindHost
, riid
)) {
206 TRACE("(%p)->(IID_IBindHost %p)\n", This
, ppv
);
207 *ppv
= &This
->IBindHost_iface
;
208 }else if(IsEqualGUID(&IID_IServiceProvider
, riid
)) {
209 TRACE("(%p)->(IID_IServiceProvider %p)\n", This
, ppv
);
210 *ppv
= &This
->IServiceProvider_iface
;
212 WARN("Unsupported interface %s\n", debugstr_guid(riid
));
214 return E_NOINTERFACE
;
217 IOleClientSite_AddRef((IUnknown
*)*ppv
);
221 static ULONG WINAPI
PHClientSite_AddRef(IOleClientSite
*iface
)
223 PluginHost
*This
= impl_from_IOleClientSite(iface
);
224 LONG ref
= InterlockedIncrement(&This
->ref
);
226 TRACE("(%p) ref=%d\n", This
, ref
);
231 static ULONG WINAPI
PHClientSite_Release(IOleClientSite
*iface
)
233 PluginHost
*This
= impl_from_IOleClientSite(iface
);
234 LONG ref
= InterlockedDecrement(&This
->ref
);
236 TRACE("(%p) ref=%d\n", This
, ref
);
239 list_remove(&This
->entry
);
241 This
->element
->plugin_host
= NULL
;
243 IUnknown_Release(This
->plugin_unk
);
250 static HRESULT WINAPI
PHClientSite_SaveObject(IOleClientSite
*iface
)
252 PluginHost
*This
= impl_from_IOleClientSite(iface
);
253 FIXME("(%p)\n", This
);
257 static HRESULT WINAPI
PHClientSite_GetMoniker(IOleClientSite
*iface
, DWORD dwAssign
,
258 DWORD dwWhichMoniker
, IMoniker
**ppmk
)
260 PluginHost
*This
= impl_from_IOleClientSite(iface
);
261 FIXME("(%p)->(%d %d %p)\n", This
, dwAssign
, dwWhichMoniker
, ppmk
);
265 static HRESULT WINAPI
PHClientSite_GetContainer(IOleClientSite
*iface
, IOleContainer
**ppContainer
)
267 PluginHost
*This
= impl_from_IOleClientSite(iface
);
268 FIXME("(%p)->(%p)\n", This
, ppContainer
);
272 static HRESULT WINAPI
PHClientSite_ShowObject(IOleClientSite
*iface
)
274 PluginHost
*This
= impl_from_IOleClientSite(iface
);
275 FIXME("(%p)\n", This
);
279 static HRESULT WINAPI
PHClientSite_OnShowWindow(IOleClientSite
*iface
, BOOL fShow
)
281 PluginHost
*This
= impl_from_IOleClientSite(iface
);
282 FIXME("(%p)->(%x)\n", This
, fShow
);
286 static HRESULT WINAPI
PHClientSite_RequestNewObjectLayout(IOleClientSite
*iface
)
288 PluginHost
*This
= impl_from_IOleClientSite(iface
);
289 FIXME("(%p)\n", This
);
293 static const IOleClientSiteVtbl OleClientSiteVtbl
= {
294 PHClientSite_QueryInterface
,
296 PHClientSite_Release
,
297 PHClientSite_SaveObject
,
298 PHClientSite_GetMoniker
,
299 PHClientSite_GetContainer
,
300 PHClientSite_ShowObject
,
301 PHClientSite_OnShowWindow
,
302 PHClientSite_RequestNewObjectLayout
305 static inline PluginHost
*impl_from_IAdviseSinkEx(IAdviseSinkEx
*iface
)
307 return CONTAINING_RECORD(iface
, PluginHost
, IAdviseSinkEx_iface
);
310 static HRESULT WINAPI
PHAdviseSinkEx_QueryInterface(IAdviseSinkEx
*iface
, REFIID riid
, void **ppv
)
312 PluginHost
*This
= impl_from_IAdviseSinkEx(iface
);
313 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
316 static ULONG WINAPI
PHAdviseSinkEx_AddRef(IAdviseSinkEx
*iface
)
318 PluginHost
*This
= impl_from_IAdviseSinkEx(iface
);
319 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
322 static ULONG WINAPI
PHAdviseSinkEx_Release(IAdviseSinkEx
*iface
)
324 PluginHost
*This
= impl_from_IAdviseSinkEx(iface
);
325 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
328 static void WINAPI
PHAdviseSinkEx_OnDataChange(IAdviseSinkEx
*iface
, FORMATETC
*pFormatetc
, STGMEDIUM
*pStgMedium
)
330 PluginHost
*This
= impl_from_IAdviseSinkEx(iface
);
331 FIXME("(%p)->(%p %p)\n", This
, pFormatetc
, pStgMedium
);
334 static void WINAPI
PHAdviseSinkEx_OnViewChange(IAdviseSinkEx
*iface
, DWORD dwAspect
, LONG lindex
)
336 PluginHost
*This
= impl_from_IAdviseSinkEx(iface
);
337 FIXME("(%p)->(%d %d)\n", This
, dwAspect
, lindex
);
340 static void WINAPI
PHAdviseSinkEx_OnRename(IAdviseSinkEx
*iface
, IMoniker
*pmk
)
342 PluginHost
*This
= impl_from_IAdviseSinkEx(iface
);
343 FIXME("(%p)->(%p)\n", This
, pmk
);
346 static void WINAPI
PHAdviseSinkEx_OnSave(IAdviseSinkEx
*iface
)
348 PluginHost
*This
= impl_from_IAdviseSinkEx(iface
);
349 FIXME("(%p)\n", This
);
352 static void WINAPI
PHAdviseSinkEx_OnClose(IAdviseSinkEx
*iface
)
354 PluginHost
*This
= impl_from_IAdviseSinkEx(iface
);
355 FIXME("(%p)\n", This
);
358 static void WINAPI
PHAdviseSinkEx_OnViewStatusChange(IAdviseSinkEx
*iface
, DWORD dwViewStatus
)
360 PluginHost
*This
= impl_from_IAdviseSinkEx(iface
);
361 FIXME("(%p)->(%d)\n", This
, dwViewStatus
);
364 static const IAdviseSinkExVtbl AdviseSinkExVtbl
= {
365 PHAdviseSinkEx_QueryInterface
,
366 PHAdviseSinkEx_AddRef
,
367 PHAdviseSinkEx_Release
,
368 PHAdviseSinkEx_OnDataChange
,
369 PHAdviseSinkEx_OnViewChange
,
370 PHAdviseSinkEx_OnRename
,
371 PHAdviseSinkEx_OnSave
,
372 PHAdviseSinkEx_OnClose
,
373 PHAdviseSinkEx_OnViewStatusChange
376 static inline PluginHost
*impl_from_IPropertyNotifySink(IPropertyNotifySink
*iface
)
378 return CONTAINING_RECORD(iface
, PluginHost
, IPropertyNotifySink_iface
);
381 static HRESULT WINAPI
PHPropertyNotifySink_QueryInterface(IPropertyNotifySink
*iface
, REFIID riid
, void **ppv
)
383 PluginHost
*This
= impl_from_IPropertyNotifySink(iface
);
384 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
387 static ULONG WINAPI
PHPropertyNotifySink_AddRef(IPropertyNotifySink
*iface
)
389 PluginHost
*This
= impl_from_IPropertyNotifySink(iface
);
390 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
393 static ULONG WINAPI
PHPropertyNotifySink_Release(IPropertyNotifySink
*iface
)
395 PluginHost
*This
= impl_from_IPropertyNotifySink(iface
);
396 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
399 static HRESULT WINAPI
PHPropertyNotifySink_OnChanged(IPropertyNotifySink
*iface
, DISPID dispID
)
401 PluginHost
*This
= impl_from_IPropertyNotifySink(iface
);
402 FIXME("(%p)->(%d)\n", This
, dispID
);
406 static HRESULT WINAPI
PHPropertyNotifySink_OnRequestEdit(IPropertyNotifySink
*iface
, DISPID dispID
)
408 PluginHost
*This
= impl_from_IPropertyNotifySink(iface
);
409 FIXME("(%p)->(%d)\n", This
, dispID
);
413 static const IPropertyNotifySinkVtbl PropertyNotifySinkVtbl
= {
414 PHPropertyNotifySink_QueryInterface
,
415 PHPropertyNotifySink_AddRef
,
416 PHPropertyNotifySink_Release
,
417 PHPropertyNotifySink_OnChanged
,
418 PHPropertyNotifySink_OnRequestEdit
421 static inline PluginHost
*impl_from_IDispatch(IDispatch
*iface
)
423 return CONTAINING_RECORD(iface
, PluginHost
, IDispatch_iface
);
426 static HRESULT WINAPI
PHDispatch_QueryInterface(IDispatch
*iface
, REFIID riid
, void **ppv
)
428 PluginHost
*This
= impl_from_IDispatch(iface
);
429 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
432 static ULONG WINAPI
PHDispatch_AddRef(IDispatch
*iface
)
434 PluginHost
*This
= impl_from_IDispatch(iface
);
435 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
438 static ULONG WINAPI
PHDispatch_Release(IDispatch
*iface
)
440 PluginHost
*This
= impl_from_IDispatch(iface
);
441 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
444 static HRESULT WINAPI
PHDispatch_GetTypeInfoCount(IDispatch
*iface
, UINT
*pctinfo
)
446 PluginHost
*This
= impl_from_IDispatch(iface
);
447 FIXME("(%p)->(%p)\n", This
, pctinfo
);
451 static HRESULT WINAPI
PHDispatch_GetTypeInfo(IDispatch
*iface
, UINT iTInfo
,
452 LCID lcid
, ITypeInfo
**ppTInfo
)
454 PluginHost
*This
= impl_from_IDispatch(iface
);
455 FIXME("(%p)->(%d %d %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
459 static HRESULT WINAPI
PHDispatch_GetIDsOfNames(IDispatch
*iface
, REFIID riid
,
460 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
462 PluginHost
*This
= impl_from_IDispatch(iface
);
463 FIXME("(%p)->(%s %p %d %d %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
467 static HRESULT WINAPI
PHDispatch_Invoke(IDispatch
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
,
468 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
470 PluginHost
*This
= impl_from_IDispatch(iface
);
471 FIXME("(%p)->(%d %x %p %p)\n", This
, dispid
, wFlags
, pDispParams
, pVarResult
);
475 static const IDispatchVtbl DispatchVtbl
= {
476 PHDispatch_QueryInterface
,
479 PHDispatch_GetTypeInfoCount
,
480 PHDispatch_GetTypeInfo
,
481 PHDispatch_GetIDsOfNames
,
485 static inline PluginHost
*impl_from_IOleInPlaceSiteEx(IOleInPlaceSiteEx
*iface
)
487 return CONTAINING_RECORD(iface
, PluginHost
, IOleInPlaceSiteEx_iface
);
490 static HRESULT WINAPI
PHInPlaceSite_QueryInterface(IOleInPlaceSiteEx
*iface
, REFIID riid
, void **ppv
)
492 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
493 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
496 static ULONG WINAPI
PHInPlaceSite_AddRef(IOleInPlaceSiteEx
*iface
)
498 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
499 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
502 static ULONG WINAPI
PHInPlaceSite_Release(IOleInPlaceSiteEx
*iface
)
504 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
505 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
508 static HRESULT WINAPI
PHInPlaceSite_GetWindow(IOleInPlaceSiteEx
*iface
, HWND
*phwnd
)
510 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
511 FIXME("(%p)->(%p)\n", This
, phwnd
);
515 static HRESULT WINAPI
PHInPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx
*iface
, BOOL fEnterMode
)
517 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
518 FIXME("(%p)->(%x)\n", This
, fEnterMode
);
522 static HRESULT WINAPI
PHInPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx
*iface
)
524 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
525 FIXME("(%p)\n", This
);
529 static HRESULT WINAPI
PHInPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx
*iface
)
531 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
532 FIXME("(%p)\n", This
);
536 static HRESULT WINAPI
PHInPlaceSite_OnUIActivate(IOleInPlaceSiteEx
*iface
)
538 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
539 FIXME("(%p)\n", This
);
543 static HRESULT WINAPI
PHInPlaceSite_GetWindowContext(IOleInPlaceSiteEx
*iface
,
544 IOleInPlaceFrame
**ppFrame
, IOleInPlaceUIWindow
**ppDoc
, RECT
*lprcPosRect
,
545 RECT
*lprcClipRect
, OLEINPLACEFRAMEINFO
*frame_info
)
547 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
548 FIXME("(%p)->(%p %p %p %p %p)\n", This
, ppFrame
, ppDoc
, lprcPosRect
, lprcClipRect
, frame_info
);
552 static HRESULT WINAPI
PHInPlaceSite_Scroll(IOleInPlaceSiteEx
*iface
, SIZE scrollExtent
)
554 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
555 FIXME("(%p)->({%d %d})\n", This
, scrollExtent
.cx
, scrollExtent
.cy
);
559 static HRESULT WINAPI
PHInPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx
*iface
, BOOL fUndoable
)
561 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
562 FIXME("(%p)->(%x)\n", This
, fUndoable
);
566 static HRESULT WINAPI
PHInPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx
*iface
)
568 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
569 FIXME("(%p)\n", This
);
573 static HRESULT WINAPI
PHInPlaceSite_DiscardUndoState(IOleInPlaceSiteEx
*iface
)
575 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
576 FIXME("(%p)\n", This
);
580 static HRESULT WINAPI
PHInPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx
*iface
)
582 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
583 FIXME("(%p)\n", This
);
587 static HRESULT WINAPI
PHInPlaceSite_OnPosRectChange(IOleInPlaceSiteEx
*iface
, LPCRECT lprcPosRect
)
589 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
590 FIXME("(%p)->(%p)\n", This
, lprcPosRect
);
594 static HRESULT WINAPI
PHInPlaceSiteEx_OnInPlaceActivateEx(IOleInPlaceSiteEx
*iface
, BOOL
*pfNoRedraw
, DWORD dwFlags
)
596 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
597 FIXME("(%p)->(%p %x)\n", This
, pfNoRedraw
, dwFlags
);
601 static HRESULT WINAPI
PHInPlaceSiteEx_OnInPlaceDeactivateEx(IOleInPlaceSiteEx
*iface
, BOOL fNoRedraw
)
603 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
604 FIXME("(%p)->(%x)\n", This
, fNoRedraw
);
608 static HRESULT WINAPI
PHInPlaceSiteEx_RequestUIActivate(IOleInPlaceSiteEx
*iface
)
610 PluginHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
611 FIXME("(%p)\n", This
);
615 static const IOleInPlaceSiteExVtbl OleInPlaceSiteExVtbl
= {
616 PHInPlaceSite_QueryInterface
,
617 PHInPlaceSite_AddRef
,
618 PHInPlaceSite_Release
,
619 PHInPlaceSite_GetWindow
,
620 PHInPlaceSite_ContextSensitiveHelp
,
621 PHInPlaceSite_CanInPlaceActivate
,
622 PHInPlaceSite_OnInPlaceActivate
,
623 PHInPlaceSite_OnUIActivate
,
624 PHInPlaceSite_GetWindowContext
,
625 PHInPlaceSite_Scroll
,
626 PHInPlaceSite_OnUIDeactivate
,
627 PHInPlaceSite_OnInPlaceDeactivate
,
628 PHInPlaceSite_DiscardUndoState
,
629 PHInPlaceSite_DeactivateAndUndo
,
630 PHInPlaceSite_OnPosRectChange
,
631 PHInPlaceSiteEx_OnInPlaceActivateEx
,
632 PHInPlaceSiteEx_OnInPlaceDeactivateEx
,
633 PHInPlaceSiteEx_RequestUIActivate
636 static inline PluginHost
*impl_from_IOleControlSite(IOleControlSite
*iface
)
638 return CONTAINING_RECORD(iface
, PluginHost
, IOleControlSite_iface
);
641 static HRESULT WINAPI
PHControlSite_QueryInterface(IOleControlSite
*iface
, REFIID riid
, void **ppv
)
643 PluginHost
*This
= impl_from_IOleControlSite(iface
);
644 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
647 static ULONG WINAPI
PHControlSite_AddRef(IOleControlSite
*iface
)
649 PluginHost
*This
= impl_from_IOleControlSite(iface
);
650 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
653 static ULONG WINAPI
PHControlSite_Release(IOleControlSite
*iface
)
655 PluginHost
*This
= impl_from_IOleControlSite(iface
);
656 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
659 static HRESULT WINAPI
PHControlSite_OnControlInfoChanged(IOleControlSite
*iface
)
661 PluginHost
*This
= impl_from_IOleControlSite(iface
);
662 FIXME("(%p)\n", This
);
666 static HRESULT WINAPI
PHControlSite_LockInPlaceActive(IOleControlSite
*iface
, BOOL fLock
)
668 PluginHost
*This
= impl_from_IOleControlSite(iface
);
669 FIXME("(%p)->(%x)\n", This
, fLock
);
673 static HRESULT WINAPI
PHControlSite_GetExtendedControl(IOleControlSite
*iface
, IDispatch
**ppDisp
)
675 PluginHost
*This
= impl_from_IOleControlSite(iface
);
676 FIXME("(%p)->(%p)\n", This
, ppDisp
);
680 static HRESULT WINAPI
PHControlSite_TransformCoords(IOleControlSite
*iface
, POINTL
*pPtlHimetric
, POINTF
*pPtfContainer
, DWORD dwFlags
)
682 PluginHost
*This
= impl_from_IOleControlSite(iface
);
683 FIXME("(%p)->(%p %p %x)\n", This
, pPtlHimetric
, pPtfContainer
, dwFlags
);
687 static HRESULT WINAPI
PHControlSite_TranslateAccelerator(IOleControlSite
*iface
, MSG
*pMsg
, DWORD grfModifiers
)
689 PluginHost
*This
= impl_from_IOleControlSite(iface
);
690 FIXME("(%p)->(%x)\n", This
, grfModifiers
);
694 static HRESULT WINAPI
PHControlSite_OnFocus(IOleControlSite
*iface
, BOOL fGotFocus
)
696 PluginHost
*This
= impl_from_IOleControlSite(iface
);
697 FIXME("(%p)->(%x)\n", This
, fGotFocus
);
701 static HRESULT WINAPI
PHControlSite_ShowPropertyFrame(IOleControlSite
*iface
)
703 PluginHost
*This
= impl_from_IOleControlSite(iface
);
704 FIXME("(%p)\n", This
);
708 static const IOleControlSiteVtbl OleControlSiteVtbl
= {
709 PHControlSite_QueryInterface
,
710 PHControlSite_AddRef
,
711 PHControlSite_Release
,
712 PHControlSite_OnControlInfoChanged
,
713 PHControlSite_LockInPlaceActive
,
714 PHControlSite_GetExtendedControl
,
715 PHControlSite_TransformCoords
,
716 PHControlSite_TranslateAccelerator
,
717 PHControlSite_OnFocus
,
718 PHControlSite_ShowPropertyFrame
721 static inline PluginHost
*impl_from_IBindHost(IBindHost
*iface
)
723 return CONTAINING_RECORD(iface
, PluginHost
, IBindHost_iface
);
726 static HRESULT WINAPI
PHBindHost_QueryInterface(IBindHost
*iface
, REFIID riid
, void **ppv
)
728 PluginHost
*This
= impl_from_IBindHost(iface
);
729 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
732 static ULONG WINAPI
PHBindHost_AddRef(IBindHost
*iface
)
734 PluginHost
*This
= impl_from_IBindHost(iface
);
735 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
738 static ULONG WINAPI
PHBindHost_Release(IBindHost
*iface
)
740 PluginHost
*This
= impl_from_IBindHost(iface
);
741 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
744 static HRESULT WINAPI
PHBindHost_CreateMoniker(IBindHost
*iface
, LPOLESTR szName
, IBindCtx
*pBC
, IMoniker
**ppmk
, DWORD dwReserved
)
746 PluginHost
*This
= impl_from_IBindHost(iface
);
747 FIXME("(%p)->(%s %p %p %x)\n", This
, debugstr_w(szName
), pBC
, ppmk
, dwReserved
);
751 static HRESULT WINAPI
PHBindHost_MonikerBindToStorage(IBindHost
*iface
, IMoniker
*pMk
, IBindCtx
*pBC
,
752 IBindStatusCallback
*pBSC
, REFIID riid
, void **ppvObj
)
754 PluginHost
*This
= impl_from_IBindHost(iface
);
755 FIXME("(%p)->(%p %p %p %s %p)\n", This
, pMk
, pBC
, pBSC
, debugstr_guid(riid
), ppvObj
);
759 static HRESULT WINAPI
PHBindHost_MonikerBindToObject(IBindHost
*iface
, IMoniker
*pMk
, IBindCtx
*pBC
,
760 IBindStatusCallback
*pBSC
, REFIID riid
, void **ppvObj
)
762 PluginHost
*This
= impl_from_IBindHost(iface
);
763 FIXME("(%p)->(%p %p %p %s %p)\n", This
, pMk
, pBC
, pBSC
, debugstr_guid(riid
), ppvObj
);
767 static const IBindHostVtbl BindHostVtbl
= {
768 PHBindHost_QueryInterface
,
771 PHBindHost_CreateMoniker
,
772 PHBindHost_MonikerBindToStorage
,
773 PHBindHost_MonikerBindToObject
776 static inline PluginHost
*impl_from_IServiceProvider(IServiceProvider
*iface
)
778 return CONTAINING_RECORD(iface
, PluginHost
, IServiceProvider_iface
);
781 static HRESULT WINAPI
PHServiceProvider_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **ppv
)
783 PluginHost
*This
= impl_from_IServiceProvider(iface
);
784 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
787 static ULONG WINAPI
PHServiceProvider_AddRef(IServiceProvider
*iface
)
789 PluginHost
*This
= impl_from_IServiceProvider(iface
);
790 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
793 static ULONG WINAPI
PHServiceProvider_Release(IServiceProvider
*iface
)
795 PluginHost
*This
= impl_from_IServiceProvider(iface
);
796 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
799 static HRESULT WINAPI
PHServiceProvider_QueryService(IServiceProvider
*iface
, REFGUID guidService
, REFIID riid
, void **ppv
)
801 PluginHost
*This
= impl_from_IServiceProvider(iface
);
802 FIXME("(%p)->(%s %s %p)\n", This
, debugstr_guid(guidService
), debugstr_guid(riid
), ppv
);
803 return E_NOINTERFACE
;
806 static const IServiceProviderVtbl ServiceProviderVtbl
= {
807 PHServiceProvider_QueryInterface
,
808 PHServiceProvider_AddRef
,
809 PHServiceProvider_Release
,
810 PHServiceProvider_QueryService
813 static HRESULT
assoc_element(PluginHost
*host
, HTMLDocumentNode
*doc
, nsIDOMElement
*nselem
)
815 HTMLPluginContainer
*container_elem
;
819 hres
= get_node(doc
, (nsIDOMNode
*)nselem
, TRUE
, &node
);
823 hres
= IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node
), &IID_HTMLPluginContainer
, (void**)&container_elem
);
825 ERR("Not an object element\n");
829 container_elem
->plugin_host
= host
;
830 host
->element
= container_elem
;
834 void detach_plugin_hosts(HTMLDocumentNode
*doc
)
838 while(!list_empty(&doc
->plugin_hosts
)) {
839 iter
= LIST_ENTRY(list_head(&doc
->plugin_hosts
), PluginHost
, entry
);
840 list_remove(&iter
->entry
);
845 HRESULT
create_plugin_host(HTMLDocumentNode
*doc
, nsIDOMElement
*nselem
, IUnknown
*unk
, const CLSID
*clsid
, PluginHost
**ret
)
850 host
= heap_alloc_zero(sizeof(*host
));
852 return E_OUTOFMEMORY
;
854 host
->IOleClientSite_iface
.lpVtbl
= &OleClientSiteVtbl
;
855 host
->IAdviseSinkEx_iface
.lpVtbl
= &AdviseSinkExVtbl
;
856 host
->IPropertyNotifySink_iface
.lpVtbl
= &PropertyNotifySinkVtbl
;
857 host
->IDispatch_iface
.lpVtbl
= &DispatchVtbl
;
858 host
->IOleInPlaceSiteEx_iface
.lpVtbl
= &OleInPlaceSiteExVtbl
;
859 host
->IOleControlSite_iface
.lpVtbl
= &OleControlSiteVtbl
;
860 host
->IBindHost_iface
.lpVtbl
= &BindHostVtbl
;
861 host
->IServiceProvider_iface
.lpVtbl
= &ServiceProviderVtbl
;
865 hres
= assoc_element(host
, doc
, nselem
);
871 IUnknown_AddRef(unk
);
872 host
->plugin_unk
= unk
;
873 host
->clsid
= *clsid
;
876 list_add_tail(&doc
->plugin_hosts
, &host
->entry
);