Changeset 94658 in webkit


Ignore:
Timestamp:
Sep 7, 2011 3:07:10 AM (13 years ago)
Author:
rniwa@webkit.org
Message:

Change event is not fired for input[type=number] when the user reverts a change made by script
https://bugs.webkit.org/show_bug.cgi?id=67697

Reviewed by Kent Tamura.

Source/WebCore:

The bug was caused by HTMLInputElement::setValue not calling setTextAsOfLastFormControlChangeEvent
for text fields other than type=text.

Also fixed a that stepUpFromRenderer does not call setTextAsOfLastFormControlChangeEvent at appropriate
timing due to setValueAsNumber always passing sendChangeEvent=false to setValue by propagating values
through setValueAsNumber and applyStep. This refactoring allows us to remove calls to dispatch* in
stepUpFromRenderer because they're now called in setValueAsNumber or applyStep.

Test: fast/forms/number-input-changeevent.html

  • html/BaseDateAndTimeInputType.cpp:

(WebCore::BaseDateAndTimeInputType::setValueAsNumber):

  • html/BaseDateAndTimeInputType.h:
  • html/HTMLInputElement.cpp:

(WebCore::HTMLInputElement::applyStep):
(WebCore::HTMLInputElement::stepUp):
(WebCore::HTMLInputElement::stepDown):
(WebCore::HTMLInputElement::setValue):
(WebCore::HTMLInputElement::setValueAsNumber):
(WebCore::HTMLInputElement::stepUpFromRenderer):

  • html/HTMLInputElement.h:
  • html/InputType.cpp:

(WebCore::InputType::setValueAsNumber):

  • html/InputType.h:
  • html/NumberInputType.cpp:

(WebCore::NumberInputType::setValueAsNumber):

  • html/NumberInputType.h:
  • html/RangeInputType.cpp:

(WebCore::RangeInputType::setValueAsNumber):
(WebCore::RangeInputType::handleKeydownEvent):

  • html/RangeInputType.h:

LayoutTests:

Add a regression test to ensure WebKit fires change event when the user reverts a change made by script.

  • fast/forms/number-input-changeevent-expected.txt: Added.
  • fast/forms/number-input-changeevent.html: Added.
Location:
trunk
Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r94654 r94658  
     12011-09-07  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        Change event is not fired for input[type=number] when the user reverts a change made by script
     4        https://bugs.webkit.org/show_bug.cgi?id=67697
     5
     6        Reviewed by Kent Tamura.
     7
     8        Add a regression test to ensure WebKit fires change event when the user reverts a change made by script.
     9
     10        * fast/forms/number-input-changeevent-expected.txt: Added.
     11        * fast/forms/number-input-changeevent.html: Added.
     12
    1132011-09-07  Csaba Osztrogonác  <ossy@webkit.org>
    214
  • trunk/Source/WebCore/ChangeLog

    r94657 r94658  
     12011-09-07  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        Change event is not fired for input[type=number] when the user reverts a change made by script
     4        https://bugs.webkit.org/show_bug.cgi?id=67697
     5
     6        Reviewed by Kent Tamura.
     7
     8        The bug was caused by HTMLInputElement::setValue not calling setTextAsOfLastFormControlChangeEvent
     9        for text fields other than type=text.
     10
     11        Also fixed a that stepUpFromRenderer does not call setTextAsOfLastFormControlChangeEvent at appropriate
     12        timing due to setValueAsNumber always passing sendChangeEvent=false to setValue by propagating values
     13        through setValueAsNumber and applyStep. This refactoring allows us to remove calls to dispatch* in
     14        stepUpFromRenderer because they're now called in setValueAsNumber or applyStep.
     15
     16        Test: fast/forms/number-input-changeevent.html
     17
     18        * html/BaseDateAndTimeInputType.cpp:
     19        (WebCore::BaseDateAndTimeInputType::setValueAsNumber):
     20        * html/BaseDateAndTimeInputType.h:
     21        * html/HTMLInputElement.cpp:
     22        (WebCore::HTMLInputElement::applyStep):
     23        (WebCore::HTMLInputElement::stepUp):
     24        (WebCore::HTMLInputElement::stepDown):
     25        (WebCore::HTMLInputElement::setValue):
     26        (WebCore::HTMLInputElement::setValueAsNumber):
     27        (WebCore::HTMLInputElement::stepUpFromRenderer):
     28        * html/HTMLInputElement.h:
     29        * html/InputType.cpp:
     30        (WebCore::InputType::setValueAsNumber):
     31        * html/InputType.h:
     32        * html/NumberInputType.cpp:
     33        (WebCore::NumberInputType::setValueAsNumber):
     34        * html/NumberInputType.h:
     35        * html/RangeInputType.cpp:
     36        (WebCore::RangeInputType::setValueAsNumber):
     37        (WebCore::RangeInputType::handleKeydownEvent):
     38        * html/RangeInputType.h:
     39
    1402011-09-07  Antti Koivisto  <antti@apple.com>
    241
  • trunk/Source/WebCore/html/BaseDateAndTimeInputType.cpp

    r85382 r94658  
    6666}
    6767
    68 void BaseDateAndTimeInputType::setValueAsNumber(double newValue, ExceptionCode&) const
    69 {
    70     element()->setValue(serialize(newValue));
     68void BaseDateAndTimeInputType::setValueAsNumber(double newValue, bool sendChangeEvent, ExceptionCode&) const
     69{
     70    element()->setValue(serialize(newValue), sendChangeEvent);
    7171}
    7272
  • trunk/Source/WebCore/html/BaseDateAndTimeInputType.h

    r85382 r94658  
    5353    virtual void setValueAsDate(double, ExceptionCode&) const;
    5454    virtual double valueAsNumber() const;
    55     virtual void setValueAsNumber(double, ExceptionCode&) const;
     55    virtual void setValueAsNumber(double, bool sendChangeEvent, ExceptionCode&) const;
    5656    virtual bool typeMismatchFor(const String&) const;
    5757    virtual bool typeMismatch() const;
  • trunk/Source/WebCore/html/HTMLInputElement.cpp

    r94639 r94658  
    389389}
    390390
    391 void HTMLInputElement::applyStep(double count, AnyStepHandling anyStepHandling, ExceptionCode& ec)
     391void HTMLInputElement::applyStep(double count, AnyStepHandling anyStepHandling, bool sendChangeEvent, ExceptionCode& ec)
    392392{
    393393    double step;
     
    429429        newValue = m_inputType->maximum();
    430430
    431     setValueAsNumber(newValue, ec);
     431    setValueAsNumber(newValue, ec, sendChangeEvent);
    432432
    433433    if (AXObjectCache::accessibilityEnabled())
     
    456456void HTMLInputElement::stepUp(int n, ExceptionCode& ec)
    457457{
    458     applyStep(n, RejectAny, ec);
     458    bool sendChangeEvent = false;
     459    applyStep(n, RejectAny, sendChangeEvent, ec);
    459460}
    460461
    461462void HTMLInputElement::stepDown(int n, ExceptionCode& ec)
    462463{
    463     applyStep(-n, RejectAny, ec);
     464    bool sendChangeEvent = false;
     465    applyStep(-n, RejectAny, sendChangeEvent, ec);
    464466}
    465467
     
    11181120    }
    11191121
    1120     if (isText() && (!focused() || !sendChangeEvent))
     1122    if (isTextField() && (!focused() || !sendChangeEvent))
    11211123        setTextAsOfLastFormControlChangeEvent(value);
    11221124
     
    11451147}
    11461148
    1147 void HTMLInputElement::setValueAsNumber(double newValue, ExceptionCode& ec)
     1149void HTMLInputElement::setValueAsNumber(double newValue, ExceptionCode& ec, bool sendChangeEvent)
    11481150{
    11491151    if (!isfinite(newValue)) {
     
    11511153        return;
    11521154    }
    1153     m_inputType->setValueAsNumber(newValue, ec);
     1155    m_inputType->setValueAsNumber(newValue, sendChangeEvent, ec);
    11541156}
    11551157
     
    16291631    String currentStringValue = value();
    16301632    double current = m_inputType->parseToDouble(currentStringValue, nan);
     1633    const bool sendChangeEvent = true;
    16311634    if (!isfinite(current)) {
    16321635        ExceptionCode ec;
     
    16371640        if (current > m_inputType->maximum() - nextDiff)
    16381641            current = m_inputType->maximum() - nextDiff;
    1639         setValueAsNumber(current, ec);
     1642        setValueAsNumber(current, ec, sendChangeEvent);
    16401643    }
    16411644    if ((sign > 0 && current < m_inputType->minimum()) || (sign < 0 && current > m_inputType->maximum()))
    1642         setValue(m_inputType->serialize(sign > 0 ? m_inputType->minimum() : m_inputType->maximum()));
     1645        setValue(m_inputType->serialize(sign > 0 ? m_inputType->minimum() : m_inputType->maximum()), sendChangeEvent);
    16431646    else {
    16441647        ExceptionCode ec;
     
    16601663                newValue = m_inputType->maximum();
    16611664
    1662             setValueAsNumber(newValue, ec);
     1665            setValueAsNumber(newValue, ec, n == 1 || n == -1);
    16631666            current = newValue;
    16641667            if (n > 1)
    1665                 applyStep(n - 1, AnyIsDefaultStep, ec);
     1668                applyStep(n - 1, AnyIsDefaultStep, sendChangeEvent, ec);
    16661669            else if (n < -1)
    1667                 applyStep(n + 1, AnyIsDefaultStep, ec);
     1670                applyStep(n + 1, AnyIsDefaultStep, sendChangeEvent, ec);
    16681671        } else
    1669             applyStep(n, AnyIsDefaultStep, ec);
    1670     }
    1671 
    1672     if (currentStringValue != value()) {
    1673         if (m_inputType->isRangeControl())
    1674             dispatchFormControlChangeEvent();
    1675         else
    1676             dispatchFormControlInputEvent();
     1672            applyStep(n, AnyIsDefaultStep, sendChangeEvent, ec);
    16771673    }
    16781674}
  • trunk/Source/WebCore/html/HTMLInputElement.h

    r94639 r94658  
    161161
    162162    double valueAsNumber() const;
    163     void setValueAsNumber(double, ExceptionCode&);
     163    void setValueAsNumber(double, ExceptionCode&, bool sendChangeEvent = false);
    164164
    165165    virtual String placeholder() const;
     
    327327
    328328    // Helper for stepUp()/stepDown().  Adds step value * count to the current value.
    329     void applyStep(double count, AnyStepHandling, ExceptionCode&);
     329    void applyStep(double count, AnyStepHandling, bool sendChangeEvent, ExceptionCode&);
    330330    double alignValueForStep(double value, double step, unsigned currentDecimalPlaces, unsigned stepDecimalPlaces);
    331331
  • trunk/Source/WebCore/html/InputType.cpp

    r94639 r94658  
    183183}
    184184
    185 void InputType::setValueAsNumber(double, ExceptionCode& ec) const
     185void InputType::setValueAsNumber(double, bool, ExceptionCode& ec) const
    186186{
    187187    ec = INVALID_STATE_ERR;
  • trunk/Source/WebCore/html/InputType.h

    r94639 r94658  
    127127    virtual void setValueAsDate(double, ExceptionCode&) const;
    128128    virtual double valueAsNumber() const;
    129     virtual void setValueAsNumber(double, ExceptionCode&) const;
     129    virtual void setValueAsNumber(double, bool sendChangeEvent, ExceptionCode&) const;
    130130
    131131    // Validation functions
  • trunk/Source/WebCore/html/NumberInputType.cpp

    r94274 r94658  
    8484}
    8585
    86 void NumberInputType::setValueAsNumber(double newValue, ExceptionCode& ec) const
     86void NumberInputType::setValueAsNumber(double newValue, bool sendChangeEvent, ExceptionCode& ec) const
    8787{
    8888    if (newValue < -numeric_limits<float>::max()) {
     
    9494        return;
    9595    }
    96     element()->setValue(serialize(newValue));
     96    element()->setValue(serialize(newValue), sendChangeEvent);
    9797}
    9898
  • trunk/Source/WebCore/html/NumberInputType.h

    r92589 r94658  
    4444    virtual const AtomicString& formControlType() const;
    4545    virtual double valueAsNumber() const;
    46     virtual void setValueAsNumber(double, ExceptionCode&) const;
     46    virtual void setValueAsNumber(double, bool sendChangeEvent, ExceptionCode&) const;
    4747    virtual bool typeMismatchFor(const String&) const;
    4848    virtual bool typeMismatch() const;
  • trunk/Source/WebCore/html/RangeInputType.cpp

    r91982 r94658  
    7979}
    8080
    81 void RangeInputType::setValueAsNumber(double newValue, ExceptionCode&) const
    82 {
    83     element()->setValue(serialize(newValue));
     81void RangeInputType::setValueAsNumber(double newValue, bool sendChangeEvent, ExceptionCode&) const
     82{
     83    element()->setValue(serialize(newValue), sendChangeEvent);
    8484}
    8585
     
    221221    if (newValue != current) {
    222222        ExceptionCode ec;
    223         setValueAsNumber(newValue, ec);
     223        bool sendChangeEvent = true;
     224        setValueAsNumber(newValue, sendChangeEvent, ec);
    224225
    225226        if (AXObjectCache::accessibilityEnabled())
  • trunk/Source/WebCore/html/RangeInputType.h

    r88757 r94658  
    4747    virtual const AtomicString& formControlType() const;
    4848    virtual double valueAsNumber() const;
    49     virtual void setValueAsNumber(double, ExceptionCode&) const;
     49    virtual void setValueAsNumber(double, bool sendChangeEvent, ExceptionCode&) const;
    5050    virtual bool supportsRequired() const;
    5151    virtual bool rangeUnderflow(const String&) const;
Note: See TracChangeset for help on using the changeset viewer.