uiautomationcore: Add support for marking the root IAccessible as known on non-root IAccessibles upon proxy provider creation.

Signed-off-by: Connor McAdams <cmcadams@codeweavers.com>
This commit is contained in:
Connor McAdams 2023-09-25 12:33:07 -04:00 committed by Alexandre Julliard
parent a2bf252c4b
commit 0254db3492
4 changed files with 18 additions and 15 deletions

View file

@ -3013,7 +3013,7 @@ static SAFEARRAY WINAPI *default_uia_provider_callback(HWND hwnd, enum ProviderT
if (FAILED(hr) || !acc)
break;
hr = create_msaa_provider(acc, CHILDID_SELF, hwnd, TRUE, &elprov);
hr = create_msaa_provider(acc, CHILDID_SELF, hwnd, TRUE, TRUE, &elprov);
if (FAILED(hr))
WARN("Failed to create MSAA proxy provider with hr %#lx\n", hr);

View file

@ -564,7 +564,7 @@ static HRESULT create_msaa_provider_from_hwnd(HWND hwnd, int in_child_id, IRawEl
}
}
hr = create_msaa_provider(acc, child_id, hwnd, in_child_id == CHILDID_SELF, &elprov);
hr = create_msaa_provider(acc, child_id, hwnd, TRUE, in_child_id == CHILDID_SELF, &elprov);
IAccessible_Release(acc);
if (FAILED(hr))
return hr;

View file

@ -243,8 +243,8 @@ HRESULT create_base_hwnd_provider(HWND hwnd, IRawElementProviderSimple **elprov)
void uia_stop_provider_thread(void) DECLSPEC_HIDDEN;
void uia_provider_thread_remove_node(HUIANODE node) DECLSPEC_HIDDEN;
LRESULT uia_lresult_from_node(HUIANODE huianode) DECLSPEC_HIDDEN;
HRESULT create_msaa_provider(IAccessible *acc, LONG child_id, HWND hwnd, BOOL known_root_acc,
IRawElementProviderSimple **elprov) DECLSPEC_HIDDEN;
HRESULT create_msaa_provider(IAccessible *acc, LONG child_id, HWND hwnd, BOOL root_acc_known,
BOOL is_root_acc, IRawElementProviderSimple **elprov) DECLSPEC_HIDDEN;
/* uia_utils.c */
HRESULT register_interface_in_git(IUnknown *iface, REFIID riid, DWORD *ret_cookie) DECLSPEC_HIDDEN;

View file

@ -855,7 +855,7 @@ static HRESULT WINAPI msaa_fragment_Navigate(IRawElementProviderFragment *iface,
else
acc = msaa_prov->acc;
hr = create_msaa_provider(acc, CHILDID_SELF, NULL, FALSE, &elprov);
hr = create_msaa_provider(acc, CHILDID_SELF, NULL, FALSE, FALSE, &elprov);
if (SUCCEEDED(hr))
{
struct msaa_provider *prov = impl_from_msaa_provider(elprov);
@ -886,7 +886,7 @@ static HRESULT WINAPI msaa_fragment_Navigate(IRawElementProviderFragment *iface,
if (FAILED(hr) || !acc)
break;
hr = create_msaa_provider(acc, child_id, NULL, FALSE, &elprov);
hr = create_msaa_provider(acc, child_id, NULL, FALSE, FALSE, &elprov);
if (SUCCEEDED(hr))
{
struct msaa_provider *prov = impl_from_msaa_provider(elprov);
@ -936,7 +936,7 @@ static HRESULT WINAPI msaa_fragment_Navigate(IRawElementProviderFragment *iface,
if (FAILED(hr) || !acc)
break;
hr = create_msaa_provider(acc, child_id, NULL, FALSE, &elprov);
hr = create_msaa_provider(acc, child_id, NULL, FALSE, FALSE, &elprov);
if (SUCCEEDED(hr))
{
struct msaa_provider *prov = impl_from_msaa_provider(elprov);
@ -1031,7 +1031,7 @@ static HRESULT WINAPI msaa_fragment_get_FragmentRoot(IRawElementProviderFragment
if (FAILED(hr) || !acc)
return hr;
hr = create_msaa_provider(acc, CHILDID_SELF, msaa_prov->hwnd, TRUE, &elprov);
hr = create_msaa_provider(acc, CHILDID_SELF, msaa_prov->hwnd, TRUE, TRUE, &elprov);
IAccessible_Release(acc);
if (FAILED(hr))
return hr;
@ -1154,7 +1154,7 @@ static HRESULT msaa_acc_get_focus(struct msaa_provider *prov, struct msaa_provid
}
}
hr = create_msaa_provider(focus_acc, focus_cid, hwnd, FALSE, &elprov);
hr = create_msaa_provider(focus_acc, focus_cid, hwnd, FALSE, FALSE, &elprov);
IAccessible_Release(focus_acc);
if (SUCCEEDED(hr))
*out_prov = impl_from_msaa_provider(elprov);
@ -1176,7 +1176,7 @@ static HRESULT WINAPI msaa_fragment_root_GetFocus(IRawElementProviderFragmentRoo
if (V_I4(&msaa_prov->cid) != CHILDID_SELF)
return S_OK;
hr = create_msaa_provider(msaa_prov->acc, CHILDID_SELF, msaa_prov->hwnd, FALSE, &elprov);
hr = create_msaa_provider(msaa_prov->acc, CHILDID_SELF, msaa_prov->hwnd, FALSE, FALSE, &elprov);
if (FAILED(hr))
return hr;
@ -1440,8 +1440,8 @@ static const IProxyProviderWinEventHandlerVtbl msaa_winevent_handler_vtbl = {
msaa_winevent_handler_RespondToWinEvent,
};
HRESULT create_msaa_provider(IAccessible *acc, LONG child_id, HWND hwnd, BOOL known_root_acc,
IRawElementProviderSimple **elprov)
HRESULT create_msaa_provider(IAccessible *acc, LONG child_id, HWND hwnd, BOOL root_acc_known,
BOOL is_root_acc, IRawElementProviderSimple **elprov)
{
struct msaa_provider *msaa_prov = calloc(1, sizeof(*msaa_prov));
@ -1470,8 +1470,11 @@ HRESULT create_msaa_provider(IAccessible *acc, LONG child_id, HWND hwnd, BOOL kn
else
msaa_prov->hwnd = hwnd;
if (known_root_acc)
msaa_prov->root_acc_check_ran = msaa_prov->is_root_acc = TRUE;
if (root_acc_known)
{
msaa_prov->root_acc_check_ran = TRUE;
msaa_prov->is_root_acc = is_root_acc;
}
*elprov = &msaa_prov->IRawElementProviderSimple_iface;
@ -1515,7 +1518,7 @@ HRESULT WINAPI UiaProviderFromIAccessible(IAccessible *acc, LONG child_id, DWORD
if (!hwnd)
return E_FAIL;
return create_msaa_provider(acc, child_id, hwnd, FALSE, elprov);
return create_msaa_provider(acc, child_id, hwnd, FALSE, FALSE, elprov);
}
static HRESULT uia_get_hr_for_last_error(void)