Module: wine Branch: master Commit: a2bf252c4b50332dc0a8081b26cdb6f62410d596 URL: https://gitlab.winehq.org/wine/wine/-/commit/a2bf252c4b50332dc0a8081b26cdb6f...
Author: Connor McAdams cmcadams@codeweavers.com Date: Mon Aug 21 11:04:31 2023 -0400
uiautomationcore: Add support for ignoring ProviderOptions_UseComThreading when creating an HUIANODE.
Signed-off-by: Connor McAdams cmcadams@codeweavers.com
---
dlls/uiautomationcore/tests/uiautomation.c | 6 ------ dlls/uiautomationcore/uia_client.c | 15 ++++++++++----- dlls/uiautomationcore/uia_event.c | 4 ++-- dlls/uiautomationcore/uia_private.h | 4 +++- dlls/uiautomationcore/uia_provider.c | 4 ++-- 5 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c index 452587970d9..3b9887d4917 100644 --- a/dlls/uiautomationcore/tests/uiautomation.c +++ b/dlls/uiautomationcore/tests/uiautomation.c @@ -16717,12 +16717,6 @@ static const struct prov_method_sequence win_event_handler_seq[] = { { &Provider_hwnd2, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, /* Only done on Win10v1809+. */ { &Provider_nc2, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider_hwnd2, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ - /* - * The following two are currently only done on Wine. Windows doesn't do - * this because the node created is never passed out of the event thread. - */ - { &Provider_nc2, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider_hwnd2, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc2, WINEVENT_HANDLER_RESPOND_TO_WINEVENT, METHOD_TODO }, { &Provider_hwnd2, WINEVENT_HANDLER_RESPOND_TO_WINEVENT, METHOD_TODO }, NODE_CREATE_SEQ_TODO(&Provider_child), diff --git a/dlls/uiautomationcore/uia_client.c b/dlls/uiautomationcore/uia_client.c index 09e0d179172..36157ee70ba 100644 --- a/dlls/uiautomationcore/uia_client.c +++ b/dlls/uiautomationcore/uia_client.c @@ -613,6 +613,8 @@ static HRESULT create_uia_node(struct uia_node **out_node, int node_flags) node->ignore_clientside_hwnd_provs = TRUE; if (node_flags & NODE_FLAG_NO_PREPARE) node->no_prepare = TRUE; + if (node_flags & NODE_FLAG_IGNORE_COM_THREADING) + node->ignore_com_threading = TRUE;
*out_node = node; return S_OK; @@ -664,6 +666,9 @@ static HRESULT prepare_uia_node(struct uia_node *node) prov_idx++; }
+ if (node->ignore_com_threading) + return S_OK; + for (i = 0; i < PROV_TYPE_COUNT; i++) { enum ProviderOptions prov_opts; @@ -1361,7 +1366,7 @@ static HRESULT get_variant_for_elprov_node(IRawElementProviderSimple *elprov, BO
VariantInit(v);
- hr = create_uia_node_from_elprov(elprov, &node, !refuse_hwnd_providers); + hr = create_uia_node_from_elprov(elprov, &node, !refuse_hwnd_providers, 0); IRawElementProviderSimple_Release(elprov); if (SUCCEEDED(hr)) { @@ -1910,7 +1915,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->refuse_hwnd_node_providers); + hr = create_uia_node_from_elprov(elprov, &node, !prov->refuse_hwnd_node_providers, 0); IRawElementProviderSimple_Release(elprov); if (SUCCEEDED(hr)) { @@ -1969,7 +1974,7 @@ static HRESULT create_wine_uia_provider(struct uia_node *node, IRawElementProvid
static HRESULT uia_get_providers_for_hwnd(struct uia_node *node); HRESULT create_uia_node_from_elprov(IRawElementProviderSimple *elprov, HUIANODE *out_node, - BOOL get_hwnd_providers) + BOOL get_hwnd_providers, int node_flags) { static const int unsupported_prov_opts = ProviderOptions_ProviderOwnsSetFocus | ProviderOptions_HasNativeIAccessible | ProviderOptions_UseClientCoordinates; @@ -1998,7 +2003,7 @@ HRESULT create_uia_node_from_elprov(IRawElementProviderSimple *elprov, HUIANODE else prov_type = PROV_TYPE_MAIN;
- hr = create_uia_node(&node, 0); + hr = create_uia_node(&node, node_flags); if (FAILED(hr)) return hr;
@@ -2040,7 +2045,7 @@ HRESULT WINAPI UiaNodeFromProvider(IRawElementProviderSimple *elprov, HUIANODE * if (!elprov || !huianode) return E_INVALIDARG;
- return create_uia_node_from_elprov(elprov, huianode, TRUE); + return create_uia_node_from_elprov(elprov, huianode, TRUE, 0); }
/* diff --git a/dlls/uiautomationcore/uia_event.c b/dlls/uiautomationcore/uia_event.c index 59b6d71c6c2..8edbc70f54f 100644 --- a/dlls/uiautomationcore/uia_event.c +++ b/dlls/uiautomationcore/uia_event.c @@ -600,7 +600,7 @@ static HRESULT uia_win_event_for_each_callback(struct uia_event *event, void *da if (FAILED(hr)) return hr;
- hr = create_uia_node_from_elprov(elprov, &node, TRUE); + hr = create_uia_node_from_elprov(elprov, &node, TRUE, NODE_FLAG_IGNORE_COM_THREADING); IRawElementProviderSimple_Release(elprov); if (FAILED(hr)) return hr; @@ -1700,7 +1700,7 @@ static HRESULT uia_raise_elprov_event_callback(struct uia_event *event, void *da * For events raised on server-side providers, we don't want to add any * clientside HWND providers. */ - hr = create_uia_node_from_elprov(event_data->elprov, &event_data->node, event_data->clientside_only); + hr = create_uia_node_from_elprov(event_data->elprov, &event_data->node, event_data->clientside_only, 0); if (FAILED(hr)) return hr;
diff --git a/dlls/uiautomationcore/uia_private.h b/dlls/uiautomationcore/uia_private.h index 218392ef06c..7ac2335dd77 100644 --- a/dlls/uiautomationcore/uia_private.h +++ b/dlls/uiautomationcore/uia_private.h @@ -57,6 +57,7 @@ enum uia_node_prov_type { enum uia_node_flags { NODE_FLAG_IGNORE_CLIENTSIDE_HWND_PROVS = 0x01, NODE_FLAG_NO_PREPARE = 0x02, + NODE_FLAG_IGNORE_COM_THREADING = 0x04, };
struct uia_node { @@ -74,6 +75,7 @@ struct uia_node { BOOL nested_node; BOOL disconnected; int creator_prov_type; + BOOL ignore_com_threading; BOOL ignore_clientside_hwnd_provs;
struct list prov_thread_list_entry; @@ -212,7 +214,7 @@ HRESULT attach_event_to_uia_node(HUIANODE node, struct uia_event *event) DECLSPE HRESULT clone_uia_node(HUIANODE in_node, HUIANODE *out_node) DECLSPEC_HIDDEN; HRESULT navigate_uia_node(struct uia_node *node, int nav_dir, HUIANODE *out_node) DECLSPEC_HIDDEN; HRESULT create_uia_node_from_elprov(IRawElementProviderSimple *elprov, HUIANODE *out_node, - BOOL get_hwnd_providers) DECLSPEC_HIDDEN; + BOOL get_hwnd_providers, int node_flags) DECLSPEC_HIDDEN; HRESULT uia_node_from_lresult(LRESULT lr, HUIANODE *huianode) DECLSPEC_HIDDEN; HRESULT uia_condition_check(HUIANODE node, struct UiaCondition *condition) DECLSPEC_HIDDEN; BOOL uia_condition_matched(HRESULT hr) DECLSPEC_HIDDEN; diff --git a/dlls/uiautomationcore/uia_provider.c b/dlls/uiautomationcore/uia_provider.c index 6a3b2d061fe..22eba343511 100644 --- a/dlls/uiautomationcore/uia_provider.c +++ b/dlls/uiautomationcore/uia_provider.c @@ -2275,7 +2275,7 @@ LRESULT WINAPI UiaReturnRawElementProvider(HWND hwnd, WPARAM wparam, return 0; }
- hr = create_uia_node_from_elprov(elprov, &node, FALSE); + hr = create_uia_node_from_elprov(elprov, &node, FALSE, 0); if (FAILED(hr)) { WARN("Failed to create HUIANODE with hr %#lx\n", hr); @@ -2296,7 +2296,7 @@ HRESULT WINAPI UiaDisconnectProvider(IRawElementProviderSimple *elprov)
TRACE("(%p)\n", elprov);
- hr = create_uia_node_from_elprov(elprov, &node, FALSE); + hr = create_uia_node_from_elprov(elprov, &node, FALSE, 0); if (FAILED(hr)) return hr;