blob: fddad5e3432c5c92063d9a1f8bb6a4160a27a314 [file] [log] [blame]
<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>