- 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;
};