15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
3306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/BaseMultipleFieldsDateAndTimeInputType.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSValueKeywords.h"
36e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/KeyboardEvent.h"
38d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/events/ScopedEventQueue.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLDataListElement.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLOptionElement.h"
4206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/DateTimeFieldsState.h"
4306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/FormController.h"
445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/html/shadow/ShadowElementNames.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/DateComponents.h"
495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/DateTimeFormat.h"
511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/PlatformLocale.h"
52e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/DateMath.h"
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class DateTimeFormatValidator : public DateTimeFormat::TokenHandler {
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DateTimeFormatValidator()
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        : m_hasYear(false)
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        , m_hasMonth(false)
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        , m_hasWeek(false)
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        , m_hasDay(false)
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        , m_hasAMPM(false)
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        , m_hasHour(false)
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        , m_hasMinute(false)
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        , m_hasSecond(false) { }
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void visitField(DateTimeFormat::FieldType, int) OVERRIDE FINAL;
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void visitLiteral(const String&) OVERRIDE FINAL { }
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool validateFormat(const String& format, const BaseMultipleFieldsDateAndTimeInputType&);
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_hasYear;
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_hasMonth;
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_hasWeek;
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_hasDay;
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_hasAMPM;
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_hasHour;
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_hasMinute;
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_hasSecond;
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeFormatValidator::visitField(DateTimeFormat::FieldType fieldType, int)
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    switch (fieldType) {
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeYear:
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasYear = true;
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeMonth: // Fallthrough.
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeMonthStandAlone:
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasMonth = true;
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeWeekOfYear:
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasWeek = true;
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeDayOfMonth:
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasDay = true;
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypePeriod:
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasAMPM = true;
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeHour11: // Fallthrough.
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeHour12:
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasHour = true;
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeHour23: // Fallthrough.
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeHour24:
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasHour = true;
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasAMPM = true;
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeMinute:
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasMinute = true;
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DateTimeFormat::FieldTypeSecond:
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasSecond = true;
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    default:
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool DateTimeFormatValidator::validateFormat(const String& format, const BaseMultipleFieldsDateAndTimeInputType& inputType)
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!DateTimeFormat::parse(format, *this))
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return inputType.isValidFormat(m_hasYear, m_hasMonth, m_hasWeek, m_hasDay, m_hasAMPM, m_hasHour, m_hasMinute, m_hasSecond);
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)DateTimeEditElement* BaseMultipleFieldsDateAndTimeInputType::dateTimeEditElement() const
1315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
132bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return toDateTimeEditElement(element().userAgentShadowRoot()->getElementById(ShadowElementNames::dateTimeEdit()));
1335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)SpinButtonElement* BaseMultipleFieldsDateAndTimeInputType::spinButtonElement() const
1365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
137bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return toSpinButtonElement(element().userAgentShadowRoot()->getElementById(ShadowElementNames::spinButton()));
1385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)ClearButtonElement* BaseMultipleFieldsDateAndTimeInputType::clearButtonElement() const
1415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
142bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return toClearButtonElement(element().userAgentShadowRoot()->getElementById(ShadowElementNames::clearButton()));
1435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)PickerIndicatorElement* BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorElement() const
1465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
147bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return toPickerIndicatorElement(element().userAgentShadowRoot()->getElementById(ShadowElementNames::pickerIndicator()));
1485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
150e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochinline bool BaseMultipleFieldsDateAndTimeInputType::containsFocusedShadowElement() const
151e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
152bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().userAgentShadowRoot()->contains(element().document().focusedElement());
153e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
154e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::didBlurFromControl()
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We don't need to call blur(). This function is called when control
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // lost focus.
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
160e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (containsFocusedShadowElement())
161e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
162d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EventQueueScope scope;
163d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> protector(element());
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Remove focus ring by CSS "focus" pseudo class.
165bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().setFocus(false);
1666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (SpinButtonElement *spinButton = spinButtonElement())
1676f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        spinButton->releaseCapture();
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::didFocusOnControl()
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We don't need to call focus(). This function is called when control
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // got focus.
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
175e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!containsFocusedShadowElement())
176e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Add focus ring by CSS "focus" pseudo class.
178591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // FIXME: Setting the focus flag to non-focused element is too tricky.
179bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().setFocus(true);
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::editControlValueChanged()
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
184d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> input(element());
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String oldValue = input->value();
1865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    String newValue = sanitizeValue(dateTimeEditElement()->value());
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Even if oldValue is null and newValue is "", we should assume they are same.
18806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if ((oldValue.isEmpty() && newValue.isEmpty()) || oldValue == newValue) {
189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        input->setNeedsValidityCheck();
19006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    } else {
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        input->setValueInternal(newValue, DispatchNoEvent);
19209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        input->setNeedsStyleRecalc(SubtreeStyleChange);
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        input->dispatchFormControlInputEvent();
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    input->notifyFormStateChanged();
196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    input->updateClearButtonVisibility();
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::hasCustomFocusLogic() const
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::isEditControlOwnerDisabled() const
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
206bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().isDisabledFormControl();
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::isEditControlOwnerReadOnly() const
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
211bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().isReadOnly();
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::focusAndSelectSpinButtonOwner()
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
2175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->focusIfNoFocus();
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::shouldSpinButtonRespondToMouseEvents()
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
222bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return !element().isDisabledOrReadOnly();
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::shouldSpinButtonRespondToWheelEvents()
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!shouldSpinButtonRespondToMouseEvents())
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
2305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return edit->hasFocusedField();
2315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return false;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::spinButtonStepDown()
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
2375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->stepDown();
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::spinButtonStepUp()
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
2435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->stepUp();
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid BaseMultipleFieldsDateAndTimeInputType::spinButtonDidReleaseMouseCapture(SpinButtonElement::EventDispatch eventDispatch)
247a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
24810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (eventDispatch == SpinButtonElement::EventDispatchAllowed)
24910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        element().dispatchFormControlChangeEvent();
250a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
251a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::isPickerIndicatorOwnerDisabledOrReadOnly() const
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
254bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().isDisabledOrReadOnly();
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorChooseValue(const String& value)
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
259bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (element().isValidValue(value)) {
260bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        element().setValue(value, DispatchInputAndChangeEvent);
261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = this->dateTimeEditElement();
2655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!edit)
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
2677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EventQueueScope scope;
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DateComponents date;
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned end;
270591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (date.parseDate(value, 0, end) && end == value.length())
2715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->setOnlyYearMonthDay(date);
2726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    element().dispatchFormControlChangeEvent();
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
27551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorChooseValue(double value)
27651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
27751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(std::isfinite(value) || std::isnan(value));
27851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (std::isnan(value))
27951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        element().setValue(emptyString(), DispatchInputAndChangeEvent);
28051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    else
28151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        element().setValueAsNumber(value, ASSERT_NO_EXCEPTION, DispatchInputAndChangeEvent);
28251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
28351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciElement& BaseMultipleFieldsDateAndTimeInputType::pickerOwnerElement() const
2857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return element();
2877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::setupDateTimeChooserParameters(DateTimeChooserParameters& parameters)
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
291bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().setupDateTimeChooserParameters(parameters);
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
294bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)BaseMultipleFieldsDateAndTimeInputType::BaseMultipleFieldsDateAndTimeInputType(HTMLInputElement& element)
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : BaseDateAndTimeInputType(element)
2965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_isDestroyingShadowSubtree(false)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_pickerIndicatorIsVisible(false)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_pickerIndicatorIsAlwaysVisible(false)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)BaseMultipleFieldsDateAndTimeInputType::~BaseMultipleFieldsDateAndTimeInputType()
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
304f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN)
3055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (SpinButtonElement* element = spinButtonElement())
3065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeSpinButtonOwner();
3075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (ClearButtonElement* element = clearButtonElement())
3085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeClearButtonOwner();
3095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* element = dateTimeEditElement())
3105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeEditControlOwner();
3115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (PickerIndicatorElement* element = pickerIndicatorElement())
3125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removePickerIndicatorOwner();
313f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif
314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)String BaseMultipleFieldsDateAndTimeInputType::badInputText() const
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
31851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return locale().queryString(blink::WebLocalizedString::ValidationBadInputForDateTime);
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::blur()
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
3245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->blurByOwner();
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<RenderStyle> BaseMultipleFieldsDateAndTimeInputType::customStyleForRenderer(PassRefPtr<RenderStyle> originalStyle)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EDisplay originalDisplay = originalStyle->display();
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EDisplay newDisplay = originalDisplay;
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (originalDisplay == INLINE || originalDisplay == INLINE_BLOCK)
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        newDisplay = INLINE_FLEX;
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (originalDisplay == BLOCK)
334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        newDisplay = FLEX;
335c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    TextDirection contentDirection = computedTextDirection();
336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (originalStyle->direction() == contentDirection && originalDisplay == newDisplay)
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return originalStyle;
338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<RenderStyle> style = RenderStyle::clone(originalStyle.get());
340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    style->setDirection(contentDirection);
341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    style->setDisplay(newDisplay);
342f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    style->setUnique();
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return style.release();
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::createShadowSubtree()
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
348bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(element().shadow());
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
350f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // Element must not have a renderer here, because if it did
3515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // DateTimeEditElement::customStyleForRenderer() is called in appendChild()
3525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // before the field wrapper element is created.
353f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // FIXME: This code should not depend on such craziness.
354bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(!element().renderer());
3555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
356bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    Document& document = element().document();
357bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ContainerNode* container = element().userAgentShadowRoot();
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    container->appendChild(DateTimeEditElement::create(document, *this));
360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    element().updateView();
3615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    container->appendChild(ClearButtonElement::create(document, *this));
3625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    container->appendChild(SpinButtonElement::create(document, *this));
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
364d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (RenderTheme::theme().supportsCalendarPicker(formControlType()))
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_pickerIndicatorIsAlwaysVisible = true;
366d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    container->appendChild(PickerIndicatorElement::create(document, *this));
367d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_pickerIndicatorIsVisible = true;
368d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    updatePickerIndicatorVisibility();
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::destroyShadowSubtree()
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT(!m_isDestroyingShadowSubtree);
3745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_isDestroyingShadowSubtree = true;
3755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (SpinButtonElement* element = spinButtonElement())
3765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeSpinButtonOwner();
3775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (ClearButtonElement* element = clearButtonElement())
3785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeClearButtonOwner();
3795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* element = dateTimeEditElement())
3805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeEditControlOwner();
3815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (PickerIndicatorElement* element = pickerIndicatorElement())
3825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removePickerIndicatorOwner();
38393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
38493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // If a field element has focus, set focus back to the <input> itself before
38593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // deleting the field. This prevents unnecessary focusout/blur events.
386e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (containsFocusedShadowElement())
387bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        element().focus();
38893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BaseDateAndTimeInputType::destroyShadowSubtree();
3905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_isDestroyingShadowSubtree = false;
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid BaseMultipleFieldsDateAndTimeInputType::handleFocusInEvent(Element* oldFocusedElement, FocusType type)
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = dateTimeEditElement();
3965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!edit || m_isDestroyingShadowSubtree)
397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
39809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (type == FocusTypeBackward) {
399bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if (element().document().page())
40009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            element().document().page()->focusController().advanceFocus(type);
40109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else if (type == FocusTypeNone || type == FocusTypeMouse || type == FocusTypePage) {
40202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        edit->focusByOwner(oldFocusedElement);
40306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    } else {
4045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->focusByOwner();
40506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::forwardEvent(Event* event)
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (SpinButtonElement* element = spinButtonElement()) {
4115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->forwardEvent(event);
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event->defaultHandled())
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
41502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
4175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->defaultEventHandler(event);
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::disabledAttributeChanged()
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    spinButtonElement()->releaseCapture();
4235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    clearButtonElement()->releaseCapture();
4245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
4255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->disabledStateChanged();
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::requiredAttributeChanged()
429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
4305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    clearButtonElement()->releaseCapture();
431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    updateClearButtonVisibility();
432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::handleKeydownEvent(KeyboardEvent* event)
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pickerIndicatorIsVisible
437c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        && ((event->keyIdentifier() == "Down" && event->getModifierState("Alt")) || (RenderTheme::theme().shouldOpenPickerWithF4Key() && event->keyIdentifier() == "F4"))) {
4385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (PickerIndicatorElement* element = pickerIndicatorElement())
4395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            element->openPopup();
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
44106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    } else {
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        forwardEvent(event);
44306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::hasBadInput() const
447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
4485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = dateTimeEditElement();
449bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().value().isEmpty() && edit && edit->anyEditableFieldsHaveValues();
450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)AtomicString BaseMultipleFieldsDateAndTimeInputType::localeIdentifier() const
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
454bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().computeInheritedLanguage();
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4576f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid BaseMultipleFieldsDateAndTimeInputType::editControlDidChangeValueByKeyboard()
4586f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
4596f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    element().dispatchFormControlChangeEvent();
4606f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
4616f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::minOrMaxAttributeChanged()
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
46451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    updateView();
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::readonlyAttributeChanged()
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    spinButtonElement()->releaseCapture();
4705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    clearButtonElement()->releaseCapture();
4715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
4725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->readOnlyStateChanged();
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::restoreFormControlState(const FormControlState& state)
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = dateTimeEditElement();
4785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!edit)
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DateTimeFieldsState dateTimeFieldsState = DateTimeFieldsState::restoreFormControlState(state);
4815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    edit->setValueAsDateTimeFieldsState(dateTimeFieldsState);
482bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().setValueInternal(sanitizeValue(edit->value()), DispatchNoEvent);
483926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    updateClearButtonVisibility();
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FormControlState BaseMultipleFieldsDateAndTimeInputType::saveFormControlState() const
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
4895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return edit->valueAsDateTimeFieldsState().saveFormControlState();
4905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return FormControlState();
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::setValue(const String& sanitizedValue, bool valueChanged, TextFieldEventBehavior eventBehavior)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InputType::setValue(sanitizedValue, valueChanged, eventBehavior);
4965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = dateTimeEditElement();
4975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (valueChanged || (sanitizedValue.isEmpty() && edit && edit->anyEditableFieldsHaveValues())) {
498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        element().updateView();
499bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        element().setNeedsValidityCheck();
500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::stepAttributeChanged()
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
50551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    updateView();
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::updateView()
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = dateTimeEditElement();
5115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!edit)
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
514bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    DateTimeEditElement::LayoutParameters layoutParameters(element().locale(), createStepRange(AnyIsDefaultStep));
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DateComponents date;
517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool hasValue = false;
518d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!element().suggestedValue().isNull())
519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        hasValue = parseToDateComponents(element().suggestedValue(), &date);
520d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
521d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        hasValue = parseToDateComponents(element().value(), &date);
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasValue)
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setMillisecondToDateComponents(layoutParameters.stepRange.minimum().toDouble(), &date);
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setupLayoutParameters(layoutParameters, date);
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
527323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, datetimeformatAttr, ("datetimeformat", AtomicString::ConstructFromLiteral));
528323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    edit->setAttribute(datetimeformatAttr, AtomicString(layoutParameters.dateTimeFormat), ASSERT_NO_EXCEPTION);
5295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    const AtomicString pattern = edit->fastGetAttribute(HTMLNames::patternAttr);
530926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!pattern.isEmpty())
531926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        layoutParameters.dateTimeFormat = pattern;
532926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!DateTimeFormatValidator().validateFormat(layoutParameters.dateTimeFormat, *this))
534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        layoutParameters.dateTimeFormat = layoutParameters.fallbackDateTimeFormat;
535926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasValue)
5375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->setValueAsDate(layoutParameters, date);
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
5395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->setEmptyValue(layoutParameters, date);
540926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    updateClearButtonVisibility();
541926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
542926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
543926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::valueAttributeChanged()
544926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
545bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!element().hasDirtyValue())
54651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        updateView();
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::listAttributeTargetChanged()
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updatePickerIndicatorVisibility();
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::updatePickerIndicatorVisibility()
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pickerIndicatorIsAlwaysVisible) {
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        showPickerIndicator();
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
56009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (element().hasValidDataListOptions())
56109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        showPickerIndicator();
56209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    else
56393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        hidePickerIndicator();
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::hidePickerIndicator()
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_pickerIndicatorIsVisible)
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pickerIndicatorIsVisible = false;
5715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT(pickerIndicatorElement());
5725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    pickerIndicatorElement()->setInlineStyleProperty(CSSPropertyDisplay, CSSValueNone);
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::showPickerIndicator()
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pickerIndicatorIsVisible)
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pickerIndicatorIsVisible = true;
5805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT(pickerIndicatorElement());
5815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    pickerIndicatorElement()->removeInlineStyleProperty(CSSPropertyDisplay);
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::shouldHaveSecondField(const DateComponents& date) const
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StepRange stepRange = createStepRange(AnyIsDefaultStep);
587926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return date.second() || date.millisecond()
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !stepRange.minimum().remainder(static_cast<int>(msPerMinute)).isZero()
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !stepRange.step().remainder(static_cast<int>(msPerMinute)).isZero();
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
592926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::focusAndSelectClearButtonOwner()
593926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
594bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().focus();
595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
596926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::shouldClearButtonRespondToMouseEvents()
598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
599bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return !element().isDisabledOrReadOnly() && !element().isRequired();
600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::clearValue()
603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
604d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> input(element());
605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    input->setValue("", DispatchInputAndChangeEvent);
606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    input->updateClearButtonVisibility();
607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
609926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::updateClearButtonVisibility()
610926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
6115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ClearButtonElement* clearButton = clearButtonElement();
6125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!clearButton)
613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
61509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (element().isRequired() || !dateTimeEditElement()->anyEditableFieldsHaveValues()) {
61609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        clearButton->setInlineStyleProperty(CSSPropertyOpacity, 0.0, CSSPrimitiveValue::CSS_NUMBER);
61709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        clearButton->setInlineStyleProperty(CSSPropertyPointerEvents, CSSValueNone);
61809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else {
61909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        clearButton->removeInlineStyleProperty(CSSPropertyOpacity);
62009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        clearButton->removeInlineStyleProperty(CSSPropertyPointerEvents);
62109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
622926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
624c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TextDirection BaseMultipleFieldsDateAndTimeInputType::computedTextDirection()
625c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
626c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return element().locale().isRTL() ? RTL : LTR;
627c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
628c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
6297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciAXObject* BaseMultipleFieldsDateAndTimeInputType::popupRootAXObject()
6307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
6317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (PickerIndicatorElement* picker = pickerIndicatorElement())
6327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return picker->popupRootAXObject();
6337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return 0;
6347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
6357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
636c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
639