diff options
author | Bhavya Bansal <bbansal@ncsu.edu> | 2016-10-28 18:12:20 -0700 |
---|---|---|
committer | Bhavya Bansal <bbansal@ncsu.edu> | 2016-11-23 22:46:57 -0800 |
commit | 2a408778518050d3632ad5c2694a96ae0b219cd9 (patch) | |
tree | d7c0c75d34f70c9454312b9df82fe3b46a78891f /components/script/dom/htmlformelement.rs | |
parent | e4fcc066d1248dc072026ba1dd887ffca5049c53 (diff) | |
download | servo-2a408778518050d3632ad5c2694a96ae0b219cd9.tar.gz servo-2a408778518050d3632ad5c2694a96ae0b219cd9.zip |
html form validation initial steps with test html file, added stub methods, added code to handle validations
Diffstat (limited to 'components/script/dom/htmlformelement.rs')
-rwxr-xr-x[-rw-r--r--] | components/script/dom/htmlformelement.rs | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 78167022773..6a9f0196cd4 100644..100755 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -36,6 +36,7 @@ use dom::htmloutputelement::HTMLOutputElement; use dom::htmlselectelement::HTMLSelectElement; use dom::htmltextareaelement::HTMLTextAreaElement; use dom::node::{Node, document_from_node, window_from_node}; +use dom::validitystate::ValidationFlags; use dom::virtualmethods::VirtualMethods; use encoding::EncodingRef; use encoding::all::UTF_8; @@ -469,12 +470,22 @@ impl HTMLFormElement { // form, refactor this when html5ever's form owner PR lands // Step 1-3 let invalid_controls = node.traverse_preorder().filter_map(|field| { - if let Some(_el) = field.downcast::<Element>() { - None // Remove this line if you decide to refactor - - // XXXKiChjang: Form control elements should each have a candidate_for_validation - // and satisfies_constraints methods - + if let Some(el) = field.downcast::<Element>() { + if el.disabled_state() { + None + } else { + let validatable = match el.as_maybe_validatable() { + Some(v) => v, + None => return None + }; + if !validatable.is_instance_validatable() { + None + } else if validatable.validate(ValidationFlags::empty()) { + None + } else { + Some(FormSubmittableElement::from_element(&el)) + } + } } else { None } @@ -700,7 +711,7 @@ pub enum FormSubmittableElement { // KeygenElement(&'a HTMLKeygenElement), ObjectElement(Root<HTMLObjectElement>), SelectElement(Root<HTMLSelectElement>), - TextAreaElement(Root<HTMLTextAreaElement>) + TextAreaElement(Root<HTMLTextAreaElement>), } impl FormSubmittableElement { @@ -713,6 +724,26 @@ impl FormSubmittableElement { FormSubmittableElement::TextAreaElement(ref textarea) => textarea.upcast() } } + + fn from_element(element: &Element) -> FormSubmittableElement { + if let Some(input) = element.downcast::<HTMLInputElement>() { + FormSubmittableElement::InputElement(Root::from_ref(&input)) + } + else if let Some(input) = element.downcast::<HTMLButtonElement>() { + FormSubmittableElement::ButtonElement(Root::from_ref(&input)) + } + else if let Some(input) = element.downcast::<HTMLObjectElement>() { + FormSubmittableElement::ObjectElement(Root::from_ref(&input)) + } + else if let Some(input) = element.downcast::<HTMLSelectElement>() { + FormSubmittableElement::SelectElement(Root::from_ref(&input)) + } + else if let Some(input) = element.downcast::<HTMLTextAreaElement>() { + FormSubmittableElement::TextAreaElement(Root::from_ref(&input)) + } else { + unreachable!() + } + } } #[derive(Copy, Clone, HeapSizeOf)] |