Module: wine Branch: master Commit: 21898b2fbab550119423a87597914d012ca97df1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=21898b2fbab550119423a87597...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Aug 29 18:29:47 2012 +0200
comctl32: Remove property sheet page that can't be initialized.
---
dlls/comctl32/propsheet.c | 16 ++++++++++++++-- dlls/comctl32/tests/propsheet.c | 29 ++++++++++++++++++++++++++++- dlls/comctl32/tests/resources.h | 1 + dlls/comctl32/tests/rsrc.rc | 7 +++++++ 4 files changed, 50 insertions(+), 3 deletions(-)
diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c index 3c0f3d3..b2ceee8 100644 --- a/dlls/comctl32/propsheet.c +++ b/dlls/comctl32/propsheet.c @@ -171,6 +171,7 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg, static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE hpage, const PropSheetInfo* psInfo); static PADDING_INFO PROPSHEET_GetPaddingInfoWizard(HWND hwndDlg, const PropSheetInfo* psInfo); static BOOL PROPSHEET_DoCommand(HWND hwnd, WORD wID); +static BOOL PROPSHEET_RemovePage(HWND hwndDlg, int index, HPROPSHEETPAGE hpage);
static INT_PTR CALLBACK PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -1474,6 +1475,9 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent, /* Free a no more needed copy */ Free(pTemplateCopy);
+ if(!hwndPage) + return FALSE; + psInfo->proppage[index].hwndPage = hwndPage;
/* Subclass exterior wizard pages */ @@ -2025,7 +2029,14 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg, psn.lParam = 0;
if (!psInfo->proppage[index].hwndPage) { - PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage); + if(!PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage)) { + PROPSHEET_RemovePage(hwndDlg, index, NULL); + if(index >= psInfo->nPages) + index--; + if(index < 0) + return FALSE; + continue; + } }
/* Resize the property sheet page to the fit in the Tab control @@ -2273,7 +2284,8 @@ static BOOL PROPSHEET_AddPage(HWND hwndDlg, if (ppsp->dwFlags & PSP_PREMATURE) { /* Create the page but don't show it */ - PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp); + if(!PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp)) + return FALSE; }
/* diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c index 92fb1dd..992b60f 100644 --- a/dlls/comctl32/tests/propsheet.c +++ b/dlls/comctl32/tests/propsheet.c @@ -750,7 +750,7 @@ static void test_messages(void)
static void test_PSM_ADDPAGE(void) { - HPROPSHEETPAGE hpsp[3]; + HPROPSHEETPAGE hpsp[5]; PROPSHEETPAGEA psp; PROPSHEETHEADERA psh; HWND hdlg, tab; @@ -771,6 +771,12 @@ static void test_PSM_ADDPAGE(void) hpsp[1] = CreatePropertySheetPageA(&psp); hpsp[2] = CreatePropertySheetPageA(&psp);
+ U(psp).pszTemplate = MAKEINTRESOURCE(IDD_PROP_PAGE_ERROR); + hpsp[3] = CreatePropertySheetPageA(&psp); + + psp.dwFlags = PSP_PREMATURE; + hpsp[4] = CreatePropertySheetPageA(&psp); + memset(&psh, 0, sizeof(psh)); psh.dwSize = PROPSHEETHEADERA_V1_SIZE; psh.dwFlags = PSH_MODELESS; @@ -807,6 +813,27 @@ if (0) r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); ok(r == 3, "got %d\n", r);
+ /* add property sheet page that can't be created */ + ret = SendMessageA(hdlg, PSM_ADDPAGE, 0, (LPARAM)hpsp[3]); + ok(ret == TRUE, "got %d\n", ret); + + r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); + ok(r == 4, "got %d\n", r); + + /* select page that can't be created */ + ret = SendMessageA(hdlg, PSM_SETCURSEL, 3, 0); + ok(ret == TRUE, "got %d\n", ret); + + r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); + ok(r == 3, "got %d\n", r); + + /* test PSP_PREMATURE flag with incorrect property sheet page */ + ret = SendMessageA(hdlg, PSM_ADDPAGE, 0, (LPARAM)hpsp[4]); + ok(ret == FALSE, "got %d\n", ret); + + r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); + ok(r == 3, "got %d\n", r); + DestroyWindow(hdlg); }
diff --git a/dlls/comctl32/tests/resources.h b/dlls/comctl32/tests/resources.h index e5217f1..3a89cd7 100644 --- a/dlls/comctl32/tests/resources.h +++ b/dlls/comctl32/tests/resources.h @@ -38,6 +38,7 @@
#define IDD_PROP_PAGE_WITH_CUSTOM_DEFAULT_BUTTON 34 #define IDD_PROP_PAGE_MESSAGE_TEST 35 +#define IDD_PROP_PAGE_ERROR 36
#define IDC_PS_EDIT1 1000 #define IDC_PS_EDIT2 1001 diff --git a/dlls/comctl32/tests/rsrc.rc b/dlls/comctl32/tests/rsrc.rc index 34b8362..4f7a225 100644 --- a/dlls/comctl32/tests/rsrc.rc +++ b/dlls/comctl32/tests/rsrc.rc @@ -71,6 +71,13 @@ BEGIN LTEXT "Some Text",-1,115,1,195,24 END
+IDD_PROP_PAGE_ERROR DIALOG 0, 0, 100, 100 +STYLE WS_POPUP | WS_CAPTION | WS_CLIPSIBLINGS | WS_VISIBLE +CLASS "Non-existing class" +FONT 8, "MS Shell Dlg" +{ +} + STRINGTABLE { IDS_TBADD1 "abc"