Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2011 Apple Inc. All rights reserved. | 3 * Copyright (C) 2011 Apple Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 117 | 117 |
| 118 bool RangeInputType::supportsRequired() const | 118 bool RangeInputType::supportsRequired() const |
| 119 { | 119 { |
| 120 return false; | 120 return false; |
| 121 } | 121 } |
| 122 | 122 |
| 123 StepRange RangeInputType::createStepRange(AnyStepHandling anyStepHandling) const | 123 StepRange RangeInputType::createStepRange(AnyStepHandling anyStepHandling) const |
| 124 { | 124 { |
| 125 DEFINE_STATIC_LOCAL(const StepRange::StepDescription, stepDescription, (rang eDefaultStep, rangeDefaultStepBase, rangeStepScaleFactor)); | 125 DEFINE_STATIC_LOCAL(const StepRange::StepDescription, stepDescription, (rang eDefaultStep, rangeDefaultStepBase, rangeStepScaleFactor)); |
| 126 | 126 |
| 127 const Decimal minimum = parseToNumber(element().fastGetAttribute(minAttr), r angeDefaultMinimum); | 127 const Decimal minimum = parseToNumber(element().fastGetAttribute(minAttr), S tring(), rangeDefaultMinimum); |
| 128 const Decimal maximum = ensureMaximum(parseToNumber(element().fastGetAttribu te(maxAttr), rangeDefaultMaximum), minimum, rangeDefaultMaximum); | 128 const Decimal maximum = ensureMaximum(parseToNumber(element().fastGetAttribu te(maxAttr), String(), rangeDefaultMaximum), minimum, rangeDefaultMaximum); |
| 129 | 129 |
| 130 const AtomicString& precisionValue = element().fastGetAttribute(precisionAtt r); | 130 const AtomicString& precisionValue = element().fastGetAttribute(precisionAtt r); |
| 131 if (!precisionValue.isNull()) { | 131 if (!precisionValue.isNull()) { |
| 132 const Decimal step = equalIgnoringCase(precisionValue, "float") ? Decima l::nan() : 1; | 132 const Decimal step = equalIgnoringCase(precisionValue, "float") ? Decima l::nan() : 1; |
|
yosin_UTC9
2013/11/25 01:26:41
BTW, Can we stop supporting precsion="float"? If s
tkent
2013/11/25 01:36:33
We have UseCounter for precision attribute. We ca
| |
| 133 return StepRange(minimum, minimum, maximum, step, stepDescription); | 133 return StepRange(minimum, minimum, maximum, step, stepDescription); |
| 134 } | 134 } |
| 135 | 135 |
| 136 const Decimal step = StepRange::parseStep(anyStepHandling, stepDescription, element().fastGetAttribute(stepAttr)); | 136 const Decimal step = StepRange::parseStep(anyStepHandling, stepDescription, element().fastGetAttribute(stepAttr)); |
| 137 return StepRange(minimum, minimum, maximum, step, stepDescription); | 137 return StepRange(minimum, minimum, maximum, step, stepDescription); |
| 138 } | 138 } |
| 139 | 139 |
| 140 bool RangeInputType::isSteppable() const | 140 bool RangeInputType::isSteppable() const |
| 141 { | 141 { |
| 142 return true; | 142 return true; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 252 RefPtr<HTMLElement> container = SliderContainerElement::create(document); | 252 RefPtr<HTMLElement> container = SliderContainerElement::create(document); |
| 253 container->appendChild(track.release()); | 253 container->appendChild(track.release()); |
| 254 element().userAgentShadowRoot()->appendChild(container.release()); | 254 element().userAgentShadowRoot()->appendChild(container.release()); |
| 255 } | 255 } |
| 256 | 256 |
| 257 RenderObject* RangeInputType::createRenderer(RenderStyle*) const | 257 RenderObject* RangeInputType::createRenderer(RenderStyle*) const |
| 258 { | 258 { |
| 259 return new RenderSlider(&element()); | 259 return new RenderSlider(&element()); |
| 260 } | 260 } |
| 261 | 261 |
| 262 Decimal RangeInputType::parseToNumber(const String& src, const Decimal& defaultV alue) const | 262 Decimal RangeInputType::parseToNumber(const String& src, const String& alternati ve, const Decimal& defaultValue) const |
| 263 { | 263 { |
| 264 if (!alternative.isEmpty()) { | |
| 265 Decimal result = parseToDecimalForNumberType(src, Decimal::nan()); | |
| 266 if (!result.isFinite()) | |
| 267 result = parseToDecimalForNumberType(alternative, defaultValue); | |
| 268 | |
| 269 return result; | |
| 270 } | |
| 264 return parseToDecimalForNumberType(src, defaultValue); | 271 return parseToDecimalForNumberType(src, defaultValue); |
| 265 } | 272 } |
| 266 | 273 |
| 267 String RangeInputType::serialize(const Decimal& value) const | 274 String RangeInputType::serialize(const Decimal& value) const |
| 268 { | 275 { |
| 269 if (!value.isFinite()) | 276 if (!value.isFinite()) |
| 270 return String(); | 277 return String(); |
| 271 return serializeForNumberType(value); | 278 return serializeForNumberType(value); |
| 272 } | 279 } |
| 273 | 280 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 298 } | 305 } |
| 299 | 306 |
| 300 String RangeInputType::fallbackValue() const | 307 String RangeInputType::fallbackValue() const |
| 301 { | 308 { |
| 302 return serializeForNumberType(createStepRange(RejectAny).defaultValue()); | 309 return serializeForNumberType(createStepRange(RejectAny).defaultValue()); |
| 303 } | 310 } |
| 304 | 311 |
| 305 String RangeInputType::sanitizeValue(const String& proposedValue) const | 312 String RangeInputType::sanitizeValue(const String& proposedValue) const |
| 306 { | 313 { |
| 307 StepRange stepRange(createStepRange(RejectAny)); | 314 StepRange stepRange(createStepRange(RejectAny)); |
| 308 const Decimal proposedNumericValue = parseToNumber(proposedValue, stepRange. defaultValue()); | 315 const Decimal proposedNumericValue = parseToNumber(proposedValue, String(), stepRange.defaultValue()); |
| 309 return serializeForNumberType(stepRange.clampValue(proposedNumericValue)); | 316 return serializeForNumberType(stepRange.clampValue(proposedNumericValue)); |
| 310 } | 317 } |
| 311 | 318 |
| 312 bool RangeInputType::shouldRespectListAttribute() | 319 bool RangeInputType::shouldRespectListAttribute() |
| 313 { | 320 { |
| 314 return InputType::themeSupportsDataListUI(this); | 321 return InputType::themeSupportsDataListUI(this); |
| 315 } | 322 } |
| 316 | 323 |
| 317 inline SliderThumbElement* RangeInputType::sliderThumbElement() const | 324 inline SliderThumbElement* RangeInputType::sliderThumbElement() const |
| 318 { | 325 { |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 347 if (!dataList) | 354 if (!dataList) |
| 348 return; | 355 return; |
| 349 RefPtr<HTMLCollection> options = dataList->options(); | 356 RefPtr<HTMLCollection> options = dataList->options(); |
| 350 m_tickMarkValues.reserveCapacity(options->length()); | 357 m_tickMarkValues.reserveCapacity(options->length()); |
| 351 for (unsigned i = 0; i < options->length(); ++i) { | 358 for (unsigned i = 0; i < options->length(); ++i) { |
| 352 Node* node = options->item(i); | 359 Node* node = options->item(i); |
| 353 HTMLOptionElement* optionElement = toHTMLOptionElement(node); | 360 HTMLOptionElement* optionElement = toHTMLOptionElement(node); |
| 354 String optionValue = optionElement->value(); | 361 String optionValue = optionElement->value(); |
| 355 if (!element().isValidValue(optionValue)) | 362 if (!element().isValidValue(optionValue)) |
| 356 continue; | 363 continue; |
| 357 m_tickMarkValues.append(parseToNumber(optionValue, Decimal::nan())); | 364 m_tickMarkValues.append(parseToNumber(optionValue, String(), Decimal::na n())); |
| 358 } | 365 } |
| 359 m_tickMarkValues.shrinkToFit(); | 366 m_tickMarkValues.shrinkToFit(); |
| 360 nonCopyingSort(m_tickMarkValues.begin(), m_tickMarkValues.end(), decimalComp are); | 367 nonCopyingSort(m_tickMarkValues.begin(), m_tickMarkValues.end(), decimalComp are); |
| 361 } | 368 } |
| 362 | 369 |
| 363 Decimal RangeInputType::findClosestTickMarkValue(const Decimal& value) | 370 Decimal RangeInputType::findClosestTickMarkValue(const Decimal& value) |
| 364 { | 371 { |
| 365 updateTickMarkValues(); | 372 updateTickMarkValues(); |
| 366 if (!m_tickMarkValues.size()) | 373 if (!m_tickMarkValues.size()) |
| 367 return Decimal::nan(); | 374 return Decimal::nan(); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 387 right = middle; | 394 right = middle; |
| 388 } | 395 } |
| 389 const Decimal closestLeft = middle ? m_tickMarkValues[middle - 1] : Decimal: :infinity(Decimal::Negative); | 396 const Decimal closestLeft = middle ? m_tickMarkValues[middle - 1] : Decimal: :infinity(Decimal::Negative); |
| 390 const Decimal closestRight = middle != m_tickMarkValues.size() ? m_tickMarkV alues[middle] : Decimal::infinity(Decimal::Positive); | 397 const Decimal closestRight = middle != m_tickMarkValues.size() ? m_tickMarkV alues[middle] : Decimal::infinity(Decimal::Positive); |
| 391 if (closestRight - value < value - closestLeft) | 398 if (closestRight - value < value - closestLeft) |
| 392 return closestRight; | 399 return closestRight; |
| 393 return closestLeft; | 400 return closestLeft; |
| 394 } | 401 } |
| 395 | 402 |
| 396 } // namespace WebCore | 403 } // namespace WebCore |
| OLD | NEW |