From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmldoc.c | 2 ++ dlls/mshtml/htmlelem.c | 1 + dlls/mshtml/htmlevent.c | 13 ++++++++++ dlls/mshtml/htmlnode.c | 46 ++++++++++-------------------------- dlls/mshtml/htmltextnode.c | 1 + dlls/mshtml/mshtml_private.h | 2 ++ 6 files changed, 32 insertions(+), 33 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index a71bace23ab..890b621ef95 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -355,6 +355,7 @@ static IHTMLEventObj *DocumentType_set_current_event(DispatchEx *dispex, IHTMLEv
static const event_target_vtbl_t DocumentType_event_target_vtbl = { { + .query_interface = HTMLDOMNode_query_interface, .destructor = HTMLDOMNode_destructor, .traverse = HTMLDOMNode_traverse, .unlink = HTMLDOMNode_unlink @@ -6053,6 +6054,7 @@ static HRESULT HTMLDocumentNode_location_hook(DispatchEx *dispex, WORD flags, DI
static const event_target_vtbl_t HTMLDocumentNode_event_target_vtbl = { { + .query_interface = HTMLDOMNode_query_interface, .destructor = HTMLDOMNode_destructor, .traverse = HTMLDOMNode_traverse, .unlink = HTMLDOMNode_unlink, diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index af6551cc9fc..ad71d128266 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -7350,6 +7350,7 @@ static const tid_t HTMLElement_iface_tids[] = {
const event_target_vtbl_t HTMLElement_event_target_vtbl = { { + .query_interface = HTMLDOMNode_query_interface, .destructor = HTMLDOMNode_destructor, .traverse = HTMLDOMNode_traverse, .unlink = HTMLDOMNode_unlink, diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 7cbe8333542..917411ccda9 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -4558,6 +4558,19 @@ static HRESULT get_gecko_target(IEventTarget *target, nsIDOMEventTarget **ret) return S_OK; }
+void *EventTarget_QI(EventTarget *event_target, REFIID riid) +{ + if(IsEqualGUID(riid, &IID_IEventTarget)) { + if(use_event_quirks(event_target)) { + WARN("IEventTarget queried, but not supported by in document mode\n"); + return NULL; + } + return &event_target->IEventTarget_iface; + } + + return NULL; +} + HRESULT EventTarget_QI_with_dispex(EventTarget *event_target, REFIID riid, void **ppv) { if(IsEqualGUID(riid, &IID_IEventTarget)) { diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 3f127899563..11e611337d4 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -492,39 +492,19 @@ static HRESULT WINAPI HTMLDOMNode_QueryInterface(IHTMLDOMNode *iface, REFIID riid, void **ppv) { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface); - - /* FIXME: Get rid of this when dispex handles QI */ - if(IsEqualGUID(&IID_nsXPCOMCycleCollectionParticipant, riid) || IsEqualGUID(&IID_nsCycleCollectionISupports, riid)) { - dispex_query_interface(&This->event_target.dispex, riid, ppv); - return S_OK; - } - - if((*ppv = This->vtbl->qi(This, riid))) { - IHTMLDOMNode_AddRef(&This->IHTMLDOMNode_iface); - return S_OK; - } - - return E_NOINTERFACE; + return IDispatchEx_QueryInterface(&This->event_target.dispex.IDispatchEx_iface, riid, ppv); }
static ULONG WINAPI HTMLDOMNode_AddRef(IHTMLDOMNode *iface) { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface); - LONG ref = dispex_ref_incr(&This->event_target.dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; + return IDispatchEx_AddRef(&This->event_target.dispex.IDispatchEx_iface); }
static ULONG WINAPI HTMLDOMNode_Release(IHTMLDOMNode *iface) { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface); - LONG ref = dispex_ref_decr(&This->event_target.dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; + return IDispatchEx_Release(&This->event_target.dispex.IDispatchEx_iface); }
static HRESULT WINAPI HTMLDOMNode_GetTypeInfoCount(IHTMLDOMNode *iface, UINT *pctinfo) @@ -1437,6 +1417,13 @@ static inline HTMLDOMNode *HTMLDOMNode_from_DispatchEx(DispatchEx *iface) return CONTAINING_RECORD(iface, HTMLDOMNode, event_target.dispex); }
+void *HTMLDOMNode_query_interface(DispatchEx *dispex, REFIID riid) +{ + HTMLDOMNode *This = HTMLDOMNode_from_DispatchEx(dispex); + + return This->vtbl->qi(This, riid); +} + void HTMLDOMNode_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLDOMNode *This = HTMLDOMNode_from_DispatchEx(dispex); @@ -1477,9 +1464,6 @@ void HTMLDOMNode_destructor(DispatchEx *dispex)
void *HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid) { - IUnknown *unk; - HRESULT hres; - TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
if(IsEqualGUID(&IID_IUnknown, riid)) @@ -1493,12 +1477,7 @@ void *HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid) if(IsEqualGUID(&IID_IHTMLDOMNode3, riid)) return &This->IHTMLDOMNode3_iface;
- hres = EventTarget_QI_with_dispex(&This->event_target, riid, (void**)&unk); - if(hres != S_OK) - return NULL; - - IUnknown_Release(unk); - return unk; + return EventTarget_QI(&This->event_target, riid); }
static HRESULT HTMLDOMNode_clone(HTMLDOMNode *This, nsIDOMNode *nsnode, HTMLDOMNode **ret) @@ -1530,7 +1509,7 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno node->IHTMLDOMNode2_iface.lpVtbl = &HTMLDOMNode2Vtbl; node->IHTMLDOMNode3_iface.lpVtbl = &HTMLDOMNode3Vtbl;
- EventTarget_Init(&node->event_target, (IUnknown*)&node->IHTMLDOMNode_iface, dispex_data, doc->document_mode); + EventTarget_Init(&node->event_target, NULL, dispex_data, doc->document_mode);
if(&doc->node != node) IHTMLDOMNode_AddRef(&doc->node.IHTMLDOMNode_iface); @@ -1544,6 +1523,7 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno }
static const dispex_static_data_vtbl_t HTMLDOMNode_dispex_vtbl = { + .query_interface = HTMLDOMNode_query_interface, .destructor = HTMLDOMNode_destructor, .traverse = HTMLDOMNode_traverse, .unlink = HTMLDOMNode_unlink diff --git a/dlls/mshtml/htmltextnode.c b/dlls/mshtml/htmltextnode.c index 20cb55a584c..71d9ce65465 100644 --- a/dlls/mshtml/htmltextnode.c +++ b/dlls/mshtml/htmltextnode.c @@ -354,6 +354,7 @@ static const NodeImplVtbl HTMLDOMTextNodeImplVtbl = { };
static const dispex_static_data_vtbl_t HTMLDOMTextNode_dispex_vtbl = { + .query_interface = HTMLDOMNode_query_interface, .destructor = HTMLDOMNode_destructor, .traverse = HTMLDOMNode_traverse, .unlink = HTMLDOMNode_unlink diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 9cb2e47d112..9d059c16315 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1210,10 +1210,12 @@ void HTMLDOMNode_Init(HTMLDocumentNode*,HTMLDOMNode*,nsIDOMNode*,dispex_static_d void HTMLElement_Init(HTMLElement*,HTMLDocumentNode*,nsIDOMElement*,dispex_static_data_t*);
void EventTarget_Init(EventTarget*,IUnknown*,dispex_static_data_t*,compat_mode_t); +void *EventTarget_QI(EventTarget*,REFIID); HRESULT EventTarget_QI_with_dispex(EventTarget*,REFIID,void**); void EventTarget_init_dispex_info(dispex_data_t*,compat_mode_t);
void *HTMLDOMNode_QI(HTMLDOMNode*,REFIID); +void *HTMLDOMNode_query_interface(DispatchEx*,REFIID); void HTMLDOMNode_destructor(DispatchEx*); void HTMLDOMNode_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*); void HTMLDOMNode_unlink(DispatchEx*);