Changeset 94047 in webkit
- Timestamp:
- Aug 29, 2011, 10:51:19 PM (14 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r94045 r94047 1 2011-08-29 Ryosuke Niwa <rniwa@webkit.org> 2 3 Move setInnerTextValue from RenderTextControl to HTMLTextFormControlElement 4 https://bugs.webkit.org/show_bug.cgi?id=67152 5 6 Reviewed by Darin Adler. 7 8 Moved setInnerTextValue from RenderTextControl to HTMLTextFormControlElement. 9 10 Also moved m_lastChangeWasUserEdit from RenderTextControl to HTMLTextFormControlElement 11 and related inline functions from RenderTextControl to HTMLTextFormControlElement. 12 Because m_lastChangeWasUserEdit is no longer reset when RenderTextControl is recreated, 13 added explicit calls to setLastChangeWasNotUserEdit in setValue functions of HTMLInputElement 14 and HTMLTextAreaElement. 15 16 This patch also fixes the bug that lastChangeWasUserEdit() incorrectly returns false 17 when input or textarea don't have renderer (e.g. invisible). 18 19 Unfortunately, there is no way to test this behavioral change from layout tests. 20 21 * WebCore.exp.in: Exports lastChangeWasUserEdit in HTMLTextFormControlElement instead of 22 that of HTMLInputElement and HTMLTextAreaElement. 23 * html/HTMLInputElement.cpp: 24 (WebCore::HTMLInputElement::setValue): Explicitly calls setLastChangeWasNotUserEdit. 25 * html/HTMLInputElement.h: 26 * html/HTMLTextAreaElement.cpp: 27 (WebCore::HTMLTextAreaElement::setValueCommon): Ditto. 28 * html/HTMLTextAreaElement.h: 29 * html/HTMLTextFormControlElement.cpp: 30 (WebCore::HTMLTextFormControlElement::HTMLTextFormControlElement): 31 (WebCore::HTMLTextFormControlElement::subtreeHasChanged): Sets m_lastChangeWasUserEdit true 32 as it used to do via respondToChangeByUser. 33 (WebCore::HTMLTextFormControlElement::lastChangeWasUserEdit): Moved from HTMLInputElement 34 and HTMLTextAreaElement. 35 (WebCore::HTMLTextFormControlElement::setInnerTextValue): Moved from RenderTextControl. 36 * html/HTMLTextFormControlElement.h: 37 (WebCore::HTMLTextFormControlElement::setLastChangeWasNotUserEdit): Added. 38 * rendering/RenderTextControl.cpp: 39 (WebCore::RenderTextControl::RenderTextControl): No longer initializes m_lastChangeWasUserEdit. 40 * rendering/RenderTextControl.h: 41 * rendering/RenderTextControlSingleLine.cpp: 42 (WebCore::RenderTextControlSingleLine::updateFromElement): Calls setInnerTextValue. 43 * rendering/RenderTextControlMultiLine.cpp: 44 (WebCore::RenderTextControlMultiLine::updateFromElement): Ditto. 45 1 46 2011-08-25 Kent Tamura <tkent@chromium.org> 2 47 -
trunk/Source/WebCore/WebCore.exp.in
r94007 r94047 1183 1183 __ZNK7WebCore16HTMLInputElement15isPasswordFieldEv 1184 1184 __ZNK7WebCore16HTMLInputElement18shouldAutocompleteEv 1185 __ZNK7WebCore16HTMLInputElement21lastChangeWasUserEditEv1186 1185 __ZNK7WebCore16IconDatabaseBase12databasePathEv 1187 1186 __ZNK7WebCore16ResourceResponse13nsURLResponseEv … … 1193 1192 __ZNK7WebCore17ResourceErrorBase8lazyInitEv 1194 1193 __ZNK7WebCore19AnimationController24numberOfActiveAnimationsEPNS_8DocumentE 1195 __ZNK7WebCore19HTMLTextAreaElement21lastChangeWasUserEditEv1196 1194 __ZNK7WebCore19ResourceRequestBase10httpMethodEv 1197 1195 __ZNK7WebCore19ResourceRequestBase15httpHeaderFieldEPKc … … 1218 1216 __ZNK7WebCore23FrameLoaderStateMachine15firstLayoutDoneEv 1219 1217 __ZNK7WebCore23FrameLoaderStateMachine23committingFirstRealLoadEv 1218 __ZNK7WebCore26HTMLTextFormControlElement21lastChangeWasUserEditEv 1220 1219 __ZNK7WebCore26NetscapePlugInStreamLoader6isDoneEv 1221 1220 __ZNK7WebCore27AuthenticationChallengeBase15failureResponseEv -
trunk/Source/WebCore/html/HTMLInputElement.cpp
r94009 r94047 205 205 } 206 206 } 207 }208 209 bool HTMLInputElement::lastChangeWasUserEdit() const210 {211 if (!isTextField())212 return false;213 214 if (!renderer())215 return false;216 217 return toRenderTextControl(renderer())->lastChangeWasUserEdit();218 207 } 219 208 … … 1069 1058 bool valueChanged = sanitizedValue != this->value(); 1070 1059 1060 setLastChangeWasNotUserEdit(); 1071 1061 setFormControlValueMatchesRenderer(false); 1072 1062 if (m_inputType->storesValueSeparateFromAttribute()) { -
trunk/Source/WebCore/html/HTMLInputElement.h
r94009 r94047 229 229 #endif 230 230 231 bool lastChangeWasUserEdit() const;232 233 231 static const int maximumLength; 234 232 -
trunk/Source/WebCore/html/HTMLTextAreaElement.cpp
r94009 r94047 334 334 335 335 m_value = normalizedValue; 336 setLastChangeWasNotUserEdit(); 336 337 updatePlaceholderVisibility(false); 337 338 setNeedsStyleRecalc(); … … 432 433 { 433 434 setAttribute(rowsAttr, String::number(rows)); 434 }435 436 bool HTMLTextAreaElement::lastChangeWasUserEdit() const437 {438 if (!renderer())439 return false;440 return toRenderTextControl(renderer())->lastChangeWasUserEdit();441 435 } 442 436 -
trunk/Source/WebCore/html/HTMLTextAreaElement.h
r94009 r94047 59 59 void setRows(int); 60 60 61 bool lastChangeWasUserEdit() const;62 63 61 private: 64 62 HTMLTextAreaElement(const QualifiedName&, Document*, HTMLFormElement*); -
trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp
r94009 r94047 26 26 #include "HTMLTextFormControlElement.h" 27 27 28 #include "AXObjectCache.h" 28 29 #include "Attribute.h" 29 30 #include "Chrome.h" … … 33 34 #include "EventNames.h" 34 35 #include "Frame.h" 36 #include "HTMLBRElement.h" 35 37 #include "HTMLFormElement.h" 36 38 #include "HTMLInputElement.h" … … 51 53 HTMLTextFormControlElement::HTMLTextFormControlElement(const QualifiedName& tagName, Document* doc, HTMLFormElement* form) 52 54 : HTMLFormControlElementWithState(tagName, doc, form) 55 , m_lastChangeWasUserEdit(false) 53 56 , m_cachedSelectionStart(-1) 54 57 , m_cachedSelectionEnd(-1) … … 103 106 void HTMLTextFormControlElement::subtreeHasChanged() 104 107 { 105 toRenderTextControl(renderer())->respondToChangeByUser();108 m_lastChangeWasUserEdit = true; 106 109 } 107 110 … … 442 445 if (!frame) 443 446 return; 444 447 445 448 if (Page* page = frame->page()) 446 449 page->chrome()->client()->formStateDidChange(this); 450 } 451 452 bool HTMLTextFormControlElement::lastChangeWasUserEdit() const 453 { 454 if (!isTextFormControl()) 455 return false; 456 return m_lastChangeWasUserEdit; 457 } 458 459 void HTMLTextFormControlElement::setInnerTextValue(const String& value) 460 { 461 if (!renderer() || !isTextFormControl()) 462 return; 463 464 RenderTextControl* textControl = toRenderTextControl(renderer()); 465 bool textIsChanged = value != textControl->text(); 466 if (textIsChanged || !innerTextElement()->hasChildNodes()) { 467 if (textIsChanged && document() && AXObjectCache::accessibilityEnabled()) 468 document()->axObjectCache()->postNotification(textControl, AXObjectCache::AXValueChanged, false); 469 470 ExceptionCode ec = 0; 471 innerTextElement()->setInnerText(value, ec); 472 ASSERT(!ec); 473 474 if (value.endsWith("\n") || value.endsWith("\r")) { 475 innerTextElement()->appendChild(HTMLBRElement::create(document()), ec); 476 ASSERT(!ec); 477 } 478 479 // 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>. 480 m_lastChangeWasUserEdit = false; 481 } 482 483 setFormControlValueMatchesRenderer(true); 447 484 } 448 485 -
trunk/Source/WebCore/html/HTMLTextFormControlElement.h
r94009 r94047 76 76 void selectionChanged(bool userTriggered); 77 77 void notifyFormStateChanged(); 78 bool lastChangeWasUserEdit() const; 79 void setInnerTextValue(const String&); 78 80 79 81 protected: … … 98 100 virtual void subtreeHasChanged(); 99 101 102 void setLastChangeWasNotUserEdit() { m_lastChangeWasUserEdit = false; } 100 103 private: 101 104 int computeSelectionStart() const; … … 120 123 121 124 String m_textAsOfLastFormControlChangeEvent; 125 bool m_lastChangeWasUserEdit; 122 126 123 127 int m_cachedSelectionStart; -
trunk/Source/WebCore/rendering/RenderTextControl.cpp
r94009 r94047 23 23 #include "RenderTextControl.h" 24 24 25 #include "AXObjectCache.h"26 25 #include "Editor.h" 27 26 #include "Frame.h" … … 69 68 RenderTextControl::RenderTextControl(Node* node) 70 69 : RenderBlock(node) 71 , m_lastChangeWasUserEdit(false)72 70 { 73 71 ASSERT(toTextFormControl(node)); … … 150 148 if (innerText) 151 149 updateUserModifyProperty(node(), innerText->renderer()->style()); 152 }153 154 void RenderTextControl::setInnerTextValue(const String& value)155 {156 bool textIsChanged = value != text();157 if (textIsChanged || !innerTextElement()->hasChildNodes()) {158 if (textIsChanged && document() && AXObjectCache::accessibilityEnabled())159 document()->axObjectCache()->postNotification(this, AXObjectCache::AXValueChanged, false);160 161 ExceptionCode ec = 0;162 innerTextElement()->setInnerText(value, ec);163 ASSERT(!ec);164 165 if (value.endsWith("\n") || value.endsWith("\r")) {166 innerTextElement()->appendChild(HTMLBRElement::create(document()), ec);167 ASSERT(!ec);168 }169 170 // 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>.171 m_lastChangeWasUserEdit = false;172 }173 174 textFormControlElement()->setFormControlValueMatchesRenderer(true);175 150 } 176 151 -
trunk/Source/WebCore/rendering/RenderTextControl.h
r93334 r94047 36 36 virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const = 0; 37 37 38 bool lastChangeWasUserEdit() const { return m_lastChangeWasUserEdit; }39 void respondToChangeByUser() { m_lastChangeWasUserEdit = true; }40 38 String text(); 41 39 String textWithHardLineBreaks(); … … 51 49 int scrollbarThickness() const; 52 50 void adjustInnerTextStyle(const RenderStyle* startStyle, RenderStyle* textBlockStyle) const; 53 void setInnerTextValue(const String&);54 51 55 52 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); … … 89 86 90 87 static bool isSelectableElement(HTMLElement*, Node*); 91 92 bool m_lastChangeWasUserEdit;93 88 }; 94 89 -
trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp
r93334 r94047 85 85 RenderTextControl::updateFromElement(); 86 86 87 setInnerTextValue(static_cast<HTMLTextAreaElement*>(node())->value());87 textFormControlElement()->setInnerTextValue(static_cast<HTMLTextAreaElement*>(node())->value()); 88 88 } 89 89 -
trunk/Source/WebCore/rendering/RenderTextControlSingleLine.cpp
r93334 r94047 478 478 479 479 if (!inputElement()->suggestedValue().isNull()) 480 setInnerTextValue(inputElement()->suggestedValue());480 textFormControlElement()->setInnerTextValue(inputElement()->suggestedValue()); 481 481 else { 482 482 if (node()->hasTagName(inputTag)) { … … 485 485 // being overwritten with the DOM value. 486 486 if (!inputElement()->formControlValueMatchesRenderer()) 487 setInnerTextValue(inputElement()->visibleValue());487 textFormControlElement()->setInnerTextValue(inputElement()->visibleValue()); 488 488 } 489 489 }
Note:
See TracChangeset
for help on using the changeset viewer.