Module: wine Branch: master Commit: 6ae3418aaf873b85f4508a8920e565d039e7b817 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6ae3418aaf873b85f4508a8920...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Oct 8 15:00:50 2012 +0200
mshtml: Return dispinterface from PHEventSink::QueryInterface.
---
dlls/mshtml/pluginhost.c | 14 ++++++++++++++ dlls/mshtml/tests/activex.c | 5 +++++ 2 files changed, 19 insertions(+), 0 deletions(-)
diff --git a/dlls/mshtml/pluginhost.c b/dlls/mshtml/pluginhost.c index 0f68c25..4f088ad 100644 --- a/dlls/mshtml/pluginhost.c +++ b/dlls/mshtml/pluginhost.c @@ -485,6 +485,7 @@ struct PHEventSink { ITypeInfo *typeinfo; GUID iid; DWORD cookie; + BOOL is_dispiface;
sink_entry_t *handlers; DWORD handlers_cnt; @@ -548,6 +549,9 @@ static HRESULT WINAPI PHEventSink_QueryInterface(IDispatch *iface, REFIID riid, }else if(IsEqualGUID(riid, &IID_IDispatch)) { TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); *ppv = &This->IDispatch_iface; + }else if(This->is_dispiface && IsEqualGUID(riid, &This->iid)) { + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + *ppv = &This->IDispatch_iface; }else { WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); *ppv = NULL; @@ -670,6 +674,7 @@ static PHEventSink *create_event_sink(PluginHost *plugin_host, ITypeInfo *typein PHEventSink *ret; IConnectionPoint *cp; TYPEATTR *typeattr; + TYPEKIND typekind; GUID guid; HRESULT hres;
@@ -677,9 +682,17 @@ static PHEventSink *create_event_sink(PluginHost *plugin_host, ITypeInfo *typein if(FAILED(hres)) return NULL;
+ typekind = typeattr->typekind; guid = typeattr->guid; ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr);
+ TRACE("guid %s typekind %d\n", debugstr_guid(&guid), typekind); + + if(typekind != TKIND_INTERFACE && typekind != TKIND_DISPATCH) { + WARN("invalid typekind %d\n", typekind); + return NULL; + } + hres = IUnknown_QueryInterface(plugin_host->plugin_unk, &IID_IConnectionPointContainer, (void**)&cp_container); if(FAILED(hres)) { WARN("Could not get IConnectionPointContainer iface: %08x\n", hres); @@ -699,6 +712,7 @@ static PHEventSink *create_event_sink(PluginHost *plugin_host, ITypeInfo *typein ret->ref = 1; ret->host = plugin_host; ret->iid = guid; + ret->is_dispiface = typekind == TKIND_DISPATCH;
ITypeInfo_AddRef(typeinfo); ret->typeinfo = typeinfo; diff --git a/dlls/mshtml/tests/activex.c b/dlls/mshtml/tests/activex.c index e861d37..0bb2837 100644 --- a/dlls/mshtml/tests/activex.c +++ b/dlls/mshtml/tests/activex.c @@ -331,6 +331,7 @@ static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoi
static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *pUnkSink, DWORD *pdwCookie) { + DispActiveXTest *ax_test; IDispatchEx *dispex; HRESULT hres;
@@ -342,6 +343,10 @@ static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown * hres = IUnknown_QueryInterface(pUnkSink, &IID_IDispatchEx, (void**)&dispex); ok(hres == E_NOINTERFACE, "QueryInterface(IID_IDispatchEx) returned: %08x\n", hres);
+ hres = IUnknown_QueryInterface(pUnkSink, &DIID_DispActiveXTest, (void**)&ax_test); + ok(hres == S_OK, "Could not get DispActiveXTest iface: %08x\n", hres); + DispActiveXTest_Release(ax_test); + *pdwCookie = 0xdeadbeef; return S_OK; }