| <html> |
| <head> |
| <script src="../../http/tests/inspector/inspector-test.js"></script> |
| <script src="../../http/tests/inspector/console-test.js"></script> |
| <script> |
| function populateConsoleWithMessages(count) |
| { |
| for (var i = 0; i < count - 1; ++i) |
| console.log("Multiline\nMessage #" + i); |
| console.log("hello %cworld", "color: blue"); |
| } |
| |
| //# sourceURL=console-viewport-selection.html |
| </script> |
| |
| <script> |
| |
| function test() |
| { |
| var viewportHeight = 200; |
| InspectorTest.fixConsoleViewportDimensions(600, viewportHeight); |
| var consoleView = Console.ConsoleView.instance(); |
| var viewport = consoleView._viewport; |
| const minimumViewportMessagesCount = 10; |
| const messagesCount = 150; |
| const middleMessage = messagesCount / 2; |
| var viewportMessagesCount; |
| |
| logMessagesToConsole(messagesCount, () => InspectorTest.runTestSuite(testSuite)); |
| |
| var testSuite = [ |
| function verifyViewportIsTallEnough(next) |
| { |
| viewport.invalidate(); |
| viewport.forceScrollItemToBeFirst(0); |
| viewportMessagesCount = viewport.lastVisibleIndex() - viewport.firstVisibleIndex() + 1; |
| if (viewportMessagesCount < minimumViewportMessagesCount) { |
| InspectorTest.addResult(String.sprintf("Test cannot be run as viewport is not tall enough. It is required to contain at least %d messages, but %d only fit", minimumViewportMessagesCount, viewportMessagesCount)); |
| InspectorTest.completeTest(); |
| return; |
| } |
| InspectorTest.addResult(String.sprintf("Viewport contains %d messages", viewportMessagesCount)); |
| next(); |
| }, |
| |
| function testScrollViewportToBottom(next) |
| { |
| consoleView._immediatelyScrollToBottom(); |
| dumpAndContinue(next); |
| }, |
| |
| function testConsoleSticksToBottom(next) |
| { |
| logMessagesToConsole(messagesCount, onMessagesDumped); |
| |
| function onMessagesDumped() |
| { |
| dumpAndContinue(next); |
| } |
| }, |
| |
| function testSmoothScrollDoesNotStickToBottom(next) |
| { |
| InspectorTest.addSniffer(Console.ConsoleView.prototype, "_updateViewportStickinessForTest", onUpdateTimeout); |
| sendPageUp(); |
| |
| function onUpdateTimeout() |
| { |
| dumpAndContinue(next); |
| } |
| }, |
| |
| function testEscShouldNotJumpToBottom(next) |
| { |
| var keyEvent = InspectorTest.createKeyEvent("Escape"); |
| viewport._contentElement.dispatchEvent(keyEvent); |
| dumpAndContinue(next); |
| }, |
| |
| function testChangingPromptTextShouldJumpToBottom(next) |
| { |
| InspectorTest.addSniffer(Console.ConsoleView.prototype, "_promptTextChangedForTest", onContentChanged); |
| var editorElement = consoleView._prompt.setText("a"); |
| |
| function onContentChanged() { |
| dumpAndContinue(next); |
| } |
| }, |
| |
| function testViewportMutationsShouldPreserveStickToBottom(next) |
| { |
| viewport._contentElement.lastChild.innerText = "More than 2 lines: foo\n\nbar"; |
| dumpAndContinue(onMessagesDumped); |
| |
| function onMessagesDumped() |
| { |
| viewport.setStickToBottom(false); |
| viewport._contentElement.lastChild.innerText = "More than 3 lines: foo\n\n\nbar"; |
| dumpAndContinue(next); |
| } |
| }, |
| |
| function testMuteUpdatesWhileScrolling(next) |
| { |
| consoleView._updateStickToBottomOnMouseDown(); |
| viewport.element.scrollTop -= 10; |
| |
| InspectorTest.addSniffer(Console.ConsoleView.prototype, "_scheduleViewportRefreshForTest", onMessageAdded); |
| InspectorTest.evaluateInConsole("1 + 1"); |
| |
| /** |
| * @param {boolean} muted |
| */ |
| function onMessageAdded(muted) |
| { |
| InspectorTest.addResult("New messages were muted: " + muted); |
| InspectorTest.addSniffer(Console.ConsoleView.prototype, "_scheduleViewportRefreshForTest", onMouseUpScheduledRefresh); |
| InspectorTest.addSniffer(Console.ConsoleView.prototype, "_updateViewportStickinessForTest", onUpdateStickiness); |
| consoleView._updateStickToBottomOnMouseUp(); |
| } |
| |
| /** |
| * @param {boolean} muted |
| */ |
| function onMouseUpScheduledRefresh(muted) |
| { |
| InspectorTest.addResult("Refresh was scheduled after dirty state"); |
| } |
| |
| function onUpdateStickiness() |
| { |
| next(); |
| } |
| }, |
| |
| function testShouldNotJumpToBottomWhenPromptFillsEntireViewport(next) |
| { |
| var text = "Foo"; |
| for (var i = 0; i < viewportHeight; i++) |
| text += "\n"; |
| Console.ConsoleView.clearConsole(); |
| consoleView._prompt.setText(text); |
| viewport.element.scrollTop -= 10; |
| |
| var keyEvent = InspectorTest.createKeyEvent("a"); |
| viewport._contentElement.dispatchEvent(keyEvent); |
| consoleView._promptElement.dispatchEvent(new Event('input')); |
| |
| dumpAndContinue(next); |
| } |
| ]; |
| |
| function sendPageUp() |
| { |
| var keyEvent = InspectorTest.createKeyEvent("PageUp"); |
| consoleView._prompt.element.dispatchEvent(keyEvent); |
| viewport.element.scrollTop -= 10; |
| } |
| |
| function dumpAndContinue(callback) |
| { |
| viewport.refresh(); |
| InspectorTest.addResult("Is at bottom: " + viewport.element.isScrolledToBottom() + ", should stick: " + viewport.stickToBottom()); |
| callback(); |
| } |
| |
| function logMessagesToConsole(count, callback) |
| { |
| var awaitingMessagesCount = count; |
| function messageAdded() |
| { |
| if (!--awaitingMessagesCount) |
| callback(); |
| else |
| InspectorTest.addConsoleSniffer(messageAdded, false); |
| } |
| |
| InspectorTest.addConsoleSniffer(messageAdded, false); |
| InspectorTest.evaluateInPage(String.sprintf("populateConsoleWithMessages(%d)", count)); |
| } |
| } |
| </script> |
| </head> |
| <body onload="runTest()"> |
| <p> |
| Verifies viewport stick-to-bottom behavior. |
| </p> |
| </body> |
| </html> |