Module: wine Branch: master Commit: fffb717b1be3049425ce34adb6ee746ff384bfa8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fffb717b1be3049425ce34adb6...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Sep 13 12:27:56 2012 +0200
mshtml: Added IHTMLDocument4::createEventObject implementation.
---
dlls/mshtml/htmldoc3.c | 11 +++++++++-- dlls/mshtml/htmlevent.c | 29 ++++++++++++++++++++++++++--- dlls/mshtml/htmlevent.h | 1 + 3 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/dlls/mshtml/htmldoc3.c b/dlls/mshtml/htmldoc3.c index 5241325..6256450 100644 --- a/dlls/mshtml/htmldoc3.c +++ b/dlls/mshtml/htmldoc3.c @@ -762,8 +762,15 @@ static HRESULT WINAPI HTMLDocument4_createEventObject(IHTMLDocument4 *iface, VARIANT *pvarEventObject, IHTMLEventObj **ppEventObj) { HTMLDocument *This = impl_from_IHTMLDocument4(iface); - FIXME("(%p)->(%p %p)\n", This, pvarEventObject, ppEventObj); - return E_NOTIMPL; + + TRACE("(%p)->(%s %p)\n", This, debugstr_variant(pvarEventObject), ppEventObj); + + if(pvarEventObject && V_VT(pvarEventObject) != VT_ERROR && V_VT(pvarEventObject) != VT_EMPTY) { + FIXME("unsupported pvarEventObject %s\n", debugstr_variant(pvarEventObject)); + return E_NOTIMPL; + } + + return create_event_obj(ppEventObj); }
static HRESULT WINAPI HTMLDocument4_fireEvent(IHTMLDocument4 *iface, BSTR bstrEventName, diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 333a26e..eecff1c 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -364,6 +364,11 @@ static HRESULT WINAPI HTMLEventObj_get_srcElement(IHTMLEventObj *iface, IHTMLEle
TRACE("(%p)->(%p)\n", This, p);
+ if(!This->target) { + *p = NULL; + return S_OK; + } + return IHTMLDOMNode_QueryInterface(&This->target->IHTMLDOMNode_iface, &IID_IHTMLElement, (void**)p); } @@ -581,6 +586,11 @@ static HRESULT WINAPI HTMLEventObj_get_type(IHTMLEventObj *iface, BSTR *p)
TRACE("(%p)->(%p)\n", This, p);
+ if(!This->type) { + *p = NULL; + return S_OK; + } + *p = SysAllocString(This->type->name); return *p ? S_OK : E_OUTOFMEMORY; } @@ -800,12 +810,12 @@ static HTMLEventObj *create_event(HTMLDOMNode *target, eventid_t eid, nsIDOMEven
ret->IHTMLEventObj_iface.lpVtbl = &HTMLEventObjVtbl; ret->ref = 1; - ret->type = event_info+eid; + ret->type = eid != EVENTID_LAST ? event_info+eid : NULL;
ret->nsevent = nsevent; if(nsevent) { nsIDOMEvent_AddRef(nsevent); - }else if(event_types[event_info[eid].type]) { + }else if(eid != EVENTID_LAST && event_types[event_info[eid].type]) { nsAString type_str; nsresult nsres;
@@ -820,13 +830,26 @@ static HTMLEventObj *create_event(HTMLDOMNode *target, eventid_t eid, nsIDOMEven }
ret->target = target; - IHTMLDOMNode_AddRef(&target->IHTMLDOMNode_iface); + if(target) + IHTMLDOMNode_AddRef(&target->IHTMLDOMNode_iface);
init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLEventObj_iface, &HTMLEventObj_dispex);
return ret; }
+HRESULT create_event_obj(IHTMLEventObj **ret) +{ + HTMLEventObj *event; + + event = create_event(NULL, EVENTID_LAST, NULL); + if(!event) + return E_OUTOFMEMORY; + + *ret = &event->IHTMLEventObj_iface; + return S_OK; +} + static HRESULT call_disp_func(IDispatch *disp, DISPPARAMS *dp, VARIANT *retv) { IDispatchEx *dispex; diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index f781e5c..2917dee 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -60,6 +60,7 @@ HRESULT call_fire_event(HTMLDOMNode*,eventid_t) DECLSPEC_HIDDEN; void update_cp_events(HTMLInnerWindow*,event_target_t**,cp_static_data_t*,nsIDOMNode*) DECLSPEC_HIDDEN; HRESULT doc_init_events(HTMLDocumentNode*) DECLSPEC_HIDDEN; void detach_events(HTMLDocumentNode *doc) DECLSPEC_HIDDEN; +HRESULT create_event_obj(IHTMLEventObj**) DECLSPEC_HIDDEN;
void init_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN; void release_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN;