Module: wine Branch: master Commit: 410501e6c91397a91746d55e87d40acccb793e0a URL: http://source.winehq.org/git/wine.git/?a=commit;h=410501e6c91397a91746d55e87...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Dec 6 18:49:00 2010 +0100
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 1439d17..60f2125 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 b2f2f70..5b04399 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 a4624e3..5d53e08 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*);