Diff
Modified: trunk/Source/WebCore/ChangeLog (94046 => 94047)
--- trunk/Source/WebCore/ChangeLog 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/ChangeLog 2011-08-30 05:51:19 UTC (rev 94047)
@@ -1,3 +1,48 @@
+2011-08-29 Ryosuke Niwa <[email protected]>
+
+ Move setInnerTextValue from RenderTextControl to HTMLTextFormControlElement
+ https://bugs.webkit.org/show_bug.cgi?id=67152
+
+ Reviewed by Darin Adler.
+
+ Moved setInnerTextValue from RenderTextControl to HTMLTextFormControlElement.
+
+ Also moved m_lastChangeWasUserEdit from RenderTextControl to HTMLTextFormControlElement
+ and related inline functions from RenderTextControl to HTMLTextFormControlElement.
+ Because m_lastChangeWasUserEdit is no longer reset when RenderTextControl is recreated,
+ added explicit calls to setLastChangeWasNotUserEdit in setValue functions of HTMLInputElement
+ and HTMLTextAreaElement.
+
+ This patch also fixes the bug that lastChangeWasUserEdit() incorrectly returns false
+ when input or textarea don't have renderer (e.g. invisible).
+
+ Unfortunately, there is no way to test this behavioral change from layout tests.
+
+ * WebCore.exp.in: Exports lastChangeWasUserEdit in HTMLTextFormControlElement instead of
+ that of HTMLInputElement and HTMLTextAreaElement.
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::setValue): Explicitly calls setLastChangeWasNotUserEdit.
+ * html/HTMLInputElement.h:
+ * html/HTMLTextAreaElement.cpp:
+ (WebCore::HTMLTextAreaElement::setValueCommon): Ditto.
+ * html/HTMLTextAreaElement.h:
+ * html/HTMLTextFormControlElement.cpp:
+ (WebCore::HTMLTextFormControlElement::HTMLTextFormControlElement):
+ (WebCore::HTMLTextFormControlElement::subtreeHasChanged): Sets m_lastChangeWasUserEdit true
+ as it used to do via respondToChangeByUser.
+ (WebCore::HTMLTextFormControlElement::lastChangeWasUserEdit): Moved from HTMLInputElement
+ and HTMLTextAreaElement.
+ (WebCore::HTMLTextFormControlElement::setInnerTextValue): Moved from RenderTextControl.
+ * html/HTMLTextFormControlElement.h:
+ (WebCore::HTMLTextFormControlElement::setLastChangeWasNotUserEdit): Added.
+ * rendering/RenderTextControl.cpp:
+ (WebCore::RenderTextControl::RenderTextControl): No longer initializes m_lastChangeWasUserEdit.
+ * rendering/RenderTextControl.h:
+ * rendering/RenderTextControlSingleLine.cpp:
+ (WebCore::RenderTextControlSingleLine::updateFromElement): Calls setInnerTextValue.
+ * rendering/RenderTextControlMultiLine.cpp:
+ (WebCore::RenderTextControlMultiLine::updateFromElement): Ditto.
+
2011-08-25 Kent Tamura <[email protected]>
REGRESSION(r88115): Disabling a file upload control causes an endless busyloop.
Modified: trunk/Source/WebCore/WebCore.exp.in (94046 => 94047)
--- trunk/Source/WebCore/WebCore.exp.in 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/WebCore.exp.in 2011-08-30 05:51:19 UTC (rev 94047)
@@ -1182,7 +1182,6 @@
__ZNK7WebCore16HTMLInputElement11isTextFieldEv
__ZNK7WebCore16HTMLInputElement15isPasswordFieldEv
__ZNK7WebCore16HTMLInputElement18shouldAutocompleteEv
-__ZNK7WebCore16HTMLInputElement21lastChangeWasUserEditEv
__ZNK7WebCore16IconDatabaseBase12databasePathEv
__ZNK7WebCore16ResourceResponse13nsURLResponseEv
__ZNK7WebCore16VisibleSelection17isContentEditableEv
@@ -1192,7 +1191,6 @@
__ZNK7WebCore16VisibleSelection5isAllENS_27EditingBoundaryCrossingRuleE
__ZNK7WebCore17ResourceErrorBase8lazyInitEv
__ZNK7WebCore19AnimationController24numberOfActiveAnimationsEPNS_8DocumentE
-__ZNK7WebCore19HTMLTextAreaElement21lastChangeWasUserEditEv
__ZNK7WebCore19ResourceRequestBase10httpMethodEv
__ZNK7WebCore19ResourceRequestBase15httpHeaderFieldEPKc
__ZNK7WebCore19ResourceRequestBase3urlEv
@@ -1217,6 +1215,7 @@
__ZNK7WebCore23AuthenticationChallenge20authenticationClientEv
__ZNK7WebCore23FrameLoaderStateMachine15firstLayoutDoneEv
__ZNK7WebCore23FrameLoaderStateMachine23committingFirstRealLoadEv
+__ZNK7WebCore26HTMLTextFormControlElement21lastChangeWasUserEditEv
__ZNK7WebCore26NetscapePlugInStreamLoader6isDoneEv
__ZNK7WebCore27AuthenticationChallengeBase15failureResponseEv
__ZNK7WebCore27AuthenticationChallengeBase15protectionSpaceEv
Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (94046 => 94047)
--- trunk/Source/WebCore/html/HTMLInputElement.cpp 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp 2011-08-30 05:51:19 UTC (rev 94047)
@@ -206,17 +206,6 @@
}
}
-bool HTMLInputElement::lastChangeWasUserEdit() const
-{
- if (!isTextField())
- return false;
-
- if (!renderer())
- return false;
-
- return toRenderTextControl(renderer())->lastChangeWasUserEdit();
-}
-
bool HTMLInputElement::isValidValue(const String& value) const
{
if (!m_inputType->canSetStringValue()) {
@@ -1068,6 +1057,7 @@
String sanitizedValue = sanitizeValue(value);
bool valueChanged = sanitizedValue != this->value();
+ setLastChangeWasNotUserEdit();
setFormControlValueMatchesRenderer(false);
if (m_inputType->storesValueSeparateFromAttribute()) {
if (files())
Modified: trunk/Source/WebCore/html/HTMLInputElement.h (94046 => 94047)
--- trunk/Source/WebCore/html/HTMLInputElement.h 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/html/HTMLInputElement.h 2011-08-30 05:51:19 UTC (rev 94047)
@@ -228,8 +228,6 @@
bool isConformToInputMask(const String&) const;
#endif
- bool lastChangeWasUserEdit() const;
-
static const int maximumLength;
protected:
Modified: trunk/Source/WebCore/html/HTMLTextAreaElement.cpp (94046 => 94047)
--- trunk/Source/WebCore/html/HTMLTextAreaElement.cpp 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/html/HTMLTextAreaElement.cpp 2011-08-30 05:51:19 UTC (rev 94047)
@@ -333,6 +333,7 @@
return;
m_value = normalizedValue;
+ setLastChangeWasNotUserEdit();
updatePlaceholderVisibility(false);
setNeedsStyleRecalc();
setFormControlValueMatchesRenderer(true);
@@ -433,13 +434,6 @@
setAttribute(rowsAttr, String::number(rows));
}
-bool HTMLTextAreaElement::lastChangeWasUserEdit() const
-{
- if (!renderer())
- return false;
- return toRenderTextControl(renderer())->lastChangeWasUserEdit();
-}
-
bool HTMLTextAreaElement::shouldUseInputMethod()
{
return true;
Modified: trunk/Source/WebCore/html/HTMLTextAreaElement.h (94046 => 94047)
--- trunk/Source/WebCore/html/HTMLTextAreaElement.h 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/html/HTMLTextAreaElement.h 2011-08-30 05:51:19 UTC (rev 94047)
@@ -58,8 +58,6 @@
void setCols(int);
void setRows(int);
- bool lastChangeWasUserEdit() const;
-
private:
HTMLTextAreaElement(const QualifiedName&, Document*, HTMLFormElement*);
Modified: trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp (94046 => 94047)
--- trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp 2011-08-30 05:51:19 UTC (rev 94047)
@@ -25,6 +25,7 @@
#include "config.h"
#include "HTMLTextFormControlElement.h"
+#include "AXObjectCache.h"
#include "Attribute.h"
#include "Chrome.h"
#include "ChromeClient.h"
@@ -32,6 +33,7 @@
#include "Event.h"
#include "EventNames.h"
#include "Frame.h"
+#include "HTMLBRElement.h"
#include "HTMLFormElement.h"
#include "HTMLInputElement.h"
#include "HTMLNames.h"
@@ -50,6 +52,7 @@
HTMLTextFormControlElement::HTMLTextFormControlElement(const QualifiedName& tagName, Document* doc, HTMLFormElement* form)
: HTMLFormControlElementWithState(tagName, doc, form)
+ , m_lastChangeWasUserEdit(false)
, m_cachedSelectionStart(-1)
, m_cachedSelectionEnd(-1)
, m_cachedSelectionDirection(SelectionHasNoDirection)
@@ -102,7 +105,7 @@
void HTMLTextFormControlElement::subtreeHasChanged()
{
- toRenderTextControl(renderer())->respondToChangeByUser();
+ m_lastChangeWasUserEdit = true;
}
String HTMLTextFormControlElement::strippedPlaceholder() const
@@ -441,11 +444,45 @@
Frame* frame = document()->frame();
if (!frame)
return;
-
+
if (Page* page = frame->page())
page->chrome()->client()->formStateDidChange(this);
}
+bool HTMLTextFormControlElement::lastChangeWasUserEdit() const
+{
+ if (!isTextFormControl())
+ return false;
+ return m_lastChangeWasUserEdit;
+}
+
+void HTMLTextFormControlElement::setInnerTextValue(const String& value)
+{
+ if (!renderer() || !isTextFormControl())
+ return;
+
+ RenderTextControl* textControl = toRenderTextControl(renderer());
+ bool textIsChanged = value != textControl->text();
+ if (textIsChanged || !innerTextElement()->hasChildNodes()) {
+ if (textIsChanged && document() && AXObjectCache::accessibilityEnabled())
+ document()->axObjectCache()->postNotification(textControl, AXObjectCache::AXValueChanged, false);
+
+ ExceptionCode ec = 0;
+ innerTextElement()->setInnerText(value, ec);
+ ASSERT(!ec);
+
+ if (value.endsWith("\n") || value.endsWith("\r")) {
+ innerTextElement()->appendChild(HTMLBRElement::create(document()), ec);
+ ASSERT(!ec);
+ }
+
+ // We set m_lastChangeWasUserEdit to false since this change was not explicitly made by the user (say, via typing on the keyboard), see <rdar://problem/5359921>.
+ m_lastChangeWasUserEdit = false;
+ }
+
+ setFormControlValueMatchesRenderer(true);
+}
+
HTMLTextFormControlElement* enclosingTextFormControl(const Position& position)
{
ASSERT(position.isNull() || position.anchorType() == Position::PositionIsOffsetInAnchor
Modified: trunk/Source/WebCore/html/HTMLTextFormControlElement.h (94046 => 94047)
--- trunk/Source/WebCore/html/HTMLTextFormControlElement.h 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/html/HTMLTextFormControlElement.h 2011-08-30 05:51:19 UTC (rev 94047)
@@ -75,6 +75,8 @@
void selectionChanged(bool userTriggered);
void notifyFormStateChanged();
+ bool lastChangeWasUserEdit() const;
+ void setInnerTextValue(const String&);
protected:
HTMLTextFormControlElement(const QualifiedName&, Document*, HTMLFormElement*);
@@ -97,6 +99,7 @@
virtual void defaultEventHandler(Event*);
virtual void subtreeHasChanged();
+ void setLastChangeWasNotUserEdit() { m_lastChangeWasUserEdit = false; }
private:
int computeSelectionStart() const;
int computeSelectionEnd() const;
@@ -119,6 +122,7 @@
RenderTextControl* textRendererAfterUpdateLayout();
String m_textAsOfLastFormControlChangeEvent;
+ bool m_lastChangeWasUserEdit;
int m_cachedSelectionStart;
int m_cachedSelectionEnd;
Modified: trunk/Source/WebCore/rendering/RenderTextControl.cpp (94046 => 94047)
--- trunk/Source/WebCore/rendering/RenderTextControl.cpp 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/rendering/RenderTextControl.cpp 2011-08-30 05:51:19 UTC (rev 94047)
@@ -22,7 +22,6 @@
#include "config.h"
#include "RenderTextControl.h"
-#include "AXObjectCache.h"
#include "Editor.h"
#include "Frame.h"
#include "HTMLBRElement.h"
@@ -68,7 +67,6 @@
RenderTextControl::RenderTextControl(Node* node)
: RenderBlock(node)
- , m_lastChangeWasUserEdit(false)
{
ASSERT(toTextFormControl(node));
}
@@ -151,29 +149,6 @@
updateUserModifyProperty(node(), innerText->renderer()->style());
}
-void RenderTextControl::setInnerTextValue(const String& value)
-{
- bool textIsChanged = value != text();
- if (textIsChanged || !innerTextElement()->hasChildNodes()) {
- if (textIsChanged && document() && AXObjectCache::accessibilityEnabled())
- document()->axObjectCache()->postNotification(this, AXObjectCache::AXValueChanged, false);
-
- ExceptionCode ec = 0;
- innerTextElement()->setInnerText(value, ec);
- ASSERT(!ec);
-
- if (value.endsWith("\n") || value.endsWith("\r")) {
- innerTextElement()->appendChild(HTMLBRElement::create(document()), ec);
- ASSERT(!ec);
- }
-
- // We set m_lastChangeWasUserEdit to false since this change was not explicitly made by the user (say, via typing on the keyboard), see <rdar://problem/5359921>.
- m_lastChangeWasUserEdit = false;
- }
-
- textFormControlElement()->setFormControlValueMatchesRenderer(true);
-}
-
VisiblePosition RenderTextControl::visiblePositionForIndex(int index) const
{
if (index <= 0)
Modified: trunk/Source/WebCore/rendering/RenderTextControl.h (94046 => 94047)
--- trunk/Source/WebCore/rendering/RenderTextControl.h 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/rendering/RenderTextControl.h 2011-08-30 05:51:19 UTC (rev 94047)
@@ -35,8 +35,6 @@
HTMLTextFormControlElement* textFormControlElement() const;
virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const = 0;
- bool lastChangeWasUserEdit() const { return m_lastChangeWasUserEdit; }
- void respondToChangeByUser() { m_lastChangeWasUserEdit = true; }
String text();
String textWithHardLineBreaks();
@@ -50,7 +48,6 @@
int scrollbarThickness() const;
void adjustInnerTextStyle(const RenderStyle* startStyle, RenderStyle* textBlockStyle) const;
- void setInnerTextValue(const String&);
virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
@@ -88,8 +85,6 @@
virtual bool requiresForcedStyleRecalcPropagation() const { return true; }
static bool isSelectableElement(HTMLElement*, Node*);
-
- bool m_lastChangeWasUserEdit;
};
inline RenderTextControl* toRenderTextControl(RenderObject* object)
Modified: trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp (94046 => 94047)
--- trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp 2011-08-30 05:51:19 UTC (rev 94047)
@@ -84,7 +84,7 @@
{
RenderTextControl::updateFromElement();
- setInnerTextValue(static_cast<HTMLTextAreaElement*>(node())->value());
+ textFormControlElement()->setInnerTextValue(static_cast<HTMLTextAreaElement*>(node())->value());
}
PassRefPtr<RenderStyle> RenderTextControlMultiLine::createInnerTextStyle(const RenderStyle* startStyle) const
Modified: trunk/Source/WebCore/rendering/RenderTextControlSingleLine.cpp (94046 => 94047)
--- trunk/Source/WebCore/rendering/RenderTextControlSingleLine.cpp 2011-08-30 05:27:45 UTC (rev 94046)
+++ trunk/Source/WebCore/rendering/RenderTextControlSingleLine.cpp 2011-08-30 05:51:19 UTC (rev 94047)
@@ -477,14 +477,14 @@
updateCancelButtonVisibility();
if (!inputElement()->suggestedValue().isNull())
- setInnerTextValue(inputElement()->suggestedValue());
+ textFormControlElement()->setInnerTextValue(inputElement()->suggestedValue());
else {
if (node()->hasTagName(inputTag)) {
// For HTMLInputElement, update the renderer value if the formControlValueMatchesRenderer()
// flag is false. It protects an unacceptable renderer value from
// being overwritten with the DOM value.
if (!inputElement()->formControlValueMatchesRenderer())
- setInnerTextValue(inputElement()->visibleValue());
+ textFormControlElement()->setInnerTextValue(inputElement()->visibleValue());
}
}