I sent this now because it is mostly boilerplate, with some small non-invasive patches at the end. First patch is basically all stubs except forwards from IHTMLEventObj2 getters (so it doesn't break current behavior).
-- v3: mshtml/tests: Fix VariantClear on uninitialized variable. mshtml: Implement `url` prop for StorageEvent objs. mshtml: Send proper legacy storage event with actual url. mshtml: Don't expose "restricted" members. mshtml: Expose the other IHTMLEventObj* interfaces.
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 1107 +++++++++++++++++++++++++++++++++ dlls/mshtml/tests/events.c | 58 +- dlls/mshtml/tests/events.html | 9 + 3 files changed, 1166 insertions(+), 8 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 6ee133d848a..50f40ea62ae 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -349,6 +349,11 @@ static DOMUIEvent *DOMUIEvent_from_DOMEvent(DOMEvent *event) typedef struct { DispatchEx dispex; IHTMLEventObj IHTMLEventObj_iface; + IHTMLEventObj2 IHTMLEventObj2_iface; + IHTMLEventObj3 IHTMLEventObj3_iface; + IHTMLEventObj4 IHTMLEventObj4_iface; + IHTMLEventObj5 IHTMLEventObj5_iface; + IHTMLEventObj6 IHTMLEventObj6_iface;
DOMEvent *event; VARIANT return_value; @@ -854,6 +859,1093 @@ static inline HTMLEventObj *unsafe_impl_from_IHTMLEventObj(IHTMLEventObj *iface) return iface->lpVtbl == &HTMLEventObjVtbl ? impl_from_IHTMLEventObj(iface) : NULL; }
+static inline HTMLEventObj *impl_from_IHTMLEventObj2(IHTMLEventObj2 *iface) +{ + return CONTAINING_RECORD(iface, HTMLEventObj, IHTMLEventObj2_iface); +} + +static HRESULT WINAPI HTMLEventObj2_QueryInterface(IHTMLEventObj2 *iface, REFIID riid, void **ppv) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return IHTMLEventObj_QueryInterface(&This->IHTMLEventObj_iface, riid, ppv); +} + +static ULONG WINAPI HTMLEventObj2_AddRef(IHTMLEventObj2 *iface) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return IHTMLEventObj_AddRef(&This->IHTMLEventObj_iface); +} + +static ULONG WINAPI HTMLEventObj2_Release(IHTMLEventObj2 *iface) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return IHTMLEventObj_Release(&This->IHTMLEventObj_iface); +} + +static HRESULT WINAPI HTMLEventObj2_GetTypeInfoCount(IHTMLEventObj2 *iface, UINT *pctinfo) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo); +} + +static HRESULT WINAPI HTMLEventObj2_GetTypeInfo(IHTMLEventObj2 *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLEventObj2_GetIDsOfNames(IHTMLEventObj2 *iface, REFIID riid,LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLEventObj2_Invoke(IHTMLEventObj2 *iface, DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLEventObj2_setAttribute(IHTMLEventObj2 *iface, BSTR strAttributeName, VARIANT AttributeValue, LONG lFlags) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%s %s %08lx)\n", This, debugstr_w(strAttributeName), debugstr_variant(&AttributeValue), lFlags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_getAttribute(IHTMLEventObj2 *iface, BSTR strAttributeName, LONG lFlags, VARIANT *AttributeValue) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%s %08lx %p)\n", This, debugstr_w(strAttributeName), lFlags, AttributeValue); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_removeAttribute(IHTMLEventObj2 *iface, BSTR strAttributeName, LONG lFlags, VARIANT_BOOL *pfSuccess) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%s %lx %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_put_propertyName(IHTMLEventObj2 *iface, BSTR v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_propertyName(IHTMLEventObj2 *iface, BSTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_put_bookmarks(IHTMLEventObj2 *iface, IHTMLBookmarkCollection *v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_bookmarks(IHTMLEventObj2 *iface, IHTMLBookmarkCollection **p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_put_recordset(IHTMLEventObj2 *iface, IDispatch *v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_recordset(IHTMLEventObj2 *iface, IDispatch **p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_put_dataFld(IHTMLEventObj2 *iface, BSTR v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_dataFld(IHTMLEventObj2 *iface, BSTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_put_boundElements(IHTMLEventObj2 *iface, IHTMLElementCollection *v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_boundElements(IHTMLEventObj2 *iface, IHTMLElementCollection **p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_put_repeat(IHTMLEventObj2 *iface, VARIANT_BOOL v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%x)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_repeat(IHTMLEventObj2 *iface, VARIANT_BOOL *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_put_srcUrn(IHTMLEventObj2 *iface, BSTR v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_srcUrn(IHTMLEventObj2 *iface, BSTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_put_srcElement(IHTMLEventObj2 *iface, IHTMLElement *v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_srcElement(IHTMLEventObj2 *iface, IHTMLElement **p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_srcElement(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_altKey(IHTMLEventObj2 *iface, VARIANT_BOOL v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%x)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_altKey(IHTMLEventObj2 *iface, VARIANT_BOOL *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_altKey(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_ctrlKey(IHTMLEventObj2 *iface, VARIANT_BOOL v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%x)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_ctrlKey(IHTMLEventObj2 *iface, VARIANT_BOOL *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_ctrlKey(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_shiftKey(IHTMLEventObj2 *iface, VARIANT_BOOL v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%x)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_shiftKey(IHTMLEventObj2 *iface, VARIANT_BOOL *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_shiftKey(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_fromElement(IHTMLEventObj2 *iface, IHTMLElement *v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_fromElement(IHTMLEventObj2 *iface, IHTMLElement **p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_fromElement(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_toElement(IHTMLEventObj2 *iface, IHTMLElement *v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_toElement(IHTMLEventObj2 *iface, IHTMLElement **p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_toElement(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_button(IHTMLEventObj2 *iface, LONG v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%ld)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_button(IHTMLEventObj2 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_button(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_type(IHTMLEventObj2 *iface, BSTR v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_type(IHTMLEventObj2 *iface, BSTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_type(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_qualifier(IHTMLEventObj2 *iface, BSTR v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_qualifier(IHTMLEventObj2 *iface, BSTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_qualifier(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_reason(IHTMLEventObj2 *iface, LONG v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%ld)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_reason(IHTMLEventObj2 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_reason(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_x(IHTMLEventObj2 *iface, LONG v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%ld)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_x(IHTMLEventObj2 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_x(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_y(IHTMLEventObj2 *iface, LONG v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%ld)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_y(IHTMLEventObj2 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_y(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_clientX(IHTMLEventObj2 *iface, LONG v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%ld)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_clientX(IHTMLEventObj2 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_clientX(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_clientY(IHTMLEventObj2 *iface, LONG v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%ld)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_clientY(IHTMLEventObj2 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_clientY(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_offsetX(IHTMLEventObj2 *iface, LONG v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%ld)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_offsetX(IHTMLEventObj2 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_offsetX(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_offsetY(IHTMLEventObj2 *iface, LONG v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%ld)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_offsetY(IHTMLEventObj2 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_offsetY(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_screenX(IHTMLEventObj2 *iface, LONG v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%ld)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_screenX(IHTMLEventObj2 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_screenX(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_screenY(IHTMLEventObj2 *iface, LONG v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%ld)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_screenY(IHTMLEventObj2 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_screenY(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_put_srcFilter(IHTMLEventObj2 *iface, IDispatch *v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj2_get_srcFilter(IHTMLEventObj2 *iface, IDispatch **p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + return HTMLEventObj_get_srcFilter(&This->IHTMLEventObj_iface, p); +} + +static HRESULT WINAPI HTMLEventObj2_get_dataTransfer(IHTMLEventObj2 *iface, IHTMLDataTransfer **p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj2(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static const IHTMLEventObj2Vtbl HTMLEventObj2Vtbl = { + HTMLEventObj2_QueryInterface, + HTMLEventObj2_AddRef, + HTMLEventObj2_Release, + HTMLEventObj2_GetTypeInfoCount, + HTMLEventObj2_GetTypeInfo, + HTMLEventObj2_GetIDsOfNames, + HTMLEventObj2_Invoke, + HTMLEventObj2_setAttribute, + HTMLEventObj2_getAttribute, + HTMLEventObj2_removeAttribute, + HTMLEventObj2_put_propertyName, + HTMLEventObj2_get_propertyName, + HTMLEventObj2_put_bookmarks, + HTMLEventObj2_get_bookmarks, + HTMLEventObj2_put_recordset, + HTMLEventObj2_get_recordset, + HTMLEventObj2_put_dataFld, + HTMLEventObj2_get_dataFld, + HTMLEventObj2_put_boundElements, + HTMLEventObj2_get_boundElements, + HTMLEventObj2_put_repeat, + HTMLEventObj2_get_repeat, + HTMLEventObj2_put_srcUrn, + HTMLEventObj2_get_srcUrn, + HTMLEventObj2_put_srcElement, + HTMLEventObj2_get_srcElement, + HTMLEventObj2_put_altKey, + HTMLEventObj2_get_altKey, + HTMLEventObj2_put_ctrlKey, + HTMLEventObj2_get_ctrlKey, + HTMLEventObj2_put_shiftKey, + HTMLEventObj2_get_shiftKey, + HTMLEventObj2_put_fromElement, + HTMLEventObj2_get_fromElement, + HTMLEventObj2_put_toElement, + HTMLEventObj2_get_toElement, + HTMLEventObj2_put_button, + HTMLEventObj2_get_button, + HTMLEventObj2_put_type, + HTMLEventObj2_get_type, + HTMLEventObj2_put_qualifier, + HTMLEventObj2_get_qualifier, + HTMLEventObj2_put_reason, + HTMLEventObj2_get_reason, + HTMLEventObj2_put_x, + HTMLEventObj2_get_x, + HTMLEventObj2_put_y, + HTMLEventObj2_get_y, + HTMLEventObj2_put_clientX, + HTMLEventObj2_get_clientX, + HTMLEventObj2_put_clientY, + HTMLEventObj2_get_clientY, + HTMLEventObj2_put_offsetX, + HTMLEventObj2_get_offsetX, + HTMLEventObj2_put_offsetY, + HTMLEventObj2_get_offsetY, + HTMLEventObj2_put_screenX, + HTMLEventObj2_get_screenX, + HTMLEventObj2_put_screenY, + HTMLEventObj2_get_screenY, + HTMLEventObj2_put_srcFilter, + HTMLEventObj2_get_srcFilter, + HTMLEventObj2_get_dataTransfer +}; + +static inline HTMLEventObj *impl_from_IHTMLEventObj3(IHTMLEventObj3 *iface) +{ + return CONTAINING_RECORD(iface, HTMLEventObj, IHTMLEventObj3_iface); +} + +static HRESULT WINAPI HTMLEventObj3_QueryInterface(IHTMLEventObj3 *iface, REFIID riid, void **ppv) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + return IHTMLEventObj_QueryInterface(&This->IHTMLEventObj_iface, riid, ppv); +} + +static ULONG WINAPI HTMLEventObj3_AddRef(IHTMLEventObj3 *iface) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + return IHTMLEventObj_AddRef(&This->IHTMLEventObj_iface); +} + +static ULONG WINAPI HTMLEventObj3_Release(IHTMLEventObj3 *iface) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + return IHTMLEventObj_Release(&This->IHTMLEventObj_iface); +} + +static HRESULT WINAPI HTMLEventObj3_GetTypeInfoCount(IHTMLEventObj3 *iface, UINT *pctinfo) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo); +} + +static HRESULT WINAPI HTMLEventObj3_GetTypeInfo(IHTMLEventObj3 *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLEventObj3_GetIDsOfNames(IHTMLEventObj3 *iface, REFIID riid,LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLEventObj3_Invoke(IHTMLEventObj3 *iface, DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLEventObj3_get_contentOverflow(IHTMLEventObj3 *iface, VARIANT_BOOL *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_put_shiftLeft(IHTMLEventObj3 *iface, VARIANT_BOOL v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%x)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_shiftLeft(IHTMLEventObj3 *iface, VARIANT_BOOL *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_put_altLeft(IHTMLEventObj3 *iface, VARIANT_BOOL v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%x)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_altLeft(IHTMLEventObj3 *iface, VARIANT_BOOL *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_put_ctrlLeft(IHTMLEventObj3 *iface, VARIANT_BOOL v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%x)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_ctrlLeft(IHTMLEventObj3 *iface, VARIANT_BOOL *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_imeCompositionChange(IHTMLEventObj3 *iface, LONG_PTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_imeNotifyCommand(IHTMLEventObj3 *iface, LONG_PTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_imeNotifyData(IHTMLEventObj3 *iface, LONG_PTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_imeRequest(IHTMLEventObj3 *iface, LONG_PTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_imeRequestData(IHTMLEventObj3 *iface, LONG_PTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_keyboardLayout(IHTMLEventObj3 *iface, LONG_PTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_behaviorCookie(IHTMLEventObj3 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_behaviorPart(IHTMLEventObj3 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj3_get_nextPage(IHTMLEventObj3 *iface, BSTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj3(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static const IHTMLEventObj3Vtbl HTMLEventObj3Vtbl = { + HTMLEventObj3_QueryInterface, + HTMLEventObj3_AddRef, + HTMLEventObj3_Release, + HTMLEventObj3_GetTypeInfoCount, + HTMLEventObj3_GetTypeInfo, + HTMLEventObj3_GetIDsOfNames, + HTMLEventObj3_Invoke, + HTMLEventObj3_get_contentOverflow, + HTMLEventObj3_put_shiftLeft, + HTMLEventObj3_get_shiftLeft, + HTMLEventObj3_put_altLeft, + HTMLEventObj3_get_altLeft, + HTMLEventObj3_put_ctrlLeft, + HTMLEventObj3_get_ctrlLeft, + HTMLEventObj3_get_imeCompositionChange, + HTMLEventObj3_get_imeNotifyCommand, + HTMLEventObj3_get_imeNotifyData, + HTMLEventObj3_get_imeRequest, + HTMLEventObj3_get_imeRequestData, + HTMLEventObj3_get_keyboardLayout, + HTMLEventObj3_get_behaviorCookie, + HTMLEventObj3_get_behaviorPart, + HTMLEventObj3_get_nextPage +}; + +static inline HTMLEventObj *impl_from_IHTMLEventObj4(IHTMLEventObj4 *iface) +{ + return CONTAINING_RECORD(iface, HTMLEventObj, IHTMLEventObj4_iface); +} + +static HRESULT WINAPI HTMLEventObj4_QueryInterface(IHTMLEventObj4 *iface, REFIID riid, void **ppv) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj4(iface); + return IHTMLEventObj_QueryInterface(&This->IHTMLEventObj_iface, riid, ppv); +} + +static ULONG WINAPI HTMLEventObj4_AddRef(IHTMLEventObj4 *iface) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj4(iface); + return IHTMLEventObj_AddRef(&This->IHTMLEventObj_iface); +} + +static ULONG WINAPI HTMLEventObj4_Release(IHTMLEventObj4 *iface) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj4(iface); + return IHTMLEventObj_Release(&This->IHTMLEventObj_iface); +} + +static HRESULT WINAPI HTMLEventObj4_GetTypeInfoCount(IHTMLEventObj4 *iface, UINT *pctinfo) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj4(iface); + return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo); +} + +static HRESULT WINAPI HTMLEventObj4_GetTypeInfo(IHTMLEventObj4 *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj4(iface); + return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLEventObj4_GetIDsOfNames(IHTMLEventObj4 *iface, REFIID riid,LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj4(iface); + return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLEventObj4_Invoke(IHTMLEventObj4 *iface, DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj4(iface); + return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLEventObj4_get_wheelDelta(IHTMLEventObj4 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj4(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static const IHTMLEventObj4Vtbl HTMLEventObj4Vtbl = { + HTMLEventObj4_QueryInterface, + HTMLEventObj4_AddRef, + HTMLEventObj4_Release, + HTMLEventObj4_GetTypeInfoCount, + HTMLEventObj4_GetTypeInfo, + HTMLEventObj4_GetIDsOfNames, + HTMLEventObj4_Invoke, + HTMLEventObj4_get_wheelDelta +}; + +static inline HTMLEventObj *impl_from_IHTMLEventObj5(IHTMLEventObj5 *iface) +{ + return CONTAINING_RECORD(iface, HTMLEventObj, IHTMLEventObj5_iface); +} + +static HRESULT WINAPI HTMLEventObj5_QueryInterface(IHTMLEventObj5 *iface, REFIID riid, void **ppv) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + return IHTMLEventObj_QueryInterface(&This->IHTMLEventObj_iface, riid, ppv); +} + +static ULONG WINAPI HTMLEventObj5_AddRef(IHTMLEventObj5 *iface) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + return IHTMLEventObj_AddRef(&This->IHTMLEventObj_iface); +} + +static ULONG WINAPI HTMLEventObj5_Release(IHTMLEventObj5 *iface) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + return IHTMLEventObj_Release(&This->IHTMLEventObj_iface); +} + +static HRESULT WINAPI HTMLEventObj5_GetTypeInfoCount(IHTMLEventObj5 *iface, UINT *pctinfo) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo); +} + +static HRESULT WINAPI HTMLEventObj5_GetTypeInfo(IHTMLEventObj5 *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLEventObj5_GetIDsOfNames(IHTMLEventObj5 *iface, REFIID riid,LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLEventObj5_Invoke(IHTMLEventObj5 *iface, DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLEventObj5_put_url(IHTMLEventObj5 *iface, BSTR v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT WINAPI HTMLEventObj5_get_url(IHTMLEventObj5 *iface, BSTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + + FIXME("(%p)->(%p)\n", This, p); + + *p = NULL; + return S_OK; +} + +static HRESULT WINAPI HTMLEventObj5_put_data(IHTMLEventObj5 *iface, BSTR v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj5_get_data(IHTMLEventObj5 *iface, BSTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + + FIXME("(%p)->(%p)\n", This, p); + + *p = NULL; + return S_OK; +} + +static HRESULT WINAPI HTMLEventObj5_get_source(IHTMLEventObj5 *iface, IDispatch **p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + + FIXME("(%p)->(%p)\n", This, p); + + *p = NULL; + return S_OK; +} + +static HRESULT WINAPI HTMLEventObj5_put_origin(IHTMLEventObj5 *iface, BSTR v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT WINAPI HTMLEventObj5_get_origin(IHTMLEventObj5 *iface, BSTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + + FIXME("(%p)->(%p)\n", This, p); + + *p = NULL; + return S_OK; +} + +static HRESULT WINAPI HTMLEventObj5_put_issession(IHTMLEventObj5 *iface, VARIANT_BOOL v) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + + FIXME("(%p)->(%x)\n", This, v); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj5_get_issession(IHTMLEventObj5 *iface, VARIANT_BOOL *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static const IHTMLEventObj5Vtbl HTMLEventObj5Vtbl = { + HTMLEventObj5_QueryInterface, + HTMLEventObj5_AddRef, + HTMLEventObj5_Release, + HTMLEventObj5_GetTypeInfoCount, + HTMLEventObj5_GetTypeInfo, + HTMLEventObj5_GetIDsOfNames, + HTMLEventObj5_Invoke, + HTMLEventObj5_put_url, + HTMLEventObj5_get_url, + HTMLEventObj5_put_data, + HTMLEventObj5_get_data, + HTMLEventObj5_get_source, + HTMLEventObj5_put_origin, + HTMLEventObj5_get_origin, + HTMLEventObj5_put_issession, + HTMLEventObj5_get_issession +}; + +static inline HTMLEventObj *impl_from_IHTMLEventObj6(IHTMLEventObj6 *iface) +{ + return CONTAINING_RECORD(iface, HTMLEventObj, IHTMLEventObj6_iface); +} + +static HRESULT WINAPI HTMLEventObj6_QueryInterface(IHTMLEventObj6 *iface, REFIID riid, void **ppv) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj6(iface); + return IHTMLEventObj_QueryInterface(&This->IHTMLEventObj_iface, riid, ppv); +} + +static ULONG WINAPI HTMLEventObj6_AddRef(IHTMLEventObj6 *iface) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj6(iface); + return IHTMLEventObj_AddRef(&This->IHTMLEventObj_iface); +} + +static ULONG WINAPI HTMLEventObj6_Release(IHTMLEventObj6 *iface) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj6(iface); + return IHTMLEventObj_Release(&This->IHTMLEventObj_iface); +} + +static HRESULT WINAPI HTMLEventObj6_GetTypeInfoCount(IHTMLEventObj6 *iface, UINT *pctinfo) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj6(iface); + return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo); +} + +static HRESULT WINAPI HTMLEventObj6_GetTypeInfo(IHTMLEventObj6 *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj6(iface); + return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLEventObj6_GetIDsOfNames(IHTMLEventObj6 *iface, REFIID riid,LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj6(iface); + return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLEventObj6_Invoke(IHTMLEventObj6 *iface, DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj6(iface); + return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLEventObj6_get_actionURL(IHTMLEventObj6 *iface, BSTR *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj6(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLEventObj6_get_buttonID(IHTMLEventObj6 *iface, LONG *p) +{ + HTMLEventObj *This = impl_from_IHTMLEventObj6(iface); + + FIXME("(%p)->(%p)\n", This, p); + + return E_NOTIMPL; +} + +static const IHTMLEventObj6Vtbl HTMLEventObj6Vtbl = { + HTMLEventObj6_QueryInterface, + HTMLEventObj6_AddRef, + HTMLEventObj6_Release, + HTMLEventObj6_GetTypeInfoCount, + HTMLEventObj6_GetTypeInfo, + HTMLEventObj6_GetIDsOfNames, + HTMLEventObj6_Invoke, + HTMLEventObj6_get_actionURL, + HTMLEventObj6_get_buttonID +}; + static inline HTMLEventObj *HTMLEventObj_from_DispatchEx(DispatchEx *iface) { return CONTAINING_RECORD(iface, HTMLEventObj, dispex); @@ -865,6 +1957,16 @@ static void *HTMLEventObj_query_interface(DispatchEx *dispex, REFIID riid)
if(IsEqualGUID(&IID_IHTMLEventObj, riid)) return &This->IHTMLEventObj_iface; + if(IsEqualGUID(&IID_IHTMLEventObj2, riid)) + return &This->IHTMLEventObj2_iface; + if(IsEqualGUID(&IID_IHTMLEventObj3, riid)) + return &This->IHTMLEventObj3_iface; + if(IsEqualGUID(&IID_IHTMLEventObj4, riid)) + return &This->IHTMLEventObj4_iface; + if(IsEqualGUID(&IID_IHTMLEventObj5, riid)) + return &This->IHTMLEventObj5_iface; + if(IsEqualGUID(&IID_IHTMLEventObj6, riid)) + return &This->IHTMLEventObj6_iface;
return NULL; } @@ -920,6 +2022,11 @@ static HTMLEventObj *alloc_event_obj(DOMEvent *event, compat_mode_t compat_mode) return NULL;
event_obj->IHTMLEventObj_iface.lpVtbl = &HTMLEventObjVtbl; + event_obj->IHTMLEventObj2_iface.lpVtbl = &HTMLEventObj2Vtbl; + event_obj->IHTMLEventObj3_iface.lpVtbl = &HTMLEventObj3Vtbl; + event_obj->IHTMLEventObj4_iface.lpVtbl = &HTMLEventObj4Vtbl; + event_obj->IHTMLEventObj5_iface.lpVtbl = &HTMLEventObj5Vtbl; + event_obj->IHTMLEventObj6_iface.lpVtbl = &HTMLEventObj6Vtbl; event_obj->event = event; if(event) IDOMEvent_AddRef(&event->IDOMEvent_iface); diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c index 4732236c52c..aff6cf7e919 100644 --- a/dlls/mshtml/tests/events.c +++ b/dlls/mshtml/tests/events.c @@ -394,6 +394,9 @@ static void _elem_fire_event(unsigned line, IUnknown *unk, const WCHAR *event, V static void _test_event_args(unsigned line, const IID *dispiid, DISPID id, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { + IHTMLEventObj *window_event, *event_obj = NULL; + HRESULT hres; + ok_(__FILE__,line) (id == DISPID_VALUE, "id = %ld\n", id); ok_(__FILE__,line) (wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags); ok_(__FILE__,line) (pdp != NULL, "pdp == NULL\n"); @@ -411,10 +414,11 @@ static void _test_event_args(unsigned line, const IID *dispiid, DISPID id, WORD if(dispiid) _test_disp(line, (IUnknown*)V_DISPATCH(pdp->rgvarg), dispiid);
+ hres = IHTMLWindow2_get_event(window, &window_event); + ok(hres == S_OK, "get_event failed: %08lx\n", hres); + if(pdp->cArgs > 1) { - IHTMLEventObj *window_event, *event_obj; IDOMEvent *event; - HRESULT hres;
hres = IDispatch_QueryInterface(V_DISPATCH(pdp->rgvarg+1), &IID_IDOMEvent, (void**)&event); if(in_fire_event) @@ -424,24 +428,62 @@ static void _test_event_args(unsigned line, const IID *dispiid, DISPID id, WORD
hres = IDispatch_QueryInterface(V_DISPATCH(pdp->rgvarg+1), &IID_IHTMLEventObj, (void**)&event_obj); if(in_fire_event) - ok(hres == S_OK, "Could not get IDOMEventObj iface: %08lx\n", hres); + ok(hres == S_OK, "Could not get IHTMLEventObj iface: %08lx\n", hres); else ok(hres == E_NOINTERFACE, "QI(IID_IHTMLEventObj) returned %08lx\n", hres);
if(event) IDOMEvent_Release(event); - if(event_obj) - IHTMLEventObj_Release(event_obj);
- hres = IHTMLWindow2_get_event(window, &window_event); - ok(hres == S_OK, "get_event failed: %08lx\n", hres); if(window_event) { todo_wine_if(in_fire_event) ok(!iface_cmp((IUnknown*)V_DISPATCH(pdp->rgvarg+1), (IUnknown*)window_event), "window_event != event arg\n"); - IHTMLEventObj_Release(window_event); } } + + if(window_event) { + if(!event_obj) + event_obj = window_event; + else + IHTMLEventObj_Release(window_event); + } + + if(event_obj) { + IHTMLEventObj5 *event_obj5; + IDispatch *disp; + BSTR bstr; + + hres = IHTMLEventObj_QueryInterface(event_obj, &IID_IHTMLEventObj5, (void**)&event_obj5); + ok(hres == S_OK, "Could not get IHTMLEventObj5: %08lx\n", hres); + IHTMLEventObj_Release(event_obj); + + hres = IHTMLEventObj5_get_data(event_obj5, &bstr); + ok(hres == S_OK, "get_data failed: %08lx\n", hres); + ok(!bstr, "data = %s\n", wine_dbgstr_w(bstr)); + + hres = IHTMLEventObj5_get_origin(event_obj5, &bstr); + ok(hres == S_OK, "get_origin failed: %08lx\n", hres); + ok(!bstr, "origin = %s\n", wine_dbgstr_w(bstr)); + + hres = IHTMLEventObj5_get_source(event_obj5, &disp); + ok(hres == S_OK, "get_source failed: %08lx\n", hres); + ok(!disp, "source != NULL\n"); + + hres = IHTMLEventObj5_get_url(event_obj5, &bstr); + ok(hres == S_OK, "get_url failed: %08lx\n", hres); + ok(!bstr, "url = %s\n", wine_dbgstr_w(bstr)); + + bstr = SysAllocString(L"foobar"); + hres = IHTMLEventObj5_put_origin(event_obj5, bstr); + ok(hres == DISP_E_MEMBERNOTFOUND, "put_origin returned: %08lx\n", hres); + + hres = IHTMLEventObj5_put_url(event_obj5, bstr); + ok(hres == DISP_E_MEMBERNOTFOUND, "put_url returned: %08lx\n", hres); + SysFreeString(bstr); + + IHTMLEventObj5_Release(event_obj5); + } }
#define test_attached_event_args(a,b,c,d,e) _test_attached_event_args(__LINE__,a,b,c,d,e) diff --git a/dlls/mshtml/tests/events.html b/dlls/mshtml/tests/events.html index 955e4853b92..6f9b3dacbbc 100644 --- a/dlls/mshtml/tests/events.html +++ b/dlls/mshtml/tests/events.html @@ -283,7 +283,16 @@ function test_attach_in_attach() { document.body.removeChild(div); }
+function test_event_obj_props(e) { + var i, props; + + props = [ "imeCompositionChange", "imeNotifyCommand", "imeNotifyData", "imeRequest", "imeRequestData", "issession", "keyboardLayout" ]; + for(i = 0; i < props.length; i++) + ok(!(props[i] in e), props[i] + " in event obj"); +} + window.onload = function() { + test_event_obj_props(window.event); try { ok(inlscr_complete_called, "onreadystatechange not fired"); ok(extern_res_script_rs === "eval,complete1," || extern_res_script_rs == "loaded0,eval,complete1,",
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index e47e4d2dc45..07c26e2e762 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -277,6 +277,8 @@ static void add_func_info(dispex_data_t *data, tid_t tid, const FUNCDESC *desc,
if(name_override) name = SysAllocString(name_override); + else if(desc->wFuncFlags & FUNCFLAG_FRESTRICTED) + return; else { hres = ITypeInfo_GetDocumentation(dti, desc->memid, &name, NULL, NULL, NULL); if(FAILED(hres)) {
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
Will be tested in next patch when the url prop for the legacy event obj is implemented. --- dlls/mshtml/htmldoc.c | 2 +- dlls/mshtml/htmlevent.c | 4 ++-- dlls/mshtml/htmlevent.h | 2 +- dlls/mshtml/htmlstorage.c | 15 ++++++++++++--- 4 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index e37f04fee0b..e03a7698f3a 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -3035,7 +3035,7 @@ static HRESULT WINAPI HTMLDocument4_createEventObject(IHTMLDocument4 *iface, return E_NOTIMPL; }
- return create_event_obj(dispex_compat_mode(&This->node.event_target.dispex), ppEventObj); + return create_event_obj(NULL, dispex_compat_mode(&This->node.event_target.dispex), ppEventObj); }
static HRESULT WINAPI HTMLDocument4_fireEvent(IHTMLDocument4 *iface, BSTR bstrEventName, diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 50f40ea62ae..f72670ad1c4 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -2035,11 +2035,11 @@ static HTMLEventObj *alloc_event_obj(DOMEvent *event, compat_mode_t compat_mode) return event_obj; }
-HRESULT create_event_obj(compat_mode_t compat_mode, IHTMLEventObj **ret) +HRESULT create_event_obj(DOMEvent *event, compat_mode_t compat_mode, IHTMLEventObj **ret) { HTMLEventObj *event_obj;
- event_obj = alloc_event_obj(NULL, compat_mode); + event_obj = alloc_event_obj(event, compat_mode); if(!event_obj) return E_OUTOFMEMORY;
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index b50c74c029f..2d86ba08782 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -107,7 +107,7 @@ HRESULT fire_event(HTMLDOMNode*,const WCHAR*,VARIANT*,VARIANT_BOOL*); void update_doc_cp_events(HTMLDocumentNode*,cp_static_data_t*); HRESULT doc_init_events(HTMLDocumentNode*); void detach_events(HTMLDocumentNode *doc); -HRESULT create_event_obj(compat_mode_t,IHTMLEventObj**); +HRESULT create_event_obj(DOMEvent*,compat_mode_t,IHTMLEventObj**); void bind_target_event(HTMLDocumentNode*,EventTarget*,const WCHAR*,IDispatch*); HRESULT ensure_doc_nsevent_handler(HTMLDocumentNode*,nsIDOMNode*,eventid_t);
diff --git a/dlls/mshtml/htmlstorage.c b/dlls/mshtml/htmlstorage.c index 06d16e4e4aa..68452794449 100644 --- a/dlls/mshtml/htmlstorage.c +++ b/dlls/mshtml/htmlstorage.c @@ -208,12 +208,21 @@ static void storage_event_proc(event_task_t *_task) struct storage_event_task *task = (struct storage_event_task*)_task; HTMLInnerWindow *window = task->header.window; DOMEvent *event = task->event; + compat_mode_t compat_mode; VARIANT_BOOL cancelled; + HRESULT hres; + VARIANT var;
- if(event->event_id == EVENTID_STORAGE && dispex_compat_mode(&window->event_target.dispex) >= COMPAT_MODE_IE9) { + if(event->event_id == EVENTID_STORAGE && (compat_mode = dispex_compat_mode(&window->event_target.dispex)) >= COMPAT_MODE_IE9) { dispatch_event(&window->event_target, event); - if(window->doc) - fire_event(&window->doc->node, L"onstorage", NULL, &cancelled); + if(window->doc) { + hres = create_event_obj(event, compat_mode, (IHTMLEventObj**)&V_DISPATCH(&var)); + if(SUCCEEDED(hres)) { + V_VT(&var) = VT_DISPATCH; + fire_event(&window->doc->node, L"onstorage", &var, &cancelled); + IDispatch_Release(V_DISPATCH(&var)); + } + } }else if(window->doc) { dispatch_event(&window->doc->node.event_target, event); }
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 62 ++++++++++++++++++++++++++------------ dlls/mshtml/tests/events.c | 37 ++++++++++++++++++++++- 2 files changed, 79 insertions(+), 20 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index f72670ad1c4..36a7fa6c83c 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -346,6 +346,20 @@ static DOMUIEvent *DOMUIEvent_from_DOMEvent(DOMEvent *event) return CONTAINING_RECORD(event, DOMUIEvent, event); }
+typedef struct { + DOMEvent event; + IDOMStorageEvent IDOMStorageEvent_iface; + BSTR key; + BSTR old_value; + BSTR new_value; + BSTR url; +} DOMStorageEvent; + +static DOMStorageEvent *DOMStorageEvent_from_DOMEvent(DOMEvent *event) +{ + return CONTAINING_RECORD(event, DOMStorageEvent, event); +} + typedef struct { DispatchEx dispex; IHTMLEventObj IHTMLEventObj_iface; @@ -1765,20 +1779,44 @@ static HRESULT WINAPI HTMLEventObj5_Invoke(IHTMLEventObj5 *iface, DISPID dispIdM static HRESULT WINAPI HTMLEventObj5_put_url(IHTMLEventObj5 *iface, BSTR v) { HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + IDOMStorageEvent *storage_event; + DOMStorageEvent *p; + BSTR url;
- FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + TRACE("(%p)->(%s)\n", This, debugstr_w(v));
- return DISP_E_MEMBERNOTFOUND; + if(!v) + return E_POINTER; + + if(!This->event || FAILED(IDOMEvent_QueryInterface(&This->event->IDOMEvent_iface, &IID_IDOMStorageEvent, (void**)&storage_event))) + return DISP_E_MEMBERNOTFOUND; + IDOMStorageEvent_Release(storage_event); + + if(!(url = SysAllocString(v))) + return E_OUTOFMEMORY; + + p = DOMStorageEvent_from_DOMEvent(This->event); + SysFreeString(p->url); + p->url = url; + return S_OK; }
static HRESULT WINAPI HTMLEventObj5_get_url(IHTMLEventObj5 *iface, BSTR *p) { HTMLEventObj *This = impl_from_IHTMLEventObj5(iface); + IDOMStorageEvent *storage_event; + HRESULT hres;
- FIXME("(%p)->(%p)\n", This, p); + TRACE("(%p)->(%p)\n", This, p);
- *p = NULL; - return S_OK; + if(!This->event || FAILED(IDOMEvent_QueryInterface(&This->event->IDOMEvent_iface, &IID_IDOMStorageEvent, (void**)&storage_event))) { + *p = NULL; + return S_OK; + } + + hres = IDOMStorageEvent_get_url(storage_event, p); + IDOMStorageEvent_Release(storage_event); + return hres; }
static HRESULT WINAPI HTMLEventObj5_put_data(IHTMLEventObj5 *iface, BSTR v) @@ -3954,15 +3992,6 @@ static void DOMProgressEvent_unlink(DispatchEx *dispex) unlink_ref(&This->nsevent); }
-typedef struct { - DOMEvent event; - IDOMStorageEvent IDOMStorageEvent_iface; - BSTR key; - BSTR old_value; - BSTR new_value; - BSTR url; -} DOMStorageEvent; - static inline DOMStorageEvent *impl_from_IDOMStorageEvent(IDOMStorageEvent *iface) { return CONTAINING_RECORD(iface, DOMStorageEvent, IDOMStorageEvent_iface); @@ -4097,11 +4126,6 @@ static const IDOMStorageEventVtbl DOMStorageEventVtbl = { DOMStorageEvent_initStorageEvent };
-static DOMStorageEvent *DOMStorageEvent_from_DOMEvent(DOMEvent *event) -{ - return CONTAINING_RECORD(event, DOMStorageEvent, event); -} - static void *DOMStorageEvent_query_interface(DispatchEx *dispex, REFIID riid) { DOMStorageEvent *storage_event = DOMStorageEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c index aff6cf7e919..606cbbc74ce 100644 --- a/dlls/mshtml/tests/events.c +++ b/dlls/mshtml/tests/events.c @@ -3872,9 +3872,11 @@ static void test_storage_event(DISPPARAMS *params, BOOL doc_onstorage) { const WCHAR *expect_key = onstorage_expect_key, *expect_old_value = onstorage_expect_old_value, *expect_new_value = onstorage_expect_new_value; unsigned line = onstorage_expect_line; + IHTMLEventObj5 *event_obj5; IHTMLEventObj *event_obj; IDOMStorageEvent *event; IDispatchEx *dispex; + IDispatch *disp; HRESULT hres; unsigned i; DISPID id; @@ -3898,6 +3900,8 @@ static void test_storage_event(DISPPARAMS *params, BOOL doc_onstorage)
hres = IDispatchEx_QueryInterface(dispex, &IID_IHTMLEventObj, (void**)&event_obj); ok_(__FILE__,line)(hres == S_OK, "Could not get IHTMLEventObj: %08lx\n", hres); + hres = IHTMLEventObj_QueryInterface(event_obj, &IID_IHTMLEventObj5, (void**)&event_obj5); + ok_(__FILE__,line)(hres == S_OK, "Could not get IHTMLEventObj5: %08lx\n", hres); IHTMLEventObj_Release(event_obj);
for(i = 0; i < ARRAY_SIZE(props); i++) { @@ -3906,8 +3910,39 @@ static void test_storage_event(DISPPARAMS *params, BOOL doc_onstorage) ok_(__FILE__,line)(hres == DISP_E_UNKNOWNNAME, "GetDispID(%s) failed: %08lx\n", wine_dbgstr_w(bstr), hres); SysFreeString(bstr); } - IDispatchEx_Release(dispex); + + hres = IHTMLEventObj5_get_data(event_obj5, &bstr); + ok_(__FILE__,line)(hres == S_OK, "get_data failed: %08lx\n", hres); + ok_(__FILE__,line)(!bstr, "data = %s\n", wine_dbgstr_w(bstr)); + + hres = IHTMLEventObj5_get_origin(event_obj5, &bstr); + ok_(__FILE__,line)(hres == S_OK, "get_origin failed: %08lx\n", hres); + ok_(__FILE__,line)(!bstr, "origin = %s\n", wine_dbgstr_w(bstr)); + + hres = IHTMLEventObj5_get_source(event_obj5, &disp); + ok_(__FILE__,line)(hres == S_OK, "get_source failed: %08lx\n", hres); + ok_(__FILE__,line)(!disp, "source != NULL\n"); + + hres = IHTMLEventObj5_get_url(event_obj5, &bstr); + ok_(__FILE__,line)(hres == S_OK, "get_url failed: %08lx\n", hres); + ok_(__FILE__,line)(!wcscmp(bstr, L"http://winetest.example.org/"), "url = %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + bstr = SysAllocString(L"barfoo"); + hres = IHTMLEventObj5_put_url(event_obj5, bstr); + ok_(__FILE__,line)(hres == S_OK, "put_url failed: %08lx\n", hres); + SysFreeString(bstr); + + hres = IHTMLEventObj5_get_url(event_obj5, &bstr); + ok_(__FILE__,line)(hres == S_OK, "get_url after put failed: %08lx\n", hres); + ok_(__FILE__,line)(!wcscmp(bstr, L"barfoo"), "url after put = %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + hres = IHTMLEventObj5_put_url(event_obj5, NULL); + ok_(__FILE__,line)(hres == E_POINTER, "put_url NULL returned: %08lx\n", hres); + + IHTMLEventObj5_Release(event_obj5); return; }
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/tests/dom.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 58a1cc6cf20..de3ff54966c 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -3672,6 +3672,8 @@ static LONG test_attr_collection_attr(IDispatch *attr, LONG i) VARIANT val; BSTR name;
+ V_VT(&val) = VT_EMPTY; + hres = IDispatch_QueryInterface(attr, &IID_IHTMLDOMAttribute, (void**)&dom_attr); ok(hres == S_OK, "%ld) QueryInterface failed: %08lx\n", i, hres);
This merge request was approved by Jacek Caban.
On Wed Dec 6 18:16:49 2023 +0000, Gabriel Ivăncescu wrote:
changed this line in [version 3 of the diff](/wine/wine/-/merge_requests/4619/diffs?diff_id=88474&start_sha=04ff4f2a71cd5c4a0ad19cb857fb7ec885a56db6#b5fa643f0dd306b4a3dc41c7d2cf01b86dff3109_2048_2044)
Out of curiosity, which of those interfaces did you see actually required by something?
Note that even after code freeze, exposing everything like that will be questionable. The above worry is not only theoretical, I recall some JS libraries (IIRC jquery, but I'm not sure) doing things like: ``` var o = {}; for (p in event) o[p] = event[p]; return o ```
On Thu Dec 7 12:08:07 2023 +0000, Jacek Caban wrote:
Out of curiosity, which of those interfaces did you see actually required by something? Note that even after code freeze, exposing everything like that will be questionable. The above worry is not only theoretical, I recall some JS libraries (IIRC jquery, but I'm not sure) doing things like:
var o = {}; for (p in event) o[p] = event[p]; return o
I believe it was mostly to get proper tests for stuff like storage event url or message event source later for all modes, I didn't realize it could have such an impact.
But now thinking on this, I mean, those interfaces are pretty large, it doesn't make sense to implement them all at once, and debugging apps that do end up using them and fail with error would be a lot easier than "this app doesn't do what it should do and fails for random reason" (if it bails out on it). But we'll see.
I guess I should probably just start with the respective interfaces needed by the tests though.