<html>
<script src="jsdifflib.js"></script>
<script src="utilities.js"></script>
<script src="DOMExtension.js"></script>
<script src="treeoutline.js"></script>

<link rel="stylesheet" type="text/css" href="inspector.css">
<style>
:focus {
    outline: none;
}

.failed {
    color: red;
}

.timeout {
    color: brown;
}

iframe {
    width: 0;
    height: 0;
    opacity: 0;
}

</style>

<script>

var layoutTestsServer = "http://localhost:8002/";
var scannerServer = "http://localhost:8002/";
var remoteDebuggingServer = "http://localhost:9222/";

var tests = [];
var skipList = [
    // HALT
    "inspector/console/console-api-on-call-frame.html",

    // FAILED
    "inspector/console/console-dir-global.html",
    "inspector/console/console-log-toString-object.html",
    "inspector/console/console-uncaught-exception-in-eval.html",
    "inspector/elements/edit-dom-actions.html",
    "inspector/elements/highlight-node-scaled.html",
    "inspector/elements/highlight-node-scroll.html",
    "inspector/elements/highlight-node.html",
    "inspector/elements/highlight-svg-root.html",
    "inspector/network-status-non-http.html",
    "inspector/storage-panel-dom-storage-update.html",
    "inspector/styles/inject-stylesheet.html",
    "inspector/styles/protocol-css-regions-commands.html",
    "inspector/styles/region-style-crash.html",
    "inspector/styles/styles-disable-then-enable-overriden-ua.html",
    "inspector/styles/styles-url-linkify.html",
    "inspector/styles/vendor-prefixes.html",
    "inspector/timeline/timeline-event-dispatch.html",
    "inspector/timeline/timeline-frames.html",
    "inspector/timeline/timeline-network-resource.html",
    "inspector/timeline/timeline-paint.html",
    "inspector/timeline/timeline-receive-response-event.html",

    // TIMEOUT
    "inspector/profiler/cpu-profiler-profiling-without-inspector.html",
    "inspector/profiler/heap-snapshot-inspect-dom-wrapper.html",
    "inspector/timeline/timeline-network-received-data.html",
];
var treeOutline = null;

function run(debug)
{
    if (window.runner && debug) {
        window.runner.continueDebugging();
        return;
    }

    if (window.testScannerIframe) 
        document.body.removeChild(window.testScannerIframe);

    if (window.runner)
        window.runner.cleanup();

    window.testScannerIframe = document.createElement("iframe");
    window.testScannerIframe.src = scannerServer + "LayoutTests/http/tests/inspector/resources/test-scanner.html";
    document.body.appendChild(window.testScannerIframe);
    window.debug = debug;
}

function runTests()
{
    document.getElementById("outline").removeChildren();
    treeOutline = new TreeOutline(document.getElementById("outline"));

    document.getElementById("pass").textContent = 0;
    document.getElementById("skip").textContent = 0;
    document.getElementById("fail").textContent = 0;
    document.getElementById("timeout").textContent = 0;
    document.getElementById("remaining").textContent = tests.length;

    runNextTest();
}

function interrupt()
{
    tests = [];
}

function runNextTest(lastResult)
{
    if (lastResult) {
        var element = document.getElementById(lastResult);
        element.textContent = parseInt(element.textContent) + 1;

        element = document.getElementById("remaining");
        element.textContent = parseInt(element.textContent) - 1;
        if (window.debug) {
            document.getElementById("debug").textContent = "Debug";
            return;
        }
    }

    var test;
    var filter = document.getElementById("filter").value;
    while (test = tests.shift()) {
        if (!filter || test[0].match(filter)) {
            new StandaloneTestRunner(layoutTestsServer + test[0], test[1], runNextTest.bind(null));
            return;
        }
    }
}

function StandaloneTestRunner(testPath, expected, next)
{
    this._testPath = testPath;
    this._next = next;
    this._expected = expected;
    this._pendingMessages = [];

    this._treeElement = new TreeElement(testPath);
    treeOutline.appendChild(this._treeElement);

    for (var i = 0; !window.debug && i < skipList.length; ++i) {
        if (testPath.indexOf(skipList[i]) !== -1) {
            this._treeElement.title = testPath + ": SKIPPED";
            this._next("skip");
            return;
        }
    }
    window.runner = this;
    this._testPage = window.open("about:blank", "inspected", "width=800,height=600");

    window.remoteDebuggingHandshake = this._remoteDebuggingHandshake.bind(this);
    var script = document.createElement("script");
    script.src = remoteDebuggingServer + "json?jsonp=remoteDebuggingHandshake";
    document.head.appendChild(script);
}

StandaloneTestRunner.FrontendLocation = "inspector.html";

StandaloneTestRunner.prototype = {
    _remoteDebuggingHandshake: function(data)
    {
        for (var i = 0; i < data.length; ++i) {
            if (data[i].url !== "about:blank")
                continue;
            this._debuggerURL = data[i].webSocketDebuggerUrl.replace("://", "=");
            this._navigateTestPage();
            break;
        }
    },

    _navigateTestPage: function()
    {
        this._testPage.location.href = this._testPath;
        var width = localStorage.getItem('inspectorWidth') || 600;
        var height = localStorage.getItem('inspectorHeight') || 400;
        var features = "width=" + Math.max(width , 600) + ",height=" + Math.max(height, 400);
        this._inspectorWindowLoading = window.open(StandaloneTestRunner.FrontendLocation + "?" + this._debuggerURL, "inspector", features);
        this._inspectorWindowLoading.dispatchStandaloneTestRunnerMessages = true;
        
        window.addEventListener('unload', this.cleanup.bind(this));

        if (!window.debug)
            this._watchDog = setTimeout(this._timeout.bind(this), 10000);
    },

    loadCompleted: function()
    {
        if (!window.debug) {
            this._loadCompleted(this);
            return;
        }
        document.getElementById("debug").textContent = "Continue";
    },

    continueDebugging: function()
    {
        this._loadCompleted();
    },

    _loadCompleted: function()
    {
        this._inspectorWindow = this._inspectorWindowLoading;
        for (var i = 0; i < this._pendingMessages.length; ++i)
            this._inspectorWindow.postMessage(this._pendingMessages[i], "*");
        this._pendingMessages = [];
    },

    closeWebInspector: function()
    {
        if (!window.debug)
            this._inspectorWindow.close();
    },

    notifyDone: function(actual)
    {
        if (this._done)
            return;
        this._done = true;

        if (!window.debug) 
            this.cleanup()

        clearTimeout(this._watchDog);

        this._treeElement.onselect = this.onTreeElementSelect.bind(this);

        // TODO pavel  is the  RHS || condition wanted?
        if (actual === this._expected || actual === this._expected + "\n") {
            this._treeElement.title = this._testPath + ": SUCCESS";
            this._next("pass");
            return;
        }

        this._treeElement.title = this._testPath + ": FAILED";
        this._treeElement.listItemElement.addStyleClass("failed");

        var baseLines = difflib.stringAsLines(this._expected);
        var newLines = difflib.stringAsLines(actual);
        var sm = new difflib.SequenceMatcher(baseLines, newLines);
        var opcodes = sm.get_opcodes();
        var lastWasSeparator = false;

        for (var idx = 0; idx < opcodes.length; idx++) {
            var code = opcodes[idx];
            var change = code[0];
            var b = code[1];
            var be = code[2];
            var n = code[3];
            var ne = code[4];
            var rowCount = Math.max(be - b, ne - n);
            var topRows = [];
            var bottomRows = [];
            for (var i = 0; i < rowCount; i++) {
                if (change === "delete" || (change === "replace" && b < be)) {
                    var lineNumber = b++;
                    this._treeElement.appendChild(new TreeElement("- [" + lineNumber + "] " + baseLines[lineNumber]));
                }

                if (change === "insert" || (change === "replace" && n < ne)) {
                    var lineNumber = n++;
                    this._treeElement.appendChild(new TreeElement("+ [" + lineNumber + "] " + newLines[lineNumber]));
                }

                if (change === "equal") {
                    b++;
                    n++;
                }
            }
        }

        this._next("fail");
    },

    evaluateInWebInspector: function(callId, script)
    {
        if (this._inspectorWindow)
            this._inspectorWindow.postMessage(["evaluateForTest", callId, script], "*");
        else
            this._pendingMessages.push(["evaluateForTest", callId, script]);
    },

    _timeout: function()
    {
        this._treeElement.title = this._testPath + ": TIMEOUT";
        this._treeElement.listItemElement.addStyleClass("timeout");
        this._done = true;
        this.cleanup();
        this._next("timeout");
    },

    cleanup: function ()
    {
        localStorage.setItem('inspectorWidth', this._inspectorWindowLoading.outerWidth);
        localStorage.setItem('inspectorHeight', this._inspectorWindowLoading.outerHeight);
        this._inspectorWindowLoading.close();
        this._testPage.close();
        delete window.runner;
    },

    onTreeElementSelect: function () 
    {
        var baseEndSentinel = '/inspector/';
        var baseChars = this._testPath.indexOf(baseEndSentinel) + baseEndSentinel.length;
        if (baseChars > 0) 
            document.getElementById("filter").value = this._testPath.substr(baseChars);
    },

    display: function() { }
}

function onMessageFromTestPage(event)
{
    var signature = event.data;
    var method = signature.shift();
    if (method === "tests") {
        tests = signature[0];
        runTests();
        return;
    }

    if (window.runner)
        window.runner[method].apply(window.runner, signature);
}

function onload()
{
    var queryParamsObject = {};
    var queryParams = window.location.search;
    if (!queryParams)
        return;
    var params = queryParams.substring(1).split("&");
    for (var i = 0; i < params.length; ++i) {
        var pair = params[i].split("=");
        queryParamsObject[pair[0]] = pair[1];
    }
    if ("filter" in queryParamsObject)
        document.getElementById("filter").value = queryParamsObject["filter"];
}

window.addEventListener("message", onMessageFromTestPage, true);

</script>
<body onload="onload()">
This is a standalone test suite for inspector front-end. Here is how you run it:
<ul>
<li>Check out WebKit source tree: git clone http://git.chromium.org/external/Webkit.git</li>
<li>Run "Tools/Scripts/new-run-webkit-httpd --root=. --port=8002 --server=start"</li>
<li>Run Chrome Canary (ToT Chromium) with following flags: "--remote-debugging-port=9222 --user-data-dir=testProfile http://localhost:8002/Source/devtools/front_end/test-runner.html"</li>
</ul>

<button onclick="run()">Run</button>
<button id="debug" onclick="run(true)">Debug</button>
<button onclick="interrupt()">Interrupt</button>
Filter: <input id="filter" type="text" size="40"></input><small><i>Click on results to load filter</i></small><br>

<span>Passed: <span id="pass">0</span></span>
<span>Failed: <span id="fail">0</span></span>
<span>Timeout: <span id="timeout">0</span></span>
<span>Skipped: <span id="skip">0</span></span>
<span>Remaining: <span id="remaining">0</span><br>

<ol id="outline" style="font-size: 12px !important" class="source-code outline-disclosure"></ol>

</body>
</html>
