| <!DOCTYPE html> |
| <head> |
| <style> |
| .userSelectAll {-webkit-user-select: all; } |
| </style> |
| <script src="../editing.js"></script> |
| <script src="../../resources/js-test-pre.js"></script> |
| <script src="resources/js-test-selection-shared.js"></script> |
| <script> |
| function log(str) { |
| var div = document.createElement("div"); |
| div.appendChild(document.createTextNode(str)); |
| document.getElementById("console").appendChild(div); |
| } |
| |
| function testSelectionAt(anchorNode, anchorOffset, optFocusNode, optFocusOffset, str) { |
| var focusNode = optFocusNode || anchorNode; |
| var focusOffset = (optFocusOffset === undefined) ? anchorOffset : optFocusOffset; |
| |
| var sel = window.getSelection(); |
| if (sel.anchorNode == anchorNode |
| && sel.focusNode == focusNode |
| && sel.anchorOffset == anchorOffset |
| && sel.focusOffset == focusOffset) { |
| testPassed("Selection is " + str); |
| } else { |
| testFailed("Selection should be " + str + |
| " at anchorNode: " + sel.anchorNode + " anchorOffset: " + sel.anchorOffset + |
| " focusNode: " + sel.focusNode + " focusOffset: " + sel.focusOffset); |
| } |
| } |
| |
| function selectionShouldBeRelativeToUserSelectAllElement(str) { |
| var userSelectAllElement = document.getElementById("allArea"); |
| var userSelectAllNodeIndex = 1; |
| if (str == "around") |
| testSelectionAt(userSelectAllElement.previousSibling.firstChild, userSelectAllElement.previousSibling.textContent.length, |
| userSelectAllElement.nextSibling, 0, |
| "the entire user-select-all element"); |
| else if ( str == "before") |
| testSelectionAt(userSelectAllElement.previousSibling.firstChild, userSelectAllElement.previousSibling.textContent.length, |
| userSelectAllElement.previousSibling.firstChild, userSelectAllElement.previousSibling.textContent.length, |
| "right before user-select-all element"); |
| else if (str == "after") |
| testSelectionAt(userSelectAllElement.nextSibling.firstChild, 0, |
| userSelectAllElement.nextSibling.firstChild, 0, |
| "right after user-select-all element"); |
| } |
| |
| function placeCaretBeforeUserSelectAllElement(){ |
| var userSelectAllElement = document.getElementById("allArea"); |
| execSetSelectionCommand(userSelectAllElement.previousSibling.firstChild, userSelectAllElement.previousSibling.textContent.length, userSelectAllElement.previousSibling.firstChild, userSelectAllElement.previousSibling.textContent.length); |
| } |
| |
| function mouseMoveFromTo(fromX, toX){ |
| var userSelectAllElement = document.getElementById("allArea"); |
| var y = userSelectAllElement.offsetTop + 10; |
| eventSender.dragMode = false; |
| // Clear click count |
| eventSender.mouseMoveTo(0, 0); |
| eventSender.mouseDown(); |
| eventSender.mouseUp(); |
| |
| eventSender.mouseMoveTo(fromX, y); |
| eventSender.mouseDown(); |
| eventSender.mouseMoveTo(toX, y); |
| eventSender.mouseUp(); |
| } |
| |
| function testKeyboard(){ |
| var userSelectAllElement = document.getElementById("allArea"); |
| |
| evalAndLog("placeCaretBeforeUserSelectAllElement()"); |
| evalAndLog("window.getSelection().modify('extend', 'forward', 'character')"); |
| selectionShouldBeRelativeToUserSelectAllElement("around"); |
| |
| evalAndLog("window.getSelection().modify('extend', 'backward', 'character')"); |
| selectionShouldBeRelativeToUserSelectAllElement("before"); |
| |
| evalAndLog("window.getSelection().modify('extend', 'right', 'character')"); |
| selectionShouldBeRelativeToUserSelectAllElement("around"); |
| |
| evalAndLog("window.getSelection().modify('extend', 'left', 'character')"); |
| selectionShouldBeRelativeToUserSelectAllElement("before"); |
| |
| evalAndLog("window.getSelection().modify('move', 'forward', 'character')"); |
| selectionShouldBeRelativeToUserSelectAllElement("after"); |
| |
| evalAndLog("window.getSelection().modify('move', 'backward', 'character')"); |
| selectionShouldBeRelativeToUserSelectAllElement("before"); |
| |
| evalAndLog("window.getSelection().modify('move', 'right', 'character')"); |
| selectionShouldBeRelativeToUserSelectAllElement("after"); |
| |
| evalAndLog("window.getSelection().modify('move', 'left', 'character')"); |
| selectionShouldBeRelativeToUserSelectAllElement("before"); |
| } |
| |
| function testMouse(){ |
| var userSelectAllElement = document.getElementById("allArea"); |
| var descendant = document.getElementById("descendant"); |
| evalAndLog("clickAt(descendant.offsetLeft + 10 , descendant.offsetTop + 10)"); |
| selectionShouldBeRelativeToUserSelectAllElement("around"); |
| |
| // mouse extending from left |
| var leftTarget = userSelectAllElement.previousSibling; |
| log("mouseMoveFromTo(leftTarget.offsetLeft, descendant.offsetLeft + 20)"); |
| mouseMoveFromTo(leftTarget.offsetLeft, descendant.offsetLeft + 20); |
| testSelectionAt(leftTarget.firstChild, 0, userSelectAllElement.nextSibling, 0, "the entire user-select-all element plus everything on its left"); |
| |
| // mouse extending from right |
| var rightTarget = userSelectAllElement.nextSibling; |
| var textLength = rightTarget.textContent.length; |
| log("mouseMoveFromTo(userSelectAllElement.offsetLeft + userSelectAllElement.offsetWidth + rightTarget.offsetWidth, descendant.offsetLeft + 10)"); |
| mouseMoveFromTo(userSelectAllElement.offsetLeft + userSelectAllElement.offsetWidth + rightTarget.offsetWidth, descendant.offsetLeft + 10); |
| testSelectionAt(rightTarget.firstChild, textLength, leftTarget.firstChild, leftTarget.textContent.textLength, "the entire user-select-all element plus everything on its right"); |
| } |
| |
| function testProgrammaticSelection(){ |
| var boldElement = document.querySelector('b'); |
| getSelection().selectAllChildren(boldElement); |
| testSelectionAt(boldElement.firstChild, 0, boldElement.firstChild, 10, "only the text in bold"); |
| } |
| </script> |
| </head> |
| <body><div contenteditable><span>Test -webkit-user-select all </span><span class="userSelectAll" id="allArea"><span style="border: solid red 1px" id="descendant">user <b>select all</b> area</span></span><span> Test -webkit-user-select all</span></div> |
| <div id="console"></div> |
| <script> |
| description(" Test -webkit-user-select all selection movements and extensions (left right forward backward) "); |
| testKeyboard(); |
| testMouse(); |
| testProgrammaticSelection(); |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |