From: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- dlls/mshtml/htmlobject.c | 64 ++++++++++++++++++++++++++++ dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/mshtml_private_iface.idl | 21 +++++++++ dlls/mshtml/tests/documentmode.js | 5 +-- 4 files changed, 88 insertions(+), 3 deletions(-) diff --git a/dlls/mshtml/htmlobject.c b/dlls/mshtml/htmlobject.c index aedbdefb00b..be567e8689e 100644 --- a/dlls/mshtml/htmlobject.c +++ b/dlls/mshtml/htmlobject.c @@ -40,6 +40,7 @@ struct HTMLObjectElement { IHTMLObjectElement IHTMLObjectElement_iface; IHTMLObjectElement2 IHTMLObjectElement2_iface; + IWineHTMLObjectPrivate IWineHTMLObjectPrivate_iface; nsIDOMHTMLObjectElement *nsobject; }; @@ -580,6 +581,64 @@ ULONG WINAPI wrapper_Release(IUnknown *iface) return ref; } +static inline HTMLObjectElement *impl_from_IWineHTMLObjectPrivateVtbl(IWineHTMLObjectPrivate *iface) +{ + return CONTAINING_RECORD(iface, HTMLObjectElement, IWineHTMLObjectPrivate_iface); +} + +DISPEX_IDISPATCH_IMPL(HTMLObjectElement_private, IWineHTMLObjectPrivate, + impl_from_IWineHTMLObjectPrivateVtbl(iface)->plugin_container.element.node.event_target.dispex) + +static HRESULT WINAPI HTMLObjectElement_private_get_validationMessage(IWineHTMLObjectPrivate *iface, BSTR *ret) +{ + HTMLObjectElement *This = impl_from_IWineHTMLObjectPrivateVtbl(iface); + FIXME("(%p)->(%p)\n", This, ret); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLObjectElement_private_get_validity(IWineHTMLObjectPrivate *iface, IDispatch **ret) +{ + HTMLObjectElement *This = impl_from_IWineHTMLObjectPrivateVtbl(iface); + FIXME("(%p)->(%p)\n", This, ret); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLObjectElement_private_get_willValidate(IWineHTMLObjectPrivate *iface, VARIANT_BOOL *ret) +{ + HTMLObjectElement *This = impl_from_IWineHTMLObjectPrivateVtbl(iface); + FIXME("(%p)->(%p)\n", This, ret); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLObjectElement_private_setCustomValidity(IWineHTMLObjectPrivate *iface, VARIANT *message) +{ + HTMLObjectElement *This = impl_from_IWineHTMLObjectPrivateVtbl(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(message)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLObjectElement_private_checkValidity(IWineHTMLObjectPrivate *iface, VARIANT_BOOL *ret) +{ + HTMLObjectElement *This = impl_from_IWineHTMLObjectPrivateVtbl(iface); + FIXME("(%p)->(%p)\n", This, ret); + return E_NOTIMPL; +} + +static const IWineHTMLObjectPrivateVtbl WineHTMLObjectPrivateVtbl = { + HTMLObjectElement_private_QueryInterface, + HTMLObjectElement_private_AddRef, + HTMLObjectElement_private_Release, + HTMLObjectElement_private_GetTypeInfoCount, + HTMLObjectElement_private_GetTypeInfo, + HTMLObjectElement_private_GetIDsOfNames, + HTMLObjectElement_private_Invoke, + HTMLObjectElement_private_get_validationMessage, + HTMLObjectElement_private_get_validity, + HTMLObjectElement_private_get_willValidate, + HTMLObjectElement_private_setCustomValidity, + HTMLObjectElement_private_checkValidity +}; + static inline HTMLObjectElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) { return CONTAINING_RECORD(iface, HTMLObjectElement, plugin_container.element.node); @@ -606,6 +665,8 @@ static void *HTMLObjectElement_query_interface(DispatchEx *dispex, REFIID riid) return &This->IHTMLObjectElement_iface; if(IsEqualGUID(&IID_IHTMLObjectElement2, riid)) return &This->IHTMLObjectElement2_iface; + if(IsEqualGUID(&IID_IWineHTMLObjectPrivate, riid)) + return &This->IWineHTMLObjectPrivate_iface; if(IsEqualGUID(&IID_HTMLPluginContainer, riid)) { /* Special pseudo-interface returning HTMLPluginContainer struct. */ return &This->plugin_container; @@ -673,6 +734,8 @@ static void HTMLObjectElement_init_dispex_info(dispex_data_t *info, compat_mode_ }; dispex_info_add_interface(info, IHTMLObjectElement2_tid, NULL); dispex_info_add_interface(info, IHTMLObjectElement_tid, hooks); + if(mode >= COMPAT_MODE_IE10) + dispex_info_add_interface(info, IWineHTMLObjectPrivate_tid, NULL); HTMLElement_init_dispex_info(info, mode); } @@ -711,6 +774,7 @@ HRESULT HTMLObjectElement_Create(HTMLDocumentNode *doc, nsIDOMElement *nselem, H ret->IHTMLObjectElement_iface.lpVtbl = &HTMLObjectElementVtbl; ret->IHTMLObjectElement2_iface.lpVtbl = &HTMLObjectElement2Vtbl; + ret->IWineHTMLObjectPrivate_iface.lpVtbl = &WineHTMLObjectPrivateVtbl; ret->plugin_container.element.node.vtbl = &HTMLObjectElementImplVtbl; HTMLElement_Init(&ret->plugin_container.element, doc, nselem, &HTMLObjectElement_dispex); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 2f59e0dca5d..4c74ec55669 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -313,6 +313,7 @@ struct constructor; XIID(IWineHTMLElementPrivate) \ XIID(IWineHTMLInputPrivate) \ XIID(IWineHTMLFormPrivate) \ + XIID(IWineHTMLObjectPrivate) \ XIID(IWineHTMLWindowPrivate) \ XIID(IWineHTMLWindowCompatPrivate) \ XIID(IWineCSSProperties) \ diff --git a/dlls/mshtml/mshtml_private_iface.idl b/dlls/mshtml/mshtml_private_iface.idl index 29fd18bb157..aa81f0de46c 100644 --- a/dlls/mshtml/mshtml_private_iface.idl +++ b/dlls/mshtml/mshtml_private_iface.idl @@ -271,6 +271,27 @@ interface IWineHTMLInputPrivate : IDispatch HRESULT formTarget([retval, out] BSTR *ret); } +[ + odl, + oleautomation, + dual, + hidden, + uuid(307eb8f7-362b-6398-8c22-54c1c714efd8) +] +interface IWineHTMLObjectPrivate : IDispatch +{ + [propget, id(50)] + HRESULT validationMessage([retval, out] BSTR *ret); + [propget, id(51)] + HRESULT validity([retval, out] IDispatch **ret); + [propget, id(52)] + HRESULT willValidate([retval, out] VARIANT_BOOL *ret); + [id(53)] + HRESULT setCustomValidity([in] VARIANT *message); + [id(54)] + HRESULT checkValidity([retval, out] VARIANT_BOOL *ret); +} + [ odl, oleautomation, diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 46c2aa8a6eb..388842aa2cc 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -4370,9 +4370,8 @@ sync_test("prototype props", function() { ["msPlayToPreferredSourceUri",11], ["msPlayToPrimary",11], "name", "namedRecordset", "object", ["readyState",11], "recordset", ["setCustomValidity",10], "standby", "type", "useMap", ["validationMessage",10], ["validity",10], "vspace", "width", ["willValidate",10] ], [ - "alt", "archive", "border", ["checkValidity",10], "contentDocument", ["dataFld",9,10], ["dataFormatAs",9,10], ["dataSrc",9,10], "declare", "getSVGDocument", - ["msPlayToDisabled",11], ["msPlayToPreferredSourceUri",11], ["msPlayToPrimary",11], ["onreadystatechange",11], ["readyState",11], ["setCustomValidity",10], - "standby", "useMap", ["validationMessage",10], ["validity",10], ["willValidate",10] + "alt", "archive", "border", "contentDocument", ["dataFld",9,10], ["dataFormatAs",9,10], ["dataSrc",9,10], "declare", "getSVGDocument", ["msPlayToDisabled",11], + ["msPlayToPreferredSourceUri",11], ["msPlayToPrimary",11], ["onreadystatechange",11], ["readyState",11], "standby", "useMap" ]); check(HTMLOptionElement, [ ["dataFld",9,10], ["dataFormatAs",9,10], ["dataSrc",9,10], "defaultSelected", "form", "index", "label", "selected", "text", "value" ], [ ["dataFld",9,10], ["dataFormatAs",9,10], ["dataSrc",9,10], "label" ]); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9252