Zhiyi Zhang : comctl32/toolbar: Test that toolbar shouldn't use outside theme handles.

Alexandre Julliard julliard at winehq.org
Tue Jun 22 16:17:06 CDT 2021


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

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Tue Jun 22 16:21:09 2021 +0800

comctl32/toolbar: Test that toolbar shouldn't use outside theme handles.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/comctl32/tests/toolbar.c | 114 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 114 insertions(+)

diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c
index 9cfdcc689d9..d6ee358b04a 100644
--- a/dlls/comctl32/tests/toolbar.c
+++ b/dlls/comctl32/tests/toolbar.c
@@ -46,7 +46,10 @@ static INT (WINAPI *pImageList_GetImageCount)(HIMAGELIST);
 static BOOL (WINAPI *pImageList_GetIconSize)(HIMAGELIST, int *, int *);
 static HIMAGELIST (WINAPI *pImageList_LoadImageA)(HINSTANCE, LPCSTR, int, int, COLORREF, UINT, UINT);
 
+static HRESULT (WINAPI *pCloseThemeData)(HTHEME);
 static BOOL (WINAPI *pIsThemeActive)(VOID);
+static HTHEME (WINAPI *pGetWindowTheme)(HWND);
+static HTHEME (WINAPI *pOpenThemeData)(HWND, LPCWSTR);
 
 static BOOL is_theme_active;
 
@@ -139,6 +142,40 @@ static void MakeButton(TBBUTTON *p, int idCommand, int fsStyle, int nString) {
   p->iString = nString;
 }
 
+/* try to make sure pending X events have been processed before continuing */
+static void flush_events(void)
+{
+    MSG msg;
+    int diff = 200;
+    int min_timeout = 100;
+    DWORD time = GetTickCount() + diff;
+
+    while (diff > 0)
+    {
+        if (MsgWaitForMultipleObjects(0, NULL, FALSE, min_timeout, QS_ALLINPUT) == WAIT_TIMEOUT)
+            break;
+        while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE))
+            DispatchMessageA(&msg);
+        diff = time - GetTickCount();
+    }
+}
+
+static BOOL equal_dc(HDC hdc1, HDC hdc2, int width, int height)
+{
+    int x, y;
+
+    for (x = 0; x < width; ++x)
+    {
+        for (y = 0; y < height; ++y)
+        {
+            if (GetPixel(hdc1, x, y) != GetPixel(hdc2, x, y))
+                return FALSE;
+        }
+    }
+
+    return TRUE;
+}
+
 static void *alloced_str;
 
 static LRESULT parent_wnd_notify(LPARAM lParam)
@@ -2574,6 +2611,79 @@ static void test_imagelist(void)
     DestroyWindow(hwnd);
 }
 
+static void test_visual(void)
+{
+    HBITMAP mem_bitmap1, mem_bitmap2;
+    HDC mem_dc1, mem_dc2, toolbar_dc;
+    TBBUTTON tbbutton;
+    int width, height;
+    HTHEME theme;
+    HWND toolbar;
+    RECT rect;
+    BOOL ret;
+
+    if (!is_theme_active)
+    {
+        skip("Theming is not active, skipping visual tests.\n");
+        return;
+    }
+
+    /* Test that toolbar shouldn't use outside theme handles */
+    toolbar = CreateWindowA(TOOLBARCLASSNAMEA, "", WS_CHILD | WS_VISIBLE, 0, 0, 50, 50, hMainWnd, 0, 0, NULL);
+    ok(!!toolbar, "Failed to create a toolbar window.\n");
+
+    /* Toolbar needs data for it to show */
+    memset(&tbbutton, 0, sizeof(tbbutton));
+    tbbutton.fsState = TBSTATE_ENABLED;
+    tbbutton.iString = (INT_PTR)"test";
+    SendMessageA(toolbar, TB_BUTTONSTRUCTSIZE, sizeof(tbbutton), 0);
+    ret = SendMessageA(toolbar, TB_ADDBUTTONSA, 1, (LPARAM)&tbbutton);
+    ok(ret, "TB_ADDBUTTONSA failed.\n");
+
+    theme = pGetWindowTheme(toolbar);
+    todo_wine
+    ok(!theme, "Expected theme not opened by window.\n");
+
+    toolbar_dc = GetDC(toolbar);
+    GetClientRect(toolbar, &rect);
+    width = rect.right - rect.left;
+    height = rect.bottom - rect.top;
+
+    ret = RedrawWindow(toolbar, NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW | RDW_UPDATENOW);
+    ok(ret, "RedrawWindow failed.\n");
+    flush_events();
+
+    mem_dc1 = CreateCompatibleDC(toolbar_dc);
+    mem_bitmap1 = CreateCompatibleBitmap(toolbar_dc, width, height);
+    SelectObject(mem_dc1, mem_bitmap1);
+    BitBlt(mem_dc1, 0, 0, width, height, toolbar_dc, 0, 0, SRCCOPY);
+
+    if (theme)
+        pCloseThemeData(theme);
+    theme = pOpenThemeData(toolbar, L"Rebar");
+    ok(!!theme, "OpenThemeData failed.\n");
+
+    ret = RedrawWindow(toolbar, NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW | RDW_UPDATENOW);
+    ok(ret, "RedrawWindow failed.\n");
+
+    mem_dc2 = CreateCompatibleDC(toolbar_dc);
+    mem_bitmap2 = CreateCompatibleBitmap(toolbar_dc, width, height);
+    SelectObject(mem_dc2, mem_bitmap2);
+    BitBlt(mem_dc2, 0, 0, width, height, toolbar_dc, 0, 0, SRCCOPY);
+
+    ret = equal_dc(mem_dc1, mem_dc2, width, height);
+    todo_wine
+    ok(ret, "Expected same content.\n");
+
+    pCloseThemeData(theme);
+    DeleteObject(mem_bitmap2);
+    DeleteObject(mem_bitmap1);
+    DeleteDC(mem_dc2);
+    DeleteDC(mem_dc1);
+    ReleaseDC(toolbar, toolbar_dc);
+    DestroyWindow(toolbar);
+}
+
 static void init_functions(void)
 {
     HMODULE hComCtl32, hUxtheme;
@@ -2590,7 +2700,10 @@ static void init_functions(void)
 #undef X
 
 #define X(f) p##f = (void*)GetProcAddress(hUxtheme, #f)
+    X(GetWindowTheme);
     X(IsThemeActive);
+    X(OpenThemeData);
+    X(CloseThemeData);
 #undef X
 }
 
@@ -2649,6 +2762,7 @@ START_TEST(toolbar)
         return;
 
     test_create(TRUE);
+    test_visual();
 
     PostQuitMessage(0);
     while(GetMessageA(&msg,0,0,0)) {




More information about the wine-cvs mailing list