diff --git a/testing/web-platform/tests/html/semantics/forms/the-button-element/button-click-resets-with-commandfor.tentative.html b/testing/web-platform/tests/html/semantics/forms/the-button-element/button-click-resets-with-commandfor.tentative.html
new file mode 100644
index 0000000000000..08317ed8a4bfd
--- /dev/null
+++ b/testing/web-platform/tests/html/semantics/forms/the-button-element/button-click-resets-with-commandfor.tentative.html
@@ -0,0 +1,522 @@
+<
+!
+doctype
+html
+>
+<
+meta
+charset
+=
+"
+utf
+-
+8
+"
+/
+>
+<
+title
+>
+Clicking
+a
+button
+should
+submit
+the
+form
+<
+/
+title
+>
+<
+meta
+name
+=
+"
+author
+"
+title
+=
+"
+Keith
+Cirkel
+"
+href
+=
+"
+mailto
+:
+wpt
+keithcirkel
+.
+co
+.
+uk
+"
+/
+>
+<
+link
+rel
+=
+"
+help
+"
+href
+=
+"
+https
+:
+/
+/
+html
+.
+spec
+.
+whatwg
+.
+org
+/
+multipage
+/
+#
+attr
+-
+button
+-
+type
+-
+submit
+-
+state
+"
+/
+>
+<
+script
+src
+=
+"
+/
+resources
+/
+testharness
+.
+js
+"
+>
+<
+/
+script
+>
+<
+script
+src
+=
+"
+/
+resources
+/
+testharnessreport
+.
+js
+"
+>
+<
+/
+script
+>
+<
+form
+id
+=
+"
+form
+"
+>
+<
+button
+id
+=
+"
+button
+"
+type
+=
+"
+reset
+"
+>
+<
+/
+button
+>
+<
+/
+form
+>
+<
+script
+>
+const
+form
+=
+document
+.
+getElementById
+(
+"
+form
+"
+)
+;
+const
+button
+=
+document
+.
+getElementById
+(
+"
+button
+"
+)
+;
+function
+resetState
+(
+)
+{
+button
+.
+removeAttribute
+(
+"
+commandfor
+"
+)
+;
+button
+.
+removeAttribute
+(
+"
+command
+"
+)
+;
+button
+.
+removeAttribute
+(
+"
+disabled
+"
+)
+;
+button
+.
+removeAttribute
+(
+"
+form
+"
+)
+;
+button
+.
+setAttribute
+(
+"
+type
+"
+"
+reset
+"
+)
+;
+}
+test
+(
+(
+t
+)
+=
+>
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+button
+.
+setAttribute
+(
+"
+command
+"
+"
+-
+-
+foo
+"
+)
+;
+let
+called
+=
+false
+;
+form
+.
+addEventListener
+(
+"
+reset
+"
+(
+e
+)
+=
+>
+{
+called
+=
+true
+;
+}
+)
+;
+button
+.
+click
+(
+)
+;
+assert_true
+(
+called
+"
+reset
+should
+have
+been
+dispatched
+"
+)
+;
+}
+"
+clicking
+a
+reset
+button
+should
+trigger
+a
+reset
+(
+with
+command
+attribute
+)
+"
+)
+;
+test
+(
+(
+t
+)
+=
+>
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+button
+.
+setAttribute
+(
+"
+commandfor
+"
+"
+whatever
+"
+)
+;
+let
+called
+=
+false
+;
+form
+.
+addEventListener
+(
+"
+reset
+"
+(
+e
+)
+=
+>
+{
+called
+=
+true
+;
+}
+)
+;
+button
+.
+click
+(
+)
+;
+assert_true
+(
+called
+"
+reset
+should
+have
+been
+dispatched
+"
+)
+;
+}
+"
+clicking
+a
+button
+should
+trigger
+a
+reset
+(
+with
+commandfor
+attribute
+)
+"
+)
+;
+test
+(
+(
+t
+)
+=
+>
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+button
+.
+setAttribute
+(
+"
+command
+"
+"
+-
+-
+foo
+"
+)
+;
+button
+.
+setAttribute
+(
+"
+commandfor
+"
+"
+whatever
+"
+)
+;
+let
+called
+=
+false
+;
+form
+.
+addEventListener
+(
+"
+reset
+"
+(
+e
+)
+=
+>
+{
+called
+=
+true
+;
+}
+)
+;
+button
+.
+click
+(
+)
+;
+assert_true
+(
+called
+"
+reset
+should
+have
+been
+dispatched
+"
+)
+;
+}
+"
+clicking
+a
+button
+should
+trigger
+a
+reset
+(
+with
+command
+and
+commandfor
+attribute
+)
+"
+)
+;
+<
+/
+script
+>
diff --git a/testing/web-platform/tests/html/semantics/forms/the-button-element/button-click-submits-with-commandfor.tentative.html b/testing/web-platform/tests/html/semantics/forms/the-button-element/button-click-submits-with-commandfor.tentative.html
new file mode 100644
index 0000000000000..e2cbb77fa1b56
--- /dev/null
+++ b/testing/web-platform/tests/html/semantics/forms/the-button-element/button-click-submits-with-commandfor.tentative.html
@@ -0,0 +1,930 @@
+<
+!
+doctype
+html
+>
+<
+meta
+charset
+=
+"
+utf
+-
+8
+"
+/
+>
+<
+title
+>
+Clicking
+a
+button
+should
+submit
+the
+form
+<
+/
+title
+>
+<
+meta
+name
+=
+"
+author
+"
+title
+=
+"
+Keith
+Cirkel
+"
+href
+=
+"
+mailto
+:
+wpt
+keithcirkel
+.
+co
+.
+uk
+"
+/
+>
+<
+link
+rel
+=
+"
+help
+"
+href
+=
+"
+https
+:
+/
+/
+html
+.
+spec
+.
+whatwg
+.
+org
+/
+multipage
+/
+#
+attr
+-
+button
+-
+type
+-
+submit
+-
+state
+"
+/
+>
+<
+script
+src
+=
+"
+/
+resources
+/
+testharness
+.
+js
+"
+>
+<
+/
+script
+>
+<
+script
+src
+=
+"
+/
+resources
+/
+testharnessreport
+.
+js
+"
+>
+<
+/
+script
+>
+<
+form
+id
+=
+"
+form
+"
+>
+<
+button
+id
+=
+"
+button
+"
+>
+<
+/
+button
+>
+<
+/
+form
+>
+<
+script
+>
+const
+form
+=
+document
+.
+getElementById
+(
+"
+form
+"
+)
+;
+const
+button
+=
+document
+.
+getElementById
+(
+"
+button
+"
+)
+;
+function
+resetState
+(
+)
+{
+button
+.
+removeAttribute
+(
+"
+commandfor
+"
+)
+;
+button
+.
+removeAttribute
+(
+"
+command
+"
+)
+;
+button
+.
+removeAttribute
+(
+"
+disabled
+"
+)
+;
+button
+.
+removeAttribute
+(
+"
+form
+"
+)
+;
+button
+.
+removeAttribute
+(
+"
+type
+"
+)
+;
+}
+test
+(
+(
+t
+)
+=
+>
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+button
+.
+setAttribute
+(
+"
+command
+"
+"
+-
+-
+foo
+"
+)
+;
+let
+called
+=
+false
+;
+form
+.
+addEventListener
+(
+"
+submit
+"
+(
+e
+)
+=
+>
+{
+e
+.
+preventDefault
+(
+)
+;
+called
+=
+true
+;
+}
+{
+once
+:
+true
+}
+)
+;
+button
+.
+click
+(
+)
+;
+assert_false
+(
+called
+"
+submit
+should
+not
+have
+been
+dispatched
+"
+)
+;
+}
+"
+clicking
+a
+button
+(
+implicit
+type
+)
+should
+NOT
+trigger
+a
+submit
+(
+with
+command
+attribute
+)
+"
+)
+;
+test
+(
+(
+t
+)
+=
+>
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+button
+.
+setAttribute
+(
+"
+commandfor
+"
+"
+whatever
+"
+)
+;
+let
+called
+=
+false
+;
+form
+.
+addEventListener
+(
+"
+submit
+"
+(
+e
+)
+=
+>
+{
+e
+.
+preventDefault
+(
+)
+;
+called
+=
+true
+;
+}
+{
+once
+:
+true
+}
+)
+;
+button
+.
+click
+(
+)
+;
+assert_false
+(
+called
+"
+submit
+should
+not
+have
+been
+dispatched
+"
+)
+;
+}
+"
+clicking
+a
+button
+(
+implicit
+type
+)
+should
+NOT
+trigger
+a
+submit
+(
+with
+commandfor
+attribute
+)
+"
+)
+;
+test
+(
+(
+t
+)
+=
+>
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+button
+.
+setAttribute
+(
+"
+command
+"
+"
+-
+-
+foo
+"
+)
+;
+button
+.
+setAttribute
+(
+"
+commandfor
+"
+"
+whatever
+"
+)
+;
+let
+called
+=
+false
+;
+form
+.
+addEventListener
+(
+"
+submit
+"
+(
+e
+)
+=
+>
+{
+e
+.
+preventDefault
+(
+)
+;
+called
+=
+true
+;
+}
+{
+once
+:
+true
+}
+)
+;
+button
+.
+click
+(
+)
+;
+assert_false
+(
+called
+"
+submit
+should
+not
+have
+been
+dispatched
+"
+)
+;
+}
+"
+clicking
+a
+button
+(
+implicit
+type
+)
+should
+NOT
+trigger
+a
+submit
+(
+with
+command
+and
+commandfor
+attribute
+)
+"
+)
+;
+test
+(
+(
+t
+)
+=
+>
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+button
+.
+setAttribute
+(
+"
+command
+"
+"
+-
+-
+foo
+"
+)
+;
+button
+.
+setAttribute
+(
+"
+type
+"
+"
+submit
+"
+)
+;
+let
+called
+=
+false
+;
+form
+.
+addEventListener
+(
+"
+submit
+"
+(
+e
+)
+=
+>
+{
+e
+.
+preventDefault
+(
+)
+;
+called
+=
+true
+;
+}
+{
+once
+:
+true
+}
+)
+;
+button
+.
+click
+(
+)
+;
+assert_true
+(
+called
+"
+submit
+should
+have
+been
+dispatched
+"
+)
+;
+}
+"
+clicking
+a
+button
+(
+explicit
+type
+=
+submit
+)
+SHOULD
+trigger
+a
+submit
+(
+with
+command
+attribute
+)
+"
+)
+;
+test
+(
+(
+t
+)
+=
+>
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+button
+.
+setAttribute
+(
+"
+commandfor
+"
+"
+whatever
+"
+)
+;
+button
+.
+setAttribute
+(
+"
+type
+"
+"
+submit
+"
+)
+;
+let
+called
+=
+false
+;
+form
+.
+addEventListener
+(
+"
+submit
+"
+(
+e
+)
+=
+>
+{
+e
+.
+preventDefault
+(
+)
+;
+called
+=
+true
+;
+}
+{
+once
+:
+true
+}
+)
+;
+button
+.
+click
+(
+)
+;
+assert_true
+(
+called
+"
+submit
+should
+have
+been
+dispatched
+"
+)
+;
+}
+"
+clicking
+a
+button
+(
+explicit
+type
+=
+submit
+)
+SHOULD
+trigger
+a
+submit
+(
+with
+commandfor
+attribute
+)
+"
+)
+;
+test
+(
+(
+t
+)
+=
+>
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+button
+.
+setAttribute
+(
+"
+command
+"
+"
+-
+-
+foo
+"
+)
+;
+button
+.
+setAttribute
+(
+"
+commandfor
+"
+"
+whatever
+"
+)
+;
+button
+.
+setAttribute
+(
+"
+type
+"
+"
+submit
+"
+)
+;
+let
+called
+=
+false
+;
+form
+.
+addEventListener
+(
+"
+submit
+"
+(
+e
+)
+=
+>
+{
+e
+.
+preventDefault
+(
+)
+;
+called
+=
+true
+;
+}
+{
+once
+:
+true
+}
+)
+;
+button
+.
+click
+(
+)
+;
+assert_true
+(
+called
+"
+submit
+should
+have
+been
+dispatched
+"
+)
+;
+}
+"
+clicking
+a
+button
+(
+explicit
+type
+=
+submit
+)
+SHOULD
+trigger
+a
+submit
+(
+with
+command
+and
+commandfor
+attribute
+)
+"
+)
+;
+<
+/
+script
+>
diff --git a/testing/web-platform/tests/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html b/testing/web-platform/tests/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html
index 56b52ca5082b4..46d95f77acd2b 100644
--- a/testing/web-platform/tests/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html
+++ b/testing/web-platform/tests/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html
@@ -489,7 +489,7 @@
source
invokerbutton
"
-invoker
+source
"
)
;
@@ -708,7 +708,7 @@
source
invokerbutton
"
-invoker
+source
"
)
;
@@ -878,7 +878,7 @@
source
invokerbutton
"
-invoker
+source
"
)
;
@@ -1441,6 +1441,15 @@
"
)
;
+invokerbutton
+.
+removeAttribute
+(
+"
+type
+"
+)
+;
await
clickOn
(
@@ -1462,14 +1471,15 @@
"
event
does
-not
+NOT
dispatch
if
-invoker
+button
is
form
associated
-without
+with
+implicit
type
"
)
@@ -1490,6 +1500,192 @@
)
;
let
+event
+;
+invokee
+.
+addEventListener
+(
+"
+command
+"
+(
+e
+)
+=
+>
+(
+event
+=
+e
+)
+{
+once
+:
+true
+}
+)
+;
+invokerbutton
+.
+setAttribute
+(
+"
+form
+"
+"
+aform
+"
+)
+;
+invokerbutton
+.
+setAttribute
+(
+"
+type
+"
+"
+button
+"
+)
+;
+await
+clickOn
+(
+invokerbutton
+)
+;
+assert_true
+(
+event
+instanceof
+CommandEvent
+"
+event
+is
+CommandEvent
+"
+)
+;
+assert_equals
+(
+event
+.
+type
+"
+command
+"
+"
+type
+"
+)
+;
+assert_equals
+(
+event
+.
+bubbles
+false
+"
+bubbles
+"
+)
+;
+assert_equals
+(
+event
+.
+composed
+true
+"
+composed
+"
+)
+;
+assert_equals
+(
+event
+.
+isTrusted
+true
+"
+isTrusted
+"
+)
+;
+assert_equals
+(
+event
+.
+command
+"
+-
+-
+custom
+-
+command
+"
+"
+command
+"
+)
+;
+assert_equals
+(
+event
+.
+target
+invokee
+"
+target
+"
+)
+;
+assert_equals
+(
+event
+.
+source
+invokerbutton
+"
+source
+"
+)
+;
+}
+"
+event
+dispatches
+if
+button
+is
+form
+associated
+with
+explicit
+type
+=
+button
+"
+)
+;
+promise_test
+(
+async
+function
+(
+t
+)
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+let
called
=
false
@@ -1538,7 +1734,7 @@
type
"
"
-button
+submit
"
)
;
@@ -1548,7 +1744,7 @@
invokerbutton
)
;
-assert_true
+assert_false
(
called
"
@@ -1562,16 +1758,123 @@
}
"
event
-dispatches
+does
+NOT
+dispatch
if
-invoker
+button
is
form
associated
with
+explicit
type
=
+submit
+"
+)
+;
+promise_test
+(
+async
+function
+(
+t
+)
+{
+t
+.
+add_cleanup
+(
+resetState
+)
+;
+let
+called
+=
+false
+;
+invokee
+.
+addEventListener
+(
+"
+command
+"
+(
+e
+)
+=
+>
+(
+called
+=
+true
+)
+{
+once
+:
+true
+}
+)
+;
+invokerbutton
+.
+setAttribute
+(
+"
+form
+"
+"
+aform
+"
+)
+;
+invokerbutton
+.
+setAttribute
+(
+"
+type
+"
+"
+reset
+"
+)
+;
+await
+clickOn
+(
+invokerbutton
+)
+;
+assert_false
+(
+called
+"
+event
+was
+not
+called
+"
+)
+;
+}
+"
+event
+does
+NOT
+dispatch
+if
button
+is
+form
+associated
+with
+explicit
+type
+=
+reset
"
)
;