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).
-- v2: 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* props.
Okay, the test failure seems completely unrelated (last test seen is after IHTMLDOMAttribute_get_nodeName in `test_attr_collection_attr`), but I found a potential issue, I added the test fix to the end of this MR because I didn't feel like making a new MR just to fix that.
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 1112 +++++++++++++++++++++++++++++++++ dlls/mshtml/mshtml_private.h | 5 + dlls/mshtml/tests/events.c | 58 +- dlls/mshtml/tests/events.html | 17 + 4 files changed, 1184 insertions(+), 8 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 6ee133d848a..7c6f2910c1b 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; } @@ -901,6 +2003,11 @@ static const dispex_static_data_vtbl_t HTMLEventObj_dispex_vtbl = {
static const tid_t HTMLEventObj_iface_tids[] = { IHTMLEventObj_tid, + IHTMLEventObj2_tid, + IHTMLEventObj3_tid, + IHTMLEventObj4_tid, + IHTMLEventObj5_tid, + IHTMLEventObj6_tid, 0 };
@@ -920,6 +2027,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/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 40dcb0ebfab..fe6658018ba 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -208,6 +208,11 @@ typedef struct EventTarget EventTarget; XIID(IHTMLElementCollection) \ XIID(IHTMLEmbedElement) \ XIID(IHTMLEventObj) \ + XIID(IHTMLEventObj2) \ + XIID(IHTMLEventObj3) \ + XIID(IHTMLEventObj4) \ + XIID(IHTMLEventObj5) \ + XIID(IHTMLEventObj6) \ XIID(IHTMLFiltersCollection) \ XIID(IHTMLFormElement) \ XIID(IHTMLFrameBase) \ 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..e9a39e59b91 100644 --- a/dlls/mshtml/tests/events.html +++ b/dlls/mshtml/tests/events.html @@ -283,7 +283,24 @@ function test_attach_in_attach() { document.body.removeChild(div); }
+function test_event_obj_props(e) { + var i, props = [ + "actionURL", "altKey", "altLeft", "behaviorCookie", "behaviorPart", "bookmarks", "boundElements", "button", "buttonID", + "cancelBubble", "clientX", "clientY", "contentOverflow", "ctrlKey", "ctrlLeft", "data", "dataFld", "dataTransfer", + "fromElement", "keyCode", "nextPage", "offsetX", "offsetY", "origin", "propertyName", "qualifier", "reason", "recordset", + "repeat", "returnValue", "screenX", "screenY", "shiftKey", "shiftLeft", "source", "srcElement", "srcFilter", "srcUrn", + "toElement", "type", "url", "wheelDelta", "x", "y", "getAttribute", "setAttribute", "removeAttribute" ]; + for(i = 0; i < props.length; i++) + ok(props[i] in e, props[i] + " not in event obj"); + + props = [ "imeCompositionChange", "imeNotifyCommand", "imeNotifyData", "imeRequest", "imeRequestData", "issession", "keyboardLayout" ]; + for(i = 0; i < props.length; i++) + todo_wine. + 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 ++ dlls/mshtml/tests/events.html | 1 - 2 files changed, 2 insertions(+), 1 deletion(-)
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)) { diff --git a/dlls/mshtml/tests/events.html b/dlls/mshtml/tests/events.html index e9a39e59b91..5388ce1bf5a 100644 --- a/dlls/mshtml/tests/events.html +++ b/dlls/mshtml/tests/events.html @@ -295,7 +295,6 @@ function test_event_obj_props(e) {
props = [ "imeCompositionChange", "imeNotifyCommand", "imeNotifyData", "imeRequest", "imeRequestData", "issession", "keyboardLayout" ]; for(i = 0; i < props.length; i++) - todo_wine. ok(!(props[i] in e), props[i] + " in event obj"); }
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 7c6f2910c1b..80870686a1d 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -2040,11 +2040,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 80870686a1d..1e7d6412307 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) @@ -3959,15 +3997,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); @@ -4102,11 +4131,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);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=140846
Your paranoid android.
=== w1064v1507 (64 bit report) ===
mshtml: script.c:1141: Test failed: L"/index.html?xhr.js: [iframes 1] unexpected order: 0,1,async_xhr,echo" script.c:1141: Test failed: L"/index.html?xhr.js: [iframes 2] unexpected order: 0,1,sync_xhr(pre-send),sync_xhr(DONE),sync_xhr,async_xhr(DONE),echo,blank(DONE),sync_xhr(pre-send),sync_xhr(DONE),sync_xhr"
Jacek Caban (@jacek) commented about dlls/mshtml/htmlevent.c:
static const tid_t HTMLEventObj_iface_tids[] = { IHTMLEventObj_tid,
- IHTMLEventObj2_tid,
- IHTMLEventObj3_tid,
- IHTMLEventObj4_tid,
- IHTMLEventObj5_tid,
- IHTMLEventObj6_tid,
C stubs are generally fine, but I don't think that exposing them to JS right away is a good idea. Web pages can often deal with missing properties, while providing stubs like that will just throw an error. There is no strict rule when to expose new interfaces, I usually did that together with at least a partial implementation of the interface (which also meant that I had a use case requiring that).
Anyway, a few days before the code freeze does not feel like a good moment for exposing a bunch of stubs to JS, I'd suggest to add only C stubs for now.
On Wed Dec 6 17:55:09 2023 +0000, Jacek Caban wrote:
C stubs are generally fine, but I don't think that exposing them to JS right away is a good idea. Web pages can often deal with missing properties, while providing stubs like that will just throw an error. There is no strict rule when to expose new interfaces, I usually did that together with at least a partial implementation of the interface (which also meant that I had a use case requiring that). Anyway, a few days before the code freeze does not feel like a good moment for exposing a bunch of stubs to JS, I'd suggest to add only C stubs for now.
Good point (honestly errors are way easier to debug, but before code freeze is definitely a bad idea as you said). Also for the future, I should actually reverse the order of the tids since otherwise they don't even become writable due to same name existing.