diff options
Diffstat (limited to 'components/script')
-rwxr-xr-x[-rw-r--r--] | components/script/dom/htmlbuttonelement.rs | 13 | ||||
-rwxr-xr-x[-rw-r--r--] | components/script/dom/htmlformelement.rs | 45 | ||||
-rwxr-xr-x[-rw-r--r--] | components/script/dom/htmlinputelement.rs | 12 | ||||
-rwxr-xr-x[-rw-r--r--] | components/script/dom/htmlobjectelement.rs | 13 | ||||
-rwxr-xr-x[-rw-r--r--] | components/script/dom/htmlselectelement.rs | 13 | ||||
-rwxr-xr-x[-rw-r--r--] | components/script/dom/htmltextareaelement.rs | 1 | ||||
-rwxr-xr-x[-rw-r--r--] | components/script/dom/validation.rs | 6 | ||||
-rwxr-xr-x[-rw-r--r--] | components/script/dom/validitystate.rs | 15 |
8 files changed, 103 insertions, 15 deletions
diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index b309da6466a..f266f0236c5 100644..100755 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -21,7 +21,7 @@ use dom::htmlformelement::HTMLFormElement; use dom::node::{Node, UnbindContext, document_from_node, window_from_node}; use dom::nodelist::NodeList; use dom::validation::Validatable; -use dom::validitystate::ValidityState; +use dom::validitystate::{ValidityState, ValidationFlags}; use dom::virtualmethods::VirtualMethods; use html5ever_atoms::LocalName; use std::cell::Cell; @@ -238,7 +238,16 @@ impl VirtualMethods for HTMLButtonElement { impl FormControl for HTMLButtonElement {} -impl Validatable for HTMLButtonElement {} +impl Validatable for HTMLButtonElement { + fn is_instance_validatable(&self) -> bool { + true + } + fn validate(&self, validate_flags: ValidationFlags) -> bool { + if validate_flags.is_empty() {} + // Need more flag check for different validation types later + true + } +} impl Activatable for HTMLButtonElement { fn as_element(&self) -> &Element { diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 1af3914db2c..f98e44129b1 100644..100755 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -35,6 +35,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; @@ -470,12 +471,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 } @@ -697,7 +708,7 @@ pub enum FormSubmittableElement { // KeygenElement(&'a HTMLKeygenElement), ObjectElement(Root<HTMLObjectElement>), SelectElement(Root<HTMLSelectElement>), - TextAreaElement(Root<HTMLTextAreaElement>) + TextAreaElement(Root<HTMLTextAreaElement>), } impl FormSubmittableElement { @@ -710,6 +721,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)] diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index ddbd57d2438..90cf630e9fe 100644..100755 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -31,6 +31,7 @@ use dom::node::{Node, NodeDamage, UnbindContext}; use dom::node::{document_from_node, window_from_node}; use dom::nodelist::NodeList; use dom::validation::Validatable; +use dom::validitystate::ValidationFlags; use dom::virtualmethods::VirtualMethods; use html5ever_atoms::LocalName; use ipc_channel::ipc::{self, IpcSender}; @@ -1131,7 +1132,16 @@ impl VirtualMethods for HTMLInputElement { impl FormControl for HTMLInputElement {} -impl Validatable for HTMLInputElement {} +impl Validatable for HTMLInputElement { + fn is_instance_validatable(&self) -> bool { + // https://html.spec.whatwg.org/multipage/#candidate-for-constraint-validation + true + } + fn validate(&self, _validate_flags: ValidationFlags) -> bool { + // call stub methods defined in validityState.rs file here according to the flags set in validate_flags + true + } +} impl Activatable for HTMLInputElement { fn as_element(&self) -> &Element { diff --git a/components/script/dom/htmlobjectelement.rs b/components/script/dom/htmlobjectelement.rs index 8e934b96808..d04f989ce5e 100644..100755 --- a/components/script/dom/htmlobjectelement.rs +++ b/components/script/dom/htmlobjectelement.rs @@ -15,7 +15,7 @@ use dom::htmlelement::HTMLElement; use dom::htmlformelement::{FormControl, HTMLFormElement}; use dom::node::{Node, window_from_node}; use dom::validation::Validatable; -use dom::validitystate::ValidityState; +use dom::validitystate::{ValidityState, ValidationFlags}; use dom::virtualmethods::VirtualMethods; use html5ever_atoms::LocalName; use net_traits::image::base::Image; @@ -89,7 +89,16 @@ impl HTMLObjectElementMethods for HTMLObjectElement { } } -impl Validatable for HTMLObjectElement {} +impl Validatable for HTMLObjectElement { + fn is_instance_validatable(&self) -> bool { + true + } + fn validate(&self, validate_flags: ValidationFlags) -> bool { + if validate_flags.is_empty() {} + // Need more flag check for different validation types later + true + } +} impl VirtualMethods for HTMLObjectElement { fn super_type(&self) -> Option<&VirtualMethods> { diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 8a5f2529d6a..ad66f2b05f3 100644..100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -28,7 +28,7 @@ use dom::htmloptionscollection::HTMLOptionsCollection; use dom::node::{Node, UnbindContext, window_from_node}; use dom::nodelist::NodeList; use dom::validation::Validatable; -use dom::validitystate::ValidityState; +use dom::validitystate::{ValidityState, ValidationFlags}; use dom::virtualmethods::VirtualMethods; use html5ever_atoms::LocalName; use style::attr::AttrValue; @@ -384,4 +384,13 @@ impl VirtualMethods for HTMLSelectElement { impl FormControl for HTMLSelectElement {} -impl Validatable for HTMLSelectElement {} +impl Validatable for HTMLSelectElement { + fn is_instance_validatable(&self) -> bool { + true + } + fn validate(&self, validate_flags: ValidationFlags) -> bool { + if validate_flags.is_empty() {} + // Need more flag check for different validation types later + true + } +} diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 268998c8e58..47b9bb6ee0b 100644..100755 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -406,4 +406,5 @@ impl VirtualMethods for HTMLTextAreaElement { impl FormControl for HTMLTextAreaElement {} + impl Validatable for HTMLTextAreaElement {} diff --git a/components/script/dom/validation.rs b/components/script/dom/validation.rs index e9a6a156848..7ba915092a2 100644..100755 --- a/components/script/dom/validation.rs +++ b/components/script/dom/validation.rs @@ -1,5 +1,9 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use dom::validitystate::ValidationFlags; -pub trait Validatable {} +pub trait Validatable { + fn is_instance_validatable(&self) -> bool { true } + fn validate(&self, _validate_flags: ValidationFlags) -> bool { true } +} diff --git a/components/script/dom/validitystate.rs b/components/script/dom/validitystate.rs index c6bb0761f3c..10801120871 100644..100755 --- a/components/script/dom/validitystate.rs +++ b/components/script/dom/validitystate.rs @@ -26,6 +26,21 @@ pub enum ValidityStatus { Valid } +bitflags!{ + pub flags ValidationFlags: u32 { + const VALUE_MISSING = 0b0000000001, + const TYPE_MISMATCH = 0b0000000010, + const PATTERN_MISMATCH = 0b0000000100, + const TOO_LONG = 0b0000001000, + const TOO_SHORT = 0b0000010000, + const RANGE_UNDERFLOW = 0b0000100000, + const RANGE_OVERFLOW = 0b0001000000, + const STEP_MISMATCH = 0b0010000000, + const BAD_INPUT = 0b0100000000, + const CUSTOM_ERROR = 0b1000000000, + } +} + // https://html.spec.whatwg.org/multipage/#validitystate #[dom_struct] pub struct ValidityState { |