Changeset 49104 in webkit


Ignore:
Timestamp:
Oct 5, 2009 11:14:50 AM (15 years ago)
Author:
eric@webkit.org
Message:

2009-10-05 Kent Tamura <tkent@chromium.org>

Reviewed by Darin Adler.

Implement min/max attributes, ValidityState.rangeUnderflow and
ValidityState.rangeOverflow for <input type=number> and <input type=range>
https://bugs.webkit.org/show_bug.cgi?id=29069

  • fast/forms/ValidityState-rangeOverflow-number-expected.txt: Added.
  • fast/forms/ValidityState-rangeOverflow-number.html: Added.
  • fast/forms/ValidityState-rangeOverflow-range-expected.txt: Added.
  • fast/forms/ValidityState-rangeOverflow-range.html: Added.
  • fast/forms/ValidityState-rangeUnderflow-number-expected.txt: Added.
  • fast/forms/ValidityState-rangeUnderflow-number.html: Added.
  • fast/forms/ValidityState-rangeUnderflow-range-expected.txt: Added.
  • fast/forms/ValidityState-rangeUnderflow-range.html: Added.
  • fast/forms/input-minmax-expected.txt: Added.
  • fast/forms/input-minmax.html: Added.
  • fast/forms/script-tests/ValidityState-rangeOverflow-number.js: Added.
  • fast/forms/script-tests/ValidityState-rangeOverflow-range.js: Added.
  • fast/forms/script-tests/ValidityState-rangeUnderflow-number.js: Added.
  • fast/forms/script-tests/ValidityState-rangeUnderflow-range.js: Added.
  • fast/forms/script-tests/input-minmax.js: Added.

2009-10-05 Kent Tamura <tkent@chromium.org>

Reviewed by Darin Adler.

Implement min/max attributes, ValidityState.rangeUnderflow and
ValidityState.rangeOverflow for <input type=number> and <input type=range>
https://bugs.webkit.org/show_bug.cgi?id=29069

Tests: fast/forms/ValidityState-rangeOverflow-number.html

fast/forms/ValidityState-rangeOverflow-range.html
fast/forms/ValidityState-rangeUnderflow-number.html
fast/forms/ValidityState-rangeUnderflow-range.html
fast/forms/input-minmax.html

  • html/HTMLInputElement.cpp: (WebCore::HTMLInputElement::rangeUnderflow): (WebCore::HTMLInputElement::rangeOverflow): (WebCore::HTMLInputElement::rangeMinimum): (WebCore::HTMLInputElement::rangeMaximum):
  • html/HTMLInputElement.h:
  • html/HTMLInputElement.idl:
  • html/ValidityState.cpp: (WebCore::ValidityState::rangeUnderflow): (WebCore::ValidityState::rangeOverflow):
  • html/ValidityState.h:
  • rendering/RenderSlider.cpp: (WebCore::SliderRange::SliderRange): (WebCore::SliderRange::valueFromElement):
Location:
trunk
Files:
15 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r49103 r49104  
     12009-10-05  Kent Tamura  <tkent@chromium.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        Implement min/max attributes, ValidityState.rangeUnderflow and
     6        ValidityState.rangeOverflow for <input type=number> and <input type=range>
     7        https://bugs.webkit.org/show_bug.cgi?id=29069
     8
     9        * fast/forms/ValidityState-rangeOverflow-number-expected.txt: Added.
     10        * fast/forms/ValidityState-rangeOverflow-number.html: Added.
     11        * fast/forms/ValidityState-rangeOverflow-range-expected.txt: Added.
     12        * fast/forms/ValidityState-rangeOverflow-range.html: Added.
     13        * fast/forms/ValidityState-rangeUnderflow-number-expected.txt: Added.
     14        * fast/forms/ValidityState-rangeUnderflow-number.html: Added.
     15        * fast/forms/ValidityState-rangeUnderflow-range-expected.txt: Added.
     16        * fast/forms/ValidityState-rangeUnderflow-range.html: Added.
     17        * fast/forms/input-minmax-expected.txt: Added.
     18        * fast/forms/input-minmax.html: Added.
     19        * fast/forms/script-tests/ValidityState-rangeOverflow-number.js: Added.
     20        * fast/forms/script-tests/ValidityState-rangeOverflow-range.js: Added.
     21        * fast/forms/script-tests/ValidityState-rangeUnderflow-number.js: Added.
     22        * fast/forms/script-tests/ValidityState-rangeUnderflow-range.js: Added.
     23        * fast/forms/script-tests/input-minmax.js: Added.
     24
    1252009-10-05  Kent Tamura  <tkent@chromium.org>
    226
  • trunk/WebCore/ChangeLog

    r49103 r49104  
     12009-10-05  Kent Tamura  <tkent@chromium.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        Implement min/max attributes, ValidityState.rangeUnderflow and
     6        ValidityState.rangeOverflow for <input type=number> and <input type=range>
     7        https://bugs.webkit.org/show_bug.cgi?id=29069
     8
     9        Tests: fast/forms/ValidityState-rangeOverflow-number.html
     10               fast/forms/ValidityState-rangeOverflow-range.html
     11               fast/forms/ValidityState-rangeUnderflow-number.html
     12               fast/forms/ValidityState-rangeUnderflow-range.html
     13               fast/forms/input-minmax.html
     14
     15        * html/HTMLInputElement.cpp:
     16        (WebCore::HTMLInputElement::rangeUnderflow):
     17        (WebCore::HTMLInputElement::rangeOverflow):
     18        (WebCore::HTMLInputElement::rangeMinimum):
     19        (WebCore::HTMLInputElement::rangeMaximum):
     20        * html/HTMLInputElement.h:
     21        * html/HTMLInputElement.idl:
     22        * html/ValidityState.cpp:
     23        (WebCore::ValidityState::rangeUnderflow):
     24        (WebCore::ValidityState::rangeOverflow):
     25        * html/ValidityState.h:
     26        * rendering/RenderSlider.cpp:
     27        (WebCore::SliderRange::SliderRange):
     28        (WebCore::SliderRange::valueFromElement):
     29
    1302009-10-05  Kent Tamura  <tkent@chromium.org>
    231
  • trunk/WebCore/html/HTMLInputElement.cpp

    r49051 r49104  
    231231    ASSERT_NOT_REACHED();
    232232    return false;
     233}
     234
     235bool HTMLInputElement::rangeUnderflow() const
     236{
     237    if (inputType() == NUMBER) {
     238        double min;
     239        double doubleValue;
     240        if (formStringToDouble(getAttribute(minAttr), &min) && formStringToDouble(value(), &doubleValue))
     241            return doubleValue < min;
     242    } else if (inputType() == RANGE) {
     243        double doubleValue;
     244        if (formStringToDouble(value(), &doubleValue))
     245            return doubleValue < rangeMinimum();
     246    }
     247    return false;
     248}
     249
     250bool HTMLInputElement::rangeOverflow() const
     251{
     252    if (inputType() == NUMBER) {
     253        double max;
     254        double doubleValue;
     255        if (formStringToDouble(getAttribute(maxAttr), &max) && formStringToDouble(value(), &doubleValue))
     256            return doubleValue > max;
     257    } else if (inputType() == RANGE) {
     258        double doubleValue;
     259        if (formStringToDouble(value(), &doubleValue))
     260            return doubleValue > rangeMaximum();
     261    }
     262    return false;
     263}
     264
     265double HTMLInputElement::rangeMinimum() const
     266{
     267    ASSERT(inputType() == RANGE);
     268    // The range type's "default minimum" is 0.
     269    double min = 0.0;
     270    formStringToDouble(getAttribute(minAttr), &min);
     271    return min;
     272}
     273
     274double HTMLInputElement::rangeMaximum() const
     275{
     276    ASSERT(inputType() == RANGE);
     277    // The range type's "default maximum" is 100.
     278    static const double defaultMaximum = 100.0;
     279    double max = defaultMaximum;
     280    formStringToDouble(getAttribute(maxAttr), &max);
     281    const double min = rangeMinimum();
     282
     283    if (max < min) {
     284        // A remedy for the inconsistent min/max values.
     285        // Sets the maxmimum to the default (100.0) or the minimum value.
     286        max = min < defaultMaximum ? defaultMaximum : min;
     287    }
     288    return max;
    233289}
    234290
  • trunk/WebCore/html/HTMLInputElement.h

    r49051 r49104  
    9595    virtual bool patternMismatch() const;
    9696    virtual bool tooLong() const;
     97    // For ValidityState
     98    bool rangeUnderflow() const;
     99    bool rangeOverflow() const;
     100    // Returns the minimum value for type=range.  Don't call this for other types.
     101    double rangeMinimum() const;
     102    // Returns the maximum value for type=range.  Don't call this for other types.
     103    // This always returns a value which is <= rangeMinimum().
     104    double rangeMaximum() const;
    97105
    98106    bool isTextButton() const { return m_type == SUBMIT || m_type == RESET || m_type == BUTTON; }
  • trunk/WebCore/html/HTMLInputElement.idl

    r48903 r49104  
    4343        readonly attribute HTMLElement     list;
    4444#endif
     45                 attribute [Reflect] DOMString max;
    4546                 attribute long            maxLength
    4647                     setter raises(DOMException);
     48                 attribute [Reflect] DOMString min;
    4749                 attribute boolean         multiple;
    4850                 attribute [ConvertNullToNullString] DOMString name;
  • trunk/WebCore/html/ValidityState.cpp

    r48319 r49104  
    6161}
    6262
     63bool ValidityState::rangeUnderflow()
     64{
     65    if (!control()->hasTagName(inputTag))
     66        return false;
     67    return static_cast<HTMLInputElement*>(control())->rangeUnderflow();
     68}
     69
     70bool ValidityState::rangeOverflow()
     71{
     72    if (!control()->hasTagName(inputTag))
     73        return false;
     74    return static_cast<HTMLInputElement*>(control())->rangeOverflow();
     75}
     76
    6377bool ValidityState::valid()
    6478{
  • trunk/WebCore/html/ValidityState.h

    r48959 r49104  
    4545        bool patternMismatch() { return control()->patternMismatch(); }
    4646        bool tooLong() { return control()->tooLong(); }
    47         bool rangeUnderflow() { return false; }
    48         bool rangeOverflow() { return false; }
     47        bool rangeUnderflow();
     48        bool rangeOverflow();
    4949        bool stepMismatch() { return false; }
    5050        bool customError() { return !m_customErrorMessage.isEmpty(); }
  • trunk/WebCore/rendering/RenderSlider.cpp

    r47744 r49104  
    5151    bool isIntegral;
    5252    double minimum;
    53     double maximum;
     53    double maximum;  // maximum must be >= minimum.
    5454
    5555    explicit SliderRange(HTMLInputElement*);
     
    8181    isIntegral = !equalIgnoringCase(element->getAttribute(precisionAttr), "float");
    8282
    83     // FIXME: This treats maximum strings that can't be parsed as 0, but perhaps 100 would be more appropriate.
    84     const AtomicString& maxString = element->getAttribute(maxAttr);
    85     maximum = maxString.isNull() ? 100.0 : maxString.toDouble();
    86 
    87     // If the maximum is smaller, use it as the minimum.
    88     minimum = min(element->getAttribute(minAttr).toDouble(), maximum);
     83    maximum = element->rangeMaximum();
     84    minimum = element->rangeMinimum();
    8985}
    9086
     
    9793double SliderRange::valueFromElement(HTMLInputElement* element, bool* wasClamped)
    9894{
    99     String valueString = element->value();
    100     double oldValue = valueString.isNull() ? (minimum + maximum) / 2 : valueString.toDouble();
     95    double oldValue;
     96    bool parseSuccess = HTMLInputElement::formStringToDouble(element->value(), &oldValue);
     97    if (!parseSuccess)
     98        oldValue = (minimum + maximum) / 2;
    10199    double newValue = clampValue(oldValue);
    102100
    103101    if (wasClamped)
    104         *wasClamped = valueString.isNull() || newValue != oldValue;
     102        *wasClamped = !parseSuccess || newValue != oldValue;
    105103
    106104    return newValue;
Note: See TracChangeset for help on using the changeset viewer.