Module: wine Branch: master Commit: b84bc52b71f82e1407a833ad06bba47a4d2a0bd2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b84bc52b71f82e1407a833ad06...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Nov 11 10:55:53 2014 +0100
mshtml: Added support for IDispatchEx to HTMLSelectionObject object.
---
dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/selection.c | 56 +++++++++++++++++++++++++++----------------- dlls/mshtml/tests/dom.c | 2 ++ 3 files changed, 38 insertions(+), 21 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 6346dac..011fa9a 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -174,6 +174,7 @@ typedef struct event_target_t event_target_t; XIID(IHTMLScreen) \ XIID(IHTMLScriptElement) \ XIID(IHTMLSelectElement) \ + XIID(IHTMLSelectionObject) \ XIID(IHTMLStorage) \ XIID(IHTMLStyle) \ XIID(IHTMLStyle2) \ diff --git a/dlls/mshtml/selection.c b/dlls/mshtml/selection.c index db3b7b3..f34154b 100644 --- a/dlls/mshtml/selection.c +++ b/dlls/mshtml/selection.c @@ -32,6 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
typedef struct { + DispatchEx dispex; IHTMLSelectionObject IHTMLSelectionObject_iface;
LONG ref; @@ -52,26 +53,24 @@ static HRESULT WINAPI HTMLSelectionObject_QueryInterface(IHTMLSelectionObject *i { HTMLSelectionObject *This = impl_from_IHTMLSelectionObject(iface);
- *ppv = NULL; + TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = &This->IHTMLSelectionObject_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = &This->IHTMLSelectionObject_iface; }else if(IsEqualGUID(&IID_IHTMLSelectionObject, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = &This->IHTMLSelectionObject_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); + return E_NOINTERFACE; }
- if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } - - WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); - return E_NOINTERFACE; + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; }
static ULONG WINAPI HTMLSelectionObject_AddRef(IHTMLSelectionObject *iface) @@ -96,6 +95,7 @@ static ULONG WINAPI HTMLSelectionObject_Release(IHTMLSelectionObject *iface) nsISelection_Release(This->nsselection); if(This->doc) list_remove(&This->entry); + release_dispex(&This->dispex); heap_free(This); }
@@ -105,16 +105,16 @@ static ULONG WINAPI HTMLSelectionObject_Release(IHTMLSelectionObject *iface) static HRESULT WINAPI HTMLSelectionObject_GetTypeInfoCount(IHTMLSelectionObject *iface, UINT *pctinfo) { HTMLSelectionObject *This = impl_from_IHTMLSelectionObject(iface); - FIXME("(%p)->(%p)\n", This, pctinfo); - return E_NOTIMPL; + + return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo); }
static HRESULT WINAPI HTMLSelectionObject_GetTypeInfo(IHTMLSelectionObject *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { HTMLSelectionObject *This = impl_from_IHTMLSelectionObject(iface); - FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); - return E_NOTIMPL; + + return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo); }
static HRESULT WINAPI HTMLSelectionObject_GetIDsOfNames(IHTMLSelectionObject *iface, REFIID riid, @@ -122,9 +122,9 @@ static HRESULT WINAPI HTMLSelectionObject_GetIDsOfNames(IHTMLSelectionObject *if LCID lcid, DISPID *rgDispId) { HTMLSelectionObject *This = impl_from_IHTMLSelectionObject(iface); - FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, - lcid, rgDispId); - return E_NOTIMPL; + + return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, + cNames, lcid, rgDispId); }
static HRESULT WINAPI HTMLSelectionObject_Invoke(IHTMLSelectionObject *iface, DISPID dispIdMember, @@ -132,9 +132,10 @@ static HRESULT WINAPI HTMLSelectionObject_Invoke(IHTMLSelectionObject *iface, DI VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { HTMLSelectionObject *This = impl_from_IHTMLSelectionObject(iface); - FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), - lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); - return E_NOTIMPL; + + + return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); }
static HRESULT WINAPI HTMLSelectionObject_createRange(IHTMLSelectionObject *iface, IDispatch **range) @@ -233,6 +234,17 @@ static const IHTMLSelectionObjectVtbl HTMLSelectionObjectVtbl = { HTMLSelectionObject_get_type };
+static const tid_t HTMLSelectionObject_iface_tids[] = { + IHTMLSelectionObject_tid, + 0 +}; +static dispex_static_data_t HTMLSelectionObject_dispex = { + NULL, + IHTMLSelectionObject_tid, + NULL, + HTMLSelectionObject_iface_tids +}; + HRESULT HTMLSelectionObject_Create(HTMLDocumentNode *doc, nsISelection *nsselection, IHTMLSelectionObject **ret) { HTMLSelectionObject *selection; @@ -241,6 +253,8 @@ HRESULT HTMLSelectionObject_Create(HTMLDocumentNode *doc, nsISelection *nsselect if(!selection) return E_OUTOFMEMORY;
+ init_dispex(&selection->dispex, (IUnknown*)&selection->IHTMLSelectionObject_iface, &HTMLSelectionObject_dispex); + selection->IHTMLSelectionObject_iface.lpVtbl = &HTMLSelectionObjectVtbl; selection->ref = 1; selection->nsselection = nsselection; /* We shouldn't call AddRef here */ diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index c4766dc..5dc0c4c 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -4975,6 +4975,8 @@ static void test_txtrange(IHTMLDocument2 *doc) hres = IHTMLDocument2_get_selection(doc, &selection); ok(hres == S_OK, "IHTMLDocument2_get_selection failed: %08x\n", hres);
+ test_disp((IUnknown*)selection, &IID_IHTMLSelectionObject, "[object]"); + hres = IHTMLSelectionObject_createRange(selection, &disp_range); ok(hres == S_OK, "IHTMLSelectionObject_createRange failed: %08x\n", hres); IHTMLSelectionObject_Release(selection);