Index: third_party/WebKit/Source/devtools/front_end/console_test_runner/ConsoleTestRunner.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/console_test_runner/ConsoleTestRunner.js b/third_party/WebKit/Source/devtools/front_end/console_test_runner/ConsoleTestRunner.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1f84b8738f8794a4c78c9a1915beaf1af1e46a52 |
--- /dev/null |
+++ b/third_party/WebKit/Source/devtools/front_end/console_test_runner/ConsoleTestRunner.js |
@@ -0,0 +1,146 @@ |
+// Copyright 2017 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 using private properties isn't a Closure violation in tests. |
+ * @suppress {accessControls} |
+ */ |
+ |
+/** |
+ * @param {boolean} printOriginatingCommand |
+ * @param {boolean} dumpClassNames |
+ * @param {function(!Element, !ConsoleModel.ConsoleMessage):string=} formatter |
+ */ |
+ConsoleTestRunner.dumpConsoleMessages = function(printOriginatingCommand, dumpClassNames, formatter) { |
+ TestRunner.addResults( |
+ ConsoleTestRunner.dumpConsoleMessagesIntoArray(printOriginatingCommand, dumpClassNames, formatter)); |
+}; |
+ |
+/** |
+ * @param {boolean} printOriginatingCommand |
+ * @param {boolean} dumpClassNames |
+ * @param {function(!Element, !ConsoleModel.ConsoleMessage):string=} formatter |
+ * @return {!Array<string>} |
+ */ |
+ConsoleTestRunner.dumpConsoleMessagesIntoArray = function(printOriginatingCommand, dumpClassNames, formatter) { |
+ formatter = formatter || ConsoleTestRunner.prepareConsoleMessageText; |
+ var result = []; |
+ ConsoleTestRunner.disableConsoleViewport(); |
+ var consoleView = Console.ConsoleView.instance(); |
+ if (consoleView._needsFullUpdate) |
+ consoleView._updateMessageList(); |
+ var viewMessages = consoleView._visibleViewMessages; |
+ for (var i = 0; i < viewMessages.length; ++i) { |
+ var uiMessage = viewMessages[i]; |
+ var message = uiMessage.consoleMessage(); |
+ var element = uiMessage.element(); |
+ |
+ if (dumpClassNames) { |
+ var classNames = []; |
+ for (var node = element.firstChild; node; node = node.traverseNextNode(element)) { |
+ if (node.nodeType === Node.ELEMENT_NODE && node.className) { |
+ classNames.push(node.className.replace('platform-linux', 'platform-*') |
+ .replace('platform-mac', 'platform-*') |
+ .replace('platform-windows', 'platform-*')); |
+ } |
+ } |
+ } |
+ |
+ if (ConsoleTestRunner.dumpConsoleTableMessage(uiMessage, false, result)) { |
+ if (dumpClassNames) |
+ result.push(classNames.join(' > ')); |
+ } else { |
+ var messageText = formatter(element, message); |
+ messageText = messageText.replace(/VM\d+/g, 'VM'); |
+ result.push(messageText + (dumpClassNames ? ' ' + classNames.join(' > ') : '')); |
+ } |
+ |
+ if (printOriginatingCommand && uiMessage.consoleMessage().originatingMessage()) |
+ result.push('Originating from: ' + uiMessage.consoleMessage().originatingMessage().messageText); |
+ } |
+ return result; |
+}; |
+ |
+/** |
+ * @param {!Element} messageElement |
+ * @param {!ConsoleModel.ConsoleMessage} consoleMessage |
+ * @return {string} |
+ */ |
+ConsoleTestRunner.prepareConsoleMessageText = function(messageElement, consoleMessage) { |
+ var messageText = messageElement.deepTextContent().replace(/\u200b/g, ''); |
+ // Replace scriptIds with generic scriptId string to avoid flakiness. |
+ messageText = messageText.replace(/VM\d+/g, 'VM'); |
+ // Remove line and column of evaluate method. |
+ messageText = messageText.replace(/(at eval \(eval at evaluate) \(:\d+:\d+\)/, '$1'); |
+ |
+ if (messageText.startsWith('Navigated to')) { |
+ var fileName = messageText.split(' ').pop().split('/').pop(); |
+ messageText = 'Navigated to ' + fileName; |
+ } |
+ // The message might be extremely long in case of dumping stack overflow message. |
+ messageText = messageText.substring(0, 1024); |
+ return messageText; |
+}; |
+ |
+/** |
+ * @param {!Console.ConsoleViewMessage} viewMessage |
+ * @param {boolean} forceInvalidate |
+ * @param {!Array<string>} results |
+ * @return {boolean} |
+ */ |
+ConsoleTestRunner.dumpConsoleTableMessage = function(viewMessage, forceInvalidate, results) { |
+ if (forceInvalidate) |
+ Console.ConsoleView.instance()._viewport.invalidate(); |
+ var table = viewMessage.element(); |
+ var headers = table.querySelectorAll('th > div:first-child'); |
+ if (!headers.length) |
+ return false; |
+ |
+ var headerLine = ''; |
+ for (var i = 0; i < headers.length; i++) |
+ headerLine += headers[i].textContent + ' | '; |
+ |
+ addResult('HEADER ' + headerLine); |
+ |
+ var rows = table.querySelectorAll('.data-container tr'); |
+ |
+ for (var i = 0; i < rows.length; i++) { |
+ var row = rows[i]; |
+ var rowLine = ''; |
+ var items = row.querySelectorAll('td > span'); |
+ for (var j = 0; j < items.length; j++) |
+ rowLine += items[j].textContent + ' | '; |
+ |
+ if (rowLine.trim()) |
+ addResult('ROW ' + rowLine); |
+ } |
+ |
+ /** |
+ * @param {string} x |
+ */ |
+ function addResult(x) { |
+ if (results) |
+ results.push(x); |
+ else |
+ TestRunner.addResult(x); |
+ } |
+ |
+ return true; |
+}; |
+ |
+ConsoleTestRunner.disableConsoleViewport = function() { |
+ ConsoleTestRunner.fixConsoleViewportDimensions(600, 2000); |
+}; |
+ |
+/** |
+ * @param {number} width |
+ * @param {number} height |
+ */ |
+ConsoleTestRunner.fixConsoleViewportDimensions = function(width, height) { |
+ var viewport = Console.ConsoleView.instance()._viewport; |
+ viewport.element.style.width = width + 'px'; |
+ viewport.element.style.height = height + 'px'; |
+ viewport.element.style.position = 'absolute'; |
+ viewport.invalidate(); |
+}; |