Module: wine Branch: master Commit: bc584afad9e27159214948b5a283d809832d436c URL: https://gitlab.winehq.org/wine/wine/-/commit/bc584afad9e27159214948b5a283d80...
Author: Connor McAdams cmcadams@codeweavers.com Date: Tue Jun 14 12:49:20 2022 -0400
uiautomationcore: Implement UiaNodeRelease.
Signed-off-by: Connor McAdams cmcadams@codeweavers.com
---
dlls/uiautomationcore/tests/uiautomation.c | 13 ++++++------- dlls/uiautomationcore/uia_client.c | 24 ++++++++++++++++++++++++ dlls/uiautomationcore/uiautomationcore.spec | 2 +- include/uiautomationcoreapi.h | 1 + 4 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c index 35b7e738bd4..677933765a9 100644 --- a/dlls/uiautomationcore/tests/uiautomation.c +++ b/dlls/uiautomationcore/tests/uiautomation.c @@ -3597,8 +3597,7 @@ static void test_UiaNodeFromProvider(void) ref = IUnknown_AddRef((IUnknown *)node); ok(ref == 3, "Unexpected refcnt %ld\n", ref);
- ref = IUnknown_Release((IUnknown *)node); - ok(ref == 2, "Unexpected refcnt %ld\n", ref); + ok(UiaNodeRelease(node), "UiaNodeRelease returned FALSE\n");
ref = IUnknown_Release((IUnknown *)node); ok(ref == 1, "Unexpected refcnt %ld\n", ref); @@ -3626,7 +3625,7 @@ static void test_UiaNodeFromProvider(void) }
ok_method_sequence(node_from_prov3, "node_from_prov3"); - IUnknown_Release((IUnknown *)node); + ok(UiaNodeRelease(node), "UiaNodeRelease returned FALSE\n"); ok(Provider_child.ref == 1, "Unexpected refcnt %ld\n", Provider_child.ref);
/* HWND exposed, but Provider2 not returned from WM_GETOBJECT. */ @@ -3668,7 +3667,7 @@ static void test_UiaNodeFromProvider(void) ok_method_sequence(node_from_prov4, "node_from_prov4");
ok(!!node, "node == NULL\n"); - IUnknown_Release((IUnknown *)node); + ok(UiaNodeRelease(node), "UiaNodeRelease returned FALSE\n"); ok(Provider.ref == 1, "Unexpected refcnt %ld\n", Provider.ref);
/* Return Provider2 in response to WM_GETOBJECT. */ @@ -3713,7 +3712,7 @@ static void test_UiaNodeFromProvider(void)
ok_method_sequence(node_from_prov5, "node_from_prov5");
- IUnknown_Release((IUnknown *)node); + ok(UiaNodeRelease(node), "UiaNodeRelease returned FALSE\n"); ok(Provider.ref == 1, "Unexpected refcnt %ld\n", Provider.ref); ok(Provider2.ref == 1, "Unexpected refcnt %ld\n", Provider2.ref);
@@ -3749,7 +3748,7 @@ static void test_UiaNodeFromProvider(void) ok(Provider.ref == 2, "Unexpected refcnt %ld\n", Provider.ref);
ok(!!node, "node == NULL\n"); - IUnknown_Release((IUnknown *)node); + ok(UiaNodeRelease(node), "UiaNodeRelease returned FALSE\n"); ok(Provider.ref == 1, "Unexpected refcnt %ld\n", Provider.ref); ok(Provider2.ref == 1, "Unexpected refcnt %ld\n", Provider2.ref);
@@ -3783,7 +3782,7 @@ static void test_UiaNodeFromProvider(void) ok(Provider_child.ref == 2, "Unexpected refcnt %ld\n", Provider.ref);
ok(!!node, "node == NULL\n"); - IUnknown_Release((IUnknown *)node); + ok(UiaNodeRelease(node), "UiaNodeRelease returned FALSE\n"); ok(Provider_child.ref == 1, "Unexpected refcnt %ld\n", Provider.ref); ok(Provider2.ref == 1, "Unexpected refcnt %ld\n", Provider2.ref);
diff --git a/dlls/uiautomationcore/uia_client.c b/dlls/uiautomationcore/uia_client.c index c82064fbe34..58b9bc07a79 100644 --- a/dlls/uiautomationcore/uia_client.c +++ b/dlls/uiautomationcore/uia_client.c @@ -84,6 +84,14 @@ static const IWineUiaNodeVtbl uia_node_vtbl = { uia_node_Release, };
+static struct uia_node *unsafe_impl_from_IWineUiaNode(IWineUiaNode *iface) +{ + if (!iface || (iface->lpVtbl != &uia_node_vtbl)) + return NULL; + + return CONTAINING_RECORD(iface, struct uia_node, IWineUiaNode_iface); +} + /*********************************************************************** * UiaNodeFromProvider (uiautomationcore.@) */ @@ -124,3 +132,19 @@ HRESULT WINAPI UiaNodeFromProvider(IRawElementProviderSimple *elprov, HUIANODE *
return hr; } + +/*********************************************************************** + * UiaNodeRelease (uiautomationcore.@) + */ +BOOL WINAPI UiaNodeRelease(HUIANODE huianode) +{ + struct uia_node *node = unsafe_impl_from_IWineUiaNode((IWineUiaNode *)huianode); + + TRACE("(%p)\n", huianode); + + if (!node) + return FALSE; + + IWineUiaNode_Release(&node->IWineUiaNode_iface); + return TRUE; +} diff --git a/dlls/uiautomationcore/uiautomationcore.spec b/dlls/uiautomationcore/uiautomationcore.spec index 887741fa43b..4315abf7433 100644 --- a/dlls/uiautomationcore/uiautomationcore.spec +++ b/dlls/uiautomationcore/uiautomationcore.spec @@ -80,7 +80,7 @@ @ stub UiaNodeFromHandle @ stub UiaNodeFromPoint @ stdcall UiaNodeFromProvider(ptr ptr) -@ stub UiaNodeRelease +@ stdcall UiaNodeRelease(ptr) @ stub UiaPatternRelease #@ stub UiaProviderForNonClient @ stdcall UiaProviderFromIAccessible(ptr long long ptr) diff --git a/include/uiautomationcoreapi.h b/include/uiautomationcoreapi.h index 353547c4ad6..e74271007fe 100644 --- a/include/uiautomationcoreapi.h +++ b/include/uiautomationcoreapi.h @@ -257,6 +257,7 @@ HRESULT WINAPI UiaHostProviderFromHwnd(HWND hwnd, IRawElementProviderSimple **el HRESULT WINAPI UiaProviderFromIAccessible(IAccessible *acc, long child_id, DWORD flags, IRawElementProviderSimple **elprov); HRESULT WINAPI UiaGetPropertyValue(HUIANODE huianode, PROPERTYID prop_id, VARIANT *out_val); HRESULT WINAPI UiaNodeFromProvider(IRawElementProviderSimple *elprov, HUIANODE *huianode); +BOOL WINAPI UiaNodeRelease(HUIANODE huianode);
#ifdef __cplusplus }