<body></body>
<script>
function check1(args, callee) {
  parent.t.step(function() {
    parent.assert_equals(callee.length, 5);
    parent.assert_equals(args.length, 5);
    parent.assert_equals(args[0], reference_error.message);
    parent.assert_equals(args[1], reference_error.filename);
    parent.assert_equals(args[2], reference_error.lineno);
    parent.assert_equals(args[3], reference_error.colno);
    parent.assert_equals(args[4], reference_error.error);
    parent.t.done();
  });
}

var reference_error = new ErrorEvent("error", {
  filename: "error_file.js",
  lineno: 333,
  colno: 999,
  message: "there was an error",
  error: {nondefault: 'some unusual object'},
});

parent.t.step(function() {
  document.body.outerHTML = "<body onerror='check1(arguments, arguments.callee)'></body>"
  window.dispatchEvent(reference_error);
});

function check2(args, callee) {
  parent.t2.step(function() {
    parent.assert_equals(callee.length, 5);
    parent.assert_equals(args.length, 1);
    parent.assert_false(args[0] instanceof ErrorEvent);
    parent.t2.done()
  });
}

parent.t2.step(function() {
  document.body.outerHTML = "<body onerror='check2(arguments, arguments.callee)'></body>"
  window.dispatchEvent(new Event("error"));
});

function check3(args, callee) {
  parent.t3.step(function() {
    parent.assert_equals(args.length, 1);
    parent.assert_equals(callee.length, 1);
  });
}

parent.t3.step(function() {
  document.body.outerHTML = "<body><span onerror='check3(arguments, arguments.callee)'></span></body>"
  document.body.firstChild.dispatchEvent(reference_error);
  document.body.firstChild.dispatchEvent(new Event("error"));
  parent.t3.done();
});
</script>
