<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/debugger-test.js"></script>
<script>
function keepAliveInInlineScript() { }

//@ sourceURL=inlineScriptURL.js
</script>
<script>
function doEval()
{
    eval("function keepAlive() {}\n//@ sourceURL=evalURL.js");
}

function doEvalWithNonRelativeURL()
{
    eval("function relativeURLScript() {}\n//@ sourceURL=/js/nonRelativeURL.js");
}

function doEvalWithHashSyntax()
{
    eval("function hashSyntax() {}\n//# sourceURL=hashSyntax.js");
}

function doDynamicScript()
{
    var scriptElement = document.createElement("script");
    scriptElement.textContent = "function keepAliveInDynamicScript() {}\n//@ sourceURL=dynamicScriptURL.js";
    document.body.appendChild(scriptElement);
}

function test()

{
    function forEachScriptMatchingURL(url, handler)
    {
        var scripts = WebInspector.debuggerModel.scripts;
        for (var i = 0; i < scripts.length; ++i) {
            if (scripts[i].sourceURL.indexOf(url) !== -1)
                handler(scripts[i]);
        }
    }

    InspectorTest.runDebuggerTestSuite([
        function testSourceURLCommentInInlineScript(next)
        {
            InspectorTest.showScriptSource("source-url-comment.html", didShowScriptSource);

            function didShowScriptSource(sourceFrame)
            {
                function checkScriptDoesNotHaveSourceURL(script)
                {
                    InspectorTest.assertTrue(!script.hasSourceURL, "hasSourceURL flag is set for inline script");
                }

                var panel = WebInspector.panel("scripts");
                var uiSourceCodes = panel._workspace.uiSourceCodes();
                for (var i = 0; i < uiSourceCodes.length; ++i)
                    InspectorTest.assertTrue(uiSourceCodes[i].originURL().indexOf("inlineScriptURL.js") === -1, "sourceURL comment in inline script was used as a script name");
                forEachScriptMatchingURL("source-url-comment.html", checkScriptDoesNotHaveSourceURL)
                next();
            }
        },

        function testSourceURLComment(next)
        {
            InspectorTest.showScriptSource("evalURL.js", didShowScriptSource);
            InspectorTest.evaluateInPage("setTimeout(doEval, 0)");

            function didShowScriptSource(sourceFrame)
            {
                function checkScriptHasSourceURL(script)
                {
                    InspectorTest.assertTrue(script.hasSourceURL, "hasSourceURL flag is not set for eval with sourceURL comment");
                }

                InspectorTest.addResult(sourceFrame.textEditor.text());
                forEachScriptMatchingURL("evalURL.js", checkScriptHasSourceURL);
                next();
            }
        },

        function testSourceURLCommentInDynamicScript(next)
        {
            InspectorTest.showScriptSource("dynamicScriptURL.js", didShowScriptSource);
            InspectorTest.evaluateInPage("setTimeout(doDynamicScript, 0)");

            function didShowScriptSource(sourceFrame)
            {
                function checkScriptHasSourceURL(script)
                {
                    InspectorTest.assertTrue(script.hasSourceURL, "hasSourceURL flag is not set for dynamic script with sourceURL comment");
                }

                InspectorTest.addResult(sourceFrame.textEditor.text());
                forEachScriptMatchingURL("dynamicScriptURL.js", checkScriptHasSourceURL);
                next();
            }
        },

        function testNonRelativeURL(next)
        {
            InspectorTest.showScriptSource("/js/nonRelativeURL.js", didShowScriptSource);
            InspectorTest.evaluateInPage("setTimeout(doEvalWithNonRelativeURL, 0)");

            function didShowScriptSource(sourceFrame)
            {
                function checkScriptHasSourceURL(script)
                {
                    InspectorTest.assertTrue(script.hasSourceURL, "hasSourceURL flag is not set for eval with a non-relative URL in a sourceURL comment");
                }

                InspectorTest.addResult(sourceFrame.textEditor.text());
                forEachScriptMatchingURL("nonRelativeURL.js", checkScriptHasSourceURL);
                next();
            }
        },

        function testHashSyntax(next)
        {
            InspectorTest.showScriptSource("hashSyntax.js", didShowScriptSource);
            InspectorTest.evaluateInPage("setTimeout(doEvalWithHashSyntax, 0)");

            function didShowScriptSource(sourceFrame)
            {
                function checkScriptHasSourceURL(script)
                {
                    InspectorTest.assertTrue(script.hasSourceURL, "hasSourceURL flag is not set for eval with a non-relative URL in a sourceURL comment");
                }

                InspectorTest.addResult(sourceFrame.textEditor.text());
                forEachScriptMatchingURL("hashSyntax.js", checkScriptHasSourceURL);
                next();
            }
        }
    ]);
};

</script>

</head>

<body onload="runTest()">
<p>Tests that evals with sourceURL comment are shown in scripts panel.</p>
</body>
</html>
