This should lower the test todo count substantially.
From: Connor McAdams cmcadams@codeweavers.com
Windows 10 1909 doesn't use IAccessible2 interfaces while comparing IAccessible interfaces, so skip the interface comparison tests.
Signed-off-by: Connor McAdams cmcadams@codeweavers.com Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53269 --- dlls/uiautomationcore/tests/uiautomation.c | 30 ++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c index f1d57336d37..6aa5e67c440 100644 --- a/dlls/uiautomationcore/tests/uiautomation.c +++ b/dlls/uiautomationcore/tests/uiautomation.c @@ -2739,9 +2739,9 @@ static void test_uia_prov_from_acc_ia2(void) HRESULT hr;
/* Only one exposes an IA2 interface, no match. */ - set_accessible_props(&Accessible, 0, 0, 0, L"acc_name", 0, 0, 0, 0); + set_accessible_props(&Accessible, ROLE_SYSTEM_DOCUMENT, 0, 0, L"acc_name", 0, 0, 0, 0); set_accessible_ia2_props(&Accessible, TRUE, 0); - set_accessible_props(&Accessible2, 0, 0, 0, L"acc_name", 0, 0, 0, 0); + set_accessible_props(&Accessible2, ROLE_SYSTEM_TEXT, 0, 0, L"acc_name", 0, 0, 0, 0); set_accessible_ia2_props(&Accessible2, FALSE, 0);
hr = pUiaProviderFromIAccessible(&Accessible.IAccessible_iface, CHILDID_SELF, UIA_PFIA_DEFAULT, &elprov); @@ -2755,6 +2755,11 @@ static void test_uia_prov_from_acc_ia2(void)
acc_client = &Accessible2.IAccessible_iface; SET_EXPECT(winproc_GETOBJECT_CLIENT); + /* The four below are only called on Win10v1909. */ + SET_EXPECT(Accessible_get_accRole); + SET_EXPECT(Accessible2_get_accRole); + SET_EXPECT(Accessible2_QI_IAccIdentity); + SET_EXPECT(Accessible2_get_accParent); elprov2 = (void *)0xdeadbeef; hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -2762,6 +2767,27 @@ static void test_uia_prov_from_acc_ia2(void) ok(Accessible2.ref == 1, "Unexpected refcnt %ld\n", Accessible2.ref); CHECK_CALLED(winproc_GETOBJECT_CLIENT);
+ /* + * Win10v1909 has IAccessible2 support, but it's not used for checking if + * two IAccessible interfaces match. Skip the comparison tests for this + * Windows version. + */ + if (called_Accessible_get_accRole) + { + IRawElementProviderSimple_Release(elprov); + CHECK_CALLED(Accessible_get_accRole); + CHECK_CALLED(Accessible2_get_accRole); + CHECK_CALLED(Accessible2_QI_IAccIdentity); + CHECK_CALLED(Accessible2_get_accParent); + win_skip("Win10v1909 doesn't support IAccessible2 interface comparsion, skipping tests.\n"); + return; + } + called_Accessible_get_accRole = expect_Accessible_get_accRole = 0; + called_Accessible2_get_accRole = expect_Accessible2_get_accRole = 0; + called_Accessible2_QI_IAccIdentity = expect_Accessible2_QI_IAccIdentity = 0; + called_Accessible2_get_accParent = expect_Accessible2_get_accParent = 0; + + Accessible.role = Accessible2.role = 0; elprov2 = (void *)0xdeadbeef; acc_client = NULL; hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/uiautomationcore/tests/uiautomation.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c index 6aa5e67c440..b957999a365 100644 --- a/dlls/uiautomationcore/tests/uiautomation.c +++ b/dlls/uiautomationcore/tests/uiautomation.c @@ -11841,6 +11841,15 @@ static void test_CUIAutomation_TreeWalker_ifaces(IUIAutomation *uia_iface) provider_add_child(&Provider, &Provider_child); provider_add_child(&Provider, &Provider_child2);
+ /* NULL input argument tests. */ + hr = IUIAutomationTreeWalker_GetFirstChildElement(walker, element, NULL); + ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + + element2 = (void *)0xdeadbeef; + hr = IUIAutomationTreeWalker_GetFirstChildElement(walker, NULL, &element2); + ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(!element2, "element2 != NULL\n"); + /* NavigateDirection_FirstChild. */ element2 = NULL; hr = IUIAutomationTreeWalker_GetFirstChildElement(walker, element, &element2);
From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/uiautomationcore/uia_client.c | 33 ++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 11 deletions(-)
diff --git a/dlls/uiautomationcore/uia_client.c b/dlls/uiautomationcore/uia_client.c index 195974c25f6..fbcbb7640b3 100644 --- a/dlls/uiautomationcore/uia_client.c +++ b/dlls/uiautomationcore/uia_client.c @@ -381,6 +381,23 @@ int get_node_provider_type_at_idx(struct uia_node *node, int idx) return 0; }
+static HRESULT get_prop_val_from_node_provider(IWineUiaNode *node, const struct uia_prop_info *prop_info, int idx, + VARIANT *out_val) +{ + IWineUiaProvider *prov; + HRESULT hr; + + VariantInit(out_val); + hr = IWineUiaNode_get_provider(node, idx, &prov); + if (FAILED(hr)) + return hr; + + hr = IWineUiaProvider_get_prop_val(prov, prop_info, out_val); + IWineUiaProvider_Release(prov); + + return hr; +} + static HRESULT get_prov_opts_from_node_provider(IWineUiaNode *node, int idx, int *out_opts) { IWineUiaProvider *prov; @@ -2231,22 +2248,16 @@ BOOL WINAPI UiaNodeRelease(HUIANODE huianode) return TRUE; }
-static HRESULT get_prop_val_from_node_provider(struct uia_node *node, +static HRESULT get_prop_val_from_node(struct uia_node *node, const struct uia_prop_info *prop_info, VARIANT *v) { - IWineUiaProvider *prov; HRESULT hr = S_OK; int i;
+ VariantInit(v); for (i = 0; i < node->prov_count; i++) { - hr = IWineUiaNode_get_provider(&node->IWineUiaNode_iface, i, &prov); - if (FAILED(hr)) - return hr; - - VariantInit(v); - hr = IWineUiaProvider_get_prop_val(prov, prop_info, v); - IWineUiaProvider_Release(prov); + hr = get_prop_val_from_node_provider(&node->IWineUiaNode_iface, prop_info, i, v); if (FAILED(hr) || V_VT(v) != VT_EMPTY) break; } @@ -2301,7 +2312,7 @@ HRESULT WINAPI UiaGetPropertyValue(HUIANODE huianode, PROPERTYID prop_id, VARIAN break; }
- hr = get_prop_val_from_node_provider(node, prop_info, &v); + hr = get_prop_val_from_node(node, prop_info, &v); if (SUCCEEDED(hr) && V_VT(&v) != VT_EMPTY) { /* @@ -2440,7 +2451,7 @@ HRESULT WINAPI UiaGetRuntimeId(HUIANODE huianode, SAFEARRAY **runtime_id) { VARIANT v;
- hr = get_prop_val_from_node_provider(node, prop_info, &v); + hr = get_prop_val_from_node(node, prop_info, &v); if (FAILED(hr)) { VariantClear(&v);
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,
Esme Povirk (@madewokherd) commented about dlls/uiautomationcore/tests/uiautomation.c:
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));
Can use todo_wine_if here.
Esme Povirk (@madewokherd) commented about dlls/uiautomationcore/uia_client.c:
- 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))
This doesn't seem right to me. BSTR's aren't really NULL-terminated, the allocated length is the length of the string. The terminator is just there for compatibility.
Also, I would probably have written a `bstrcat_realloc()` sort of function to deal with this (or even an sprintf wrapper but that's more complicated because of varags).
On Fri Mar 24 20:04:39 2023 +0000, Esme Povirk wrote:
This doesn't seem right to me. BSTR's aren't really NULL-terminated, the allocated length is the length of the string. The terminator is just there for compatibility. Also, I would probably have written a `bstrcat_realloc()` sort of function to deal with this (or even an sprintf wrapper but that's more complicated because of varags).
The idea of something like `bstrcat_realloc()` is probably a better idea, I hadn't considered that.
I'm not sure I follow on the issue of BSTR's not being NULL terminated, the values I'm passing in are all based on string length without the NULL terminator. `SysReAllocStringLen` allocates enough space for the passed in length and a NULL terminator.
On Fri Mar 24 20:14:07 2023 +0000, Connor McAdams wrote:
The idea of something like `bstrcat_realloc()` is probably a better idea, I hadn't considered that. I'm not sure I follow on the issue of BSTR's not being NULL terminated, the values I'm passing in are all based on string length without the NULL terminator. `SysReAllocStringLen` allocates enough space for the passed in length and a NULL terminator.
Well, unless the confusion is around the size doubling behavior. That was mainly done to match other dynamic array functions in wine, where AFAIU it's more performant to double the size of an allocation instead of doing realloc every time. It might be unnecessary here.
On Fri Mar 24 20:32:12 2023 +0000, Connor McAdams wrote:
Well, unless the confusion is around the size doubling behavior. That was mainly done to match other dynamic array functions in wine, where AFAIU it's more performant to double the size of an allocation instead of doing realloc every time. It might be unnecessary here.
A BSTR can contain NULL characters. If you allocate a string larger than you need, those extra characters are logically in your string.