Andrew Eikum : mshtml: Add DispatchEx support to HTMLImageElementFactory.

Alexandre Julliard julliard at winehq.org
Wed Oct 21 13:14:03 CDT 2009


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

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Tue Oct 20 16:05:03 2009 -0500

mshtml: Add DispatchEx support to HTMLImageElementFactory.

---

 dlls/mshtml/dispex.c         |    1 +
 dlls/mshtml/htmlimg.c        |   20 ++++++++++++++++----
 dlls/mshtml/mshtml_private.h |    2 ++
 dlls/mshtml/tests/dom.c      |   11 +++++++++++
 4 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index f277e23..34865c2 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -128,6 +128,7 @@ static REFIID tid_ids[] = {
     &IID_IHTMLFrameBase,
     &IID_IHTMLFrameBase2,
     &IID_IHTMLGenericElement,
+    &IID_IHTMLImageElementFactory,
     &IID_IHTMLImgElement,
     &IID_IHTMLInputElement,
     &IID_IHTMLLocation,
diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c
index c7b03ea..cc999c0 100644
--- a/dlls/mshtml/htmlimg.c
+++ b/dlls/mshtml/htmlimg.c
@@ -624,13 +624,11 @@ static HRESULT WINAPI HTMLImageElementFactory_QueryInterface(IHTMLImageElementFa
     if(IsEqualGUID(&IID_IUnknown, riid)) {
         TRACE("(%p)->(IID_Unknown %p)\n", This, ppv);
         *ppv = HTMLIMGFACTORY(This);
-    }else if(IsEqualGUID(&IID_IDispatch, riid)) {
-        TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
-        *ppv = HTMLIMGFACTORY(This);
     }else if(IsEqualGUID(&IID_IHTMLImageElementFactory, riid)) {
         TRACE("(%p)->(IID_IHTMLImageElementFactory %p)\n", This, ppv);
         *ppv = HTMLIMGFACTORY(This);
-    }
+    }else if(dispex_query_interface(&This->dispex, riid, ppv))
+        return *ppv ? S_OK : E_NOINTERFACE;
 
     if(*ppv) {
         IUnknown_AddRef((IUnknown*)*ppv);
@@ -758,6 +756,18 @@ static const IHTMLImageElementFactoryVtbl HTMLImageElementFactoryVtbl = {
     HTMLImageElementFactory_create
 };
 
+static const tid_t HTMLImageElementFactory_iface_tids[] = {
+    IHTMLImageElementFactory_tid,
+    0
+};
+
+static dispex_static_data_t HTMLImageElementFactory_dispex = {
+    NULL,
+    IHTMLImageElementFactory_tid,
+    NULL,
+    HTMLImageElementFactory_iface_tids
+};
+
 HTMLImageElementFactory *HTMLImageElementFactory_Create(HTMLWindow *window)
 {
     HTMLImageElementFactory *ret;
@@ -768,5 +778,7 @@ HTMLImageElementFactory *HTMLImageElementFactory_Create(HTMLWindow *window)
     ret->ref = 1;
     ret->window = window;
 
+    init_dispex(&ret->dispex, (IUnknown*)HTMLIMGFACTORY(ret), &HTMLImageElementFactory_dispex);
+
     return ret;
 }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 5111eb7..299f968 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -104,6 +104,7 @@ typedef enum {
     IHTMLFrameBase_tid,
     IHTMLFrameBase2_tid,
     IHTMLGenericElement_tid,
+    IHTMLImageElementFactory_tid,
     IHTMLImgElement_tid,
     IHTMLInputElement_tid,
     IHTMLLocation_tid,
@@ -182,6 +183,7 @@ typedef struct {
 } HTMLOptionElementFactory;
 
 typedef struct {
+    DispatchEx dispex;
     const IHTMLImageElementFactoryVtbl *lpHTMLImageElementFactoryVtbl;
 
     LONG ref;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 3bce128..ba85130 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -342,6 +342,14 @@ static const IID * const cstyle_iids[] = {
     NULL
 };
 
+static const IID * const img_factory_iids[] = {
+    &IID_IUnknown,
+    &IID_IDispatch,
+    &IID_IDispatchEx,
+    &IID_IHTMLImageElementFactory,
+    NULL
+};
+
 typedef struct {
     const char *tag;
     REFIID *iids;
@@ -1118,6 +1126,9 @@ static IHTMLImgElement *_create_img_elem(unsigned line, IHTMLDocument2 *doc,
     IHTMLWindow2_Release(window);
     ok_(__FILE__,line) (hres == S_OK, "get_Image failed: %08x\n", hres);
 
+    test_ifaces((IUnknown*)factory, img_factory_iids);
+    test_disp((IUnknown*)factory, &IID_IHTMLImageElementFactory, "[object]");
+
     if(wdth >= 0){
         snprintf(buf, 16, "%d", wdth);
         V_VT(&width) = VT_BSTR;




More information about the wine-cvs mailing list