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,