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

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

Issue 2735633006: INPUT/TEXTAREA elements: Dispatch 'select' event only if text selection is changed. (Closed)
Patch Set: Remove throttling Created 3 years, 9 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 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Apple Inc. All rights
6 * reserved. 6 * reserved.
7 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) 7 * (C) 2006 Alexey Proskuryakov (ap@nypop.com)
8 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) 8 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 m_isDirty = true; 370 m_isDirty = true;
371 const_cast<HTMLTextAreaElement*>(this)->updatePlaceholderVisibility(); 371 const_cast<HTMLTextAreaElement*>(this)->updatePlaceholderVisibility();
372 } 372 }
373 373
374 String HTMLTextAreaElement::value() const { 374 String HTMLTextAreaElement::value() const {
375 updateValue(); 375 updateValue();
376 return m_value; 376 return m_value;
377 } 377 }
378 378
379 void HTMLTextAreaElement::setValue(const String& value, 379 void HTMLTextAreaElement::setValue(const String& value,
380 TextFieldEventBehavior eventBehavior) { 380 TextFieldEventBehavior eventBehavior,
381 setValueCommon(value, eventBehavior); 381 TextControlSetValueSelection selection) {
382 setValueCommon(value, eventBehavior, selection);
382 m_isDirty = true; 383 m_isDirty = true;
383 } 384 }
384 385
385 void HTMLTextAreaElement::setNonDirtyValue(const String& value) { 386 void HTMLTextAreaElement::setNonDirtyValue(const String& value) {
386 setValueCommon(value, DispatchNoEvent); 387 setValueCommon(value, DispatchNoEvent,
388 TextControlSetValueSelection::kSetSelectionToEnd);
387 m_isDirty = false; 389 m_isDirty = false;
388 } 390 }
389 391
390 void HTMLTextAreaElement::setValueCommon(const String& newValue, 392 void HTMLTextAreaElement::setValueCommon(
391 TextFieldEventBehavior eventBehavior) { 393 const String& newValue,
394 TextFieldEventBehavior eventBehavior,
395 TextControlSetValueSelection selection) {
392 // Code elsewhere normalizes line endings added by the user via the keyboard 396 // Code elsewhere normalizes line endings added by the user via the keyboard
393 // or pasting. We normalize line endings coming from JavaScript here. 397 // or pasting. We normalize line endings coming from JavaScript here.
394 String normalizedValue = newValue.isNull() ? "" : newValue; 398 String normalizedValue = newValue.isNull() ? "" : newValue;
395 normalizedValue.replace("\r\n", "\n"); 399 normalizedValue.replace("\r\n", "\n");
396 normalizedValue.replace('\r', '\n'); 400 normalizedValue.replace('\r', '\n');
397 401
398 // Return early because we don't want to trigger other side effects when the 402 // Return early because we don't want to trigger other side effects when the
399 // value isn't changing. This is interoperable though the specification 403 // value isn't changing. This is interoperable though the specification
400 // doesn't define so. 404 // doesn't define so.
401 // https://github.com/whatwg/html/issues/2412 405 // https://github.com/whatwg/html/issues/2412
402 if (normalizedValue == value()) 406 if (normalizedValue == value())
403 return; 407 return;
404 408
405 m_value = normalizedValue; 409 m_value = normalizedValue;
406 setInnerEditorValue(m_value); 410 setInnerEditorValue(m_value);
407 if (eventBehavior == DispatchNoEvent) 411 if (eventBehavior == DispatchNoEvent)
408 setLastChangeWasNotUserEdit(); 412 setLastChangeWasNotUserEdit();
409 updatePlaceholderVisibility(); 413 updatePlaceholderVisibility();
410 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create( 414 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(
411 StyleChangeReason::ControlValue)); 415 StyleChangeReason::ControlValue));
412 m_suggestedValue = String(); 416 m_suggestedValue = String();
413 setNeedsValidityCheck(); 417 setNeedsValidityCheck();
414 if (isFinishedParsingChildren()) { 418 if (isFinishedParsingChildren() &&
419 selection == TextControlSetValueSelection::kSetSelectionToEnd) {
415 // Set the caret to the end of the text value except for initialize. 420 // Set the caret to the end of the text value except for initialize.
416 unsigned endOfString = m_value.length(); 421 unsigned endOfString = m_value.length();
417 setSelectionRange(endOfString, endOfString); 422 setSelectionRange(endOfString, endOfString);
418 } 423 }
419 424
420 notifyFormStateChanged(); 425 notifyFormStateChanged();
421 switch (eventBehavior) { 426 switch (eventBehavior) {
422 case DispatchChangeEvent: 427 case DispatchChangeEvent:
423 dispatchFormControlChangeEvent(); 428 dispatchFormControlChangeEvent();
424 break; 429 break;
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 630
626 const AtomicString& HTMLTextAreaElement::defaultAutocapitalize() const { 631 const AtomicString& HTMLTextAreaElement::defaultAutocapitalize() const {
627 DEFINE_STATIC_LOCAL(const AtomicString, sentences, ("sentences")); 632 DEFINE_STATIC_LOCAL(const AtomicString, sentences, ("sentences"));
628 return sentences; 633 return sentences;
629 } 634 }
630 635
631 void HTMLTextAreaElement::copyNonAttributePropertiesFromElement( 636 void HTMLTextAreaElement::copyNonAttributePropertiesFromElement(
632 const Element& source) { 637 const Element& source) {
633 const HTMLTextAreaElement& sourceElement = 638 const HTMLTextAreaElement& sourceElement =
634 static_cast<const HTMLTextAreaElement&>(source); 639 static_cast<const HTMLTextAreaElement&>(source);
635 setValueCommon(sourceElement.value(), DispatchNoEvent); 640 setValueCommon(sourceElement.value(), DispatchNoEvent,
641 TextControlSetValueSelection::kSetSelectionToEnd);
636 m_isDirty = sourceElement.m_isDirty; 642 m_isDirty = sourceElement.m_isDirty;
637 TextControlElement::copyNonAttributePropertiesFromElement(source); 643 TextControlElement::copyNonAttributePropertiesFromElement(source);
638 } 644 }
639 645
640 } // namespace blink 646 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLTextAreaElement.h ('k') | third_party/WebKit/Source/core/html/TextControlElement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698