aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas <ashlebede@gmail.com>2015-10-07 19:18:39 -0400
committerNicolas <ashlebede@gmail.com>2015-12-30 00:27:35 -0500
commit1f234af2ac646509dc83754404ce45d653be9df9 (patch)
tree834bd771f0f8d73f3d12c0129e5e9551ad5d2c7f
parent2bb6ea1321d5500ef5b6c9bbc943801acaf0e49a (diff)
downloadservo-1f234af2ac646509dc83754404ce45d653be9df9.tar.gz
servo-1f234af2ac646509dc83754404ce45d653be9df9.zip
form submission for <textarea> and <select>
small changes from code review !child.get_disabled_state() becomes child.get_enabled_state()
-rw-r--r--components/script/dom/htmlformelement.rs40
-rw-r--r--components/script/dom/htmlselectelement.rs19
-rw-r--r--tests/wpt/metadata/html/semantics/forms/form-submission-0/url-encoded.html.ini5
3 files changed, 47 insertions, 17 deletions
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index a8f9ce28db5..a53c37f84e4 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -9,6 +9,7 @@ use dom::bindings::codegen::Bindings::HTMLButtonElementBinding::HTMLButtonElemen
use dom::bindings::codegen::Bindings::HTMLFormElementBinding;
use dom::bindings::codegen::Bindings::HTMLFormElementBinding::HTMLFormElementMethods;
use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods;
+use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods;
use dom::bindings::conversions::DerivedFrom;
use dom::bindings::global::GlobalRef;
use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
@@ -293,17 +294,18 @@ impl HTMLFormElement {
let node = self.upcast::<Node>();
// FIXME(#3553): This is an incorrect way of getting controls owned
// by the form, but good enough until html5ever lands
- node.traverse_preorder().filter_map(|child| {
+ let mut data_set = Vec::new();
+ for child in node.traverse_preorder() {
// Step 3.1: The field element is disabled.
match child.downcast::<Element>() {
Some(el) if !el.get_disabled_state() => (),
- _ => return None,
+ _ => continue,
}
// Step 3.1: The field element has a datalist element ancestor.
if child.ancestors()
.any(|a| Root::downcast::<HTMLDataListElement>(a).is_some()) {
- return None;
+ continue;
}
match child.type_id() {
NodeTypeId::Element(ElementTypeId::HTMLElement(element)) => {
@@ -311,21 +313,37 @@ impl HTMLFormElement {
HTMLElementTypeId::HTMLInputElement => {
let input = child.downcast::<HTMLInputElement>().unwrap();
// Step 3.2-3.7
- input.get_form_datum(submitter)
+ if let Some(datum) = input.get_form_datum(submitter) {
+ data_set.push(datum);
+ }
}
HTMLElementTypeId::HTMLButtonElement |
- HTMLElementTypeId::HTMLSelectElement |
- HTMLElementTypeId::HTMLObjectElement |
- HTMLElementTypeId::HTMLTextAreaElement => {
+ HTMLElementTypeId::HTMLObjectElement => {
// Unimplemented
- None
+ ()
+ }
+ HTMLElementTypeId::HTMLSelectElement => {
+ let select = child.downcast::<HTMLSelectElement>().unwrap();
+ select.push_form_data(&mut data_set);
+ }
+ HTMLElementTypeId::HTMLTextAreaElement => {
+ let textarea = child.downcast::<HTMLTextAreaElement>().unwrap();
+ let name = textarea.Name();
+ if !name.is_empty() {
+ data_set.push(FormDatum {
+ ty: textarea.Type(),
+ name: name,
+ value: textarea.Value()
+ });
+ }
}
- _ => None
+ _ => ()
}
}
- _ => None
+ _ => ()
}
- }).collect()
+ }
+ data_set
// TODO: Handle `dirnames` (needs directionality support)
// https://html.spec.whatwg.org/multipage/#the-directionality
}
diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs
index daf4d6f9ba5..6db068d6da2 100644
--- a/components/script/dom/htmlselectelement.rs
+++ b/components/script/dom/htmlselectelement.rs
@@ -14,7 +14,7 @@ use dom::document::Document;
use dom::element::{AttributeMutation, Element};
use dom::htmlelement::HTMLElement;
use dom::htmlfieldsetelement::HTMLFieldSetElement;
-use dom::htmlformelement::{FormControl, HTMLFormElement};
+use dom::htmlformelement::{FormControl, FormDatum, HTMLFormElement};
use dom::htmloptionelement::HTMLOptionElement;
use dom::node::{Node, UnbindContext, window_from_node};
use dom::nodelist::NodeList;
@@ -82,6 +82,23 @@ impl HTMLSelectElement {
}
}
+ pub fn push_form_data(&self, data_set: &mut Vec<FormDatum>) {
+ let node = self.upcast::<Node>();
+ if self.Name().is_empty() {
+ return;
+ }
+ for opt in node.traverse_preorder().filter_map(Root::downcast::<HTMLOptionElement>) {
+ let element = opt.upcast::<Element>();
+ if opt.Selected() && element.get_enabled_state() {
+ data_set.push(FormDatum {
+ ty: self.Type(),
+ name: self.Name(),
+ value: opt.Value()
+ });
+ }
+ }
+ }
+
// https://html.spec.whatwg.org/multipage/#concept-select-pick
pub fn pick_option(&self, picked: &HTMLOptionElement) {
if !self.Multiple() {
diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/url-encoded.html.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/url-encoded.html.ini
deleted file mode 100644
index 4f322ca7011..00000000000
--- a/tests/wpt/metadata/html/semantics/forms/form-submission-0/url-encoded.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[url-encoded.html]
- type: testharness
- [textarea.simple]
- expected: FAIL
-