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>