Jacek Caban : ieframe: Return some verbs in IEnumOLEVERB:Next.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Oct 6 15:19:11 CDT 2014


Module: wine
Branch: master
Commit: 2bcbbea53428ffb64295641175701900a911b756
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2bcbbea53428ffb64295641175701900a911b756

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Oct  6 15:26:53 2014 +0200

ieframe: Return some verbs in IEnumOLEVERB:Next.

---

 dlls/ieframe/oleobject.c        | 16 +++++++++++++-
 dlls/ieframe/tests/webbrowser.c | 49 +++++++++++++++++++++++++++++++++++++++--
 2 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/dlls/ieframe/oleobject.c b/dlls/ieframe/oleobject.c
index 0bcf163..d611231 100644
--- a/dlls/ieframe/oleobject.c
+++ b/dlls/ieframe/oleobject.c
@@ -292,8 +292,8 @@ static void release_client_site(WebBrowser *This)
 
 typedef struct {
     IEnumOLEVERB IEnumOLEVERB_iface;
-
     LONG ref;
+    LONG iter;
 } EnumOLEVERB;
 
 static inline EnumOLEVERB *impl_from_IEnumOLEVERB(IEnumOLEVERB *iface)
@@ -348,10 +348,20 @@ static HRESULT WINAPI EnumOLEVERB_Next(IEnumOLEVERB *iface, ULONG celt, OLEVERB
 {
     EnumOLEVERB *This = impl_from_IEnumOLEVERB(iface);
 
+    static const OLEVERB verbs[] =
+        {{OLEIVERB_PRIMARY},{OLEIVERB_INPLACEACTIVATE},{OLEIVERB_UIACTIVATE},{OLEIVERB_SHOW},{OLEIVERB_HIDE}};
+
     TRACE("(%p)->(%u %p %p)\n", This, celt, rgelt, pceltFetched);
 
+    /* There are a few problems with this implementation, but that's how it seems to work in native. See tests. */
     if(pceltFetched)
         *pceltFetched = 0;
+
+    if(This->iter == sizeof(verbs)/sizeof(*verbs))
+        return S_FALSE;
+
+    if(celt)
+        *rgelt = verbs[This->iter++];
     return S_OK;
 }
 
@@ -365,7 +375,10 @@ static HRESULT WINAPI EnumOLEVERB_Skip(IEnumOLEVERB *iface, ULONG celt)
 static HRESULT WINAPI EnumOLEVERB_Reset(IEnumOLEVERB *iface)
 {
     EnumOLEVERB *This = impl_from_IEnumOLEVERB(iface);
+
     TRACE("(%p)\n", This);
+
+    This->iter = 0;
     return S_OK;
 }
 
@@ -599,6 +612,7 @@ static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEn
 
     ret->IEnumOLEVERB_iface.lpVtbl = &EnumOLEVERBVtbl;
     ret->ref = 1;
+    ret->iter = 0;
 
     *ppEnumOleVerb = &ret->IEnumOLEVERB_iface;
     return S_OK;
diff --git a/dlls/ieframe/tests/webbrowser.c b/dlls/ieframe/tests/webbrowser.c
index 27598cf..5973900 100644
--- a/dlls/ieframe/tests/webbrowser.c
+++ b/dlls/ieframe/tests/webbrowser.c
@@ -1997,6 +1997,30 @@ static void test_ClassInfo(IWebBrowser2 *unk)
     IProvideClassInfo2_Release(class_info);
 }
 
+#define expect_oleverb(a,b) _expect_oleverb(__LINE__,a,b)
+static void _expect_oleverb(unsigned line, const OLEVERB *verb, LONG exverb)
+{
+    ok_(__FILE__,line)(verb->lVerb == exverb, "verb->lVerb = %d, expected %d\n", verb->lVerb, exverb);
+    ok_(__FILE__,line)(!verb->lpszVerbName, "verb->lpszVerbName = %s\n", wine_dbgstr_w(verb->lpszVerbName));
+    ok_(__FILE__,line)(!verb->fuFlags, "verb->fuFlags = %x\n", verb->fuFlags);
+    ok_(__FILE__,line)(!verb->grfAttribs, "verb->grfAttribs = %x\n", verb->grfAttribs);
+}
+
+#define test_next_oleverb(a,b) _test_next_oleverb(__LINE__,a,b)
+static void _test_next_oleverb(unsigned line, IEnumOLEVERB *enum_verbs, LONG exverb)
+{
+    ULONG fetched = 0xdeadbeef;
+    OLEVERB verb;
+    HRESULT hres;
+
+    fetched = 0xdeadbeef;
+    memset(&verb, 0xa, sizeof(verb));
+    hres = IEnumOLEVERB_Next(enum_verbs, 1, &verb, &fetched);
+    ok_(__FILE__,line)(hres == S_OK, "Next failed: %08x\n", hres);
+    ok_(__FILE__,line)(!fetched, "fetched = %d\n", fetched);
+    _expect_oleverb(line, &verb, exverb);
+}
+
 static void test_EnumVerbs(IWebBrowser2 *wb)
 {
     IEnumOLEVERB *enum_verbs;
@@ -2014,13 +2038,32 @@ static void test_EnumVerbs(IWebBrowser2 *wb)
     ok(enum_verbs != NULL, "enum_verbs == NULL\n");
 
     fetched = 0xdeadbeef;
+    memset(verbs, 0xa, sizeof(verbs));
+    verbs[1].lVerb = 0xdeadbeef;
     hres = IEnumOLEVERB_Next(enum_verbs, sizeof(verbs)/sizeof(*verbs), verbs, &fetched);
     ok(hres == S_OK, "Next failed: %08x\n", hres);
     ok(!fetched, "fetched = %d\n", fetched);
+    /* Although fetched==0, an element is returned. */
+    expect_oleverb(verbs, OLEIVERB_PRIMARY);
+    /* The first argument is ignorred and always one element is returned. */
+    ok(verbs[1].lVerb == 0xdeadbeef, "verbs[1].lVerb = %x\n", verbs[1].lVerb);
+
+    test_next_oleverb(enum_verbs, OLEIVERB_INPLACEACTIVATE);
+    test_next_oleverb(enum_verbs, OLEIVERB_UIACTIVATE);
+    test_next_oleverb(enum_verbs, OLEIVERB_SHOW);
+    test_next_oleverb(enum_verbs, OLEIVERB_HIDE);
 
+    /* There is anouther verb, returned correctly. */
     fetched = 0xdeadbeef;
-    hres = IEnumOLEVERB_Next(enum_verbs, 1, verbs, &fetched);
-    ok(hres == S_OK, "Next failed: %08x\n", hres);
+    memset(verbs, 0xa, sizeof(verbs));
+    verbs[0].lVerb = 0xdeadbeef;
+    hres = IEnumOLEVERB_Next(enum_verbs, sizeof(verbs)/sizeof(*verbs), verbs, &fetched);
+    todo_wine ok(hres == S_OK, "Next failed: %08x\n", hres);
+    todo_wine ok(fetched == 1, "fetched = %d\n", fetched);
+    todo_wine ok(verbs[0].lVerb != 0xdeadbeef, "verbs[0].lVerb = %x\n", verbs[0].lVerb);
+
+    hres = IEnumOLEVERB_Next(enum_verbs, sizeof(verbs)/sizeof(*verbs), verbs, &fetched);
+    ok(hres == S_FALSE, "Next failed: %08x\n", hres);
     ok(!fetched, "fetched = %d\n", fetched);
 
     hres = IEnumOLEVERB_Reset(enum_verbs);
@@ -2042,6 +2085,8 @@ static void test_EnumVerbs(IWebBrowser2 *wb)
     ok(hres == S_OK, "Next failed: %08x\n", hres);
     ok(!fetched, "fetched = %d\n", fetched);
 
+    test_next_oleverb(enum_verbs, OLEIVERB_SHOW);
+
     IEnumOLEVERB_Release(enum_verbs);
 }
 




More information about the wine-cvs mailing list