user32/edit: Avoid division by zero during initialization.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=19239 Signed-off-by: Roman Pišl <rpisl@seznam.cz> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
be1446f56c
commit
d5e591d3cb
|
@ -465,7 +465,7 @@ static SCRIPT_STRING_ANALYSIS EDIT_UpdateUniscribeData(EDITSTATE *es, HDC dc, IN
|
||||||
|
|
||||||
static inline INT get_vertical_line_count(EDITSTATE *es)
|
static inline INT get_vertical_line_count(EDITSTATE *es)
|
||||||
{
|
{
|
||||||
INT vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
|
INT vlc = es->line_height ? (es->format_rect.bottom - es->format_rect.top) / es->line_height : 0;
|
||||||
return max(1,vlc);
|
return max(1,vlc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1638,7 +1638,7 @@ static void EDIT_UpdateScrollInfo(EDITSTATE *es)
|
||||||
si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_DISABLENOSCROLL;
|
si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_DISABLENOSCROLL;
|
||||||
si.nMin = 0;
|
si.nMin = 0;
|
||||||
si.nMax = es->line_count - 1;
|
si.nMax = es->line_count - 1;
|
||||||
si.nPage = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
|
si.nPage = es->line_height ? (es->format_rect.bottom - es->format_rect.top) / es->line_height : 0;
|
||||||
si.nPos = es->y_offset;
|
si.nPos = es->y_offset;
|
||||||
TRACE("SB_VERT, nMin=%d, nMax=%d, nPage=%d, nPos=%d\n",
|
TRACE("SB_VERT, nMin=%d, nMax=%d, nPage=%d, nPos=%d\n",
|
||||||
si.nMin, si.nMax, si.nPage, si.nPos);
|
si.nMin, si.nMax, si.nPage, si.nPos);
|
||||||
|
|
|
@ -1743,6 +1743,71 @@ static BOOL is_font_installed(const char*name)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static WNDPROC orig_class_proc;
|
||||||
|
|
||||||
|
static LRESULT CALLBACK test_class_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
LRESULT result, r;
|
||||||
|
|
||||||
|
switch (message)
|
||||||
|
{
|
||||||
|
case WM_NCCREATE:
|
||||||
|
result = CallWindowProcA(orig_class_proc, hwnd, message, wParam, lParam);
|
||||||
|
|
||||||
|
memset(&rect, 0, sizeof(rect));
|
||||||
|
SendMessageA(hwnd, EM_GETRECT, 0, (LPARAM)&rect);
|
||||||
|
ok(!rect.right && !rect.bottom, "Invalid size after NCCREATE: %d x %d\n", rect.right, rect.bottom);
|
||||||
|
|
||||||
|
/* test that messages between WM_NCCREATE and WM_CREATE
|
||||||
|
don't crash or cause unexpected behavior */
|
||||||
|
r = SendMessageA(hwnd, EM_SETSEL, 0, 0);
|
||||||
|
ok(r == 1, "Returned %ld, expected 1.\n", r);
|
||||||
|
r = SendMessageA(hwnd, WM_SIZE, 0, 0x00100010);
|
||||||
|
todo_wine ok(r == 1, "Returned %ld, expected 1.\n", r);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
|
||||||
|
case WM_CREATE:
|
||||||
|
/* test that messages between WM_NCCREATE and WM_CREATE
|
||||||
|
don't crash or cause unexpected behavior */
|
||||||
|
r = SendMessageA(hwnd, EM_SETSEL, 0, 0);
|
||||||
|
ok(r == 1, "Returned %ld, expected 1.\n", r);
|
||||||
|
r = SendMessageA(hwnd, WM_SIZE, 0, 0x00100010);
|
||||||
|
todo_wine ok(r == 1, "Returned %ld, expected 1.\n", r);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CallWindowProcA(orig_class_proc, hwnd, message, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_initialization(void)
|
||||||
|
{
|
||||||
|
BOOL ret;
|
||||||
|
ATOM atom;
|
||||||
|
HWND hwEdit;
|
||||||
|
WNDCLASSA cls;
|
||||||
|
|
||||||
|
ret = GetClassInfoA(NULL, "Edit", &cls);
|
||||||
|
ok(ret, "Failed to get class info.\n");
|
||||||
|
|
||||||
|
orig_class_proc = cls.lpfnWndProc;
|
||||||
|
cls.lpfnWndProc = test_class_proc;
|
||||||
|
cls.lpszClassName = "TestClassName";
|
||||||
|
|
||||||
|
atom = RegisterClassA(&cls);
|
||||||
|
ok(atom != 0, "Failed to register class.\n");
|
||||||
|
|
||||||
|
hwEdit = CreateWindowExA(0, (LPCSTR)MAKEINTATOM(atom), "Text Text",
|
||||||
|
ES_MULTILINE | WS_BORDER | ES_AUTOHSCROLL | ES_AUTOVSCROLL | WS_VSCROLL,
|
||||||
|
10, 10, 300, 300, NULL, NULL, hinst, NULL);
|
||||||
|
ok(hwEdit != NULL, "Failed to create a window.\n");
|
||||||
|
|
||||||
|
DestroyWindow(hwEdit);
|
||||||
|
UnregisterClassA((LPCSTR)MAKEINTATOM(atom), hinst);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_margins(void)
|
static void test_margins(void)
|
||||||
{
|
{
|
||||||
HWND hwEdit;
|
HWND hwEdit;
|
||||||
|
@ -3268,6 +3333,7 @@ START_TEST(edit)
|
||||||
test_edit_control_6();
|
test_edit_control_6();
|
||||||
test_edit_control_limittext();
|
test_edit_control_limittext();
|
||||||
test_edit_control_scroll();
|
test_edit_control_scroll();
|
||||||
|
test_initialization();
|
||||||
test_margins();
|
test_margins();
|
||||||
test_margins_font_change();
|
test_margins_font_change();
|
||||||
test_text_position();
|
test_text_position();
|
||||||
|
|
Loading…
Reference in New Issue