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 92df6695f48..459811e9645 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 c2c76dd16e8..de5d3334f95 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -605,8 +605,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 @@ -634,7 +636,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,