Connor McAdams : oleacc: Add STATE_SYSTEM_FOCUSED test for default client object.

Alexandre Julliard julliard at winehq.org
Thu Sep 16 15:34:31 CDT 2021


Module: wine
Branch: master
Commit: 966e6283dbae70a0a65fa918af5e386a413b5a48
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=966e6283dbae70a0a65fa918af5e386a413b5a48

Author: Connor McAdams <cmcadams at codeweavers.com>
Date:   Thu Sep 16 13:54:26 2021 +0200

oleacc: Add STATE_SYSTEM_FOCUSED test for default client object.

Signed-off-by: Connor McAdams <cmcadams at codeweavers.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/oleacc/tests/main.c | 68 +++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 59 insertions(+), 9 deletions(-)

diff --git a/dlls/oleacc/tests/main.c b/dlls/oleacc/tests/main.c
index ce44e06abe4..f7504d6af63 100644
--- a/dlls/oleacc/tests/main.c
+++ b/dlls/oleacc/tests/main.c
@@ -729,6 +729,38 @@ static void test_AccessibleChildren(IAccessible *acc)
     ok(V_VT(children+2) == VT_EMPTY, "V_VT(children+2) = %d\n", V_VT(children+2));
 }
 
+#define check_acc_state(acc, state) _check_acc_state(__LINE__, acc, state)
+static void _check_acc_state(unsigned line, IAccessible *acc, INT state)
+{
+    VARIANT vid, v;
+    HRESULT hr;
+
+    V_VT(&vid) = VT_I4;
+    V_I4(&vid) = CHILDID_SELF;
+    hr = IAccessible_get_accState(acc, vid, &v);
+    ok_(__FILE__, line)(hr == S_OK, "got %x\n", hr);
+    ok_(__FILE__, line)(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v));
+    ok_(__FILE__, line)(V_I4(&v) == state, "V_I4(&v) = %x\n", V_I4(&v));
+}
+
+static DWORD WINAPI default_client_thread(LPVOID param)
+{
+    IAccessible *acc = param;
+    IOleWindow *ow;
+    HRESULT hr;
+    HWND hwnd;
+
+    hr = IAccessible_QueryInterface(acc, &IID_IOleWindow, (void**)&ow);
+    ok(hr == S_OK, "got %x\n", hr);
+    hr = IOleWindow_GetWindow(ow, &hwnd);
+    ok(hr == S_OK, "got %x\n", hr);
+    IOleWindow_Release(ow);
+
+    ShowWindow(hwnd, SW_SHOW);
+    check_acc_state(acc, STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED);
+    return 0;
+}
+
 static void test_default_client_accessible_object(void)
 {
     IAccessible *acc;
@@ -743,6 +775,7 @@ static void test_default_client_accessible_object(void)
     RECT rect;
     LONG l, left, top, width, height;
     ULONG fetched;
+    HANDLE thread;
 
     hwnd = CreateWindowA("oleacc_test", "wnd &t &junk", WS_OVERLAPPEDWINDOW,
             0, 0, 100, 100, NULL, NULL, NULL, NULL);
@@ -893,13 +926,18 @@ static void test_default_client_accessible_object(void)
     ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v));
     ok(V_I4(&v) == ROLE_SYSTEM_CLIENT, "V_I4(&v) = %d\n", V_I4(&v));
 
-    V_VT(&v) = VT_DISPATCH;
-    V_DISPATCH(&v) = (void*)0xdeadbeef;
-    hr = IAccessible_get_accState(acc, vid, &v);
-    ok(hr == S_OK, "got %x\n", hr);
-    ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v));
-    ok(V_I4(&v) == (STATE_SYSTEM_FOCUSABLE|STATE_SYSTEM_INVISIBLE),
-            "V_I4(&v) = %x\n", V_I4(&v));
+    check_acc_state(acc, STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_INVISIBLE);
+    SetFocus(hwnd);
+    if (GetForegroundWindow() != hwnd)
+    {
+        todo_wine ok(0, "incorrect foreground window\n");
+        SetForegroundWindow(hwnd);
+    }
+    check_acc_state(acc, STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_INVISIBLE |
+            STATE_SYSTEM_FOCUSED);
+    ShowWindow(hwnd, SW_SHOW);
+    check_acc_state(acc, STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED);
+    ShowWindow(hwnd, SW_HIDE);
 
     str = (void*)0xdeadbeef;
     hr = IAccessible_get_accHelp(acc, vid, &str);
@@ -925,7 +963,7 @@ static void test_default_client_accessible_object(void)
     ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v));
     ok(V_I4(&v) == 0, "V_I4(&v) = %d\n", V_I4(&v));
 
-    ShowWindow(hwnd, TRUE);
+    ShowWindow(hwnd, SW_SHOW);
     pt.x = pt.y = 60;
     ok(ClientToScreen(hwnd, &pt), "ClientToScreen failed\n");
     hr = IAccessible_accHitTest(acc, pt.x, pt.y, &v);
@@ -941,7 +979,7 @@ static void test_default_client_accessible_object(void)
     ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(&v) = %p\n", V_DISPATCH(&v));
     VariantClear(&v);
 
-    ShowWindow(chld, FALSE);
+    ShowWindow(chld, SW_HIDE);
     pt.x = pt.y = 25;
     ok(ClientToScreen(hwnd, &pt), "ClientToScreen failed\n");
     hr = IAccessible_accHitTest(acc, pt.x, pt.y, &v);
@@ -970,6 +1008,18 @@ static void test_default_client_accessible_object(void)
     ok(width == pt.x-rect.left, "width = %d, expected %d\n", width, pt.x-rect.left);
     ok(height == pt.y-rect.top, "height = %d, expected %d\n", height, pt.y-rect.top);
 
+    thread = CreateThread(NULL, 0, default_client_thread, (void *)acc, 0, NULL);
+    while(MsgWaitForMultipleObjects(1, &thread, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0)
+    {
+        MSG msg;
+        while(PeekMessageW(&msg, 0, 0, 0, PM_REMOVE))
+        {
+            TranslateMessage(&msg);
+            DispatchMessageW(&msg);
+        }
+    }
+    CloseHandle(thread);
+
     DestroyWindow(hwnd);
 
     hr = IAccessible_get_accChildCount(acc, &l);




More information about the wine-cvs mailing list