Jacek Caban : mshtml: Added support for pure IDispatch event handlers.

Alexandre Julliard julliard at winehq.org
Mon Jan 25 11:21:07 CST 2010


Module: wine
Branch: master
Commit: 089d54f1f4248d18bfce089aec90a1517b9a4b3c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=089d54f1f4248d18bfce089aec90a1517b9a4b3c

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Jan 24 21:37:52 2010 +0100

mshtml: Added support for pure IDispatch event handlers.

---

 dlls/mshtml/dispex.c       |   17 ++++++++-------
 dlls/mshtml/tests/events.c |   47 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 4019a3c..ca09313 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -400,18 +400,19 @@ HRESULT call_disp_func(IDispatch *disp, DISPPARAMS *dp)
     VARIANT res;
     HRESULT hres;
 
-    hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
-    if(FAILED(hres)) {
-        FIXME("Could not get IDispatchEx interface: %08x\n", hres);
-        return hres;
-    }
-
     VariantInit(&res);
     memset(&ei, 0, sizeof(ei));
 
-    hres = IDispatchEx_InvokeEx(dispex, 0, GetUserDefaultLCID(), DISPATCH_METHOD, dp, &res, &ei, NULL);
+    hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
+    if(SUCCEEDED(hres)) {
+        hres = IDispatchEx_InvokeEx(dispex, 0, GetUserDefaultLCID(), DISPATCH_METHOD, dp, &res, &ei, NULL);
+        IDispatchEx_Release(dispex);
+    }else {
+        TRACE("Could not get IDispatchEx interface: %08x\n", hres);
+        hres = IDispatch_Invoke(disp, 0, &IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD,
+                dp, &res, &ei, NULL);
+    }
 
-    IDispatchEx_Release(dispex);
     VariantClear(&res);
     return hres;
 }
diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c
index 84bfae2..81e7cab 100644
--- a/dlls/mshtml/tests/events.c
+++ b/dlls/mshtml/tests/events.c
@@ -63,6 +63,7 @@ DEFINE_EXPECT(div_onclick);
 DEFINE_EXPECT(div_onclick_attached);
 DEFINE_EXPECT(timeout);
 DEFINE_EXPECT(doccp_onclick);
+DEFINE_EXPECT(div_onclick_disp);
 DEFINE_EXPECT(iframe_onreadystatechange_loading);
 DEFINE_EXPECT(iframe_onreadystatechange_interactive);
 DEFINE_EXPECT(iframe_onreadystatechange_complete);
@@ -690,6 +691,23 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid,
     return S_OK;
 }
 
+static HRESULT WINAPI Dispatch_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
+{
+    *ppv = NULL;
+
+    if(IsEqualGUID(riid, &IID_IUnknown)
+       || IsEqualGUID(riid, &IID_IDispatch)) {
+        *ppv = iface;
+    }else if(IsEqualGUID(riid, &IID_IDispatchEx)) {
+        return E_NOINTERFACE;
+    }else {
+        ok(0, "unexpected riid %s\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
+    }
+
+    return S_OK;
+}
+
 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
 {
     return 2;
@@ -1015,6 +1033,32 @@ static IDispatchExVtbl timeoutFuncVtbl = {
 
 static IDispatchEx timeoutFunc = { &timeoutFuncVtbl };
 
+static HRESULT WINAPI div_onclick_disp_Invoke(IDispatchEx *iface, DISPID id,
+        REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
+        VARIANT *pvarRes, EXCEPINFO *pei, UINT *puArgErr)
+{
+    CHECK_EXPECT(div_onclick_disp);
+
+    test_attached_event_args(id, wFlags, pdp, pvarRes, pei);
+
+    ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid));
+    ok(!puArgErr, "puArgErr = %p\n", puArgErr);
+
+    return S_OK;
+}
+
+static IDispatchExVtbl div_onclick_dispVtbl = {
+    Dispatch_QueryInterface,
+    DispatchEx_AddRef,
+    DispatchEx_Release,
+    DispatchEx_GetTypeInfoCount,
+    DispatchEx_GetTypeInfo,
+    DispatchEx_GetIDsOfNames,
+    div_onclick_disp_Invoke,
+};
+
+static IDispatchEx div_onclick_disp = { &div_onclick_dispVtbl };
+
 static void pump_msgs(BOOL *b)
 {
     MSG msg;
@@ -1163,8 +1207,10 @@ static void test_onclick(IHTMLDocument2 *doc)
     CHECK_CALLED(document_onclick);
 
     cp_cookie = register_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, (IUnknown*)&doccp_obj);
+    elem_attach_event((IUnknown*)div, "onclick", (IDispatch*)&div_onclick_disp);
 
     SET_EXPECT(div_onclick);
+    SET_EXPECT(div_onclick_disp);
     SET_EXPECT(div_onclick_attached);
     SET_EXPECT(body_onclick);
     SET_EXPECT(document_onclick);
@@ -1174,6 +1220,7 @@ static void test_onclick(IHTMLDocument2 *doc)
     ok(hres == S_OK, "click failed: %08x\n", hres);
 
     CHECK_CALLED(div_onclick);
+    CHECK_CALLED(div_onclick_disp);
     CHECK_CALLED(div_onclick_attached);
     CHECK_CALLED(body_onclick);
     CHECK_CALLED(document_onclick);




More information about the wine-cvs mailing list