| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564 | var test = require("tape")module.exports = testDocumentfunction testDocument(document) {    var cleanup = require('./cleanup')(document)    var Event = require('../event');    test("document is a Document", function (assert) {        assert.equal(typeof document.createTextNode, "function")        assert.equal(typeof document.createElement, "function")        assert.equal(typeof document.createDocumentFragment, "function")        assert.end()    })    test("document has a head property", function(assert) {        assert.equal(document.head.tagName, "HEAD")        assert.end()    })    test("document has nodeType 9", function (assert) {        assert.equal(document.nodeType, 9)        assert.end()    })    test("can do stuff", function (assert) {        var div = document.createElement("div")        div.className = "foo bar"        var span = document.createElement("span")        div.appendChild(span)        span.textContent = "Hello! <&>"        var html = String(div.outerHTML || div)        assert.equal(html, "<div class=\"foo bar\">" +            "<span>Hello! <&></span></div>")        cleanup()        assert.end()    })    test("can createDocumentFragment", function (assert) {        var frag = document.createDocumentFragment()        assert.equal(frag.nodeType, 11)        var h1 = document.createElement("h1")        var h2 = document.createElement("h2")        assert.equal(h1.nodeType, 1)        assert.equal(h1.nodeType, 1)        frag.appendChild(h1)        assert.equal(fragString(frag), "<h1></h1>")        frag.appendChild(h2)        assert.equal(fragString(frag), "<h1></h1><h2></h2>")        frag.removeChild(h1)        assert.equal(fragString(frag), "<h2></h2>")        frag.replaceChild(h1, h2)        assert.equal(fragString(frag), "<h1></h1>")        cleanup()        assert.end()    })    test("can getElementById", function (assert) {        function append_div(id, parent) {            var div = document.createElement("div")            div.id = id            parent.appendChild(div)            return div        }        var div1   = append_div(1, document.body)        var div2   = append_div(2, document.body)        var div3   = append_div(3, document.body)        var div11  = append_div(11, div1)        var div12  = append_div(12, div1)        var div21  = append_div(21, div2)        var div22  = append_div(22, div2)        var div221 = append_div(221, div22)        var div222 = append_div(222, div22)        assert.equal(document.getElementById(1),    div1)        assert.equal(document.getElementById("2"),  div2)        assert.equal(document.getElementById(3),    div3)        assert.equal(document.getElementById(11),   div11)        assert.equal(document.getElementById(12),   div12)        assert.equal(document.getElementById(21),   div21)        assert.equal(document.getElementById(22),   div22)        assert.equal(document.getElementById(221),  div221)        assert.equal(document.getElementById(222),  div222)        cleanup()        assert.end()    })    test("can getElementsByClassName for a single class", function(assert) {        function append_div(className, parent) {            var div = document.createElement("div")            div.className = className            parent.appendChild(div)            return div        }        function assertSingleMatch(className, expectedElement) {            var result = document.getElementsByClassName(className)            assert.equal(result.length, 1)            assert.equal(result[0], expectedElement)        }        var divA   = append_div("A", document.body)        var divB   = append_div("B", document.body)        var divC   = append_div("C", document.body)        var divA1  = append_div("A1",  divA)        var divA2  = append_div("A2",  divA)        var divB1  = append_div("B1",  divB)        var divB2  = append_div("B2",  divB)        var divB2a = append_div("B2a", divB2)        var divB2b = append_div("B2b", divB2)        assertSingleMatch("A",    divA)        assertSingleMatch("B",    divB)        assertSingleMatch("C",    divC)        assertSingleMatch("A1",   divA1)        assertSingleMatch("A2",   divA2)        assertSingleMatch("B1",   divB1)        assertSingleMatch("B2",   divB2)        assertSingleMatch("B2a",  divB2a)        assertSingleMatch("B2b",  divB2b)        cleanup()        assert.end()    })    test("can getElementsByClassName for many elements", function (assert) {        function h(className) {            var div = document.createElement("div")            div.className = className            return div        }        document.body.appendChild(h("multi-class-bar"))        document.body.appendChild(h("multi-class-bar"))        var elems = document.getElementsByClassName("multi-class-bar")        assert.equal(elems.length, 2)        cleanup()        assert.end()    })    test("can getElementsByClassName for many classes", function(assert) {        function append_div(classNames, parent) {            var div = document.createElement("div")            div.className = classNames            parent.appendChild(div)            return div        }        function assertMatch(classNames, expectedElements) {            var result = document.getElementsByClassName(classNames)            assert.equal(result.length, expectedElements.length)            for (var i = 0; i < expectedElements.length; i++) {                assert.notEqual(expectedElements.indexOf(result[i]), -1)            }        }        var divXYZ   = append_div("X Y Z", document.body)        var divYZ   = append_div("Y Z", document.body)        var divZX  = append_div("Z X", document.body)        var divX1X2  = append_div("X1 X2",  divXYZ)        var divX1X2Y1  = append_div("X1 X2 Y1",  divXYZ)        assertMatch("X",    [divXYZ, divZX])        assertMatch("Y Z",    [divXYZ, divYZ])        assertMatch("X Y Z",    [divXYZ])        assertMatch("X1 X2",   [divX1X2, divX1X2Y1])        cleanup()        assert.end()    })    test("can create/manipulate textnodes", function (assert) {        var textnode = document.createTextNode("hello")        assert.equal(textnode.nodeType, 3)        assert.equal(textnode.data, "hello")        assert.equal(typeof textnode.replaceData, "function")        textnode.replaceData(0, 7, "nightly")        assert.equal(textnode.nodeType, 3)        assert.equal(textnode.data, "nightly")        assert.equal(typeof textnode.replaceData, "function")        textnode.replaceData(1, 1, "ou")        assert.equal(textnode.nodeType, 3)        assert.equal(textnode.data, "noughtly")        assert.end()    })    test("owner document is set", function (assert) {        var textnode = document.createTextNode("hello")        var domnode = document.createElement("div")        var fragment = document.createDocumentFragment()        assert.equal(textnode.ownerDocument, document)        assert.equal(domnode.ownerDocument, document)        assert.equal(fragment.ownerDocument, document)        assert.end()    })    test("Create namespaced nodes", function (assert) {        var svgURI = "http://www.w3.org/2000/svg"        var htmlURI = "http://www.w3.org/1999/xhtml"        var noNS = document.createElement("div")        var svgNS = document.createElementNS(svgURI, "svg")        var emptyNS = document.createElementNS("", "div")        var nullNS = document.createElementNS(null, "div")        var undefNS = document.createElementNS(undefined, "div")        var caseNS = document.createElementNS("Oops", "AbC")        var htmlNS = document.createElement("div")        assert.equal(noNS.tagName, "DIV")        assert.equal(noNS.namespaceURI, htmlURI)        assert.equal(elemString(noNS), "<div></div>")        assert.equal(svgNS.tagName, "svg")        assert.equal(svgNS.namespaceURI, svgURI)        assert.equal(elemString(svgNS), "<svg></svg>")        assert.equal(emptyNS.tagName, "div")        assert.equal(emptyNS.namespaceURI, null)        assert.equal(elemString(emptyNS), "<div></div>")        assert.equal(nullNS.tagName, "div")        assert.equal(nullNS.namespaceURI, null)        assert.equal(elemString(nullNS), "<div></div>")        assert.equal(undefNS.tagName, "div")        assert.equal(undefNS.namespaceURI, "undefined")        assert.equal(elemString(undefNS), "<div></div>")        assert.equal(caseNS.tagName, "AbC")        assert.equal(caseNS.namespaceURI, "Oops")        assert.equal(elemString(caseNS), "<AbC></AbC>")        assert.equal(htmlNS.tagName, "DIV")        assert.equal(htmlNS.namespaceURI, htmlURI)        assert.equal(elemString(htmlNS), "<div></div>")        assert.end()    })    test("Can insert before", function (assert) {        var rootNode = document.createElement("div")        var child = document.createElement("div")        var newElement = document.createElement("div")        rootNode.appendChild(child)        var el = rootNode.insertBefore(newElement, child)        assert.equal(el, newElement)        assert.equal(rootNode.childNodes.length, 2)        assert.equal(rootNode.childNodes[0], newElement)        assert.equal(rootNode.childNodes[1], child)        cleanup()        assert.end()    })    test("Insert before null appends to end", function (assert) {        var rootNode = document.createElement("div")        var child = document.createElement("div")        var newElement = document.createElement("div")        rootNode.appendChild(child)        var el = rootNode.insertBefore(newElement, null)        assert.equal(el, newElement)        assert.equal(rootNode.childNodes.length, 2)        assert.equal(rootNode.childNodes[0], child)        assert.equal(rootNode.childNodes[1], newElement)        cleanup()        assert.end()    })    test("Node insertions remove node from parent", function (assert) {        var parent = document.createElement("div")        var c1 = document.createElement("div")        var c2 = document.createElement("div")        var c3 = document.createElement("div")        parent.appendChild(c1)        parent.appendChild(c2)        parent.appendChild(c3)        var rootNode = document.createElement("div")        var node1 = rootNode.appendChild(c1)        assert.equal(node1, c1)        assert.equal(parent.childNodes.length, 2)        assert.equal(c1.parentNode, rootNode)        var node2 = rootNode.insertBefore(c2, c1)        assert.equal(node2, c2)        assert.equal(parent.childNodes.length, 1)        assert.equal(c2.parentNode, rootNode)        var node3 = rootNode.replaceChild(c3, c2)        assert.equal(node3, c2)        assert.equal(parent.childNodes.length, 0)        assert.equal(c3.parentNode, rootNode)        assert.equal(c2.parentNode, null)        cleanup()        assert.end()    })    test("input has type=text by default", function (assert) {        var elem = document.createElement("input")        assert.equal(elem.getAttribute("type"), "text");        assert.equal(elemString(elem), "<input type=\"text\" />")        assert.end()    })    test("input type=text can be overridden", function (assert) {        var elem = document.createElement("input")        elem.setAttribute("type", "hidden")        assert.equal(elem.getAttribute("type"), "hidden");        assert.equal(elemString(elem), "<input type=\"hidden\" />")        assert.end()    })    test("can set and get attributes", function (assert) {        var elem = document.createElement("div")        assert.equal(elem.getAttribute("foo"), null)        assert.equal(elemString(elem), "<div></div>")        assert.notOk(elem.hasAttribute('foo'))        elem.setAttribute("foo", "bar")        assert.equal(elem.getAttribute("foo"), "bar")        assert.equal(elemString(elem), "<div foo=\"bar\"></div>")        assert.ok(elem.hasAttribute('foo'))        elem.removeAttribute("foo")        assert.equal(elem.getAttribute("foo"), null)        assert.equal(elemString(elem), "<div></div>")        assert.notOk(elem.hasAttribute('foo'))        assert.end()    })    test("can set and set style properties", function(assert) {      var elem = document.createElement("div")      assert.equal(elemString(elem), "<div></div>")      elem.style.color = "red";      assert.equal(elem.style.color, "red")      assert.equal(elemString(elem), "<div style=\"color:red;\"></div>")      elem.style.background = "blue";      assert.equal(elem.style.color, "red")      assert.equal(elem.style.background, "blue")      assert.equal(elemString(elem),                   "<div style=\"color:red;background:blue;\"></div>")      assert.end()    })    test("can set and get namespaced attributes", function(assert) {        var elem = document.createElement("div")        var ns = "http://ns.com/my"        assert.equal(elem.getAttributeNS(ns, "myattr"), blankAttributeNS())        elem.setAttributeNS(ns, "myns:myattr", "the value")        assert.equal(elem.getAttributeNS(ns, "myattr"), "the value")        assert.equal(elemString(elem), '<div myns:myattr="the value"></div>')        elem.removeAttributeNS(ns, "myattr")        assert.equal(elem.getAttributeNS(ns, "myattr"), blankAttributeNS())        // Should work much like get/setAttribute when namespace is null.        assert.equal(elem.getAttributeNS(null, "foo"), blankAttributeNS())        assert.equal(elem.getAttribute("foo"), null)        elem.setAttributeNS(null, "foo", "bar")        assert.equal(elem.getAttributeNS(null, "foo"), "bar")        assert.equal(elem.getAttribute("foo"), "bar")        elem.removeAttributeNS(null, "foo")        assert.equal(elem.getAttributeNS(null, "foo"), blankAttributeNS())        assert.equal(elem.getAttribute("foo"), null)        assert.end()    })    test("can getElementsByTagName", function(assert) {        var parent = document.createElement("div")        var child1 = document.createElement("span")        var child2 = document.createElement("span")        child1.id = "foo"        child2.id = "bar"        child1.appendChild(child2)        parent.appendChild(child1)        document.body.appendChild(parent)        var elems = document.getElementsByTagName("SPAN")        assert.equal(elems.length, 2)        assert.equal(elems[0].id, "foo")        assert.equal(elems[1].id, "bar")        cleanup()        assert.end()    })    test("can getElementsByTagName with *", function(assert) {        document.body.appendChild(document.createElement("div"))        var elems = document.getElementsByTagName("*")        assert.equal(elems.length, 4)        assert.equal(elems[0].tagName, "HTML")        assert.equal(elems[1].tagName, "HEAD")        assert.equal(elems[2].tagName, "BODY")        assert.equal(elems[3].tagName, "DIV")        cleanup()        assert.end()    })    test("getElement* methods search outside the body", function(assert) {        var html = document.documentElement;        assert.equal(document.getElementsByTagName("html")[0], html)        html.id = "foo"        assert.equal(document.getElementById("foo"), html)        html.className = "bar"        assert.equal(document.getElementsByClassName("bar")[0], html)        // cleanup        html.id = ""        html.className = ""        cleanup()        assert.end()    })    test("getElement* methods can be passed to map()", function(assert) {        var e1 = document.createElement("div")        var e2 = document.createElement("span")        document.body.appendChild(e1)        document.body.appendChild(e2)        assert.deepEqual(            ["div", "span"].map(document.getElementsByTagName.bind(document)),            [[e1], [e2]]        )        e1.id = "1"        e2.id = "2"        assert.deepEqual(            ["1", "2"].map(document.getElementById.bind(document)),            [e1, e2]        )        e1.className = "foo"        e2.className = "bar"        assert.deepEqual(            ["foo", "bar"].map(document.getElementsByClassName.bind(document)),            [[e1], [e2]]        )        cleanup()        assert.end()    })    test("can check if it contains an element", function(assert) {    	var el = document.createElement("div")    	document.body.appendChild(el)    	assert.equals(document.contains(document.body), true)    	assert.equals(document.contains(el), true)    	cleanup()    	assert.end()    })    test("can do events", function (assert) {        var x = 1        function incx() { x++ }        var ev = new Event();        ev.initEvent("click");        document.addEventListener("click", incx)        document.dispatchEvent(ev)        assert.equal(x, 2)        document.removeEventListener("click", incx)        document.dispatchEvent(ev)        assert.equal(x, 2)        assert.end()    })    function blankAttributeNS() {        // Most browsers conform to the latest version of the DOM spec,        // which requires `getAttributeNS` to return `null` when the attribute        // doesn't exist, but some browsers (including phantomjs) implement the        // old version of the spec and return an empty string instead, see:        // https://developer.mozilla.org/en-US/docs/Web/API/element.getAttributeNS#Return_value        var div = document.createElement("div")        var blank = div.getAttributeNS(null, "foo")        if (!(blank === null || blank === "")) {            throw "Expected blank attribute to be either null or empty string"        }        return blank;    }    function elemString(element) {        var html = String(element) || "[]"        if (html.charAt(0) === "[") {            html = element.outerHTML            if (!html && !element.parentNode) {                var div = document.createElement("div")                div.appendChild(element)                html = div.innerHTML                div.removeChild(element)            }        }        return html    }    function fragString(fragment) {        var html = String(fragment)        if (html === "[object DocumentFragment]") {            var innerHTML = []            for (var i = 0; i < fragment.childNodes.length; i++) {                var node = fragment.childNodes[i]                innerHTML.push(String(node.outerHTML || node))            }            html = innerHTML.join("")        }        return html    }}
 |