[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

rniwa at webkit.org rniwa at webkit.org
Wed Dec 22 16:16:40 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 7bf402a9afb87fe9e10cc4867f9f24500ef62f41
Author: rniwa at webkit.org <rniwa at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sat Nov 20 22:51:50 2010 +0000

    2010-11-19  Ryosuke Niwa  <rniwa at webkit.org>
    
            Reviewed by Antonio Gomes.
    
            /editing/selection/extend-selection.html should be split into smaller tests
            https://bugs.webkit.org/show_bug.cgi?id=49849
    
            Divided the test into 4 pieces.
    
            * editing/selection/extend-selection-character-expected.txt: Added.
            * editing/selection/extend-selection-character.html: Added.
            * editing/selection/extend-selection-enclosing-block-expected.txt: Added.
            * editing/selection/extend-selection-enclosing-block.html: Added.
            * editing/selection/extend-selection-expected.txt: Removed.
            * editing/selection/extend-selection-home-end-expected.txt: Added.
            * editing/selection/extend-selection-home-end.html: Added.
            * editing/selection/extend-selection-word-expected.txt: Added.
            * editing/selection/extend-selection-word.html: Added.
            * editing/selection/extend-selection.html: Removed.
            * editing/selection/resources/extend-selection.css: Added.
            (div.test):
            (div.test:before):
            (div.test span):
            (div.test img):
            (div.test img + img):
            (div.test div):
            * editing/selection/resources/extend-selection.js: Added.
            (log):
            (positionsExtendingInDirectionForEnclosingBlock):
            (positionsExtendingInDirection):
            (fold):
            (logPositions):
            (checkReverseOrder):
            (checkSameOrder):
            (extendingSelection):
            (testExtendingSelection):
            (createTestNodes.window.onload):
            (createTestNodes):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72482 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index b7e3bdc..2b71f6e 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,42 @@
+2010-11-19  Ryosuke Niwa  <rniwa at webkit.org>
+
+        Reviewed by Antonio Gomes.
+
+        /editing/selection/extend-selection.html should be split into smaller tests
+        https://bugs.webkit.org/show_bug.cgi?id=49849
+
+        Divided the test into 4 pieces.
+
+        * editing/selection/extend-selection-character-expected.txt: Added.
+        * editing/selection/extend-selection-character.html: Added.
+        * editing/selection/extend-selection-enclosing-block-expected.txt: Added.
+        * editing/selection/extend-selection-enclosing-block.html: Added.
+        * editing/selection/extend-selection-expected.txt: Removed.
+        * editing/selection/extend-selection-home-end-expected.txt: Added.
+        * editing/selection/extend-selection-home-end.html: Added.
+        * editing/selection/extend-selection-word-expected.txt: Added.
+        * editing/selection/extend-selection-word.html: Added.
+        * editing/selection/extend-selection.html: Removed.
+        * editing/selection/resources/extend-selection.css: Added.
+        (div.test):
+        (div.test:before):
+        (div.test span):
+        (div.test img):
+        (div.test img + img):
+        (div.test div):
+        * editing/selection/resources/extend-selection.js: Added.
+        (log):
+        (positionsExtendingInDirectionForEnclosingBlock):
+        (positionsExtendingInDirection):
+        (fold):
+        (logPositions):
+        (checkReverseOrder):
+        (checkSameOrder):
+        (extendingSelection):
+        (testExtendingSelection):
+        (createTestNodes.window.onload):
+        (createTestNodes):
+
 2010-11-20  Julie Parent  <jparent at chromium.org>
 
         Unreviewed.  Adding failing expectation for Win + Linux for new 
diff --git a/LayoutTests/editing/selection/extend-selection-character-expected.txt b/LayoutTests/editing/selection/extend-selection-character-expected.txt
new file mode 100644
index 0000000..9927fb2
--- /dev/null
+++ b/LayoutTests/editing/selection/extend-selection-character-expected.txt
@@ -0,0 +1,173 @@
+
+
+
+Extending by character
+Test 1, LTR:
+  Extending right: "\nabc ABC xyz DEF def\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
+  Extending left:  "\nabc ABC xyz DEF def\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
+  Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+Test 1, RTL:
+  Extending left: "\nabc ABC xyz DEF def\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
+  Extending right:  "\nabc ABC xyz DEF def\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
+  Extending backward: "\nabc ABC xyz DEF def\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 2, LTR:
+  Extending right: "\nABC xyz DEF def GHI\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
+  Extending left:  "\nABC xyz DEF def GHI\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
+  Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+Test 2, RTL:
+  Extending left: "\nABC xyz DEF def GHI\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
+  Extending right:  "\nABC xyz DEF def GHI\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
+  Extending backward: "\nABC xyz DEF def GHI\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 3, LTR:
+  Extending right: "\nABC DEF ABC\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12)]
+  Extending left:  "\nABC DEF ABC\n"[(1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12)]
+  Extending backward:  "\nABC DEF ABC\n"[(1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+Test 3, RTL:
+  Extending left: "\nABC DEF ABC\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12)]
+  Extending right:  "\nABC DEF ABC\n"[(1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12)]
+  Extending backward: "\nABC DEF ABC\n"[(1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 4, LTR:
+  Extending right: "\nabc efd dabeb\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14)]
+  Extending left:  "\nabc efd dabeb\n"[(1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14)]
+  Extending backward:  "\nabc efd dabeb\n"[(1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+Test 4, RTL:
+  Extending left: "\nabc efd dabeb\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14)]
+  Extending right:  "\nabc efd dabeb\n"[(1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14)]
+  Extending backward: "\nabc efd dabeb\n"[(1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 5, LTR:
+  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending left:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending backward:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+Test 5, RTL:
+  Extending left: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending right:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending backward: " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 6, LTR:
+  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending left:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending backward:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+Test 6, RTL:
+  Extending left: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending right:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending backward: " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 7, LTR:
+  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending left:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending backward:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+Test 7, RTL:
+  Extending left: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending right:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending backward: " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 8, LTR:
+  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending left:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending backward:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+Test 8, RTL:
+  Extending left: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending right:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending backward: " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+
diff --git a/LayoutTests/editing/selection/extend-selection-character.html b/LayoutTests/editing/selection/extend-selection-character.html
new file mode 100644
index 0000000..9f277f7
--- /dev/null
+++ b/LayoutTests/editing/selection/extend-selection-character.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link rel="stylesheet" type="text/css" href="resources/extend-selection.css" />
+<script src="resources/extend-selection.js"></script>
+</head>
+<body>
+<pre id="console"></pre>
+<script>
+
+if (window.layoutTestController) {
+    layoutTestController.dumpAsText();
+
+    var tests = createTestNodes("char-and-word");
+    var sel = getSelection();
+
+    log("\n\n\nExtending by character\n");
+    testExtendingSelection(tests,  sel, "character", 0);
+}
+
+</script>
+</body>
diff --git a/LayoutTests/editing/selection/extend-selection-enclosing-block-expected.txt b/LayoutTests/editing/selection/extend-selection-enclosing-block-expected.txt
new file mode 100644
index 0000000..a0fa35a
--- /dev/null
+++ b/LayoutTests/editing/selection/extend-selection-enclosing-block-expected.txt
@@ -0,0 +1,17 @@
+
+
+
+Extending by character
+Test 1, LTR:
+  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5)], "ipsum dolor sit"[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amett"[(0,1), (0,2), (0,3), (0,4), (0,5)]
+  Extending left:  " amett"[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)], "Lorem "[(0,5), (0,4), (0,3), (0,2), (0,1)]
+
+
+
+
+
+Extending by word
+Test 1, LTR:
+  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amett"[(0,6), (0,1)]
+  Extending left:  " amett"[(0,6), (0,1)], "ipsum dolor sit"[(0,12), (0,6), (0,0)], "Lorem "[(0,0), (0,5)]
+
diff --git a/LayoutTests/editing/selection/extend-selection-enclosing-block.html b/LayoutTests/editing/selection/extend-selection-enclosing-block.html
new file mode 100644
index 0000000..ae70653
--- /dev/null
+++ b/LayoutTests/editing/selection/extend-selection-enclosing-block.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link rel="stylesheet" type="text/css" href="resources/extend-selection.css" />
+<script src="resources/extend-selection.js"></script>
+</head>
+<body>
+<pre id="console"></pre>
+<script>
+
+function testExtendingSelectionForEnclosingBlock(tests, sel, granularity)
+{
+    for (var i = 0; i < tests.length; ++i) {
+        log("Test " + (i + 1) + ", LTR:\n  Extending right: ");
+        sel.setPosition(tests[i], 0);
+        var ltrRightPos = extendingSelection(sel, "right", granularity, 1);
+
+        log("  Extending left:  ");
+        var ltrLeftPos = extendingSelection(sel, "left", granularity, 1);
+    }
+}
+
+if (window.layoutTestController) {
+    layoutTestController.dumpAsText();
+
+    tests = createTestNodes("enclosing-block");
+    sel = getSelection();
+
+    log("\n\n\nExtending by character\n");
+    testExtendingSelectionForEnclosingBlock(tests,  sel, "character", 1);
+    log("\n\n\n\n\nExtending by word\n");
+    testExtendingSelectionForEnclosingBlock(tests,  sel, "word", 1);
+}
+
+</script>
+</body>
diff --git a/LayoutTests/editing/selection/extend-selection-expected.txt b/LayoutTests/editing/selection/extend-selection-expected.txt
deleted file mode 100644
index d5fe30d..0000000
--- a/LayoutTests/editing/selection/extend-selection-expected.txt
+++ /dev/null
@@ -1,528 +0,0 @@
-abc אבג xyz דהו def
-אבג xyz דהו def זחט
-אבג דהו אבג
-abc efd dabeb
-Lorem ipsum dolor sit amet
-Lorem ipsum dolor sit amet
-Lorem ipsum dolor sit amet
-Lorem ipsum dolor sit amet
-Lorem
-ipsum dolor sit
-amett
-Lorem ipsum dolor sit amet
-Lorem ipsum dolor
-just a test
-sit amet
-Lorem ipsum dolor sit amet
-Lorem
-ipsum dolor sit
-amet
-Just testing רק בודק
-Just testing what ever
-car means אבג.
-‫car דהו אבג.‬
-he said "‫car דהו אבג‬."
-זחט יךכ לםמ '‪he said "‫car דהו אבג‬"‬'?
-אבג abc דהו
-edf זחט abrebg
-abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg
-abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg
-
-
-
-Extending by character
-Test 1, LTR:
-  Extending right: "\nabc ABC xyz DEF def\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
-  Extending left:  "\nabc ABC xyz DEF def\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
-  Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-Test 1, RTL:
-  Extending left: "\nabc ABC xyz DEF def\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
-  Extending right:  "\nabc ABC xyz DEF def\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
-  Extending backward: "\nabc ABC xyz DEF def\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 2, LTR:
-  Extending right: "\nABC xyz DEF def GHI\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
-  Extending left:  "\nABC xyz DEF def GHI\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
-  Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-Test 2, RTL:
-  Extending left: "\nABC xyz DEF def GHI\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
-  Extending right:  "\nABC xyz DEF def GHI\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14), (1,15), (1,16), (1,17), (1,18), (1,19), (1,20)]
-  Extending backward: "\nABC xyz DEF def GHI\n"[(1,20), (1,19), (1,18), (1,17), (1,16), (1,15), (1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 3, LTR:
-  Extending right: "\nABC DEF ABC\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12)]
-  Extending left:  "\nABC DEF ABC\n"[(1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12)]
-  Extending backward:  "\nABC DEF ABC\n"[(1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-Test 3, RTL:
-  Extending left: "\nABC DEF ABC\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12)]
-  Extending right:  "\nABC DEF ABC\n"[(1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12)]
-  Extending backward: "\nABC DEF ABC\n"[(1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 4, LTR:
-  Extending right: "\nabc efd dabeb\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14)]
-  Extending left:  "\nabc efd dabeb\n"[(1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14)]
-  Extending backward:  "\nabc efd dabeb\n"[(1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-Test 4, RTL:
-  Extending left: "\nabc efd dabeb\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14)]
-  Extending right:  "\nabc efd dabeb\n"[(1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13), (1,14)]
-  Extending backward: "\nabc efd dabeb\n"[(1,14), (1,13), (1,12), (1,11), (1,10), (1,9), (1,8), (1,7), (1,6), (1,5), (1,4), (1,3), (1,2), (1,1)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 5, LTR:
-  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending left:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending backward:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-Test 5, RTL:
-  Extending left: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending right:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending backward: " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 6, LTR:
-  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending left:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending backward:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-Test 6, RTL:
-  Extending left: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending right:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending backward: " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 7, LTR:
-  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending left:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending backward:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-Test 7, RTL:
-  Extending left: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending right:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending backward: " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 8, LTR:
-  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending left:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending backward:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-Test 8, RTL:
-  Extending left: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending right:  " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6)], "ipsum dolor sit"[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amet"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending backward: " amet"[(0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "Lorem "[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-
-
-
-
-
-Extending by word
-Test 1, LTR:
-  Extending right: "\nabc ABC xyz DEF def\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
-  Extending left:  "\nabc ABC xyz DEF def\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
-  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
-  Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
-Test 1, RTL:
-  Extending left: "\nabc ABC xyz DEF def\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
-  Extending right:  "\nabc ABC xyz DEF def\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
-  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
-  Extending backward: "\nabc ABC xyz DEF def\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 2, LTR:
-  Extending right: "\nABC xyz DEF def GHI\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
-  Extending left:  "\nABC xyz DEF def GHI\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
-  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
-  Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
-Test 2, RTL:
-  Extending left: "\nABC xyz DEF def GHI\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
-  Extending right:  "\nABC xyz DEF def GHI\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
-  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
-  Extending backward: "\nABC xyz DEF def GHI\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 3, LTR:
-  Extending right: "\nABC DEF ABC\n"[(1,1), (1,4), (1,8), (1,12)]
-  Extending left:  "\nABC DEF ABC\n"[(1,12), (1,9), (1,5), (1,1)]
-  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,4), (1,8), (1,12)]
-  Extending backward:  "\nABC DEF ABC\n"[(1,12), (1,9), (1,5), (1,1)]
-Test 3, RTL:
-  Extending left: "\nABC DEF ABC\n"[(1,1), (1,4), (1,8), (1,12)]
-  Extending right:  "\nABC DEF ABC\n"[(1,12), (1,9), (1,5), (1,1)]
-  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,4), (1,8), (1,12)]
-  Extending backward: "\nABC DEF ABC\n"[(1,12), (1,9), (1,5), (1,1)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 4, LTR:
-  Extending right: "\nabc efd dabeb\n"[(1,1), (1,4), (1,8), (1,14)]
-  Extending left:  "\nabc efd dabeb\n"[(1,14), (1,9), (1,5), (1,1)]
-  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,4), (1,8), (1,14)]
-  Extending backward:  "\nabc efd dabeb\n"[(1,14), (1,9), (1,5), (1,1)]
-Test 4, RTL:
-  Extending left: "\nabc efd dabeb\n"[(1,1), (1,4), (1,8), (1,14)]
-  Extending right:  "\nabc efd dabeb\n"[(1,14), (1,9), (1,5), (1,1)]
-  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,4), (1,8), (1,14)]
-  Extending backward: "\nabc efd dabeb\n"[(1,14), (1,9), (1,5), (1,1)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 5, LTR:
-  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending left:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-Test 5, RTL:
-  Extending left: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending right:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending backward: " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 6, LTR:
-  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending left:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-Test 6, RTL:
-  Extending left: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending right:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending backward: " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 7, LTR:
-  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending left:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-Test 7, RTL:
-  Extending left: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending right:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending backward: " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-Test 8, LTR:
-  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending left:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-Test 8, RTL:
-  Extending left: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending right:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
-  Extending backward: " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
-
-
-  validating ltrRight and ltrLeft
-  validating ltrRight and ltrForward
-  validating ltrForward and rtlForward
-  validating ltrLeft and ltrBackward
-  validating ltrBackward and rtlBackward
-  validating ltrRight and rtlLeft
-  validating ltrLeft and rtlRight
-
-
-
-
-
-Extending by character
-Test 1, LTR:
-  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5)], "ipsum dolor sit"[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amett"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending left:  " amett"[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)], "Lorem "[(0,5), (0,4), (0,3), (0,2), (0,1)]
-
-
-
-
-
-Extending by word
-Test 1, LTR:
-  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amett"[(0,6), (0,1)]
-  Extending left:  " amett"[(0,6), (0,1)], "ipsum dolor sit"[(0,12), (0,6), (0,0)], "Lorem "[(0,0), (0,5)]
-
-
-
-Extending by lineBoundary
-Test 1, LTR:
-  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,20)]
-  Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20)]
-Test 1, RTL:
-  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,20)]
-  Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20)]
-Test 2, LTR:
-  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,20)]
-  Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20)]
-Test 2, RTL:
-  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,20)]
-  Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20)]
-Test 3, LTR:
-  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,12)]
-  Extending backward:  "\nABC DEF ABC\n"[(1,12)]
-Test 3, RTL:
-  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,12)]
-  Extending backward:  "\nABC DEF ABC\n"[(1,12)]
-Test 4, LTR:
-  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,14)]
-  Extending backward:  "\nabc efd dabeb\n"[(1,14)]
-Test 4, RTL:
-  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,14)]
-  Extending backward:  "\nabc efd dabeb\n"[(1,14)]
-Test 5, LTR:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 5, RTL:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 6, LTR:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 6, RTL:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 7, LTR:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 7, RTL:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 8, LTR:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 8, RTL:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 9, LTR:
-  Extending forward: "Lorem "[(0,0), (0,5)]
-  Extending backward:  "Lorem "[(0,5)]
-Test 9, RTL:
-  Extending forward: "Lorem "[(0,0), (0,5)]
-  Extending backward:  "Lorem "[(0,5)]
-Test 10, LTR:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 10, RTL:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 11, LTR:
-  Extending forward: "Lorem "[(0,0)], "ipsum dolor"[(0,11)]
-  Extending backward:  "ipsum dolor"[(0,11)]
-Test 11, RTL:
-  Extending forward: "Lorem "[(0,0)], "ipsum dolor"[(0,11)]
-  Extending backward:  "ipsum dolor"[(0,11)]
-Test 12, LTR:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 12, RTL:
-  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
-  Extending backward:  " amet"[(0,5)]
-Test 13, LTR:
-  Extending forward: "Lorem "[(0,0), (0,5)]
-  Extending backward:  "Lorem "[(0,5)]
-Test 13, RTL:
-  Extending forward: "Lorem "[(0,0), (0,5)]
-  Extending backward:  "Lorem "[(0,5)]
-Test 14, LTR:
-  Extending forward: "\n Just\n "[(2,2)], "\n BFDX\n"[(2,6)]
-  Extending backward:  "\n BFDX\n"[(2,6)]
-Test 14, RTL:
-  Extending forward: "\n Just\n "[(2,2)], "\n BFDX\n"[(2,6)]
-  Extending backward:  "\n BFDX\n"[(2,6)]
-Test 15, LTR:
-  Extending forward: "\n Just\n "[(2,2)], "\n ever\n"[(2,6)]
-  Extending backward:  "\n ever\n"[(2,6)]
-Test 15, RTL:
-  Extending forward: "\n Just\n "[(2,2)], "\n ever\n"[(2,6)]
-  Extending backward:  "\n ever\n"[(2,6)]
-Test 16, LTR:
-  Extending forward: "car means ABC."[(0,0), (0,14)]
-  Extending backward:  "car means ABC."[(0,14)]
-Test 16, RTL:
-  Extending forward: "car means ABC."[(0,0), (0,14)]
-  Extending backward:  "car means ABC."[(0,14)]
-Test 17, LTR:
-  Extending forward: "᪜car DEF ABC.᪝"[(0,0), (0,14)]
-  Extending backward:  "᪜car DEF ABC.᪝"[(0,14)]
-Test 17, RTL:
-  Extending forward: "᪜car DEF ABC.᪝"[(0,0), (0,14)]
-  Extending backward:  "᪜car DEF ABC.᪝"[(0,14)]
-Test 18, LTR:
-  Extending forward: "he said "᪜car DEF ABC᪝.""[(0,0), (0,24)]
-  Extending backward:  "he said "᪜car DEF ABC᪝.""[(0,24)]
-Test 18, RTL:
-  Extending forward: "he said "᪜car DEF ABC᪝.""[(0,0), (0,24)]
-  Extending backward:  "he said "᪜car DEF ABC᪝.""[(0,24)]
-Test 19, LTR:
-  Extending forward: "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,0), (0,40)]
-  Extending backward:  "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,40)]
-Test 19, RTL:
-  Extending forward: "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,0), (0,40)]
-  Extending backward:  "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,40)]
-Test 20, LTR:
-  Extending forward: "ABC abc DEF"[(0,0), (0,11)]
-  Extending backward:  "ABC abc DEF"[(0,11)]
-Test 20, RTL:
-  Extending forward: "ABC abc DEF"[(0,0), (0,11)]
-  Extending backward:  "ABC abc DEF"[(0,11)]
-Test 21, LTR:
-  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,8)]
-  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,8)]
-Test 21, RTL:
-  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,7)]
-  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,7)]
-Test 22, LTR:
-  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,8)]
-  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,8)]
-Test 22, RTL:
-  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,7)]
-  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,7)]
-
diff --git a/LayoutTests/editing/selection/extend-selection-home-end-expected.txt b/LayoutTests/editing/selection/extend-selection-home-end-expected.txt
new file mode 100644
index 0000000..6606c9b
--- /dev/null
+++ b/LayoutTests/editing/selection/extend-selection-home-end-expected.txt
@@ -0,0 +1,137 @@
+
+
+
+Extending by lineBoundary
+Test 1, LTR:
+  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,20)]
+  Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20)]
+Test 1, RTL:
+  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,20)]
+  Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20)]
+Test 2, LTR:
+  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,20)]
+  Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20)]
+Test 2, RTL:
+  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,20)]
+  Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20)]
+Test 3, LTR:
+  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,12)]
+  Extending backward:  "\nABC DEF ABC\n"[(1,12)]
+Test 3, RTL:
+  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,12)]
+  Extending backward:  "\nABC DEF ABC\n"[(1,12)]
+Test 4, LTR:
+  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,14)]
+  Extending backward:  "\nabc efd dabeb\n"[(1,14)]
+Test 4, RTL:
+  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,14)]
+  Extending backward:  "\nabc efd dabeb\n"[(1,14)]
+Test 5, LTR:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 5, RTL:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 6, LTR:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 6, RTL:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 7, LTR:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 7, RTL:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 8, LTR:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 8, RTL:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 9, LTR:
+  Extending forward: "Lorem "[(0,0), (0,5)]
+  Extending backward:  "Lorem "[(0,5)]
+Test 9, RTL:
+  Extending forward: "Lorem "[(0,0), (0,5)]
+  Extending backward:  "Lorem "[(0,5)]
+Test 10, LTR:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 10, RTL:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 11, LTR:
+  Extending forward: "Lorem "[(0,0)], "ipsum dolor"[(0,11)]
+  Extending backward:  "ipsum dolor"[(0,11)]
+Test 11, RTL:
+  Extending forward: "Lorem "[(0,0)], "ipsum dolor"[(0,11)]
+  Extending backward:  "ipsum dolor"[(0,11)]
+Test 12, LTR:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 12, RTL:
+  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5)]
+Test 13, LTR:
+  Extending forward: "Lorem "[(0,0), (0,5)]
+  Extending backward:  "Lorem "[(0,5)]
+Test 13, RTL:
+  Extending forward: "Lorem "[(0,0), (0,5)]
+  Extending backward:  "Lorem "[(0,5)]
+Test 14, LTR:
+  Extending forward: "\n Just\n "[(2,2)], "\n BFDX\n"[(2,6)]
+  Extending backward:  "\n BFDX\n"[(2,6)]
+Test 14, RTL:
+  Extending forward: "\n Just\n "[(2,2)], "\n BFDX\n"[(2,6)]
+  Extending backward:  "\n BFDX\n"[(2,6)]
+Test 15, LTR:
+  Extending forward: "\n Just\n "[(2,2)], "\n ever\n"[(2,6)]
+  Extending backward:  "\n ever\n"[(2,6)]
+Test 15, RTL:
+  Extending forward: "\n Just\n "[(2,2)], "\n ever\n"[(2,6)]
+  Extending backward:  "\n ever\n"[(2,6)]
+Test 16, LTR:
+  Extending forward: "car means ABC."[(0,0), (0,14)]
+  Extending backward:  "car means ABC."[(0,14)]
+Test 16, RTL:
+  Extending forward: "car means ABC."[(0,0), (0,14)]
+  Extending backward:  "car means ABC."[(0,14)]
+Test 17, LTR:
+  Extending forward: "᪜car DEF ABC.᪝"[(0,0), (0,14)]
+  Extending backward:  "᪜car DEF ABC.᪝"[(0,14)]
+Test 17, RTL:
+  Extending forward: "᪜car DEF ABC.᪝"[(0,0), (0,14)]
+  Extending backward:  "᪜car DEF ABC.᪝"[(0,14)]
+Test 18, LTR:
+  Extending forward: "he said "᪜car DEF ABC᪝.""[(0,0), (0,24)]
+  Extending backward:  "he said "᪜car DEF ABC᪝.""[(0,24)]
+Test 18, RTL:
+  Extending forward: "he said "᪜car DEF ABC᪝.""[(0,0), (0,24)]
+  Extending backward:  "he said "᪜car DEF ABC᪝.""[(0,24)]
+Test 19, LTR:
+  Extending forward: "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,0), (0,40)]
+  Extending backward:  "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,40)]
+Test 19, RTL:
+  Extending forward: "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,0), (0,40)]
+  Extending backward:  "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,40)]
+Test 20, LTR:
+  Extending forward: "ABC abc DEF"[(0,0), (0,11)]
+  Extending backward:  "ABC abc DEF"[(0,11)]
+Test 20, RTL:
+  Extending forward: "ABC abc DEF"[(0,0), (0,11)]
+  Extending backward:  "ABC abc DEF"[(0,11)]
+Test 21, LTR:
+  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,8)]
+  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,8)]
+Test 21, RTL:
+  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,7)]
+  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,7)]
+Test 22, LTR:
+  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,8)]
+  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,8)]
+Test 22, RTL:
+  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,7)]
+  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,7)]
+
diff --git a/LayoutTests/editing/selection/extend-selection-home-end.html b/LayoutTests/editing/selection/extend-selection-home-end.html
new file mode 100644
index 0000000..76d247a
--- /dev/null
+++ b/LayoutTests/editing/selection/extend-selection-home-end.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link rel="stylesheet" type="text/css" href="resources/extend-selection.css" />
+<script src="resources/extend-selection.js"></script>
+</head>
+<body>
+<pre id="console"></pre>
+<script>
+
+function testExtendingLineBoundary(tests, sel)
+{
+    for (var i = 0; i < tests.length; ++i) {
+        tests[i].style.direction = "ltr";
+        log("Test " + (i + 1) + ", LTR:\n  Extending forward: ");
+        sel.setPosition(tests[i], 0);
+        var ltrRightPos = extendingSelection(sel, "forward", "lineBoundary", 0);
+
+        log("  Extending backward:  ");
+        var ltrLeftPos = extendingSelection(sel, "backward", "lineBoundary", 0);
+
+        tests[i].style.direction = "rtl";
+        log("Test " + (i + 1) + ", RTL:\n  Extending forward: ");
+        sel.setPosition(tests[i], 0);
+        var ltrRightPos = extendingSelection(sel, "forward", "lineBoundary", 0);
+
+        log("  Extending backward:  ");
+        var ltrLeftPos = extendingSelection(sel, "backward", "lineBoundary", 0);
+    }
+}
+
+if (window.layoutTestController) {
+    layoutTestController.dumpAsText();
+
+    tests = createTestNodes(); // all
+    var sel = getSelection();
+    log("\n\n\nExtending by lineBoundary\n");
+    testExtendingLineBoundary(tests,  sel);
+}
+
+</script>
+</body>
diff --git a/LayoutTests/editing/selection/extend-selection-word-expected.txt b/LayoutTests/editing/selection/extend-selection-word-expected.txt
new file mode 100644
index 0000000..fc80fba
--- /dev/null
+++ b/LayoutTests/editing/selection/extend-selection-word-expected.txt
@@ -0,0 +1,175 @@
+
+
+
+
+
+Extending by word
+Test 1, LTR:
+  Extending right: "\nabc ABC xyz DEF def\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
+  Extending left:  "\nabc ABC xyz DEF def\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
+  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
+  Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
+Test 1, RTL:
+  Extending left: "\nabc ABC xyz DEF def\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
+  Extending right:  "\nabc ABC xyz DEF def\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
+  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
+  Extending backward: "\nabc ABC xyz DEF def\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 2, LTR:
+  Extending right: "\nABC xyz DEF def GHI\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
+  Extending left:  "\nABC xyz DEF def GHI\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
+  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
+  Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
+Test 2, RTL:
+  Extending left: "\nABC xyz DEF def GHI\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
+  Extending right:  "\nABC xyz DEF def GHI\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
+  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,4), (1,8), (1,12), (1,16), (1,20)]
+  Extending backward: "\nABC xyz DEF def GHI\n"[(1,20), (1,17), (1,13), (1,9), (1,5), (1,1)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 3, LTR:
+  Extending right: "\nABC DEF ABC\n"[(1,1), (1,4), (1,8), (1,12)]
+  Extending left:  "\nABC DEF ABC\n"[(1,12), (1,9), (1,5), (1,1)]
+  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,4), (1,8), (1,12)]
+  Extending backward:  "\nABC DEF ABC\n"[(1,12), (1,9), (1,5), (1,1)]
+Test 3, RTL:
+  Extending left: "\nABC DEF ABC\n"[(1,1), (1,4), (1,8), (1,12)]
+  Extending right:  "\nABC DEF ABC\n"[(1,12), (1,9), (1,5), (1,1)]
+  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,4), (1,8), (1,12)]
+  Extending backward: "\nABC DEF ABC\n"[(1,12), (1,9), (1,5), (1,1)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 4, LTR:
+  Extending right: "\nabc efd dabeb\n"[(1,1), (1,4), (1,8), (1,14)]
+  Extending left:  "\nabc efd dabeb\n"[(1,14), (1,9), (1,5), (1,1)]
+  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,4), (1,8), (1,14)]
+  Extending backward:  "\nabc efd dabeb\n"[(1,14), (1,9), (1,5), (1,1)]
+Test 4, RTL:
+  Extending left: "\nabc efd dabeb\n"[(1,1), (1,4), (1,8), (1,14)]
+  Extending right:  "\nabc efd dabeb\n"[(1,14), (1,9), (1,5), (1,1)]
+  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,4), (1,8), (1,14)]
+  Extending backward: "\nabc efd dabeb\n"[(1,14), (1,9), (1,5), (1,1)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 5, LTR:
+  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending left:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+Test 5, RTL:
+  Extending left: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending right:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending backward: " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 6, LTR:
+  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending left:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+Test 6, RTL:
+  Extending left: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending right:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending backward: " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 7, LTR:
+  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending left:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+Test 7, RTL:
+  Extending left: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending right:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending backward: " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+Test 8, LTR:
+  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending left:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending backward:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+Test 8, RTL:
+  Extending left: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending right:  " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+  Extending forward: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amet"[(0,5)]
+  Extending backward: " amet"[(0,5), (0,1)], "ipsum dolor sit"[(0,12), (0,6)], "Lorem "[(0,6), (0,0)]
+
+
+  validating ltrRight and ltrLeft
+  validating ltrRight and ltrForward
+  validating ltrForward and rtlForward
+  validating ltrLeft and ltrBackward
+  validating ltrBackward and rtlBackward
+  validating ltrRight and rtlLeft
+  validating ltrLeft and rtlRight
+
+
+
diff --git a/LayoutTests/editing/selection/extend-selection-word.html b/LayoutTests/editing/selection/extend-selection-word.html
new file mode 100644
index 0000000..95546e0
--- /dev/null
+++ b/LayoutTests/editing/selection/extend-selection-word.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link rel="stylesheet" type="text/css" href="resources/extend-selection.css" />
+<script src="resources/extend-selection.js"></script>
+</head>
+<body>
+<pre id="console"></pre>
+<script>
+
+if (window.layoutTestController) {
+    layoutTestController.dumpAsText();
+
+    var tests = createTestNodes('char-and-word');
+    var sel = getSelection();
+
+    log("\n\n\n\n\nExtending by word\n");
+    testExtendingSelection(tests,  sel, "word", 0);
+}
+
+</script>
+</body>
diff --git a/LayoutTests/editing/selection/extend-selection.html b/LayoutTests/editing/selection/extend-selection.html
deleted file mode 100644
index 7018d6d..0000000
--- a/LayoutTests/editing/selection/extend-selection.html
+++ /dev/null
@@ -1,353 +0,0 @@
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-    <style>
-        div.test {
-            -webkit-user-modify: read-write;
-            padding: 4px;
-            border: 1px dashed lightblue;
-            margin: 4px 4px 4px 24px;
-            outline: none;
-            font-family: Lucida Grande;
-            counter-increment: test-number;
-        }
-        div.test:before { content: counter(test-number); position: absolute; left: 8px; font-size: x-small; text-align: right; width: 20px; }
-        div.test span { background-color: #def; }
-        div.test img { width: 1em; height: 1em; background-color: lightgreen; }
-        div.test img + img { background-color: lightblue; }
-        div.test div { border: 1px dashed pink; padding: 3px; height: 2em; }
-    </style>
-    <script>
-        function log(message)
-        {
-            document.getElementById("console").appendChild(document.createTextNode(message));
-        }
-
-        function positionsExtendingInDirectionForEnclosingBlock(sel, direction, granularity)
-        {
-            var positions = [];
-            var ltrNum;
-            var rtlNum;
-            if (granularity == "character") {
-                ltrNum = 5;
-            } else {
-                ltrNum = 1;
-            }
-            if (granularity == "character") {
-                rtlNum = 15;
-            } else {
-                rtlNum = 3;
-            }
-            var index = 0;
-            while (index <= ltrNum) {
-                positions.push({ node: sel.extentNode, begin: sel.baseOffset, end: sel.extentOffset });
-                sel.modify("extend", direction, granularity);
-                ++index;
-            }
-            var antiDirection = direction;
-            if (antiDirection == 'left') {
-                antiDirection = "right";
-            } else if (antiDirection = 'right') {
-                antiDirection = "left";
-            }
-
-            index = 0;
-            while (index <= rtlNum) {
-                positions.push({ node: sel.extentNode, begin: sel.baseOffset, end: sel.extentOffset });
-                sel.modify("extend", antiDirection, granularity);
-                ++index;
-            }
-            var index = 0;
-            while (index < ltrNum) {
-                positions.push({ node: sel.extentNode, begin: sel.baseOffset, end: sel.extentOffset });
-                sel.modify("extend", direction, granularity);
-                ++index;
-            }
-            return positions;
-        }
-
-
-        function positionsExtendingInDirection(sel, direction, granularity)
-        {
-            var positions = [];
-            
-            while (true) {
-                positions.push({ node: sel.extentNode, begin: sel.baseOffset, end: sel.extentOffset });
-                sel.modify("extend", direction, granularity);
-                if (positions[positions.length - 1].node == sel.extentNode && positions[positions.length - 1].end == sel.extentOffset)
-                    break;
-            };
-            return positions;
-        }
-
-        function fold(string)
-        {
-            var result = "";
-            for (var i = 0; i < string.length; ++i) {
-                var char = string.charCodeAt(i);
-                if (char >= 0x05d0)
-                    char -= 0x058f;
-                else if (char == 10) {
-                    result += "\\n";
-                    continue;
-                }
-                result += String.fromCharCode(char);
-            }
-            return result;
-        }
-
-        function logPositions(positions)
-        {
-            for (var i = 0; i < positions.length; ++i) {
-                if (i) {
-                    if (positions[i].node != positions[i - 1].node)
-                        log("]");
-                    log(", ");
-                }
-                if (!i || positions[i].node != positions[i - 1].node)
-                    log((positions[i].node instanceof Text ? '"' + fold(positions[i].node.data) + '"' : "<" + positions[i].node.tagName + ">") + "[");
-                log("(" + positions[i].begin + "," + positions[i].end + ")");
-            }
-            log("]");
-        }
-
-        function checkReverseOrder(inputPositions, inputReversePositions)
-        {
-            var positions = inputPositions.slice();
-            var reversePositions = inputReversePositions.slice();
-            var mismatch = (positions.length != reversePositions.length);
-            if (mismatch)
-                log("WARNING: positions should be the same, but the length are not the same " +  positions.length + " vs. " + reversePositions.length + "\n");
-            while (!mismatch) {
-                var pos = positions.pop();
-                if (!pos)
-                    break;
-                var reversePos = reversePositions.shift();
-                if (pos.node != reversePos.node) {
-                    mismatch = true;
-                    log("WARNING: positions should be the reverse, but node are not the reverse\n");
-                } 
-                if (pos.begin != reversePos.begin) {
-                    mismatch = true;
-                    log("WARNING: positions should be the same, but begin are not " + pos.begin + " vs. " + reversePos.begin + "\n");
-                }
-                if (pos.end != reversePos.end) {
-                    mismatch = true;
-                    log("WARNING: positions should be the same, but end are not " + pos.end + " vs. " + reversePos.end + "\n");
-                }
-            }
-        }
-
-
-        function checkSameOrder(inputPositions, inputSamePositions)
-        {
-            var positions = inputPositions.slice();
-            var samePositions = inputSamePositions.slice();
-            var mismatch = positions.length != samePositions.length;
-            if (mismatch)
-                log("WARNING: positions should be the same, but the length are not the same " +  positions.length + " vs. " + samePositions.length + "\n");
-            while (!mismatch) {
-                var pos = positions.pop();
-                if (!pos)
-                    break;
-                var samePos = samePositions.pop();
-                if (pos.node != samePos.node) {
-                    mismatch = true;
-                    log("WARNING: positions should be the same, but node are not the same\n");
-                } 
-                if (pos.begin != samePos.begin) {
-                    mismatch = true;
-                    log("WARNING: positions should be the same, but begin are not the same " + pos.begin + " vs. " + samePos.begin + "\n");
-                }
-                if (pos.end != samePos.end) {
-                    mismatch = true;
-                    log("WARNING: positions should be the same, but end are not the same " + pos.end + " vs. " + samePos.end + "\n");
-                }
-           }
-        }
-
-
-        function extendingSelection(sel, direction, granularity, option)
-        {
-            var positions;
-            if (option == 0) {
-                positions = positionsExtendingInDirection(sel, direction, granularity);
-            } else {
-                positions = positionsExtendingInDirectionForEnclosingBlock(sel, direction, granularity);
-            }
-            logPositions(positions);
-            log("\n");
-            return positions;
-        }
-
-        function testExtendingSelection(tests, sel, granularity)
-        {
-            for (var i = 0; i < tests.length; ++i) {
-                tests[i].style.direction = "ltr";
-                log("Test " + (i + 1) + ", LTR:\n  Extending right: ");
-                sel.setPosition(tests[i], 0);
-                var ltrRightPos = extendingSelection(sel, "right", granularity, 0);
-    
-                log("  Extending left:  ");
-                var ltrLeftPos = extendingSelection(sel, "left", granularity, 0);
-    
-                log("  Extending forward: ");
-                sel.setPosition(tests[i], 0);
-                var ltrForwardPos = extendingSelection(sel, "forward", granularity, 0);
-    
-                log("  Extending backward:  ");
-                var ltrBackwardPos = extendingSelection(sel, "backward", granularity, 0);
-    
-                tests[i].style.direction = "rtl";
-    
-                log("Test " + (i + 1) + ", RTL:\n  Extending left: ");
-                sel.setPosition(tests[i], 0);
-                var rtlLeftPos = extendingSelection(sel, "left", granularity, 0);
-    
-                log("  Extending right:  ");
-                var rtlRightPos = extendingSelection(sel, "right", granularity, 0);
-    
-                log("  Extending forward: ");
-                sel.setPosition(tests[i], 0);
-                var rtlForwardPos = extendingSelection(sel, "forward", granularity, 0);
-    
-                log("  Extending backward: ");
-                var rtlBackwardPos = extendingSelection(sel, "backward", granularity, 0);
-
-                // validations
-                log("\n\n  validating ltrRight and ltrLeft\n");
-                if (granularity == "character")
-                    checkReverseOrder(ltrRightPos, ltrLeftPos);
-                // Order might not be reversed for extending by word because the 1-point shift by space.
-
-                log("  validating ltrRight and ltrForward\n");
-                checkSameOrder(ltrRightPos, ltrForwardPos);
-                log("  validating ltrForward and rtlForward\n");
-                checkSameOrder(ltrForwardPos, rtlForwardPos);
-                log("  validating ltrLeft and ltrBackward\n");
-                checkSameOrder(ltrLeftPos, ltrBackwardPos);
-                log("  validating ltrBackward and rtlBackward\n");
-                checkSameOrder(ltrBackwardPos, rtlBackwardPos);
-                log("  validating ltrRight and rtlLeft\n");
-                checkSameOrder(ltrRightPos, rtlLeftPos);
-                log("  validating ltrLeft and rtlRight\n");
-                checkSameOrder(ltrLeftPos, rtlRightPos);
-                log("\n\n");
-            }
-        }
-
-        function testExtendingSelectionForEnclosingBlock(tests, sel, granularity)
-        {
-            for (var i = 0; i < tests.length; ++i) {
-                log("Test " + (i + 1) + ", LTR:\n  Extending right: ");
-                sel.setPosition(tests[i], 0);
-                var ltrRightPos = extendingSelection(sel, "right", granularity, 1);
-    
-                log("  Extending left:  ");
-                var ltrLeftPos = extendingSelection(sel, "left", granularity, 1);
-            }
-        }
-
-        function testExtendingLineBoundary(tests, sel)
-        {
-            for (var i = 0; i < tests.length; ++i) {
-                tests[i].style.direction = "ltr";
-                log("Test " + (i + 1) + ", LTR:\n  Extending forward: ");
-                sel.setPosition(tests[i], 0);
-                var ltrRightPos = extendingSelection(sel, "forward", "lineBoundary", 0);
-    
-                log("  Extending backward:  ");
-                var ltrLeftPos = extendingSelection(sel, "backward", "lineBoundary", 0);
-
-                tests[i].style.direction = "rtl";
-                log("Test " + (i + 1) + ", RTL:\n  Extending forward: ");
-                sel.setPosition(tests[i], 0);
-                var ltrRightPos = extendingSelection(sel, "forward", "lineBoundary", 0);
-    
-                log("  Extending backward:  ");
-                var ltrLeftPos = extendingSelection(sel, "backward", "lineBoundary", 0);
-            }
-        }
-
-        onload = function()
-        {
-            if (!window.layoutTestController)
-                return;
-
-            layoutTestController.dumpAsText();
-
-            var tests = document.getElementsByClassName("test");
-            var sel = getSelection();
-
-            log("\n\n\nExtending by character\n");
-            testExtendingSelection(tests,  sel, "character", 0);
-            log("\n\n\n\n\nExtending by word\n");
-            testExtendingSelection(tests,  sel, "word", 0);
-
-            tests = document.getElementsByClassName("testEnclosingBlock");
-            sel = getSelection();
-
-            log("\n\n\nExtending by character\n");
-            testExtendingSelectionForEnclosingBlock(tests,  sel, "character", 1);
-            log("\n\n\n\n\nExtending by word\n");
-            testExtendingSelectionForEnclosingBlock(tests,  sel, "word", 1);
-
-            tests = document.getElementsByClassName("home-end-test");
-            var sel = getSelection();
-            log("\n\n\nExtending by lineBoundary\n");
-            testExtendingLineBoundary(tests,  sel);
-        }
-
-    </script>
-</head>
-<body>
-<div contenteditable class="test home-end-test">
-abc &#1488;&#1489;&#1490; xyz &#1491;&#1492;&#1493; def
-</div>
-<div contenteditable class="test home-end-test">
-&#1488;&#1489;&#1490; xyz &#1491;&#1492;&#1493; def &#1494;&#1495;&#1496;
-</div>
-<div contenteditable class="test home-end-test">
-&#1488;&#1489;&#1490; &#1491;&#1492;&#1493; &#1488;&#1489;&#1490;
-</div>
-<div contenteditable class="test home-end-test">
-abc efd dabeb
-</div>
-
-
-<div contenteditable  class="test home-end-test">Lorem <span  style="direction: rtl">ipsum dolor sit</span> amet</div>
-<div contenteditable class="test home-end-test">Lorem <span  dir="rtl">ipsum dolor sit</span> amet</div>
-<div contenteditable  class="test home-end-test">Lorem <span  style="direction: ltr">ipsum dolor sit</span> amet</div>
-<div contenteditable class="test home-end-test">Lorem <span  dir="ltr">ipsum dolor sit</span> amet</div>
-
-<div contenteditable class="testEnclosingBlock home-end-test">Lorem <div  dir="rtl">ipsum dolor sit</div> amett</div>
-
-<div contenteditable  class="home-end-test">Lorem <span  style="direction: ltr">ipsum dolor sit</span> amet</div>
-<div contenteditable  class="home-end-test">Lorem <span  style="direction: ltr">ipsum dolor<div > just a test</div> sit</span> amet</div>
-<div contenteditable class="home-end-test">Lorem <span  dir="ltr">ipsum dolor sit</span> amet</div>
-<div contenteditable class="home-end-test">Lorem <div  dir="ltr">ipsum dolor sit</div> amet</div>
-
-<div class="home-end-test" contenteditable>
- Just
- <span>testing רק</span>
- בודק
-</div>
-
-<div class="home-end-test" contenteditable>
- Just
- <span>testing what</span>
- ever
-</div>
-
-
-<div class="home-end-test" contenteditable>car means &#1488;&#1489;&#1490;.</div>
-<div class="home-end-test" contenteditable>&#x202B;car &#1491;&#1492;&#1493; &#1488;&#1489;&#1490;.&#x202c;</div>
-<div class="home-end-test" contenteditable>he said "&#x202B;car &#1491;&#1492;&#1493; &#1488;&#1489;&#1490;&#x202c;."</div>
-<div class="home-end-test" contenteditable>&#1494;&#1495;&#1496; &#1497;&#1498;&#1499; &#1500;&#1501;&#1502; '&#x202a;he said "&#x202B;car &#1491;&#1492;&#1493; &#1488;&#1489;&#1490;&#x202c;"&#x202c;'?</div>
-
-
-<div class="home-end-test" contenteditable>&#1488;&#1489;&#1490; abc &#1491;&#1492;&#1493;<br />edf &#1494;&#1495;&#1496; abrebg</div>
-<div class="home-end-test" contenteditable style="line-break:before-white-space; width:100px">abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg </div>
-<div class="home-end-test" contenteditable style="line-break:after-white-space; width:100px">abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg </div>
-
-<pre id="console"></pre>
-</body>
diff --git a/LayoutTests/editing/selection/resources/extend-selection.css b/LayoutTests/editing/selection/resources/extend-selection.css
new file mode 100644
index 0000000..89090cb
--- /dev/null
+++ b/LayoutTests/editing/selection/resources/extend-selection.css
@@ -0,0 +1,14 @@
+div.test {
+    -webkit-user-modify: read-write;
+    padding: 4px;
+    border: 1px dashed lightblue;
+    margin: 4px 4px 4px 24px;
+    outline: none;
+    font-family: Lucida Grande;
+    counter-increment: test-number;
+}
+div.test:before { content: counter(test-number); position: absolute; left: 8px; font-size: x-small; text-align: right; width: 20px; }
+div.test span { background-color: #def; }
+div.test img { width: 1em; height: 1em; background-color: lightgreen; }
+div.test img + img { background-color: lightblue; }
+div.test div { border: 1px dashed pink; padding: 3px; height: 2em; }
diff --git a/LayoutTests/editing/selection/resources/extend-selection.js b/LayoutTests/editing/selection/resources/extend-selection.js
new file mode 100644
index 0000000..de43f85
--- /dev/null
+++ b/LayoutTests/editing/selection/resources/extend-selection.js
@@ -0,0 +1,267 @@
+function log(message)
+{
+    document.getElementById("console").appendChild(document.createTextNode(message));
+}
+
+function positionsExtendingInDirectionForEnclosingBlock(sel, direction, granularity)
+{
+    var positions = [];
+    var ltrNum;
+    var rtlNum;
+    if (granularity == "character") {
+        ltrNum = 5;
+    } else {
+        ltrNum = 1;
+    }
+    if (granularity == "character") {
+        rtlNum = 15;
+    } else {
+        rtlNum = 3;
+    }
+    var index = 0;
+    while (index <= ltrNum) {
+        positions.push({ node: sel.extentNode, begin: sel.baseOffset, end: sel.extentOffset });
+        sel.modify("extend", direction, granularity);
+        ++index;
+    }
+    var antiDirection = direction;
+    if (antiDirection == 'left') {
+        antiDirection = "right";
+    } else if (antiDirection = 'right') {
+        antiDirection = "left";
+    }
+
+    index = 0;
+    while (index <= rtlNum) {
+        positions.push({ node: sel.extentNode, begin: sel.baseOffset, end: sel.extentOffset });
+        sel.modify("extend", antiDirection, granularity);
+        ++index;
+    }
+    var index = 0;
+    while (index < ltrNum) {
+        positions.push({ node: sel.extentNode, begin: sel.baseOffset, end: sel.extentOffset });
+        sel.modify("extend", direction, granularity);
+        ++index;
+    }
+    return positions;
+}
+
+
+function positionsExtendingInDirection(sel, direction, granularity)
+{
+    var positions = [];
+    
+    while (true) {
+        positions.push({ node: sel.extentNode, begin: sel.baseOffset, end: sel.extentOffset });
+        sel.modify("extend", direction, granularity);
+        if (positions[positions.length - 1].node == sel.extentNode && positions[positions.length - 1].end == sel.extentOffset)
+            break;
+    };
+    return positions;
+}
+
+function fold(string)
+{
+    var result = "";
+    for (var i = 0; i < string.length; ++i) {
+        var char = string.charCodeAt(i);
+        if (char >= 0x05d0)
+            char -= 0x058f;
+        else if (char == 10) {
+            result += "\\n";
+            continue;
+        }
+        result += String.fromCharCode(char);
+    }
+    return result;
+}
+
+function logPositions(positions)
+{
+    for (var i = 0; i < positions.length; ++i) {
+        if (i) {
+            if (positions[i].node != positions[i - 1].node)
+                log("]");
+            log(", ");
+        }
+        if (!i || positions[i].node != positions[i - 1].node)
+            log((positions[i].node instanceof Text ? '"' + fold(positions[i].node.data) + '"' : "<" + positions[i].node.tagName + ">") + "[");
+        log("(" + positions[i].begin + "," + positions[i].end + ")");
+    }
+    log("]");
+}
+
+function checkReverseOrder(inputPositions, inputReversePositions)
+{
+    var positions = inputPositions.slice();
+    var reversePositions = inputReversePositions.slice();
+    var mismatch = (positions.length != reversePositions.length);
+    if (mismatch)
+        log("WARNING: positions should be the same, but the length are not the same " +  positions.length + " vs. " + reversePositions.length + "\n");
+    while (!mismatch) {
+        var pos = positions.pop();
+        if (!pos)
+            break;
+        var reversePos = reversePositions.shift();
+        if (pos.node != reversePos.node) {
+            mismatch = true;
+            log("WARNING: positions should be the reverse, but node are not the reverse\n");
+        } 
+        if (pos.begin != reversePos.begin) {
+            mismatch = true;
+            log("WARNING: positions should be the same, but begin are not " + pos.begin + " vs. " + reversePos.begin + "\n");
+        }
+        if (pos.end != reversePos.end) {
+            mismatch = true;
+            log("WARNING: positions should be the same, but end are not " + pos.end + " vs. " + reversePos.end + "\n");
+        }
+    }
+}
+
+
+function checkSameOrder(inputPositions, inputSamePositions)
+{
+    var positions = inputPositions.slice();
+    var samePositions = inputSamePositions.slice();
+    var mismatch = positions.length != samePositions.length;
+    if (mismatch)
+        log("WARNING: positions should be the same, but the length are not the same " +  positions.length + " vs. " + samePositions.length + "\n");
+    while (!mismatch) {
+        var pos = positions.pop();
+        if (!pos)
+            break;
+        var samePos = samePositions.pop();
+        if (pos.node != samePos.node) {
+            mismatch = true;
+            log("WARNING: positions should be the same, but node are not the same\n");
+        } 
+        if (pos.begin != samePos.begin) {
+            mismatch = true;
+            log("WARNING: positions should be the same, but begin are not the same " + pos.begin + " vs. " + samePos.begin + "\n");
+        }
+        if (pos.end != samePos.end) {
+            mismatch = true;
+            log("WARNING: positions should be the same, but end are not the same " + pos.end + " vs. " + samePos.end + "\n");
+        }
+   }
+}
+
+
+function extendingSelection(sel, direction, granularity, option)
+{
+    var positions;
+    if (option == 0) {
+        positions = positionsExtendingInDirection(sel, direction, granularity);
+    } else {
+        positions = positionsExtendingInDirectionForEnclosingBlock(sel, direction, granularity);
+    }
+    logPositions(positions);
+    log("\n");
+    return positions;
+}
+
+function testExtendingSelection(tests, sel, granularity)
+{
+    for (var i = 0; i < tests.length; ++i) {
+        tests[i].style.direction = "ltr";
+        log("Test " + (i + 1) + ", LTR:\n  Extending right: ");
+        sel.setPosition(tests[i], 0);
+        var ltrRightPos = extendingSelection(sel, "right", granularity, 0);
+
+        log("  Extending left:  ");
+        var ltrLeftPos = extendingSelection(sel, "left", granularity, 0);
+
+        log("  Extending forward: ");
+        sel.setPosition(tests[i], 0);
+        var ltrForwardPos = extendingSelection(sel, "forward", granularity, 0);
+
+        log("  Extending backward:  ");
+        var ltrBackwardPos = extendingSelection(sel, "backward", granularity, 0);
+
+        tests[i].style.direction = "rtl";
+
+        log("Test " + (i + 1) + ", RTL:\n  Extending left: ");
+        sel.setPosition(tests[i], 0);
+        var rtlLeftPos = extendingSelection(sel, "left", granularity, 0);
+
+        log("  Extending right:  ");
+        var rtlRightPos = extendingSelection(sel, "right", granularity, 0);
+
+        log("  Extending forward: ");
+        sel.setPosition(tests[i], 0);
+        var rtlForwardPos = extendingSelection(sel, "forward", granularity, 0);
+
+        log("  Extending backward: ");
+        var rtlBackwardPos = extendingSelection(sel, "backward", granularity, 0);
+
+        // validations
+        log("\n\n  validating ltrRight and ltrLeft\n");
+        if (granularity == "character")
+            checkReverseOrder(ltrRightPos, ltrLeftPos);
+        // Order might not be reversed for extending by word because the 1-point shift by space.
+
+        log("  validating ltrRight and ltrForward\n");
+        checkSameOrder(ltrRightPos, ltrForwardPos);
+        log("  validating ltrForward and rtlForward\n");
+        checkSameOrder(ltrForwardPos, rtlForwardPos);
+        log("  validating ltrLeft and ltrBackward\n");
+        checkSameOrder(ltrLeftPos, ltrBackwardPos);
+        log("  validating ltrBackward and rtlBackward\n");
+        checkSameOrder(ltrBackwardPos, rtlBackwardPos);
+        log("  validating ltrRight and rtlLeft\n");
+        checkSameOrder(ltrRightPos, rtlLeftPos);
+        log("  validating ltrLeft and rtlRight\n");
+        checkSameOrder(ltrLeftPos, rtlRightPos);
+        log("\n\n");
+    }
+}
+
+var data = [
+['char-and-word', null, '\nabc &#1488;&#1489;&#1490; xyz &#1491;&#1492;&#1493; def\n'],
+['char-and-word', null, '\n&#1488;&#1489;&#1490; xyz &#1491;&#1492;&#1493; def &#1494;&#1495;&#1496;\n'],
+['char-and-word', null, '\n&#1488;&#1489;&#1490; &#1491;&#1492;&#1493; &#1488;&#1489;&#1490;\n'],
+['char-and-word', null, '\nabc efd dabeb\n'],
+['char-and-word', null, 'Lorem <span  style="direction: rtl">ipsum dolor sit</span> amet'],
+['char-and-word', null, 'Lorem <span  dir="rtl">ipsum dolor sit</span> amet'],
+['char-and-word', null, 'Lorem <span  style="direction: ltr">ipsum dolor sit</span> amet'],
+['char-and-word', null, 'Lorem <span  dir="ltr">ipsum dolor sit</span> amet'],
+['enclosing-block', null, 'Lorem <div  dir="rtl">ipsum dolor sit</div> amett'],
+['home-end', null, 'Lorem <span  style="direction: ltr">ipsum dolor sit</span> amet'],
+['home-end', null, 'Lorem <span  style="direction: ltr">ipsum dolor<div > just a test</div> sit</span> amet'],
+['home-end', null, 'Lorem <span  dir="ltr">ipsum dolor sit</span> amet'],
+['home-end', null, 'Lorem <div  dir="ltr">ipsum dolor sit</div> amet'],
+['home-end', null, '\n Just\n <span>testing רק</span>\n בודק\n'],
+['home-end', null, '\n Just\n <span>testing what</span>\n ever\n'],
+['home-end', null, 'car means &#1488;&#1489;&#1490;.'],
+['home-end', null, '&#x202B;car &#1491;&#1492;&#1493; &#1488;&#1489;&#1490;.&#x202c;'],
+['home-end', null, 'he said "&#x202B;car &#1491;&#1492;&#1493; &#1488;&#1489;&#1490;&#x202c;."'],
+['home-end', null, '&#1494;&#1495;&#1496; &#1497;&#1498;&#1499; &#1500;&#1501;&#1502; \'&#x202a;he said "&#x202B;car &#1491;&#1492;&#1493; &#1488;&#1489;&#1490;&#x202c;"&#x202c;\'?'],
+['home-end', null, '&#1488;&#1489;&#1490; abc &#1491;&#1492;&#1493;<br />edf &#1494;&#1495;&#1496; abrebg'],
+['home-end', 'line-break:before-white-space; width:100px', 'abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg '],
+['home-end', 'line-break:after-white-space; width:100px', 'abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg ']
+];
+
+function createTestNodes(name) {
+    var nodes = [];
+    for (var i = 0; i < data.length; i++) {
+        if (name && data[i][0] != name)
+            continue;
+        var style = data[i][1];
+        var text = data[i][2];
+        var div = document.createElement('div');
+        div.contentEditable = true;
+        if (style)
+            div.setAttribute('style', style);
+        div.innerHTML = text;
+        document.body.insertBefore(div, document.getElementById('console'));
+        nodes.push(div);
+    }
+
+    window.onload = function() {
+        for (var i = 0; i < nodes.length; i++)
+            nodes[i].parentNode.removeChild(nodes[i]);
+    }
+
+    return nodes;
+}
+

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list