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

function populateDOMStorage()
{
    localStorage.clear();
    sessionStorage.clear();
    localStorage["resource-history"] = "{}"; // This mitigates file:// localstorage conflict.
    // Fill local and session storage with some random strings.
    for (var i = 0; i < 10; i++) {
        localStorage["a" + i] = "=value" + i + ", ";
        sessionStorage["b" + i] = "=value" + (i+10) + ", ";
    }
}

function test()
{
    WebInspector.showPanel("resources");

    InspectorTest.evaluateInPage("populateDOMStorage()", function(result) {
        InspectorTest.addResult("Populated local and session storage");
    });
    function name(storage)
    {
        return storage.isLocalStorage ? "Local storage" : "Session storage";
    }

    function dumpDataGridContent(dataGrid)
    {
        var nodes = dataGrid.rootNode().children;
        var rows = [];
        for (var i = 0; i < nodes.length; ++i) {
            var node = nodes[i];
            rows.push(node._data.key + node._data.value);
        }
        rows.sort();
        InspectorTest.addResult("KeyValue pairs: " + rows.join(''));
    }

    InspectorTest.runAfterPendingDispatches(function() {
        var storages = WebInspector.domStorageModel.storages();
        if (storages) {
            for (var i = 0; i < storages.length; i++) {
                var storage = storages[i];
                WebInspector.panels.resources._showDOMStorage(storage);
                InspectorTest.addResult("Did show: " + name(storage));
            }
        } else
            InspectorTest.addResult("FAIL: no DOM storages found.");

        InspectorTest.runAfterPendingDispatches(function() {
            var storages = WebInspector.domStorageModel.storages();
            for (var i = 0; i < storages.length; i++) {
                var storage = storages[i];
                InspectorTest.addResult(name(storage) + " content: ");
                var view = WebInspector.panels.resources._domStorageViews.get(storage);
                dumpDataGridContent(view._dataGrid);
            }
            InspectorTest.addResult("DONE");
            InspectorTest.completeTest();
        });
    });
}

</script>
</head>

<body onload="runTest()">
<p>
Test that storage panel is present and that it contains correct data for local and session DOM storages.
</p>

</body>
</html>
