Changeset 129086 in webkit


Ignore:
Timestamp:
Sep 19, 2012 7:07:27 PM (12 years ago)
Author:
shinyak@chromium.org
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):

Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r129084 r129086  
     12012-09-19  Shinya Kawanaka  <shinyak@chromium.org>
     2
     3        [Refactoring] ButtonInputType of <input> element should have innerElement to make <input> AuthorShadowDOM-ready
     4        https://bugs.webkit.org/show_bug.cgi?id=95939
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        We had 2 ways to show text in RenderButton. One is to use RenderButton::setText() and the other is to add renderer
     9        as a child of RenderButton. <input type="button"> used the former one, and <button> used the latter one.
     10        The former makes RenderButton a bit messy, and also prevents from making <input> AuthorShadowDOM ready.
     11
     12        So we remove RenderButton::setText() and refactor <input type="button"> to use a Shadow DOM to show text.
     13
     14        Since the text in <input type="button"> should create RenderTextFragment, we introduce TextForButtonInputType
     15        class. RenderText will allow us to select the inner text of <input>, but it should not.
     16
     17        No new tests, existing tests should cover the change.
     18
     19        * html/BaseButtonInputType.cpp:
     20        (TextForButtonInputType): Special Text node which creates RenderTextFragment.
     21        (WebCore):
     22        (WebCore::TextForButtonInputType::create):
     23        (WebCore::TextForButtonInputType::TextForButtonInputType):
     24        (WebCore::TextForButtonInputType::createRenderer):
     25        (WebCore::BaseButtonInputType::BaseButtonInputType):
     26        (WebCore::BaseButtonInputType::createShadowSubtree):
     27        (WebCore::BaseButtonInputType::destroyShadowSubtree):
     28        (WebCore::BaseButtonInputType::valueAttributeChanged): When a button value is changed, we reflect the value to
     29        the text node in ShadowDOM.
     30        * html/BaseButtonInputType.h:
     31        (BaseButtonInputType):
     32        * html/FileInputType.cpp:
     33        (WebCore::UploadButtonElement::create): Creates Shadow DOM subtree.
     34        (WebCore::UploadButtonElement::createForMultiple): Creates Shadow DOM subtree.
     35        * html/HTMLInputElement.cpp:
     36        (WebCore::HTMLInputElement::parseAttribute):
     37        * html/InputType.cpp:
     38        (WebCore::InputType::valueAttributeChanged):
     39        (WebCore):
     40        * html/InputType.h:
     41        (InputType):
     42        * rendering/RenderButton.cpp:
     43        (WebCore::RenderButton::RenderButton):
     44        (WebCore::RenderButton::styleDidChange): Removed unnecessary text related code.
     45        * rendering/RenderButton.h:
     46        (RenderButton):
     47
    1482012-09-19  Jason Liu  <jason.liu@torchmobile.com.cn>
    249
  • trunk/Source/WebCore/html/BaseButtonInputType.cpp

    r122414 r129086  
    3737#include "KeyboardEvent.h"
    3838#include "RenderButton.h"
     39#include "RenderTextFragment.h"
     40#include "ShadowRoot.h"
     41#include "Text.h"
    3942
    4043namespace WebCore {
    4144
    4245using namespace HTMLNames;
     46
     47class TextForButtonInputType : public Text {
     48public:
     49    static PassRefPtr<TextForButtonInputType> create(Document*, const String&);
     50
     51private:
     52    TextForButtonInputType(Document*, const String&);
     53    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) OVERRIDE;
     54};
     55
     56PassRefPtr<TextForButtonInputType> TextForButtonInputType::create(Document* document, const String& data)
     57{
     58    return adoptRef(new TextForButtonInputType(document, data));
     59}
     60
     61TextForButtonInputType::TextForButtonInputType(Document* document, const String& data)
     62    : Text(document, data)
     63{
     64}
     65
     66RenderObject* TextForButtonInputType::createRenderer(RenderArena* arena, RenderStyle*)
     67{
     68    return new (arena) RenderTextFragment(document(), dataImpl());
     69}
     70
     71BaseButtonInputType::BaseButtonInputType(HTMLInputElement* element)
     72    : BaseClickableWithKeyInputType(element)
     73{
     74}
     75
     76void BaseButtonInputType::createShadowSubtree()
     77{
     78    ASSERT(element()->userAgentShadowRoot());
     79
     80    RefPtr<TextForButtonInputType> text = TextForButtonInputType::create(element()->document(), defaultValue());
     81    element()->userAgentShadowRoot()->appendChild(text);
     82}
     83
     84void BaseButtonInputType::destroyShadowSubtree()
     85{
     86    InputType::destroyShadowSubtree();
     87}
     88
     89void BaseButtonInputType::valueAttributeChanged()
     90{
     91    String value = element()->valueWithDefault();
     92    toText(element()->userAgentShadowRoot()->firstChild())->setData(value, ASSERT_NO_EXCEPTION);
     93}
    4394
    4495bool BaseButtonInputType::shouldSaveAndRestoreFormControlState() const
  • trunk/Source/WebCore/html/BaseButtonInputType.h

    r122414 r129086  
    3939class BaseButtonInputType : public BaseClickableWithKeyInputType {
    4040protected:
    41     BaseButtonInputType(HTMLInputElement* element) : BaseClickableWithKeyInputType(element) { }
     41    BaseButtonInputType(HTMLInputElement*);
    4242
    4343private:
     44    virtual void createShadowSubtree() OVERRIDE;
     45    virtual void destroyShadowSubtree() OVERRIDE;
     46
     47    virtual void valueAttributeChanged() OVERRIDE;
     48
    4449    virtual bool shouldSaveAndRestoreFormControlState() const OVERRIDE;
    4550    virtual bool appendFormData(FormDataList&, bool) const OVERRIDE;
  • trunk/Source/WebCore/html/FileInputType.cpp

    r128149 r129086  
    6363{
    6464    RefPtr<UploadButtonElement> button = adoptRef(new UploadButtonElement(document));
     65    button->createShadowSubtree();
    6566    button->setType("button");
    6667    button->setValue(fileButtonChooseFileLabel());
     
    7172{
    7273    RefPtr<UploadButtonElement> button = adoptRef(new UploadButtonElement(document));
     74    button->createShadowSubtree();
    7375    button->setType("button");
    7476    button->setValue(fileButtonChooseMultipleFilesLabel());
  • trunk/Source/WebCore/html/HTMLInputElement.cpp

    r128572 r129086  
    678678            setNeedsStyleRecalc();
    679679        }
     680        m_inputType->valueAttributeChanged();
    680681        setFormControlValueMatchesRenderer(false);
    681682        setNeedsValidityCheck();
  • trunk/Source/WebCore/html/InputType.cpp

    r128149 r129086  
    890890}
    891891
     892void InputType::valueAttributeChanged()
     893{
     894}
     895
    892896void InputType::multipleAttributeChanged()
    893897{
  • trunk/Source/WebCore/html/InputType.h

    r128149 r129086  
    279279    virtual void updateInnerTextValue();
    280280    virtual void updatePlaceholderText();
     281    virtual void valueAttributeChanged();
    281282    virtual void multipleAttributeChanged();
    282283    virtual void disabledAttributeChanged();
  • trunk/Source/WebCore/rendering/RenderButton.cpp

    r126359 r129086  
    3636RenderButton::RenderButton(Node* node)
    3737    : RenderDeprecatedFlexibleBox(node)
    38     , m_buttonText(0)
    3938    , m_inner(0)
    4039    , m_default(false)
     
    8483    RenderBlock::styleDidChange(diff, oldStyle);
    8584
    86     if (m_buttonText)
    87         m_buttonText->setStyle(style());
    8885    if (m_inner) // RenderBlock handled updating the anonymous block's style.
    8986        setupInnerStyle(m_inner->style());
     
    107104    innerStyle->setBoxFlex(1.0f);
    108105    innerStyle->setBoxOrient(style()->boxOrient());
    109 }
    110 
    111 void RenderButton::updateFromElement()
    112 {
    113     // If we're an input element, we may need to change our button text.
    114     if (node()->hasTagName(inputTag)) {
    115         HTMLInputElement* input = static_cast<HTMLInputElement*>(node());
    116         String value = input->valueWithDefault();
    117         setText(value);
    118     }
    119 }
    120 
    121 void RenderButton::setText(const String& str)
    122 {
    123     if (str.isEmpty()) {
    124         if (m_buttonText) {
    125             m_buttonText->destroy();
    126             m_buttonText = 0;
    127         }
    128     } else {
    129         if (m_buttonText)
    130             m_buttonText->setText(str.impl());
    131         else {
    132             m_buttonText = new (renderArena()) RenderTextFragment(document(), str.impl());
    133             m_buttonText->setStyle(style());
    134             addChild(m_buttonText);
    135         }
    136     }
    137 }
    138 
    139 String RenderButton::text() const
    140 {
    141     return m_buttonText ? m_buttonText->text() : 0;
    142106}
    143107
  • trunk/Source/WebCore/rendering/RenderButton.h

    r111946 r129086  
    4949
    5050    void setupInnerStyle(RenderStyle*);
    51     virtual void updateFromElement();
    5251
    5352    virtual void updateBeforeAfterContent(PseudoId);
     
    5655    virtual bool hasControlClip() const { return true; }
    5756    virtual LayoutRect controlClipRect(const LayoutPoint&) const;
    58 
    59     void setText(const String&);
    60     String text() const;
    6157
    6258private:
     
    7066    void timerFired(Timer<RenderButton>*);
    7167
    72     RenderTextFragment* m_buttonText;
    7368    RenderBlock* m_inner;
    74 
    7569    OwnPtr<Timer<RenderButton> > m_timer;
    7670    bool m_default;
Note: See TracChangeset for help on using the changeset viewer.