Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(537)

Side by Side Diff: Source/core/html/HTMLTextAreaElement.cpp

Issue 460343004: Fix update of validity cache value, so that it reflects the correct state of any FormControlElement. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: WIP2 Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Apple Inc. All rights reserv ed. 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Apple Inc. All rights reserv ed.
6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) 6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com)
7 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) 7 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org)
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 { 76 {
77 return text.length() + numberOfLineBreaks(text); 77 return text.length() + numberOfLineBreaks(text);
78 } 78 }
79 79
80 HTMLTextAreaElement::HTMLTextAreaElement(Document& document, HTMLFormElement* fo rm) 80 HTMLTextAreaElement::HTMLTextAreaElement(Document& document, HTMLFormElement* fo rm)
81 : HTMLTextFormControlElement(textareaTag, document, form) 81 : HTMLTextFormControlElement(textareaTag, document, form)
82 , m_rows(defaultRows) 82 , m_rows(defaultRows)
83 , m_cols(defaultCols) 83 , m_cols(defaultCols)
84 , m_wrap(SoftWrap) 84 , m_wrap(SoftWrap)
85 , m_isDirty(false) 85 , m_isDirty(false)
86 , m_valueIsUpToDate(true)
87 { 86 {
88 ScriptWrappable::init(this); 87 ScriptWrappable::init(this);
89 } 88 }
90 89
91 PassRefPtrWillBeRawPtr<HTMLTextAreaElement> HTMLTextAreaElement::create(Document & document, HTMLFormElement* form) 90 PassRefPtrWillBeRawPtr<HTMLTextAreaElement> HTMLTextAreaElement::create(Document & document, HTMLFormElement* form)
92 { 91 {
93 RefPtrWillBeRawPtr<HTMLTextAreaElement> textArea = adoptRefWillBeNoop(new HT MLTextAreaElement(document, form)); 92 RefPtrWillBeRawPtr<HTMLTextAreaElement> textArea = adoptRefWillBeNoop(new HT MLTextAreaElement(document, form));
94 textArea->ensureUserAgentShadowRoot(); 93 textArea->ensureUserAgentShadowRoot();
95 return textArea.release(); 94 return textArea.release();
96 } 95 }
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 260
262 void HTMLTextAreaElement::handleFocusEvent(Element*, FocusType) 261 void HTMLTextAreaElement::handleFocusEvent(Element*, FocusType)
263 { 262 {
264 if (LocalFrame* frame = document().frame()) 263 if (LocalFrame* frame = document().frame())
265 frame->spellChecker().didBeginEditing(this); 264 frame->spellChecker().didBeginEditing(this);
266 } 265 }
267 266
268 void HTMLTextAreaElement::subtreeHasChanged() 267 void HTMLTextAreaElement::subtreeHasChanged()
269 { 268 {
270 setChangedSinceLastFormControlChangeEvent(true); 269 setChangedSinceLastFormControlChangeEvent(true);
271 m_valueIsUpToDate = false; 270 // Update Value to match the renderer
271 updateValue();
272 setNeedsValidityCheck(); 272 setNeedsValidityCheck();
273 setAutofilled(false); 273 setAutofilled(false);
274 274
275 if (!focused()) 275 if (!focused())
276 return; 276 return;
277 277
278 // When typing in a textarea, childrenChanged is not called, so we need to f orce the directionality check. 278 // When typing in a textarea, childrenChanged is not called, so we need to f orce the directionality check.
279 calculateAndAdjustDirectionality(); 279 calculateAndAdjustDirectionality();
280 280
281 ASSERT(document().isActive()); 281 ASSERT(document().isActive());
(...skipping 28 matching lines...) Expand all
310 310
311 String HTMLTextAreaElement::sanitizeUserInputValue(const String& proposedValue, unsigned maxLength) 311 String HTMLTextAreaElement::sanitizeUserInputValue(const String& proposedValue, unsigned maxLength)
312 { 312 {
313 if (maxLength > 0 && U16_IS_LEAD(proposedValue[maxLength - 1])) 313 if (maxLength > 0 && U16_IS_LEAD(proposedValue[maxLength - 1]))
314 --maxLength; 314 --maxLength;
315 return proposedValue.left(maxLength); 315 return proposedValue.left(maxLength);
316 } 316 }
317 317
318 void HTMLTextAreaElement::updateValue() const 318 void HTMLTextAreaElement::updateValue() const
319 { 319 {
320 if (m_valueIsUpToDate)
321 return;
322
323 ASSERT(renderer()); 320 ASSERT(renderer());
324 m_value = innerEditorValue(); 321 m_value = innerEditorValue();
325 const_cast<HTMLTextAreaElement*>(this)->m_valueIsUpToDate = true;
326 const_cast<HTMLTextAreaElement*>(this)->notifyFormStateChanged(); 322 const_cast<HTMLTextAreaElement*>(this)->notifyFormStateChanged();
327 m_isDirty = true; 323 m_isDirty = true;
328 const_cast<HTMLTextAreaElement*>(this)->updatePlaceholderVisibility(false); 324 const_cast<HTMLTextAreaElement*>(this)->updatePlaceholderVisibility(false);
329 } 325 }
330 326
331 String HTMLTextAreaElement::value() const 327 String HTMLTextAreaElement::value() const
332 { 328 {
333 updateValue();
spartha 2014/09/02 14:09:55 Replaced by a call from subTreeChanged()
334 return m_value; 329 return m_value;
335 } 330 }
336 331
337 void HTMLTextAreaElement::setValue(const String& value, TextFieldEventBehavior e ventBehavior) 332 void HTMLTextAreaElement::setValue(const String& value, TextFieldEventBehavior e ventBehavior)
338 { 333 {
339 RefPtrWillBeRawPtr<HTMLTextAreaElement> protector(this); 334 RefPtrWillBeRawPtr<HTMLTextAreaElement> protector(this);
340 setValueCommon(value, eventBehavior); 335 setValueCommon(value, eventBehavior);
341 m_isDirty = true; 336 m_isDirty = true;
342 if (document().focusedElement() == this) 337 if (document().focusedElement() == this)
343 document().frameHost()->chrome().client().didUpdateTextOfFocusedElementB yNonUserInput(); 338 document().frameHost()->chrome().client().didUpdateTextOfFocusedElementB yNonUserInput();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 notifyFormStateChanged(); 385 notifyFormStateChanged();
391 if (eventBehavior == DispatchNoEvent) { 386 if (eventBehavior == DispatchNoEvent) {
392 setTextAsOfLastFormControlChangeEvent(normalizedValue); 387 setTextAsOfLastFormControlChangeEvent(normalizedValue);
393 } else { 388 } else {
394 if (eventBehavior == DispatchInputAndChangeEvent) 389 if (eventBehavior == DispatchInputAndChangeEvent)
395 dispatchFormControlInputEvent(); 390 dispatchFormControlInputEvent();
396 dispatchFormControlChangeEvent(); 391 dispatchFormControlChangeEvent();
397 } 392 }
398 } 393 }
399 394
400 void HTMLTextAreaElement::setInnerEditorValue(const String& value)
401 {
402 HTMLTextFormControlElement::setInnerEditorValue(value);
403 m_valueIsUpToDate = true;
404 }
405
406 String HTMLTextAreaElement::defaultValue() const 395 String HTMLTextAreaElement::defaultValue() const
407 { 396 {
408 StringBuilder value; 397 StringBuilder value;
409 398
410 // Since there may be comments, ignore nodes other than text nodes. 399 // Since there may be comments, ignore nodes other than text nodes.
411 for (Node* n = firstChild(); n; n = n->nextSibling()) { 400 for (Node* n = firstChild(); n; n = n->nextSibling()) {
412 if (n->isTextNode()) 401 if (n->isTextNode())
413 value.append(toText(n)->data()); 402 value.append(toText(n)->data());
414 } 403 }
415 404
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 { 555 {
567 return true; 556 return true;
568 } 557 }
569 558
570 bool HTMLTextAreaElement::supportsAutofocus() const 559 bool HTMLTextAreaElement::supportsAutofocus() const
571 { 560 {
572 return true; 561 return true;
573 } 562 }
574 563
575 } 564 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698