MSHTML: Added OnAmbientPropertyChange implementation

Jacek Caban jack at itma.pwr.wroc.pl
Fri Aug 19 13:11:28 CDT 2005


I forgot about diff of Makefile.in.

Changelog:
    - Added OnAmbientPropertyChange implementation
    - Call IDispatch::Invoke when native does (with test)


-------------- next part --------------
Index: dlls/mshtml/oleobj.c
===================================================================
RCS file: /home/wine/wine/dlls/mshtml/oleobj.c,v
retrieving revision 1.16
diff -u -p -r1.16 oleobj.c
--- dlls/mshtml/oleobj.c	18 Aug 2005 10:50:06 -0000	1.16
+++ dlls/mshtml/oleobj.c	19 Aug 2005 16:05:21 -0000
@@ -28,6 +28,8 @@
 #include "winuser.h"
 #include "ole2.h"
 #include "shlguid.h"
+#include "mshtmdid.h"
+#include "idispids.h"
 
 #include "wine/debug.h"
 
@@ -153,6 +155,12 @@ static HRESULT WINAPI OleObject_SetClien
     This->client = pClientSite;
     This->hostui = pDocHostUIHandler;
 
+    IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_USERMODE);
+    IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_OFFLINEIFNOTCONNECTED); 
+    IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_SILENT);
+    IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_USERAGENT);
+    IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_PALETTE);
+
     return S_OK;
 }
 
@@ -855,11 +863,125 @@ static HRESULT WINAPI OleControl_OnMnemo
     return E_NOTIMPL;
 }
 
+static HRESULT get_property(IOleClientSite *client, DISPID dispid, VARIANT *res)
+{
+    IDispatch *disp = NULL;
+    DISPPARAMS dispparams = {NULL, 0};
+    UINT err;
+    HRESULT hres;
+
+    hres = IOleClientSite_QueryInterface(client, &IID_IDispatch, (void**)&disp);
+    if(FAILED(hres)) {
+        TRACE("Could not get IDispatch\n");
+        return hres;
+    }
+
+    VariantInit(res);
+
+    hres = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
+            DISPATCH_PROPERTYGET, &dispparams, res, NULL, &err);
+
+    IDispatch_Release(disp);
+
+    return hres;
+}
+
+static HRESULT on_change_dlcontrol(HTMLDocument *This)
+{
+    VARIANT res;
+    HRESULT hres;
+    
+    hres = get_property(This->client, DISPID_AMBIENT_DLCONTROL, &res);
+    if(SUCCEEDED(hres))
+        FIXME("unsupported dlcontrol %08lx\n", V_I4(&res));
+
+    return S_OK;
+}
+
 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
 {
     HTMLDocument *This = CONTROL_THIS(iface);
-    FIXME("(%p)->(%ld)\n", This, dispID);
-    return E_NOTIMPL;
+    VARIANT res;
+    HRESULT hres;
+
+    if(!This->client) {
+        TRACE("This->client = NULL\n");
+        return S_OK;
+    }
+
+    switch(dispID) {
+    case DISPID_AMBIENT_USERMODE:
+        TRACE("(%p)->(DISPID_AMBIENT_USERMODE)\n", This);
+        hres = get_property(This->client, DISPID_AMBIENT_USERMODE, &res);
+        if(FAILED(hres))
+            return S_OK;
+
+        if(V_VT(&res) == VT_BOOL) {
+            if(!V_BOOL(&res)) {
+                FIXME("edit mode is not supported\n");
+                hres = E_FAIL;
+            }
+        }else {
+            FIXME("V_VT(res)=%d\n", V_VT(&res));
+        }
+        return S_OK;
+    case DISPID_AMBIENT_DLCONTROL:
+        TRACE("(%p)->(DISPID_AMBIENT_DLCONTROL)\n", This);
+        return on_change_dlcontrol(This);
+    case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
+        TRACE("(%p)->(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED)\n", This);
+        on_change_dlcontrol(This);
+        hres = get_property(This->client, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &res);
+        if(FAILED(hres))
+            return S_OK;
+
+        if(V_VT(&res) == VT_BOOL) {
+            if(V_BOOL(&res)) {
+                FIXME("offline connection is not supported\n");
+                hres = E_FAIL;
+            }
+        }else {
+            FIXME("V_VT(res)=%d\n", V_VT(&res));
+        }
+        return S_OK;
+    case DISPID_AMBIENT_SILENT:
+        TRACE("(%p)->(DISPID_AMBIENT_SILENT)\n", This);
+        on_change_dlcontrol(This);
+        hres = get_property(This->client, DISPID_AMBIENT_SILENT, &res);
+        if(FAILED(hres))
+            return S_OK;
+
+        if(V_VT(&res) == VT_BOOL) {
+            if(V_BOOL(&res)) {
+                FIXME("silent mode is not supported\n");
+                hres = E_FAIL;
+            }
+        }else {
+            FIXME("V_VT(res)=%d\n", V_VT(&res));
+        }
+        return S_OK;
+    case DISPID_AMBIENT_USERAGENT:
+        TRACE("(%p)->(DISPID_AMBIENT_USERAGENT)\n", This);
+        hres = get_property(This->client, DISPID_AMBIENT_USERAGENT, &res);
+        if(FAILED(hres))
+            return S_OK;
+
+        FIXME("not supported AMBIENT_USERAGENT\n");
+        hres = E_FAIL;
+        return S_OK;
+    case DISPID_AMBIENT_PALETTE:
+        TRACE("(%p)->(DISPID_AMBIENT_PALETTE)\n", This);
+        hres = get_property(This->client, DISPID_AMBIENT_PALETTE, &res);
+        if(FAILED(hres))
+            return S_OK;
+
+        FIXME("not supported AMBIENT_PALETTE\n");
+        hres = E_FAIL;
+        return S_OK;
+    }
+
+    FIXME("(%p) unsupported dispID=%ld\n", This, dispID);
+    return E_FAIL;
 }
 
 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
Index: dlls/mshtml/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/mshtml/Makefile.in,v
retrieving revision 1.21
diff -u -p -r1.21 Makefile.in
--- dlls/mshtml/Makefile.in	9 Aug 2005 20:46:05 -0000	1.21
+++ dlls/mshtml/Makefile.in	19 Aug 2005 16:05:21 -0000
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = mshtml.dll
 IMPORTLIB = libmshtml.$(IMPLIBEXT)
-IMPORTS   = urlmon ole32 user32 gdi32 advapi32 kernel32 ntdll
+IMPORTS   = urlmon ole32 oleaut32 user32 gdi32 advapi32 kernel32 ntdll
 EXTRALIBS = $(LIBUNICODE) -lstrmiids -luuid
 EXTRADEFS = -DCOM_NO_WINDOWS_H
 
Index: dlls/mshtml/tests/htmldoc.c
===================================================================
RCS file: /home/wine/wine/dlls/mshtml/tests/htmldoc.c,v
retrieving revision 1.10
diff -u -p -r1.10 htmldoc.c
--- dlls/mshtml/tests/htmldoc.c	18 Aug 2005 10:50:05 -0000	1.10
+++ dlls/mshtml/tests/htmldoc.c	19 Aug 2005 16:05:22 -0000
@@ -27,6 +27,8 @@
 #include "mshtml.h"
 #include "docobj.h"
 #include "mshtmhst.h"
+#include "mshtmdid.h"
+#include "idispids.h"
 #include "shlguid.h"
 
 #include "initguid.h"
@@ -43,6 +45,10 @@ DEFINE_SHLGUID(CGID_Undocumented, 0x0002
     expect_ ## func = FALSE; \
     called_ ## func = TRUE
 
+#define CHECK_EXPECT2(func) \
+    ok(expect_ ##func, "unexpected call\n"); \
+    called_ ## func = TRUE
+
 #define CHECK_CALLED(func) \
     ok(called_ ## func, "expected " #func "\n"); \
     expect_ ## func = called_ ## func = FALSE
@@ -72,6 +78,12 @@ DEFINE_EXPECT(QueryStatus_OPEN);
 DEFINE_EXPECT(QueryStatus_NEW);
 DEFINE_EXPECT(Exec_SETPROGRESSMAX);
 DEFINE_EXPECT(Exec_SETPROGRESSPOS);
+DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
+DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL);
+DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
+DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
+DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT);
+DEFINE_EXPECT(Invoke_AMBIENT_PALETTE);
 
 static BOOL expect_LockContainer_fLock;
 static BOOL expect_SetActiveObject_active;
@@ -879,6 +891,93 @@ static IOleCommandTargetVtbl OleCommandT
 
 static IOleCommandTarget OleCommandTarget = { &OleCommandTargetVtbl };
 
+static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
+{
+    return QueryInterface(riid, ppv);
+}
+
+static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
+{
+    return 2;
+}
+
+static ULONG WINAPI Dispatch_Release(IDispatch *iface)
+{
+    return 1;
+}
+
+static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
+        ITypeInfo **ppTInfo)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
+        UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
+        LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
+    ok(pDispParams != NULL, "pDispParams == NULL\n");
+    ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
+    ok(puArgErr != NULL, "puArgErr == NULL\n");
+    ok(V_VT(pVarResult) == 0, "V_VT(pVarResult)=%d, expected 0\n", V_VT(pVarResult));
+    ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
+
+    switch(dispIdMember) {
+    case DISPID_AMBIENT_USERMODE:
+        CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
+        V_VT(pVarResult) = VT_BOOL;
+        V_BOOL(pVarResult) = VARIANT_TRUE;
+        return S_OK;
+    case DISPID_AMBIENT_DLCONTROL:
+        CHECK_EXPECT2(Invoke_AMBIENT_DLCONTROL);
+        return E_FAIL;
+    case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
+        CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
+        return E_FAIL;
+    case DISPID_AMBIENT_SILENT:
+        CHECK_EXPECT(Invoke_AMBIENT_SILENT);
+        V_VT(pVarResult) = VT_BOOL;
+        V_BOOL(pVarResult) = VARIANT_FALSE;
+        return S_OK;
+    case DISPID_AMBIENT_USERAGENT:
+        CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
+        return E_FAIL;
+    case DISPID_AMBIENT_PALETTE:
+        CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
+        return E_FAIL;
+    };
+
+    ok(0, "unexpected dispid %ld\n", dispIdMember);
+    return E_FAIL;
+}
+
+static IDispatchVtbl DispatchVtbl = {
+    Dispatch_QueryInterface,
+    Dispatch_AddRef,
+    Dispatch_Release,
+    Dispatch_GetTypeInfoCount,
+    Dispatch_GetTypeInfo,
+    Dispatch_GetIDsOfNames,
+    Dispatch_Invoke
+};
+
+static IDispatch Dispatch = { &DispatchVtbl };
+
 static HRESULT QueryInterface(REFIID riid, void **ppv)
 {
     *ppv = NULL;
@@ -897,9 +996,10 @@ static HRESULT QueryInterface(REFIID rii
         *ppv = &InPlaceFrame;
     else if(IsEqualGUID(&IID_IOleCommandTarget , riid))
         *ppv = &OleCommandTarget;
+    else if(IsEqualGUID(&IID_IDispatch, riid))
+        *ppv = &Dispatch;
 
     /* TODO:
-     * IDispatch
      * IServiceProvider
      * {D48A6EC6-6A4A-11CF-94A7-444553540000}
      * {7BB0B520-B1A7-11D2-BB23-00C04F79ABCD}
@@ -1151,6 +1251,12 @@ static void test_ClientSite(IOleObject *
     SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
     SET_EXPECT(Exec_SETPROGRESSMAX);
     SET_EXPECT(Exec_SETPROGRESSPOS);
+    SET_EXPECT(Invoke_AMBIENT_USERMODE);
+    SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
+    SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
+    SET_EXPECT(Invoke_AMBIENT_SILENT);
+    SET_EXPECT(Invoke_AMBIENT_USERAGENT);
+    SET_EXPECT(Invoke_AMBIENT_PALETTE);
     hres = IOleObject_SetClientSite(oleobj, &ClientSite);
     ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
     CHECK_CALLED(GetHostInfo);
@@ -1162,12 +1268,83 @@ static void test_ClientSite(IOleObject *
     CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
     CHECK_CALLED(Exec_SETPROGRESSMAX);
     CHECK_CALLED(Exec_SETPROGRESSPOS);
+    CHECK_CALLED(Invoke_AMBIENT_USERMODE);
+    CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
+    CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); 
+    CHECK_CALLED(Invoke_AMBIENT_SILENT);
+    CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
+    CHECK_CALLED(Invoke_AMBIENT_PALETTE);
 
     hres = IOleObject_GetClientSite(oleobj, &clientsite);
     ok(hres == S_OK, "GetClientSite failed: %08lx\n", hres);
     ok(clientsite == &ClientSite, "GetClientSite() = %p, expected %p\n", clientsite, &ClientSite);
 }
 
+static void test_OnAmbientPropertyChange(IUnknown *unk)
+{
+    IOleControl *control = NULL;
+    HRESULT hres;
+
+    hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
+    ok(hres == S_OK, "QueryInterface(IID_IOleControl failed: %08lx\n", hres);
+    if(FAILED(hres))
+        return;
+
+    SET_EXPECT(Invoke_AMBIENT_USERMODE);
+    hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_USERMODE);
+    ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
+    CHECK_CALLED(Invoke_AMBIENT_USERMODE);
+
+    SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
+    hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_DLCONTROL);
+    ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
+    CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
+
+    SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
+    SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
+    hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
+    ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
+    CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
+    CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
+
+    SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
+    SET_EXPECT(Invoke_AMBIENT_SILENT);
+    hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
+    ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
+    CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
+    CHECK_CALLED(Invoke_AMBIENT_SILENT);
+
+    SET_EXPECT(Invoke_AMBIENT_USERAGENT);
+    hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_USERAGENT);
+    ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
+    CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
+
+    SET_EXPECT(Invoke_AMBIENT_PALETTE);
+    hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_PALETTE);
+    ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
+    CHECK_CALLED(Invoke_AMBIENT_PALETTE);
+
+    IOleControl_Release(control);
+}
+
+
+
+static void test_OnAmbientPropertyChange2(IUnknown *unk)
+{
+    IOleControl *control = NULL;
+    HRESULT hres;
+
+    hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
+    ok(hres == S_OK, "QueryInterface(IID_IOleControl failed: %08lx\n", hres);
+    if(FAILED(hres))
+        return;
+
+    hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_PALETTE);
+    ok(hres == S_OK, "OnAmbientPropertyChange failed: %08lx\n", hres);
+
+    IOleControl_Release(control);
+}
+
 static void test_Close(IUnknown *unk, BOOL set_client)
 {
     IOleObject *oleobj = NULL;
@@ -1336,6 +1513,7 @@ static void test_HTMLDocument(void)
 
     test_Persist(unk);
 
+    test_OnAmbientPropertyChange2(unk);
     hres = test_Activate(unk, CLIENTSITE_EXPECTPATH);
     if(FAILED(hres)) {
         IUnknown_Release(unk);
@@ -1344,6 +1522,7 @@ static void test_HTMLDocument(void)
 
     test_OleCommandTarget_fail(unk);
     test_OleCommandTarget(unk);
+    test_OnAmbientPropertyChange(unk);
     test_Window(unk, TRUE);
     test_UIDeactivate();
     test_OleCommandTarget(unk);
@@ -1376,6 +1555,7 @@ static void test_HTMLDocument(void)
     test_CloseView();
     test_CloseView();
     test_Close(unk, TRUE);
+    test_OnAmbientPropertyChange2(unk);
 
     if(view)
         IOleDocumentView_Release(view);



More information about the wine-patches mailing list