<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/elements-test.js"></script>
<script>

function setAttribute(name, value)
{
    var node = document.getElementById("node");
    node.setAttribute(name, value);
}

function removeAttribute(name)
{
    var node = document.getElementById("node");
    node.removeAttribute(name);
}

function test()
{
    var targetNode;

    InspectorTest.runTestSuite([
        function testDumpInitial(next)
        {
            function callback(node)
            {
                targetNode = node;
                InspectorTest.addResult("========= Original ========");
                InspectorTest.dumpElementsTree(targetNode);
                next();
            }
            InspectorTest.selectNodeWithId("node", callback);
        },

        function testAttributeUpdated(next)
        {
            function callback()
            {
                WebInspector.domAgent.removeEventListener(WebInspector.DOMAgent.Events.AttrModified, callback);
                InspectorTest.addResult("===== On attribute set =====");
                InspectorTest.dumpElementsTree(targetNode);
                next();
            }
            WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.AttrModified, callback);
            InspectorTest.evaluateInPage("setAttribute('name', 'value')");
        },

        function testAttributeSameValueNotUpdated(next)
        {
            function callback()
            {
                InspectorTest.addResult("===== On attribute modified (should be 'newValue') =====");
                InspectorTest.dumpElementsTree(targetNode);
                WebInspector.domAgent.removeEventListener(WebInspector.DOMAgent.Events.AttrModified, callback);
                next();
            }
            WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.AttrModified, callback);
            // Setting the same property value should not result in the AttrModified event.
            InspectorTest.evaluateInPage("setAttribute('name', 'value')");
            InspectorTest.evaluateInPage("setAttribute('name', 'value')");
            InspectorTest.evaluateInPage("setAttribute('name', 'newValue')");
        },

        function testAttributeRemoved(next)
        {
            function callback()
            {
                WebInspector.domAgent.removeEventListener(WebInspector.DOMAgent.Events.AttrRemoved, callback);
                InspectorTest.addResult("=== On attribute removed ===");
                InspectorTest.dumpElementsTree(targetNode);
                next();
            }
            WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.AttrRemoved, callback);
            InspectorTest.evaluateInPage("removeAttribute('name')");
        },

        function testSetAttributeValue(next)
        {
            function callback()
            {
                WebInspector.domAgent.removeEventListener(WebInspector.DOMAgent.Events.AttrModified, callback);
                InspectorTest.addResult("=== Set attribute value ===");
                InspectorTest.dumpElementsTree(targetNode);
                next();
            }
            WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.AttrModified, callback);
            targetNode.setAttributeValue("foo", "bar");
        },

        function testSetAttributeText(next)
        {
            function callback()
            {
                WebInspector.domAgent.removeEventListener(WebInspector.DOMAgent.Events.AttrRemoved, callback);
                InspectorTest.addResult("=== Set attribute as text ===");
                InspectorTest.dumpElementsTree(targetNode);
                next();
            }
            WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.AttrRemoved, callback);
            targetNode.setAttribute("foo", "foo2='baz2' foo3='baz3'");
        },

        function testRemoveAttributeAsText(next)
        {
            function callback()
            {
                WebInspector.domAgent.removeEventListener(WebInspector.DOMAgent.Events.AttrRemoved, callback);
                InspectorTest.addResult("=== Remove attribute as text ===");
                InspectorTest.dumpElementsTree(targetNode);
                next();
            }
            WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.AttrRemoved, callback);
            targetNode.setAttribute("foo3", "");
        },

        function testSetMalformedAttributeText(next)
        {
            function callback(error)
            {
                InspectorTest.addResult("Error: " + error);
                WebInspector.domAgent.removeEventListener(WebInspector.DOMAgent.Events.AttrModified, callback);
                InspectorTest.addResult("=== Set malformed attribute as text ===");
                InspectorTest.dumpElementsTree(targetNode);
                next();
            }
            targetNode.setAttribute("foo2", "foo2='missingquote", callback);
        }
    ]);
}

</script>
</head>

<body onload="runTest()">
<p>
Tests that elements panel updates dom tree structure upon setting attribute.
</p>

<div id="node"></div>

</body>
</html>
