<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../../resources/js-test-pre.js"></script>
</head>
<body>
<script>
description(
"<p>This file test the behaviour of getAttribute with regard to case.</p><p>See Bug 20247: setAttributeNode() does not work when attribute name has a capital letter in it</p>"
);

function testGetAttributeCaseInsensitive()
{
    var div = document.createElement('div');
    div.setAttribute("mixedCaseAttrib", "x");

    // Do original case lookup, and lowercase lookup.
    return div.getAttribute("mixedcaseattrib");
}

shouldBe("testGetAttributeCaseInsensitive()", '"x"');

function testGetAttributeNodeMixedCase()
{
    var div = document.createElement('div');
    var a = div.ownerDocument.createAttribute("mixedCaseAttrib");
    a.nodeValue = "x";
    div.setAttributeNode(a);
    return div.getAttributeNS("", "mixedcaseattrib");
}

shouldBe("testGetAttributeNodeMixedCase()", '"x"');
    
function testGetAttributeNodeLowerCase(div)
{
    var div = document.createElement('div');
    var a = div.ownerDocument.createAttribute("lowercaseattrib");
    a.nodeValue = "x";
    div.setAttributeNode(a);
    return div.getAttribute("lowerCaseAttrib");
}

shouldBe("testGetAttributeNodeLowerCase()", '"x"');

function testSetAttributeNodeKeepsRef(div)
{
    var div = document.createElement('div');
    var a = div.ownerDocument.createAttribute("attrib_name");
    a.nodeValue = "0";
    div.setAttributeNode(a);

    // Mutate the attribute node.
    a.nodeValue = "1";
    
    return div.getAttribute("attrib_name");
}

shouldBe("testSetAttributeNodeKeepsRef()", '"1"');

function testAttribNodeNamePreservesCase()
{
    var div = document.createElement('div');
    var a = div.ownerDocument.createAttribute("A");
    a.nodeValue = "x";
    div.setAttributeNode(a);
      
    var result = [ a.name, a.nodeName ];
    return result.join(",");
}

shouldBe("testAttribNodeNamePreservesCase()", '"a,a"');

    
function testAttribNodeNamePreservesCaseGetNode()
{
    // getAttributeNode doesnt work on DIVs, use body element
    var body = document.body;

    var a = body.ownerDocument.createAttribute("A");
    a.nodeValue = "x";

    body.setAttributeNode(a);

    a = document.body.getAttributeNode("A");
    if (!a)
        return "FAIL";

    var result = [ a.name, a.nodeName ];
    return result.join(",");
}

shouldBe("testAttribNodeNamePreservesCaseGetNode()", '"a,a"');

function testAttribNodeNamePreservesCaseGetNode2()
{
    // getAttributeNode doesnt work on DIVs, use body element
    var body = document.body;

    var a = body.ownerDocument.createAttribute("B");
    a.nodeValue = "x";

    body.setAttributeNode(a);

    a = document.body.getAttributeNodeNS("", "b");
    if (!a)
        return "FAIL";

    a = body.ownerDocument.createAttributeNS("", "B");
    a.nodeValue = "x";
    body.setAttributeNode(a);

    a = document.body.getAttributeNodeNS("", "B");
      
    var result = [ a.name, a.nodeName ];
    return result.join(",");
}

shouldBe("testAttribNodeNamePreservesCaseGetNode2()", '"B,B"');

function testAttribNodeNameGetMutate()
{
    // getAttributeNode doesnt work on DIVs, use body element.
    var body = document.body;

    var a = body.ownerDocument.createAttribute("c");
    a.nodeValue = "0";
    body.setAttributeNode(a);

    a = document.body.getAttributeNode("c");
    a.value = "1";

    a = document.body.getAttributeNode("c");

    return a.nodeValue;
}

shouldBe("testAttribNodeNameGetMutate()", '"1"');

var node = document.createElement("div");
var attrib = document.createAttribute("myAttrib");
attrib.nodeValue = "XXX";
node.setAttributeNode(attrib);

var attrib2 = document.createAttributeNS("", "myAttrib2");
attrib2.nodeValue = "XXX";
node.setAttributeNode(attrib2);

shouldBe("(new XMLSerializer).serializeToString(node)", '"<div xmlns=\\"http://www.w3.org/1999/xhtml\\" myattrib=\\"XXX\\" myAttrib2=\\"XXX\\"></div>"');
shouldBe("node.getAttributeNodeNS('', 'myattrib')", 'attrib');
shouldBeNull("node.getAttributeNodeNS('', 'myAttrib')");
shouldBe("attrib.name", '"myattrib"');

shouldBe("node.getAttributeNodeNS('', 'myAttrib2')", 'attrib2');
shouldBeNull("node.getAttributeNodeNS('', 'myattrib2')");
shouldBe("attrib2.name", '"myAttrib2"');
</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>
