Module: wine Branch: master Commit: bce0ebafa6e0d021f9ba27960abe74c83b63a3cc URL: https://gitlab.winehq.org/wine/wine/-/commit/bce0ebafa6e0d021f9ba27960abe74c...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Fri Apr 14 16:52:51 2023 +0300
mshtml: Implement MediaQueryList's removeListener method.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/mshtml/omnavigator.c | 17 +++++++++++++++-- dlls/mshtml/tests/es5.js | 10 +++++++++- 2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index b95d2d74e93..298d99f86eb 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 8bd8d8e7d06..982544f6b84 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2101,6 +2101,8 @@ async_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);
@@ -2117,7 +2119,9 @@ async_test("matchMedia", function() { } var tests = [ [ 20, 20, function() { - var r = mql.addListener(handler); + var r = mql.removeListener("function() { ok(false, 'string handler called'); }"); + ok(r === undefined, "removeListener with string returned " + r); + r = mql.addListener(handler); ok(r === undefined, "addListener with function returned " + r); }], [ 120, 120, function() { @@ -2129,8 +2133,12 @@ async_test("matchMedia", function() { [ 30, 30, 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"); + var r = mql.removeListener(handler); + ok(r === undefined, "removeListener with function returned " + r); }], [ 300, 300, function() { + 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"); }] ];