From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 2 ++ dlls/mshtml/htmlevent.h | 1 + dlls/mshtml/htmlinput.c | 13 +++++++++++-- dlls/mshtml/nsiface.idl | 20 +++++++++++++++++++- dlls/mshtml/tests/es5.js | 23 +++++++++++++++++++++++ 5 files changed, 56 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 3d6df5e2b44..cb5c1127bd2 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -161,6 +161,8 @@ static const event_info_t event_info[] = { EVENT_BUBBLES | EVENT_CANCELABLE}, {L"input", EVENT_TYPE_EVENT, DISPID_UNKNOWN, EVENT_DEFAULTLISTENER | EVENT_BUBBLES}, + {L"invalid", EVENT_TYPE_EVENT, DISPID_EVPROP_INVALID, + EVENT_BIND_TO_TARGET | EVENT_CANCELABLE}, {L"keydown", EVENT_TYPE_KEYBOARD, DISPID_EVMETH_ONKEYDOWN, EVENT_DEFAULTLISTENER | EVENT_HASDEFAULTHANDLERS | EVENT_BUBBLES | EVENT_CANCELABLE }, {L"keypress", EVENT_TYPE_KEYBOARD, DISPID_EVMETH_ONKEYPRESS, diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index 6dec8cf9a9a..3f4e11690f8 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -40,6 +40,7 @@ typedef enum { EVENTID_FOCUSOUT, EVENTID_HELP, EVENTID_INPUT, + EVENTID_INVALID, EVENTID_KEYDOWN, EVENTID_KEYPRESS, EVENTID_KEYUP, diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c index 117e8008690..3f3894fda80 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -1245,8 +1245,17 @@ static HRESULT WINAPI HTMLInputElement_private_setCustomValidity(IWineHTMLInputP static HRESULT WINAPI HTMLInputElement_private_checkValidity(IWineHTMLInputPrivate *iface, VARIANT_BOOL *ret) { HTMLInputElement *This = impl_from_IWineHTMLInputPrivateVtbl(iface); - FIXME("(%p)->(%p)\n", This, ret); - return E_NOTIMPL; + nsresult nsres; + cpp_bool b; + + TRACE("(%p)->(%p)\n", This, ret); + + nsres = nsIDOMHTMLInputElement_CheckValidity(This->nsinput, &b); + if(NS_FAILED(nsres)) + return map_nsresult(nsres); + + *ret = variant_bool(b); + return S_OK; }
static const IWineHTMLInputPrivateVtbl WineHTMLInputPrivateVtbl = { diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl index 1f2131dfb24..dd4aeba27df 100644 --- a/dlls/mshtml/nsiface.idl +++ b/dlls/mshtml/nsiface.idl @@ -161,7 +161,6 @@ typedef nsISupports nsITransferable; typedef nsISupports nsIDOMFileList; typedef nsISupports nsIDOMFile; typedef nsISupports nsIControllers; -typedef nsISupports nsIDOMValidityState; typedef nsISupports nsIPluginInstanceOwner; typedef nsISupports nsIPluginStreamListener; typedef nsISupports nsIPluginTag; @@ -976,6 +975,25 @@ interface nsIDOMMozNamedAttrMap : nsISupports nsresult RemoveNamedItemNS(const nsAString *namespaceURI, const nsAString *localName, nsIDOMAttr **_retval); }
+[ + object, + uuid(00bed276-f1f7-492f-a039-dbd9b9efc10b), + local +] +interface nsIDOMValidityState : nsISupports +{ + nsresult GetValueMissing(bool *_retval); + nsresult GetTypeMismatch(bool *_retval); + nsresult GetPatternMismatch(bool *_retval); + nsresult GetTooLong(bool *_retval); + nsresult GetRangeUnderflow(bool *_retval); + nsresult GetRangeOverflow(bool *_retval); + nsresult GetStepMismatch(bool *_retval); + nsresult GetBadInput(bool *_retval); + nsresult GetCustomError(bool *_retval); + nsresult GetValid(bool *_retval); +} + [ object, uuid(cc35b412-009b-46a3-9be0-76448f12548d), diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 6a3f24a265f..402be2f9d9a 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2594,6 +2594,29 @@ sync_test("functions scope", function() { })(); });
+sync_test("input validation", function() { + var fired, elem = document.createElement("input"); + elem.type = "number"; + elem.setAttribute("min", "1"); + elem.setAttribute("max", "4"); + elem.addEventListener("invalid", function(e) { + ok(e.target === elem, "unexpected target " + e.target); + fired = true; + }); + fired = false; + elem.value = 1; + ok(elem.checkValidity() === true, "input number (1-4) with value 1: invalid"); + ok(fired === false, "input number (1-4) with value 1 fired invalid event"); + fired = false; + elem.value = 0; + ok(elem.checkValidity() === false, "input number (1-4) with value 0: valid"); + ok(fired === true, "input number (1-4) with value 0 did not fire invalid event"); + fired = false; + elem.value = 5; + ok(elem.checkValidity() === false, "input number (1-4) with value 5: valid"); + ok(fired === true, "input number (1-4) with value 5 did not fire invalid event"); +}); + sync_test("perf toJSON", function() { var json, objs = [ performance, performance.navigation, performance.timing ]; var non_props = [ "constructor", "TYPE_BACK_FORWARD", "TYPE_NAVIGATE", "TYPE_RELOAD", "TYPE_RESERVED" ];