Part 2: Activation behavior method for button element.

Differential Revision: https://phabricator.services.mozilla.com/D183989

bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1855633
gecko-commit: 7902e114b8c7f373899f8dc53fa052201898b333
gecko-reviewers: edgar
diff --git a/html/semantics/forms/the-button-element/button-click-submits.html b/html/semantics/forms/the-button-element/button-click-submits.html
index f09d060..86b9240 100644
--- a/html/semantics/forms/the-button-element/button-click-submits.html
+++ b/html/semantics/forms/the-button-element/button-click-submits.html
@@ -198,7 +198,6 @@
   }));
 
   span.addEventListener("click", t.step_func(ev => {
-    ev.preventDefault();
     t.step_timeout(() => t.done(), 500);
   }));
 
@@ -207,4 +206,27 @@
 
 }, "clicking the child of a button by dispatching a non-bubbling event should not trigger submit");
 
+async_test(t => {
+
+  const form = document.createElement("form");
+  const button = document.createElement("button");
+  button.disabled = true;
+  const span = document.createElement("span");
+  button.appendChild(span);
+  form.appendChild(button);
+  document.body.appendChild(form);
+
+  form.addEventListener("submit", t.step_func_done(ev => {
+    ev.preventDefault();
+    assert_unreached("Form should not be submitted");
+  }));
+
+  span.addEventListener("click", t.step_func(ev => {
+    assert_true(true, "span was clicked");
+    t.step_timeout(() => t.done(), 500);
+  }));
+
+  span.click();
+
+}, "clicking the child of a disabled button with .click() should not trigger submit");
 </script>
diff --git a/html/semantics/forms/the-button-element/button-submit-children.html b/html/semantics/forms/the-button-element/button-submit-children.html
index 06218f4..9cec2bd 100644
--- a/html/semantics/forms/the-button-element/button-submit-children.html
+++ b/html/semantics/forms/the-button-element/button-submit-children.html
@@ -7,11 +7,13 @@
 
 <iframe name=frame1 id=frame1></iframe>
 <form id=form1 target=frame1 action="does_not_exist.html">
-  <button id=submitbutton type=submit>
-    <div id=buttonchilddiv>
-      button child div text
-    </div>
-  </button>
+  <div id=parentdiv>
+    <button id=submitbutton type=submit>
+      <div id=buttonchilddiv>
+        button child div text
+      </div>
+    </button>
+  </div>
 </form>
 
 <script>
@@ -31,4 +33,26 @@
     buttonChildDiv.click();
   });
 }, 'This test will pass if a form navigation successfully occurs when clicking a child element of a <button type=submit> element with a onclick event handler which prevents the default form submission and manually calls form.submit() instead.');
+
+async_test(t => {
+  window.addEventListener('load', () => {
+    const frame1 = document.getElementById('frame1');
+    frame1.addEventListener('load', t.step_func_done(() => {}));
+
+    const submitButton = document.getElementById('submitbutton');
+    submitButton.addEventListener('click', event => {
+      const form = document.getElementById('form1');
+      form.submit();
+    });
+
+    const parentDiv = document.getElementById("parentdiv");
+    parentDiv.addEventListener("click", event => {
+      // event was already handled for the button
+      // but it's activation behavior won't have run yet and we prevent that now
+      event.preventDefault();
+    })
+
+    submitButton.click();
+  });
+}, "clicking a submit button, which calls form.submit and has a parent calling e.prevenDefault() should still submit the form");
 </script>