From a2ac4d2323fca27d9dd555f8ee46469f7dcf93cb Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 5 Jan 2009 18:17:36 +0100 Subject: [PATCH] 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 526fdea952b..a3a9595cdad 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 0881023c87e..5f0d7fbe51e 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 58f662a75c8..a7e364e27a2 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 ee2a5cafdc3..be54998a6da 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");