Changeset 133441 in webkit


Ignore:
Timestamp:
Nov 5, 2012 12:22:02 AM (11 years ago)
Author:
tkent@chromium.org
Message:

BaseChooserOnlyDateAndTimeInputType should implement DateTimeChooserClient
https://bugs.webkit.org/show_bug.cgi?id=101038

Reviewed by Hajime Morita.

Add DateTimeChooserClient behavior to BaseChooserOnlyDateAndTimeInputType.
It means that date/time input elements without
ENABLE_INPUT_MULTIPLE_FIELDS_UI can open date/time choosers by
DOMActivate event.

This patch doesn't change behavior yet because Chromimum-Android port
intercepts user events and doesn't deliver them to date/time input
elements. <http://crbug.com/159381>

  • html/BaseChooserOnlyDateAndTimeInputType.cpp:

Add DateTimeChooserClient behavior. The code is similar to
PickerIndicatorElement.
(WebCore::BaseChooserOnlyDateAndTimeInputType::~BaseChooserOnlyDateAndTimeInputType):
Closes DateTimeChooser.
(WebCore::BaseChooserOnlyDateAndTimeInputType::handleDOMActivateEvent):
Open DateTimeChooser if

  • The element is not disabled,
  • The element is not read-only,
  • The element has a renderer,
  • This event is created by a user gesture, and
  • The element has no DateTimeChooser.

(WebCore::BaseChooserOnlyDateAndTimeInputType::detach):
Closes DateTimeChooser.
(WebCore::BaseChooserOnlyDateAndTimeInputType::didChooseValue):
Set a string value coming from a chooser to the input element.
(WebCore::BaseChooserOnlyDateAndTimeInputType::didEndChooser):
Clear m_dateTimeChooser when the chooser was closed.
(WebCore::BaseChooserOnlyDateAndTimeInputType::closeDateTimeChooser):
Requests to close the chooser.

  • html/BaseChooserOnlyDateAndTimeInputType.h:

(BaseChooserOnlyDateAndTimeInputType):

  • Implement DateTimeChooserClient
  • Add closeDateTimeChooser helper function.
  • Add detach override.
  • Add m_dateTimeChooser.
  • html/HTMLInputElement.cpp:

(WebCore::HTMLInputElement::setupDateTimeChooserParameters):
Added. The code is moved from PickerIndicatorElement.cpp in order to
share it with BaseChooserOnlyDateAndTimeInputType.

  • html/HTMLInputElement.h:

(HTMLInputElement): Declare setupDateTimeChooserParameters.

  • html/shadow/PickerIndicatorElement.cpp:

(WebCore::PickerIndicatorElement::openPopup):
Move some code to HTMLInputElement::setupDateTimeChooserParameters.

Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r133439 r133441  
     12012-11-05  Kent Tamura  <tkent@chromium.org>
     2
     3        BaseChooserOnlyDateAndTimeInputType should implement DateTimeChooserClient
     4        https://bugs.webkit.org/show_bug.cgi?id=101038
     5
     6        Reviewed by Hajime Morita.
     7
     8        Add DateTimeChooserClient behavior to BaseChooserOnlyDateAndTimeInputType.
     9        It means that date/time input elements without
     10        ENABLE_INPUT_MULTIPLE_FIELDS_UI can open date/time choosers by
     11        DOMActivate event.
     12
     13        This patch doesn't change behavior yet because Chromimum-Android port
     14        intercepts user events and doesn't deliver them to date/time input
     15        elements. <http://crbug.com/159381>
     16
     17        * html/BaseChooserOnlyDateAndTimeInputType.cpp:
     18        Add DateTimeChooserClient behavior. The code is similar to
     19        PickerIndicatorElement.
     20        (WebCore::BaseChooserOnlyDateAndTimeInputType::~BaseChooserOnlyDateAndTimeInputType):
     21        Closes DateTimeChooser.
     22        (WebCore::BaseChooserOnlyDateAndTimeInputType::handleDOMActivateEvent):
     23        Open DateTimeChooser if
     24         - The element is not disabled,
     25         - The element is not read-only,
     26         - The element has a renderer,
     27         - This event is created by a user gesture, and
     28         - The element has no DateTimeChooser.
     29        (WebCore::BaseChooserOnlyDateAndTimeInputType::detach):
     30        Closes DateTimeChooser.
     31        (WebCore::BaseChooserOnlyDateAndTimeInputType::didChooseValue):
     32        Set a string value coming from a chooser to the input element.
     33        (WebCore::BaseChooserOnlyDateAndTimeInputType::didEndChooser):
     34        Clear m_dateTimeChooser when the chooser was closed.
     35        (WebCore::BaseChooserOnlyDateAndTimeInputType::closeDateTimeChooser):
     36        Requests to close the chooser.
     37        * html/BaseChooserOnlyDateAndTimeInputType.h:
     38        (BaseChooserOnlyDateAndTimeInputType):
     39         - Implement DateTimeChooserClient
     40         - Add closeDateTimeChooser helper function.
     41         - Add detach override.
     42         - Add m_dateTimeChooser.
     43        * html/HTMLInputElement.cpp:
     44        (WebCore::HTMLInputElement::setupDateTimeChooserParameters):
     45        Added. The code is moved from PickerIndicatorElement.cpp in order to
     46        share it with BaseChooserOnlyDateAndTimeInputType.
     47        * html/HTMLInputElement.h:
     48        (HTMLInputElement): Declare setupDateTimeChooserParameters.
     49        * html/shadow/PickerIndicatorElement.cpp:
     50        (WebCore::PickerIndicatorElement::openPopup):
     51        Move some code to HTMLInputElement::setupDateTimeChooserParameters.
     52
    1532012-11-04  Julien Chaffraix  <jchaffraix@webkit.org>
    254
  • trunk/Source/WebCore/html/BaseChooserOnlyDateAndTimeInputType.cpp

    r133427 r133441  
    2828#include "BaseChooserOnlyDateAndTimeInputType.h"
    2929
     30#include "Chrome.h"
     31#include "ChromeClient.h"
     32#include "HTMLInputElement.h"
     33#include "Page.h"
     34#include "ScriptController.h"
     35
    3036namespace WebCore {
    3137
    3238BaseChooserOnlyDateAndTimeInputType::~BaseChooserOnlyDateAndTimeInputType()
    3339{
     40    closeDateTimeChooser();
    3441}
    3542
    3643void BaseChooserOnlyDateAndTimeInputType::handleDOMActivateEvent(Event*)
    3744{
    38     // FIXME: start date-time chooser. webkit.org/b/101038.
     45    if (element()->disabled() || element()->readOnly() || !element()->renderer() || !ScriptController::processingUserGesture())
     46        return;
     47
     48    if (m_dateTimeChooser)
     49        return;
     50    if (!element()->document()->page())
     51        return;
     52    Chrome* chrome = element()->document()->page()->chrome();
     53    if (!chrome)
     54        return;
     55    DateTimeChooserParameters parameters;
     56    if (!element()->setupDateTimeChooserParameters(parameters))
     57        return;
     58    m_dateTimeChooser = chrome->client()->openDateTimeChooser(this, parameters);
     59}
     60
     61void BaseChooserOnlyDateAndTimeInputType::detach()
     62{
     63    closeDateTimeChooser();
     64}
     65
     66void BaseChooserOnlyDateAndTimeInputType::didChooseValue(const String& value)
     67{
     68    element()->setValue(value, DispatchChangeEvent);
     69}
     70
     71void BaseChooserOnlyDateAndTimeInputType::didEndChooser()
     72{
     73    m_dateTimeChooser.clear();
     74}
     75
     76void BaseChooserOnlyDateAndTimeInputType::closeDateTimeChooser()
     77{
     78    if (m_dateTimeChooser)
     79        m_dateTimeChooser->endChooser();
    3980}
    4081
  • trunk/Source/WebCore/html/BaseChooserOnlyDateAndTimeInputType.h

    r133427 r133441  
    3030#include "BaseClickableWithKeyInputType.h"
    3131#include "BaseDateAndTimeInputType.h"
     32#include "DateTimeChooser.h"
     33#include "DateTimeChooserClient.h"
    3234
    3335namespace WebCore {
    3436
    35 // FIXME: This class should implement DateTimeChooserClient. webkit.org/b/101038.
    36 class BaseChooserOnlyDateAndTimeInputType : public BaseDateAndTimeInputType {
     37class BaseChooserOnlyDateAndTimeInputType : public BaseDateAndTimeInputType, public DateTimeChooserClient {
    3738protected:
    3839    BaseChooserOnlyDateAndTimeInputType(HTMLInputElement* element) : BaseDateAndTimeInputType(element) { }
     
    4041
    4142private:
     43    void closeDateTimeChooser();
     44
    4245    // InputType functions:
     46    virtual void detach() OVERRIDE;
    4347    virtual void handleDOMActivateEvent(Event*) OVERRIDE;
    4448    virtual void handleKeydownEvent(KeyboardEvent*) OVERRIDE;
     
    4650    virtual void handleKeyupEvent(KeyboardEvent*) OVERRIDE;
    4751    virtual void accessKeyAction(bool sendMouseEvents) OVERRIDE;
     52
     53    // DateTimeChooserClient functions:
     54    virtual void didChooseValue(const String&) OVERRIDE;
     55    virtual void didEndChooser() OVERRIDE;
     56
     57    RefPtr<DateTimeChooser> m_dateTimeChooser;
    4858};
    4959
  • trunk/Source/WebCore/html/HTMLInputElement.cpp

    r133275 r133441  
    3434#include "CSSPropertyNames.h"
    3535#include "CSSValueKeywords.h"
     36#include "DateTimeChooser.h"
    3637#include "Document.h"
    3738#include "EventNames.h"
     
    4142#include "FormController.h"
    4243#include "Frame.h"
     44#include "FrameView.h"
    4345#include "HTMLCollection.h"
    4446#include "HTMLDataListElement.h"
     
    19021904}
    19031905
     1906#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     1907bool HTMLInputElement::setupDateTimeChooserParameters(DateTimeChooserParameters& parameters)
     1908{
     1909    if (!document()->view())
     1910        return false;
     1911
     1912    parameters.type = type();
     1913    parameters.minimum = minimum();
     1914    parameters.maximum = maximum();
     1915    parameters.required = required();
     1916
     1917    StepRange stepRange = createStepRange(RejectAny);
     1918    if (stepRange.hasStep()) {
     1919        parameters.step = stepRange.step().toDouble();
     1920        parameters.stepBase = stepRange.stepBase().toDouble();
     1921    } else {
     1922        parameters.step = 1.0;
     1923        parameters.stepBase = 0;
     1924    }
     1925
     1926    parameters.anchorRectInRootView = document()->view()->contentsToRootView(pixelSnappedBoundingBox());
     1927    parameters.currentValue = value();
     1928    parameters.isAnchorElementRTL = computedStyle()->direction() == RTL;
     1929#if ENABLE(DATALIST_ELEMENT)
     1930    if (HTMLDataListElement* dataList = this->dataList()) {
     1931        RefPtr<HTMLCollection> options = dataList->options();
     1932        for (unsigned i = 0; HTMLOptionElement* option = toHTMLOptionElement(options->item(i)); ++i) {
     1933            if (!isValidValue(option->value()))
     1934                continue;
     1935            parameters.suggestionValues.append(sanitizeValue(option->value()));
     1936            parameters.localizedSuggestionValues.append(localizeValue(option->value()));
     1937            parameters.suggestionLabels.append(option->value() == option->label() ? String() : option->label());
     1938        }
     1939    }
     1940#endif
     1941    return true;
     1942}
     1943#endif
     1944
    19041945void HTMLInputElement::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
    19051946{
  • trunk/Source/WebCore/html/HTMLInputElement.h

    r133275 r133441  
    4242class KURL;
    4343class ListAttributeTargetObserver;
     44struct DateTimeChooserParameters;
    4445
    4546class HTMLInputElement : public HTMLTextFormControlElement, public ImageLoaderClientBase<HTMLInputElement> {
     
    292293    virtual void setRangeText(const String& replacement, unsigned start, unsigned end, const String& selectionMode, ExceptionCode&) OVERRIDE;
    293294
     295#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     296    bool setupDateTimeChooserParameters(DateTimeChooserParameters&);
     297#endif
    294298    virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE;
    295299
  • trunk/Source/WebCore/html/shadow/PickerIndicatorElement.cpp

    r133284 r133441  
    3636#include "ChromeClient.h"
    3737#include "Event.h"
    38 #include "FrameView.h"
    39 #include "HTMLDataListElement.h"
    4038#include "HTMLInputElement.h"
    41 #include "HTMLOptionElement.h"
    4239#include "Page.h"
    4340#include "RenderDetailsMarker.h"
     
    125122    if (!chrome)
    126123        return;
    127     if (!document()->view())
     124    DateTimeChooserParameters parameters;
     125    if (!hostInput()->setupDateTimeChooserParameters(parameters))
    128126        return;
    129 
    130     HTMLInputElement* input = hostInput();
    131     DateTimeChooserParameters parameters;
    132     parameters.type = input->type();
    133     parameters.minimum = input->minimum();
    134     parameters.maximum = input->maximum();
    135     parameters.required = input->required();
    136 
    137     StepRange stepRange = input->createStepRange(RejectAny);
    138     if (stepRange.hasStep()) {
    139         parameters.step = stepRange.step().toDouble();
    140         parameters.stepBase = stepRange.stepBase().toDouble();
    141     } else {
    142         parameters.step = 1.0;
    143         parameters.stepBase = 0;
    144     }
    145 
    146     parameters.anchorRectInRootView = document()->view()->contentsToRootView(hostInput()->pixelSnappedBoundingBox());
    147     parameters.currentValue = input->value();
    148     parameters.isAnchorElementRTL = input->computedStyle()->direction() == RTL;
    149     if (HTMLDataListElement* dataList = input->dataList()) {
    150         RefPtr<HTMLCollection> options = dataList->options();
    151         for (unsigned i = 0; HTMLOptionElement* option = toHTMLOptionElement(options->item(i)); ++i) {
    152             if (!input->isValidValue(option->value()))
    153                 continue;
    154             parameters.suggestionValues.append(input->sanitizeValue(option->value()));
    155             parameters.localizedSuggestionValues.append(input->localizeValue(option->value()));
    156             parameters.suggestionLabels.append(option->value() == option->label() ? String() : option->label());
    157         }
    158     }
    159127    m_chooser = chrome->client()->openDateTimeChooser(this, parameters);
    160128}
Note: See TracChangeset for help on using the changeset viewer.