mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-06 08:54:05 +00:00
uiautomationcore: Add support for UIAutomationType_IntArray property comparisons.
Signed-off-by: Connor McAdams <cmcadams@codeweavers.com>
This commit is contained in:
parent
c183afbf4c
commit
2cfcddb2fe
|
@ -7257,17 +7257,15 @@ static void test_UiaGetUpdatedCache(void)
|
|||
tree_struct = NULL; out_req = NULL;
|
||||
|
||||
hr = UiaGetUpdatedCache(node, &cache_req, NormalizeState_View, NULL, &out_req, &tree_struct);
|
||||
todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
todo_wine ok(!!out_req, "out_req == NULL\n");
|
||||
todo_wine ok(!!tree_struct, "tree_struct == NULL\n");
|
||||
if (out_req)
|
||||
{
|
||||
exp_lbound[0] = exp_lbound[1] = 0;
|
||||
exp_elems[0] = exp_elems[1] = 1;
|
||||
test_cache_req_sa(out_req, exp_lbound, exp_elems, exp_node_desc);
|
||||
ok(!wcscmp(tree_struct, L"P)"), "tree structure %s\n", debugstr_w(tree_struct));
|
||||
ok_method_sequence(cache_req_seq4, NULL);
|
||||
}
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
ok(!!out_req, "out_req == NULL\n");
|
||||
ok(!!tree_struct, "tree_struct == NULL\n");
|
||||
|
||||
exp_lbound[0] = exp_lbound[1] = 0;
|
||||
exp_elems[0] = exp_elems[1] = 1;
|
||||
test_cache_req_sa(out_req, exp_lbound, exp_elems, exp_node_desc);
|
||||
ok(!wcscmp(tree_struct, L"P)"), "tree structure %s\n", debugstr_w(tree_struct));
|
||||
ok_method_sequence(cache_req_seq4, NULL);
|
||||
|
||||
SafeArrayDestroy(out_req);
|
||||
SysFreeString(tree_struct);
|
||||
|
@ -7286,13 +7284,12 @@ static void test_UiaGetUpdatedCache(void)
|
|||
tree_struct = NULL; out_req = NULL;
|
||||
|
||||
hr = UiaGetUpdatedCache(node, &cache_req, NormalizeState_View, NULL, &out_req, &tree_struct);
|
||||
todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
if (SUCCEEDED(hr))
|
||||
ok_method_sequence(cache_req_seq5, NULL);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
ok_method_sequence(cache_req_seq5, NULL);
|
||||
ok(!out_req, "out_req != NULL\n");
|
||||
todo_wine ok(!!tree_struct, "tree_struct == NULL\n");
|
||||
if (tree_struct)
|
||||
ok(!wcscmp(tree_struct, L""), "tree structure %s\n", debugstr_w(tree_struct));
|
||||
ok(!!tree_struct, "tree_struct == NULL\n");
|
||||
ok(!wcscmp(tree_struct, L""), "tree structure %s\n", debugstr_w(tree_struct));
|
||||
|
||||
SysFreeString(tree_struct);
|
||||
VariantClear(&v);
|
||||
}
|
||||
|
@ -7312,17 +7309,15 @@ static void test_UiaGetUpdatedCache(void)
|
|||
tree_struct = NULL; out_req = NULL;
|
||||
|
||||
hr = UiaGetUpdatedCache(node, &cache_req, NormalizeState_View, NULL, &out_req, &tree_struct);
|
||||
todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
todo_wine ok(!!out_req, "out_req == NULL\n");
|
||||
todo_wine ok(!!tree_struct, "tree_struct == NULL\n");
|
||||
if (out_req)
|
||||
{
|
||||
exp_lbound[0] = exp_lbound[1] = 0;
|
||||
exp_elems[0] = exp_elems[1] = 1;
|
||||
test_cache_req_sa(out_req, exp_lbound, exp_elems, exp_node_desc);
|
||||
ok(!wcscmp(tree_struct, L"P)"), "tree structure %s\n", debugstr_w(tree_struct));
|
||||
ok_method_sequence(cache_req_seq6, NULL);
|
||||
}
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
ok(!!out_req, "out_req == NULL\n");
|
||||
ok(!!tree_struct, "tree_struct == NULL\n");
|
||||
|
||||
exp_lbound[0] = exp_lbound[1] = 0;
|
||||
exp_elems[0] = exp_elems[1] = 1;
|
||||
test_cache_req_sa(out_req, exp_lbound, exp_elems, exp_node_desc);
|
||||
ok(!wcscmp(tree_struct, L"P)"), "tree structure %s\n", debugstr_w(tree_struct));
|
||||
ok_method_sequence(cache_req_seq6, NULL);
|
||||
|
||||
SafeArrayDestroy(out_req);
|
||||
SysFreeString(tree_struct);
|
||||
|
|
|
@ -49,7 +49,7 @@ static HRESULT get_safearray_bounds(SAFEARRAY *sa, LONG *lbound, LONG *elems)
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
int uia_compare_runtime_ids(SAFEARRAY *sa1, SAFEARRAY *sa2)
|
||||
int uia_compare_safearrays(SAFEARRAY *sa1, SAFEARRAY *sa2, int prop_type)
|
||||
{
|
||||
LONG i, idx, lbound[2], elems[2];
|
||||
int val[2];
|
||||
|
@ -72,6 +72,12 @@ int uia_compare_runtime_ids(SAFEARRAY *sa1, SAFEARRAY *sa2)
|
|||
if (elems[0] != elems[1])
|
||||
return (elems[0] > elems[1]) - (elems[0] < elems[1]);
|
||||
|
||||
if (prop_type != UIAutomationType_IntArray)
|
||||
{
|
||||
FIXME("Array type %#x value comparsion currently unimplemented.\n", prop_type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < elems[0]; i++)
|
||||
{
|
||||
idx = lbound[0] + i;
|
||||
|
@ -1932,18 +1938,7 @@ static HRESULT uia_property_condition_check(HUIANODE node, struct UiaPropertyCon
|
|||
switch (prop_info->type)
|
||||
{
|
||||
case UIAutomationType_Bool:
|
||||
hr = UiaGetPropertyValue(node, prop_info->prop_id, &v);
|
||||
if (FAILED(hr) || V_VT(&v) == VT_UNKNOWN)
|
||||
{
|
||||
hr = S_FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((V_VT(&v) == V_VT(&prop_cond->Value)) && (V_BOOL(&v) == V_BOOL(&prop_cond->Value)))
|
||||
hr = S_OK;
|
||||
else
|
||||
hr = S_FALSE;
|
||||
|
||||
case UIAutomationType_IntArray:
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1951,6 +1946,35 @@ static HRESULT uia_property_condition_check(HUIANODE node, struct UiaPropertyCon
|
|||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
hr = UiaGetPropertyValue(node, prop_info->prop_id, &v);
|
||||
if (FAILED(hr) || V_VT(&v) == VT_UNKNOWN)
|
||||
return S_FALSE;
|
||||
|
||||
if (V_VT(&v) == V_VT(&prop_cond->Value))
|
||||
{
|
||||
switch (prop_info->type)
|
||||
{
|
||||
case UIAutomationType_Bool:
|
||||
if (V_BOOL(&v) == V_BOOL(&prop_cond->Value))
|
||||
hr = S_OK;
|
||||
else
|
||||
hr = S_FALSE;
|
||||
break;
|
||||
|
||||
case UIAutomationType_IntArray:
|
||||
if (!uia_compare_safearrays(V_ARRAY(&v), V_ARRAY(&prop_cond->Value), prop_info->type))
|
||||
hr = S_OK;
|
||||
else
|
||||
hr = S_FALSE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
hr = S_FALSE;
|
||||
|
||||
VariantClear(&v);
|
||||
return hr;
|
||||
}
|
||||
|
|
|
@ -87,7 +87,7 @@ static inline struct uia_provider *impl_from_IWineUiaProvider(IWineUiaProvider *
|
|||
}
|
||||
|
||||
/* uia_client.c */
|
||||
int uia_compare_runtime_ids(SAFEARRAY *sa1, SAFEARRAY *sa2) DECLSPEC_HIDDEN;
|
||||
int uia_compare_safearrays(SAFEARRAY *sa1, SAFEARRAY *sa2, int prop_type) DECLSPEC_HIDDEN;
|
||||
int get_node_provider_type_at_idx(struct uia_node *node, int idx) DECLSPEC_HIDDEN;
|
||||
HRESULT create_uia_node_from_elprov(IRawElementProviderSimple *elprov, HUIANODE *out_node,
|
||||
BOOL get_hwnd_providers) DECLSPEC_HIDDEN;
|
||||
|
|
|
@ -1159,7 +1159,7 @@ struct uia_provider_thread_map_entry
|
|||
static int uia_runtime_id_compare(const void *key, const struct rb_entry *entry)
|
||||
{
|
||||
struct uia_provider_thread_map_entry *prov_entry = RB_ENTRY_VALUE(entry, struct uia_provider_thread_map_entry, entry);
|
||||
return uia_compare_runtime_ids(prov_entry->runtime_id, (SAFEARRAY *)key);
|
||||
return uia_compare_safearrays(prov_entry->runtime_id, (SAFEARRAY *)key, UIAutomationType_IntArray);
|
||||
}
|
||||
|
||||
void uia_provider_thread_remove_node(HUIANODE node)
|
||||
|
|
Loading…
Reference in a new issue