From: Connor McAdams <cmcadams(a)codeweavers.com> Signed-off-by: Connor McAdams <cmcadams(a)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 } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/471