Title: [129086] trunk/Source/WebCore
Revision
129086
Author
[email protected]
Date
2012-09-19 19:07:27 -0700 (Wed, 19 Sep 2012)

Log Message

[Refactoring] ButtonInputType of <input> element should have innerElement to make <input> AuthorShadowDOM-ready
https://bugs.webkit.org/show_bug.cgi?id=95939

Reviewed by Dimitri Glazkov.

We had 2 ways to show text in RenderButton. One is to use RenderButton::setText() and the other is to add renderer
as a child of RenderButton. <input type="button"> used the former one, and <button> used the latter one.
The former makes RenderButton a bit messy, and also prevents from making <input> AuthorShadowDOM ready.

So we remove RenderButton::setText() and refactor <input type="button"> to use a Shadow DOM to show text.

Since the text in <input type="button"> should create RenderTextFragment, we introduce TextForButtonInputType
class. RenderText will allow us to select the inner text of <input>, but it should not.

No new tests, existing tests should cover the change.

* html/BaseButtonInputType.cpp:
(TextForButtonInputType): Special Text node which creates RenderTextFragment.
(WebCore):
(WebCore::TextForButtonInputType::create):
(WebCore::TextForButtonInputType::TextForButtonInputType):
(WebCore::TextForButtonInputType::createRenderer):
(WebCore::BaseButtonInputType::BaseButtonInputType):
(WebCore::BaseButtonInputType::createShadowSubtree):
(WebCore::BaseButtonInputType::destroyShadowSubtree):
(WebCore::BaseButtonInputType::valueAttributeChanged): When a button value is changed, we reflect the value to
the text node in ShadowDOM.
* html/BaseButtonInputType.h:
(BaseButtonInputType):
* html/FileInputType.cpp:
(WebCore::UploadButtonElement::create): Creates Shadow DOM subtree.
(WebCore::UploadButtonElement::createForMultiple): Creates Shadow DOM subtree.
* html/HTMLInputElement.cpp:
(WebCore::HTMLInputElement::parseAttribute):
* html/InputType.cpp:
(WebCore::InputType::valueAttributeChanged):
(WebCore):
* html/InputType.h:
(InputType):
* rendering/RenderButton.cpp:
(WebCore::RenderButton::RenderButton):
(WebCore::RenderButton::styleDidChange): Removed unnecessary text related code.
* rendering/RenderButton.h:
(RenderButton):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (129085 => 129086)


--- trunk/Source/WebCore/ChangeLog	2012-09-20 02:05:09 UTC (rev 129085)
+++ trunk/Source/WebCore/ChangeLog	2012-09-20 02:07:27 UTC (rev 129086)
@@ -1,3 +1,50 @@
+2012-09-19  Shinya Kawanaka  <[email protected]>
+
+        [Refactoring] ButtonInputType of <input> element should have innerElement to make <input> AuthorShadowDOM-ready
+        https://bugs.webkit.org/show_bug.cgi?id=95939
+
+        Reviewed by Dimitri Glazkov.
+
+        We had 2 ways to show text in RenderButton. One is to use RenderButton::setText() and the other is to add renderer
+        as a child of RenderButton. <input type="button"> used the former one, and <button> used the latter one.
+        The former makes RenderButton a bit messy, and also prevents from making <input> AuthorShadowDOM ready.
+
+        So we remove RenderButton::setText() and refactor <input type="button"> to use a Shadow DOM to show text.
+
+        Since the text in <input type="button"> should create RenderTextFragment, we introduce TextForButtonInputType
+        class. RenderText will allow us to select the inner text of <input>, but it should not.
+
+        No new tests, existing tests should cover the change.
+
+        * html/BaseButtonInputType.cpp:
+        (TextForButtonInputType): Special Text node which creates RenderTextFragment.
+        (WebCore):
+        (WebCore::TextForButtonInputType::create):
+        (WebCore::TextForButtonInputType::TextForButtonInputType):
+        (WebCore::TextForButtonInputType::createRenderer):
+        (WebCore::BaseButtonInputType::BaseButtonInputType):
+        (WebCore::BaseButtonInputType::createShadowSubtree):
+        (WebCore::BaseButtonInputType::destroyShadowSubtree):
+        (WebCore::BaseButtonInputType::valueAttributeChanged): When a button value is changed, we reflect the value to
+        the text node in ShadowDOM.
+        * html/BaseButtonInputType.h:
+        (BaseButtonInputType):
+        * html/FileInputType.cpp:
+        (WebCore::UploadButtonElement::create): Creates Shadow DOM subtree.
+        (WebCore::UploadButtonElement::createForMultiple): Creates Shadow DOM subtree.
+        * html/HTMLInputElement.cpp:
+        (WebCore::HTMLInputElement::parseAttribute):
+        * html/InputType.cpp:
+        (WebCore::InputType::valueAttributeChanged):
+        (WebCore):
+        * html/InputType.h:
+        (InputType):
+        * rendering/RenderButton.cpp:
+        (WebCore::RenderButton::RenderButton):
+        (WebCore::RenderButton::styleDidChange): Removed unnecessary text related code.
+        * rendering/RenderButton.h:
+        (RenderButton):
+
 2012-09-19  Jason Liu  <[email protected]>
 
         [BlackBerry] Get infinite amount of requests after attempting re-authentication basic.

Modified: trunk/Source/WebCore/html/BaseButtonInputType.cpp (129085 => 129086)


--- trunk/Source/WebCore/html/BaseButtonInputType.cpp	2012-09-20 02:05:09 UTC (rev 129085)
+++ trunk/Source/WebCore/html/BaseButtonInputType.cpp	2012-09-20 02:07:27 UTC (rev 129086)
@@ -36,11 +36,62 @@
 #include "HTMLNames.h"
 #include "KeyboardEvent.h"
 #include "RenderButton.h"
+#include "RenderTextFragment.h"
+#include "ShadowRoot.h"
+#include "Text.h"
 
 namespace WebCore {
 
 using namespace HTMLNames;
 
+class TextForButtonInputType : public Text {
+public:
+    static PassRefPtr<TextForButtonInputType> create(Document*, const String&);
+
+private:
+    TextForButtonInputType(Document*, const String&);
+    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) OVERRIDE;
+};
+
+PassRefPtr<TextForButtonInputType> TextForButtonInputType::create(Document* document, const String& data)
+{
+    return adoptRef(new TextForButtonInputType(document, data));
+}
+
+TextForButtonInputType::TextForButtonInputType(Document* document, const String& data)
+    : Text(document, data)
+{
+}
+
+RenderObject* TextForButtonInputType::createRenderer(RenderArena* arena, RenderStyle*)
+{
+    return new (arena) RenderTextFragment(document(), dataImpl());
+}
+
+BaseButtonInputType::BaseButtonInputType(HTMLInputElement* element)
+    : BaseClickableWithKeyInputType(element)
+{
+}
+
+void BaseButtonInputType::createShadowSubtree()
+{
+    ASSERT(element()->userAgentShadowRoot());
+
+    RefPtr<TextForButtonInputType> text = TextForButtonInputType::create(element()->document(), defaultValue());
+    element()->userAgentShadowRoot()->appendChild(text);
+}
+
+void BaseButtonInputType::destroyShadowSubtree()
+{
+    InputType::destroyShadowSubtree();
+}
+
+void BaseButtonInputType::valueAttributeChanged()
+{
+    String value = element()->valueWithDefault();
+    toText(element()->userAgentShadowRoot()->firstChild())->setData(value, ASSERT_NO_EXCEPTION);
+}
+
 bool BaseButtonInputType::shouldSaveAndRestoreFormControlState() const
 {
     return false;

Modified: trunk/Source/WebCore/html/BaseButtonInputType.h (129085 => 129086)


--- trunk/Source/WebCore/html/BaseButtonInputType.h	2012-09-20 02:05:09 UTC (rev 129085)
+++ trunk/Source/WebCore/html/BaseButtonInputType.h	2012-09-20 02:07:27 UTC (rev 129086)
@@ -38,9 +38,14 @@
 // Base of button, file, image, reset, and submit types.
 class BaseButtonInputType : public BaseClickableWithKeyInputType {
 protected:
-    BaseButtonInputType(HTMLInputElement* element) : BaseClickableWithKeyInputType(element) { }
+    BaseButtonInputType(HTMLInputElement*);
 
 private:
+    virtual void createShadowSubtree() OVERRIDE;
+    virtual void destroyShadowSubtree() OVERRIDE;
+
+    virtual void valueAttributeChanged() OVERRIDE;
+
     virtual bool shouldSaveAndRestoreFormControlState() const OVERRIDE;
     virtual bool appendFormData(FormDataList&, bool) const OVERRIDE;
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) const OVERRIDE;

Modified: trunk/Source/WebCore/html/FileInputType.cpp (129085 => 129086)


--- trunk/Source/WebCore/html/FileInputType.cpp	2012-09-20 02:05:09 UTC (rev 129085)
+++ trunk/Source/WebCore/html/FileInputType.cpp	2012-09-20 02:07:27 UTC (rev 129086)
@@ -62,6 +62,7 @@
 PassRefPtr<UploadButtonElement> UploadButtonElement::create(Document* document)
 {
     RefPtr<UploadButtonElement> button = adoptRef(new UploadButtonElement(document));
+    button->createShadowSubtree();
     button->setType("button");
     button->setValue(fileButtonChooseFileLabel());
     return button.release();
@@ -70,6 +71,7 @@
 PassRefPtr<UploadButtonElement> UploadButtonElement::createForMultiple(Document* document)
 {
     RefPtr<UploadButtonElement> button = adoptRef(new UploadButtonElement(document));
+    button->createShadowSubtree();
     button->setType("button");
     button->setValue(fileButtonChooseMultipleFilesLabel());
     return button.release();

Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (129085 => 129086)


--- trunk/Source/WebCore/html/HTMLInputElement.cpp	2012-09-20 02:05:09 UTC (rev 129085)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp	2012-09-20 02:07:27 UTC (rev 129086)
@@ -677,6 +677,7 @@
             updatePlaceholderVisibility(false);
             setNeedsStyleRecalc();
         }
+        m_inputType->valueAttributeChanged();
         setFormControlValueMatchesRenderer(false);
         setNeedsValidityCheck();
         m_valueAttributeWasUpdatedAfterParsing = !m_parsingInProgress;

Modified: trunk/Source/WebCore/html/InputType.cpp (129085 => 129086)


--- trunk/Source/WebCore/html/InputType.cpp	2012-09-20 02:05:09 UTC (rev 129085)
+++ trunk/Source/WebCore/html/InputType.cpp	2012-09-20 02:07:27 UTC (rev 129086)
@@ -889,6 +889,10 @@
 {
 }
 
+void InputType::valueAttributeChanged()
+{
+}
+
 void InputType::multipleAttributeChanged()
 {
 }

Modified: trunk/Source/WebCore/html/InputType.h (129085 => 129086)


--- trunk/Source/WebCore/html/InputType.h	2012-09-20 02:05:09 UTC (rev 129085)
+++ trunk/Source/WebCore/html/InputType.h	2012-09-20 02:07:27 UTC (rev 129086)
@@ -278,6 +278,7 @@
     virtual String fixedPlaceholder();
     virtual void updateInnerTextValue();
     virtual void updatePlaceholderText();
+    virtual void valueAttributeChanged();
     virtual void multipleAttributeChanged();
     virtual void disabledAttributeChanged();
     virtual void readonlyAttributeChanged();

Modified: trunk/Source/WebCore/rendering/RenderButton.cpp (129085 => 129086)


--- trunk/Source/WebCore/rendering/RenderButton.cpp	2012-09-20 02:05:09 UTC (rev 129085)
+++ trunk/Source/WebCore/rendering/RenderButton.cpp	2012-09-20 02:07:27 UTC (rev 129086)
@@ -35,7 +35,6 @@
 
 RenderButton::RenderButton(Node* node)
     : RenderDeprecatedFlexibleBox(node)
-    , m_buttonText(0)
     , m_inner(0)
     , m_default(false)
 {
@@ -83,8 +82,6 @@
 {
     RenderBlock::styleDidChange(diff, oldStyle);
 
-    if (m_buttonText)
-        m_buttonText->setStyle(style());
     if (m_inner) // RenderBlock handled updating the anonymous block's style.
         setupInnerStyle(m_inner->style());
 
@@ -108,39 +105,6 @@
     innerStyle->setBoxOrient(style()->boxOrient());
 }
 
-void RenderButton::updateFromElement()
-{
-    // If we're an input element, we may need to change our button text.
-    if (node()->hasTagName(inputTag)) {
-        HTMLInputElement* input = static_cast<HTMLInputElement*>(node());
-        String value = input->valueWithDefault();
-        setText(value);
-    }
-}
-
-void RenderButton::setText(const String& str)
-{
-    if (str.isEmpty()) {
-        if (m_buttonText) {
-            m_buttonText->destroy();
-            m_buttonText = 0;
-        }
-    } else {
-        if (m_buttonText)
-            m_buttonText->setText(str.impl());
-        else {
-            m_buttonText = new (renderArena()) RenderTextFragment(document(), str.impl());
-            m_buttonText->setStyle(style());
-            addChild(m_buttonText);
-        }
-    }
-}
-
-String RenderButton::text() const
-{
-    return m_buttonText ? m_buttonText->text() : 0;
-}
-
 bool RenderButton::canHaveGeneratedChildren() const
 {
     // Input elements can't have generated children, but button elements can. We'll

Modified: trunk/Source/WebCore/rendering/RenderButton.h (129085 => 129086)


--- trunk/Source/WebCore/rendering/RenderButton.h	2012-09-20 02:05:09 UTC (rev 129085)
+++ trunk/Source/WebCore/rendering/RenderButton.h	2012-09-20 02:07:27 UTC (rev 129086)
@@ -48,7 +48,6 @@
     virtual bool createsAnonymousWrapper() const { return true; }
 
     void setupInnerStyle(RenderStyle*);
-    virtual void updateFromElement();
 
     virtual void updateBeforeAfterContent(PseudoId);
 
@@ -56,9 +55,6 @@
     virtual bool hasControlClip() const { return true; }
     virtual LayoutRect controlClipRect(const LayoutPoint&) const;
 
-    void setText(const String&);
-    String text() const;
-
 private:
     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
@@ -69,9 +65,7 @@
 
     void timerFired(Timer<RenderButton>*);
 
-    RenderTextFragment* m_buttonText;
     RenderBlock* m_inner;
-
     OwnPtr<Timer<RenderButton> > m_timer;
     bool m_default;
 };
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to