<!DOCTYPE html>
<meta charset="utf-8">
<title>HTML Test: Button - events</title>
<link rel="author" title="Intel" href="http://www.intel.com/">
<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-button-element">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<form name="fm1" style="display:none">
  <button id="btn">BUTTON</button>
  <button id="menu_btn" type="menu" menu="menu">MENU BUTTON</button>
</form>
<script>

var btn = document.getElementById("btn"),
    menu_btn = document.getElementById("menu_btn"),
    t1 = async_test("The submit event must be fired when click a button in submit status"),
    t2 = async_test("The reset event must be fired when click a button in reset status");
    t3 = async_test("type=button shouldn't trigger submit or reset events");
    t4 = async_test("Switching from type=button to type=submit should submit the form");
    t5 = async_test("Switching from type=button to type=reset should reset the form");
    t6 = async_test("Innermost button should submit its form");
    t7 = async_test("Innermost button should reset its form");
    t8 = async_test("Anchor inside a button should be prevent button activation");
    t9 = async_test("input type=submit inside a button should be prevent button activation");

document.forms.fm1.onsubmit = t1.step_func(function (evt) {
  evt.preventDefault();
  assert_true(evt.isTrusted, "The isTrusted attribute of the submit event should be true.");
  assert_true(evt.bubbles, "The bubbles attribute of the submit event should be true.");
  assert_true(evt.cancelable, "The cancelable attribute of the submit event should be true.");
  assert_true(evt instanceof Event, "The submit event is an instance of Event interface.");
  t1.done();
});

document.forms.fm1.onreset = t2.step_func(function (evt) {
  assert_true(evt.isTrusted, "The isTrusted attribute of the reset event should be true.");
  assert_true(evt.bubbles, "The bubbles attribute of the reset event should be true.");
  assert_true(evt.cancelable, "The cancelable attribute of the reset event should be true.");
  assert_true(evt instanceof Event, "The reset event is an instance of Event interface.");
  t2.done();
});

t1.step(function () {
  btn.type = "submit";
  assert_equals(btn.type, "submit", "The button type should be 'submit'.");
  btn.click();
});

t2.step(function () {
  btn.type = "reset";
  assert_equals(btn.type, "reset", "The button type should be 'reset'.");
  btn.click();
});

t3.step(function () {
  btn.type = "button";
  assert_equals(btn.type, "button", "The button type should be 'button'.");
  document.forms.fm1.onsubmit = t3.step_func(function (evt) {
    assert_unreached("type=button shouldn't trigger submission.");
  });
  document.forms.fm1.onreset = t3.step_func(function (evt) {
    assert_unreached("type=button shouldn't reset the form.");
  });
  btn.click();
  t3.done();
});

t4.step(function () {
  btn.type = "button";
  btn.onclick = function() { btn.type = "submit"; }
  document.forms.fm1.onsubmit = t4.step_func(function (evt) {
    evt.preventDefault();
    assert_equals(btn.type, "submit", "The button type should be 'submit'.");
    t4.done();
  });
  btn.click();
});

t5.step(function () {
  btn.type = "button";
  btn.onclick = function() { btn.type = "reset"; }
  document.forms.fm1.onreset = t5.step_func(function (evt) {
    evt.preventDefault();
    assert_equals(btn.type, "reset", "The button type should be 'reset'.");
    t5.done();
  });
  btn.click();
});

t6.step(function () {
  btn.type = "submit";
  btn.innerHTML = "";
  var fm2 = document.createElement("form");
  var btn2 = document.createElement("button");
  btn2.type = "submit";
  fm2.appendChild(btn2);
  btn.appendChild(fm2);
  assert_true(document.forms.fm1.contains(fm2), "Should have nested forms");

  function submitListener(evt) {
    evt.preventDefault();
    assert_equals(evt.target, fm2, "Innermost form should have got the submit event");
  };
  window.addEventListener("submit", submitListener, true);
  btn2.click();
  window.removeEventListener("submit", submitListener, true);
  t6.done();
});

t7.step(function () {
  btn.type = "reset";
  btn.innerHTML = "";
  var fm2 = document.createElement("form");
  var btn2 = document.createElement("button");
  btn2.type = "reset";
  fm2.appendChild(btn2);
  btn.appendChild(fm2);
  assert_true(document.forms.fm1.contains(fm2), "Should have nested forms");

  function resetListener(evt) {
    evt.currentTarget.removeEventListener(evt.type, resetListener, true);
    evt.preventDefault();
    assert_equals(evt.target, fm2, "Innermost form should have got the reset event");
    t7.done();
  };
  window.addEventListener("reset", resetListener, true);
  btn2.click();
});

t8.step(function () {
  btn.type = "submit";
  btn.innerHTML = "";
  var a = document.createElement("a");
  a.href = "#";
  btn.appendChild(a);
  document.forms.fm1.onsubmit = t8.step_func(function (evt) {
    assert_unreached("type=button shouldn't trigger submission.");
  });

  a.click();
  t8.done();
});

t9.step(function () {
  btn.type = "submit";
  btn.innerHTML = "";
  var fm2 = document.createElement("form");
  var btn2 = document.createElement("input");
  btn2.type = "submit";
  fm2.appendChild(btn2);
  btn.appendChild(fm2);
  assert_true(document.forms.fm1.contains(fm2), "Should have nested forms");

  function submitListener(evt) {
    evt.preventDefault();
    assert_equals(evt.target, fm2, "Innermost form should have got the submit event");
  };

  window.addEventListener("submit", submitListener, true);
  btn2.click();
  window.removeEventListener("submit", submitListener, true);
  t9.done();
});

</script>
