From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/uiautomationcore/tests/uiautomation.c | 66 +++++++++++++++++++++- dlls/uiautomationcore/uia_com_client.c | 24 +++++--- 2 files changed, 81 insertions(+), 9 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c index de60a0e5a1b..acfcc40bd3b 100644 --- a/dlls/uiautomationcore/tests/uiautomation.c +++ b/dlls/uiautomationcore/tests/uiautomation.c @@ -11727,10 +11727,36 @@ static const struct prov_method_sequence treewalker_seq4[] = { { 0 } };
+static const struct prov_method_sequence treewalker_seq5[] = { + { &Provider_child, FRAG_NAVIGATE }, /* NavigateDirection_NextSibling */ + NODE_CREATE_SEQ(&Provider_child2), + { 0 } +}; + +static const struct prov_method_sequence treewalker_seq6[] = { + { &Provider_child, FRAG_NAVIGATE }, /* NavigateDirection_NextSibling */ + NODE_CREATE_SEQ(&Provider_child2), + { &Provider_child2, FRAG_GET_RUNTIME_ID }, + { 0 } +}; + +static const struct prov_method_sequence treewalker_seq7[] = { + { &Provider_child2, FRAG_NAVIGATE }, /* NavigateDirection_PreviousSibling */ + NODE_CREATE_SEQ(&Provider_child), + { 0 } +}; + +static const struct prov_method_sequence treewalker_seq8[] = { + { &Provider_child2, FRAG_NAVIGATE }, /* NavigateDirection_PreviousSibling */ + NODE_CREATE_SEQ(&Provider_child), + { &Provider_child, FRAG_GET_RUNTIME_ID }, + { 0 } +}; + static void test_CUIAutomation_TreeWalker_ifaces(IUIAutomation *uia_iface) { HWND hwnd = create_test_hwnd("test_CUIAutomation_TreeWalker_ifaces class"); - IUIAutomationElement *element, *element2; + IUIAutomationElement *element, *element2, *element3; IUIAutomationCacheRequest *cache_req; IUIAutomationCondition *cond, *cond2; IUIAutomationTreeWalker *walker; @@ -11794,6 +11820,25 @@ static void test_CUIAutomation_TreeWalker_ifaces(IUIAutomation *uia_iface) ok(!!element2, "element2 == NULL\n"); ok_method_sequence(treewalker_seq2, "treewalker_seq2");
+ /* NavigateDirection_NextSibling. */ + element3 = NULL; + hr = IUIAutomationTreeWalker_GetNextSiblingElement(walker, element2, &element3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(Provider_child2.ref == 2, "Unexpected refcnt %ld\n", Provider_child2.ref); + ok(!!element3, "element3 == NULL\n"); + ok_method_sequence(treewalker_seq5, "treewalker_seq5"); + IUIAutomationElement_Release(element3); + ok(Provider_child2.ref == 1, "Unexpected refcnt %ld\n", Provider_child2.ref); + + element3 = NULL; + hr = IUIAutomationTreeWalker_GetNextSiblingElementBuildCache(walker, element2, cache_req, &element3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(Provider_child2.ref == 2, "Unexpected refcnt %ld\n", Provider_child2.ref); + ok(!!element3, "element3 == NULL\n"); + ok_method_sequence(treewalker_seq6, "treewalker_seq6"); + IUIAutomationElement_Release(element3); + ok(Provider_child2.ref == 1, "Unexpected refcnt %ld\n", Provider_child2.ref); + IUIAutomationElement_Release(element2); ok(Provider_child.ref == 1, "Unexpected refcnt %ld\n", Provider_child.ref);
@@ -11815,6 +11860,25 @@ static void test_CUIAutomation_TreeWalker_ifaces(IUIAutomation *uia_iface) ok(!!element2, "element2 == NULL\n"); ok_method_sequence(treewalker_seq4, "treewalker_seq4");
+ /* NavigateDirection_PreviousSibling. */ + element3 = NULL; + hr = IUIAutomationTreeWalker_GetPreviousSiblingElement(walker, element2, &element3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(Provider_child.ref == 2, "Unexpected refcnt %ld\n", Provider_child.ref); + ok(!!element3, "element3 == NULL\n"); + ok_method_sequence(treewalker_seq7, "treewalker_seq7"); + IUIAutomationElement_Release(element3); + ok(Provider_child.ref == 1, "Unexpected refcnt %ld\n", Provider_child.ref); + + element3 = NULL; + hr = IUIAutomationTreeWalker_GetPreviousSiblingElementBuildCache(walker, element2, cache_req, &element3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(Provider_child.ref == 2, "Unexpected refcnt %ld\n", Provider_child.ref); + ok(!!element3, "element3 == NULL\n"); + ok_method_sequence(treewalker_seq8, "treewalker_seq8"); + IUIAutomationElement_Release(element3); + ok(Provider_child.ref == 1, "Unexpected refcnt %ld\n", Provider_child.ref); + IUIAutomationElement_Release(element2); ok(Provider_child2.ref == 1, "Unexpected refcnt %ld\n", Provider_child2.ref);
diff --git a/dlls/uiautomationcore/uia_com_client.c b/dlls/uiautomationcore/uia_com_client.c index 0af6b1f1310..fa70edb14bf 100644 --- a/dlls/uiautomationcore/uia_com_client.c +++ b/dlls/uiautomationcore/uia_com_client.c @@ -2526,15 +2526,21 @@ static HRESULT WINAPI uia_tree_walker_GetLastChildElement(IUIAutomationTreeWalke static HRESULT WINAPI uia_tree_walker_GetNextSiblingElement(IUIAutomationTreeWalker *iface, IUIAutomationElement *elem, IUIAutomationElement **next) { - FIXME("%p, %p, %p: stub\n", iface, elem, next); - return E_NOTIMPL; + struct uia_tree_walker *tree_walker = impl_from_IUIAutomationTreeWalker(iface); + + TRACE("%p, %p, %p\n", iface, elem, next); + + return IUIAutomationTreeWalker_GetNextSiblingElementBuildCache(iface, elem, tree_walker->default_cache_req, next); }
static HRESULT WINAPI uia_tree_walker_GetPreviousSiblingElement(IUIAutomationTreeWalker *iface, IUIAutomationElement *elem, IUIAutomationElement **prev) { - FIXME("%p, %p, %p: stub\n", iface, elem, prev); - return E_NOTIMPL; + struct uia_tree_walker *tree_walker = impl_from_IUIAutomationTreeWalker(iface); + + TRACE("%p, %p, %p\n", iface, elem, prev); + + return IUIAutomationTreeWalker_GetPreviousSiblingElementBuildCache(iface, elem, tree_walker->default_cache_req, prev); }
static HRESULT WINAPI uia_tree_walker_NormalizeElement(IUIAutomationTreeWalker *iface, IUIAutomationElement *elem, @@ -2604,15 +2610,17 @@ static HRESULT WINAPI uia_tree_walker_GetLastChildElementBuildCache(IUIAutomatio static HRESULT WINAPI uia_tree_walker_GetNextSiblingElementBuildCache(IUIAutomationTreeWalker *iface, IUIAutomationElement *elem, IUIAutomationCacheRequest *cache_req, IUIAutomationElement **next) { - FIXME("%p, %p, %p, %p: stub\n", iface, elem, cache_req, next); - return E_NOTIMPL; + TRACE("%p, %p, %p, %p\n", iface, elem, cache_req, next); + + return uia_tree_walker_navigate(iface, cache_req, elem, NavigateDirection_NextSibling, next); }
static HRESULT WINAPI uia_tree_walker_GetPreviousSiblingElementBuildCache(IUIAutomationTreeWalker *iface, IUIAutomationElement *elem, IUIAutomationCacheRequest *cache_req, IUIAutomationElement **prev) { - FIXME("%p, %p, %p, %p: stub\n", iface, elem, cache_req, prev); - return E_NOTIMPL; + TRACE("%p, %p, %p, %p\n", iface, elem, cache_req, prev); + + return uia_tree_walker_navigate(iface, cache_req, elem, NavigateDirection_PreviousSibling, prev); }
static HRESULT WINAPI uia_tree_walker_NormalizeElementBuildCache(IUIAutomationTreeWalker *iface,