Jacek Caban : mshtml: Forward PluginHost' s QueryService calls to window object.
Alexandre Julliard
julliard at winehq.org
Wed Dec 15 11:29:56 CST 2010
Module: wine
Branch: master
Commit: 79f400c06234c0ba454f24b0ea7b4ba24a7dfed8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=79f400c06234c0ba454f24b0ea7b4ba24a7dfed8
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Dec 15 00:42:53 2010 +0100
mshtml: Forward PluginHost's QueryService calls to window object.
---
dlls/mshtml/pluginhost.c | 10 +++++-
dlls/mshtml/tests/activex.c | 68 +++++++++++++++++++++++++++++++++++++++++-
2 files changed, 74 insertions(+), 4 deletions(-)
diff --git a/dlls/mshtml/pluginhost.c b/dlls/mshtml/pluginhost.c
index f037eca..1f5ca00 100644
--- a/dlls/mshtml/pluginhost.c
+++ b/dlls/mshtml/pluginhost.c
@@ -1020,8 +1020,14 @@ static HRESULT WINAPI PHServiceProvider_QueryService(IServiceProvider *iface, RE
return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
}
- FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
- return E_NOINTERFACE;
+ TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
+
+ if(!This->doc || !This->doc->basedoc.window) {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ return IServiceProvider_QueryService(SERVPROV(This->doc->basedoc.window), guidService, riid, ppv);
}
static const IServiceProviderVtbl ServiceProviderVtbl = {
diff --git a/dlls/mshtml/tests/activex.c b/dlls/mshtml/tests/activex.c
index 1036577..f163c6c 100644
--- a/dlls/mshtml/tests/activex.c
+++ b/dlls/mshtml/tests/activex.c
@@ -29,7 +29,10 @@
#include "mshtml.h"
#include "docobj.h"
#include "hlink.h"
+#include "dispex.h"
#include "mshtmhst.h"
+#include "activscp.h"
+#include "objsafe.h"
#include "mshtml_test.h"
#define DEFINE_EXPECT(func) \
@@ -75,6 +78,7 @@ DEFINE_EXPECT(InPlaceObject_GetWindow);
DEFINE_EXPECT(SetObjectRects);
DEFINE_EXPECT(InPlaceDeactivate);
DEFINE_EXPECT(UIDeactivate);
+DEFINE_EXPECT(QueryService_TestActiveX);
static HWND container_hwnd, plugin_hwnd;
@@ -471,7 +475,7 @@ static HRESULT WINAPI PersistPropertyBag_Load(IPersistPropertyBag *face, IProper
hres = IOleClientSite_QueryInterface(client_site, &IID_IServiceProvider, (void**)&sp);
ok(hres == S_OK, "Could not get IServiceProvider iface: %08x\n", hres);
- hres = IServiceProvider_QueryService(sp, &IID_IBindHost, &SID_SBindHost, (void**)&bind_host2);
+ hres = IServiceProvider_QueryService(sp, &SID_SBindHost, &IID_IBindHost, (void**)&bind_host2);
ok(hres == S_OK, "QueryService(SID_SBindHost) failed: %08x\n", hres);
IServiceProvider_Release(sp);
@@ -1166,9 +1170,11 @@ static IClassFactory activex_cf = { &ClassFactoryVtbl };
static void test_container(IHTMLDocument2 *doc_obj)
{
- IHTMLWindow2 *parent_window;
+ IHTMLWindow2 *parent_window, *html_window;
+ IServiceProvider *serv_prov;
IOleContainer *container;
IHTMLDocument2 *doc;
+ IUnknown *unk;
HRESULT hres;
container = NULL;
@@ -1186,6 +1192,23 @@ static void test_container(IHTMLDocument2 *doc_obj)
ok(iface_cmp((IUnknown*)doc, (IUnknown*)container), "container != doc\n");
IHTMLDocument2_Release(doc);
+ hres = IOleClientSite_QueryInterface(client_site, &IID_IServiceProvider, (void**)&serv_prov);
+ ok(hres == S_OK, "Could not get IServiceProvider iface: %08x\n", hres);
+
+ hres = IServiceProvider_QueryService(serv_prov, &IID_IHTMLWindow2, &IID_IHTMLWindow2, (void**)&html_window);
+ ok(hres == S_OK, "Could not get IHTMLWindow2 service: %08x\n", hres);
+ todo_wine
+ ok(!iface_cmp((IUnknown*)html_window, (IUnknown*)parent_window), "html_window != parent_window\n");
+ IHTMLWindow2_Release(html_window);
+
+ SET_EXPECT(QueryService_TestActiveX);
+ hres = IServiceProvider_QueryService(serv_prov, &CLSID_TestActiveX, &IID_IUnknown, (void**)&unk);
+ ok(hres == S_OK, "QueryService(CLSID_TestActiveX) failed: %08x\n", hres);
+ ok(unk == (IUnknown*)&OleObject, "unexpected unk %p\n", unk);
+ CHECK_CALLED(QueryService_TestActiveX);
+
+ IServiceProvider_Release(serv_prov);
+
IHTMLWindow2_Release(parent_window);
IOleContainer_Release(container);
}
@@ -1567,6 +1590,45 @@ static const IOleDocumentSiteVtbl DocumentSiteVtbl = {
static IOleDocumentSite DocumentSite = { &DocumentSiteVtbl };
+static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface,
+ REFIID riid, void **ppv)
+{
+ return cs_qi(riid, ppv);
+}
+
+static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
+ REFIID riid, void **ppv)
+{
+ if(IsEqualGUID(&CLSID_TestActiveX, guidService)) {
+ CHECK_EXPECT(QueryService_TestActiveX);
+ ok(IsEqualGUID(&IID_IUnknown, riid), "unexpected riid %s\n", debugstr_guid(riid));
+ *ppv = &OleObject;
+ return S_OK;
+ }
+
+ *ppv = NULL;
+ return E_NOINTERFACE;
+}
+
+static const IServiceProviderVtbl ServiceProviderVtbl = {
+ ServiceProvider_QueryInterface,
+ ServiceProvider_AddRef,
+ ServiceProvider_Release,
+ ServiceProvider_QueryService
+};
+
+static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
+
static HRESULT cs_qi(REFIID riid, void **ppv)
{
*ppv = NULL;
@@ -1577,6 +1639,8 @@ static HRESULT cs_qi(REFIID riid, void **ppv)
*ppv = &DocumentSite;
else if(IsEqualGUID(&IID_IOleWindow, riid) || IsEqualGUID(&IID_IOleInPlaceSite, riid))
*ppv = &InPlaceSite;
+ else if(IsEqualGUID(riid, &IID_IServiceProvider))
+ *ppv = &ServiceProvider;
return *ppv ? S_OK : E_NOINTERFACE;
}
More information about the wine-cvs
mailing list