Jacek Caban : mshtml: Added elements IDispatchEx implementation.

Alexandre Julliard julliard at winehq.org
Thu Apr 24 06:23:11 CDT 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Apr 23 16:45:52 2008 +0200

mshtml: Added elements IDispatchEx implementation.

---

 dlls/mshtml/dispex.c         |    4 ++++
 dlls/mshtml/htmlelem.c       |   14 ++++++++++++++
 dlls/mshtml/htmlnode.c       |    8 ++++++++
 dlls/mshtml/mshtml_private.h |    5 +++++
 4 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 26be1e8..e42649c 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -52,11 +52,15 @@ static struct list dispex_data_list = LIST_INIT(dispex_data_list);
 static REFIID tid_ids[] = {
     &IID_NULL,
     &DIID_DispHTMLDocument,
+    &DIID_DispHTMLUnknownElement,
     &DIID_DispHTMLWindow2,
     &IID_IHTMLDocument2,
     &IID_IHTMLDocument3,
     &IID_IHTMLDocument4,
     &IID_IHTMLDocument5,
+    &IID_IHTMLDOMNode,
+    &IID_IHTMLElement,
+    &IID_IHTMLElement2,
     &IID_IHTMLWindow2,
     &IID_IHTMLWindow3,
     &IID_IOmNavigator
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 8777870..748faf6 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1282,6 +1282,17 @@ static const NodeImplVtbl HTMLElementImplVtbl = {
     HTMLElement_destructor
 };
 
+static dispex_static_data_t HTMLElement_dispex = {
+    DispHTMLUnknownElement_tid,
+    NULL,
+    {
+        IHTMLDOMNode_tid,
+        IHTMLElement_tid,
+        IHTMLElement2_tid,
+        0
+    }
+};
+
 void HTMLElement_Init(HTMLElement *This)
 {
     This->node.vtbl = &HTMLElementImplVtbl;
@@ -1344,6 +1355,9 @@ HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode)
 
     ret->nselem = nselem;
 
+    if(!ret->node.dispex.data)
+        init_dispex(&ret->node.dispex, (IUnknown*)HTMLELEM(ret), &HTMLElement_dispex);
+
     return ret;
 }
 
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index f009411..d3a9b72 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -313,6 +313,14 @@ HRESULT HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid, void **ppv)
     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
         *ppv = HTMLDOMNODE(This);
+    }else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
+        if(This->dispex.data) {
+            TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
+            *ppv = DISPATCHEX(&This->dispex);
+        }else {
+            FIXME("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
+            return E_NOINTERFACE;
+        }
     }else if(IsEqualGUID(&IID_IHTMLDOMNode, riid)) {
         TRACE("(%p)->(IID_IHTMLDOMNode %p)\n", This, ppv);
         *ppv = HTMLDOMNODE(This);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 73169f7..5fb37da 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -62,11 +62,15 @@ typedef struct event_target_t event_target_t;
 typedef enum {
     NULL_tid,
     DispHTMLDocument_tid,
+    DispHTMLUnknownElement_tid,
     DispHTMLWindow2_tid,
     IHTMLDocument2_tid,
     IHTMLDocument3_tid,
     IHTMLDocument4_tid,
     IHTMLDocument5_tid,
+    IHTMLDOMNode_tid,
+    IHTMLElement_tid,
+    IHTMLElement2_tid,
     IHTMLWindow2_tid,
     IHTMLWindow3_tid,
     IOmNavigator_tid,
@@ -293,6 +297,7 @@ typedef struct {
 } NodeImplVtbl;
 
 struct HTMLDOMNode {
+    DispatchEx dispex;
     const IHTMLDOMNodeVtbl *lpHTMLDOMNodeVtbl;
     const NodeImplVtbl *vtbl;
 




More information about the wine-cvs mailing list