Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/integration_test_runner/ConsoleTestRunner.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/ConsoleTestRunner.js b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/ConsoleTestRunner.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..36e811a8783b1b27da4b7f2a2f166405704d293f |
| --- /dev/null |
| +++ b/third_party/WebKit/Source/devtools/front_end/integration_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 OK to use private properties in tests. |
| + * @suppress {accessControls} |
|
dgozman
2017/04/25 21:08:28
If we intend to compile tests and rely on compilat
chenwilliam
2017/06/15 01:01:05
Let's revisit this later? In theory I agree with y
|
| + */ |
| + |
| +/** |
| + * @param {boolean} printOriginatingCommand |
| + * @param {boolean} dumpClassNames |
| + * @param {function(!Element, !ConsoleModel.ConsoleMessage):string=} formatter |
| + */ |
| +TestRunner.dumpConsoleMessages = function(printOriginatingCommand, dumpClassNames, formatter) { |
| + TestRunner.addResults(TestRunner.dumpConsoleMessagesIntoArray(printOriginatingCommand, dumpClassNames, formatter)); |
| +}; |
| + |
| +/** |
| + * @param {boolean} printOriginatingCommand |
| + * @param {boolean} dumpClassNames |
| + * @param {function(!Element, !ConsoleModel.ConsoleMessage):string=} formatter |
| + * @return {!Array<string>} |
| + */ |
| +TestRunner.dumpConsoleMessagesIntoArray = function(printOriginatingCommand, dumpClassNames, formatter) { |
| + Common.settingForTest('messageLevelFilters2').set(ConsoleModel.ConsoleMessage.MessageLevel.Verbose); |
| + formatter = formatter || TestRunner.prepareConsoleMessageText; |
| + var result = []; |
| + TestRunner.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 (TestRunner.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} |
| + */ |
| +TestRunner.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} |
| + */ |
| +TestRunner.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; |
| +}; |
| + |
| +TestRunner.disableConsoleViewport = function() { |
| + TestRunner.fixConsoleViewportDimensions(600, 2000); |
| +}; |
| + |
| +/** |
| + * @param {number} width |
| + * @param {number} height |
| + */ |
| +TestRunner.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(); |
| +}; |