From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlform.c | 70 ++++++++++++++++++++++++++++ dlls/mshtml/mshtml_private.h | 2 + dlls/mshtml/mshtml_private_iface.idl | 49 +++++++++++++++++++ dlls/mshtml/tests/documentmode.js | 2 +- 4 files changed, 122 insertions(+), 1 deletion(-)
diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c index c28423dec5d..d6ccce56d41 100644 --- a/dlls/mshtml/htmlform.c +++ b/dlls/mshtml/htmlform.c @@ -38,6 +38,7 @@ struct HTMLFormElement { HTMLElement element;
IHTMLFormElement IHTMLFormElement_iface; + IWineHTMLFormPrivate IWineHTMLFormPrivate_iface;
nsIDOMHTMLFormElement *nsform; }; @@ -567,6 +568,64 @@ static const IHTMLFormElementVtbl HTMLFormElementVtbl = { HTMLFormElement_tags };
+static inline HTMLFormElement *impl_from_IWineHTMLFormPrivateVtbl(IWineHTMLFormPrivate *iface) +{ + return CONTAINING_RECORD(iface, HTMLFormElement, IWineHTMLFormPrivate_iface); +} + +DISPEX_IDISPATCH_IMPL(HTMLFormElement_private, IWineHTMLFormPrivate, + impl_from_IWineHTMLFormPrivateVtbl(iface)->element.node.event_target.dispex) + +static HRESULT WINAPI HTMLFormElement_private_put_enctype(IWineHTMLFormPrivate *iface, BSTR v) +{ + HTMLFormElement *This = impl_from_IWineHTMLFormPrivateVtbl(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_private_get_enctype(IWineHTMLFormPrivate *iface, BSTR *ret) +{ + HTMLFormElement *This = impl_from_IWineHTMLFormPrivateVtbl(iface); + FIXME("(%p)->(%p)\n", This, ret); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_private_put_noValidate(IWineHTMLFormPrivate *iface, VARIANT_BOOL v) +{ + HTMLFormElement *This = impl_from_IWineHTMLFormPrivateVtbl(iface); + FIXME("(%p)->(%x)\n", This, v); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_private_get_noValidate(IWineHTMLFormPrivate *iface, VARIANT_BOOL *ret) +{ + HTMLFormElement *This = impl_from_IWineHTMLFormPrivateVtbl(iface); + FIXME("(%p)->(%p)\n", This, ret); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_private_checkValidity(IWineHTMLFormPrivate *iface, VARIANT_BOOL *ret) +{ + HTMLFormElement *This = impl_from_IWineHTMLFormPrivateVtbl(iface); + FIXME("(%p)->(%p)\n", This, ret); + return E_NOTIMPL; +} + +static const IWineHTMLFormPrivateVtbl WineHTMLFormPrivateVtbl = { + HTMLFormElement_private_QueryInterface, + HTMLFormElement_private_AddRef, + HTMLFormElement_private_Release, + HTMLFormElement_private_GetTypeInfoCount, + HTMLFormElement_private_GetTypeInfo, + HTMLFormElement_private_GetIDsOfNames, + HTMLFormElement_private_Invoke, + HTMLFormElement_private_put_enctype, + HTMLFormElement_private_get_enctype, + HTMLFormElement_private_put_noValidate, + HTMLFormElement_private_get_noValidate, + HTMLFormElement_private_checkValidity, +}; + static inline HTMLFormElement *impl_from_DispatchEx(DispatchEx *iface) { return CONTAINING_RECORD(iface, HTMLFormElement, element.node.event_target.dispex); @@ -580,6 +639,8 @@ static void *HTMLFormElement_query_interface(DispatchEx *dispex, REFIID riid) return &This->IHTMLFormElement_iface; if(IsEqualGUID(&DIID_DispHTMLFormElement, riid)) return &This->IHTMLFormElement_iface; + if(IsEqualGUID(&IID_IWineHTMLFormPrivate, riid)) + return &This->IWineHTMLFormPrivate_iface;
return HTMLElement_query_interface(&This->element.node.event_target.dispex, riid); } @@ -765,7 +826,15 @@ static void HTMLFormElement_init_dispex_info(dispex_data_t *info, compat_mode_t {DISPID_COLLECTION, .noattr = TRUE}, {DISPID_UNKNOWN} }; + static const dispex_hook_t private_ie9_hooks[] = { + {DISPID_IWINEHTMLFORMPRIVATE_NOVALIDATE}, + {DISPID_IWINEHTMLFORMPRIVATE_CHECKVALIDITY}, + {DISPID_UNKNOWN} + }; + dispex_info_add_interface(info, IHTMLFormElement_tid, hooks); + if(mode >= COMPAT_MODE_IE9) + dispex_info_add_interface(info, IWineHTMLFormPrivate_tid, mode < COMPAT_MODE_IE10 ? private_ie9_hooks : NULL);
HTMLElement_init_dispex_info(info, mode); } @@ -805,6 +874,7 @@ HRESULT HTMLFormElement_Create(HTMLDocumentNode *doc, nsIDOMElement *nselem, HTM return E_OUTOFMEMORY;
ret->IHTMLFormElement_iface.lpVtbl = &HTMLFormElementVtbl; + ret->IWineHTMLFormPrivate_iface.lpVtbl = &WineHTMLFormPrivateVtbl; ret->element.node.vtbl = &HTMLFormElementImplVtbl;
HTMLElement_Init(&ret->element, doc, nselem, &HTMLFormElement_dispex); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index e0b8a693757..2f59e0dca5d 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -311,6 +311,8 @@ struct constructor; XIID(IWineHTMLCharacterData) \ XIID(IWineHTMLDOMNodePrivate) \ XIID(IWineHTMLElementPrivate) \ + XIID(IWineHTMLInputPrivate) \ + XIID(IWineHTMLFormPrivate) \ XIID(IWineHTMLWindowPrivate) \ XIID(IWineHTMLWindowCompatPrivate) \ XIID(IWineCSSProperties) \ diff --git a/dlls/mshtml/mshtml_private_iface.idl b/dlls/mshtml/mshtml_private_iface.idl index 5214315c743..f0c13b50233 100644 --- a/dlls/mshtml/mshtml_private_iface.idl +++ b/dlls/mshtml/mshtml_private_iface.idl @@ -203,6 +203,55 @@ interface IWineHTMLElementPrivate : IDispatch HRESULT classList([retval, out] IDispatch **class_list); }
+const long DISPID_IWINEHTMLFORMPRIVATE_NOVALIDATE = 51; +const long DISPID_IWINEHTMLFORMPRIVATE_CHECKVALIDITY = 52; +[ + odl, + oleautomation, + dual, + hidden, + uuid(8a11c39f-12e3-dcc3-14ec-479ba0bddac1) +] +interface IWineHTMLFormPrivate : IDispatch +{ + [propput, id(50)] + HRESULT enctype([in] BSTR v); + [propget, id(50)] + HRESULT enctype([retval, out] BSTR *ret); + [propput, id(DISPID_IWINEHTMLFORMPRIVATE_NOVALIDATE)] + HRESULT noValidate([in] VARIANT_BOOL v); + [propget, id(DISPID_IWINEHTMLFORMPRIVATE_NOVALIDATE)] + HRESULT noValidate([retval, out] VARIANT_BOOL *ret); + [id(DISPID_IWINEHTMLFORMPRIVATE_CHECKVALIDITY)] + HRESULT checkValidity([retval, out] VARIANT_BOOL *ret); +} + +const long DISPID_IWINEHTMLINPUTPRIVATE_AUTOFOCUS = 50; +[ + odl, + oleautomation, + dual, + hidden, + uuid(f356f6d2-f210-4f54-24c7-3f88fa3c20fc) +] +interface IWineHTMLInputPrivate : IDispatch +{ + [propput, id(DISPID_IWINEHTMLINPUTPRIVATE_AUTOFOCUS)] + HRESULT autofocus([in] VARIANT_BOOL v); + [propget, id(DISPID_IWINEHTMLINPUTPRIVATE_AUTOFOCUS)] + HRESULT autofocus([retval, out] VARIANT_BOOL *ret); + [propget, id(51)] + HRESULT validationMessage([retval, out] BSTR *ret); + [propget, id(52)] + HRESULT validity([retval, out] IDispatch **ret); + [propget, id(53)] + HRESULT willValidate([retval, out] VARIANT_BOOL *ret); + [id(54)] + HRESULT setCustomValidity([in] VARIANT *message); + [id(55)] + HRESULT checkValidity([retval, out] VARIANT_BOOL *ret); +} + [ odl, oleautomation, diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index acee34c8bc1..b4ad5dd39bd 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -4326,7 +4326,7 @@ sync_test("prototype props", function() { check(HTMLFormElement, [ "acceptCharset", "action", ["autocomplete",10], ["checkValidity",10], "elements", "encoding", "enctype", "item", "length", "method", "name", "namedItem", ["noValidate",10], "reset", "submit", "tags", "target", "urns" - ], [ "_newEnum", "acceptCharset", ["autocomplete",10], ["checkValidity",10], "enctype", "namedItem", ["noValidate",10], "urns" ]); + ], [ "_newEnum", "acceptCharset", ["autocomplete",10], "namedItem", "urns" ]); check(HTMLFrameElement, [ "border", "borderColor", "contentDocument", "contentWindow", ["dataFld",9,10], ["dataFormatAs",9,10], ["dataSrc",9,10], "frameBorder", "frameSpacing", "getSVGDocument", "height", "longDesc", "marginHeight", "marginWidth", "name", "noResize", "onload", "scrolling", "security", "src", "width"