| 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 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 DCHECK(m_parsingInProgress); | 382 DCHECK(m_parsingInProgress); |
| 383 DCHECK(!m_inputType); | 383 DCHECK(!m_inputType); |
| 384 DCHECK(!m_inputTypeView); | 384 DCHECK(!m_inputTypeView); |
| 385 | 385 |
| 386 const AtomicString& newTypeName = | 386 const AtomicString& newTypeName = |
| 387 InputType::normalizeTypeName(fastGetAttribute(typeAttr)); | 387 InputType::normalizeTypeName(fastGetAttribute(typeAttr)); |
| 388 m_inputType = InputType::create(*this, newTypeName); | 388 m_inputType = InputType::create(*this, newTypeName); |
| 389 m_inputTypeView = m_inputType->createView(); | 389 m_inputTypeView = m_inputType->createView(); |
| 390 String defaultValue = fastGetAttribute(valueAttr); | 390 String defaultValue = fastGetAttribute(valueAttr); |
| 391 if (m_inputType->valueMode() == ValueMode::kValue) | 391 if (m_inputType->valueMode() == ValueMode::kValue) |
| 392 m_valueIfDirty = sanitizeValue(defaultValue); | 392 m_nonAttributeValue = sanitizeValue(defaultValue); |
| 393 ensureUserAgentShadowRoot(); | 393 ensureUserAgentShadowRoot(); |
| 394 | 394 |
| 395 setNeedsWillValidateCheck(); | 395 setNeedsWillValidateCheck(); |
| 396 | 396 |
| 397 if (!defaultValue.isNull()) | 397 if (!defaultValue.isNull()) |
| 398 m_inputType->warnIfValueIsInvalid(defaultValue); | 398 m_inputType->warnIfValueIsInvalid(defaultValue); |
| 399 | 399 |
| 400 m_inputTypeView->updateView(); | 400 m_inputTypeView->updateView(); |
| 401 setTextAsOfLastFormControlChangeEvent(value()); | 401 setTextAsOfLastFormControlChangeEvent(value()); |
| 402 setChangedSinceLastFormControlChangeEvent(false); | 402 setChangedSinceLastFormControlChangeEvent(false); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 // | 434 // |
| 435 // 1. If the previous state of the element's type attribute put the value IDL | 435 // 1. If the previous state of the element's type attribute put the value IDL |
| 436 // attribute in the value mode, and the element's value is not the empty | 436 // attribute in the value mode, and the element's value is not the empty |
| 437 // string, and the new state of the element's type attribute puts the value | 437 // string, and the new state of the element's type attribute puts the value |
| 438 // IDL attribute in either the default mode or the default/on mode, then set | 438 // IDL attribute in either the default mode or the default/on mode, then set |
| 439 // the element's value content attribute to the element's value. | 439 // the element's value content attribute to the element's value. |
| 440 if (oldValueMode == ValueMode::kValue && | 440 if (oldValueMode == ValueMode::kValue && |
| 441 (newValueMode == ValueMode::kDefault || | 441 (newValueMode == ValueMode::kDefault || |
| 442 newValueMode == ValueMode::kDefaultOn)) { | 442 newValueMode == ValueMode::kDefaultOn)) { |
| 443 if (hasDirtyValue()) | 443 if (hasDirtyValue()) |
| 444 setAttribute(valueAttr, AtomicString(m_valueIfDirty)); | 444 setAttribute(valueAttr, AtomicString(m_nonAttributeValue)); |
| 445 m_valueIfDirty = String(); | 445 m_nonAttributeValue = String(); |
| 446 m_hasDirtyValue = false; | 446 m_hasDirtyValue = false; |
| 447 } | 447 } |
| 448 // 2. Otherwise, if the previous state of the element's type attribute put the | 448 // 2. Otherwise, if the previous state of the element's type attribute put the |
| 449 // value IDL attribute in any mode other than the value mode, and the new | 449 // value IDL attribute in any mode other than the value mode, and the new |
| 450 // state of the element's type attribute puts the value IDL attribute in the | 450 // state of the element's type attribute puts the value IDL attribute in the |
| 451 // value mode, then set the value of the element to the value of the value | 451 // value mode, then set the value of the element to the value of the value |
| 452 // content attribute, if there is one, or the empty string otherwise, and then | 452 // content attribute, if there is one, or the empty string otherwise, and then |
| 453 // set the control's dirty value flag to false. | 453 // set the control's dirty value flag to false. |
| 454 else if (oldValueMode != ValueMode::kValue && | 454 else if (oldValueMode != ValueMode::kValue && |
| 455 newValueMode == ValueMode::kValue) { | 455 newValueMode == ValueMode::kValue) { |
| 456 AtomicString valueString = fastGetAttribute(valueAttr); | 456 AtomicString valueString = fastGetAttribute(valueAttr); |
| 457 m_inputType->warnIfValueIsInvalid(valueString); | 457 m_inputType->warnIfValueIsInvalid(valueString); |
| 458 m_valueIfDirty = sanitizeValue(valueString); | 458 m_nonAttributeValue = sanitizeValue(valueString); |
| 459 m_hasDirtyValue = false; | 459 m_hasDirtyValue = false; |
| 460 } | 460 } |
| 461 // 3. Otherwise, if the previous state of the element's type attribute put the | 461 // 3. Otherwise, if the previous state of the element's type attribute put the |
| 462 // value IDL attribute in any mode other than the filename mode, and the new | 462 // value IDL attribute in any mode other than the filename mode, and the new |
| 463 // state of the element's type attribute puts the value IDL attribute in the | 463 // state of the element's type attribute puts the value IDL attribute in the |
| 464 // filename mode, then set the value of the element to the empty string. | 464 // filename mode, then set the value of the element to the empty string. |
| 465 else if (oldValueMode != ValueMode::kFilename && | 465 else if (oldValueMode != ValueMode::kFilename && |
| 466 newValueMode == ValueMode::kFilename) { | 466 newValueMode == ValueMode::kFilename) { |
| 467 m_valueIfDirty = String(); | 467 m_nonAttributeValue = String(); |
| 468 m_hasDirtyValue = false; | 468 m_hasDirtyValue = false; |
| 469 | 469 |
| 470 } else { | 470 } else { |
| 471 // ValueMode wasn't changed, or kDefault <-> kDefaultOn. | 471 // ValueMode wasn't changed, or kDefault <-> kDefaultOn. |
| 472 if (!hasDirtyValue()) { | 472 if (!hasDirtyValue()) { |
| 473 String defaultValue = fastGetAttribute(valueAttr); | 473 String defaultValue = fastGetAttribute(valueAttr); |
| 474 if (!defaultValue.isNull()) | 474 if (!defaultValue.isNull()) |
| 475 m_inputType->warnIfValueIsInvalid(defaultValue); | 475 m_inputType->warnIfValueIsInvalid(defaultValue); |
| 476 } | 476 } |
| 477 | 477 |
| 478 if (newValueMode == ValueMode::kValue) { | 478 if (newValueMode == ValueMode::kValue) { |
| 479 String newValue = sanitizeValue(m_valueIfDirty); | 479 String newValue = sanitizeValue(m_nonAttributeValue); |
| 480 if (!equalIgnoringNullity(newValue, m_valueIfDirty)) { | 480 if (!equalIgnoringNullity(newValue, m_nonAttributeValue)) { |
| 481 if (hasDirtyValue()) | 481 if (hasDirtyValue()) |
| 482 setValue(newValue); | 482 setValue(newValue); |
| 483 else | 483 else |
| 484 setNonDirtyValue(newValue); | 484 setNonDirtyValue(newValue); |
| 485 } | 485 } |
| 486 } | 486 } |
| 487 } | 487 } |
| 488 | 488 |
| 489 m_needsToUpdateViewValue = true; | 489 m_needsToUpdateViewValue = true; |
| 490 m_inputTypeView->updateView(); | 490 m_inputTypeView->updateView(); |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 else | 721 else |
| 722 m_autocomplete = On; | 722 m_autocomplete = On; |
| 723 } | 723 } |
| 724 } else if (name == typeAttr) { | 724 } else if (name == typeAttr) { |
| 725 updateType(); | 725 updateType(); |
| 726 } else if (name == valueAttr) { | 726 } else if (name == valueAttr) { |
| 727 // We only need to setChanged if the form is looking at the default value | 727 // We only need to setChanged if the form is looking at the default value |
| 728 // right now. | 728 // right now. |
| 729 if (!hasDirtyValue()) { | 729 if (!hasDirtyValue()) { |
| 730 if (m_inputType->valueMode() == ValueMode::kValue) { | 730 if (m_inputType->valueMode() == ValueMode::kValue) { |
| 731 m_valueIfDirty = sanitizeValue(value); | 731 m_nonAttributeValue = sanitizeValue(value); |
| 732 setTextAsOfLastFormControlChangeEvent(m_valueIfDirty); | 732 setTextAsOfLastFormControlChangeEvent(m_nonAttributeValue); |
| 733 } | 733 } |
| 734 updatePlaceholderVisibility(); | 734 updatePlaceholderVisibility(); |
| 735 setNeedsStyleRecalc( | 735 setNeedsStyleRecalc( |
| 736 SubtreeStyleChange, | 736 SubtreeStyleChange, |
| 737 StyleChangeReasonForTracing::fromAttribute(valueAttr)); | 737 StyleChangeReasonForTracing::fromAttribute(valueAttr)); |
| 738 } | 738 } |
| 739 m_needsToUpdateViewValue = true; | 739 m_needsToUpdateViewValue = true; |
| 740 setNeedsValidityCheck(); | 740 setNeedsValidityCheck(); |
| 741 m_valueAttributeWasUpdatedAfterParsing = !m_parsingInProgress; | 741 m_valueAttributeWasUpdatedAfterParsing = !m_parsingInProgress; |
| 742 m_inputType->warnIfValueIsInvalidAndElementIsVisible(value); | 742 m_inputType->warnIfValueIsInvalidAndElementIsVisible(value); |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 989 bool HTMLInputElement::sizeShouldIncludeDecoration(int& preferredSize) const { | 989 bool HTMLInputElement::sizeShouldIncludeDecoration(int& preferredSize) const { |
| 990 return m_inputTypeView->sizeShouldIncludeDecoration(defaultSize, | 990 return m_inputTypeView->sizeShouldIncludeDecoration(defaultSize, |
| 991 preferredSize); | 991 preferredSize); |
| 992 } | 992 } |
| 993 | 993 |
| 994 void HTMLInputElement::copyNonAttributePropertiesFromElement( | 994 void HTMLInputElement::copyNonAttributePropertiesFromElement( |
| 995 const Element& source) { | 995 const Element& source) { |
| 996 const HTMLInputElement& sourceElement = | 996 const HTMLInputElement& sourceElement = |
| 997 static_cast<const HTMLInputElement&>(source); | 997 static_cast<const HTMLInputElement&>(source); |
| 998 | 998 |
| 999 m_valueIfDirty = sourceElement.m_valueIfDirty; | 999 m_nonAttributeValue = sourceElement.m_nonAttributeValue; |
| 1000 m_hasDirtyValue = sourceElement.m_hasDirtyValue; | 1000 m_hasDirtyValue = sourceElement.m_hasDirtyValue; |
| 1001 setChecked(sourceElement.m_isChecked); | 1001 setChecked(sourceElement.m_isChecked); |
| 1002 m_dirtyCheckedness = sourceElement.m_dirtyCheckedness; | 1002 m_dirtyCheckedness = sourceElement.m_dirtyCheckedness; |
| 1003 m_isIndeterminate = sourceElement.m_isIndeterminate; | 1003 m_isIndeterminate = sourceElement.m_isIndeterminate; |
| 1004 m_inputType->copyNonAttributeProperties(sourceElement); | 1004 m_inputType->copyNonAttributeProperties(sourceElement); |
| 1005 | 1005 |
| 1006 HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(source); | 1006 HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(source); |
| 1007 | 1007 |
| 1008 m_needsToUpdateViewValue = true; | 1008 m_needsToUpdateViewValue = true; |
| 1009 m_inputTypeView->updateView(); | 1009 m_inputTypeView->updateView(); |
| 1010 } | 1010 } |
| 1011 | 1011 |
| 1012 String HTMLInputElement::value() const { | 1012 String HTMLInputElement::value() const { |
| 1013 switch (m_inputType->valueMode()) { | 1013 switch (m_inputType->valueMode()) { |
| 1014 case ValueMode::kFilename: { | 1014 case ValueMode::kFilename: |
| 1015 String value; | 1015 return m_inputType->valueInFilenameValueMode(); |
| 1016 // TODO(tkent): The bool return value of getTypeSpecificValue() doesn't | |
| 1017 // make sense. FileInputType::getTypeSpecificValue() always returns true. | |
| 1018 bool result = m_inputType->getTypeSpecificValue(value); | |
| 1019 DCHECK(result); | |
| 1020 return value; | |
| 1021 } | |
| 1022 case ValueMode::kDefault: | 1016 case ValueMode::kDefault: |
| 1023 return fastGetAttribute(valueAttr); | 1017 return fastGetAttribute(valueAttr); |
| 1024 case ValueMode::kDefaultOn: { | 1018 case ValueMode::kDefaultOn: { |
| 1025 AtomicString valueString = fastGetAttribute(valueAttr); | 1019 AtomicString valueString = fastGetAttribute(valueAttr); |
| 1026 return valueString.isNull() ? "on" : valueString; | 1020 return valueString.isNull() ? "on" : valueString; |
| 1027 } | 1021 } |
| 1028 case ValueMode::kValue: | 1022 case ValueMode::kValue: |
| 1029 return m_valueIfDirty; | 1023 return m_nonAttributeValue; |
| 1030 } | 1024 } |
| 1031 NOTREACHED(); | 1025 NOTREACHED(); |
| 1032 return emptyString(); | 1026 return emptyString(); |
| 1033 } | 1027 } |
| 1034 | 1028 |
| 1035 String HTMLInputElement::valueWithDefault() const { | 1029 String HTMLInputElement::valueOrDefaultLabel() const { |
| 1036 String value = this->value(); | 1030 String value = this->value(); |
| 1037 if (!value.isNull()) | 1031 if (!value.isNull()) |
| 1038 return value; | 1032 return value; |
| 1039 | 1033 return m_inputType->defaultLabel(); |
| 1040 return m_inputType->defaultValue(); | |
| 1041 } | 1034 } |
| 1042 | 1035 |
| 1043 void HTMLInputElement::setValueForUser(const String& value) { | 1036 void HTMLInputElement::setValueForUser(const String& value) { |
| 1044 // Call setValue and make it send a change event. | 1037 // Call setValue and make it send a change event. |
| 1045 setValue(value, DispatchChangeEvent); | 1038 setValue(value, DispatchChangeEvent); |
| 1046 } | 1039 } |
| 1047 | 1040 |
| 1048 const String& HTMLInputElement::suggestedValue() const { | 1041 const String& HTMLInputElement::suggestedValue() const { |
| 1049 return m_suggestedValue; | 1042 return m_suggestedValue; |
| 1050 } | 1043 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1112 | 1105 |
| 1113 if (!valueChanged) | 1106 if (!valueChanged) |
| 1114 return; | 1107 return; |
| 1115 | 1108 |
| 1116 notifyFormStateChanged(); | 1109 notifyFormStateChanged(); |
| 1117 } | 1110 } |
| 1118 | 1111 |
| 1119 void HTMLInputElement::setNonAttributeValue(const String& sanitizedValue) { | 1112 void HTMLInputElement::setNonAttributeValue(const String& sanitizedValue) { |
| 1120 // This is a common code for ValueMode::kValue. | 1113 // This is a common code for ValueMode::kValue. |
| 1121 DCHECK_EQ(m_inputType->valueMode(), ValueMode::kValue); | 1114 DCHECK_EQ(m_inputType->valueMode(), ValueMode::kValue); |
| 1122 m_valueIfDirty = sanitizedValue; | 1115 m_nonAttributeValue = sanitizedValue; |
| 1123 m_hasDirtyValue = true; | 1116 m_hasDirtyValue = true; |
| 1124 setNeedsValidityCheck(); | 1117 setNeedsValidityCheck(); |
| 1125 if (m_inputType->isSteppable()) { | 1118 if (m_inputType->isSteppable()) { |
| 1126 pseudoStateChanged(CSSSelector::PseudoInRange); | 1119 pseudoStateChanged(CSSSelector::PseudoInRange); |
| 1127 pseudoStateChanged(CSSSelector::PseudoOutOfRange); | 1120 pseudoStateChanged(CSSSelector::PseudoOutOfRange); |
| 1128 } | 1121 } |
| 1129 if (document().focusedElement() == this) | 1122 if (document().focusedElement() == this) |
| 1130 document() | 1123 document() |
| 1131 .frameHost() | 1124 .frameHost() |
| 1132 ->chromeClient() | 1125 ->chromeClient() |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1178 // File upload controls will never use this. | 1171 // File upload controls will never use this. |
| 1179 DCHECK_NE(type(), InputTypeNames::file); | 1172 DCHECK_NE(type(), InputTypeNames::file); |
| 1180 | 1173 |
| 1181 m_suggestedValue = String(); | 1174 m_suggestedValue = String(); |
| 1182 | 1175 |
| 1183 // Renderer and our event handler are responsible for sanitizing values. | 1176 // Renderer and our event handler are responsible for sanitizing values. |
| 1184 DCHECK(value == m_inputType->sanitizeUserInputValue(value) || | 1177 DCHECK(value == m_inputType->sanitizeUserInputValue(value) || |
| 1185 m_inputType->sanitizeUserInputValue(value).isEmpty()); | 1178 m_inputType->sanitizeUserInputValue(value).isEmpty()); |
| 1186 | 1179 |
| 1187 DCHECK(!value.isNull()); | 1180 DCHECK(!value.isNull()); |
| 1188 m_valueIfDirty = value; | 1181 m_nonAttributeValue = value; |
| 1189 m_hasDirtyValue = true; | 1182 m_hasDirtyValue = true; |
| 1190 m_needsToUpdateViewValue = false; | 1183 m_needsToUpdateViewValue = false; |
| 1191 | 1184 |
| 1192 // Input event is fired by the Node::defaultEventHandler for editable | 1185 // Input event is fired by the Node::defaultEventHandler for editable |
| 1193 // controls. | 1186 // controls. |
| 1194 if (!isTextField()) | 1187 if (!isTextField()) |
| 1195 dispatchInputEvent(); | 1188 dispatchInputEvent(); |
| 1196 notifyFormStateChanged(); | 1189 notifyFormStateChanged(); |
| 1197 | 1190 |
| 1198 setNeedsValidityCheck(); | 1191 setNeedsValidityCheck(); |
| (...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1958 | 1951 |
| 1959 bool HTMLInputElement::hasFallbackContent() const { | 1952 bool HTMLInputElement::hasFallbackContent() const { |
| 1960 return m_inputTypeView->hasFallbackContent(); | 1953 return m_inputTypeView->hasFallbackContent(); |
| 1961 } | 1954 } |
| 1962 | 1955 |
| 1963 void HTMLInputElement::setFilesFromPaths(const Vector<String>& paths) { | 1956 void HTMLInputElement::setFilesFromPaths(const Vector<String>& paths) { |
| 1964 return m_inputType->setFilesFromPaths(paths); | 1957 return m_inputType->setFilesFromPaths(paths); |
| 1965 } | 1958 } |
| 1966 | 1959 |
| 1967 } // namespace blink | 1960 } // namespace blink |
| OLD | NEW |