18a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/*
28a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Copyright (C) 2010 Google Inc. All rights reserved.
38a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *
48a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Redistribution and use in source and binary forms, with or without
58a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * modification, are permitted provided that the following conditions are
68a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * met:
78a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *
88a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *     * Redistributions of source code must retain the above copyright
98a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * notice, this list of conditions and the following disclaimer.
108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *     * Redistributions in binary form must reproduce the above
118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * copyright notice, this list of conditions and the following disclaimer
128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * in the documentation and/or other materials provided with the
138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * distribution.
148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *     * Neither the name of Google Inc. nor the names of its
158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * contributors may be used to endorse or promote products derived from
168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * this software without specific prior written permission.
178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *
188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @fileoverview This file contains small testing framework along with the
348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * test suite for the frontend. These tests are a part of the continues build
358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * and are executed by the devtools_sanity_unittest.cc as a part of the
368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Interactive UI Test suite.
378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * FIXME: change field naming style to use trailing underscore.
388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockif (window.domAutomationController) {
418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvar ___interactiveUiTestsMode = true;
438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Test suite for interactive UI tests.
468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @constructor
478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite = function()
498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.controlTaken_ = false;
518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.timerId_ = -1;
528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Reports test failure.
578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {string} message Failure description.
588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.fail = function(message)
608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (this.controlTaken_)
628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this.reportFailure_(message);
638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    else
648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        throw message;
658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Equals assertion tests that expected === actual.
708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {Object} expected Expected object.
718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {Object} actual Actual object.
728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {string} opt_message User message to print if the test fails.
738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.assertEquals = function(expected, actual, opt_message)
758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (expected !== actual) {
778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        var message = "Expected: '" + expected + "', but was '" + actual + "'";
788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (opt_message)
798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            message = opt_message + "(" + message + ")";
808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this.fail(message);
818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * True assertion tests that value == true.
868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {Object} value Actual object.
878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {string} opt_message User message to print if the test fails.
888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.assertTrue = function(value, opt_message)
908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.assertEquals(true, !!value, opt_message);
928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Contains assertion tests that string contains substring.
978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {string} string Outer.
988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {string} substring Inner.
998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
1008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.assertContains = function(string, substring)
1018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
1028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (string.indexOf(substring) === -1)
1038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this.fail("Expected to: '" + string + "' to contain '" + substring + "'");
1048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
1058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
1088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Takes control over execution.
1098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
1108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.takeControl = function()
1118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
1128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.controlTaken_ = true;
1138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Set up guard timer.
1148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var self = this;
1158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.timerId_ = setTimeout(function() {
1168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        self.reportFailure_("Timeout exceeded: 20 sec");
1178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }, 20000);
1188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
1198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
1228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Releases control over execution.
1238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
1248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.releaseControl = function()
1258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
1268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (this.timerId_ !== -1) {
1278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        clearTimeout(this.timerId_);
1288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this.timerId_ = -1;
1298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
1308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.reportOk_();
1318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
1328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
1358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Async tests use this one to report that they are completed.
1368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
1378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.reportOk_ = function()
1388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
1398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    window.domAutomationController.send("[OK]");
1408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
1418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
1448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Async tests use this one to report failures.
1458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
1468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.reportFailure_ = function(error)
1478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
1488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (this.timerId_ !== -1) {
1498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        clearTimeout(this.timerId_);
1508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this.timerId_ = -1;
1518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
1528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    window.domAutomationController.send("[FAILED] " + error);
1538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
1548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
1578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Runs all global functions starting with "test" as unit tests.
1588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
1598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.runTest = function(testName)
1608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
1618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    try {
1628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this[testName]();
1638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!this.controlTaken_)
1648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            this.reportOk_();
1658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    } catch (e) {
1668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this.reportFailure_(e);
1678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
1688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
1698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
1728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {string} panelName Name of the panel to show.
1738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
1748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.showPanel = function(panelName)
1758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
1768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Open Scripts panel.
1778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var toolbar = document.getElementById("toolbar");
1788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var button = toolbar.getElementsByClassName(panelName)[0];
1798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    button.click();
1808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.assertEquals(WebInspector.panels[panelName], WebInspector.currentPanel);
1818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
1828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
1858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Overrides the method with specified name until it's called first time.
1868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {Object} receiver An object whose method to override.
1878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {string} methodName Name of the method to override.
1888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {Function} override A function that should be called right after the
1898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *     overriden method returns.
1908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {boolean} opt_sticky Whether restore original method after first run
1918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *     or not.
1928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
1938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.addSniffer = function(receiver, methodName, override, opt_sticky)
1948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
1958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var orig = receiver[methodName];
1968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (typeof orig !== "function")
1978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this.fail("Cannot find method to override: " + methodName);
1988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
1998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    receiver[methodName] = function(var_args) {
2008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        try {
2018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            var result = orig.apply(this, arguments);
2028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        } finally {
2038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (!opt_sticky)
2048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                receiver[methodName] = orig;
2058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        }
2068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        // In case of exception the override won't be called.
2078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        try {
2088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            override.apply(this, arguments);
2098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        } catch (e) {
2108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            test.fail("Exception in overriden method '" + methodName + "': " + e);
2118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        }
2128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return result;
2138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    };
2148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
2158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.testEnableResourcesTab = function()
2188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME once reference is removed downstream.
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
2218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochTestSuite.prototype.testCompletionOnPause = function()
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME once reference is removed downstream.
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
2268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// UI Tests
2288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
2318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Tests that profiler works.
2328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
2338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.testProfilerTab = function()
2348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
2358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.showPanel("profiles");
2368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    var panel = WebInspector.panels.profiles;
2388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
2398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    function findDisplayedNode() {
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        var node = panel.visibleView.profileDataGridTree.children[0];
242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!node) {
243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Profile hadn't been queried yet, re-schedule.
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            window.setTimeout(findDisplayedNode, 100);
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return;
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
2478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Iterate over displayed functions and search for a function
249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // that is called "fib" or "eternal_fib". If found, this will mean
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // that we actually have profiled page's code.
251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        while (node) {
252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (node.functionName.indexOf("fib") !== -1)
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                test.releaseControl();
254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            node = node.traverseNextNode(true, null, true);
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        test.fail();
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    function findVisibleView() {
261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!panel.visibleView) {
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            setTimeout(findVisibleView, 0);
263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return;
264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
26506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        setTimeout(findDisplayedNode, 0);
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    findVisibleView();
2698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.takeControl();
2708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
2718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
27406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Tests that heap profiler works.
27506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen */
27606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenTestSuite.prototype.testHeapProfiler = function()
27706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
27806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    this.showPanel("profiles");
27906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
28006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    var panel = WebInspector.panels.profiles;
28106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    var test = this;
28206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
28306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    function findDisplayedNode() {
28406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        var node = panel.visibleView.dataGrid.children[0];
28506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!node) {
28606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // Profile hadn't been queried yet, re-schedule.
28706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            window.setTimeout(findDisplayedNode, 100);
28806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return;
28906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
29006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
29106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // Iterate over displayed functions and find node called "A"
29206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // If found, this will mean that we actually have taken heap snapshot.
29306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        while (node) {
29406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (node.constructorName.indexOf("A") !== -1) {
29506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                test.releaseControl();
29606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return;
29706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            }
29806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            node = node.traverseNextNode(false, null, true);
29906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
30006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
30106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        test.fail();
30206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
30306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
30406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    function findVisibleView() {
30506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!panel.visibleView) {
30606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            setTimeout(findVisibleView, 0);
30706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return;
30806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
30906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        setTimeout(findDisplayedNode, 0);
31006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
31106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
31206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    WebInspector.HeapSnapshotProfileType.prototype.buttonClicked();
31306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    findVisibleView();
31406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    this.takeControl();
31506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
31606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
31706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
31806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen/**
3198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Tests that scripts tab can be open and populated with inspected scripts.
3208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
3218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.testShowScriptsTab = function()
3228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
3238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.showPanel("scripts");
3248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
3258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // There should be at least main page script.
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    this._waitUntilScriptsAreParsed(["debugger_test_page.html"],
3278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        function() {
3288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            test.releaseControl();
3298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        });
3308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Wait until all scripts are added to the debugger.
3318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.takeControl();
3328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
3338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
3368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Tests that scripts tab is populated with inspected scripts even if it
3378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * hadn't been shown by the moment inspected paged refreshed.
3388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @see http://crbug.com/26312
3398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
3408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh = function()
3418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
3428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
3438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.assertEquals(WebInspector.panels.elements, WebInspector.currentPanel, "Elements panel should be current one.");
3448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
34506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    this.addSniffer(WebInspector.panels.scripts, "reset", waitUntilScriptIsParsed);
3468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Reload inspected page. It will reset the debugger agent.
3488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test.evaluateInConsole_(
3498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        "window.location.reload(true);",
35006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        function(resultText) {});
3518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    function waitUntilScriptIsParsed() {
3538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test.showPanel("scripts");
35406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        test._waitUntilScriptsAreParsed(["debugger_test_page.html"],
35506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            function() {
35606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                test.releaseControl();
35706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            });
3588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
3598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Wait until all scripts are added to the debugger.
3618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.takeControl();
3628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
3638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
3668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Tests that scripts list contains content scripts.
3678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
3688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.testContentScriptIsPresent = function()
3698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
3708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.showPanel("scripts");
3718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
3728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test._waitUntilScriptsAreParsed(
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ["page_with_content_script.html", "simple_content_script.js"],
3758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        function() {
3768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block          test.releaseControl();
3778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        });
3788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Wait until all scripts are added to the debugger.
3808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.takeControl();
3818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
3828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
3858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Tests that scripts are not duplicaed on Scripts tab switch.
3868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
3878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function()
3888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
3898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
3908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // There should be two scripts: one for the main page and another
3928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // one which is source of console API(see
3938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // InjectedScript._ensureCommandLineAPIInstalled).
3948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var expectedScriptsCount = 2;
3958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var parsedScripts = [];
3968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.showPanel("scripts");
3988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    function switchToElementsTab() {
4018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test.showPanel("elements");
4028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        setTimeout(switchToScriptsTab, 0);
4038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
4048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    function switchToScriptsTab() {
4068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test.showPanel("scripts");
4078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        setTimeout(checkScriptsPanel, 0);
4088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
4098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    function checkScriptsPanel() {
4118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test.assertTrue(!!WebInspector.panels.scripts.visibleView, "No visible script view.");
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html"]), "Some scripts are missing.");
4138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        checkNoDuplicates();
4148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test.releaseControl();
4158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
4168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    function checkNoDuplicates() {
4188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        var scriptSelect = document.getElementById("scripts-files");
4198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        var options = scriptSelect.options;
4208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        for (var i = 0; i < options.length; i++) {
4218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            var scriptName = options[i].text;
4228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            for (var j = i + 1; j < options.length; j++)
4238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                test.assertTrue(scriptName !== options[j].text, "Found script duplicates: " + test.optionsToString_(options));
4248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        }
4258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
4268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test._waitUntilScriptsAreParsed(
428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ["debugger_test_page.html"],
4298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        function() {
4308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            checkNoDuplicates();
4318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            setTimeout(switchToElementsTab, 0);
4328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        });
4338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Wait until all scripts are added to the debugger.
4368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.takeControl();
4378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
4388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block// Tests that debugger works correctly if pause event occurs when DevTools
4418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block// frontend is being loaded.
4428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.testPauseWhenLoadingDevTools = function()
4438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
4448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.showPanel("scripts");
4458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
4468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var expectations = {
4488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            functionsOnStack: ["callDebugger"],
4498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            lineNumber: 8,
4508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            lineText: "  debugger;"
4518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        };
4528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Script execution can already be paused.
4558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (WebInspector.currentPanel.paused) {
45681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        var callFrame = WebInspector.currentPanel._presentationModel.selectedCallFrame;
4578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this.assertEquals(expectations.functionsOnStack[0], callFrame.functionName);
4588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        var callbackInvoked = false;
4598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this._checkSourceFrameWhenLoaded(expectations, function() {
4608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                callbackInvoked = true;
4618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                if (test.controlTaken_)
4628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                    test.releaseControl();
4638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            });
4648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!callbackInvoked) {
4658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            test.takeControl();
4668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        }
4678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return;
4688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
4698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this._waitForScriptPause(
4718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        {
4728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            functionsOnStack: ["callDebugger"],
4738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            lineNumber: 8,
4748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            lineText: "  debugger;"
4758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        },
4768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        function() {
4778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            test.releaseControl();
4788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        });
4798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.takeControl();
4808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
4818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block// Tests that pressing "Pause" will pause script execution if the script
4848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block// is already running.
4858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.testPauseWhenScriptIsRunning = function()
4868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
4878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.showPanel("scripts");
4888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
4898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test.evaluateInConsole_(
4918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        'setTimeout("handleClick()" , 0)',
4928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        function(resultText) {
4938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block          test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
4948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block          testScriptPauseAfterDelay();
4958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        });
4968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Wait for some time to make sure that inspected page is running the
4988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // infinite loop.
4998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    function testScriptPauseAfterDelay() {
5008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        setTimeout(testScriptPause, 300);
5018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
5028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
5038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    function testScriptPause() {
5048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        // The script should be in infinite loop. Click "Pause" button to
5058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        // pause it and wait for the result.
5068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        WebInspector.panels.scripts.pauseButton.click();
5078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
5088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test._waitForScriptPause(
5098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            {
51006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                functionsOnStack: ["handleClick", ""],
5118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                lineNumber: 5,
5128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                lineText: "  while(true) {"
5138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            },
5148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            function() {
5158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                test.releaseControl();
5168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            });
5178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
5188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
5198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.takeControl();
5208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
5218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
5228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
5238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
5242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Tests network size.
5252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */
5262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochTestSuite.prototype.testNetworkSize = function()
5272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
5282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    var test = this;
5292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    function finishResource(resource, finishTime)
5312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.assertEquals(221, resource.transferSize, "Incorrect total encoded data length");
5332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.assertEquals(25, resource.resourceSize, "Incorrect total data length");
5342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.releaseControl();
5352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.addSniffer(WebInspector.NetworkDispatcher.prototype, "_finishResource", finishResource);
5382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Reload inspected page to sniff network events
5402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    test.evaluateInConsole_("window.location.reload(true);", function(resultText) {});
5412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.takeControl();
5432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch};
5442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch/**
5472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Tests network sync size.
5482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */
5492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochTestSuite.prototype.testNetworkSyncSize = function()
5502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
5512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    var test = this;
5522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    function finishResource(resource, finishTime)
5542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.assertEquals(221, resource.transferSize, "Incorrect total encoded data length");
5562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.assertEquals(25, resource.resourceSize, "Incorrect total data length");
5572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.releaseControl();
5582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.addSniffer(WebInspector.NetworkDispatcher.prototype, "_finishResource", finishResource);
5612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Send synchronous XHR  to sniff network events
5632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    test.evaluateInConsole_("var xhr = new XMLHttpRequest(); xhr.open(\"GET\", \"chunked\", false); xhr.send(null);", function() {});
5642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.takeControl();
5662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch};
5672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch/**
5702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Tests network raw headers text.
5712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */
5722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochTestSuite.prototype.testNetworkRawHeadersText = function()
5732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
5742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    var test = this;
5752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    function finishResource(resource, finishTime)
5772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var rawResponseHeadersText = resource.rawResponseHeadersText
5792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!rawResponseHeadersText)
5802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            test.fail("Failure: resource does not have raw response header text");
5812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.assertEquals(166, resource.rawResponseHeadersText.length, "Incorrect raw response header text length");
5822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.releaseControl();
5832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.addSniffer(WebInspector.NetworkDispatcher.prototype, "_finishResource", finishResource);
5862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Reload inspected page to sniff network events
5882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    test.evaluateInConsole_("window.location.reload(true);", function(resultText) {});
5892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.takeControl();
5912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch};
5922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch/**
5952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Tests network timing.
5962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */
5972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochTestSuite.prototype.testNetworkTiming = function()
5982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
5992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    var test = this;
6002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    function finishResource(resource, finishTime)
6022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
6032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.assertTrue(resource.timing.receiveHeadersEnd - resource.timing.connectStart >= 100,
6042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                        "Time between receiveHeadersEnd and connectStart should be >=100ms, but was " +
6052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                        "receiveHeadersEnd=" + resource.timing.receiveHeadersEnd + ", connectStart=" + resource.timing.connectStart + ".");
6062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.assertTrue(resource.endTime - resource.startTime >= 0.2,
6072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                        "Time between endTime and startTime should be >=200ms, but was " +
6082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                        "endtime=" + resource.endTime + ", startTime=" + resource.startTime + ".");
6092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        test.releaseControl();
6112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.addSniffer(WebInspector.NetworkDispatcher.prototype, "_finishResource", finishResource);
6142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Reload inspected page to sniff network events
6162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    test.evaluateInConsole_("window.location.reload(true);", function(resultText) {});
6172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.takeControl();
6192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch};
6202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch/**
6238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Serializes options collection to string.
6248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {HTMLOptionsCollection} options
6258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @return {string}
6268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
6278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.optionsToString_ = function(options)
6288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
6298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var names = [];
6308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    for (var i = 0; i < options.length; i++)
6318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        names.push('"' + options[i].text + '"');
6328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    return names.join(",");
6338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
6348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
6378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Ensures that main HTML resource is selected in Scripts panel and that its
6388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * source frame is setup. Invokes the callback when the condition is satisfied.
6398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {HTMLOptionsCollection} options
6408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {function(WebInspector.SourceView,string)} callback
6418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
6428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.showMainPageScriptSource_ = function(scriptName, callback)
6438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
6448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
6458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var scriptSelect = document.getElementById("scripts-files");
6478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var options = scriptSelect.options;
6488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test.assertTrue(options.length, "Scripts list is empty");
6508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Select page's script if it's not current option.
6528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var scriptResource;
6538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (options[scriptSelect.selectedIndex].text === scriptName)
6548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        scriptResource = options[scriptSelect.selectedIndex].representedObject;
6558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    else {
6568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        var pageScriptIndex = -1;
6578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        for (var i = 0; i < options.length; i++) {
6588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (options[i].text === scriptName) {
6598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                pageScriptIndex = i;
6608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                break;
6618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            }
6628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        }
6638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test.assertTrue(-1 !== pageScriptIndex, "Script with url " + scriptName + " not found among " + test.optionsToString_(options));
6648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        scriptResource = options[pageScriptIndex].representedObject;
6658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        // Current panel is "Scripts".
6678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        WebInspector.currentPanel._showScriptOrResource(scriptResource);
6688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test.assertEquals(pageScriptIndex, scriptSelect.selectedIndex, "Unexpected selected option index.");
6698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
6708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test.assertTrue(scriptResource instanceof WebInspector.Resource,
6728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                    "Unexpected resource class.");
6738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test.assertTrue(!!scriptResource.url, "Resource URL is null.");
6748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test.assertTrue(scriptResource.url.search(scriptName + "$") !== -1, "Main HTML resource should be selected.");
6758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var scriptsPanel = WebInspector.panels.scripts;
6778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var view = scriptsPanel.visibleView;
6798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test.assertTrue(view instanceof WebInspector.SourceView);
6808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!view.sourceFrame._loaded) {
6828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test.addSniffer(view, "_sourceFrameSetupFinished", function(event) {
6838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            callback(view, scriptResource.url);
6848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        });
6858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    } else
6868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        callback(view, scriptResource.url);
6878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
6888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/*
6918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Evaluates the code in the console as if user typed it manually and invokes
6928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * the callback when the result message is received and added to the console.
6938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {string} code
6948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {function(string)} callback
6958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
6968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype.evaluateInConsole_ = function(code, callback)
6978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
698e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    WebInspector.showConsole();
6998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    WebInspector.console.prompt.text = code;
7008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter"));
7018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.addSniffer(WebInspector.ConsoleView.prototype, "addMessage",
7038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        function(commandResult) {
7048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            callback(commandResult.toMessageElement().textContent);
7058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        });
7068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
7078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
7108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Checks current execution line against expectations.
7118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {WebInspector.SourceFrame} sourceFrame
7128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {number} lineNumber Expected line number
7138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {string} lineContent Expected line text
7148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
7158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype._checkExecutionLine = function(sourceFrame, lineNumber, lineContent)
7168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
71781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    this.assertEquals(lineNumber, sourceFrame._executionLineNumber + 1, "Unexpected execution line number.");
7188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    this.assertEquals(lineContent, sourceFrame._textModel.line(lineNumber - 1), "Unexpected execution line text.");
7198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
7208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
7238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Checks that all expected scripts are present in the scripts list
7248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * in the Scripts panel.
7258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {Array.<string>} expected Regular expressions describing
7268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *     expected script names.
7278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @return {boolean} Whether all the scripts are in "scripts-files" select
7288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *     box
7298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
7308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype._scriptsAreParsed = function(expected)
7318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
7328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var scriptSelect = document.getElementById("scripts-files");
7338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var options = scriptSelect.options;
7348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Check that at least all the expected scripts are present.
7368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var missing = expected.slice(0);
7378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    for (var i = 0 ; i < options.length; i++) {
7388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        for (var j = 0; j < missing.length; j++) {
7398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (options[i].text.search(missing[j]) !== -1) {
7408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                missing.splice(j, 1);
7418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                break;
7428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            }
7438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        }
7448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
7458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    return missing.length === 0;
7468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
7478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
7508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Waits for script pause, checks expectations, and invokes the callback.
7518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {Object} expectations  Dictionary of expectations
7528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {function():void} callback
7538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
7548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype._waitForScriptPause = function(expectations, callback)
7558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
7568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
7578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Wait until script is paused.
7588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test.addSniffer(
759f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        WebInspector.debuggerModel,
76065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        "_pausedScript",
7615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        function(details) {
7625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            var callFrames = details.callFrames;
7638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            var functionsOnStack = [];
7648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            for (var i = 0; i < callFrames.length; i++)
7658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                functionsOnStack.push(callFrames[i].functionName);
7668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            test.assertEquals(expectations.functionsOnStack.join(","), functionsOnStack.join(","), "Unexpected stack.");
7688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            // Check that execution line where the script is paused is
7708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            // expected one.
7718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            test._checkSourceFrameWhenLoaded(expectations, callback);
7728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        });
7738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
7748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
7778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Waits for current source frame to load, checks expectations, and invokes
7788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * the callback.
7798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {Object} expectations  Dictionary of expectations
7808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {function():void} callback
7818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
7828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype._checkSourceFrameWhenLoaded = function(expectations, callback)
7838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
7848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
7858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    var frame = WebInspector.currentPanel.visibleView;
787ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
788ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (frame._textViewer)
7898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        checkExecLine();
7908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    else {
7918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        setTimeout(function() {
7928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            test._checkSourceFrameWhenLoaded(expectations, callback);
7938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        }, 100);
7948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
7958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    function checkExecLine() {
7968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test._checkExecutionLine(frame, expectations.lineNumber, expectations.lineText);
7978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        callback();
7988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
7998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
8008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
8038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Waits until all the scripts are parsed and asynchronously executes the code
8048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * in the inspected page.
8058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
8068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype._executeCodeWhenScriptsAreParsed = function(code, expectedScripts)
8078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
8088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
8098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    function executeFunctionInInspectedPage() {
8118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        // Since breakpoints are ignored in evals' calculate() function is
8128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        // execute after zero-timeout so that the breakpoint is hit.
8138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        test.evaluateInConsole_(
8148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            'setTimeout("' + code + '" , 0)',
8158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            function(resultText) {
81606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText + ". Code: " + code);
8178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            });
8188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
8198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    test._waitUntilScriptsAreParsed(expectedScripts, executeFunctionInInspectedPage);
8218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
8228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
8258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Waits until all the scripts are parsed and invokes the callback.
8268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
8278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.prototype._waitUntilScriptsAreParsed = function(expectedScripts, callback)
8288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
8298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var test = this;
8308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    function waitForAllScripts() {
8328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (test._scriptsAreParsed(expectedScripts))
8338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            callback();
8348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        else
83581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            test.addSniffer(WebInspector.panels.scripts, "_addOptionToFilesSelect", waitForAllScripts);
8368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
8378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    waitForAllScripts();
8398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
8408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
8438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Key event with given key identifier.
8448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
8458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockTestSuite.createKeyEvent = function(keyIdentifier)
8468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
8478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    var evt = document.createEvent("KeyboardEvent");
8488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    evt.initKeyboardEvent("keydown", true /* can bubble */, true /* can cancel */, null /* view */, keyIdentifier, "");
8498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    return evt;
8508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
8518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
8548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Test runner for the test suite.
8558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
8568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvar uiTests = {};
8578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
8608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Run each test from the test suit on a fresh instance of the suite.
8618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
8628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockuiTests.runAllTests = function()
8638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
8648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // For debugging purposes.
8658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    for (var name in TestSuite.prototype) {
8668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (name.substring(0, 4) === "test" && typeof TestSuite.prototype[name] === "function")
8678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            uiTests.runTest(name);
8688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
8698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
8708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/**
8738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Run specified test on a fresh instance of the test suite.
8748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * @param {string} name Name of a test method from TestSuite class.
8758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
8768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockuiTests.runTest = function(name)
8778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
878dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (uiTests._populatedInterface)
879dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        new TestSuite().runTest(name);
880dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    else
881dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        uiTests._pendingTestName = name;
8828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
8838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
884dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch(function() {
885dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
886dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochfunction runTests()
887dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
888dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    uiTests._populatedInterface = true;
889dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    var name = uiTests._pendingTestName;
890dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    delete uiTests._pendingTestName;
891dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (name)
892dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        new TestSuite().runTest(name);
893dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
894dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
895dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvar oldShowElementsPanel = WebInspector.showElementsPanel;
896dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochWebInspector.showElementsPanel = function()
897dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
898dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    oldShowElementsPanel.call(this);
899dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    runTests();
900dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
901dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
902dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvar oldShowPanel = WebInspector.showPanel;
903dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochWebInspector.showPanel = function(name)
904dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
905dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    oldShowPanel.call(this, name);
906dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    runTests();
907dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
908dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
909dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch})();
9108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
9118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
912