From 68d0c88b069d838efd8683da135f591fd17a0ff6 Mon Sep 17 00:00:00 2001 From: Connor McAdams Date: Thu, 15 Jun 2023 13:08:57 -0400 Subject: [PATCH] uiautomationcore: Allow for refusal of HWND providers on node creation by non-nested node providers. Signed-off-by: Connor McAdams --- dlls/uiautomationcore/uia_client.c | 14 ++++++++------ dlls/uiautomationcore/uia_private.h | 1 + dlls/uiautomationcore/uia_provider.c | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dlls/uiautomationcore/uia_client.c b/dlls/uiautomationcore/uia_client.c index 8dac22db066..d9a13647246 100644 --- a/dlls/uiautomationcore/uia_client.c +++ b/dlls/uiautomationcore/uia_client.c @@ -1334,13 +1334,14 @@ static ULONG WINAPI uia_provider_Release(IWineUiaProvider *iface) } static HRESULT get_variant_for_elprov_node(IRawElementProviderSimple *elprov, BOOL out_nested, - VARIANT *v) + BOOL refuse_hwnd_providers, VARIANT *v) { HUIANODE node; HRESULT hr; VariantInit(v); - hr = create_uia_node_from_elprov(elprov, &node, !out_nested); + + hr = create_uia_node_from_elprov(elprov, &node, !refuse_hwnd_providers); IRawElementProviderSimple_Release(elprov); if (SUCCEEDED(hr)) { @@ -1444,7 +1445,7 @@ static HRESULT uia_provider_get_elem_prop_val(struct uia_provider *prov, if (FAILED(hr)) goto exit; - hr = get_variant_for_elprov_node(elprov, prov->return_nested_node, ret_val); + hr = get_variant_for_elprov_node(elprov, prov->return_nested_node, prov->refuse_hwnd_node_providers, ret_val); if (FAILED(hr)) return hr; @@ -1770,7 +1771,7 @@ static HRESULT WINAPI uia_provider_navigate(IWineUiaProvider *iface, int nav_dir if (FAILED(hr) || !elprov) return hr; - hr = get_variant_for_elprov_node(elprov, prov->return_nested_node, out_val); + hr = get_variant_for_elprov_node(elprov, prov->return_nested_node, prov->refuse_hwnd_node_providers, out_val); if (FAILED(hr)) return hr; } @@ -1802,7 +1803,7 @@ static HRESULT WINAPI uia_provider_get_focus(IWineUiaProvider *iface, VARIANT *o IRawElementProviderFragment_Release(elfrag); if (SUCCEEDED(hr)) { - hr = get_variant_for_elprov_node(elprov, prov->return_nested_node, out_val); + hr = get_variant_for_elprov_node(elprov, prov->return_nested_node, prov->refuse_hwnd_node_providers, out_val); if (FAILED(hr)) VariantClear(out_val); } @@ -1881,7 +1882,7 @@ static HRESULT WINAPI uia_provider_attach_event(IWineUiaProvider *iface, LONG_PT if (FAILED(hr)) goto exit; - hr = create_uia_node_from_elprov(elprov, &node, !prov->return_nested_node); + hr = create_uia_node_from_elprov(elprov, &node, !prov->refuse_hwnd_node_providers); IRawElementProviderSimple_Release(elprov); if (SUCCEEDED(hr)) { @@ -2437,6 +2438,7 @@ static HRESULT create_wine_uia_nested_node_provider(struct uia_node *node, LRESU IWineUiaProvider_AddRef(provider_iface); prov_data = impl_from_IWineUiaProvider(provider_iface); + prov_data->refuse_hwnd_node_providers = FALSE; prov_data->return_nested_node = FALSE; prov_data->parent_check_ran = FALSE; diff --git a/dlls/uiautomationcore/uia_private.h b/dlls/uiautomationcore/uia_private.h index 807ca134521..11cab86651c 100644 --- a/dlls/uiautomationcore/uia_private.h +++ b/dlls/uiautomationcore/uia_private.h @@ -84,6 +84,7 @@ struct uia_provider { LONG ref; IRawElementProviderSimple *elprov; + BOOL refuse_hwnd_node_providers; BOOL return_nested_node; BOOL parent_check_ran; BOOL has_parent; diff --git a/dlls/uiautomationcore/uia_provider.c b/dlls/uiautomationcore/uia_provider.c index 38ddcd8678f..f13b028cad6 100644 --- a/dlls/uiautomationcore/uia_provider.c +++ b/dlls/uiautomationcore/uia_provider.c @@ -1751,7 +1751,7 @@ static HRESULT uia_provider_thread_add_node(HUIANODE node, SAFEARRAY *rt_id) HRESULT hr = S_OK; prov_data = impl_from_IWineUiaProvider(node_data->prov[prov_type]); - node_data->nested_node = prov_data->return_nested_node = TRUE; + node_data->nested_node = prov_data->return_nested_node = prov_data->refuse_hwnd_node_providers = TRUE; TRACE("Adding node %p\n", node);