uiautomationcore: Allow for refusal of HWND providers on node creation by non-nested node providers.

Signed-off-by: Connor McAdams <cmcadams@codeweavers.com>
This commit is contained in:
Connor McAdams 2023-06-15 13:08:57 -04:00 committed by Alexandre Julliard
parent aaf304f244
commit 68d0c88b06
3 changed files with 10 additions and 7 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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);