<!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_false(name in window)
    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
  "SVGPathSegList"
]
removedInterfaces.forEach(isInterfaceRemoved)

function isRemovedFromDocument(name) {
  test(function() {
    var doc = document.implementation.createDocument(null,null,null)
    assert_false(name in document)
    assert_equals(document[name], undefined)
    assert_false(name in doc)
    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);
  assert_equals(document["load"], undefined)
}, "document.load");

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

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

function isRemovedFromElement(name) {
  test(function() {
    var ele = document.createElementNS("test", "test")
    assert_false(name in document.body)
    assert_equals(document.body[name], undefined)
    assert_false(name in ele)
    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_false(name in attr)
    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_false(name in doctype)
    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_false(name in text)
    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_false(name in doc)
    assert_equals(doc[name], undefined)
    assert_false(name in doctype)
    assert_equals(doctype[name], undefined)
    assert_false(name in text)
    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_false(name in window)
    assert_equals(window[name], undefined)
  }, "Window member must be removed: " + name)
}
var windowRemoved = [
  "attachEvent"
]
windowRemoved.forEach(isRemovedFromWindow)

function isRemovedFromEvent(name) {
  test(() => {
    assert_false(name in Event)
    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",
  "path"
]
EventPrototypeRemoved.forEach(name => {
  test(() => {
    assert_false(name in Event.prototype)
    assert_equals(Event.prototype[name], undefined)
    assert_false(name in new Event("test"))
    assert_equals((new Event("test"))[name], undefined)
  }, "Event.prototype should not have this property: " + name)
})
</script>
