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

<script>
function test()
{
    WebInspector.showPanel("scripts");
    InspectorTest.createWorkspace(true);
    var panel = new WebInspector.ScriptsPanel(InspectorTest.testWorkspace);
    var navigator = panel._navigator;

    var uiSourceCodes = [];
    function addUISourceCode(url, isContentScript)
    {
        var contentProvider = new WebInspector.StaticContentProvider(WebInspector.resourceTypes.Script, "", "text/javascript");
        var uiSourceCode = InspectorTest.testNetworkWorkspaceProvider.addFileForURL(url, contentProvider, false, isContentScript);
        uiSourceCodes.push(uiSourceCode);
    }

    function dumpNavigator()
    {
        InspectorTest.dumpScriptsNavigator(navigator, "  ");
    }

    function expandDomains(tree)
    {
        var children = navigator._scriptsView._scriptsTree.children;
        for (var i = 0; i < children.length; ++i)
          children[i].expand();
    }

    var rootURL = "http://localhost:8080/LayoutTests/inspector/debugger/";
    InspectorTest.addResult("Adding first resource:");
    addUISourceCode(rootURL + "foo/bar/script.js", false);
    dumpNavigator();
    InspectorTest.addResult("Expanding domains:");
    expandDomains(navigator._scriptsView._scriptsTree);
    dumpNavigator();
    InspectorTest.addResult("Adding second resource:");
    addUISourceCode(rootURL + "foo/bar/script.js?a=2", false);
    dumpNavigator();
    InspectorTest.addResult("Adding other resources:");
    addUISourceCode(rootURL + "foo/bar/script.js?a=1", false);
    addUISourceCode(rootURL + "foo/baz/script.js", false);
    dumpNavigator();

    InspectorTest.addResult("Adding content scripts and some random resources:");
    addUISourceCode(rootURL + "foo/bar/contentScript2.js?a=1", true);
    addUISourceCode(rootURL + "foo/bar/contentScript.js?a=2", true);
    addUISourceCode(rootURL + "foo/bar/contentScript.js?a=1", true);
    addUISourceCode("http://example.com/", false);
    addUISourceCode("http://example.com/?a=b", false);
    addUISourceCode("?a=b", false);
    addUISourceCode("very_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_url", false);
    dumpNavigator();

    InspectorTest.addResult("Revealing first resource:");
    navigator.revealUISourceCode(uiSourceCodes[0]);
    dumpNavigator();

    // Here we keep http://localhost:8080/LayoutTests/inspector/debugger2/ folder collapsed while adding resources into it.
    InspectorTest.addResult("Adding some resources to change the way debugger folder looks like, first:");
    var rootURL2 = "http://localhost:8080/LayoutTests/inspector/debugger2/";
    addUISourceCode(rootURL2 + "foo/bar/script.js", false);
    dumpNavigator();

    InspectorTest.addResult("Second:");
    addUISourceCode(rootURL2 + "foo/bar/script.js?a=2", false);
    dumpNavigator();
    InspectorTest.addResult("Others:");
    addUISourceCode(rootURL2 + "foo/bar/script.js?a=1", false);
    addUISourceCode(rootURL2 + "foo/baz/script.js", false);
    dumpNavigator();

    InspectorTest.addResult("Revealing all resources:");
    for (var i = 0; i < uiSourceCodes.length; ++i)
        navigator.revealUISourceCode(uiSourceCodes[i]);
    dumpNavigator();

    InspectorTest.addResult("Removing all resources:");
    for (var i = 0; i < uiSourceCodes.length; ++i)
        navigator.removeUISourceCode(uiSourceCodes[i]);
    dumpNavigator();

    InspectorTest.completeTest();
}
</script>

</head>
<body onload="runTest()">
<p>
Tests scripts panel file selectors.
</p>
</body>

</html>
