Module: wine Branch: master Commit: 15d352c587d5319e45e404a62c78e4639269a71b URL: https://gitlab.winehq.org/wine/wine/-/commit/15d352c587d5319e45e404a62c78e46...
Author: Connor McAdams cmcadams@codeweavers.com Date: Mon Jul 17 08:37:45 2023 -0400
uiautomationcore: Implement IUIAutomation::RemoveAllEventHandlers.
Signed-off-by: Connor McAdams cmcadams@codeweavers.com
---
dlls/uiautomationcore/tests/uiautomation.c | 4 ++-- dlls/uiautomationcore/uia_com_client.c | 32 ++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c index b71d89bba45..545fc7d0bfc 100644 --- a/dlls/uiautomationcore/tests/uiautomation.c +++ b/dlls/uiautomationcore/tests/uiautomation.c @@ -13217,8 +13217,8 @@ static void test_IUIAutomationEventHandler(IUIAutomation *uia_iface, IUIAutomati ok(AutomationEventHandler.ref > 1, "Unexpected refcnt %ld\n", AutomationEventHandler.ref);
hr = IUIAutomation_RemoveAllEventHandlers(uia_iface); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(AutomationEventHandler.ref == 1, "Unexpected refcnt %ld\n", AutomationEventHandler.ref); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(AutomationEventHandler.ref == 1, "Unexpected refcnt %ld\n", AutomationEventHandler.ref);
IUIAutomationElement_Release(elem2); } diff --git a/dlls/uiautomationcore/uia_com_client.c b/dlls/uiautomationcore/uia_com_client.c index 6616568d535..cba1f7f68a4 100644 --- a/dlls/uiautomationcore/uia_com_client.c +++ b/dlls/uiautomationcore/uia_com_client.c @@ -3261,8 +3261,36 @@ static HRESULT WINAPI uia_iface_RemoveFocusChangedEventHandler(IUIAutomation6 *i
static HRESULT WINAPI uia_iface_RemoveAllEventHandlers(IUIAutomation6 *iface) { - FIXME("%p: stub\n", iface); - return E_NOTIMPL; + struct uia_event_handler_map_entry *entry, *cursor; + + TRACE("%p\n", iface); + + EnterCriticalSection(&com_event_handlers_cs); + if (!com_event_handlers.handler_count) + goto exit; + + RB_FOR_EACH_ENTRY_DESTRUCTOR(entry, cursor, &com_event_handlers.handler_map, struct uia_event_handler_map_entry, entry) + { + struct uia_com_event *event, *event2; + + LIST_FOR_EACH_ENTRY_SAFE(event, event2, &entry->handlers_list, struct uia_com_event, event_handler_map_list_entry) + { + list_remove(&event->event_handler_map_list_entry); + IUnknown_Release(event->handler_iface); + com_event_handlers.handler_count--; + heap_free(event); + } + + rb_remove(&com_event_handlers.handler_map, &entry->entry); + IUnknown_Release(entry->handler_iface); + SafeArrayDestroy(entry->runtime_id); + heap_free(entry); + } + +exit: + LeaveCriticalSection(&com_event_handlers_cs); + + return S_OK; }
static HRESULT WINAPI uia_iface_IntNativeArrayToSafeArray(IUIAutomation6 *iface, int *arr, int arr_count,