aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rwxr-xr-x[-rw-r--r--]components/script/dom/htmlbuttonelement.rs13
-rwxr-xr-x[-rw-r--r--]components/script/dom/htmlformelement.rs45
-rwxr-xr-x[-rw-r--r--]components/script/dom/htmlinputelement.rs12
-rwxr-xr-x[-rw-r--r--]components/script/dom/htmlobjectelement.rs13
-rwxr-xr-x[-rw-r--r--]components/script/dom/htmlselectelement.rs13
-rwxr-xr-x[-rw-r--r--]components/script/dom/htmltextareaelement.rs1
-rwxr-xr-x[-rw-r--r--]components/script/dom/validation.rs6
-rwxr-xr-x[-rw-r--r--]components/script/dom/validitystate.rs15
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 {