Module: wine Branch: master Commit: 0254db3492b410e855528789b0a4cb852b1be773 URL: https://gitlab.winehq.org/wine/wine/-/commit/0254db3492b410e855528789b0a4cb8...
Author: Connor McAdams cmcadams@codeweavers.com Date: Mon Sep 25 12:33:07 2023 -0400
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
---
dlls/uiautomationcore/uia_client.c | 2 +- dlls/uiautomationcore/uia_event.c | 2 +- dlls/uiautomationcore/uia_private.h | 4 ++-- dlls/uiautomationcore/uia_provider.c | 25 ++++++++++++++----------- 4 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/dlls/uiautomationcore/uia_client.c b/dlls/uiautomationcore/uia_client.c index 36157ee70ba..1ff3e1a9a46 100644 --- a/dlls/uiautomationcore/uia_client.c +++ b/dlls/uiautomationcore/uia_client.c @@ -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);
diff --git a/dlls/uiautomationcore/uia_event.c b/dlls/uiautomationcore/uia_event.c index 8edbc70f54f..f5bb5656876 100644 --- a/dlls/uiautomationcore/uia_event.c +++ b/dlls/uiautomationcore/uia_event.c @@ -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; diff --git a/dlls/uiautomationcore/uia_private.h b/dlls/uiautomationcore/uia_private.h index 7ac2335dd77..abd03ce308e 100644 --- a/dlls/uiautomationcore/uia_private.h +++ b/dlls/uiautomationcore/uia_private.h @@ -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; diff --git a/dlls/uiautomationcore/uia_provider.c b/dlls/uiautomationcore/uia_provider.c index 22eba343511..917d21d8a82 100644 --- a/dlls/uiautomationcore/uia_provider.c +++ b/dlls/uiautomationcore/uia_provider.c @@ -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)