From: Connor McAdams Subject: [PATCH v4 2/2] oleacc: Add STATE_SYSTEM_FOCUSED test for default client object. Message-Id: <20210912190237.2222780-2-cmcadams@codeweavers.com> Date: Sun, 12 Sep 2021 15:02:37 -0400 In-Reply-To: <20210912190237.2222780-1-cmcadams@codeweavers.com> References: <20210912190237.2222780-1-cmcadams@codeweavers.com> Signed-off-by: Connor McAdams --- dlls/oleacc/tests/main.c | 65 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/dlls/oleacc/tests/main.c b/dlls/oleacc/tests/main.c index ce44e06abe4..0419b862459 100644 --- a/dlls/oleacc/tests/main.c +++ b/dlls/oleacc/tests/main.c @@ -729,6 +729,36 @@ static void test_AccessibleChildren(IAccessible *acc) ok(V_VT(children+2) == VT_EMPTY, "V_VT(children+2) = %d\n", V_VT(children+2)); } +static void check_accessible_state(IAccessible *acc, INT state_flags, BOOL todo) +{ + VARIANT vid, v; + HRESULT hr; + + V_VT(&vid) = VT_I4; + V_I4(&vid) = CHILDID_SELF; + 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)); + if (todo) + todo_wine ok(V_I4(&v) == state_flags, "V_I4(&v) = %x\n", V_I4(&v)); + else + ok(V_I4(&v) == state_flags, "V_I4(&v) = %x\n", V_I4(&v)); +} + +static DWORD WINAPI acc_focus_test_invisible_thread(LPVOID param) +{ + check_accessible_state((IAccessible *)param, STATE_SYSTEM_FOCUSABLE | + STATE_SYSTEM_INVISIBLE | STATE_SYSTEM_FOCUSED, TRUE); + return 0; +} + +static DWORD WINAPI acc_focus_test_visible_thread(LPVOID param) +{ + check_accessible_state((IAccessible *)param, STATE_SYSTEM_FOCUSABLE | + STATE_SYSTEM_FOCUSED, FALSE); + return 0; +} + static void test_default_client_accessible_object(void) { IAccessible *acc; @@ -743,6 +773,7 @@ static void test_default_client_accessible_object(void) RECT rect; LONG l, left, top, width, height; ULONG fetched; + HANDLE hthread; hwnd = CreateWindowA("oleacc_test", "wnd &t &junk", WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, NULL, NULL, NULL, NULL); @@ -901,6 +932,40 @@ static void test_default_client_accessible_object(void) ok(V_I4(&v) == (STATE_SYSTEM_FOCUSABLE|STATE_SYSTEM_INVISIBLE), "V_I4(&v) = %x\n", V_I4(&v)); + /* + * Currently, Wine's SetForegroundWindow behavior doesn't match Windows, + * so calling SetFocus on an invisible HWND doesn't set it as the + * foreground window. Until this is fixed, our STATE_SYSTEM_FOCUSED + * behavior will be broken. + */ + SetFocus(hwnd); + 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)); + todo_wine ok(V_I4(&v) == (STATE_SYSTEM_FOCUSABLE|STATE_SYSTEM_INVISIBLE|STATE_SYSTEM_FOCUSED), + "V_I4(&v) = %x\n", V_I4(&v)); + + /* + * Show that STATE_SYSTEM_FOCUSED is set properly even when queried in a + * thread separate from the provided HWND's GUI thread. + */ + hthread = CreateThread(NULL, 0, acc_focus_test_invisible_thread, (void *)acc, 0, NULL); + ok(!WaitForSingleObject(hthread, 10000), "Focus thread failed to return!\n"); + CloseHandle(hthread); + + ShowWindow(hwnd, SW_SHOW); + SetFocus(hwnd); + 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_FOCUSED), + "V_I4(&v) = %x\n", V_I4(&v)); + + hthread = CreateThread(NULL, 0, acc_focus_test_visible_thread, (void *)acc, 0, NULL); + ok(!WaitForSingleObject(hthread, 10000), "Focus thread failed to return!\n"); + CloseHandle(hthread); + ShowWindow(hwnd, SW_HIDE); + str = (void*)0xdeadbeef; hr = IAccessible_get_accHelp(acc, vid, &str); ok(hr == S_FALSE, "got %x\n", hr); -- 2.25.1