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, 2009, 2010, 2011 Apple Inc. All | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All |
6 * rights reserved. | 6 * rights 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 * Copyright (C) 2010 Google Inc. All rights reserved. | 9 * Copyright (C) 2010 Google Inc. All rights reserved. |
10 * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. | 10 * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 if (m_inputType->valueMode() == ValueMode::kValue) | 380 if (m_inputType->valueMode() == ValueMode::kValue) |
381 m_nonAttributeValue = sanitizeValue(defaultValue); | 381 m_nonAttributeValue = sanitizeValue(defaultValue); |
382 ensureUserAgentShadowRoot(); | 382 ensureUserAgentShadowRoot(); |
383 | 383 |
384 setNeedsWillValidateCheck(); | 384 setNeedsWillValidateCheck(); |
385 | 385 |
386 if (!defaultValue.isNull()) | 386 if (!defaultValue.isNull()) |
387 m_inputType->warnIfValueIsInvalid(defaultValue); | 387 m_inputType->warnIfValueIsInvalid(defaultValue); |
388 | 388 |
389 m_inputTypeView->updateView(); | 389 m_inputTypeView->updateView(); |
390 setTextAsOfLastFormControlChangeEvent(value()); | |
391 setChangedSinceLastFormControlChangeEvent(false); | |
392 } | 390 } |
393 | 391 |
394 void HTMLInputElement::updateType() { | 392 void HTMLInputElement::updateType() { |
395 DCHECK(m_inputType); | 393 DCHECK(m_inputType); |
396 DCHECK(m_inputTypeView); | 394 DCHECK(m_inputTypeView); |
397 | 395 |
398 const AtomicString& newTypeName = | 396 const AtomicString& newTypeName = |
399 InputType::normalizeTypeName(fastGetAttribute(typeAttr)); | 397 InputType::normalizeTypeName(fastGetAttribute(typeAttr)); |
400 if (m_inputType->formControlType() == newTypeName) | 398 if (m_inputType->formControlType() == newTypeName) |
401 return; | 399 return; |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 AttributeModificationParams(alignAttr, align->value(), align->value(), | 495 AttributeModificationParams(alignAttr, align->value(), align->value(), |
498 AttributeModificationReason::kDirectly)); | 496 AttributeModificationReason::kDirectly)); |
499 } | 497 } |
500 } | 498 } |
501 | 499 |
502 // UA Shadow tree was recreated. We need to set selection again. We do it | 500 // UA Shadow tree was recreated. We need to set selection again. We do it |
503 // later in order to avoid force layout. | 501 // later in order to avoid force layout. |
504 if (document().focusedElement() == this) | 502 if (document().focusedElement() == this) |
505 document().updateFocusAppearanceLater(); | 503 document().updateFocusAppearanceLater(); |
506 | 504 |
507 setTextAsOfLastFormControlChangeEvent(value()); | 505 // TODO(tkent): Should we dispatch a change event? |
508 setChangedSinceLastFormControlChangeEvent(false); | 506 clearValueBeforeFirstUserEdit(); |
509 | 507 |
510 addToRadioButtonGroup(); | 508 addToRadioButtonGroup(); |
511 | 509 |
512 setNeedsValidityCheck(); | 510 setNeedsValidityCheck(); |
513 if ((couldBeSuccessfulSubmitButton || canBeSuccessfulSubmitButton()) && | 511 if ((couldBeSuccessfulSubmitButton || canBeSuccessfulSubmitButton()) && |
514 formOwner() && isConnected()) | 512 formOwner() && isConnected()) |
515 formOwner()->invalidateDefaultButtonStyle(); | 513 formOwner()->invalidateDefaultButtonStyle(); |
516 notifyFormStateChanged(); | 514 notifyFormStateChanged(); |
517 } | 515 } |
518 | 516 |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 m_autocomplete = Uninitialized; | 704 m_autocomplete = Uninitialized; |
707 else | 705 else |
708 m_autocomplete = On; | 706 m_autocomplete = On; |
709 } | 707 } |
710 } else if (name == typeAttr) { | 708 } else if (name == typeAttr) { |
711 updateType(); | 709 updateType(); |
712 } else if (name == valueAttr) { | 710 } else if (name == valueAttr) { |
713 // We only need to setChanged if the form is looking at the default value | 711 // We only need to setChanged if the form is looking at the default value |
714 // right now. | 712 // right now. |
715 if (!hasDirtyValue()) { | 713 if (!hasDirtyValue()) { |
716 if (m_inputType->valueMode() == ValueMode::kValue) { | 714 if (m_inputType->valueMode() == ValueMode::kValue) |
717 m_nonAttributeValue = sanitizeValue(value); | 715 m_nonAttributeValue = sanitizeValue(value); |
718 setTextAsOfLastFormControlChangeEvent(m_nonAttributeValue); | |
719 } | |
720 updatePlaceholderVisibility(); | 716 updatePlaceholderVisibility(); |
721 setNeedsStyleRecalc( | 717 setNeedsStyleRecalc( |
722 SubtreeStyleChange, | 718 SubtreeStyleChange, |
723 StyleChangeReasonForTracing::fromAttribute(valueAttr)); | 719 StyleChangeReasonForTracing::fromAttribute(valueAttr)); |
724 } | 720 } |
725 m_needsToUpdateViewValue = true; | 721 m_needsToUpdateViewValue = true; |
726 setNeedsValidityCheck(); | 722 setNeedsValidityCheck(); |
727 m_valueAttributeWasUpdatedAfterParsing = !m_parsingInProgress; | 723 m_valueAttributeWasUpdatedAfterParsing = !m_parsingInProgress; |
728 m_inputType->warnIfValueIsInvalidAndElementIsVisible(value); | 724 m_inputType->warnIfValueIsInvalidAndElementIsVisible(value); |
729 m_inputType->inRangeChanged(); | 725 m_inputType->inRangeChanged(); |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
945 cache->checkedStateChanged(this); | 941 cache->checkedStateChanged(this); |
946 } | 942 } |
947 | 943 |
948 // Only send a change event for items in the document (avoid firing during | 944 // Only send a change event for items in the document (avoid firing during |
949 // parsing) and don't send a change event for a radio button that's getting | 945 // parsing) and don't send a change event for a radio button that's getting |
950 // unchecked to match other browsers. DOM is not a useful standard for this | 946 // unchecked to match other browsers. DOM is not a useful standard for this |
951 // because it says only to fire change events at "lose focus" time, which is | 947 // because it says only to fire change events at "lose focus" time, which is |
952 // definitely wrong in practice for these types of elements. | 948 // definitely wrong in practice for these types of elements. |
953 if (eventBehavior != DispatchNoEvent && isConnected() && | 949 if (eventBehavior != DispatchNoEvent && isConnected() && |
954 m_inputType->shouldSendChangeEventAfterCheckedChanged()) { | 950 m_inputType->shouldSendChangeEventAfterCheckedChanged()) { |
955 setTextAsOfLastFormControlChangeEvent(String()); | |
956 if (eventBehavior == DispatchInputAndChangeEvent) | 951 if (eventBehavior == DispatchInputAndChangeEvent) |
957 dispatchFormControlInputEvent(); | 952 dispatchFormControlInputEvent(); |
958 } | 953 } |
959 | 954 |
960 pseudoStateChanged(CSSSelector::PseudoChecked); | 955 pseudoStateChanged(CSSSelector::PseudoChecked); |
961 } | 956 } |
962 | 957 |
963 void HTMLInputElement::setIndeterminate(bool newValue) { | 958 void HTMLInputElement::setIndeterminate(bool newValue) { |
964 if (indeterminate() == newValue) | 959 if (indeterminate() == newValue) |
965 return; | 960 return; |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1098 | 1093 |
1099 void HTMLInputElement::setNonAttributeValue(const String& sanitizedValue) { | 1094 void HTMLInputElement::setNonAttributeValue(const String& sanitizedValue) { |
1100 // This is a common code for ValueMode::kValue. | 1095 // This is a common code for ValueMode::kValue. |
1101 DCHECK_EQ(m_inputType->valueMode(), ValueMode::kValue); | 1096 DCHECK_EQ(m_inputType->valueMode(), ValueMode::kValue); |
1102 m_nonAttributeValue = sanitizedValue; | 1097 m_nonAttributeValue = sanitizedValue; |
1103 m_hasDirtyValue = true; | 1098 m_hasDirtyValue = true; |
1104 setNeedsValidityCheck(); | 1099 setNeedsValidityCheck(); |
1105 m_inputType->inRangeChanged(); | 1100 m_inputType->inRangeChanged(); |
1106 } | 1101 } |
1107 | 1102 |
| 1103 void HTMLInputElement::setNonAttributeValueByUserEdit( |
| 1104 const String& sanitizedValue) { |
| 1105 setValueBeforeFirstUserEditIfNotSet(); |
| 1106 setNonAttributeValue(sanitizedValue); |
| 1107 checkIfValueWasReverted(sanitizedValue); |
| 1108 } |
| 1109 |
1108 void HTMLInputElement::setNonDirtyValue(const String& newValue) { | 1110 void HTMLInputElement::setNonDirtyValue(const String& newValue) { |
1109 setValue(newValue); | 1111 setValue(newValue); |
1110 m_hasDirtyValue = false; | 1112 m_hasDirtyValue = false; |
1111 } | 1113 } |
1112 | 1114 |
1113 bool HTMLInputElement::hasDirtyValue() const { | 1115 bool HTMLInputElement::hasDirtyValue() const { |
1114 return m_hasDirtyValue; | 1116 return m_hasDirtyValue; |
1115 } | 1117 } |
1116 | 1118 |
1117 void HTMLInputElement::updateView() { | 1119 void HTMLInputElement::updateView() { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 // File upload controls will never use this. | 1152 // File upload controls will never use this. |
1151 DCHECK_NE(type(), InputTypeNames::file); | 1153 DCHECK_NE(type(), InputTypeNames::file); |
1152 | 1154 |
1153 m_suggestedValue = String(); | 1155 m_suggestedValue = String(); |
1154 | 1156 |
1155 // Renderer and our event handler are responsible for sanitizing values. | 1157 // Renderer and our event handler are responsible for sanitizing values. |
1156 DCHECK(value == m_inputType->sanitizeUserInputValue(value) || | 1158 DCHECK(value == m_inputType->sanitizeUserInputValue(value) || |
1157 m_inputType->sanitizeUserInputValue(value).isEmpty()); | 1159 m_inputType->sanitizeUserInputValue(value).isEmpty()); |
1158 | 1160 |
1159 DCHECK(!value.isNull()); | 1161 DCHECK(!value.isNull()); |
| 1162 setValueBeforeFirstUserEditIfNotSet(); |
1160 m_nonAttributeValue = value; | 1163 m_nonAttributeValue = value; |
1161 m_hasDirtyValue = true; | 1164 m_hasDirtyValue = true; |
1162 m_needsToUpdateViewValue = false; | 1165 m_needsToUpdateViewValue = false; |
| 1166 checkIfValueWasReverted(value); |
1163 | 1167 |
1164 // Input event is fired by the Node::defaultEventHandler for editable | 1168 // Input event is fired by the Node::defaultEventHandler for editable |
1165 // controls. | 1169 // controls. |
1166 if (!isTextField()) | 1170 if (!isTextField()) |
1167 dispatchInputEvent(); | 1171 dispatchInputEvent(); |
1168 notifyFormStateChanged(); | 1172 notifyFormStateChanged(); |
1169 | 1173 |
1170 setNeedsValidityCheck(); | 1174 setNeedsValidityCheck(); |
1171 | 1175 |
1172 // Clear autofill flag (and yellow background) on user edit. | 1176 // Clear autofill flag (and yellow background) on user edit. |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1253 | 1257 |
1254 if (m_inputTypeView->shouldSubmitImplicitly(evt)) { | 1258 if (m_inputTypeView->shouldSubmitImplicitly(evt)) { |
1255 // FIXME: Remove type check. | 1259 // FIXME: Remove type check. |
1256 if (type() == InputTypeNames::search) { | 1260 if (type() == InputTypeNames::search) { |
1257 TaskRunnerHelper::get(TaskType::UserInteraction, &document()) | 1261 TaskRunnerHelper::get(TaskType::UserInteraction, &document()) |
1258 ->postTask(BLINK_FROM_HERE, WTF::bind(&HTMLInputElement::onSearch, | 1262 ->postTask(BLINK_FROM_HERE, WTF::bind(&HTMLInputElement::onSearch, |
1259 wrapPersistent(this))); | 1263 wrapPersistent(this))); |
1260 } | 1264 } |
1261 // Form submission finishes editing, just as loss of focus does. | 1265 // Form submission finishes editing, just as loss of focus does. |
1262 // If there was a change, send the event now. | 1266 // If there was a change, send the event now. |
1263 if (wasChangedSinceLastFormControlChangeEvent()) | 1267 dispatchFormControlChangeEvent(); |
1264 dispatchFormControlChangeEvent(); | |
1265 | 1268 |
1266 HTMLFormElement* formForSubmission = m_inputTypeView->formForSubmission(); | 1269 HTMLFormElement* formForSubmission = m_inputTypeView->formForSubmission(); |
1267 // Form may never have been present, or may have been destroyed by code | 1270 // Form may never have been present, or may have been destroyed by code |
1268 // responding to the change event. | 1271 // responding to the change event. |
1269 if (formForSubmission) | 1272 if (formForSubmission) |
1270 formForSubmission->submitImplicitly(evt, canTriggerImplicitSubmission()); | 1273 formForSubmission->submitImplicitly(evt, canTriggerImplicitSubmission()); |
1271 | |
1272 // We treat implicit submission is something like blur()-then-focus(). So | |
1273 // we reset the last value. crbug.com/695349 and crbug.com/700842. | |
1274 setTextAsOfLastFormControlChangeEvent(value()); | |
1275 | |
1276 evt->setDefaultHandled(); | 1274 evt->setDefaultHandled(); |
1277 return; | 1275 return; |
1278 } | 1276 } |
1279 | 1277 |
1280 if (evt->isBeforeTextInsertedEvent()) | 1278 if (evt->isBeforeTextInsertedEvent()) |
1281 m_inputTypeView->handleBeforeTextInsertedEvent( | 1279 m_inputTypeView->handleBeforeTextInsertedEvent( |
1282 static_cast<BeforeTextInsertedEvent*>(evt)); | 1280 static_cast<BeforeTextInsertedEvent*>(evt)); |
1283 | 1281 |
1284 if (evt->isMouseEvent() && evt->type() == EventTypeNames::mousedown) { | 1282 if (evt->isMouseEvent() && evt->type() == EventTypeNames::mousedown) { |
1285 m_inputTypeView->handleMouseDownEvent(toMouseEvent(evt)); | 1283 m_inputTypeView->handleMouseDownEvent(toMouseEvent(evt)); |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1883 | 1881 |
1884 bool HTMLInputElement::hasFallbackContent() const { | 1882 bool HTMLInputElement::hasFallbackContent() const { |
1885 return m_inputTypeView->hasFallbackContent(); | 1883 return m_inputTypeView->hasFallbackContent(); |
1886 } | 1884 } |
1887 | 1885 |
1888 void HTMLInputElement::setFilesFromPaths(const Vector<String>& paths) { | 1886 void HTMLInputElement::setFilesFromPaths(const Vector<String>& paths) { |
1889 return m_inputType->setFilesFromPaths(paths); | 1887 return m_inputType->setFilesFromPaths(paths); |
1890 } | 1888 } |
1891 | 1889 |
1892 } // namespace blink | 1890 } // namespace blink |
OLD | NEW |