<!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 isInterfaceNuked(name) {
  test(function() {
    assert_equals(window[name], undefined)
  }, "Historical DOM features must be removed: " + name)
}
var nukedInterfaces = [
  "DOMConfiguration",
  "DOMCursor",
  "DOMError",
  "DOMErrorHandler",
  "DOMImplementationList",
  "DOMImplementationSource",
  "DOMLocator",
  "DOMObject",
  "DOMRequest",
  "DOMSettableTokenList",
  "DOMUserData",
  "Entity",
  "EntityReference",
  "EventException", // DOM Events
  "NameList",
  "Notation",
  "TypeInfo",
  "UserDataHandler",
  "RangeException" // DOM Range
]
nukedInterfaces.forEach(isInterfaceNuked)

function isNukedFromDocument(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 documentNuked = [
  "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",
]
documentNuked.forEach(isNukedFromDocument)

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 nuked.")

function isNukedFromElement(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 elementNuked = [
  "schemaTypeInfo",
  "setIdAttribute",
  "setIdAttributeNS",
  "setIdAttributeNode"
]
elementNuked.forEach(isNukedFromElement)

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

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

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

function isNukedFromNode(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 nuked: " + name)
}
var nodeNuked = [
  "hasAttributes",
  "attributes",
  "namespaceURI",
  "prefix",
  "localName",
  "isSupported",
  "getFeature",
  "getUserData",
  "setUserData",
  "rootNode",
]
nodeNuked.forEach(isNukedFromNode)

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

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>
