Connor McAdams : uiautomationcore: Implement UiaNodeRelease.
Alexandre Julliard
julliard at winehq.org
Tue Jul 19 15:53:47 CDT 2022
Module: wine
Branch: master
Commit: bc584afad9e27159214948b5a283d809832d436c
URL: https://gitlab.winehq.org/wine/wine/-/commit/bc584afad9e27159214948b5a283d809832d436c
Author: Connor McAdams <cmcadams at codeweavers.com>
Date: Tue Jun 14 12:49:20 2022 -0400
uiautomationcore: Implement UiaNodeRelease.
Signed-off-by: Connor McAdams <cmcadams at 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
}
More information about the wine-cvs
mailing list