[PATCH] oledlg: Replace existing menu item in case of empty object too

Nikolay Sivov nsivov at codeweavers.com
Mon Nov 30 19:13:38 CST 2015


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---

Fixes regression report as https://bugs.winehq.org/show_bug.cgi?id=39691

 dlls/oledlg/oledlg_main.c |  1 +
 dlls/oledlg/tests/main.c  | 67 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/dlls/oledlg/oledlg_main.c b/dlls/oledlg/oledlg_main.c
index 87df968..8ba9f17 100644
--- a/dlls/oledlg/oledlg_main.c
+++ b/dlls/oledlg/oledlg_main.c
@@ -184,6 +184,7 @@ BOOL WINAPI OleUIAddVerbMenuW(IOleObject *object, LPCWSTR shorttype,
     LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_OBJECT, resstrW, sizeof(resstrW)/sizeof(WCHAR));
     /* no object, or object without enumeration support */
     if (!object || !enumverbs) {
+        RemoveMenu(hMenu, uPos, MF_BYPOSITION);
         InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_STRING|MF_GRAYED, idmin, resstrW);
         return FALSE;
     }
diff --git a/dlls/oledlg/tests/main.c b/dlls/oledlg/tests/main.c
index 9c5e4bd..5d452f1 100644
--- a/dlls/oledlg/tests/main.c
+++ b/dlls/oledlg/tests/main.c
@@ -303,6 +303,7 @@ static IOleObject oleobject = { &oleobjectvtbl };
 
 static void test_OleUIAddVerbMenu(void)
 {
+    static const WCHAR cadabraW[] = {'c','a','d','a','b','r','a',0};
     HMENU hMenu, verbmenu;
     MENUITEMINFOW info;
     WCHAR buffW[50];
@@ -418,6 +419,72 @@ static void test_OleUIAddVerbMenu(void)
     ok(count == 5, "got %d\n", count);
 
     DestroyMenu(hMenu);
+
+    /* try to add verb menu repeatedly, with same id */
+    hMenu = CreatePopupMenu();
+
+    count = GetMenuItemCount(hMenu);
+    ok(count == 0, "got %d\n", count);
+
+    verbmenu = NULL;
+    ret = OleUIAddVerbMenuW(NULL, NULL, hMenu, 0, 5, 10, TRUE, 3, &verbmenu);
+    ok(!ret, "got %d\n", ret);
+    ok(verbmenu == NULL, "got %p\n", verbmenu);
+
+    count = GetMenuItemCount(hMenu);
+    ok(count == 1, "got %d\n", count);
+
+    verbmenu = NULL;
+    ret = OleUIAddVerbMenuW(NULL, NULL, hMenu, 0, 5, 10, TRUE, 3, &verbmenu);
+    ok(!ret, "got %d\n", ret);
+    ok(verbmenu == NULL, "got %p\n", verbmenu);
+
+    count = GetMenuItemCount(hMenu);
+    ok(count == 1, "got %d\n", count);
+
+    /* same position, different id */
+    verbmenu = NULL;
+    ret = OleUIAddVerbMenuW(NULL, NULL, hMenu, 0, 6, 10, TRUE, 3, &verbmenu);
+    ok(!ret, "got %d\n", ret);
+    ok(verbmenu == NULL, "got %p\n", verbmenu);
+
+    count = GetMenuItemCount(hMenu);
+    ok(count == 1, "got %d\n", count);
+
+    /* change added item string and state */
+    memset(&info, 0, sizeof(info));
+    info.cbSize = sizeof(info);
+    info.fMask = MIIM_STRING|MIIM_STATE;
+    info.fState = MFS_ENABLED;
+    info.dwTypeData = buffW;
+    lstrcpyW(buffW, cadabraW);
+    ret = SetMenuItemInfoW(hMenu, 0, TRUE, &info);
+    ok(ret, "got %d\n", ret);
+
+    buffW[0] = 0;
+    GetMenuStringW(hMenu, 0, buffW, sizeof(buffW)/sizeof(buffW[0]), MF_BYPOSITION);
+    ok(!lstrcmpW(buffW, cadabraW), "got %s\n", wine_dbgstr_w(buffW));
+
+    verbmenu = NULL;
+    ret = OleUIAddVerbMenuW(NULL, NULL, hMenu, 0, 5, 10, TRUE, 3, &verbmenu);
+    ok(!ret, "got %d\n", ret);
+    ok(verbmenu == NULL, "got %p\n", verbmenu);
+
+    memset(&info, 0, sizeof(info));
+    info.cbSize = sizeof(info);
+    info.fMask = MIIM_STRING|MIIM_STATE;
+    buffW[0] = 0;
+    info.dwTypeData = buffW;
+    info.cch = sizeof(buffW)/sizeof(WCHAR);
+    ret = GetMenuItemInfoW(hMenu, 0, TRUE, &info);
+    ok(ret, "got %d\n", ret);
+    ok(lstrcmpW(buffW, cadabraW), "got %s\n", wine_dbgstr_w(buffW));
+    ok(info.fState == MF_GRAYED, "got state 0x%08x\n", info.fState);
+
+    count = GetMenuItemCount(hMenu);
+    ok(count == 1, "got %d\n", count);
+
+    DestroyMenu(hMenu);
 }
 
 START_TEST(main)
-- 
2.6.2




More information about the wine-patches mailing list