| // 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. |
| |
| (async function() { |
| TestRunner.addResult(`Tests that console copies truncated text in messages properly.\n`); |
| |
| await TestRunner.loadModule('console_test_runner'); |
| await TestRunner.showPanel('console'); |
| |
| var longUrl = 'www.' + 'z123456789'.repeat(15) + '.com'; |
| var shortUrl = 'www.bar.com'; |
| var mixedUrl = longUrl + ' ' + shortUrl + ' ' + longUrl; |
| var shortUrlWithHashes = 'www.' + '0123456789'.repeat(2) + 'zfoobarz' + '0123456789'.repeat(2); |
| var urlWithHashes = 'www.' + '0123456789'.repeat(2) + 'z'.repeat(150) + '0123456789'.repeat(2); |
| var highlightedUrl = 'www.' + 'z'.repeat(200) + '.com'; |
| var prepareCode = ` |
| // Keep this as the first url logged to record the max truncated length. |
| console.log("${longUrl}"); |
| |
| console.log("${shortUrl}"); |
| console.log("${longUrl}"); |
| console.log("${mixedUrl}"); |
| console.log("${shortUrlWithHashes}"); |
| console.log("${urlWithHashes}"); |
| console.log("${highlightedUrl}"); |
| `; |
| |
| var expectedMessageCount = 8; |
| var consoleView = Console.ConsoleView.instance(); |
| var viewport = Console.ConsoleView.instance()._viewport; |
| var maxLength; |
| var halfMaxLength; |
| var secondLongUrlIndexInMixedUrl; |
| |
| var tests = [ |
| async function testSelectWithinTruncatedUrl(next) { |
| await makeSelectionAndDump(1, 0, 1, halfMaxLength); |
| await makeSelectionAndDump(1, 0, 1, halfMaxLength + 1); |
| await makeSelectionAndDump(1, 0, 1, maxLength); |
| await makeSelectionAndDump(1, halfMaxLength, 1, halfMaxLength + 1); |
| await makeSelectionAndDump(1, halfMaxLength, 1, maxLength); |
| await makeSelectionAndDump(1, halfMaxLength + 1, 1, maxLength); |
| next(); |
| }, |
| |
| async function testSelectAcrossMultipleMessages(next) { |
| await makeSelectionAndDump(1, 0, 2, shortUrl.length); |
| await makeSelectionAndDump(1, halfMaxLength, 2, shortUrl.length); |
| await makeSelectionAndDump(1, halfMaxLength + 1, 2, shortUrl.length); |
| next(); |
| }, |
| |
| async function testSelectAcrossMultipleMessagesWithTruncatedUrls(next) { |
| await makeSelectionAndDump(1, 0, 3, halfMaxLength); |
| await makeSelectionAndDump(1, 0, 3, halfMaxLength + 1); |
| await makeSelectionAndDump(1, 0, 3, maxLength); |
| next(); |
| }, |
| |
| async function testSelectWithinMessageWithMultipleTruncatedUrls(next) { |
| await makeSelectionAndDump(4, 0, 4, halfMaxLength); |
| await makeSelectionAndDump(4, 0, 4, halfMaxLength + 1); |
| await makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl); |
| await makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl + halfMaxLength); |
| await makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1); |
| await makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl + maxLength); |
| |
| await makeSelectionAndDump(4, halfMaxLength, 4, halfMaxLength + 1); |
| await makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl); |
| await makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl + halfMaxLength); |
| await makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1); |
| await makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl + maxLength); |
| |
| await makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl); |
| await makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl + halfMaxLength); |
| await makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1); |
| await makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl + maxLength); |
| |
| await makeSelectionAndDump(4, secondLongUrlIndexInMixedUrl, 4, secondLongUrlIndexInMixedUrl + halfMaxLength); |
| await makeSelectionAndDump(4, secondLongUrlIndexInMixedUrl, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1); |
| await makeSelectionAndDump(4, secondLongUrlIndexInMixedUrl, 4, secondLongUrlIndexInMixedUrl + maxLength); |
| |
| await makeSelectionAndDump( |
| 4, |
| secondLongUrlIndexInMixedUrl + halfMaxLength, |
| 4, |
| secondLongUrlIndexInMixedUrl + halfMaxLength + 1 |
| ); |
| await makeSelectionAndDump( |
| 4, |
| secondLongUrlIndexInMixedUrl + halfMaxLength, |
| 4, |
| secondLongUrlIndexInMixedUrl + maxLength |
| ); |
| |
| await makeSelectionAndDump( |
| 4, |
| secondLongUrlIndexInMixedUrl + halfMaxLength + 1, |
| 4, |
| secondLongUrlIndexInMixedUrl + maxLength |
| ); |
| next(); |
| }, |
| |
| async function testSelectWithinShortUrlWithHashes(next) { |
| var hashedUrlMaxLength = consoleMessageText(5).length; |
| var hashedUrlHalfMaxLength = Math.ceil(hashedUrlMaxLength / 2); |
| await makeSelectionAndDump(5, 0, 5, hashedUrlHalfMaxLength); |
| await makeSelectionAndDump(5, 0, 5, hashedUrlMaxLength); |
| await makeSelectionAndDump(5, hashedUrlHalfMaxLength, 5, hashedUrlMaxLength); |
| next(); |
| }, |
| |
| async function testSelectWithinUrlWithHashes(next) { |
| var hashedUrlMaxLength = consoleMessageText(6).length; |
| var hashedUrlHalfMaxLength = Math.ceil(hashedUrlMaxLength / 2); |
| await makeSelectionAndDump(6, 0, 6, hashedUrlHalfMaxLength); |
| await makeSelectionAndDump(6, 0, 6, hashedUrlHalfMaxLength + 1); |
| await makeSelectionAndDump(6, 0, 6, hashedUrlMaxLength); |
| await makeSelectionAndDump(6, hashedUrlHalfMaxLength, 6, hashedUrlHalfMaxLength + 1); |
| await makeSelectionAndDump(6, hashedUrlHalfMaxLength, 6, hashedUrlMaxLength); |
| await makeSelectionAndDump(6, hashedUrlHalfMaxLength + 1, 6, hashedUrlMaxLength); |
| next(); |
| }, |
| |
| function testSelectWithinHighlightedUrlBeginning(next) { |
| testHighlightedUrlWithSearchQuery('www.', next); |
| }, |
| |
| function testSelectWithinHighlightedUrlMiddle(next) { |
| testHighlightedUrlWithSearchQuery('zzzzz', next); |
| }, |
| |
| function testSelectWithinHighlightedUrlEnd(next) { |
| testHighlightedUrlWithSearchQuery('.com', next); |
| } |
| ]; |
| |
| ConsoleTestRunner.waitForConsoleMessages(expectedMessageCount, async () => { |
| viewport.invalidate(); |
| |
| // Get the max truncated length from the first longUrl logged. |
| try { |
| var longUrlMessageText = await consoleMessageText(1); |
| maxLength = longUrlMessageText.length; |
| halfMaxLength = Math.ceil(maxLength / 2); |
| secondLongUrlIndexInMixedUrl = maxLength + 1 + shortUrl.length + 1; |
| TestRunner.addResult('Long url has max length: ' + maxLength + ', text: ' + longUrlMessageText); |
| } catch (e) { |
| TestRunner.addResult('FAIL: Could not get max truncation length from first longUrl message.'); |
| TestRunner.completeTest(); |
| return; |
| } |
| TestRunner.runTestSuite(tests); |
| }); |
| ConsoleTestRunner.evaluateInConsole(prepareCode); |
| |
| function consoleMessageText(index) { |
| var messageElement = consoleView._visibleViewMessages[index].element(); |
| return messageElement.querySelector('.console-message-text').deepTextContent(); |
| } |
| |
| async function makeSelectionAndDump(fromMessage, fromTextOffset, toMessage, toTextOffset) { |
| TestRunner.addResult( |
| '\nMaking selection: ' + fromMessage + ', ' + fromTextOffset + ', ' + toMessage + ', ' + toTextOffset |
| ); |
| |
| // Ignore the anchor text on the start/end message, just use their contents. |
| const fromElement = consoleView.itemElement(fromMessage).element(); |
| const toElement = consoleView.itemElement(toMessage).element(); |
| // Console message elements contain live locations. |
| await TestRunner.waitForPendingLiveLocationUpdates(); |
| var fromAnchor = fromElement.querySelector('.console-message-anchor'); |
| var toAnchor = toElement.querySelector('.console-message-anchor'); |
| fromTextOffset += fromAnchor ? fromAnchor.deepTextContent().length : 0; |
| toTextOffset += toAnchor ? toAnchor.deepTextContent().length : 0; |
| await ConsoleTestRunner.selectConsoleMessages(fromMessage, fromTextOffset, toMessage, toTextOffset); |
| var selectedText = viewport._selectedText(); |
| if (selectedText) { |
| selectedText = selectedText.replace(/\bVM\d+/g, 'VM'); |
| TestRunner.addResult('Selection length: ' + selectedText.length + ', text: ' + selectedText); |
| } else { |
| TestRunner.addResult('No selection'); |
| } |
| } |
| |
| function testHighlightedUrlWithSearchQuery(query, next) { |
| // Clear any existing ranges to avoid using them as the query. |
| window.getSelection().removeAllRanges(); |
| TestRunner.addSniffer(consoleView, '_searchFinishedForTests', onSearch); |
| consoleView._searchableView._searchInputElement.value = query; |
| consoleView._searchableView.showSearchField(); |
| TestRunner.addResult('Searching for text: ' + query); |
| |
| async function onSearch() { |
| var matches = consoleView.element |
| .childTextNodes() |
| .filter(node => node.parentElement && node.parentElement.classList.contains('highlighted-search-result')) |
| .map(node => node.parentElement); |
| TestRunner.addResult('Highlighted ' + matches.length + ' matches'); |
| |
| // Use TextNodes for containers to get inside the highlighted match element. |
| await makeSelectionAndDump(7, 0, 7, halfMaxLength); |
| await makeSelectionAndDump(7, 0, 7, halfMaxLength + 1); |
| await makeSelectionAndDump(7, 0, 7, maxLength); |
| await makeSelectionAndDump(7, halfMaxLength, 7, halfMaxLength + 1); |
| await makeSelectionAndDump(7, halfMaxLength, 7, maxLength); |
| await makeSelectionAndDump(7, halfMaxLength + 1, 7, maxLength); |
| next(); |
| } |
| } |
| })(); |