| Index: Source/core/html/HTMLTextAreaElement.cpp
|
| diff --git a/Source/core/html/HTMLTextAreaElement.cpp b/Source/core/html/HTMLTextAreaElement.cpp
|
| index fd7ad6434bc60392e35ebe11871ee0c35cb2c472..7ca0838c5313cde3fb9694071bf6070a5c014000 100644
|
| --- a/Source/core/html/HTMLTextAreaElement.cpp
|
| +++ b/Source/core/html/HTMLTextAreaElement.cpp
|
| @@ -338,19 +338,17 @@ void HTMLTextAreaElement::setValue(const String& value, TextFieldEventBehavior e
|
| RefPtrWillBeRawPtr<HTMLTextAreaElement> protector(this);
|
| setValueCommon(value, eventBehavior);
|
| m_isDirty = true;
|
| - setNeedsValidityCheck();
|
| if (document().focusedElement() == this)
|
| document().frameHost()->chrome().client().didUpdateTextOfFocusedElementByNonUserInput();
|
| }
|
|
|
| void HTMLTextAreaElement::setNonDirtyValue(const String& value)
|
| {
|
| - setValueCommon(value, DispatchNoEvent);
|
| + setValueCommon(value, DispatchNoEvent, ChangeSelection);
|
| m_isDirty = false;
|
| - setNeedsValidityCheck();
|
| }
|
|
|
| -void HTMLTextAreaElement::setValueCommon(const String& newValue, TextFieldEventBehavior eventBehavior)
|
| +void HTMLTextAreaElement::setValueCommon(const String& newValue, TextFieldEventBehavior eventBehavior, SelectionOption selectionOption)
|
| {
|
| // Code elsewhere normalizes line endings added by the user via the keyboard or pasting.
|
| // We normalize line endings coming from JavaScript here.
|
| @@ -358,10 +356,21 @@ void HTMLTextAreaElement::setValueCommon(const String& newValue, TextFieldEventB
|
| normalizedValue.replace("\r\n", "\n");
|
| normalizedValue.replace('\r', '\n');
|
|
|
| - // Return early because we don't want to move the caret or trigger other side effects
|
| - // when the value isn't changing. This matches Firefox behavior, at least.
|
| - if (normalizedValue == value())
|
| + // Return early because we don't want to trigger other side effects
|
| + // when the value isn't changing.
|
| + // FIXME: Simple early return doesn't match the Firefox ever.
|
| + // Remove these lines.
|
| + if (normalizedValue == value()) {
|
| + if (selectionOption == ChangeSelection) {
|
| + setNeedsValidityCheck();
|
| + if (isFinishedParsingChildren()) {
|
| + // Set the caret to the end of the text value except for initialize.
|
| + unsigned endOfString = m_value.length();
|
| + setSelectionRange(endOfString, endOfString, SelectionHasNoDirection, NotChangeSelection);
|
| + }
|
| + }
|
| return;
|
| + }
|
|
|
| m_value = normalizedValue;
|
| setInnerEditorValue(m_value);
|
| @@ -370,11 +379,11 @@ void HTMLTextAreaElement::setValueCommon(const String& newValue, TextFieldEventB
|
| updatePlaceholderVisibility(false);
|
| setNeedsStyleRecalc(SubtreeStyleChange);
|
| m_suggestedValue = String();
|
| -
|
| - // Set the caret to the end of the text value.
|
| - if (document().focusedElement() == this) {
|
| + setNeedsValidityCheck();
|
| + if (isFinishedParsingChildren()) {
|
| + // Set the caret to the end of the text value except for initialize.
|
| unsigned endOfString = m_value.length();
|
| - setSelectionRange(endOfString, endOfString);
|
| + setSelectionRange(endOfString, endOfString, SelectionHasNoDirection, NotChangeSelection);
|
| }
|
|
|
| notifyFormStateChanged();
|
|
|