Title: [179921] trunk
Revision
179921
Author
[email protected]
Date
2015-02-11 00:51:55 -0800 (Wed, 11 Feb 2015)

Log Message

Div having contentEditable and display:flex cannot be edited if it is empty.
https://bugs.webkit.org/show_bug.cgi?id=141218

Reviewed by Ryosuke Niwa.

Source/WebCore:

RenderFlexibleBox should be treated as a candidate for visible position. Visible selection
in an editable area is recalculated whenever an inner value of div is changed. If the inner value
is empty, the visible selection recalculated with DeleteSelectionCommand::m_endingPostion
is not correct. Because RenderBlockFlow is only considered but not RenderFlexibleBox
in Position::isCandidate so that a calculated ending VisiblePosition for an editable div
having "display : flex" goes weird and VisibleSelection is empty accordingly.

Test: fast/events/key-events-in-editable-flexbox.html

* dom/Position.cpp:
(WebCore::Position::isCandidate):

LayoutTests:

This tests if an editable flexbox can be reedited after erasing all texts in it.

* fast/events/key-events-in-editable-flexbox-expected.txt: Added.
* fast/events/key-events-in-editable-flexbox.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (179920 => 179921)


--- trunk/LayoutTests/ChangeLog	2015-02-11 08:36:22 UTC (rev 179920)
+++ trunk/LayoutTests/ChangeLog	2015-02-11 08:51:55 UTC (rev 179921)
@@ -1,3 +1,15 @@
+2015-02-11  ChangSeok Oh  <[email protected]>
+
+        Div having contentEditable and display:flex cannot be edited if it is empty.
+        https://bugs.webkit.org/show_bug.cgi?id=141218
+
+        Reviewed by Ryosuke Niwa.
+
+        This tests if an editable flexbox can be reedited after erasing all texts in it.
+
+        * fast/events/key-events-in-editable-flexbox-expected.txt: Added.
+        * fast/events/key-events-in-editable-flexbox.html: Added.
+
 2015-02-11  Dana Burkart  <[email protected]>
 
         http/tests/cache/disk-cache-validation.html generates a lot of Perl errors

Added: trunk/LayoutTests/fast/events/key-events-in-editable-flexbox-expected.txt (0 => 179921)


--- trunk/LayoutTests/fast/events/key-events-in-editable-flexbox-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/key-events-in-editable-flexbox-expected.txt	2015-02-11 08:51:55 UTC (rev 179921)
@@ -0,0 +1,7 @@
+PASS targetDiv.innerText is "TEST"
+PASS targetDiv.innerText is ""
+PASS targetDiv.innerText is "TEST"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+TEST

Added: trunk/LayoutTests/fast/events/key-events-in-editable-flexbox.html (0 => 179921)


--- trunk/LayoutTests/fast/events/key-events-in-editable-flexbox.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/key-events-in-editable-flexbox.html	2015-02-11 08:51:55 UTC (rev 179921)
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<style>
+    #target {
+        display: flex;
+        display: -webkit-flex;
+    }
+</style>
+<script>
+    var targetDiv;
+    function test()
+    {
+        targetDiv = document.getElementById('target');
+        targetDiv.focus();
+
+        // Move cursor to the end of line.
+        getSelection().modify('move', 'forward', 'lineboundary');
+
+        document.execCommand("insertText", false, "EST");
+        shouldBeEqualToString("targetDiv.innerText", "TEST");
+
+        document.execCommand("delete");
+        document.execCommand("delete");
+        document.execCommand("delete");
+        document.execCommand("delete");
+        document.execCommand("delete"); // Remove '\n'
+        shouldBeEmptyString("targetDiv.innerText");
+
+        document.execCommand("insertText", false, "TEST");
+        shouldBeEqualToString("targetDiv.innerText", "TEST");
+    }
+</script>
+</head>
+<body _onload_="test()">
+<div id="target" contentEditable>T</div>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (179920 => 179921)


--- trunk/Source/WebCore/ChangeLog	2015-02-11 08:36:22 UTC (rev 179920)
+++ trunk/Source/WebCore/ChangeLog	2015-02-11 08:51:55 UTC (rev 179921)
@@ -1,3 +1,22 @@
+2015-02-11  ChangSeok Oh  <[email protected]>
+
+        Div having contentEditable and display:flex cannot be edited if it is empty.
+        https://bugs.webkit.org/show_bug.cgi?id=141218
+
+        Reviewed by Ryosuke Niwa.
+
+        RenderFlexibleBox should be treated as a candidate for visible position. Visible selection
+        in an editable area is recalculated whenever an inner value of div is changed. If the inner value
+        is empty, the visible selection recalculated with DeleteSelectionCommand::m_endingPostion
+        is not correct. Because RenderBlockFlow is only considered but not RenderFlexibleBox
+        in Position::isCandidate so that a calculated ending VisiblePosition for an editable div
+        having "display : flex" goes weird and VisibleSelection is empty accordingly.
+
+        Test: fast/events/key-events-in-editable-flexbox.html
+
+        * dom/Position.cpp:
+        (WebCore::Position::isCandidate):
+
 2015-02-11  Commit Queue  <[email protected]>
 
         Unreviewed, rolling out r179910.

Modified: trunk/Source/WebCore/dom/Position.cpp (179920 => 179921)


--- trunk/Source/WebCore/dom/Position.cpp	2015-02-11 08:36:22 UTC (rev 179920)
+++ trunk/Source/WebCore/dom/Position.cpp	2015-02-11 08:51:55 UTC (rev 179921)
@@ -35,6 +35,7 @@
 #include "Logging.h"
 #include "PositionIterator.h"
 #include "RenderBlock.h"
+#include "RenderFlexibleBox.h"
 #include "RenderInline.h"
 #include "RenderIterator.h"
 #include "RenderLineBreak.h"
@@ -934,8 +935,8 @@
 
     if (m_anchorNode->hasTagName(htmlTag))
         return false;
-        
-    if (is<RenderBlockFlow>(*renderer)) {
+
+    if (is<RenderBlockFlow>(*renderer) || is<RenderFlexibleBox>(*renderer)) {
         RenderBlockFlow& block = downcast<RenderBlockFlow>(*renderer);
         if (block.logicalHeight() || m_anchorNode->hasTagName(bodyTag)) {
             if (!Position::hasRenderedNonAnonymousDescendantsWithHeight(block))
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to