<!DOCTYPE html>
<title>The ProgressEvent interface</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
test(function() {
  assert_equals(typeof ProgressEvent, "function")
  assert_equals(ProgressEvent.length, 1)
  assert_throws(new TypeError(), function() {
    "use strict";
    delete ProgressEvent.length;
  })
})
test(function() {
  var desc = Object.getOwnPropertyDescriptor(ProgressEvent, "prototype")
  assert_equals(desc.value, ProgressEvent.prototype)
  assert_equals(desc.writable, false)
  assert_equals(desc.enumerable, false)
  assert_equals(desc.configurable, false)
  assert_throws(new TypeError(), function() {
    "use strict";
    delete ProgressEvent.prototype;
  })
  assert_equals(ProgressEvent.prototype.constructor, ProgressEvent)
  assert_equals(Object.getPrototypeOf(ProgressEvent.prototype), Event.prototype)
}, "interface prototype object")
var attributes = [
  ["boolean", "lengthComputable"],
  ["unsigned long long", "loaded"],
  ["unsigned long long", "total"]
];
attributes.forEach(function(a) {
  test(function() {
    var desc = Object.getOwnPropertyDescriptor(ProgressEvent.prototype, a[1])
    assert_equals(desc.enumerable, true)
    assert_equals(desc.configurable, true)
    assert_throws(new TypeError(), function() {
      ProgressEvent.prototype[a[1]]
    })
  })
})
test(function() {
  for (var p in window) {
    assert_not_equals(p, "ProgressEvent")
  }
}, "Interface objects properties should not be Enumerable")
test(function() {
  assert_true(!!window.ProgressEvent, "Interface should exist.")
  assert_true(delete window.ProgressEvent, "The delete operator should return true.")
  assert_equals(window.ProgressEvent, undefined, "Interface should be gone.")
}, "Should be able to delete ProgressEvent.")
</script>
