From 410501e6c91397a91746d55e87d40acccb793e0a Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 6 Dec 2010 18:49:00 +0100 Subject: [PATCH] mshtml: Added QuickActivation support. --- dlls/mshtml/npplugin.c | 12 ++++++++-- dlls/mshtml/pluginhost.c | 51 ++++++++++++++++++++++++++++++++++++++++ dlls/mshtml/pluginhost.h | 2 ++ 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/dlls/mshtml/npplugin.c b/dlls/mshtml/npplugin.c index 1439d175647..60f2125144e 100644 --- a/dlls/mshtml/npplugin.c +++ b/dlls/mshtml/npplugin.c @@ -303,8 +303,16 @@ static NPError CDECL NPP_Destroy(NPP instance, NPSavedData **save) static NPError CDECL NPP_SetWindow(NPP instance, NPWindow *window) { - FIXME("(%p %p)\n", instance, window); - return NPERR_GENERIC_ERROR; + PluginHost *host = instance->pdata; + RECT pos_rect = {0, 0, window->width, window->height}; + + TRACE("(%p %p)\n", instance, window); + + if(!host) + return NPERR_GENERIC_ERROR; + + update_plugin_window(host, window->window, &pos_rect); + return NPERR_NO_ERROR; } static NPError CDECL NPP_NewStream(NPP instance, NPMIMEType type, NPStream *stream, NPBool seekable, UINT16 *stype) diff --git a/dlls/mshtml/pluginhost.c b/dlls/mshtml/pluginhost.c index b2f2f70facc..5b0439995e7 100644 --- a/dlls/mshtml/pluginhost.c +++ b/dlls/mshtml/pluginhost.c @@ -36,6 +36,57 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); +static void activate_plugin(PluginHost *host) +{ + IClientSecurity *client_security; + IQuickActivate *quick_activate; + HRESULT hres; + + if(!host->plugin_unk) + return; + + /* Note native calls QI on plugin for an undocumented IID and CLSID_HTMLDocument */ + + /* FIXME: call FreezeEvents(TRUE) */ + + hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IClientSecurity, (void**)&client_security); + if(SUCCEEDED(hres)) { + FIXME("Handle IClientSecurity\n"); + IClientSecurity_Release(client_security); + return; + } + + hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IQuickActivate, (void**)&quick_activate); + if(SUCCEEDED(hres)) { + QACONTAINER container = {sizeof(container)}; + QACONTROL control = {sizeof(control)}; + + container.pClientSite = &host->IOleClientSite_iface; + container.dwAmbientFlags = QACONTAINER_SUPPORTSMNEMONICS|QACONTAINER_MESSAGEREFLECT|QACONTAINER_USERMODE; + container.pAdviseSink = NULL; /* FIXME */ + container.pPropertyNotifySink = NULL; /* FIXME */ + + hres = IQuickActivate_QuickActivate(quick_activate, &container, &control); + if(FAILED(hres)) + FIXME("QuickActivate failed: %08x\n", hres); + }else { + FIXME("No IQuickActivate\n"); + } +} + +void update_plugin_window(PluginHost *host, HWND hwnd, const RECT *rect) +{ + if(!hwnd || (host->hwnd && host->hwnd != hwnd)) { + FIXME("unhandled hwnd\n"); + return; + } + + if(!host->hwnd) { + host->hwnd = hwnd; + activate_plugin(host); + } +} + static inline PluginHost *impl_from_IOleClientSite(IOleClientSite *iface) { return CONTAINING_RECORD(iface, PluginHost, IOleClientSite_iface); diff --git a/dlls/mshtml/pluginhost.h b/dlls/mshtml/pluginhost.h index a4624e36564..5d53e082f77 100644 --- a/dlls/mshtml/pluginhost.h +++ b/dlls/mshtml/pluginhost.h @@ -24,6 +24,8 @@ typedef struct { LONG ref; IUnknown *plugin_unk; + HWND hwnd; } PluginHost; HRESULT create_plugin_host(IUnknown*,PluginHost**); +void update_plugin_window(PluginHost*,HWND,const RECT*);