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

Alexandre Julliard julliard at winehq.org
Tue Jan 6 08:22:52 CST 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jan  5 18:17:36 2009 +0100

mshtml: Added IDispatchEx support to HTMLLocation object.

---

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

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 526fdea..a3a9595 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -106,6 +106,7 @@ static REFIID tid_ids[] = {
     &IID_IHTMLGenericElement,
     &IID_IHTMLImgElement,
     &IID_IHTMLInputElement,
+    &IID_IHTMLLocation,
     &IID_IHTMLOptionElement,
     &IID_IHTMLSelectElement,
     &IID_IHTMLStyle,
diff --git a/dlls/mshtml/htmllocation.c b/dlls/mshtml/htmllocation.c
index 0881023..5f0d7fb 100644
--- a/dlls/mshtml/htmllocation.c
+++ b/dlls/mshtml/htmllocation.c
@@ -43,12 +43,11 @@ static HRESULT WINAPI HTMLLocation_QueryInterface(IHTMLLocation *iface, REFIID r
     if(IsEqualGUID(&IID_IUnknown, riid)) {
         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
         *ppv = HTMLLOCATION(This);
-    }else if(IsEqualGUID(&IID_IDispatch, riid)) {
-        TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
-        *ppv = HTMLLOCATION(This);
     }else if(IsEqualGUID(&IID_IHTMLLocation, riid)) {
         TRACE("(%p)->(IID_IHTMLLocation %p)\n", This, ppv);
         *ppv = HTMLLOCATION(This);
+    }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
+        return *ppv ? S_OK : E_NOINTERFACE;
     }
 
     if(*ppv) {
@@ -293,6 +292,18 @@ static const IHTMLLocationVtbl HTMLLocationVtbl = {
     HTMLLocation_toString
 };
 
+static const tid_t HTMLLocation_iface_tids[] = {
+    IHTMLLocation_tid,
+    0
+};
+static dispex_static_data_t HTMLLocation_dispex = {
+    NULL,
+    IHTMLLocation_tid,
+    NULL,
+    HTMLLocation_iface_tids
+};
+
+
 HTMLLocation *HTMLLocation_Create(HTMLDocument *doc)
 {
     HTMLLocation *ret = heap_alloc(sizeof(*ret));
@@ -301,5 +312,7 @@ HTMLLocation *HTMLLocation_Create(HTMLDocument *doc)
     ret->ref = 1;
     ret->doc = doc;
 
+    init_dispex(&ret->dispex, (IUnknown*)HTMLLOCATION(ret),  &HTMLLocation_dispex);
+
     return ret;
 }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 58f662a..a7e364e 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -102,6 +102,7 @@ typedef enum {
     IHTMLGenericElement_tid,
     IHTMLImgElement_tid,
     IHTMLInputElement_tid,
+    IHTMLLocation_tid,
     IHTMLOptionElement_tid,
     IHTMLSelectElement_tid,
     IHTMLStyle_tid,
@@ -199,6 +200,7 @@ struct ConnectionPoint {
 };
 
 typedef struct {
+    DispatchEx dispex;
     const IHTMLLocationVtbl *lpHTMLLocationVtbl;
 
     LONG ref;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index ee2a5ca..be54998 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -2207,6 +2207,7 @@ static void test_location(IHTMLDocument2 *doc)
     IHTMLLocation_Release(location2);
 
     test_ifaces((IUnknown*)location, location_iids);
+    test_disp((IUnknown*)location, &IID_IHTMLLocation);
 
     ref = IHTMLLocation_Release(location);
     ok(!ref, "location chould be destroyed here\n");




More information about the wine-cvs mailing list