From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/omnavigator.c | 17 +++++++++++++++-- dlls/mshtml/tests/es5.js | 11 +++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 670dd181bce..1c6d3dc4a74 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -2817,10 +2817,23 @@ static HRESULT WINAPI media_query_list_addListener(IWineMSHTMLMediaQueryList *if static HRESULT WINAPI media_query_list_removeListener(IWineMSHTMLMediaQueryList *iface, VARIANT *listener) { struct media_query_list *media_query_list = impl_from_IWineMSHTMLMediaQueryList(iface); + struct media_query_list_listener *entry;
- FIXME("(%p)->(%s)\n", media_query_list, debugstr_variant(listener)); + TRACE("(%p)->(%s)\n", media_query_list, debugstr_variant(listener));
- return E_NOTIMPL; + if(V_VT(listener) != VT_DISPATCH || !V_DISPATCH(listener)) + return S_OK; + + LIST_FOR_EACH_ENTRY(entry, &media_query_list->listeners, struct media_query_list_listener, entry) { + if(entry->function == V_DISPATCH(listener)) { + list_remove(&entry->entry); + IDispatch_Release(entry->function); + free(entry); + break; + } + } + + return S_OK; }
static const IWineMSHTMLMediaQueryListVtbl media_query_list_vtbl = { diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 6d045e54781..6b727b9eeb7 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2101,12 +2101,17 @@ sync_test("matchMedia", function() { ok(!("removeEventListener" in mql), "removeEventListener in MediaQueryList"); r = mql.addListener(null); ok(r === undefined, "addListener with null returned " + r); + r = mql.removeListener(null); + ok(r === undefined, "removeListener with null returned " + r); r = mql.addListener("function() { ok(false, 'string handler called'); }"); ok(r === undefined, "addListener with string returned " + r);
external.setViewSize(20, 20); ok(mql.matches === true, "(max-width: 50px) does not match on a 20x20 view");
+ r = mql.removeListener("function() { ok(false, 'string handler called'); }"); + ok(r === undefined, "removeListener with string returned " + r); + var handler = function(e) { ok(this === window, "handler this = " + this); ok(e === mql, "handler argument = " + e); @@ -2133,8 +2138,14 @@ sync_test("matchMedia", function() { ok(event_fired === true, "event not fired after changing from 120x120 to 30x30 view"); ok(event2_fired === true, "event not fired from second handler after changing from 120x120 to 30x30 view");
+ r = mql.removeListener(handler); + ok(r === undefined, "removeListener with function returned " + r); + event_fired = false; event2_fired = false; external.setViewSize(300, 300); + ok(mql.matches === false, "(max-width: 50px) matches on a 300x300 view"); + ok(event_fired === false, "removed event handler fired after changing from 30x30 to 300x300 view"); + ok(event2_fired === true, "event not fired from second handler after changing from 30x30 to 300x300 view"); });
sync_test("initProgressEvent", function() {