richedit: Tests for WM_SIZE/scrollbar recursion bug, with todo_wine.

This is a minimal model of what happens in Corman Lisp 3.0 -
subclassed window class that unconditionally calls ShowScrollBar() to
force scrollbar visibility.
This commit is contained in:
Alex Villacís Lasso 2008-07-20 10:57:18 -05:00 committed by Alexandre Julliard
parent 47871f69a1
commit 9d39754e93
1 changed files with 71 additions and 0 deletions

View File

@ -2229,11 +2229,45 @@ static void test_EM_SCROLL(void)
DestroyWindow(hwndRichEdit);
}
unsigned int recursionLevel = 0;
unsigned int WM_SIZE_recursionLevel = 0;
BOOL bailedOutOfRecursion = FALSE;
LRESULT WINAPI (*richeditProc)(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
static LRESULT WINAPI RicheditStupidOverrideProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT r;
if (bailedOutOfRecursion) return 0;
if (recursionLevel >= 32) {
bailedOutOfRecursion = TRUE;
return 0;
}
recursionLevel++;
switch (message) {
case WM_SIZE:
WM_SIZE_recursionLevel++;
r = richeditProc(hwnd, message, wParam, lParam);
/* Because, uhhhh... I never heard of ES_DISABLENOSCROLL */
ShowScrollBar(hwnd, SB_VERT, TRUE);
WM_SIZE_recursionLevel--;
break;
default:
r = richeditProc(hwnd, message, wParam, lParam);
break;
}
recursionLevel--;
return r;
}
static void test_scrollbar_visibility(void)
{
HWND hwndRichEdit;
const char * text="a\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\n";
SCROLLINFO si;
WNDCLASSA cls;
BOOL r;
/* These tests show that richedit should temporarily refrain from automatically
hiding or showing its scrollbars (vertical at least) when an explicit request
@ -2929,6 +2963,43 @@ static void test_scrollbar_visibility(void)
si.nPage, si.nMin, si.nMax);
DestroyWindow(hwndRichEdit);
/* This window proc models what is going on with Corman Lisp 3.0.
At WM_SIZE, this proc unconditionally calls ShowScrollBar() to
force the scrollbar into visibility. Recursion should NOT happen
as a result of this action.
*/
r = GetClassInfoA(NULL, RICHEDIT_CLASS, &cls);
if (r) {
richeditProc = cls.lpfnWndProc;
cls.lpfnWndProc = RicheditStupidOverrideProcA;
cls.lpszClassName = "RicheditStupidOverride";
if(!RegisterClassA(&cls)) assert(0);
recursionLevel = 0;
WM_SIZE_recursionLevel = 0;
bailedOutOfRecursion = FALSE;
hwndRichEdit = new_window(cls.lpszClassName, ES_MULTILINE, NULL);
todo_wine {
ok(!bailedOutOfRecursion,
"WM_SIZE/scrollbar mutual recursion detected, expected none!\n");
}
recursionLevel = 0;
WM_SIZE_recursionLevel = 0;
bailedOutOfRecursion = FALSE;
MoveWindow(hwndRichEdit, 0, 0, 250, 100, TRUE);
todo_wine {
ok(!bailedOutOfRecursion,
"WM_SIZE/scrollbar mutual recursion detected, expected none!\n");
}
/* Unblock window in order to process WM_DESTROY */
recursionLevel = 0;
bailedOutOfRecursion = FALSE;
WM_SIZE_recursionLevel = 0;
DestroyWindow(hwndRichEdit);
}
}
static void test_EM_SETUNDOLIMIT(void)