Index: chrome/tools/test/reference_build/chrome_linux/resources/inspector/tests.js |
diff --git a/chrome/tools/test/reference_build/chrome_linux/resources/inspector/tests.js b/chrome/tools/test/reference_build/chrome_linux/resources/inspector/tests.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c99595979c913d479b3f094629ead8e96ad63338 |
--- /dev/null |
+++ b/chrome/tools/test/reference_build/chrome_linux/resources/inspector/tests.js |
@@ -0,0 +1,587 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+ |
+/** |
+ * @fileoverview This file contains small testing framework along with the |
+ * test suite for the frontend. These tests are a part of the continues build |
+ * and are executed by the devtools_sanity_unittest.cc as a part of the |
+ * Interactive UI Test suite. |
+ */ |
+ |
+if (window.domAutomationController) { |
+ |
+var ___interactiveUiTestsMode = true; |
+ |
+/** |
+ * Test suite for interactive UI tests. |
+ * @constructor |
+ */ |
+TestSuite = function() { |
+ this.controlTaken_ = false; |
+ this.timerId_ = -1; |
+}; |
+ |
+ |
+/** |
+ * Reports test failure. |
+ * @param {string} message Failure description. |
+ */ |
+TestSuite.prototype.fail = function(message) { |
+ if (this.controlTaken_) { |
+ this.reportFailure_(message); |
+ } else { |
+ throw message; |
+ } |
+}; |
+ |
+ |
+/** |
+ * Equals assertion tests that expected == actual. |
+ * @param {Object} expected Expected object. |
+ * @param {Object} actual Actual object. |
+ * @param {string} opt_message User message to print if the test fails. |
+ */ |
+TestSuite.prototype.assertEquals = function(expected, actual, opt_message) { |
+ if (expected != actual) { |
+ var message = 'Expected: "' + expected + '", but was "' + actual + '"'; |
+ if (opt_message) { |
+ message = opt_message + '(' + message + ')'; |
+ } |
+ this.fail(message); |
+ } |
+}; |
+ |
+ |
+/** |
+ * True assertion tests that value == true. |
+ * @param {Object} value Actual object. |
+ * @param {string} opt_message User message to print if the test fails. |
+ */ |
+TestSuite.prototype.assertTrue = function(value, opt_message) { |
+ this.assertEquals(true, value, opt_message); |
+}; |
+ |
+ |
+/** |
+ * Contains assertion tests that string contains substring. |
+ * @param {string} string Outer. |
+ * @param {string} substring Inner. |
+ */ |
+TestSuite.prototype.assertContains = function(string, substring) { |
+ if (string.indexOf(substring) == -1) { |
+ this.fail('Expected to: "' + string + '" to contain "' + substring + '"'); |
+ } |
+}; |
+ |
+ |
+/** |
+ * Takes control over execution. |
+ */ |
+TestSuite.prototype.takeControl = function() { |
+ this.controlTaken_ = true; |
+ // Set up guard timer. |
+ var self = this; |
+ this.timerId_ = setTimeout(function() { |
+ self.reportFailure_('Timeout exceeded: 20 sec'); |
+ }, 20000); |
+}; |
+ |
+ |
+/** |
+ * Releases control over execution. |
+ */ |
+TestSuite.prototype.releaseControl = function() { |
+ if (this.timerId_ != -1) { |
+ clearTimeout(this.timerId_); |
+ this.timerId_ = -1; |
+ } |
+ this.reportOk_(); |
+}; |
+ |
+ |
+/** |
+ * Async tests use this one to report that they are completed. |
+ */ |
+TestSuite.prototype.reportOk_ = function() { |
+ window.domAutomationController.send('[OK]'); |
+}; |
+ |
+ |
+/** |
+ * Async tests use this one to report failures. |
+ */ |
+TestSuite.prototype.reportFailure_ = function(error) { |
+ if (this.timerId_ != -1) { |
+ clearTimeout(this.timerId_); |
+ this.timerId_ = -1; |
+ } |
+ window.domAutomationController.send('[FAILED] ' + error); |
+}; |
+ |
+ |
+/** |
+ * Runs all global functions starting with 'test' as unit tests. |
+ */ |
+TestSuite.prototype.runTest = function(testName) { |
+ try { |
+ this[testName](); |
+ if (!this.controlTaken_) { |
+ this.reportOk_(); |
+ } |
+ } catch (e) { |
+ this.reportFailure_(e); |
+ } |
+}; |
+ |
+ |
+/** |
+ * @param {string} panelName Name of the panel to show. |
+ */ |
+TestSuite.prototype.showPanel = function(panelName) { |
+ // Open Scripts panel. |
+ var toolbar = document.getElementById('toolbar'); |
+ var button = toolbar.getElementsByClassName(panelName)[0]; |
+ button.click(); |
+ this.assertEquals(WebInspector.panels[panelName], |
+ WebInspector.currentPanel); |
+}; |
+ |
+ |
+/** |
+ * Overrides the method with specified name until it's called first time. |
+ * @param {Object} receiver An object whose method to override. |
+ * @param {string} methodName Name of the method to override. |
+ * @param {Function} override A function that should be called right after the |
+ * overriden method returns. |
+ * @param {boolean} opt_sticky Whether restore original method after first run |
+ * or not. |
+ */ |
+TestSuite.prototype.addSniffer = function(receiver, methodName, override, |
+ opt_sticky) { |
+ var orig = receiver[methodName]; |
+ if (typeof orig != 'function') { |
+ this.fail('Cannot find method to override: ' + methodName); |
+ } |
+ var test = this; |
+ receiver[methodName] = function(var_args) { |
+ try { |
+ var result = orig.apply(this, arguments); |
+ } finally { |
+ if (!opt_sticky) { |
+ receiver[methodName] = orig; |
+ } |
+ } |
+ // In case of exception the override won't be called. |
+ try { |
+ override.apply(this, arguments); |
+ } catch (e) { |
+ test.fail('Exception in overriden method "' + methodName + '": ' + e); |
+ } |
+ return result; |
+ }; |
+}; |
+ |
+ |
+// UI Tests |
+ |
+ |
+/** |
+ * Tests that the real injected host is present in the context. |
+ */ |
+TestSuite.prototype.testHostIsPresent = function() { |
+ this.assertTrue(typeof DevToolsHost == 'object' && !DevToolsHost.isStub); |
+}; |
+ |
+ |
+/** |
+ * Tests elements tree has an 'HTML' root. |
+ */ |
+TestSuite.prototype.testElementsTreeRoot = function() { |
+ var doc = WebInspector.domAgent.document; |
+ this.assertEquals('HTML', doc.documentElement.nodeName); |
+ this.assertTrue(doc.documentElement.hasChildNodes()); |
+}; |
+ |
+ |
+/** |
+ * Tests that main resource is present in the system and that it is |
+ * the only resource. |
+ */ |
+TestSuite.prototype.testMainResource = function() { |
+ var tokens = []; |
+ var resources = WebInspector.resources; |
+ for (var id in resources) { |
+ tokens.push(resources[id].lastPathComponent); |
+ } |
+ this.assertEquals('simple_page.html', tokens.join(',')); |
+}; |
+ |
+ |
+/** |
+ * Tests that resources tab is enabled when corresponding item is selected. |
+ */ |
+TestSuite.prototype.testEnableResourcesTab = function() { |
+ this.showPanel('resources'); |
+ |
+ var test = this; |
+ this.addSniffer(WebInspector, 'addResource', |
+ function(identifier, payload) { |
+ test.assertEquals('simple_page.html', payload.lastPathComponent); |
+ WebInspector.panels.resources.refresh(); |
+ WebInspector.resources[identifier]._resourcesTreeElement.select(); |
+ |
+ test.releaseControl(); |
+ }); |
+ |
+ // Following call should lead to reload that we capture in the |
+ // addResource override. |
+ WebInspector.panels.resources._enableResourceTracking(); |
+ |
+ // We now have some time to report results to controller. |
+ this.takeControl(); |
+}; |
+ |
+ |
+/** |
+ * Tests resource headers. |
+ */ |
+TestSuite.prototype.testResourceHeaders = function() { |
+ this.showPanel('resources'); |
+ |
+ var test = this; |
+ |
+ var requestOk = false; |
+ var responseOk = false; |
+ var timingOk = false; |
+ |
+ this.addSniffer(WebInspector, 'addResource', |
+ function(identifier, payload) { |
+ var resource = this.resources[identifier]; |
+ if (resource.mainResource) { |
+ // We are only interested in secondary resources in this test. |
+ return; |
+ } |
+ |
+ var requestHeaders = JSON.stringify(resource.requestHeaders); |
+ test.assertContains(requestHeaders, 'Accept'); |
+ requestOk = true; |
+ }, true); |
+ |
+ this.addSniffer(WebInspector, 'updateResource', |
+ function(identifier, payload) { |
+ var resource = this.resources[identifier]; |
+ if (resource.mainResource) { |
+ // We are only interested in secondary resources in this test. |
+ return; |
+ } |
+ |
+ if (payload.didResponseChange) { |
+ var responseHeaders = JSON.stringify(resource.responseHeaders); |
+ test.assertContains(responseHeaders, 'Content-type'); |
+ test.assertContains(responseHeaders, 'Content-Length'); |
+ test.assertTrue(typeof resource.responseReceivedTime != 'undefnied'); |
+ responseOk = true; |
+ } |
+ |
+ if (payload.didTimingChange) { |
+ test.assertTrue(typeof resource.startTime != 'undefnied'); |
+ timingOk = true; |
+ } |
+ |
+ if (payload.didCompletionChange) { |
+ test.assertTrue(requestOk); |
+ test.assertTrue(responseOk); |
+ test.assertTrue(timingOk); |
+ test.assertTrue(typeof resource.endTime != 'undefnied'); |
+ test.releaseControl(); |
+ } |
+ }, true); |
+ |
+ WebInspector.panels.resources._enableResourceTracking(); |
+ this.takeControl(); |
+}; |
+ |
+ |
+/** |
+ * Test that profiler works. |
+ */ |
+TestSuite.prototype.testProfilerTab = function() { |
+ this.showPanel('profiles'); |
+ |
+ var test = this; |
+ this.addSniffer(WebInspector, 'addProfile', |
+ function(profile) { |
+ var panel = WebInspector.panels.profiles; |
+ panel.showProfile(profile); |
+ var node = panel.visibleView.profileDataGridTree.children[0]; |
+ // Iterate over displayed functions and search for a function |
+ // that is called 'fib' or 'eternal_fib'. If found, it will mean |
+ // that we actually have profiled page's code. |
+ while (node) { |
+ if (node.functionName.indexOf("fib") != -1) { |
+ test.releaseControl(); |
+ } |
+ node = node.traverseNextNode(true, null, true); |
+ } |
+ |
+ test.fail(); |
+ }); |
+ |
+ InspectorController.startProfiling(); |
+ window.setTimeout('InspectorController.stopProfiling();', 1000); |
+ this.takeControl(); |
+}; |
+ |
+ |
+/** |
+ * Tests that scripts tab can be open and populated with inspected scripts. |
+ */ |
+TestSuite.prototype.testShowScriptsTab = function() { |
+ var parsedDebuggerTestPageHtml = false; |
+ |
+ // Intercept parsedScriptSource calls to check that all expected scripts are |
+ // added to the debugger. |
+ var test = this; |
+ this.addSniffer(WebInspector, 'parsedScriptSource', |
+ function(sourceID, sourceURL, source, startingLine) { |
+ if (sourceURL.search(/debugger_test_page.html$/) != -1) { |
+ if (parsedDebuggerTestPageHtml) { |
+ test.fail('Unexpected parse event: ' + sourceURL); |
+ } |
+ parsedDebuggerTestPageHtml = true; |
+ } else { |
+ test.fail('Unexpected script URL: ' + sourceURL); |
+ } |
+ |
+ if (!WebInspector.panels.scripts.visibleView) { |
+ test.fail('No visible script view: ' + sourceURL); |
+ } |
+ |
+ if (parsedDebuggerTestPageHtml) { |
+ test.releaseControl(); |
+ } |
+ }, true /* sticky */); |
+ |
+ this.showPanel('scripts'); |
+ |
+ // Wait until all scripts are added to the debugger. |
+ this.takeControl(); |
+}; |
+ |
+ |
+/** |
+ * Tests that a breakpoint can be set. |
+ */ |
+TestSuite.prototype.testSetBreakpoint = function() { |
+ var parsedDebuggerTestPageHtml = false; |
+ var parsedDebuggerTestJs = false; |
+ |
+ this.showPanel('scripts'); |
+ |
+ var scriptUrl = null; |
+ var breakpointLine = 12; |
+ |
+ var test = this; |
+ var orig = devtools.DebuggerAgent.prototype.handleScriptsResponse_; |
+ this.addSniffer(devtools.DebuggerAgent.prototype, 'handleScriptsResponse_', |
+ function(msg) { |
+ var scriptSelect = document.getElementById('scripts-files'); |
+ var scriptResource = |
+ scriptSelect.options[scriptSelect.selectedIndex].representedObject; |
+ |
+ test.assertTrue(scriptResource instanceof WebInspector.Resource); |
+ test.assertTrue(!!scriptResource.url); |
+ test.assertTrue( |
+ scriptResource.url.search(/debugger_test_page.html$/) != -1, |
+ 'Main HTML resource should be selected.'); |
+ |
+ // Store for access from setbreakpoint handler. |
+ scriptUrl = scriptResource.url; |
+ |
+ var scriptsPanel = WebInspector.panels.scripts; |
+ |
+ var view = scriptsPanel.visibleView; |
+ test.assertTrue(view instanceof WebInspector.SourceView); |
+ |
+ if (!view.sourceFrame._isContentLoaded()) { |
+ test.addSniffer(view, '_sourceFrameSetupFinished', function(event) { |
+ view._addBreakpoint(breakpointLine); |
+ // Force v8 execution. |
+ devtools.tools.evaluateJavaScript('javascript:void(0)'); |
+ }); |
+ } else { |
+ view._addBreakpoint(breakpointLine); |
+ // Force v8 execution. |
+ devtools.tools.evaluateJavaScript('javascript:void(0)'); |
+ } |
+ }); |
+ |
+ this.addSniffer( |
+ devtools.DebuggerAgent.prototype, |
+ 'handleSetBreakpointResponse_', |
+ function(msg) { |
+ var bps = this.urlToBreakpoints_[scriptUrl]; |
+ test.assertTrue(!!bps, 'No breakpoints for line ' + breakpointLine); |
+ var line = devtools.DebuggerAgent.webkitToV8LineNumber_(breakpointLine); |
+ test.assertTrue(!!bps[line].getV8Id(), |
+ 'Breakpoint id was not assigned.'); |
+ test.releaseControl(); |
+ }); |
+ |
+ this.takeControl(); |
+}; |
+ |
+ |
+/** |
+ * Tests 'Pause' button will pause debugger when a snippet is evaluated. |
+ */ |
+TestSuite.prototype.testPauseInEval = function() { |
+ this.showPanel('scripts'); |
+ |
+ var test = this; |
+ |
+ var pauseButton = document.getElementById('scripts-pause'); |
+ pauseButton.click(); |
+ |
+ devtools.tools.evaluateJavaScript('fib(10)'); |
+ |
+ this.addSniffer(WebInspector, 'pausedScript', |
+ function() { |
+ test.releaseControl(); |
+ }); |
+ |
+ test.takeControl(); |
+}; |
+ |
+ |
+/** |
+ * Key event with given key identifier. |
+ */ |
+TestSuite.KeyEvent = function(key) { |
+ this.keyIdentifier = key; |
+}; |
+TestSuite.KeyEvent.prototype.preventDefault = function() {}; |
+TestSuite.KeyEvent.prototype.stopPropagation = function() {}; |
+ |
+ |
+/** |
+ * Tests console eval. |
+ */ |
+TestSuite.prototype.testConsoleEval = function() { |
+ WebInspector.console.visible = true; |
+ WebInspector.console.prompt.text = '123'; |
+ WebInspector.console.promptElement.handleKeyEvent( |
+ new TestSuite.KeyEvent('Enter')); |
+ |
+ var test = this; |
+ this.addSniffer(WebInspector.ConsoleView.prototype, 'addMessage', |
+ function(commandResult) { |
+ test.assertEquals('123', commandResult.toMessageElement().textContent); |
+ test.releaseControl(); |
+ }); |
+ |
+ this.takeControl(); |
+}; |
+ |
+ |
+/** |
+ * Tests console log. |
+ */ |
+TestSuite.prototype.testConsoleLog = function() { |
+ WebInspector.console.visible = true; |
+ var messages = WebInspector.console.messages; |
+ var index = 0; |
+ |
+ var test = this; |
+ var assertNext = function(line, message, opt_class, opt_count, opt_substr) { |
+ var elem = messages[index++].toMessageElement(); |
+ var clazz = elem.getAttribute('class'); |
+ var expectation = (opt_count || '') + 'console_test_page.html:' + |
+ line + message; |
+ if (opt_substr) { |
+ test.assertContains(elem.textContent, expectation); |
+ } else { |
+ test.assertEquals(expectation, elem.textContent); |
+ } |
+ if (opt_class) { |
+ test.assertContains(clazz, 'console-' + opt_class); |
+ } |
+ }; |
+ |
+ assertNext('5', 'log', 'log-level'); |
+ assertNext('7', 'debug', 'log-level'); |
+ assertNext('9', 'info', 'log-level'); |
+ assertNext('11', 'warn', 'warning-level'); |
+ assertNext('13', 'error', 'error-level'); |
+ assertNext('15', 'Message format number 1, 2 and 3.5'); |
+ assertNext('17', 'Message format for string'); |
+ assertNext('19', 'Object Object'); |
+ assertNext('22', 'repeated', 'log-level', 5); |
+ assertNext('26', 'count: 1'); |
+ assertNext('26', 'count: 2'); |
+ assertNext('29', 'group', 'group-title'); |
+ index++; |
+ assertNext('33', 'timer:', 'log-level', '', true); |
+}; |
+ |
+ |
+/** |
+ * Tests eval of global objects. |
+ */ |
+TestSuite.prototype.testEvalGlobal = function() { |
+ WebInspector.console.visible = true; |
+ WebInspector.console.prompt.text = 'foo'; |
+ WebInspector.console.promptElement.handleKeyEvent( |
+ new TestSuite.KeyEvent('Enter')); |
+ |
+ var test = this; |
+ this.addSniffer(WebInspector.ConsoleView.prototype, 'addMessage', |
+ function(commandResult) { |
+ test.assertEquals('fooValue', |
+ commandResult.toMessageElement().textContent); |
+ test.releaseControl(); |
+ }); |
+ |
+ this.takeControl(); |
+}; |
+ |
+ |
+/** |
+ * Tests eval on call frame. |
+ */ |
+TestSuite.prototype.testEvalCallFrame = function() { |
+}; |
+ |
+ |
+/** |
+ * Test runner for the test suite. |
+ */ |
+var uiTests = {}; |
+ |
+ |
+/** |
+ * Run each test from the test suit on a fresh instance of the suite. |
+ */ |
+uiTests.runAllTests = function() { |
+ // For debugging purposes. |
+ for (var name in TestSuite.prototype) { |
+ if (name.substring(0, 4) == 'test' && |
+ typeof TestSuite.prototype[name] == 'function') { |
+ uiTests.runTest(name); |
+ } |
+ } |
+}; |
+ |
+ |
+/** |
+ * Run specified test on a fresh instance of the test suite. |
+ * @param {string} name Name of a test method from TestSuite class. |
+ */ |
+uiTests.runTest = function(name) { |
+ new TestSuite().runTest(name); |
+}; |
+ |
+ |
+} |