From 7eca0bcae4eece128007985dc84e05ce82fc0f18 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 16 Sep 2009 22:14:38 +0200 Subject: [PATCH] mshtml: Use node's IDispatchEx implementation in HTMLDocumentNode. --- dlls/mshtml/htmldoc.c | 89 +++++++++++++++++++++--------------- dlls/mshtml/mshtml_private.h | 3 +- dlls/mshtml/tests/dom.c | 3 ++ 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 500723abdfc..e3fde658b98 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -1,5 +1,5 @@ /* - * Copyright 2005 Jacek Caban + * Copyright 2005-2009 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -1475,7 +1475,7 @@ static HRESULT WINAPI DocDispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *p { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo); + return IDispatchEx_GetTypeInfoCount(This->dispex, pctinfo); } static HRESULT WINAPI DocDispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, @@ -1483,7 +1483,7 @@ static HRESULT WINAPI DocDispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo); + return IDispatchEx_GetTypeInfo(This->dispex, iTInfo, lcid, ppTInfo); } static HRESULT WINAPI DocDispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, @@ -1492,7 +1492,7 @@ static HRESULT WINAPI DocDispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID rii { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId); + return IDispatchEx_GetIDsOfNames(This->dispex, riid, rgszNames, cNames, lcid, rgDispId); } static HRESULT WINAPI DocDispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, @@ -1516,7 +1516,7 @@ static HRESULT WINAPI DocDispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMemb return S_OK; } - return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid, wFlags, pDispParams, + return IDispatchEx_Invoke(This->dispex, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); } @@ -1524,7 +1524,7 @@ static HRESULT WINAPI DocDispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_GetDispID(DISPATCHEX(&This->dispex), bstrName, grfdex, pid); + return IDispatchEx_GetDispID(This->dispex, bstrName, grfdex, pid); } static HRESULT WINAPI DocDispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, @@ -1532,49 +1532,49 @@ static HRESULT WINAPI DocDispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_InvokeEx(DISPATCHEX(&This->dispex), id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + return IDispatchEx_InvokeEx(This->dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); } static HRESULT WINAPI DocDispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_DeleteMemberByName(DISPATCHEX(&This->dispex), bstrName, grfdex); + return IDispatchEx_DeleteMemberByName(This->dispex, bstrName, grfdex); } static HRESULT WINAPI DocDispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_DeleteMemberByDispID(DISPATCHEX(&This->dispex), id); + return IDispatchEx_DeleteMemberByDispID(This->dispex, id); } static HRESULT WINAPI DocDispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_GetMemberProperties(DISPATCHEX(&This->dispex), id, grfdexFetch, pgrfdex); + return IDispatchEx_GetMemberProperties(This->dispex, id, grfdexFetch, pgrfdex); } static HRESULT WINAPI DocDispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName) { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_GetMemberName(DISPATCHEX(&This->dispex), id, pbstrName); + return IDispatchEx_GetMemberName(This->dispex, id, pbstrName); } static HRESULT WINAPI DocDispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid) { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_GetNextDispID(DISPATCHEX(&This->dispex), grfdex, id, pid); + return IDispatchEx_GetNextDispID(This->dispex, grfdex, id, pid); } static HRESULT WINAPI DocDispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) { HTMLDocument *This = DISPEX_THIS(iface); - return IDispatchEx_GetNameSpaceParent(DISPATCHEX(&This->dispex), ppunk); + return IDispatchEx_GetNameSpaceParent(This->dispex, ppunk); } #undef DISPEX_THIS @@ -1703,8 +1703,6 @@ static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv) }else if(IsEqualGUID(&IID_IMarshal, riid)) { TRACE("(%p)->(IID_IMarshal %p) returning NULL\n", This, ppv); *ppv = NULL; - }else if(dispex_query_interface(&This->dispex, riid, ppv)) { - return TRUE; }else { return FALSE; } @@ -1714,27 +1712,14 @@ static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv) return TRUE; } -static const tid_t HTMLDocument_iface_tids[] = { - IHTMLDocument2_tid, - IHTMLDocument3_tid, - IHTMLDocument4_tid, - IHTMLDocument5_tid, - 0 -}; -static dispex_static_data_t HTMLDocument_dispex = { - NULL, - DispHTMLDocument_tid, - NULL, - HTMLDocument_iface_tids -}; - -static void init_doc(HTMLDocument *doc, IUnknown *unk_impl) +static void init_doc(HTMLDocument *doc, IUnknown *unk_impl, IDispatchEx *dispex) { doc->lpHTMLDocument2Vtbl = &HTMLDocumentVtbl; doc->lpIDispatchExVtbl = &DocDispatchExVtbl; doc->lpSupportErrorInfoVtbl = &SupportErrorInfoVtbl; doc->unk_impl = unk_impl; + doc->dispex = dispex; HTMLDocument_HTMLDocument3_Init(doc); HTMLDocument_HTMLDocument5_Init(doc); @@ -1750,8 +1735,6 @@ static void init_doc(HTMLDocument *doc, IUnknown *unk_impl) ConnectionPoint_Init(&doc->cp_propnotif, &doc->cp_container, &IID_IPropertyNotifySink); ConnectionPoint_Init(&doc->cp_htmldocevents, &doc->cp_container, &DIID_HTMLDocumentEvents); ConnectionPoint_Init(&doc->cp_htmldocevents2, &doc->cp_container, &DIID_HTMLDocumentEvents2); - - init_dispex(&doc->dispex, (IUnknown*)HTMLDOC(doc), &HTMLDocument_dispex); } static void destroy_htmldoc(HTMLDocument *This) @@ -1761,8 +1744,6 @@ static void destroy_htmldoc(HTMLDocument *This) if(This->event_target) release_event_target(This->event_target); - release_dispex(&This->dispex); - ConnectionPointContainer_Destroy(&This->cp_container); if(This->nsdoc) @@ -1798,6 +1779,23 @@ static const NodeImplVtbl HTMLDocumentNodeImplVtbl = { HTMLDocumentNode_destructor }; +static const tid_t HTMLDocumentNode_iface_tids[] = { + IHTMLDOMNode_tid, + IHTMLDOMNode2_tid, + IHTMLDocument2_tid, + IHTMLDocument3_tid, + IHTMLDocument4_tid, + IHTMLDocument5_tid, + 0 +}; + +static dispex_static_data_t HTMLDocumentNode_dispex = { + NULL, + DispHTMLDocument_tid, + NULL, + HTMLDocumentNode_iface_tids +}; + HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_obj, HTMLWindow *window, HTMLDocumentNode **ret) { HTMLDocumentNode *doc; @@ -1809,7 +1807,8 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob doc->basedoc.doc_node = doc; doc->basedoc.doc_obj = doc_obj; - init_doc(&doc->basedoc, (IUnknown*)HTMLDOMNODE(&doc->node)); + init_dispex(&doc->node.dispex, (IUnknown*)HTMLDOMNODE(&doc->node), &HTMLDocumentNode_dispex); + init_doc(&doc->basedoc, (IUnknown*)HTMLDOMNODE(&doc->node), DISPATCHEX(&doc->node.dispex)); doc->ref = 1; nsIDOMHTMLDocument_AddRef(nsdoc); @@ -1843,6 +1842,8 @@ static HRESULT WINAPI CustomDoc_QueryInterface(ICustomDoc *iface, REFIID riid, v if(IsEqualGUID(&IID_ICustomDoc, riid)) { TRACE("(%p)->(IID_ICustomDoc %p)\n", This, ppv); *ppv = CUSTOMDOC(This); + }else if(dispex_query_interface(&This->dispex, riid, ppv)) { + return *ppv ? S_OK : E_NOINTERFACE; }else { FIXME("Unimplemented interface %s\n", debugstr_guid(riid)); *ppv = NULL; @@ -1898,6 +1899,7 @@ static ULONG WINAPI CustomDoc_Release(ICustomDoc *iface) heap_free(This->mime); destroy_htmldoc(&This->basedoc); + release_dispex(&This->dispex); if(This->basedoc.nsdoc) remove_mutation_observer(This->nscontainer, This->basedoc.nsdoc); @@ -1925,6 +1927,20 @@ static const ICustomDocVtbl CustomDocVtbl = { CustomDoc_SetUIHandler }; +static const tid_t HTMLDocumentObj_iface_tids[] = { + IHTMLDocument2_tid, + IHTMLDocument3_tid, + IHTMLDocument4_tid, + IHTMLDocument5_tid, + 0 +}; +static dispex_static_data_t HTMLDocumentObj_dispex = { + NULL, + DispHTMLDocument_tid, + NULL, + HTMLDocumentObj_iface_tids +}; + HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject) { HTMLDocumentObj *doc; @@ -1937,7 +1953,8 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject) if(!doc) return E_OUTOFMEMORY; - init_doc(&doc->basedoc, (IUnknown*)CUSTOMDOC(doc)); + init_dispex(&doc->dispex, (IUnknown*)CUSTOMDOC(doc), &HTMLDocumentObj_dispex); + init_doc(&doc->basedoc, (IUnknown*)CUSTOMDOC(doc), DISPATCHEX(&doc->dispex)); doc->lpCustomDocVtbl = &CustomDocVtbl; doc->ref = 1; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index b5c6cd82886..6a93d28f750 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -247,7 +247,6 @@ struct ConnectionPoint { }; struct HTMLDocument { - DispatchEx dispex; const IHTMLDocument2Vtbl *lpHTMLDocument2Vtbl; const IHTMLDocument3Vtbl *lpHTMLDocument3Vtbl; const IHTMLDocument4Vtbl *lpHTMLDocument4Vtbl; @@ -271,6 +270,7 @@ struct HTMLDocument { const ISupportErrorInfoVtbl *lpSupportErrorInfoVtbl; IUnknown *unk_impl; + IDispatchEx *dispex; HTMLDocumentObj *doc_obj; HTMLDocumentNode *doc_node; @@ -302,6 +302,7 @@ static inline ULONG htmldoc_release(HTMLDocument *This) struct HTMLDocumentObj { HTMLDocument basedoc; + DispatchEx dispex; const ICustomDocVtbl *lpCustomDocVtbl; LONG ref; diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 5bbb54a14b2..158c1081ab4 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -4109,7 +4109,10 @@ static void test_window(IHTMLDocument2 *doc) ok(doc2 != NULL, "doc2 == NULL\n"); test_ifaces((IUnknown*)doc2, doc_node_iids); + test_disp((IUnknown*)doc2, &DIID_DispHTMLDocument, "[object]"); + test_ifaces((IUnknown*)doc, doc_obj_iids); + test_disp((IUnknown*)doc2, &DIID_DispHTMLDocument, "[object]"); unk = (void*)0xdeadbeef; hres = IHTMLDocument2_QueryInterface(doc2, &IID_ICustomDoc, (void**)&unk);