From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/uiautomationcore/tests/uiautomation.c | 4 +-- dlls/uiautomationcore/uia_com_client.c | 29 ++++++++++++++++++++-- 2 files changed, 29 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 63abc3cb931..55abda5e86d 100644 --- a/dlls/uiautomationcore/uia_com_client.c +++ b/dlls/uiautomationcore/uia_com_client.c @@ -949,6 +949,13 @@ static HRESULT uia_event_handlers_add_handler(IUnknown *handler_iface, int event return hr; }
+static void uia_event_handlers_destroy_handler(struct uia_com_event *event) +{ + list_remove(&event->event_handler_list_entry); + IUnknown_Release(event->handler_iface); + heap_free(event); +} + /* * IUIAutomationElementArray interface. */ @@ -3185,8 +3192,26 @@ 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 list *cursor, *cursor2; + + TRACE("%p\n", iface); + + EnterCriticalSection(&com_event_handlers_cs); + if (!com_event_handlers.handler_count) + goto exit; + + LIST_FOR_EACH_SAFE(cursor, cursor2, &com_event_handlers.handler_list) + { + struct uia_com_event *event = LIST_ENTRY(cursor, struct uia_com_event, event_handler_list_entry); + + uia_event_handlers_destroy_handler(event); + com_event_handlers.handler_count--; + } + +exit: + LeaveCriticalSection(&com_event_handlers_cs); + + return S_OK; }
static HRESULT WINAPI uia_iface_IntNativeArrayToSafeArray(IUIAutomation6 *iface, int *arr, int arr_count,