From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/uiautomationcore/tests/uiautomation.c | 112 ++++++++++----------- dlls/uiautomationcore/uia_classes.idl | 1 + dlls/uiautomationcore/uia_client.c | 88 +++++++++++++++- dlls/uiautomationcore/uia_private.h | 3 + 4 files changed, 147 insertions(+), 57 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c index 433cf64707b..15368a7fd03 100644 --- a/dlls/uiautomationcore/tests/uiautomation.c +++ b/dlls/uiautomationcore/tests/uiautomation.c @@ -4048,7 +4048,7 @@ static const struct prov_method_sequence node_from_prov2[] = { { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &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 */ @@ -4061,7 +4061,7 @@ static const struct prov_method_sequence node_from_prov3[] = { { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_child, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider_child, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &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 */ @@ -4073,7 +4073,7 @@ static const struct prov_method_sequence node_from_prov4[] = { /* Win10v1507 and below call this. */ { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &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 */ @@ -4089,12 +4089,12 @@ static const struct prov_method_sequence node_from_prov5[] = { /* Win10v1507 and below call this. */ { &Provider2, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider2, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider2, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider2, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* These three are only done on Win10v1507 and below. */ { &Provider2, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider2, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider2, FRAG_NAVIGATE, METHOD_OPTIONAL }, /* NavigateDirection_Parent */ - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* This is only done on Win10v1507. */ { &Provider2, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Only called on Windows versions past Win10v1507. */ @@ -4114,13 +4114,13 @@ static const struct prov_method_sequence node_from_prov6[] = { /* Win10v1507 and below call this. */ { &Provider2, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider2, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider2, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider2, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider2, PROV_GET_PROVIDER_OPTIONS }, { &Provider2, PROV_GET_PROVIDER_OPTIONS }, /* Only called on Windows versions past Win10v1507. */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, { &Provider2, FRAG_NAVIGATE, METHOD_OPTIONAL }, /* NavigateDirection_Parent */ - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* This is only done on Win10v1507. */ { &Provider2, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Only called on Windows versions past Win10v1507. */ @@ -4139,13 +4139,13 @@ static const struct prov_method_sequence node_from_prov7[] = { /* Win10v1507 and below call this. */ { &Provider2, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider2, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider2, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider2, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider2, PROV_GET_PROVIDER_OPTIONS }, { &Provider2, PROV_GET_PROVIDER_OPTIONS }, /* Only called on Windows versions past Win10v1507. */ { &Provider_child, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, { &Provider2, FRAG_NAVIGATE, METHOD_OPTIONAL }, /* NavigateDirection_Parent */ - { &Provider_child, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider_child, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* This is only done on Win10v1507. */ { &Provider2, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Only called on Windows versions past Win10v1507. */ @@ -4161,7 +4161,7 @@ static const struct prov_method_sequence node_from_prov8[] = { { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* Only called on Windows versions past Win10v1507. */ { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { 0 } @@ -4537,7 +4537,7 @@ static const struct prov_method_sequence get_elem_prop_seq[] = { { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_child, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider_child, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &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_OPTIONAL }, @@ -4552,14 +4552,14 @@ static const struct prov_method_sequence get_elem_arr_prop_seq[] = { { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_child, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider_child, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider_child, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider_child, PROV_GET_PROVIDER_OPTIONS }, { &Provider_child2, PROV_GET_PROVIDER_OPTIONS }, /* Win10v1507 and below call this. */ { &Provider_child2, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_child2, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider_child2, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider_child2, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider_child2, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider_child2, PROV_GET_PROVIDER_OPTIONS }, { &Provider_child, PROV_GET_PROPERTY_VALUE }, { &Provider_child2, PROV_GET_PROPERTY_VALUE }, @@ -5196,10 +5196,10 @@ static const struct prov_method_sequence node_from_hwnd2[] = { /* Win10v1507 and below call this. */ { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROVIDER_OPTIONS }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &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 */ @@ -5211,7 +5211,7 @@ static const struct prov_method_sequence node_from_hwnd3[] = { /* Win10v1507 and below call this. */ { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ @@ -5225,7 +5225,7 @@ static const struct prov_method_sequence node_from_hwnd4[] = { { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_child, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider_child, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &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 }, /* UIA_ProviderDescriptionPropertyId */ @@ -5240,7 +5240,7 @@ static const struct prov_method_sequence node_from_hwnd5[] = { { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_child, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider_child, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider_child, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider_child, PROV_GET_PROVIDER_OPTIONS }, /* Only done in Windows 8+. */ { &Provider_child, FRAG_GET_RUNTIME_ID, METHOD_OPTIONAL }, @@ -5258,7 +5258,7 @@ static const struct prov_method_sequence node_from_hwnd6[] = { { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_child, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider_child, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider_child, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider_child, PROV_GET_PROVIDER_OPTIONS }, /* Next 4 are only done in Windows 8+. */ { &Provider_child, FRAG_GET_RUNTIME_ID, METHOD_OPTIONAL }, @@ -5283,13 +5283,13 @@ static const struct prov_method_sequence node_from_hwnd7[] = { /* Win10v1507 and below call this. */ { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_child, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider_child, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider_child, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider_child, PROV_GET_PROVIDER_OPTIONS }, { &Provider_child, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_TODO }, /* UIA_ProviderDescriptionPropertyId */ @@ -5301,7 +5301,7 @@ static const struct prov_method_sequence node_from_hwnd8[] = { /* Win10v1507 and below call this. */ { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_ProviderDescriptionPropertyId */ @@ -5315,7 +5315,7 @@ static const struct prov_method_sequence node_from_hwnd9[] = { { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, /* Only done in Windows 8+. */ { &Provider, FRAG_GET_RUNTIME_ID, METHOD_OPTIONAL }, @@ -5333,7 +5333,7 @@ static const struct prov_method_sequence disconnect_prov1[] = { { &Provider_child, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_child, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider_child, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider_child, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider_child, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider_child, PROV_GET_PROVIDER_OPTIONS }, { &Provider_child, FRAG_GET_RUNTIME_ID }, { &Provider_child, FRAG_GET_FRAGMENT_ROOT }, @@ -5348,7 +5348,7 @@ static const struct prov_method_sequence disconnect_prov2[] = { { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, FRAG_GET_RUNTIME_ID }, { &Provider, FRAG_GET_FRAGMENT_ROOT }, @@ -5361,7 +5361,7 @@ static const struct prov_method_sequence disconnect_prov3[] = { { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, { &Provider, PROV_GET_PROPERTY_VALUE }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, FRAG_GET_RUNTIME_ID }, { 0 } @@ -5372,7 +5372,7 @@ static const struct prov_method_sequence disconnect_prov4[] = { /* Win10v1507 and below call this. */ { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, { 0 } }; @@ -6071,7 +6071,7 @@ static void test_UiaNodeFromHandle(const char *name) }
static const struct prov_method_sequence reg_prov_cb1[] = { - { &Provider_nc, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &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 */ { 0 } @@ -6081,7 +6081,7 @@ static const struct prov_method_sequence reg_prov_cb2[] = { /* These two are only done on Win10v1809+. */ { &Provider_hwnd, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider_hwnd, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &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 */ { 0 } @@ -6092,9 +6092,9 @@ static const struct prov_method_sequence reg_prov_cb3[] = { /* These two are only done on Win10v1809+. */ { &Provider_hwnd, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider_proxy, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_nc, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_hwnd, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider_proxy, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_nc, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_hwnd, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* These three only done on Win10+. */ { &Provider_proxy, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, @@ -6111,9 +6111,9 @@ static const struct prov_method_sequence reg_prov_cb4[] = { { &Provider_hwnd, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_override, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_proxy, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_nc, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_hwnd, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider_proxy, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_nc, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_hwnd, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* These four only done on Win10+. */ { &Provider_override, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_proxy, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, @@ -6176,9 +6176,9 @@ static const struct prov_method_sequence reg_prov_cb10[] = { { &Provider_hwnd, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider_override, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_proxy, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_nc, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_hwnd, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider_proxy, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_nc, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_hwnd, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* These four only done on Win10+. */ { &Provider_override, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_proxy, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, @@ -6192,16 +6192,16 @@ static const struct prov_method_sequence reg_prov_cb11[] = { /* Win10v1507 and below call this. */ { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider_proxy2, HWND_OVERRIDE_GET_OVERRIDE_PROVIDER, METHOD_TODO }, /* These two are only done on Win10v1809+. */ { &Provider_hwnd, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_nc, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_hwnd, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_nc, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_hwnd, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* These three only done on Win10+. */ { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, @@ -6217,7 +6217,7 @@ static const struct prov_method_sequence reg_prov_cb12[] = { /* Win10v1507 and below call this. */ { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider2, PROV_GET_PROVIDER_OPTIONS, METHOD_TODO }, @@ -6231,9 +6231,9 @@ static const struct prov_method_sequence reg_prov_cb12[] = { /* These two are only done on Win10v1809+. */ { &Provider_hwnd, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_nc, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_hwnd, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_nc, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_hwnd, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* These three only done on Win10+. */ { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, @@ -6249,7 +6249,7 @@ static const struct prov_method_sequence reg_prov_cb13[] = { /* Win10v1507 and below call this. */ { &Provider, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ { &Provider, PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider, PROV_GET_PROVIDER_OPTIONS }, { &Provider2, PROV_GET_PROVIDER_OPTIONS, METHOD_TODO }, @@ -6271,9 +6271,9 @@ static const struct prov_method_sequence reg_prov_cb13[] = { { &Provider_hwnd, PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ /* Only done on Win10v1809+. */ { &Provider_override, FRAG_NAVIGATE, METHOD_OPTIONAL }, /* NavigateDirection_Parent */ - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_nc, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_hwnd, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_nc, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_hwnd, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ { &Provider_override, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, /* Only done on Win10v1809+ */ /* These three only done on Win10+. */ { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, @@ -7417,7 +7417,7 @@ static void test_UiaGetUpdatedCache(void) /* Win10v1507 and below call this. */ \ { prov , PROV_GET_PROPERTY_VALUE, METHOD_OPTIONAL }, /* UIA_NativeWindowHandlePropertyId */ \ { prov , PROV_GET_HOST_RAW_ELEMENT_PROVIDER }, \ - { prov , FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ \ + { prov , FRAG_NAVIGATE }, /* NavigateDirection_Parent */ \ { prov , PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL } \
static const struct prov_method_sequence nav_seq1[] = { @@ -7425,9 +7425,9 @@ static const struct prov_method_sequence nav_seq1[] = { { &Provider, PROV_GET_PROVIDER_OPTIONS }, /* Only done on Win10v1809+ */ { &Provider_hwnd, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_nc, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_hwnd, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_nc, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_hwnd, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* Windows 10+ calls these. */ { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, @@ -7641,8 +7641,8 @@ static const struct prov_method_sequence nav_seq13[] = { { &Provider, PROV_GET_PROVIDER_OPTIONS }, /* Only done on Win10v1809+ */ { &Provider_hwnd, PROV_GET_HOST_RAW_ELEMENT_PROVIDER, METHOD_OPTIONAL }, - { &Provider, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ - { &Provider_nc, FRAG_NAVIGATE, METHOD_TODO }, /* NavigateDirection_Parent */ + { &Provider, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ + { &Provider_nc, FRAG_NAVIGATE }, /* NavigateDirection_Parent */ /* Windows 10+ calls these. */ { &Provider, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, { &Provider_nc, PROV_GET_PROVIDER_OPTIONS, METHOD_OPTIONAL }, diff --git a/dlls/uiautomationcore/uia_classes.idl b/dlls/uiautomationcore/uia_classes.idl index a240534222a..d8982259050 100644 --- a/dlls/uiautomationcore/uia_classes.idl +++ b/dlls/uiautomationcore/uia_classes.idl @@ -45,6 +45,7 @@ library UIA_wine_private { HRESULT get_prop_val([in]const struct uia_prop_info *prop_info, [out, retval]VARIANT *ret_val); HRESULT get_prov_opts([out, retval]int *out_opts); + HRESULT has_parent([out, retval]BOOL *out_val); }
[ diff --git a/dlls/uiautomationcore/uia_client.c b/dlls/uiautomationcore/uia_client.c index 3902d879825..d053b88dd11 100644 --- a/dlls/uiautomationcore/uia_client.c +++ b/dlls/uiautomationcore/uia_client.c @@ -355,6 +355,22 @@ static HRESULT get_prov_opts_from_node_provider(IWineUiaNode *node, int idx, int return hr; }
+static HRESULT get_has_parent_from_node_provider(IWineUiaNode *node, int idx, BOOL *out_val) +{ + IWineUiaProvider *prov; + HRESULT hr; + + *out_val = FALSE; + hr = IWineUiaNode_get_provider(node, idx, &prov); + if (FAILED(hr)) + return hr; + + hr = IWineUiaProvider_has_parent(prov, out_val); + IWineUiaProvider_Release(prov); + + return hr; +} + /* * IWineUiaNode interface. */ @@ -561,7 +577,33 @@ static struct uia_node *unsafe_impl_from_IWineUiaNode(IWineUiaNode *iface) static BOOL is_nested_node_provider(IWineUiaProvider *iface); static HRESULT prepare_uia_node(struct uia_node *node) { - int i; + int i, prov_idx; + HRESULT hr; + + /* + * HUIANODEs can only have one 'parent link' provider, which handles + * parent and sibling navigation for the entire HUIANODE. Each provider is + * queried for a parent in descending order, starting with the override + * provider. The first provider to have a valid parent is made parent + * link. If no providers return a valid parent, the provider at index 0 + * is made parent link by default. + */ + for (i = prov_idx = 0; i < PROV_TYPE_COUNT; i++) + { + BOOL has_parent; + + if (!node->prov[i]) + continue; + + hr = get_has_parent_from_node_provider(&node->IWineUiaNode_iface, prov_idx, &has_parent); + if (SUCCEEDED(hr) && has_parent) + { + node->parent_link_idx = prov_idx; + break; + } + + prov_idx++; + }
for (i = 0; i < PROV_TYPE_COUNT; i++) { @@ -889,12 +931,45 @@ static HRESULT WINAPI uia_provider_get_prov_opts(IWineUiaProvider *iface, int *o return S_OK; }
+static HRESULT WINAPI uia_provider_has_parent(IWineUiaProvider *iface, BOOL *out_val) +{ + struct uia_provider *prov = impl_from_IWineUiaProvider(iface); + + TRACE("%p, %p\n", iface, out_val); + + if (!prov->parent_check_ran) + { + IRawElementProviderFragment *elfrag, *elfrag2; + HRESULT hr; + + prov->has_parent = FALSE; + hr = IRawElementProviderSimple_QueryInterface(prov->elprov, &IID_IRawElementProviderFragment, (void **)&elfrag); + if (SUCCEEDED(hr) && elfrag) + { + hr = IRawElementProviderFragment_Navigate(elfrag, NavigateDirection_Parent, &elfrag2); + IRawElementProviderFragment_Release(elfrag); + if (SUCCEEDED(hr) && elfrag2) + { + prov->has_parent = TRUE; + IRawElementProviderFragment_Release(elfrag2); + } + } + + prov->parent_check_ran = TRUE; + } + + *out_val = prov->has_parent; + + return S_OK; +} + static const IWineUiaProviderVtbl uia_provider_vtbl = { uia_provider_QueryInterface, uia_provider_AddRef, uia_provider_Release, uia_provider_get_prop_val, uia_provider_get_prov_opts, + uia_provider_has_parent, };
static HRESULT create_wine_uia_provider(struct uia_node *node, IRawElementProviderSimple *elprov, @@ -1260,12 +1335,22 @@ static HRESULT WINAPI uia_nested_node_provider_get_prov_opts(IWineUiaProvider *i return get_prov_opts_from_node_provider(prov->nested_node, 0, out_opts); }
+static HRESULT WINAPI uia_nested_node_provider_has_parent(IWineUiaProvider *iface, BOOL *out_val) +{ + struct uia_nested_node_provider *prov = impl_from_nested_node_IWineUiaProvider(iface); + + TRACE("%p, %p\n", iface, out_val); + + return get_has_parent_from_node_provider(prov->nested_node, 0, out_val); +} + static const IWineUiaProviderVtbl uia_nested_node_provider_vtbl = { uia_nested_node_provider_QueryInterface, uia_nested_node_provider_AddRef, uia_nested_node_provider_Release, uia_nested_node_provider_get_prop_val, uia_nested_node_provider_get_prov_opts, + uia_nested_node_provider_has_parent, };
static BOOL is_nested_node_provider(IWineUiaProvider *iface) @@ -1340,6 +1425,7 @@ static HRESULT create_wine_uia_nested_node_provider(struct uia_node *node, LRESU IWineUiaProvider_AddRef(provider_iface); prov_data = impl_from_IWineUiaProvider(provider_iface); prov_data->return_nested_node = FALSE; + prov_data->parent_check_ran = FALSE;
IWineUiaNode_Release(nested_node); uia_stop_client_thread(); diff --git a/dlls/uiautomationcore/uia_private.h b/dlls/uiautomationcore/uia_private.h index 39c9aac847b..cb4ce8b0acf 100644 --- a/dlls/uiautomationcore/uia_private.h +++ b/dlls/uiautomationcore/uia_private.h @@ -59,6 +59,7 @@ struct uia_node { IWineUiaProvider *prov[PROV_TYPE_COUNT]; DWORD git_cookie[PROV_TYPE_COUNT]; int prov_count; + int parent_link_idx;
HWND hwnd; BOOL nested_node; @@ -79,6 +80,8 @@ struct uia_provider {
IRawElementProviderSimple *elprov; BOOL return_nested_node; + BOOL parent_check_ran; + BOOL has_parent; };
static inline struct uia_provider *impl_from_IWineUiaProvider(IWineUiaProvider *iface)