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); 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) static void test_scrollbar_visibility(void)
{ {
HWND hwndRichEdit; 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"; 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; SCROLLINFO si;
WNDCLASSA cls;
BOOL r;
/* These tests show that richedit should temporarily refrain from automatically /* These tests show that richedit should temporarily refrain from automatically
hiding or showing its scrollbars (vertical at least) when an explicit request 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); si.nPage, si.nMin, si.nMax);
DestroyWindow(hwndRichEdit); 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) static void test_EM_SETUNDOLIMIT(void)