3 <script src="../../http/tests/inspector/inspector-test.js"></script>
4 <script src="../../http/tests/inspector/console-test.js"></script>
6 function populateConsoleWithMessages(count)
8 for (var i = 0; i < count - 1; ++i)
9 console.log("Message #" + i);
10 console.log("hello %cworld", "color: blue");
15 InspectorTest.fixConsoleViewportDimensions(600, 200);
16 var consoleView = WebInspector.ConsolePanel._view();
17 var viewport = consoleView._viewport;
18 const minimumViewportMessagesCount = 10;
19 const messagesCount = 150;
20 const middleMessage = messagesCount / 2;
22 function verifyViewportIsTallEnough(next)
24 viewport.invalidate();
25 var viewportMessagesCount = viewport._lastVisibleIndex - viewport._firstVisibleIndex;
26 if (viewportMessagesCount < minimumViewportMessagesCount) {
27 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));
28 InspectorTest.completeTest();
34 function testSelectionSingleLineText(next)
36 selectMessages(middleMessage, 2, middleMessage, 7);
41 function testReversedSelectionSingleLineText(next)
43 selectMessages(middleMessage, 7, middleMessage, 2);
48 function testSelectionMultiLineText(next)
50 selectMessages(middleMessage - 1, 4, middleMessage + 1, 7);
55 function testSimpleVisibleSelection(next)
57 selectMessages(middleMessage - 3, 6, middleMessage + 2, 6);
63 function testHalfScrollSelectionUp(next)
65 viewport.forceScrollItemToBeFirst(middleMessage);
71 function testHalfScrollSelectionDown(next)
73 viewport.forceScrollItemToBeLast(middleMessage);
79 function testScrollSelectionAwayUp(next)
81 viewport.forceScrollItemToBeFirst(0);
87 function testScrollSelectionAwayDown(next)
89 viewport.forceScrollItemToBeLast(messagesCount - 1);
95 function testShiftClickSelectionOver(next)
97 emulateShiftClickOnMessage(minimumViewportMessagesCount);
103 function testShiftClickSelectionBelow(next)
105 emulateShiftClickOnMessage(messagesCount - minimumViewportMessagesCount);
106 dumpSelectionModel();
111 function testRemoveSelection(next)
113 var selection = window.getSelection();
114 selection.removeAllRanges();
115 dumpSelectionModel();
120 function testReversedVisibleSelection(next)
122 selectMessages(middleMessage + 1, 6, middleMessage - 4, 6);
123 dumpSelectionModel();
128 function testShiftClickReversedSelectionOver(next)
130 emulateShiftClickOnMessage(minimumViewportMessagesCount);
131 dumpSelectionModel();
136 function testShiftClickReversedSelectionBelow(next)
138 emulateShiftClickOnMessage(messagesCount - minimumViewportMessagesCount);
139 dumpSelectionModel();
144 function testZeroOffsetSelection(next)
146 viewport.forceScrollItemToBeLast(messagesCount - 1);
147 var lastMessageElement = viewport.renderedElementAt(messagesCount - 1);
148 // there is a blue-colored "world" span in last message.
149 var blueSpan = lastMessageElement;
150 while (blueSpan.nodeName !== "SPAN" || blueSpan.textContent !== "world")
151 blueSpan = blueSpan.traverseNextNode();
153 window.getSelection().setBaseAndExtent(blueSpan, 0, blueSpan, blueSpan.textContent.length);
154 InspectorTest.addResult("Selected text: " + viewport._selectedText());
159 var awaitingMessagesCount = messagesCount;
160 function messageAdded()
162 if (!--awaitingMessagesCount)
163 InspectorTest.runTestSuite(testSuite);
166 InspectorTest.addConsoleSniffer(messageAdded, true);
167 InspectorTest.evaluateInPage(String.sprintf("populateConsoleWithMessages(%d)", messagesCount));
169 function dumpSelectionModelElement(model)
173 return String.sprintf("{item: %d, offset: %d}", model.item, model.offset);
176 function dumpSelectionModel()
179 var text = String.sprintf("anchor = %s, head = %s", dumpSelectionModelElement(viewport._anchorSelection), dumpSelectionModelElement(viewport._headSelection));
180 InspectorTest.addResult(text);
183 function dumpSelectionText()
185 var text = viewport._selectedText();
186 InspectorTest.addResult("Selected text:<<<EOL\n" + text + "\nEOL");
192 InspectorTest.addResult("first visible message index: " + viewport.firstVisibleIndex());
195 function dumpBottom()
198 InspectorTest.addResult("last visible message index: " + viewport.lastVisibleIndex());
201 function emulateShiftClickOnMessage(messageIndex)
203 var selection = window.getSelection();
204 if (!selection || !selection.rangeCount) {
205 InspectorTest.addResult("FAILURE: There's no selection");
208 viewport.forceScrollItemToBeFirst(Math.max(messageIndex - minimumViewportMessagesCount / 2, 0));
210 var element = consoleView.itemElement(messageIndex).element();
211 selection.setBaseAndExtent(selection.anchorNode, selection.anchorOffset, element, 0);
215 function selectionContainerAndOffset(container, offset)
218 var node = container;
219 while (node = node.traverseNextTextNode(true)) {
220 var length = node.textContent.length;
221 if (charCount + length >= offset) {
224 offset: offset - charCount
232 function selectMessages(fromMessage, fromTextOffset, toMessage, toTextOffset)
234 if (Math.abs(toMessage - fromMessage) > minimumViewportMessagesCount) {
235 InspectorTest.addResult(String.sprintf("FAILURE: Cannot select more then %d messages (requested to select from %d to %d", minimumViewportMessagesCount, fromMessage, toMessage));
236 InspectorTest.completeTest();
239 viewport.forceScrollItemToBeLast(Math.max(fromMessage, toMessage));
242 var from = selectionContainerAndOffset(consoleView.itemElement(fromMessage).element(), fromTextOffset);
243 var to = selectionContainerAndOffset(consoleView.itemElement(toMessage).element(), toTextOffset);
244 window.getSelection().setBaseAndExtent(from.container, from.offset, to.container, to.offset);
249 <body onload="runTest()">
251 Tests that console viewport handles selection properly.