Changeset 108228 in webkit


Ignore:
Timestamp:
Feb 20, 2012 2:47:55 AM (12 years ago)
Author:
commit-queue@webkit.org
Message:

[Forms] Spin buttons of number input type should fire both input and change event
https://bugs.webkit.org/show_bug.cgi?id=75067

Patch by Yosifumi Inoue <yosin@chromium.org> on 2012-02-20
Reviewed by Kent Tamura.

Source/WebCore:

This patch makes spin button in number input field clicks to fire input and change events as described in WHATWG HTML5 specification.
To implement this behavior, this patch introduces new value DispatchInputAndChangeEvent in TextFieldEventBehavior.

Test: fast/forms/number/spin-button-events.html

  • html/HTMLInputElement.cpp:

(WebCore::HTMLInputElement::stepUpFromRenderer): Pass DispatchInputAndChangeEvent instead of DispatchChangeEvent to applyStep, setValue, and setValueAsNumber.

  • html/HTMLTextFormControlElement.h: Add new enum value DispatchInputAndChangeEvent to TextFieldEventBehavior.
  • html/TextFieldInputType.cpp:

(WebCore::TextFieldInputType::setValue): Handle DispatchInputAndChangeEvent and use RefPtr for element to keep reference.

LayoutTests:

  • fast/forms/number/spin-button-events-expected.txt: Added.
  • fast/forms/number/spin-button-events.html: Added.
Location:
trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r108226 r108228  
     12012-02-20  Yosifumi Inoue  <yosin@chromium.org>
     2
     3        [Forms] Spin buttons of number input type should fire both input and change event
     4        https://bugs.webkit.org/show_bug.cgi?id=75067
     5
     6        Reviewed by Kent Tamura.
     7
     8        * fast/forms/number/spin-button-events-expected.txt: Added.
     9        * fast/forms/number/spin-button-events.html: Added.
     10
    1112012-02-20  Shinya Kawanaka  <shinyak@chromium.org>
    212
  • trunk/Source/WebCore/ChangeLog

    r108226 r108228  
     12012-02-20  Yosifumi Inoue  <yosin@chromium.org>
     2
     3        [Forms] Spin buttons of number input type should fire both input and change event
     4        https://bugs.webkit.org/show_bug.cgi?id=75067
     5
     6        Reviewed by Kent Tamura.
     7
     8        This patch makes spin button in number input field clicks to fire input and change events as described in WHATWG HTML5 specification.
     9        To implement this behavior, this patch introduces new value DispatchInputAndChangeEvent in TextFieldEventBehavior.
     10
     11        Test: fast/forms/number/spin-button-events.html
     12
     13        * html/HTMLInputElement.cpp:
     14        (WebCore::HTMLInputElement::stepUpFromRenderer): Pass DispatchInputAndChangeEvent instead of DispatchChangeEvent to applyStep, setValue, and setValueAsNumber.
     15        * html/HTMLTextFormControlElement.h: Add new enum value DispatchInputAndChangeEvent to TextFieldEventBehavior.
     16        * html/TextFieldInputType.cpp:
     17        (WebCore::TextFieldInputType::setValue): Handle DispatchInputAndChangeEvent and use RefPtr for element to keep reference.
     18
    1192012-02-20  Shinya Kawanaka  <shinyak@chromium.org>
    220
  • trunk/Source/WebCore/html/HTMLInputElement.cpp

    r108051 r108228  
    16371637        if (current > m_inputType->maximum() - nextDiff)
    16381638            current = m_inputType->maximum() - nextDiff;
    1639         setValueAsNumber(current, ec, DispatchChangeEvent);
     1639        setValueAsNumber(current, ec, DispatchInputAndChangeEvent);
    16401640    }
    16411641    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()), DispatchChangeEvent);
     1642        setValue(m_inputType->serialize(sign > 0 ? m_inputType->minimum() : m_inputType->maximum()), DispatchInputAndChangeEvent);
    16431643    else {
    16441644        ExceptionCode ec;
     
    16601660                newValue = m_inputType->maximum();
    16611661
    1662             setValueAsNumber(newValue, ec, n == 1 || n == -1 ? DispatchChangeEvent : DispatchNoEvent);
     1662            setValueAsNumber(newValue, ec, n == 1 || n == -1 ? DispatchInputAndChangeEvent : DispatchNoEvent);
    16631663            current = newValue;
    16641664            if (n > 1)
    1665                 applyStep(n - 1, AnyIsDefaultStep, DispatchChangeEvent, ec);
     1665                applyStep(n - 1, AnyIsDefaultStep, DispatchInputAndChangeEvent, ec);
    16661666            else if (n < -1)
    1667                 applyStep(n + 1, AnyIsDefaultStep, DispatchChangeEvent, ec);
     1667                applyStep(n + 1, AnyIsDefaultStep, DispatchInputAndChangeEvent, ec);
    16681668        } else
    1669             applyStep(n, AnyIsDefaultStep, DispatchChangeEvent, ec);
     1669            applyStep(n, AnyIsDefaultStep, DispatchInputAndChangeEvent, ec);
    16701670    }
    16711671}
  • trunk/Source/WebCore/html/HTMLTextFormControlElement.h

    r108051 r108228  
    3535
    3636enum TextFieldSelectionDirection { SelectionHasNoDirection, SelectionHasForwardDirection, SelectionHasBackwardDirection };
    37 enum TextFieldEventBehavior { DispatchNoEvent, DispatchChangeEvent };
     37enum TextFieldEventBehavior { DispatchNoEvent, DispatchChangeEvent, DispatchInputAndChangeEvent };
    3838
    3939class HTMLTextFormControlElement : public HTMLFormControlElementWithState {
  • trunk/Source/WebCore/html/TextFieldInputType.cpp

    r108051 r108228  
    8181void TextFieldInputType::setValue(const String& sanitizedValue, bool valueChanged, TextFieldEventBehavior eventBehavior)
    8282{
     83    // Grab this input element to keep reference even if JS event handler
     84    // changes input type.
     85    RefPtr<HTMLInputElement> input(element());
     86
    8387    // We don't ask InputType::setValue to dispatch events because
    8488    // TextFieldInputType dispatches events different way from InputType.
     
    8690
    8791    if (valueChanged)
    88         element()->updateInnerTextValue();
     92        input->updateInnerTextValue();
    8993
    9094    unsigned max = visibleValue().length();
    91     if (element()->focused())
    92         element()->setSelectionRange(max, max);
     95    if (input->focused())
     96        input->setSelectionRange(max, max);
    9397    else
    94         element()->cacheSelectionInResponseToSetValue(max);
     98        input->cacheSelectionInResponseToSetValue(max);
    9599
    96100    if (!valueChanged)
    97101        return;
    98102
    99     if (eventBehavior != DispatchNoEvent) {
     103    switch (eventBehavior) {
     104    case DispatchChangeEvent:
    100105        // If the user is still editing this field, dispatch an input event rather than a change event.
    101106        // The change event will be dispatched when editing finishes.
    102         if (element()->focused())
    103             element()->dispatchFormControlInputEvent();
     107        if (input->focused())
     108            input->dispatchFormControlInputEvent();
    104109        else
    105             element()->dispatchFormControlChangeEvent();
     110            input->dispatchFormControlChangeEvent();
     111        break;
     112
     113    case DispatchInputAndChangeEvent: {
     114        input->dispatchFormControlInputEvent();
     115        input->dispatchFormControlChangeEvent();
     116        break;
     117    }
     118
     119    case DispatchNoEvent:
     120        break;
    106121    }
    107122
    108123    // FIXME: Why do we do this when eventBehavior == DispatchNoEvent
    109     if (!element()->focused() || eventBehavior == DispatchNoEvent)
    110         element()->setTextAsOfLastFormControlChangeEvent(sanitizedValue);
     124    if (!input->focused() || eventBehavior == DispatchNoEvent)
     125        input->setTextAsOfLastFormControlChangeEvent(sanitizedValue);
    111126}
    112127
Note: See TracChangeset for help on using the changeset viewer.