diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index eabcbc41e6e7..66dcb4d6f476 100755
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -455,7 +455,27 @@ impl HTMLFormElement {
// Step 1-3
let _unhandled_invalid_controls = match self.static_validation() {
Ok(()) => return Ok(()),
- Err(err) => err
+ //Err(err) => err,
+ Err(err) => {
+ match err[0] {
+ FormSubmittableElement::InputElement(ref i) =>
+ println!("First element didn't pass: {}",
+ i.upcast::().get_string_attribute(&local_name!("name"))),
+ FormSubmittableElement::ButtonElement(ref i) =>
+ println!("First element didn't pass: {}",
+ i.upcast::().get_string_attribute(&local_name!("name"))),
+ FormSubmittableElement::SelectElement(ref i) =>
+ println!("First element didn't pass: {}",
+ i.upcast::().get_string_attribute(&local_name!("name"))),
+ FormSubmittableElement::TextAreaElement(ref i) =>
+ println!("First elment didn't pass: {}",
+ i.upcast::().get_string_attribute(&local_name!("name"))),
+ FormSubmittableElement::ObjectElement(ref i) =>
+ println!("First element didn't pass: {}",
+ i.upcast::().get_string_attribute(&local_name!("name"))),
+ };
+ }
+
};
// TODO: Report the problems with the constraints of at least one of
// the elements given in unhandled invalid controls to the user
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs
index eb344ef0a79c..4519f01ee21d 100755
--- a/components/script/dom/htmlinputelement.rs
+++ b/components/script/dom/htmlinputelement.rs
@@ -11,6 +11,7 @@ use dom::bindings::codegen::Bindings::FileListBinding::FileListMethods;
use dom::bindings::codegen::Bindings::HTMLInputElementBinding;
use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods;
use dom::bindings::codegen::Bindings::KeyboardEventBinding::KeyboardEventMethods;
+use dom::bindings::codegen::Bindings::ValidityStateBinding::ValidityStateMethods;
use dom::bindings::error::{Error, ErrorResult};
use dom::bindings::inheritance::Castable;
use dom::bindings::js::{JS, LayoutJS, MutNullableJS, Root, RootedReference};
@@ -32,6 +33,7 @@ use dom::node::{document_from_node, window_from_node};
use dom::nodelist::NodeList;
use dom::validation::Validatable;
use dom::validitystate::ValidationFlags;
+use dom::validitystate::ValidityState;
use dom::virtualmethods::VirtualMethods;
use html5ever_atoms::LocalName;
use ipc_channel::ipc::{self, IpcSender};
@@ -1139,6 +1141,21 @@ impl Validatable for HTMLInputElement {
}
fn validate(&self, _validate_flags: ValidationFlags) -> bool {
// call stub methods defined in validityState.rs file here according to the flags set in validate_flags
+ let window = window_from_node(self);
+ let el = self.upcast::();
+ let vs = ValidityState::new(&window, el);
+ if vs.ValueMissing() {
+ return false;
+ }
+ if vs.TooLong() {
+ return false;
+ }
+ if vs.TooShort() {
+ return false;
+ }
+ if vs.TypeMismatch() {
+ return false;
+ }
true
}
}
diff --git a/components/script/dom/validitystate.rs b/components/script/dom/validitystate.rs
index 10801120871d..ef638184d788 100755
--- a/components/script/dom/validitystate.rs
+++ b/components/script/dom/validitystate.rs
@@ -8,6 +8,8 @@ use dom::bindings::js::{JS, Root};
use dom::bindings::reflector::{Reflector, reflect_dom_object};
use dom::element::Element;
use dom::window::Window;
+use num_traits::ToPrimitive;
+use regex::Regex;
// https://html.spec.whatwg.org/multipage/#validity-states
#[derive(JSTraceable)]
@@ -69,11 +71,36 @@ impl ValidityState {
impl ValidityStateMethods for ValidityState {
// https://html.spec.whatwg.org/multipage/#dom-validitystate-valuemissing
fn ValueMissing(&self) -> bool {
+ if self.element.has_attribute(&local_name!("required")) {
+ let v = self.element.get_string_attribute(&local_name!("value"));
+ let n = self.element.get_string_attribute(&local_name!("name"));
+ if v.is_empty() {
+ println!("{} Value missing!", n);
+ return true;
+ }
+ }
false
}
// https://html.spec.whatwg.org/multipage/#dom-validitystate-typemismatch
fn TypeMismatch(&self) -> bool {
+ if self.element.has_attribute(&local_name!("type")) {
+ let content_type = self.element.get_string_attribute(&local_name!("type"));
+ let content_value = self.element.get_string_attribute(&local_name!("value"));
+ let re = match content_type.to_string().as_ref() {
+ "email" => Regex::new(r"^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$").unwrap(),
+ "url" => Regex::new(r"^[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)$").unwrap(),
+ "date" => Regex::new(r"^\d{1,2}\/\d{1,2}\/\d{4}$").unwrap(),
+ "tel" => Regex::new(r"^\d{3}-\d{2}-\d{4}$").unwrap(),
+ _ => Regex::new(r".*?").unwrap()
+ };
+ if re.is_match(&(content_value.to_string())) {
+ println!("Syntax wrong for {}", content_value);
+ return false;
+ } else {
+ return true;
+ }
+ }
false
}
@@ -84,11 +111,33 @@ impl ValidityStateMethods for ValidityState {
// https://html.spec.whatwg.org/multipage/#dom-validitystate-toolong
fn TooLong(&self) -> bool {
+ if self.element.has_attribute(&local_name!("maxlength")) {
+ let Max = self.element.get_string_attribute(&local_name!("maxlength")).to_string();
+ let v = self.element.get_string_attribute(&local_name!("value")).to_string();
+ let n = self.element.get_string_attribute(&local_name!("name"));
+ let l = v.len().to_i32().unwrap();
+ if l > Max.parse::().unwrap() {
+ println!("{} is too long for {}, maxlength is {} characters.", v, n, Max);
+ return true;
+ }
+ }
+
false
}
// https://html.spec.whatwg.org/multipage/#dom-validitystate-tooshort
fn TooShort(&self) -> bool {
+ if self.element.has_attribute(&local_name!("minlength")) {
+ let Min = self.element.get_string_attribute(&local_name!("minlength")).to_string();
+ let v = self.element.get_string_attribute(&local_name!("value")).to_string();
+ let n = self.element.get_string_attribute(&local_name!("name"));
+ let l = v.len().to_i32().unwrap();
+ if l < Min.parse::().unwrap() {
+ println!("{} is too short for {}, minlength is {} characters.", v, n, Min);
+ return true;
+ }
+ }
+
false
}