OLD | NEW |
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 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 // fix it. | 278 // fix it. |
279 Element* innerEditor = innerEditorElement(); | 279 Element* innerEditor = innerEditorElement(); |
280 for (Node& node : NodeTraversal::descendantsOf(*innerEditor)) { | 280 for (Node& node : NodeTraversal::descendantsOf(*innerEditor)) { |
281 if (node.isTextNode()) | 281 if (node.isTextNode()) |
282 continue; | 282 continue; |
283 DCHECK(isHTMLBRElement(node)); | 283 DCHECK(isHTMLBRElement(node)); |
284 DCHECK_EQ(&node, innerEditor->lastChild()); | 284 DCHECK_EQ(&node, innerEditor->lastChild()); |
285 } | 285 } |
286 #endif | 286 #endif |
287 addPlaceholderBreakElementIfNecessary(); | 287 addPlaceholderBreakElementIfNecessary(); |
288 setChangedSinceLastFormControlChangeEvent(true); | 288 setValueBeforeFirstUserEditIfNotSet(); |
289 updateValue(); | 289 updateValue(); |
| 290 checkIfValueWasReverted(value()); |
290 setNeedsValidityCheck(); | 291 setNeedsValidityCheck(); |
291 setAutofilled(false); | 292 setAutofilled(false); |
292 updatePlaceholderVisibility(); | 293 updatePlaceholderVisibility(); |
293 | 294 |
294 if (!isFocused()) | 295 if (!isFocused()) |
295 return; | 296 return; |
296 | 297 |
297 // When typing in a textarea, childrenChanged is not called, so we need to | 298 // When typing in a textarea, childrenChanged is not called, so we need to |
298 // force the directionality check. | 299 // force the directionality check. |
299 calculateAndAdjustDirectionality(); | 300 calculateAndAdjustDirectionality(); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 normalizedValue.replace("\r\n", "\n"); | 394 normalizedValue.replace("\r\n", "\n"); |
394 normalizedValue.replace('\r', '\n'); | 395 normalizedValue.replace('\r', '\n'); |
395 | 396 |
396 // Return early because we don't want to trigger other side effects when the | 397 // Return early because we don't want to trigger other side effects when the |
397 // value isn't changing. This is interoperable though the specification | 398 // value isn't changing. This is interoperable though the specification |
398 // doesn't define so. | 399 // doesn't define so. |
399 // https://github.com/whatwg/html/issues/2412 | 400 // https://github.com/whatwg/html/issues/2412 |
400 if (normalizedValue == value()) | 401 if (normalizedValue == value()) |
401 return; | 402 return; |
402 | 403 |
| 404 if (eventBehavior != DispatchNoEvent) |
| 405 setValueBeforeFirstUserEditIfNotSet(); |
403 m_value = normalizedValue; | 406 m_value = normalizedValue; |
404 setInnerEditorValue(m_value); | 407 setInnerEditorValue(m_value); |
405 if (eventBehavior == DispatchNoEvent) | 408 if (eventBehavior == DispatchNoEvent) |
406 setLastChangeWasNotUserEdit(); | 409 setLastChangeWasNotUserEdit(); |
| 410 else |
| 411 checkIfValueWasReverted(m_value); |
407 updatePlaceholderVisibility(); | 412 updatePlaceholderVisibility(); |
408 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create( | 413 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create( |
409 StyleChangeReason::ControlValue)); | 414 StyleChangeReason::ControlValue)); |
410 m_suggestedValue = String(); | 415 m_suggestedValue = String(); |
411 setNeedsValidityCheck(); | 416 setNeedsValidityCheck(); |
412 if (isFinishedParsingChildren() && | 417 if (isFinishedParsingChildren() && |
413 selection == TextControlSetValueSelection::kSetSelectionToEnd) { | 418 selection == TextControlSetValueSelection::kSetSelectionToEnd) { |
414 // Set the caret to the end of the text value except for initialize. | 419 // Set the caret to the end of the text value except for initialize. |
415 unsigned endOfString = m_value.length(); | 420 unsigned endOfString = m_value.length(); |
416 setSelectionRange(endOfString, endOfString); | 421 setSelectionRange(endOfString, endOfString); |
417 } | 422 } |
418 | 423 |
419 notifyFormStateChanged(); | 424 notifyFormStateChanged(); |
420 switch (eventBehavior) { | 425 switch (eventBehavior) { |
421 case DispatchChangeEvent: | 426 case DispatchChangeEvent: |
422 dispatchFormControlChangeEvent(); | 427 dispatchFormControlChangeEvent(); |
423 break; | 428 break; |
424 | 429 |
425 case DispatchInputAndChangeEvent: | 430 case DispatchInputAndChangeEvent: |
426 dispatchFormControlInputEvent(); | 431 dispatchFormControlInputEvent(); |
427 dispatchFormControlChangeEvent(); | 432 dispatchFormControlChangeEvent(); |
428 break; | 433 break; |
429 | 434 |
430 case DispatchNoEvent: | 435 case DispatchNoEvent: |
431 // We need to update textAsOfLastFormControlChangeEvent for |value| IDL | |
432 // setter without focus because input-assist features use setValue("...", | |
433 // DispatchChangeEvent) without setting focus. | |
434 if (!isFocused()) | |
435 setTextAsOfLastFormControlChangeEvent(normalizedValue); | |
436 break; | 436 break; |
437 } | 437 } |
438 } | 438 } |
439 | 439 |
440 String HTMLTextAreaElement::defaultValue() const { | 440 String HTMLTextAreaElement::defaultValue() const { |
441 StringBuilder value; | 441 StringBuilder value; |
442 | 442 |
443 // Since there may be comments, ignore nodes other than text nodes. | 443 // Since there may be comments, ignore nodes other than text nodes. |
444 for (Node* n = firstChild(); n; n = n->nextSibling()) { | 444 for (Node* n = firstChild(); n; n = n->nextSibling()) { |
445 if (n->isTextNode()) | 445 if (n->isTextNode()) |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 const Element& source) { | 626 const Element& source) { |
627 const HTMLTextAreaElement& sourceElement = | 627 const HTMLTextAreaElement& sourceElement = |
628 static_cast<const HTMLTextAreaElement&>(source); | 628 static_cast<const HTMLTextAreaElement&>(source); |
629 setValueCommon(sourceElement.value(), DispatchNoEvent, | 629 setValueCommon(sourceElement.value(), DispatchNoEvent, |
630 TextControlSetValueSelection::kSetSelectionToEnd); | 630 TextControlSetValueSelection::kSetSelectionToEnd); |
631 m_isDirty = sourceElement.m_isDirty; | 631 m_isDirty = sourceElement.m_isDirty; |
632 TextControlElement::copyNonAttributePropertiesFromElement(source); | 632 TextControlElement::copyNonAttributePropertiesFromElement(source); |
633 } | 633 } |
634 | 634 |
635 } // namespace blink | 635 } // namespace blink |
OLD | NEW |