From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 11 +++++++++++ dlls/mshtml/htmlevent.c | 3 +++ dlls/mshtml/tests/events.c | 2 ++ dlls/mshtml/tests/events.js | 15 +++++++++++++++ 4 files changed, 31 insertions(+)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index ebb1a675d91..8f60ebb9be3 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1064,6 +1064,17 @@ HRESULT change_type(VARIANT *dst, VARIANT *src, VARTYPE vt, IServiceProvider *ca { V_VT(dst) = VT_EMPTY;
+ switch(vt) { + case VT_UNKNOWN: + case VT_DISPATCH: + if(V_VT(src) == VT_EMPTY || V_VT(src) == VT_NULL) { + V_VT(dst) = vt; + V_DISPATCH(dst) = NULL; + return S_OK; + } + break; + } + if(caller) { IVariantChangeType *change_type = NULL; HRESULT hres; diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 581d949a447..d9e1307d451 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -4100,6 +4100,9 @@ static HRESULT WINAPI EventTarget_addEventListener(IEventTarget *iface, BSTR typ
TRACE("(%p)->(%s %p %x)\n", This, debugstr_w(type), function, capture);
+ if(!function) + return S_OK; + container = get_listener_container(This, type, TRUE); if(!container) return E_OUTOFMEMORY; diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c index 1819bc6bdd9..b53851d61bf 100644 --- a/dlls/mshtml/tests/events.c +++ b/dlls/mshtml/tests/events.c @@ -1898,6 +1898,7 @@ static void test_onclick(IHTMLDocument2 *doc) VariantClear(&v);
if(document_mode >= 9) { + add_event_listener((IUnknown*)div, L"click", NULL, VARIANT_FALSE); add_event_listener((IUnknown*)div, L"click", (IDispatch*)&div_onclick_capture_obj, VARIANT_TRUE); add_event_listener((IUnknown*)div, L"click", (IDispatch*)&div_onclick_bubble_obj, VARIANT_FALSE); } @@ -2052,6 +2053,7 @@ static void test_onclick(IHTMLDocument2 *doc) doc_detach_event(doc, L"onclick", (IDispatch*)&doc_onclick_attached_obj);
if(document_mode >= 9) { + remove_event_listener((IUnknown*)div, L"click", NULL, VARIANT_FALSE); remove_event_listener((IUnknown*)div, L"click", (IDispatch*)&div_onclick_capture_obj, VARIANT_TRUE); remove_event_listener((IUnknown*)div, L"click", (IDispatch*)&div_onclick_bubble_obj, VARIANT_FALSE); } diff --git a/dlls/mshtml/tests/events.js b/dlls/mshtml/tests/events.js index 997e583ad20..156330e984b 100644 --- a/dlls/mshtml/tests/events.js +++ b/dlls/mshtml/tests/events.js @@ -198,6 +198,21 @@ sync_test("add_remove_listener", function() { calls = ""; div.click(); ok(calls === "", "calls = " + calls); + + /* test undefined function argument */ + div.addEventListener("click", undefined, false); + + calls = ""; + div.click(); + ok(calls === "", "calls = " + calls); + + div.addEventListener("click", listener, false); + div.removeEventListener("click", undefined); + + calls = ""; + div.click(); + ok(calls === "listener,", "calls = " + calls); + div.removeEventListener("click", listener); });
sync_test("event_phase", function() {