Jacek Caban : mshtml: Added IDispatchEx support to HTMLMimeTypesCollection object.

Alexandre Julliard julliard at winehq.org
Tue May 31 13:08:19 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue May 31 12:20:15 2011 +0200

mshtml: Added IDispatchEx support to HTMLMimeTypesCollection object.

---

 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/omnavigator.c    |   32 ++++++++++++++++++++++++--------
 dlls/mshtml/tests/dom.c      |   21 +++++++++++++++++++++
 3 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 6fc78ec..275bd81 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -138,6 +138,7 @@ typedef struct event_target_t event_target_t;
     XIID(IHTMLImgElement) \
     XIID(IHTMLInputElement) \
     XIID(IHTMLLocation) \
+    XIID(IHTMLMimeTypesCollection) \
     XIID(IHTMLObjectElement) \
     XIID(IHTMLOptionElement) \
     XIID(IHTMLPluginsCollection) \
diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c
index 611f07d..92afc98 100644
--- a/dlls/mshtml/omnavigator.c
+++ b/dlls/mshtml/omnavigator.c
@@ -199,6 +199,7 @@ static HRESULT create_plugins_collection(OmNavigator *navigator, HTMLPluginsColl
 }
 
 struct HTMLMimeTypesCollection {
+    DispatchEx dispex;
     IHTMLMimeTypesCollection IHTMLMimeTypesCollection_iface;
 
     LONG ref;
@@ -221,6 +222,8 @@ static HRESULT WINAPI HTMLMimeTypesCollection_QueryInterface(IHTMLMimeTypesColle
     }else if(IsEqualGUID(&IID_IHTMLMimeTypesCollection, riid)) {
         TRACE("(%p)->(IID_IHTMLMimeTypesCollection %p)\n", This, ppv);
         *ppv = &This->IHTMLMimeTypesCollection_iface;
+    }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
+        return *ppv ? S_OK : E_NOINTERFACE;
     }else {
         *ppv = NULL;
         WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
@@ -251,6 +254,7 @@ static ULONG WINAPI HTMLMimeTypesCollection_Release(IHTMLMimeTypesCollection *if
     if(!ref) {
         if(This->navigator)
             This->navigator->mime_types = NULL;
+        release_dispex(&This->dispex);
         heap_free(This);
     }
 
@@ -260,24 +264,22 @@ static ULONG WINAPI HTMLMimeTypesCollection_Release(IHTMLMimeTypesCollection *if
 static HRESULT WINAPI HTMLMimeTypesCollection_GetTypeInfoCount(IHTMLMimeTypesCollection *iface, UINT *pctinfo)
 {
     HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
-    FIXME("%p\n", This);
-    return E_NOTIMPL;
+    return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
 }
 
 static HRESULT WINAPI HTMLMimeTypesCollection_GetTypeInfo(IHTMLMimeTypesCollection *iface, UINT iTInfo,
                                               LCID lcid, ITypeInfo **ppTInfo)
 {
     HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
-    FIXME("%p\n", This);
-    return E_NOTIMPL;
+    return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
 }
 
 static HRESULT WINAPI HTMLMimeTypesCollection_GetIDsOfNames(IHTMLMimeTypesCollection *iface, REFIID riid,
         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
 {
     HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
-    FIXME("%p\n", This);
-    return E_NOTIMPL;
+    return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
+            lcid, rgDispId);
 }
 
 static HRESULT WINAPI HTMLMimeTypesCollection_Invoke(IHTMLMimeTypesCollection *iface, DISPID dispIdMember,
@@ -285,8 +287,8 @@ static HRESULT WINAPI HTMLMimeTypesCollection_Invoke(IHTMLMimeTypesCollection *i
         EXCEPINFO *pExcepInfo, UINT *puArgErr)
 {
     HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
-    FIXME("%p\n", This);
-    return E_NOTIMPL;
+    return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid,
+            wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
 }
 
 static HRESULT WINAPI HTMLMimeTypesCollection_get_length(IHTMLMimeTypesCollection *iface, LONG *p)
@@ -307,6 +309,17 @@ static const IHTMLMimeTypesCollectionVtbl HTMLMimeTypesCollectionVtbl = {
     HTMLMimeTypesCollection_get_length
 };
 
+static const tid_t HTMLMimeTypesCollection_iface_tids[] = {
+    IHTMLMimeTypesCollection_tid,
+    0
+};
+static dispex_static_data_t HTMLMimeTypesCollection_dispex = {
+    NULL,
+    IHTMLMimeTypesCollection_tid,
+    NULL,
+    HTMLMimeTypesCollection_iface_tids
+};
+
 static HRESULT create_mime_types_collection(OmNavigator *navigator, HTMLMimeTypesCollection **ret)
 {
     HTMLMimeTypesCollection *col;
@@ -319,6 +332,9 @@ static HRESULT create_mime_types_collection(OmNavigator *navigator, HTMLMimeType
     col->ref = 1;
     col->navigator = navigator;
 
+    init_dispex(&col->dispex, (IUnknown*)&col->IHTMLMimeTypesCollection_iface,
+                &HTMLMimeTypesCollection_dispex);
+
     *ret = col;
     return S_OK;
 }
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 03eb48a..9712605 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -3827,6 +3827,26 @@ static void test_plugins_col(IOmNavigator *nav)
     ok(!ref, "ref=%d\n", ref);
 }
 
+static void test_mime_types_col(IOmNavigator *nav)
+{
+    IHTMLMimeTypesCollection *col, *col2;
+    ULONG ref;
+    HRESULT hres;
+
+    hres = IOmNavigator_get_mimeTypes(nav, &col);
+    ok(hres == S_OK, "get_mimeTypes failed: %08x\n", hres);
+
+    hres = IOmNavigator_get_mimeTypes(nav, &col2);
+    ok(hres == S_OK, "get_mimeTypes failed: %08x\n", hres);
+    ok(iface_cmp((IUnknown*)col, (IUnknown*)col2), "col != col2\n");
+    IHTMLMimeTypesCollection_Release(col2);
+
+    test_disp((IUnknown*)col, &IID_IHTMLMimeTypesCollection, "[object]");
+
+    ref = IHTMLMimeTypesCollection_Release(col);
+    ok(!ref, "ref=%d\n", ref);
+}
+
 static void test_navigator(IHTMLDocument2 *doc)
 {
     IHTMLWindow2 *window;
@@ -3914,6 +3934,7 @@ static void test_navigator(IHTMLDocument2 *doc)
     }
 
     test_plugins_col(navigator);
+    test_mime_types_col(navigator);
 
     ref = IOmNavigator_Release(navigator);
     ok(!ref, "navigator should be destroyed here\n");




More information about the wine-cvs mailing list