<!DOCTYPE html>
<title>Historical DOM features must be removed</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
function isInterfaceRemoved(name) {
  test(function() {
    assert_equals(window[name], undefined)
  }, "Historical DOM features must be removed: " + name)
}
var removedInterfaces = [
  "DOMConfiguration",
  "DOMCursor",
  "DOMError",
  "DOMErrorHandler",
  "DOMImplementationList",
  "DOMImplementationSource",
  "DOMLocator",
  "DOMObject",
  "DOMRequest",
  "DOMSettableTokenList",
  "DOMUserData",
  "Entity",
  "EntityReference",
  "EventException", // DOM Events
  "NameList",
  "Notation",
  "TypeInfo",
  "UserDataHandler",
  "RangeException" // DOM Range
]
removedInterfaces.forEach(isInterfaceRemoved)

function isRemovedFromDocument(name) {
  test(function() {
    var doc = document.implementation.createDocument(null,null,null)
    assert_equals(document[name], undefined)
    assert_equals(doc[name], undefined)
  }, "Historical DOM features must be removed: " + name)
}
var documentRemoved = [
  "createEntityReference",
  "xmlEncoding",
  "xmlStandalone",
  "xmlVersion",
  "strictErrorChecking",
  "domConfig",
  "normalizeDocument",
  "renameNode",
  "defaultCharset",
  "height",
  "width",
  // https://github.com/whatwg/html/commit/a64aea7fdb221bba027d95dc3cabda09e0b3e5dc
  "commands",
  // https://github.com/whatwg/html/commit/797b4d273955a0fe3cc2e2d0ca5d578f37c0f126
  "cssElementMap",
  // https://github.com/whatwg/html/commit/e236f46820b93d6fe2e2caae0363331075c6c4fb
  "async",
  // https://github.com/whatwg/dom/pull/815
  "origin",
]
documentRemoved.forEach(isRemovedFromDocument)

test(function() {
  // https://github.com/whatwg/html/commit/e236f46820b93d6fe2e2caae0363331075c6c4fb
  assert_false("load" in document);
}, "document.load");

test(function() {
  // https://github.com/whatwg/html/commit/523f7a8773d2ab8a1eb0da6510651e8c5d2a7531
  var doc = document.implementation.createDocument(null, null, null);
  assert_false("load" in doc);
}, "XMLDocument.load");

test(function() {
  assert_equals(document.implementation["getFeature"], undefined)
}, "DOMImplementation.getFeature() must be removed.")

function isRemovedFromElement(name) {
  test(function() {
    var ele = document.createElementNS("test", "test")
    assert_equals(document.body[name], undefined)
    assert_equals(ele[name], undefined)
  }, "Historical DOM features must be removed: " + name)
}
var elementRemoved = [
  "schemaTypeInfo",
  "setIdAttribute",
  "setIdAttributeNS",
  "setIdAttributeNode"
]
elementRemoved.forEach(isRemovedFromElement)

function isRemovedFromAttr(name) {
  test(function() {
    var attr = document.createAttribute("test")
    assert_equals(attr[name], undefined)
  }, "Attr member must be removed: " + name)
}
var attrRemoved = [
  "schemaTypeInfo",
  "isId"
]
attrRemoved.forEach(isRemovedFromAttr)

function isRemovedFromDoctype(name) {
  test(function() {
    var doctype = document.implementation.createDocumentType("test", "", "")
    assert_equals(doctype[name], undefined)
  }, "DocumentType member must be removed: " + name)
}
var doctypeRemoved = [
  "entities",
  "notations",
  "internalSubset"
]
doctypeRemoved.forEach(isRemovedFromDoctype)

function isRemovedFromText(name) {
  test(function() {
    var text = document.createTextNode("test")
    assert_equals(text[name], undefined)
  }, "Text member must be removed: " + name)
}
var textRemoved = [
  "isElementContentWhitespace",
  "replaceWholeText"
]
textRemoved.forEach(isRemovedFromText)

function isRemovedFromNode(name) {
  test(function() {
    var doc = document.implementation.createDocument(null,null,null)
    var doctype = document.implementation.createDocumentType("test", "", "")
    var text = document.createTextNode("test")
    assert_equals(doc[name], undefined)
    assert_equals(doctype[name], undefined)
    assert_equals(text[name], undefined)
  }, "Node member must be removed: " + name)
}
var nodeRemoved = [
  "hasAttributes",
  "attributes",
  "namespaceURI",
  "prefix",
  "localName",
  "isSupported",
  "getFeature",
  "getUserData",
  "setUserData",
  "rootNode",
]
nodeRemoved.forEach(isRemovedFromNode)

function isRemovedFromWindow(name) {
  test(function() {
    assert_equals(window[name], undefined)
  }, "Window member must be removed: " + name)
}
var windowRemoved = [
  "attachEvent"
]
windowRemoved.forEach(isRemovedFromWindow)

function isRemovedFromEvent(name) {
  test(() => {
    assert_equals(Event[name], undefined)
  }, "Event should not have this constant: " + name)
}
var EventRemoved = [
  "MOUSEDOWN",
  "MOUSEUP",
  "MOUSEOVER",
  "MOUSEOUT",
  "MOUSEMOVE",
  "MOUSEDRAG",
  "CLICK",
  "DBLCLICK",
  "KEYDOWN",
  "KEYUP",
  "KEYPRESS",
  "DRAGDROP",
  "FOCUS",
  "BLUR",
  "SELECT",
  "CHANGE"
]
EventRemoved.forEach(isRemovedFromEvent)

var EventPrototypeRemoved = [
  "getPreventDefault",
]
EventPrototypeRemoved.forEach(name => {
  test(() => {
    assert_equals(Event.prototype[name], undefined)
    assert_equals((new Event("test"))[name], undefined)
  }, "Event.prototype should not have this property: " + name)
})
</script>
