Module: wine Branch: master Commit: cd143fc2fdbfab17bf5c922fd93af56d9b58393b URL: https://gitlab.winehq.org/wine/wine/-/commit/cd143fc2fdbfab17bf5c922fd93af56...
Author: Connor McAdams cmcadams@codeweavers.com Date: Wed Oct 26 09:46:58 2022 -0400
uiautomationcore: Add support for ConditionType_{And/Or} conditions.
Signed-off-by: Connor McAdams cmcadams@codeweavers.com
---
dlls/uiautomationcore/tests/uiautomation.c | 64 +++++++++++++----------------- dlls/uiautomationcore/uia_client.c | 27 ++++++++++++- 2 files changed, 53 insertions(+), 38 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c index 32ae4cb9b5f..19cebf79143 100644 --- a/dlls/uiautomationcore/tests/uiautomation.c +++ b/dlls/uiautomationcore/tests/uiautomation.c @@ -7132,17 +7132,15 @@ static void test_UiaGetUpdatedCache(void)
/* Equivalent to: if (1 && 1) */ 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_seq1, 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_seq1, NULL);
SafeArrayDestroy(out_req); SysFreeString(tree_struct); @@ -7156,14 +7154,12 @@ static void test_UiaGetUpdatedCache(void)
/* Equivalent to: if (1 && 0) */ 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_seq2, NULL); - + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok_method_sequence(cache_req_seq2, 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);
/* @@ -7178,17 +7174,15 @@ static void test_UiaGetUpdatedCache(void)
/* Equivalent to: if (1 || 0) */ 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_seq1, 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_seq1, NULL);
SafeArrayDestroy(out_req); SysFreeString(tree_struct); @@ -7202,14 +7196,12 @@ static void test_UiaGetUpdatedCache(void)
/* Equivalent to: if (0 || 0) */ 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_seq2, NULL); - + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok_method_sequence(cache_req_seq2, 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);
/* diff --git a/dlls/uiautomationcore/uia_client.c b/dlls/uiautomationcore/uia_client.c index 3897b036e09..4d3037b212c 100644 --- a/dlls/uiautomationcore/uia_client.c +++ b/dlls/uiautomationcore/uia_client.c @@ -1922,6 +1922,8 @@ static BOOL uia_condition_matched(HRESULT hr)
static HRESULT uia_condition_check(HUIANODE node, struct UiaCondition *condition) { + HRESULT hr; + switch (condition->ConditionType) { case ConditionType_True: @@ -1933,7 +1935,6 @@ static HRESULT uia_condition_check(HUIANODE node, struct UiaCondition *condition case ConditionType_Not: { struct UiaNotCondition *not_cond = (struct UiaNotCondition *)condition; - HRESULT hr;
hr = uia_condition_check(node, not_cond->pConditions); if (FAILED(hr)) @@ -1945,9 +1946,31 @@ static HRESULT uia_condition_check(HUIANODE node, struct UiaCondition *condition return S_OK; }
- case ConditionType_Property: case ConditionType_And: case ConditionType_Or: + { + struct UiaAndOrCondition *and_or_cond = (struct UiaAndOrCondition *)condition; + int i; + + for (i = 0; i < and_or_cond->cConditions; i++) + { + hr = uia_condition_check(node, and_or_cond->ppConditions[i]); + if (FAILED(hr)) + return hr; + + if (condition->ConditionType == ConditionType_And && !uia_condition_matched(hr)) + return S_FALSE; + else if (condition->ConditionType == ConditionType_Or && uia_condition_matched(hr)) + return S_OK; + } + + if (condition->ConditionType == ConditionType_Or) + return S_FALSE; + else + return S_OK; + } + + case ConditionType_Property: FIXME("Unhandled condition type %d\n", condition->ConditionType); return E_NOTIMPL;