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::(); // 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::() { 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::(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::().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 + () } - _ => None + HTMLElementTypeId::HTMLSelectElement => { + let select = child.downcast::().unwrap(); + select.push_form_data(&mut data_set); + } + HTMLElementTypeId::HTMLTextAreaElement => { + let textarea = child.downcast::().unwrap(); + let name = textarea.Name(); + if !name.is_empty() { + data_set.push(FormDatum { + ty: textarea.Type(), + name: name, + value: textarea.Value() + }); + } + } + _ => () } } - _ => 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) { + let node = self.upcast::(); + if self.Name().is_empty() { + return; + } + for opt in node.traverse_preorder().filter_map(Root::downcast::) { + let element = opt.upcast::(); + 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 -