<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()
{
    var defaultScriptMapping;
    function createResourceScriptMapping()
    {
        InspectorTest.createWorkspace();
        defaultScriptMapping = new WebInspector.DefaultScriptMapping(InspectorTest.testWorkspace);
        var resourceScriptMapping = new WebInspector.ResourceScriptMapping(InspectorTest.testWorkspace);
        return resourceScriptMapping;
    }

    InspectorTest.runTestSuite([
        function testScriptWithPendingResource(next)
        {
            var script;
            WebInspector.debuggerModel._reset();
            var resourceScriptMapping = createResourceScriptMapping();
            var url = "foo.js";
            step1();

            function step1()
            {
                InspectorTest.addResult("Adding script for pending request.");
                script = InspectorTest.createScriptMock(url, 0, 0, true, "<content script source>");
                InspectorTest.waitForWorkspaceUISourceCodeAddedEvent(originalUISourceCodeAdded);
                defaultScriptMapping.addScript(script);
                resourceScriptMapping.addScript(script);
                
                var originalUISourceCode;
                script.rawLocationToUILocation(0, 5);

                function originalUISourceCodeAdded(uiSourceCode)
                {
                    originalUISourceCode = uiSourceCode;
                }

                InspectorTest.checkUILocation(originalUISourceCode, 0, 5, script.rawLocationToUILocation(0, 5));
                InspectorTest.checkRawLocation(script, 10, 0, originalUISourceCode.uiLocationToRawLocation(10, 0));
                InspectorTest.dumpUISourceCode(originalUISourceCode, step2);
            }

            function step2()
            {
                InspectorTest.addResult("Adding uiSourceCode for finished resource.");
                InspectorTest.waitForWorkspaceUISourceCodeAddedEvent(uiSourceCodeAdded);
                InspectorTest.addMockUISourceCodeToWorkspace(url, WebInspector.resourceTypes.Script, "<content script resource content>");

                function uiSourceCodeAdded(uiSourceCode)
                {
                    InspectorTest.checkUILocation(uiSourceCode, 0, 5, script.rawLocationToUILocation(0, 5));
                    InspectorTest.checkRawLocation(script, 10, 0, uiSourceCode.uiLocationToRawLocation(10, 0));
                    InspectorTest.dumpUISourceCode(uiSourceCode, next);
                }
            }
        },

        function testScriptWithFinishedResource(next)
        {
            var script;
            WebInspector.debuggerModel._reset();
            var mockUISourceCode;
            var resourceScriptMapping = createResourceScriptMapping();
            var url = "foo.js";
            step1();

            function step1()
            {
                InspectorTest.addResult("Adding uiSourceCode for finished resource.");
                InspectorTest.waitForWorkspaceUISourceCodeAddedEvent(uiSourceCodeForResourceAdded);
                InspectorTest.addMockUISourceCodeToWorkspace(url, WebInspector.resourceTypes.Script, "<script resource content>");
            }

            function uiSourceCodeForResourceAdded(uiSourceCode)
            {
                mockUISourceCode = uiSourceCode;
                InspectorTest.dumpUISourceCode(uiSourceCode, step2);
            }

            function step2()
            {
                InspectorTest.addResult("Adding script for finished request.");
                script = InspectorTest.createScriptMock(url, 0, 0, false, "<script source>");
                resourceScriptMapping.addScript(script);
                InspectorTest.checkUILocation(mockUISourceCode, 0, 5, script.rawLocationToUILocation(0, 5));
                InspectorTest.checkRawLocation(script, 10, 0, mockUISourceCode.uiLocationToRawLocation(10, 0));
                InspectorTest.dumpUISourceCode(mockUISourceCode, next);
            }
        },

        function testHTMLWithPendingResource(next)
        {
            var script1;
            var script2;
            WebInspector.debuggerModel._reset();
            var resourceScriptMapping = createResourceScriptMapping();
            var originalUISourceCode1;
            var originalUISourceCode2;
            var url = "index.html";
            step1();

            function step1()
            {
                InspectorTest.addResult("Adding first script for pending request.");
                script1 = InspectorTest.createScriptMock(url, 0, 10, false, "<script source 1>");
                InspectorTest.waitForWorkspaceUISourceCodeAddedEvent(originalUISourceCodeAdded);
                defaultScriptMapping.addScript(script1);
                resourceScriptMapping.addScript(script1);
                
                script1.rawLocationToUILocation(0, 5);

                function originalUISourceCodeAdded(uiSourceCode)
                {
                    originalUISourceCode1 = uiSourceCode;
                }

                InspectorTest.checkUILocation(originalUISourceCode1, 0, 5, script1.rawLocationToUILocation(0, 5));
                InspectorTest.checkRawLocation(script1, 10, 0, originalUISourceCode1.uiLocationToRawLocation(10, 0));
                InspectorTest.dumpUISourceCode(originalUISourceCode1, step2);
            }

            function step2()
            {
                InspectorTest.addResult("Adding second script for pending request.");
                script2 = InspectorTest.createScriptMock(url, 0, 45, false, "<script source 2>");
                InspectorTest.waitForWorkspaceUISourceCodeAddedEvent(originalUISourceCodeAdded);
                defaultScriptMapping.addScript(script2);
                resourceScriptMapping.addScript(script2);

                function originalUISourceCodeAdded(uiSourceCode)
                {
                    originalUISourceCode2 = uiSourceCode;
                }

                InspectorTest.checkUILocation(originalUISourceCode2, 0, 5, script2.rawLocationToUILocation(0, 5));
                InspectorTest.checkRawLocation(script1, 10, 0, originalUISourceCode1.uiLocationToRawLocation(10, 0));
                InspectorTest.dumpUISourceCode(originalUISourceCode2, step3);
            }

            function step3()
            {
                InspectorTest.addResult("Adding uiSourceCode for finished resource.");
                InspectorTest.waitForWorkspaceUISourceCodeAddedEvent(uiSourceCodeAdded);
                InspectorTest.addMockUISourceCodeToWorkspace(url, WebInspector.resourceTypes.Document, "<resource content>");

                function uiSourceCodeAdded(uiSourceCode)
                {
                    InspectorTest.checkUILocation(uiSourceCode, 0, 5, script1.rawLocationToUILocation(0, 5));
                    InspectorTest.checkRawLocation(script1, 10, 0, uiSourceCode.uiLocationToRawLocation(10, 0));
                    InspectorTest.dumpUISourceCode(uiSourceCode, next);
                }
            }
        },

        function testHTMLWithFinishedResource(next)
        {
            var script1;
            var script2;
            WebInspector.debuggerModel._reset();
            var mockUISourceCode;
            var resourceScriptMapping = createResourceScriptMapping();
            var url = "index.html";
            step1();

            function step1()
            {
                InspectorTest.addResult("Adding uiSourceCode for finished resource.");
                InspectorTest.waitForWorkspaceUISourceCodeAddedEvent(uiSourceCodeForResourceAdded);
                InspectorTest.addMockUISourceCodeToWorkspace(url, WebInspector.resourceTypes.Document, "<resource content>");
            }

            function uiSourceCodeForResourceAdded(uiSourceCode)
            {
                mockUISourceCode = uiSourceCode;
                InspectorTest.dumpUISourceCode(uiSourceCode, step2);
            }

            function step2()
            {
                InspectorTest.addResult("Adding first script for finished request.");
                script1 = InspectorTest.createScriptMock(url, 1, 10, false, "<script source 1>");
                resourceScriptMapping.addScript(script1);
                InspectorTest.checkUILocation(mockUISourceCode, 1, 20, script1.rawLocationToUILocation(1, 20));
                InspectorTest.checkRawLocation(script1, 1, 0, mockUISourceCode.uiLocationToRawLocation(1, 0));
                InspectorTest.checkRawLocation(script1, 6, 0, mockUISourceCode.uiLocationToRawLocation(6, 0));
                InspectorTest.dumpUISourceCode(mockUISourceCode, step3);
            }

            function step3()
            {
                InspectorTest.addResult("Adding second script for finished request.");
                script2 = InspectorTest.createScriptMock(url, 5, 45, false, "<script\nsource\n2>");
                resourceScriptMapping.addScript(script2);
                InspectorTest.checkUILocation(mockUISourceCode, 1, 20, script1.rawLocationToUILocation(1, 20));
                InspectorTest.checkRawLocation(script1, 1, 0, mockUISourceCode.uiLocationToRawLocation(1, 0));
                InspectorTest.checkRawLocation(script2, 6, 0, mockUISourceCode.uiLocationToRawLocation(6, 0));
                InspectorTest.dumpUISourceCode(mockUISourceCode, next);
            }
        }
    ]);
};

</script>
</head>
<body onload="runTest()">
<p>Tests ResourceScriptMapping class.</p>
</body>
</html>
