From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/uiautomationcore/tests/uiautomation.c | 671 ++++++++++----------- dlls/uiautomationcore/uia_client.c | 150 +++++ dlls/uiautomationcore/uia_ids.c | 3 +- 3 files changed, 455 insertions(+), 369 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c index b957999a365..6862f4be250 100644 --- a/dlls/uiautomationcore/tests/uiautomation.c +++ b/dlls/uiautomationcore/tests/uiautomation.c @@ -1423,10 +1423,12 @@ static BOOL get_provider_desc(BSTR prov_desc, const WCHAR *prov_type, WCHAR *out return TRUE; }
+#define check_node_provider_desc_todo( prov_desc, prov_type, prov_name, parent_link ) \ + check_node_provider_desc_( (prov_desc), (prov_type), (prov_name), (parent_link), TRUE, __FILE__, __LINE__) #define check_node_provider_desc( prov_desc, prov_type, prov_name, parent_link ) \ - check_node_provider_desc_( (prov_desc), (prov_type), (prov_name), (parent_link), __FILE__, __LINE__) + check_node_provider_desc_( (prov_desc), (prov_type), (prov_name), (parent_link), FALSE, __FILE__, __LINE__) static void check_node_provider_desc_(BSTR prov_desc, const WCHAR *prov_type, const WCHAR *prov_name, - BOOL parent_link, const char *file, int line) + BOOL parent_link, BOOL todo, const char *file, int line) { WCHAR buf[2048];
@@ -1444,16 +1446,30 @@ static void check_node_provider_desc_(BSTR prov_desc, const WCHAR *prov_type, co
if (!get_provider_desc(prov_desc, buf, buf)) { - ok_(file, line)(0, "failed to get provider string for %s\n", debugstr_w(prov_type)); - return; + if (todo) + todo_wine ok_(file, line)(0, "failed to get provider string for %s\n", debugstr_w(prov_type)); + else + ok_(file, line)(0, "failed to get provider string for %s\n", debugstr_w(prov_type)); } else { if (parent_link) - ok_(file, line)(0, "expected parent link provider %s\n", debugstr_w(prov_type)); + { + if (todo) + todo_wine ok_(file, line)(0, "expected parent link provider %s\n", debugstr_w(prov_type)); + else + ok_(file, line)(0, "expected parent link provider %s\n", debugstr_w(prov_type)); + } else - ok_(file, line)(0, "unexpected parent link provider %s\n", debugstr_w(prov_type)); + { + if (todo) + todo_wine ok_(file, line)(0, "unexpected parent link provider %s\n", debugstr_w(prov_type)); + else + ok_(file, line)(0, "unexpected parent link provider %s\n", debugstr_w(prov_type)); + } } + + return; }
if (prov_name) @@ -4477,7 +4493,7 @@ static const struct prov_method_sequence node_from_prov2[] = { { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* Only called on Windows versions past Win10v1507. */ { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -4490,7 +4506,7 @@ static const struct prov_method_sequence node_from_prov3[] = { { &Provider_child, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* Only called on Windows versions past Win10v1507. */ { &Provider_child, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -4502,7 +4518,7 @@ static const struct prov_method_sequence node_from_prov4[] = { { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* Only called on Windows versions past Win10v1507. */ { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -4527,7 +4543,7 @@ static const struct prov_method_sequence node_from_prov5[] = { { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Win10v1507 and below call this. */ { &Provider2, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -4551,8 +4567,8 @@ static const struct prov_method_sequence node_from_prov6[] = { { &Provider2, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Only called on Windows versions past Win10v1507. */ { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -4576,8 +4592,8 @@ static const struct prov_method_sequence node_from_prov7[] = { { &Provider2, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Only called on Windows versions past Win10v1507. */ { &Provider_child, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -4746,13 +4762,10 @@ static void test_UiaNodeFromProvider(void) ok(Provider.ref == 2, "Unexpected refcnt %ld\n", Provider.ref);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); + VariantClear(&v);
ok_method_sequence(node_from_prov2, "node_from_prov2");
@@ -4782,13 +4795,10 @@ static void test_UiaNodeFromProvider(void) ok(Provider_child.ref == 2, "Unexpected refcnt %ld\n", Provider_child.ref);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); + VariantClear(&v);
ok_method_sequence(node_from_prov3, "node_from_prov3"); ok(UiaNodeRelease(node), "UiaNodeRelease returned FALSE\n"); @@ -4809,15 +4819,12 @@ static void test_UiaNodeFromProvider(void) called_winproc_GETOBJECT_CLIENT = expect_winproc_GETOBJECT_CLIENT = 0;
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", NULL, TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); + check_node_provider_desc_todo(V_BSTR(&v), L"Main", L"Provider", FALSE); + check_node_provider_desc_todo(V_BSTR(&v), L"Nonclient", NULL, FALSE); + check_node_provider_desc_todo(V_BSTR(&v), L"Hwnd", NULL, TRUE); + VariantClear(&v);
Provider.ignore_hwnd_prop = FALSE; ok_method_sequence(node_from_prov4, "node_from_prov4"); @@ -4848,15 +4855,12 @@ static void test_UiaNodeFromProvider(void) ok(!!node, "node == NULL\n");
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", NULL, TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); + check_node_provider_desc_todo(V_BSTR(&v), L"Main", L"Provider", FALSE); + check_node_provider_desc_todo(V_BSTR(&v), L"Nonclient", NULL, FALSE); + check_node_provider_desc_todo(V_BSTR(&v), L"Hwnd", NULL, TRUE); + VariantClear(&v);
Provider.ignore_hwnd_prop = Provider2.ignore_hwnd_prop = FALSE; ok_method_sequence(node_from_prov5, "node_from_prov5"); @@ -4882,15 +4886,13 @@ static void test_UiaNodeFromProvider(void) called_winproc_GETOBJECT_CLIENT = expect_winproc_GETOBJECT_CLIENT = 0;
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider2", TRUE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider", FALSE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider2", TRUE); + check_node_provider_desc_todo(V_BSTR(&v), L"Nonclient", NULL, FALSE); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider", FALSE); + VariantClear(&v); + ok_method_sequence(node_from_prov6, "node_from_prov6");
ok(Provider2.ref == 2, "Unexpected refcnt %ld\n", Provider2.ref); @@ -4916,15 +4918,13 @@ static void test_UiaNodeFromProvider(void) called_winproc_GETOBJECT_CLIENT = expect_winproc_GETOBJECT_CLIENT = 0;
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider2", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_child", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider2", FALSE); + check_node_provider_desc_todo(V_BSTR(&v), L"Nonclient", NULL, FALSE); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_child", TRUE); + VariantClear(&v); + ok_method_sequence(node_from_prov7, "node_from_prov7");
ok(Provider2.ref == 2, "Unexpected refcnt %ld\n", Provider2.ref); @@ -5590,13 +5590,11 @@ static void test_UiaGetRuntimeId(void) ok(Provider_child.ref == 2, "Unexpected refcnt %ld\n", Provider_child.ref);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); + VariantClear(&v); + ok_method_sequence(node_from_prov3, NULL);
/* NULL runtime ID. */ @@ -5740,15 +5738,13 @@ static void test_UiaGetRuntimeId(void)
VariantInit(&v); hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider2", TRUE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider", FALSE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider2", TRUE); + check_node_provider_desc_todo(V_BSTR(&v), L"Nonclient", NULL, FALSE); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider", FALSE); + VariantClear(&v); + ok_method_sequence(node_from_prov6, "node_from_prov6");
/* No methods called, RuntimeId is based on the node's HWND. */ @@ -5861,7 +5857,7 @@ static const struct prov_method_sequence node_from_hwnd2[] = { { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* Windows 10+ calls this. */ { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -5873,7 +5869,7 @@ static const struct prov_method_sequence node_from_hwnd3[] = { NODE_CREATE_SEQ2_OPTIONAL(&Provider), { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -5888,7 +5884,7 @@ static const struct prov_method_sequence node_from_hwnd4[] = { /* Only called on Windows versions past Win10v1507. */ { &Provider_child, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ControlTypePropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ControlTypePropertyId */ { 0 } };
@@ -5932,7 +5928,7 @@ static const struct prov_method_sequence node_from_hwnd6[] = { /* Next two are only done on Win10v1809+. */ { &Provider_child, FRAG_GET_FRAGMENT_ROOT, METHOD_OPTIONAL }, { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ControlTypePropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ControlTypePropertyId */ { 0 } };
@@ -5952,7 +5948,7 @@ static const struct prov_method_sequence node_from_hwnd7[] = { { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Only done on Win11+ */ - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -5965,7 +5961,7 @@ static const struct prov_method_sequence node_from_hwnd8[] = { { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ControlTypePropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ControlTypePropertyId */ { 0 } };
@@ -6044,6 +6040,7 @@ static void test_UiaNodeFromHandle_client_proc(void) WCHAR buf[2048]; HUIANODE node; HRESULT hr; + DWORD pid; HWND hwnd; VARIANT v;
@@ -6056,24 +6053,22 @@ static void test_UiaNodeFromHandle_client_proc(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - DWORD pid; - - memset(buf, 0, sizeof(buf)); - GetWindowThreadProcessId(hwnd, &pid); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr);
- ok(get_nested_provider_desc(V_BSTR(&v), L"Main", FALSE, buf), "Failed to get nested provider description\n"); + memset(buf, 0, sizeof(buf)); + GetWindowThreadProcessId(hwnd, &pid); + todo_wine ok(get_nested_provider_desc(V_BSTR(&v), L"Main", FALSE, buf), "Failed to get nested provider description\n"); + if (lstrlenW(buf)) + { check_node_provider_desc_prefix(buf, pid, hwnd); check_node_provider_desc(buf, L"Main", L"Provider", TRUE); - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", NULL, TRUE); - VariantClear(&v); + check_node_provider_desc_todo(V_BSTR(&v), L"Nonclient", NULL, FALSE); + check_node_provider_desc_todo(V_BSTR(&v), L"Hwnd", NULL, TRUE); }
+ VariantClear(&v); + hr = UiaGetPropertyValue(node, UIA_ControlTypePropertyId, &v); ok(hr == S_OK, "Unexpected hr %#lx\n", hr); ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v)); @@ -6133,21 +6128,21 @@ static DWORD WINAPI uia_node_from_handle_test_thread(LPVOID param) called_winproc_GETOBJECT_CLIENT = expect_winproc_GETOBJECT_CLIENT = 0;
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - memset(buf, 0, sizeof(buf)); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr);
- ok(get_nested_provider_desc(V_BSTR(&v), L"Main", FALSE, buf), "Failed to get nested provider description\n"); + memset(buf, 0, sizeof(buf)); + todo_wine ok(get_nested_provider_desc(V_BSTR(&v), L"Main", FALSE, buf), "Failed to get nested provider description\n"); + if (lstrlenW(buf)) + { check_node_provider_desc_prefix(buf, GetCurrentProcessId(), hwnd); check_node_provider_desc(buf, L"Main", L"Provider", TRUE); - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); check_node_provider_desc(V_BSTR(&v), L"Hwnd", NULL, TRUE); - VariantClear(&v); }
+ VariantClear(&v); + Provider.ignore_hwnd_prop = FALSE; ok_method_sequence(node_from_hwnd3, "node_from_hwnd3");
@@ -6193,17 +6188,15 @@ static DWORD WINAPI uia_node_from_handle_test_thread(LPVOID param) hr = UiaHUiaNodeFromVariant(&v, &node2); ok(hr == S_OK, "Unexpected hr %#lx\n", hr); hr = UiaGetPropertyValue(node2, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - /* - * Even though this is a nested node, without any additional - * providers, it will not have the 'Nested' prefix. - */ - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + /* + * Even though this is a nested node, without any additional + * providers, it will not have the 'Nested' prefix. + */ + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); + VariantClear(&v);
hr = UiaGetPropertyValue(node2, UIA_ControlTypePropertyId, &v); ok(hr == S_OK, "Unexpected hr %#lx\n", hr); @@ -6240,20 +6233,19 @@ static DWORD WINAPI uia_node_from_handle_test_thread(LPVOID param) hr = UiaHUiaNodeFromVariant(&v, &node2); ok(hr == S_OK, "Unexpected hr %#lx\n", hr); hr = UiaGetPropertyValue(node2, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - memset(buf, 0, sizeof(buf)); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr);
- ok(get_nested_provider_desc(V_BSTR(&v), L"Main", TRUE, buf), "Failed to get nested provider description\n"); + memset(buf, 0, sizeof(buf)); + todo_wine ok(get_nested_provider_desc(V_BSTR(&v), L"Main", TRUE, buf), "Failed to get nested provider description\n"); + if (lstrlenW(buf)) + { check_node_provider_desc_prefix(buf, GetCurrentProcessId(), hwnd); check_node_provider_desc(buf, L"Main", L"Provider_child", TRUE); - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); check_node_provider_desc(V_BSTR(&v), L"Hwnd", NULL, FALSE); - VariantClear(&v); } + VariantClear(&v);
Provider_child.ignore_hwnd_prop = FALSE; ok_method_sequence(node_from_hwnd7, "node_from_hwnd7"); @@ -6293,20 +6285,19 @@ static DWORD WINAPI uia_node_from_handle_test_thread(LPVOID param) CHECK_CALLED(winproc_GETOBJECT_UiaRoot);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - memset(buf, 0, sizeof(buf)); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr);
- ok(get_nested_provider_desc(V_BSTR(&v), L"Main", FALSE, buf), "Failed to get nested provider description\n"); + memset(buf, 0, sizeof(buf)); + todo_wine ok(get_nested_provider_desc(V_BSTR(&v), L"Main", FALSE, buf), "Failed to get nested provider description\n"); + if (lstrlenW(buf)) + { check_node_provider_desc_prefix(buf, GetCurrentProcessId(), hwnd); check_node_provider_desc(buf, L"Main", L"Provider", TRUE); - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); check_node_provider_desc(V_BSTR(&v), L"Hwnd", NULL, TRUE); - VariantClear(&v); } + VariantClear(&v);
Provider.ignore_hwnd_prop = FALSE; ok_method_sequence(node_from_hwnd3, "node_from_hwnd3"); @@ -6328,13 +6319,10 @@ static DWORD WINAPI uia_node_from_handle_test_thread(LPVOID param) hr = UiaHUiaNodeFromVariant(&v, &node2); ok(hr == S_OK, "Unexpected hr %#lx\n", hr); hr = UiaGetPropertyValue(node2, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); + VariantClear(&v);
hr = UiaGetPropertyValue(node2, UIA_ControlTypePropertyId, &v); ok(hr == S_OK, "Unexpected hr %#lx\n", hr); @@ -6350,13 +6338,10 @@ static DWORD WINAPI uia_node_from_handle_test_thread(LPVOID param) hr = UiaHUiaNodeFromVariant(&v, &node3); ok(hr == S_OK, "Unexpected hr %#lx\n", hr); hr = UiaGetPropertyValue(node3, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); + VariantClear(&v);
hr = UiaGetPropertyValue(node3, UIA_ControlTypePropertyId, &v); ok(hr == S_OK, "Unexpected hr %#lx\n", hr); @@ -6603,15 +6588,12 @@ static void test_UiaNodeFromHandle(const char *name) called_winproc_GETOBJECT_CLIENT = expect_winproc_GETOBJECT_CLIENT = 0;
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", NULL, TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); + check_node_provider_desc_todo(V_BSTR(&v), L"Main", L"Provider", FALSE); + check_node_provider_desc_todo(V_BSTR(&v), L"Nonclient", NULL, FALSE); + check_node_provider_desc_todo(V_BSTR(&v), L"Hwnd", NULL, TRUE); + VariantClear(&v);
ok_method_sequence(node_from_hwnd2, "node_from_hwnd2");
@@ -6642,13 +6624,10 @@ static void test_UiaNodeFromHandle(const char *name) hr = UiaHUiaNodeFromVariant(&v, &node2); ok(hr == S_OK, "Unexpected hr %#lx\n", hr); hr = UiaGetPropertyValue(node2, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); + VariantClear(&v);
Provider_child.expected_tid = GetCurrentThreadId(); hr = UiaGetPropertyValue(node2, UIA_ControlTypePropertyId, &v); @@ -6739,7 +6718,7 @@ static void test_UiaNodeFromHandle(const char *name) static const struct prov_method_sequence reg_prov_cb1[] = { { &Provider_nc, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Only done on Win10+. */ - { &Provider_nc, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_nc, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -6749,7 +6728,7 @@ static const struct prov_method_sequence reg_prov_cb2[] = { { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_hwnd, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Only done on Win10+. */ - { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -6765,9 +6744,9 @@ static const struct prov_method_sequence reg_prov_cb3[] = { { &Provider_proxy, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider_proxy, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_nc, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_proxy, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_nc, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -6786,9 +6765,9 @@ static const struct prov_method_sequence reg_prov_cb4[] = { { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_override, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_proxy, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_nc, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_proxy, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_nc, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -6872,9 +6851,9 @@ static const struct prov_method_sequence reg_prov_cb11[] = { { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_nc, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_nc, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -6904,9 +6883,9 @@ static const struct prov_method_sequence reg_prov_cb12[] = { { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_nc, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_nc, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -6947,9 +6926,9 @@ static const struct prov_method_sequence reg_prov_cb13[] = { { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Only done on Win10v1809+. */ { &Provider_override, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_nc, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_nc, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -7079,13 +7058,10 @@ static void test_UiaRegisterProviderCallback(void) todo_wine CHECK_CALLED(prov_callback_parent_proxy);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); + check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", TRUE); + VariantClear(&v);
ok_method_sequence(reg_prov_cb1, "reg_prov_cb1");
@@ -7115,13 +7091,10 @@ static void test_UiaRegisterProviderCallback(void) todo_wine CHECK_CALLED(prov_callback_parent_proxy);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", TRUE); + VariantClear(&v);
ok_method_sequence(reg_prov_cb2, "reg_prov_cb2");
@@ -7157,15 +7130,12 @@ static void test_UiaRegisterProviderCallback(void) todo_wine CHECK_CALLED(prov_callback_parent_proxy);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_proxy", TRUE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_proxy", TRUE); + check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); + VariantClear(&v);
ok_method_sequence(reg_prov_cb3, "reg_prov_cb3");
@@ -7204,16 +7174,13 @@ static void test_UiaRegisterProviderCallback(void) todo_wine CHECK_CALLED(prov_callback_parent_proxy);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); - check_node_provider_desc(V_BSTR(&v), L"Override", L"Provider_override", TRUE); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_proxy", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); + check_node_provider_desc_todo(V_BSTR(&v), L"Override", L"Provider_override", TRUE); + check_node_provider_desc_todo(V_BSTR(&v), L"Main", L"Provider_proxy", FALSE); + check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); + VariantClear(&v);
ok_method_sequence(reg_prov_cb4, "reg_prov_cb4");
@@ -7326,15 +7293,13 @@ static void test_UiaRegisterProviderCallback(void) todo_wine CHECK_CALLED(prov_callback_parent_proxy);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); + check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); + VariantClear(&v); + ok_method_sequence(reg_prov_cb11, "reg_prov_cb11");
UiaNodeRelease(node); @@ -7365,15 +7330,13 @@ static void test_UiaRegisterProviderCallback(void) todo_wine CHECK_CALLED(prov_callback_parent_proxy);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); + check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); + VariantClear(&v); + ok_method_sequence(reg_prov_cb12, "reg_prov_cb12");
UiaNodeRelease(node); @@ -7404,16 +7367,14 @@ static void test_UiaRegisterProviderCallback(void) CHECK_CALLED(prov_callback_nonclient);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); - check_node_provider_desc(V_BSTR(&v), L"Override", L"Provider_override", TRUE); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd2); + check_node_provider_desc_todo(V_BSTR(&v), L"Override", L"Provider_override", TRUE); + check_node_provider_desc_todo(V_BSTR(&v), L"Main", L"Provider", FALSE); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); + check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); + VariantClear(&v); + ok_method_sequence(reg_prov_cb13, "reg_prov_cb13");
UiaNodeRelease(node); @@ -7497,7 +7458,7 @@ static void test_node_provider_desc_(struct node_provider_desc *desc, BSTR desc_
check_node_provider_desc_prefix_(desc_str, desc->pid, desc->hwnd, file, line); for (i = 0; i < desc->prov_count; i++) - check_node_provider_desc_(desc_str, desc->prov_type[i], desc->prov_name[i], desc->parent_link[i], file, line); + check_node_provider_desc_(desc_str, desc->prov_type[i], desc->prov_name[i], desc->parent_link[i], FALSE, file, line); }
/* @@ -7554,9 +7515,8 @@ static void test_cache_req_sa_(SAFEARRAY *sa, LONG exp_lbound[2], LONG exp_elems VariantClear(&v);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - test_node_provider_desc_(&exp_node_desc[i], V_BSTR(&v), file, line); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + test_node_provider_desc_(&exp_node_desc[i], V_BSTR(&v), file, line); VariantClear(&v);
UiaNodeRelease(node); @@ -7564,7 +7524,7 @@ static void test_cache_req_sa_(SAFEARRAY *sa, LONG exp_lbound[2], LONG exp_elems }
static const struct prov_method_sequence cache_req_seq1[] = { - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId. */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId. */ { 0 } };
@@ -7586,14 +7546,14 @@ static const struct prov_method_sequence cache_req_seq3[] = { /* Navigates towards parent to check for clientside provider siblings. */ { &Provider_child2, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ NODE_CREATE_SEQ(&Provider), - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId. */ - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId. */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId. */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId. */ { 0 } };
static const struct prov_method_sequence cache_req_seq4[] = { { &Provider, PROV_GET_PROPERTY_VALUE }, /* Dependent upon property condition. */ - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId. */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId. */ { 0 } };
@@ -7608,7 +7568,7 @@ static const struct prov_method_sequence cache_req_seq5[] = {
static const struct prov_method_sequence cache_req_seq6[] = { { &Provider, FRAG_GET_RUNTIME_ID }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId. */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId. */ /* Only done on Win10v1507 and below. */ { &Provider, FRAG_NAVIGATE, METHOD_OPTIONAL }, /* NavigateDirection_Parent */ { 0 } @@ -7617,7 +7577,7 @@ static const struct prov_method_sequence cache_req_seq6[] = { static const struct prov_method_sequence cache_req_seq7[] = { { &Provider, FRAG_GET_RUNTIME_ID }, { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_IsControlElementPropertyId. */ - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId. */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId. */ { 0 } };
@@ -7656,13 +7616,10 @@ static void test_UiaGetUpdatedCache(void) ok(Provider.ref == 2, "Unexpected refcnt %ld\n", Provider.ref);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); + VariantClear(&v);
ok_method_sequence(node_from_prov2, NULL);
@@ -8188,23 +8145,23 @@ static const struct prov_method_sequence nav_seq1[] = { { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_nc, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_nc, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
static const struct prov_method_sequence nav_seq2[] = { { &Provider_hwnd, FRAG_NAVIGATE }, /* NavigateDirection_FirstChild */ NODE_CREATE_SEQ(&Provider_hwnd_child), - { &Provider_hwnd_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
static const struct prov_method_sequence nav_seq3[] = { { &Provider_hwnd_child, FRAG_NAVIGATE}, /* NavigateDirection_NextSibling */ NODE_CREATE_SEQ(&Provider_hwnd_child2), - { &Provider_hwnd_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -8235,7 +8192,7 @@ static const struct prov_method_sequence nav_seq4[] = { { &Provider_nc_child, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* Only called on Windows versions past Win10v1507. */ { &Provider_nc_child, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider_nc_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_nc_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -8257,14 +8214,14 @@ static const struct prov_method_sequence nav_seq5[] = { { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_hwnd, FRAG_NAVIGATE }, /* NavigateDirection_LastChild */ NODE_CREATE_SEQ(&Provider_hwnd_child2), - { &Provider_hwnd_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
static const struct prov_method_sequence nav_seq6[] = { { &Provider_nc_child, FRAG_NAVIGATE }, /* NavigateDirection_NextSibling */ NODE_CREATE_SEQ(&Provider_nc_child2), - { &Provider_nc_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_nc_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -8286,14 +8243,14 @@ static const struct prov_method_sequence nav_seq7[] = { { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_FirstChild */ NODE_CREATE_SEQ(&Provider_child), - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
static const struct prov_method_sequence nav_seq8[] = { { &Provider_child, FRAG_NAVIGATE }, /* NavigateDirection_NextSibling */ NODE_CREATE_SEQ(&Provider_child2), - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -8342,7 +8299,7 @@ static const struct prov_method_sequence nav_seq9[] = { static const struct prov_method_sequence nav_seq10[] = { { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_LastChild */ NODE_CREATE_SEQ(&Provider_child2), - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -8363,7 +8320,7 @@ static const struct prov_method_sequence nav_seq11[] = { { &Provider_hwnd_child, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_hwnd_child, FRAG_NAVIGATE }, /* NavigateDirection_NextSibling */ NODE_CREATE_SEQ(&Provider_hwnd_child2), - { &Provider_hwnd_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -8384,7 +8341,7 @@ static const struct prov_method_sequence nav_seq12[] = { { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_child2, FRAG_NAVIGATE }, /* NavigateDirection_PreviousSibling */ NODE_CREATE_SEQ(&Provider_child), - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -8399,16 +8356,16 @@ static const struct prov_method_sequence nav_seq13[] = { { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_nc, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_nc, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_hwnd, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
static const struct prov_method_sequence nav_seq14[] = { { &Provider_nc, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ NODE_CREATE_SEQ(&Provider2), - { &Provider2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 } };
@@ -8511,15 +8468,12 @@ static void test_UiaNavigate(void) called_winproc_GETOBJECT_CLIENT = expect_winproc_GETOBJECT_CLIENT = 0;
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); + check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", FALSE); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); + VariantClear(&v);
ok_method_sequence(nav_seq1, "nav_seq1");
@@ -8907,15 +8861,12 @@ static void test_UiaNavigate(void) called_winproc_GETOBJECT_CLIENT = expect_winproc_GETOBJECT_CLIENT = 0;
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", TRUE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", FALSE); + check_node_provider_desc(V_BSTR(&v), L"Nonclient", L"Provider_nc", TRUE); + check_node_provider_desc(V_BSTR(&v), L"Hwnd", L"Provider_hwnd", FALSE); + VariantClear(&v);
ok_method_sequence(nav_seq13, "nav_seq13");
@@ -9135,13 +9086,13 @@ static const struct prov_method_sequence find_seq1[] = { { &Provider_child2, FRAG_GET_RUNTIME_ID }, { &Provider_child2_child, FRAG_GET_RUNTIME_ID }, { &Provider_child2_child_child, FRAG_GET_RUNTIME_ID }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2_child_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2_child_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9161,9 +9112,9 @@ static const struct prov_method_sequence find_seq2[] = { { &Provider, FRAG_GET_RUNTIME_ID }, { &Provider_child, FRAG_GET_RUNTIME_ID }, { &Provider_child2, FRAG_GET_RUNTIME_ID }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9182,8 +9133,8 @@ static const struct prov_method_sequence find_seq3[] = { { &Provider, FRAG_NAVIGATE, METHOD_OPTIONAL }, /* NavigateDirection_Parent */ { &Provider_child, FRAG_GET_RUNTIME_ID }, { &Provider_child2, FRAG_GET_RUNTIME_ID }, - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9192,7 +9143,7 @@ static const struct prov_method_sequence find_seq4[] = { { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_FirstChild */ NODE_CREATE_SEQ(&Provider_child), { &Provider_child, FRAG_GET_RUNTIME_ID }, - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9207,8 +9158,8 @@ static const struct prov_method_sequence find_seq5[] = { NODE_CREATE_SEQ(&Provider), { &Provider_child, FRAG_GET_RUNTIME_ID }, { &Provider_child2, FRAG_GET_RUNTIME_ID }, - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9216,7 +9167,7 @@ static const struct prov_method_sequence find_seq6[] = { { &Provider_child, FRAG_GET_RUNTIME_ID }, { &Provider_child, FRAG_GET_RUNTIME_ID }, { &Provider_child, FRAG_GET_RUNTIME_ID }, - { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9253,10 +9204,10 @@ static const struct prov_method_sequence find_seq7[] = { { &Provider_child_child, FRAG_GET_RUNTIME_ID }, { &Provider_child_child2, FRAG_GET_RUNTIME_ID }, { &Provider_child2, FRAG_GET_RUNTIME_ID }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9294,10 +9245,10 @@ static const struct prov_method_sequence find_seq8[] = { { &Provider_child_child, FRAG_GET_RUNTIME_ID }, { &Provider_child_child2, FRAG_GET_RUNTIME_ID }, { &Provider_child2, FRAG_GET_RUNTIME_ID }, - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9336,9 +9287,9 @@ static const struct prov_method_sequence find_seq9[] = { { &Provider_child_child2, FRAG_GET_RUNTIME_ID }, { &Provider_child2, FRAG_GET_RUNTIME_ID }, { &Provider_child2_child, FRAG_GET_RUNTIME_ID }, - { &Provider_child_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9384,7 +9335,7 @@ static const struct prov_method_sequence find_seq10[] = { /* Only done on Win10v1507 and below. */ { &Provider, FRAG_NAVIGATE, METHOD_OPTIONAL }, /* NavigateDirection_Parent */ { &Provider_child2, FRAG_GET_RUNTIME_ID }, - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9403,7 +9354,7 @@ static const struct prov_method_sequence find_seq11[] = { { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_IsContentElementPropertyId */ { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_IsControlElementPropertyId */ { &Provider_child_child2, FRAG_GET_RUNTIME_ID }, - { &Provider_child_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -9441,13 +9392,10 @@ static void test_UiaFind(void) ok(Provider.ref == 2, "Unexpected refcnt %ld\n", Provider.ref);
hr = UiaGetPropertyValue(node, UIA_ProviderDescriptionPropertyId, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); + VariantClear(&v);
ok_method_sequence(node_from_prov2, NULL);
@@ -10008,22 +9956,19 @@ static IUIAutomationElement *create_test_element_from_hwnd(IUIAutomation *uia_if }
hr = IUIAutomationElement_GetCurrentPropertyValueEx(element, UIA_ProviderDescriptionPropertyId, TRUE, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); - if (!block_hwnd_provs) - { - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", FALSE); - check_node_provider_desc(V_BSTR(&v), L"Nonclient", NULL, FALSE); - check_node_provider_desc(V_BSTR(&v), L"Hwnd", NULL, TRUE); - } - else - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr);
- VariantClear(&v); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), hwnd); + if (!block_hwnd_provs) + { + check_node_provider_desc_todo(V_BSTR(&v), L"Main", L"Provider", FALSE); + check_node_provider_desc_todo(V_BSTR(&v), L"Nonclient", NULL, FALSE); + check_node_provider_desc_todo(V_BSTR(&v), L"Hwnd", NULL, TRUE); } + else + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider", TRUE);
+ VariantClear(&v); ok_method_sequence(node_from_hwnd2, "create_test_element"); UiaRegisterProviderCallback(NULL);
@@ -11217,10 +11162,10 @@ static const struct prov_method_sequence element_find_seq1[] = { { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* Only done on Win10v1507 and below. */ { &Provider, FRAG_NAVIGATE, METHOD_OPTIONAL }, /* NavigateDirection_Parent */ - { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ - { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -11242,7 +11187,7 @@ static const struct prov_method_sequence element_find_seq2[] = { NODE_CREATE_SEQ(&Provider_child_child2), { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_IsContentElementPropertyId */ { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_IsControlElementPropertyId */ - { &Provider_child_child2, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ + { &Provider_child_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ { 0 }, };
@@ -11290,9 +11235,8 @@ static void test_uia_element_arr_(IUIAutomationElementArray *elem_arr, struct ex ok(!!element, "element == NULL\n");
hr = IUIAutomationElement_GetCurrentPropertyValueEx(element, UIA_ProviderDescriptionPropertyId, TRUE, &v); - todo_wine ok_(file, line)(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - test_node_provider_desc_(&exp_elems[i].prov_desc, V_BSTR(&v), file, line); + ok_(file, line)(hr == S_OK, "Unexpected hr %#lx\n", hr); + test_node_provider_desc_(&exp_elems[i].prov_desc, V_BSTR(&v), file, line); VariantClear(&v); IUIAutomationElement_Release(element); } @@ -11448,13 +11392,10 @@ static void test_Element_Find(IUIAutomation *uia_iface) ok(Provider_child.ref == 2, "Unexpected refcnt %ld\n", Provider_child.ref);
hr = IUIAutomationElement_GetCurrentPropertyValueEx(element2, UIA_ProviderDescriptionPropertyId, TRUE, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child", TRUE); + VariantClear(&v);
ok_method_sequence(find_seq4, "find_seq4");
@@ -11639,13 +11580,10 @@ static void test_Element_Find(IUIAutomation *uia_iface) ok(Provider_child_child2.ref == 2, "Unexpected refcnt %ld\n", Provider_child_child2.ref);
hr = IUIAutomationElement_GetCurrentPropertyValueEx(element2, UIA_ProviderDescriptionPropertyId, TRUE, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child_child2", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child_child2", TRUE); + VariantClear(&v);
IUIAutomationElement_Release(element2); ok_method_sequence(find_seq11, "find_seq11"); @@ -11707,13 +11645,10 @@ static void test_Element_Find(IUIAutomation *uia_iface) ok(Provider_child_child2.ref == 2, "Unexpected refcnt %ld\n", Provider_child_child2.ref);
hr = IUIAutomationElement_GetCurrentPropertyValueEx(element2, UIA_ProviderDescriptionPropertyId, TRUE, &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); - if (SUCCEEDED(hr)) - { - check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); - check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child_child2", TRUE); - VariantClear(&v); - } + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + check_node_provider_desc_prefix(V_BSTR(&v), GetCurrentProcessId(), NULL); + check_node_provider_desc(V_BSTR(&v), L"Main", L"Provider_child_child2", TRUE); + VariantClear(&v);
IUIAutomationElement_Release(element2); ok_method_sequence(element_find_seq2, "element_find_seq2"); diff --git a/dlls/uiautomationcore/uia_client.c b/dlls/uiautomationcore/uia_client.c index fbcbb7640b3..2f359958548 100644 --- a/dlls/uiautomationcore/uia_client.c +++ b/dlls/uiautomationcore/uia_client.c @@ -1121,6 +1121,122 @@ static HRESULT traverse_uia_node_tree(HUIANODE huianode, struct UiaCondition *vi return hr; }
+static HRESULT node_provider_description_bstr_resize(BSTR *desc, DWORD desc_len) +{ + static const DWORD max_len = ((UINT_MAX - sizeof(WCHAR) - sizeof(DWORD)) / sizeof(WCHAR)); + DWORD cur_len = SysStringLen(*desc); + HRESULT hr = S_OK; + DWORD new_len; + + if (desc_len <= cur_len) + return hr; + + if (desc_len >= max_len) + { + hr = E_OUTOFMEMORY; + goto exit; + } + + new_len = max(1, cur_len); + while (new_len < desc_len && new_len <= (max_len / 2)) + new_len *= 2; + if (new_len < desc_len) + new_len = desc_len; + + if (!SysReAllocStringLen(desc, NULL, new_len)) + hr = E_OUTOFMEMORY; +exit: + if (FAILED(hr)) + { + SysFreeString(*desc); + *desc = NULL; + } + + return hr; +} + +static const WCHAR *prov_desc_type_str[] = { + L"Override", + L"Main", + L"Nonclient", + L"Hwnd", +}; + +static HRESULT get_node_provider_description_string(struct uia_node *node, VARIANT *out_desc) +{ + const struct uia_prop_info *prop_info = uia_prop_info_from_id(UIA_ProviderDescriptionPropertyId); + unsigned int node_desc_len; + WCHAR buf[256] = { 0 }; + HRESULT hr = S_OK; + BSTR node_desc; + int i; + + VariantInit(out_desc); + + /* + * If we have a single provider, and it's a nested node provider, we just + * return the string directly from the nested node. + */ + if ((node->prov_count == 1) && is_nested_node_provider(node->prov[get_node_provider_type_at_idx(node, 0)])) + return get_prop_val_from_node_provider(&node->IWineUiaNode_iface, prop_info, 0, out_desc); + + wsprintfW(buf, L"[pid:%d,providerId:%#x ", GetCurrentProcessId(), node->hwnd); + node_desc_len = lstrlenW(buf) + lstrlenW(L"]"); + if (!(node_desc = SysAllocStringLen(buf, node_desc_len))) + return E_OUTOFMEMORY; + + for (i = 0; i < node->prov_count; i++) + { + int prov_type = get_node_provider_type_at_idx(node, i); + VARIANT v; + + VariantInit(&v); + hr = get_prop_val_from_node_provider(&node->IWineUiaNode_iface, prop_info, i, &v); + if (FAILED(hr)) + goto exit; + + /* Generate the provider type prefix string. */ + if (node->parent_link_idx == i) + wsprintfW(buf, L"%s(parent link):", prov_desc_type_str[prov_type]); + else + wsprintfW(buf, L"%s:", prov_desc_type_str[prov_type]); + if (is_nested_node_provider(node->prov[prov_type])) + wsprintfW(&buf[lstrlenW(buf)], L"Nested "); + + /* + * If this isn't the final provider, add space for a "; " separator + * suffix. + */ + if (i != (node->prov_count - 1)) + node_desc_len += (lstrlenW(buf) + lstrlenW(V_BSTR(&v)) + lstrlenW(L"; ")); + else + node_desc_len += (lstrlenW(buf) + lstrlenW(V_BSTR(&v))); + + hr = node_provider_description_bstr_resize(&node_desc, node_desc_len); + if (SUCCEEDED(hr)) + { + if (i != (node->prov_count - 1)) + wsprintfW(&node_desc[lstrlenW(node_desc)], L"%s%s; ", buf, V_BSTR(&v)); + else + wsprintfW(&node_desc[lstrlenW(node_desc)], L"%s%s", buf, V_BSTR(&v)); + } + + VariantClear(&v); + if (FAILED(hr)) + goto exit; + } + + wsprintfW(&node_desc[lstrlenW(node_desc)], L"]"); + V_VT(out_desc) = VT_BSTR; + V_BSTR(out_desc) = node_desc; + +exit: + if (FAILED(hr)) + SysFreeString(node_desc); + + return hr; +} + /* * IWineUiaProvider interface. */ @@ -1416,6 +1532,34 @@ static HRESULT uia_provider_get_special_prop_val(struct uia_provider *prov, break; }
+ case UIA_ProviderDescriptionPropertyId: + { + /* FIXME: Get actual name of the executable our provider comes from. */ + static const WCHAR *provider_origin = L" (unmanaged:uiautomationcore.dll)"; + static const WCHAR *default_desc = L"Unidentified provider"; + BSTR prov_desc_str; + VARIANT v; + + hr = uia_provider_get_elem_prop_val(prov, prop_info, &v); + if (FAILED(hr)) + return hr; + + if (V_VT(&v) == VT_BSTR) + prov_desc_str = SysAllocStringLen(V_BSTR(&v), lstrlenW(V_BSTR(&v)) + lstrlenW(provider_origin)); + else + prov_desc_str = SysAllocStringLen(default_desc, lstrlenW(default_desc) + lstrlenW(provider_origin)); + + VariantClear(&v); + if (!prov_desc_str) + return E_OUTOFMEMORY; + + /* Append the name of the executable our provider comes from. */ + wsprintfW(&prov_desc_str[lstrlenW(prov_desc_str)], L"%s", provider_origin); + V_VT(ret_val) = VT_BSTR; + V_BSTR(ret_val) = prov_desc_str; + break; + } + default: break; } @@ -2308,6 +2452,12 @@ HRESULT WINAPI UiaGetPropertyValue(HUIANODE huianode, PROPERTYID prop_id, VARIAN return S_OK; }
+ case UIA_ProviderDescriptionPropertyId: + hr = get_node_provider_description_string(node, &v); + if (SUCCEEDED(hr) && (V_VT(&v) == VT_BSTR)) + *out_val = v; + return hr; + default: break; } diff --git a/dlls/uiautomationcore/uia_ids.c b/dlls/uiautomationcore/uia_ids.c index 64f2ecced93..d518b2dd44f 100644 --- a/dlls/uiautomationcore/uia_ids.c +++ b/dlls/uiautomationcore/uia_ids.c @@ -196,7 +196,8 @@ static const struct uia_prop_info default_uia_properties[] = { { &Table_RowHeaders_Property_GUID, UIA_TableRowHeadersPropertyId, }, { &ControllerFor_Property_GUID, UIA_ControllerForPropertyId, PROP_TYPE_ELEM_PROP, UIAutomationType_ElementArray, }, - { &ProviderDescription_Property_GUID, UIA_ProviderDescriptionPropertyId, }, + { &ProviderDescription_Property_GUID, UIA_ProviderDescriptionPropertyId, + PROP_TYPE_SPECIAL, UIAutomationType_String, }, { &AriaProperties_Property_GUID, UIA_AriaPropertiesPropertyId, PROP_TYPE_ELEM_PROP, UIAutomationType_String, }, { &LiveSetting_Property_GUID, UIA_LiveSettingPropertyId,