[PATCH v2] mshtml: Add support for DIID_HTMLDocumentEvents2 connection point sink.

Dmitry Timoshkov dmitry at baikal.ru
Wed Jun 19 07:27:28 CDT 2019


This patch makes event handling work in a fairly large and complex application.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/mshtml/htmldoc.c        |  3 +-
 dlls/mshtml/htmlevent.c      |  2 ++
 dlls/mshtml/mshtml_private.h |  1 +
 dlls/mshtml/tests/events.c   | 55 ++++++++++++++++++++++++++++++++----
 4 files changed, 55 insertions(+), 6 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 54787f03b7..af99d643ac 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -5216,12 +5216,13 @@ static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv)
 }
 
 static cp_static_data_t HTMLDocumentEvents_data = { HTMLDocumentEvents_tid, HTMLDocument_on_advise };
+static cp_static_data_t HTMLDocumentEvents2_data = { HTMLDocumentEvents2_tid, HTMLDocument_on_advise, TRUE };
 
 static const cpc_entry_t HTMLDocument_cpc[] = {
     {&IID_IDispatch, &HTMLDocumentEvents_data},
     {&IID_IPropertyNotifySink},
     {&DIID_HTMLDocumentEvents, &HTMLDocumentEvents_data},
-    {&DIID_HTMLDocumentEvents2},
+    {&DIID_HTMLDocumentEvents2, &HTMLDocumentEvents2_data},
     {NULL}
 };
 
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index b090d1c828..4cf994587f 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -2412,6 +2412,8 @@ static HRESULT call_cp_func(IDispatch *disp, DISPID dispid, IHTMLEventObj *event
     ULONG argerr;
     EXCEPINFO ei;
 
+    TRACE("%p,%d,%p,%p\n", disp, dispid, event_obj, retv);
+
     if(event_obj) {
         V_VT(&event_arg) = VT_DISPATCH;
         V_DISPATCH(&event_arg) = (IDispatch*)event_obj;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index a36da94e43..6bfce89698 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -136,6 +136,7 @@ typedef struct EventTarget EventTarget;
     XDIID(DispSVGSVGElement) \
     XDIID(DispSVGTSpanElement) \
     XDIID(HTMLDocumentEvents) \
+    XDIID(HTMLDocumentEvents2) \
     XDIID(HTMLElementEvents2) \
     XIID(IDOMCustomEvent) \
     XIID(IDOMEvent) \
diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c
index f9bf88e97c..a1cc1c9efd 100644
--- a/dlls/mshtml/tests/events.c
+++ b/dlls/mshtml/tests/events.c
@@ -93,7 +93,7 @@ DEFINE_EXPECT(iframe_onload);
 static HWND container_hwnd = NULL;
 static IHTMLWindow2 *window;
 static IOleDocumentView *view;
-static BOOL is_ie9plus;
+static BOOL is_ie9plus, use_events2;
 static int document_mode;
 static unsigned in_fire_event;
 
@@ -1446,8 +1446,22 @@ static void _test_cp_args(unsigned line, REFIID riid, WORD flags, DISPPARAMS *dp
     ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid));
     ok_(__FILE__,line)(flags == DISPATCH_METHOD, "flags = %x\n", flags);
     ok_(__FILE__,line)(dp != NULL, "dp == NULL\n");
-    ok_(__FILE__,line)(!dp->cArgs, "dp->cArgs = %d\n", dp->cArgs);
-    ok_(__FILE__,line)(!dp->rgvarg, "dp->rgvarg = %p\n", dp->rgvarg);
+    if (use_events2)
+    {
+        IHTMLEventObj *event;
+        HRESULT hr;
+        ok_(__FILE__,line)(dp->cArgs == 1, "dp->cArgs = %d\n", dp->cArgs);
+        ok_(__FILE__,line)(dp->rgvarg != NULL, "dp->rgvarg = %p\n", dp->rgvarg);
+        ok_(__FILE__,line)(V_VT(&dp->rgvarg[0]) == VT_DISPATCH, "vt = %d\n", V_VT(&dp->rgvarg[0]));
+        hr = IDispatch_QueryInterface(V_DISPATCH(&dp->rgvarg[0]), &IID_IHTMLEventObj, (void **)&event);
+        ok_(__FILE__,line)(hr == S_OK, "Could not get IHTMLEventObj iface: %08x\n", hr);
+        IHTMLEventObj_Release(event);
+    }
+    else
+    {
+        ok_(__FILE__,line)(!dp->cArgs, "dp->cArgs = %d\n", dp->cArgs);
+        ok_(__FILE__,line)(!dp->rgvarg, "dp->rgvarg = %p\n", dp->rgvarg);
+    }
     ok_(__FILE__,line)(!dp->cNamedArgs, "dp->cNamedArgs = %d\n", dp->cNamedArgs);
     ok_(__FILE__,line)(!dp->rgdispidNamedArgs, "dp->rgdispidNamedArgs = %p\n", dp->rgdispidNamedArgs);
     ok_(__FILE__,line)(vres != NULL, "vres == NULL\n");
@@ -1501,6 +1515,25 @@ static HRESULT WINAPI doccp(IDispatchEx *iface, DISPID dispIdMember,
 
 CONNECTION_POINT_OBJ(doccp, DIID_HTMLDocumentEvents);
 
+static HRESULT WINAPI doccp2(IDispatchEx *iface, DISPID dispIdMember,
+                            REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
+                            VARIANT *pVarResult, EXCEPINFO *pei, UINT *puArgErr)
+{
+    switch(dispIdMember) {
+    case DISPID_HTMLDOCUMENTEVENTS_ONCLICK:
+        CHECK_EXPECT(doccp_onclick);
+        test_cp_args(riid, wFlags, pdp, pVarResult, pei, puArgErr);
+        break;
+    default:
+        ok(0, "unexpected call %d\n", dispIdMember);
+        return E_NOTIMPL;
+    }
+
+    return S_OK;
+}
+
+CONNECTION_POINT_OBJ(doccp2, DIID_HTMLDocumentEvents2);
+
 static HRESULT WINAPI doccp_onclick_cancel(IDispatchEx *iface, DISPID dispIdMember,
         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pVarResult, EXCEPINFO *pei, UINT *puArgErr)
 {
@@ -1936,7 +1969,10 @@ static void test_onclick(IHTMLDocument2 *doc)
     CHECK_CALLED(document_onclick);
     CHECK_CALLED(invoke_onclick);
 
-    cp_cookie = register_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, (IUnknown*)&doccp_obj);
+    if (use_events2)
+        cp_cookie = register_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents2, (IUnknown*)&doccp2_obj);
+    else
+        cp_cookie = register_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, (IUnknown*)&doccp_obj);
     elem_attach_event((IUnknown*)div, "onclick", (IDispatch*)&div_onclick_disp);
     doc_attach_event(doc, "onclick", (IDispatch*)&doc_onclick_attached_obj);
 
@@ -2005,7 +2041,10 @@ static void test_onclick(IHTMLDocument2 *doc)
     CHECK_CALLED(invoke_onclick);
 
     unregister_cp((IUnknown*)div, &DIID_HTMLElementEvents2, elem2_cp_cookie);
-    unregister_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, cp_cookie);
+    if (use_events2)
+        unregister_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents2, cp_cookie);
+    else
+        unregister_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, cp_cookie);
 
     V_VT(&v) = VT_NULL;
     hres = IHTMLElement_put_onclick(div, v);
@@ -3452,6 +3491,12 @@ START_TEST(events)
         run_test(empty_doc_str, test_timeout);
         run_test(empty_doc_str, test_onclick);
         run_test(empty_doc_ie9_str, test_onclick);
+
+        use_events2 = TRUE;
+        run_test(empty_doc_str, test_onclick);
+        run_test(empty_doc_ie9_str, test_onclick);
+        use_events2 = FALSE;
+
         run_test(readystate_doc_str, test_onreadystatechange);
         run_test(readystate_doc_ie9_str, test_onreadystatechange);
         run_test(img_doc_str, test_imgload);
-- 
2.20.1




More information about the wine-devel mailing list