Title: [118711] trunk
Revision
118711
Author
[email protected]
Date
2012-05-28 16:52:47 -0700 (Mon, 28 May 2012)

Log Message

Can't edit <input> elements with :first-letter
https://bugs.webkit.org/show_bug.cgi?id=87615

Reviewed by Kent Tamura.

A check using canHaveGeneratedChildren() should cover not only
button and menulist, but also RenderTextControl.
This change pulles canHaveGeneratedChildren() up
from RenderDeprecatedFlexibleBox to RenderObject,
and lets RenderTextControl override it.

Test: fast/forms/input-first-letter-edit.html

* rendering/RenderBlock.cpp:
(WebCore):
(WebCore::RenderBlock::styleDidChange):
(WebCore::RenderBlock::updateFirstLetter):
* rendering/RenderBlock.h: Removed a static function canHaveGeneratedChildren()
(RenderBlock):
* rendering/RenderDeprecatedFlexibleBox.h:
* rendering/RenderObject.cpp:
(WebCore):
(WebCore::RenderObject::canHaveGeneratedChildren): Added.
* rendering/RenderObject.h:
(RenderObject):
* rendering/RenderTextControl.h:

Modified Paths

Added Paths

Diff

Added: trunk/LayoutTests/fast/forms/input-first-letter-edit-expected.html (0 => 118711)


--- trunk/LayoutTests/fast/forms/input-first-letter-edit-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/input-first-letter-edit-expected.html	2012-05-28 23:52:47 UTC (rev 118711)
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html>
+<head>
+</head>
+<body>
+    <input type="text" id="target" value="Hello" autofocus="autofocus" />
+</body>
+</html>

Added: trunk/LayoutTests/fast/forms/input-first-letter-edit.html (0 => 118711)


--- trunk/LayoutTests/fast/forms/input-first-letter-edit.html	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/input-first-letter-edit.html	2012-05-28 23:52:47 UTC (rev 118711)
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+input:first-letter {
+    color: blue;
+}
+</style>
+<script>
+if (window.layoutTestController)
+    layoutTestController.waitUntilDone();
+function test()
+{
+    var target = document.getElementById("target");
+    target.focus();
+    if (window.eventSender) {
+        eventSender.keyDown("H");
+        eventSender.keyDown("e");
+        eventSender.keyDown("l");
+        eventSender.keyDown("l");
+        eventSender.keyDown("o");
+        document.execCommand("selectAll"); // Does selectAll for aligning the @autofocus attribute on the expectation.
+        layoutTestController.notifyDone();
+    }
+}
+</script>
+</head>
+<body _onload_="test()">
+    <input type="text" id="target" />
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (118710 => 118711)


--- trunk/Source/WebCore/ChangeLog	2012-05-28 22:49:16 UTC (rev 118710)
+++ trunk/Source/WebCore/ChangeLog	2012-05-28 23:52:47 UTC (rev 118711)
@@ -1,3 +1,32 @@
+2012-05-28  MORITA Hajime  <[email protected]>
+
+        Can't edit <input> elements with :first-letter
+        https://bugs.webkit.org/show_bug.cgi?id=87615
+
+        Reviewed by Kent Tamura.
+
+        A check using canHaveGeneratedChildren() should cover not only
+        button and menulist, but also RenderTextControl.
+        This change pulles canHaveGeneratedChildren() up
+        from RenderDeprecatedFlexibleBox to RenderObject,
+        and lets RenderTextControl override it.
+
+        Test: fast/forms/input-first-letter-edit.html
+
+        * rendering/RenderBlock.cpp:
+        (WebCore):
+        (WebCore::RenderBlock::styleDidChange):
+        (WebCore::RenderBlock::updateFirstLetter):
+        * rendering/RenderBlock.h: Removed a static function canHaveGeneratedChildren()
+        (RenderBlock):
+        * rendering/RenderDeprecatedFlexibleBox.h:
+        * rendering/RenderObject.cpp:
+        (WebCore):
+        (WebCore::RenderObject::canHaveGeneratedChildren): Added.
+        * rendering/RenderObject.h:
+        (RenderObject):
+        * rendering/RenderTextControl.h:
+
 2012-05-28  Arvid Nilsson  <[email protected]>
 
         [BlackBerry] Add support for layers with scale invariant size

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (118710 => 118711)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2012-05-28 22:49:16 UTC (rev 118710)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2012-05-28 23:52:47 UTC (rev 118711)
@@ -108,18 +108,6 @@
 static int gDelayUpdateScrollInfo = 0;
 static DelayedUpdateScrollInfoSet* gDelayedUpdateScrollInfoSet = 0;
 
-// We only create "generated" renderers like one for first-letter and
-// before/after pseudo elements if:
-// - the firstLetterBlock can have children in the DOM and
-// - the block doesn't have any special assumption on its text children.
-// This correctly prevents form controls from having such renderers.
-static inline bool canHaveGeneratedChildren(RenderObject* renderer)
-{
-    return (renderer->canHaveChildren()
-            && (!renderer->isDeprecatedFlexibleBox()
-                || static_cast<RenderDeprecatedFlexibleBox*>(renderer)->canHaveGeneratedChildren()));
-}
-
 bool RenderBlock::s_canPropagateFloatIntoSibling = false;
 
 // This class helps dispatching the 'overflow' event on layout change. overflow can be set on RenderBoxes, yet the existing code
@@ -340,7 +328,7 @@
     m_lineHeight = -1;
 
     // Update pseudos for :before and :after now.
-    if (!isAnonymous() && document()->usesBeforeAfterRules() && canHaveGeneratedChildren(this)) {
+    if (!isAnonymous() && document()->usesBeforeAfterRules() && canHaveGeneratedChildren()) {
         updateBeforeAfterContent(BEFORE);
         updateBeforeAfterContent(AFTER);
     }
@@ -6005,7 +5993,7 @@
     RenderObject* firstLetterBlock = start;
     while (true) {
         bool canHaveFirstLetterRenderer = firstLetterBlock->style()->hasPseudoStyle(FIRST_LETTER)
-            && canHaveGeneratedChildren(firstLetterBlock);
+            && firstLetterBlock->canHaveGeneratedChildren();
         if (canHaveFirstLetterRenderer)
             return firstLetterBlock;
 
@@ -6164,7 +6152,7 @@
             currChild = currChild->nextSibling();
         } else if (currChild->isReplaced() || currChild->isRenderButton() || currChild->isMenuList())
             break;
-        else if (currChild->style()->hasPseudoStyle(FIRST_LETTER) && canHaveGeneratedChildren(currChild))  {
+        else if (currChild->style()->hasPseudoStyle(FIRST_LETTER) && currChild->canHaveGeneratedChildren())  {
             // We found a lower-level node with first-letter, which supersedes the higher-level style
             firstLetterBlock = currChild;
             currChild = currChild->firstChild();

Modified: trunk/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h (118710 => 118711)


--- trunk/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h	2012-05-28 22:49:16 UTC (rev 118710)
+++ trunk/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h	2012-05-28 23:52:47 UTC (rev 118711)
@@ -49,7 +49,6 @@
     virtual bool isDeprecatedFlexibleBox() const { return true; }
     virtual bool isFlexingChildren() const { return m_flexingChildren; }
     virtual bool isStretchingChildren() const { return m_stretchingChildren; }
-    virtual bool canHaveGeneratedChildren() const { return true; }
 
     void placeChild(RenderBox* child, const LayoutPoint& location);
 

Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (118710 => 118711)


--- trunk/Source/WebCore/rendering/RenderObject.cpp	2012-05-28 22:49:16 UTC (rev 118710)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp	2012-05-28 23:52:47 UTC (rev 118711)
@@ -2900,6 +2900,15 @@
     return containingBlock ? !containingBlock->needsLayout() : true;
 }
 
+// We only create "generated" child renderers like one for first-letter if:
+// - the firstLetterBlock can have children in the DOM and
+// - the block doesn't have any special assumption on its text children.
+// This correctly prevents form controls from having such renderers.
+bool RenderObject::canHaveGeneratedChildren() const
+{
+    return canHaveChildren();
+}
+
 #if ENABLE(SVG)
 
 RenderSVGResourceContainer* RenderObject::toRenderSVGResourceContainer()

Modified: trunk/Source/WebCore/rendering/RenderObject.h (118710 => 118711)


--- trunk/Source/WebCore/rendering/RenderObject.h	2012-05-28 22:49:16 UTC (rev 118710)
+++ trunk/Source/WebCore/rendering/RenderObject.h	2012-05-28 23:52:47 UTC (rev 118711)
@@ -242,6 +242,7 @@
     // RenderObject tree manipulation
     //////////////////////////////////////////
     virtual bool canHaveChildren() const { return virtualChildren(); }
+    virtual bool canHaveGeneratedChildren() const;
     virtual bool isChildAllowed(RenderObject*, RenderStyle*) const { return true; }
     virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0);
     virtual void addChildIgnoringContinuation(RenderObject* newChild, RenderObject* beforeChild = 0) { return addChild(newChild, beforeChild); }

Modified: trunk/Source/WebCore/rendering/RenderTextControl.h (118710 => 118711)


--- trunk/Source/WebCore/rendering/RenderTextControl.h	2012-05-28 22:49:16 UTC (rev 118710)
+++ trunk/Source/WebCore/rendering/RenderTextControl.h	2012-05-28 23:52:47 UTC (rev 118711)
@@ -71,6 +71,7 @@
     virtual void computePreferredLogicalWidths();
     virtual void removeLeftoverAnonymousBlock(RenderBlock*) { }
     virtual bool avoidsFloats() const { return true; }
+    virtual bool canHaveGeneratedChildren() const OVERRIDE { return false; }
     
     virtual void addFocusRingRects(Vector<IntRect>&, const LayoutPoint&);
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to