diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index 82e88bdc355..43f0f925971 100644 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -14,8 +14,9 @@ use dom::event::Event; use dom::eventtarget::EventTarget; use dom::htmlelement::HTMLElement; use dom::htmlfieldsetelement::HTMLFieldSetElement; -use dom::htmlformelement::{FormControl, FormSubmitter, ResetFrom}; -use dom::htmlformelement::{SubmittedFrom, HTMLFormElement}; +use dom::htmlformelement::HTMLFormElement; +use dom::htmlformelement::{FormControl, FormDatum, FormDatumValue}; +use dom::htmlformelement::{FormSubmitter, ResetFrom, SubmittedFrom}; use dom::node::{Node, UnbindContext, document_from_node, window_from_node}; use dom::nodelist::NodeList; use dom::validation::Validatable; @@ -137,6 +138,39 @@ impl HTMLButtonElementMethods for HTMLButtonElement { } } +impl HTMLButtonElement { + /// https://html.spec.whatwg.org/multipage/#constructing-the-form-data-set + /// Steps range from 3.1 to 3.7 (specific to HTMLButtonElement) + pub fn form_datum(&self, submitter: Option) -> Option { + // Step 3.1: disabled state check is in get_unclean_dataset + + // Step 3.1: only run steps if this is the submitter + if let Some(FormSubmitter::ButtonElement(submitter)) = submitter { + if submitter != self { + return None + } + } else { + return None + } + // Step 3.2 + let ty = self.Type(); + // Step 3.4 + let name = self.Name(); + + if name.is_empty() { + // Step 3.1: Must have a name + return None; + } + + // Step 3.9 + Some(FormDatum { + ty: ty, + name: name, + value: FormDatumValue::String(self.Value()) + }) + } +} + impl VirtualMethods for HTMLButtonElement { fn super_type(&self) -> Option<&VirtualMethods> { Some(self.upcast::() as &VirtualMethods) diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index aff02b534b1..25d4ed3cd5a 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -548,7 +548,12 @@ impl HTMLFormElement { data_set.push(datum); } } - HTMLElementTypeId::HTMLButtonElement | + HTMLElementTypeId::HTMLButtonElement => { + let button = child.downcast::().unwrap(); + if let Some(datum) = button.form_datum(submitter) { + data_set.push(datum); + } + } HTMLElementTypeId::HTMLObjectElement => { // Unimplemented () diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 4eb1d4d9ba0..e91a37d183a 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -623,8 +623,10 @@ impl HTMLInputElement { } /// https://html.spec.whatwg.org/multipage/#constructing-the-form-data-set - /// Steps range from 3.1 to 3.7 which related to the HTMLInputElement + /// Steps range from 3.1 to 3.7 (specific to HTMLInputElement) pub fn form_datum(&self, submitter: Option) -> Option { + // 3.1: disabled state check is in get_unclean_dataset + // Step 3.2 let ty = self.type_(); // Step 3.4 @@ -652,7 +654,7 @@ impl HTMLInputElement { } - // Step 3.6 + // Step 3.9 Some(FormDatum { ty: DOMString::from(&*ty), // FIXME(ajeffrey): Convert directly from Atoms to DOMStrings name: name, diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/submit-entity-body.html b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/submit-entity-body.html index 736ef1318b1..0edc0f3df2d 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/submit-entity-body.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/submit-entity-body.html @@ -66,6 +66,21 @@ var simple_tests = [ enctype: "text/plain", submitelement: "Submit", submitaction: function(doc) { doc.getElementById("inputsubmit").click(); } + }, + { + name: "form submission from submit input should contain submit button value", + input: "", + enctype: "application/x-www-form-urlencoded", + submitelement: "", + submitaction: function(doc) { doc.getElementById("inputsubmit").click(); } + } +, + { + name: "form submission from submit button should contain submit button value", + input: "", + enctype: "application/x-www-form-urlencoded", + submitelement: "", + submitaction: function(doc) { doc.getElementById("inputsubmit").click(); } } ]; simple_tests.forEach(function(test_obj) {