[Windows] Home hey doesn't work in first DIV inside a TABLE
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Jul 2010 22:55:21 +0000 (22:55 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Jul 2010 22:55:21 +0000 (22:55 +0000)
https://bugs.webkit.org/show_bug.cgi?id=42767

Reviewed by Ojan Vafai.

WebCore:

The bug was caused by positionAvoidingFirstPositionInTable moving outside of the editing region.
Added a check so that it avoids the first position in the table only if the table is editable.

Test: editing/selection/home-inside-noneditable-table.html

* editing/visible_units.cpp:
(WebCore::positionAvoidingFirstPositionInTable):

LayoutTests:

Added a test to move caret backwards to the line boundary inside a content-editable div
inside a non-editable table.

* editing/selection/home-inside-noneditable-table-expected.txt: Added.
* editing/selection/home-inside-noneditable-table.html: Added.
* resources/dump-as-markup.js: Modified to support multiple calls to dump
(Markup.dump.get if):
(Markup.dump):
(Markup.notifyDone):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@63918 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/editing/selection/home-inside-noneditable-table-expected.txt [new file with mode: 0644]
LayoutTests/editing/selection/home-inside-noneditable-table.html [new file with mode: 0644]
LayoutTests/resources/dump-as-markup.js
WebCore/ChangeLog
WebCore/editing/visible_units.cpp

index dbe5e6a..a281ca8 100644 (file)
@@ -1,3 +1,20 @@
+2010-07-22  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Reviewed by Ojan Vafai.
+
+        [Windows] Home hey doesn't work in first DIV inside a TABLE
+        https://bugs.webkit.org/show_bug.cgi?id=42767
+
+        Added a test to move caret backwards to the line boundary inside a content-editable div
+        inside a non-editable table.
+
+        * editing/selection/home-inside-noneditable-table-expected.txt: Added.
+        * editing/selection/home-inside-noneditable-table.html: Added.
+        * resources/dump-as-markup.js: Modified to support multiple calls to dump
+        (Markup.dump.get if):
+        (Markup.dump):
+        (Markup.notifyDone):
+
 2010-07-22  Dumitru Daniliuc  <dumi@chromium.org>
 
         Reviewed by Ojan Vafai.
diff --git a/LayoutTests/editing/selection/home-inside-noneditable-table-expected.txt b/LayoutTests/editing/selection/home-inside-noneditable-table-expected.txt
new file mode 100644 (file)
index 0000000..9a0a4f2
--- /dev/null
@@ -0,0 +1,33 @@
+Tests whether home moves the caret to the beginning of line inside a content-editable in an uneditable table.
+
+Dump of markup 1:
+<DIV id="test" contentEditable="true">
+<#text>
+</#text>
+<DIV id="l1">
+<#text>The caret is initially <selection-caret>here but should move to the beginning of the line.</#text>
+</DIV>
+<#text>
+</#text>
+<DIV>
+<#text>dummy text</#text>
+</DIV>
+<#text>
+</#text>
+</DIV>
+
+Dump of markup 2:
+<DIV id="test" contentEditable="true">
+<#text>
+</#text>
+<DIV id="l1">
+<#text><selection-caret>The caret is initially here but should move to the beginning of the line.</#text>
+</DIV>
+<#text>
+</#text>
+<DIV>
+<#text>dummy text</#text>
+</DIV>
+<#text>
+</#text>
+</DIV>
diff --git a/LayoutTests/editing/selection/home-inside-noneditable-table.html b/LayoutTests/editing/selection/home-inside-noneditable-table.html
new file mode 100644 (file)
index 0000000..d873938
--- /dev/null
@@ -0,0 +1,23 @@
+<script src="../../resources/dump-as-markup.js"></script>
+<table>
+  <tr>
+    <td>
+    <div id="test" contenteditable="true">
+      <div id="l1">The caret is initially here but should move to the beginning of the line.</div>
+      <div>dummy text</div>
+    </div>
+    </td>
+  </tr>
+</table>
+<script>
+
+Markup.description("Tests whether home moves the caret to the beginning of line inside a content-editable in an uneditable table.")
+Markup.setNodeToDump('test');
+
+var s = window.getSelection();
+s.setPosition(document.getElementById('l1').firstChild, 23);
+Markup.dump();
+s.modify("move", "backward", "lineboundary");
+Markup.dump();
+
+</script>
index 53a8504..916faa2 100644 (file)
  *    it dumps the content of the specified element as supposed to the entire DOM tree.
  *
  * 3. Dump the content of a specific element multiple times while the page is loading
- *    Calling Markup.dump would dump the content of the specified element or the entire DOM.
- *    On the page load, it dumps the content of the current node (set by setNodeToDump)
- *    or the entire DOM if the node was never set.
+ *    Calling Markup.dump would dump the content of the element set by setNodeToDump or the entire DOM.
+ *    Optionally specify the node to dump and the description for each call of dump.
  */
 
-
 if (window.layoutTestController) {
     layoutTestController.dumpAsText();
     layoutTestController.waitUntilDone();
@@ -27,29 +25,41 @@ var Markup = {};
 // The description of what this test is testing. Gets prepended to the dumped markup.
 Markup.description = function(description)
 {
-    Markup._description = description;
+    Markup._test_description = description;
 }
 
 // Dumps the markup for the given node (HTML element if no node is given).
 // Over-writes the body's content with the markup in layout test mode. Appends
 // a pre element when loaded manually, in order to aid debugging.
-Markup.dump = function(opt_node)
+Markup.dump = function(opt_node, opt_description)
 {
+    if (typeof opt_node == 'string')
+        opt_node = document.getElementById(opt_node);
+
     var node = opt_node || Markup._node || document.body.parentElement
+    var markup = "";
+
+    if (Markup._test_description && !Markup._dumpCalls)
+        markup += Markup._test_description + '\n';
+
+    Markup._dumpCalls++;
+
+    // If dump is not called by notifyDone, then print out optional description
+    // because this test is manually calling dump.
+    if (!Markup._done || opt_description) {
+        if (!opt_description)
+            opt_description = "Dump of markup " + Markup._dumpCalls
+        if (Markup._dumpCalls > 1)
+            markup += '\n';
+        markup += '\n' + opt_description + ':';
+    }
 
-    var markup = Markup._description ? Markup._description + '\n' : "";
     markup += Markup.get(node);
 
-    var container;
-    if (window.layoutTestController)
-        container = document.body;
-    else {
-        // In non-layout test mode, append the results in a pre so that we don't
-        // clobber the test itself. But when in layout test mode, we don't want
-        // side effects from the test to be included in the results.
-        container = document.createElement('pre');
-        container.style.cssText = 'width:100%';
-        document.body.appendChild(container);
+    if (!Markup._container) {
+        Markup._container = document.createElement('pre');
+        Markup._container.style.width = '100%';
+        document.body.appendChild(Markup._container);
     }
 
     // FIXME: Have this respect layoutTestController.dumpChildFramesAsText?
@@ -64,7 +74,7 @@ Markup.dump = function(opt_node)
         }
     }
 
-    container.innerText = markup;
+    Markup._container.innerText += markup;
 }
 
 Markup.waitUntilDone = function()
@@ -74,7 +84,17 @@ Markup.waitUntilDone = function()
 
 Markup.notifyDone = function()
 {
-    Markup.dump();
+    Markup._done = true;
+
+    // If dump has already been called, don't bother to dump again
+    if (!Markup._dumpCalls)
+        Markup.dump();
+
+    // In non-layout test mode, append the results in a pre so that we don't
+    // clobber the test itself. But when in layout test mode, we don't want
+    // side effects from the test to be included in the results.
+    if (window.layoutTestController)
+        document.body.innerText = Markup._container.innerText;
 
     if (window.layoutTestController)
         layoutTestController.notifyDone();
@@ -82,9 +102,9 @@ Markup.notifyDone = function()
 
 Markup.setNodeToDump = function(node)
 {
-  if (typeof node == "string")
-    node = document.getElementById(node);
-  Markup._node = node
+    if (typeof node == "string")
+        node = document.getElementById(node);
+    Markup._node = node
 }
 
 // Returns the markup for the given node. To be used for cases where a test needs
@@ -133,6 +153,8 @@ Markup.get = function(node, opt_depth)
     return markup;
 }
 
+Markup._dumpCalls = 0
+
 Markup._spaces = function(multiplier)
 {
     return new Array(multiplier * 4 + 1).join(' ');
index 7714f69..670524f 100644 (file)
@@ -1,3 +1,18 @@
+2010-07-22  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Reviewed by Ojan Vafai.
+
+        [Windows] Home hey doesn't work in first DIV inside a TABLE
+        https://bugs.webkit.org/show_bug.cgi?id=42767
+
+        The bug was caused by positionAvoidingFirstPositionInTable moving outside of the editing region.
+        Added a check so that it avoids the first position in the table only if the table is editable.
+
+        Test: editing/selection/home-inside-noneditable-table.html
+
+        * editing/visible_units.cpp:
+        (WebCore::positionAvoidingFirstPositionInTable):
+
 2010-07-22  Antonio Gomes  <tonikitoo@webkit.org>
 
         Reviewed by Laszlo Gombos.
index c094aac..dd48406 100644 (file)
@@ -377,9 +377,9 @@ static VisiblePosition positionAvoidingFirstPositionInTable(const VisiblePositio
 {
     // return table offset 0 instead of the first VisiblePosition inside the table
     VisiblePosition previous = c.previous();
-    if (isLastPositionBeforeTable(previous))
+    if (isLastPositionBeforeTable(previous) && isEditablePosition(previous.deepEquivalent()))
         return previous;
-    
+
     return c;
 }