blob: 2a14b2710cfdce22c6c9bd9720325d071cba229a [file] [log] [blame]
<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>