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

function test()
{

    var nodes;
 
    InspectorProtocol.eventHandler["DOM.setChildNodes"] = setChildNodes;

    enableLayerTreeAgent();
    
    function enableLayerTreeAgent(result)
    {
        step({
            name: "Enable the LayerTree agent",
            command: "LayerTree.enable",
            parameters: {},
            callback: getDocument
        });
    };

    function getDocument()
    {
        // We must first get the document so that later on we may get sensible nodeIds.
        step({
            name: "Get the Document",
            command: "DOM.getDocument",
            parameters: {},
            callback: getLayerTree
        });
    };

    function getLayerTree(result)
    {
        step({
            name: "Get the layer tree",
            command: "LayerTree.layersForNode",
            parameters: {"nodeId": result.root.nodeId},
            callback: gotLayerTree
        });
    };

    function gotLayerTree(result)
    {
        var anonymousLayers = result.layers.filter(function (layer) {
            return layer.isAnonymous;
        });

        logTestName("Check layers");

        assert("Expected number of anonymous layers", anonymousLayers.length, 1);
        assert("The sole anonymous layer has a non-zero node id", anonymousLayers[0].nodeId !== 0, true);
        assert("The sole anonymous layer has a :first-letter pseudo-element", anonymousLayers[0].pseudoElement === "first-letter", true);

        var node;
        var nodeId = anonymousLayers[0].nodeId;
        for (var i = 0, count = nodes.length; i < count; ++i) {
            if (nodes[i].nodeId === nodeId) {
                node = nodes[i];
                break;
            }
        }

        logTestName("Check node");
        
        assert("Node was found", !!node, true);
        assert("Node has expected localName", node.localName, "p");
        assert("Node has id", node.attributes[0], "id");
        assert("Node has expected id", node.attributes[1], "first-letter");
        
        ProtocolTest.completeTest();
    };

    function setChildNodes (messageObject) {
        nodes = messageObject.params.nodes;
    };

    function step(test)
    {
        if (test.callback)
            logTestName(test.name);
        runCommand(test);
    };

    function logTestName(name)
    {
        ProtocolTest.log("\n=== " + name + " ===\n");
    };

    function runCommand(command)
    {
        InspectorProtocol.sendCommand(command.command, command.parameters, function(messageObject) {
            if (messageObject.hasOwnProperty("error")) {
                ProtocolTest.log("FAIL: " + messageObject.error.message + " (" + messageObject.error.code + ")");
                ProtocolTest.completeTest();
                return;
            }

            if (command.name)
                ProtocolTest.log("PASS");

            if (command.callback)
                command.callback(messageObject.result);
        });
    };

    function assert(name, actual, expected)
    {
        if (expected === actual)
            ProtocolTest.log("PASS: " + name + ".");
        else
            ProtocolTest.log("FAIL: " + name + ". Expected " + expected + " but got " + actual);
    };

};

window.addEventListener("DOMContentLoaded", function()
{
    runTest();
}, false);

</script>
<style type="text/css">

    #first-letter::first-letter {
        float: left;
        -webkit-transform: translateZ(0);
    }

</style>
</head>
<body>

    <p id="first-letter">This is a test</p>

</body>
</html>
