Jacek Caban : mshtml: Added tests of handling ActiveX objects without IQuickActivate interface implemented .

Alexandre Julliard julliard at winehq.org
Thu Nov 17 12:52:35 CST 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Nov 17 13:55:07 2011 +0100

mshtml: Added tests of handling ActiveX objects without IQuickActivate interface implemented.

---

 dlls/mshtml/tests/activex.c |  133 ++++++++++++++++++++++++++++++------------
 1 files changed, 95 insertions(+), 38 deletions(-)

diff --git a/dlls/mshtml/tests/activex.c b/dlls/mshtml/tests/activex.c
index c056e8b..d9e9c1f 100644
--- a/dlls/mshtml/tests/activex.c
+++ b/dlls/mshtml/tests/activex.c
@@ -83,10 +83,19 @@ DEFINE_EXPECT(SetObjectRects);
 DEFINE_EXPECT(InPlaceDeactivate);
 DEFINE_EXPECT(UIDeactivate);
 DEFINE_EXPECT(QueryService_TestActiveX);
+DEFINE_EXPECT(GetMiscStatus);
+DEFINE_EXPECT(SetAdvise);
+DEFINE_EXPECT(GetViewStatus);
 
 #define DISPID_SCRIPTPROP 1000
 
+enum {
+    TEST_FLASH,
+    TEST_NOQUICKACT
+};
+
 static HWND container_hwnd, plugin_hwnd;
+static int plugin_behavior;
 
 #define TESTACTIVEX_CLSID "{178fc163-f585-4e24-9c13-4bb7f6680746}"
 
@@ -703,8 +712,13 @@ static HRESULT WINAPI ViewObjectEx_Unfreeze(IViewObjectEx *iface, DWORD dwFreeze
 
 static HRESULT WINAPI ViewObjectEx_SetAdvise(IViewObjectEx *iface, DWORD aspects, DWORD advf, IAdviseSink *pAdvSink)
 {
-    ok(0, "unexpected call\n");
-    return E_NOTIMPL;
+    CHECK_EXPECT(SetAdvise);
+
+    ok(aspects == DVASPECT_CONTENT, "aspects = %x\n", aspects);
+    ok(!advf, "advf = %x\n", advf);
+    ok(pAdvSink != NULL, "pAdvSink = NULL\n");
+
+    return S_OK;
 }
 
 static HRESULT WINAPI ViewObjectEx_GetAdvise(IViewObjectEx *iface, DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink)
@@ -727,8 +741,10 @@ static HRESULT WINAPI ViewObjectEx_GetRect(IViewObjectEx *iface, DWORD dwAspect,
 
 static HRESULT WINAPI ViewObjectEx_GetViewStatus(IViewObjectEx *iface, DWORD *pdwStatus)
 {
-    ok(0, "unexpected call\n");
-    return E_NOTIMPL;
+    CHECK_EXPECT(GetViewStatus);
+
+    *pdwStatus = VIEWSTATUS_OPAQUE|VIEWSTATUS_SOLIDBKGND;
+    return S_OK;
 }
 
 static HRESULT WINAPI ViewObjectEx_QueryHitPoint(IViewObjectEx *iface, DWORD dwAspect, LPCRECT pRectBounds, POINT ptlLoc,
@@ -795,7 +811,10 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
     }
 
     CHECK_EXPECT(SetClientSite);
-    return E_NOTIMPL;
+
+    IOleClientSite_AddRef(pClientSite);
+    client_site = pClientSite;
+    return S_OK;
 }
 
 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite)
@@ -981,8 +1000,12 @@ static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **pp
 
 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
 {
-    ok(0, "unexpected call\n");
-    return E_NOTIMPL;
+    CHECK_EXPECT(GetMiscStatus);
+    ok(dwAspect == DVASPECT_CONTENT, "dwAspect = %d\n", dwAspect);
+    ok(pdwStatus != NULL, "pdwStatus == NULL\n");
+    *pdwStatus = OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE
+        |OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE;
+    return S_OK;
 }
 
 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal)
@@ -1124,42 +1147,26 @@ static HRESULT ax_qi(REFIID riid, void **ppv)
 {
     if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IOleControl)) {
         *ppv = &OleControl;
-        return S_OK;
-    }
-
-    if(IsEqualGUID(riid, &IID_IQuickActivate)) {
-        *ppv = &QuickActivate;
-        return S_OK;
-    }
-
-    if(IsEqualGUID(riid, &IID_IPersistPropertyBag)) {
-        *ppv = &PersistPropertyBag;
-        return S_OK;
-    }
-
-    if(IsEqualGUID(riid, &IID_IDispatch)) {
+    }else if(IsEqualGUID(riid, &IID_IQuickActivate)) {
+        *ppv = plugin_behavior == TEST_NOQUICKACT ? NULL : &QuickActivate;
+    }else if(IsEqualGUID(riid, &IID_IPersistPropertyBag)) {
+        *ppv = plugin_behavior == TEST_NOQUICKACT ? NULL : &PersistPropertyBag;
+    }else if(IsEqualGUID(riid, &IID_IDispatch)) {
         *ppv = &Dispatch;
-        return S_OK;
-    }
-
-    if(IsEqualGUID(riid, &IID_IViewObject) || IsEqualGUID(riid, &IID_IViewObject2) || IsEqualGUID(riid, &IID_IViewObjectEx)) {
+    }else if(IsEqualGUID(riid, &IID_IViewObject) || IsEqualGUID(riid, &IID_IViewObject2)
+            || IsEqualGUID(riid, &IID_IViewObjectEx)) {
         *ppv = &ViewObjectEx;
-        return S_OK;
-    }
-
-    if(IsEqualGUID(riid, &IID_IOleObject)) {
+    }else if(IsEqualGUID(riid, &IID_IOleObject)) {
         *ppv = &OleObject;
-        return S_OK;
-    }
-
-    if(IsEqualGUID(riid, &IID_IOleWindow) || IsEqualGUID(riid, &IID_IOleInPlaceObject)
+    }else  if(IsEqualGUID(riid, &IID_IOleWindow) || IsEqualGUID(riid, &IID_IOleInPlaceObject)
        || IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) {
         *ppv = &OleInPlaceObjectWindowless;
-        return S_OK;
+    }else {
+        trace("QI %s\n", debugstr_guid(riid));
+        *ppv = NULL;
     }
 
-    *ppv = NULL;
-    return E_NOINTERFACE;
+    return *ppv ? S_OK : E_NOINTERFACE;
 }
 
 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
@@ -1949,10 +1956,12 @@ static void release_doc(IHTMLDocument2 *doc)
     }
 }
 
-static void test_object_ax(void)
+static void test_flash_ax(void)
 {
     IHTMLDocument2 *doc;
 
+    plugin_behavior = TEST_FLASH;
+
     /*
      * We pump messages until both document is loaded and plugin instance is created.
      * Pumping until document is loaded should be enough, but Gecko loads plugins
@@ -2009,6 +2018,51 @@ static void test_object_ax(void)
     CHECK_CALLED(SetClientSite_NULL);
 }
 
+static void test_noquickact_ax(void)
+{
+    IHTMLDocument2 *doc;
+
+    plugin_behavior = TEST_NOQUICKACT;
+
+    SET_EXPECT(CreateInstance);
+    SET_EXPECT(FreezeEvents_TRUE);
+    SET_EXPECT(GetMiscStatus);
+    SET_EXPECT(SetClientSite);
+    SET_EXPECT(SetAdvise);
+    SET_EXPECT(GetViewStatus);
+    SET_EXPECT(FreezeEvents_FALSE);
+    SET_EXPECT(Invoke_READYSTATE);
+    SET_EXPECT(SetExtent);
+    SET_EXPECT(GetExtent);
+    SET_EXPECT(DoVerb);
+
+    doc = create_doc(object_ax_str, &called_CreateInstance);
+
+    CHECK_CALLED(CreateInstance);
+    todo_wine CHECK_CALLED(FreezeEvents_TRUE);
+    CHECK_CALLED(GetMiscStatus);
+    CHECK_CALLED(SetClientSite);
+    CHECK_CALLED(SetAdvise);
+    CHECK_CALLED(GetViewStatus);
+    todo_wine CHECK_CALLED(FreezeEvents_FALSE);
+    CHECK_CALLED(Invoke_READYSTATE);
+    todo_wine CHECK_CALLED(SetExtent);
+    todo_wine CHECK_CALLED(GetExtent);
+    CHECK_CALLED(DoVerb);
+
+    /* Set in DoVerb */
+    CHECK_CALLED(InPlaceObject_GetWindow);
+    CHECK_CALLED(SetObjectRects);
+
+    SET_EXPECT(InPlaceDeactivate);
+    SET_EXPECT(Close);
+    SET_EXPECT(SetClientSite_NULL);
+    release_doc(doc);
+    CHECK_CALLED(InPlaceDeactivate);
+    CHECK_CALLED(Close);
+    CHECK_CALLED(SetClientSite_NULL);
+}
+
 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     return DefWindowProc(hwnd, msg, wParam, lParam);
@@ -2121,7 +2175,10 @@ START_TEST(activex)
     ShowWindow(container_hwnd, SW_SHOW);
 
     if(register_activex()) {
-        test_object_ax();
+        trace("Testing emulated flash embedding...\n");
+        test_flash_ax();
+        trace("Testing plugin without IQuickActivate iface...\n");
+        test_noquickact_ax();
         init_registry(FALSE);
     }else {
         skip("Could not register ActiveX\n");




More information about the wine-cvs mailing list