<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script>
function test()
{
    WebInspector.showPanel("scripts");

    function createContentProvider(url)
    {
        var contentProvider = new WebInspector.StaticContentProvider(WebInspector.resourceTypes.Script, "", "text/javascript");
        contentProvider.requestContent = function(callback)
        {
            InspectorTest.addResult("Source requested for " + url);
            callback("");
        };
        return contentProvider;
    }

    var workspace = new WebInspector.Workspace();
    workspace.networkWorkspaceProvider = new WebInspector.SimpleWorkspaceProvider(workspace, WebInspector.projectTypes.Network);

    function addNetworkFile(url)
    {
        return workspace.networkWorkspaceProvider.addFileForURL(url, createContentProvider(url), false);
    }

    function dumpUISourceCodeDisplayName(url)
    {
        var uiSourceCode = addNetworkFile(url);
        InspectorTest.addResult("UISourceCode display name for url \"" + url + "\" is \"" + WebInspector.TabbedEditorContainer.prototype._titleForFile(uiSourceCode) + "\".");
    }

    const baseURL = "http://localhost:8080/folder/";
    dumpUISourceCodeDisplayName(baseURL + "filename?parameter=value&nnn=1");
    dumpUISourceCodeDisplayName(baseURL + "very-long-filename-123456?nn=1");
    dumpUISourceCodeDisplayName(baseURL + "too-long-filename-1234567890?nn=1");
    dumpUISourceCodeDisplayName(baseURL + "long-filename?parameter=value&nnn=1");
    dumpUISourceCodeDisplayName(baseURL + "too-long-filename-1234567890?parameter=value&nnn=1");
    InspectorTest.completeTest();
};
</script>
</head>
<body onload="runTest()">
<p>Tests UISourceCode display name.</p>
</body>
</html>
