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)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
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;
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DateComponents date;
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned end;
269591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (date.parseDate(value, 0, end) && end == value.length())
2705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->setOnlyYearMonthDay(date);
2716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    element().dispatchFormControlChangeEvent();
272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
27451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorChooseValue(double value)
27551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
27651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(std::isfinite(value) || std::isnan(value));
27751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (std::isnan(value))
27851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        element().setValue(emptyString(), DispatchInputAndChangeEvent);
27951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    else
28051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        element().setValueAsNumber(value, ASSERT_NO_EXCEPTION, DispatchInputAndChangeEvent);
28151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
28251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::setupDateTimeChooserParameters(DateTimeChooserParameters& parameters)
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
285bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().setupDateTimeChooserParameters(parameters);
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
288bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)BaseMultipleFieldsDateAndTimeInputType::BaseMultipleFieldsDateAndTimeInputType(HTMLInputElement& element)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : BaseDateAndTimeInputType(element)
2905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_isDestroyingShadowSubtree(false)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_pickerIndicatorIsVisible(false)
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_pickerIndicatorIsAlwaysVisible(false)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)BaseMultipleFieldsDateAndTimeInputType::~BaseMultipleFieldsDateAndTimeInputType()
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
298f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN)
2995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (SpinButtonElement* element = spinButtonElement())
3005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeSpinButtonOwner();
3015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (ClearButtonElement* element = clearButtonElement())
3025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeClearButtonOwner();
3035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* element = dateTimeEditElement())
3045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeEditControlOwner();
3055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (PickerIndicatorElement* element = pickerIndicatorElement())
3065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removePickerIndicatorOwner();
307f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)String BaseMultipleFieldsDateAndTimeInputType::badInputText() const
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
31251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return locale().queryString(blink::WebLocalizedString::ValidationBadInputForDateTime);
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::blur()
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
3185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->blurByOwner();
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<RenderStyle> BaseMultipleFieldsDateAndTimeInputType::customStyleForRenderer(PassRefPtr<RenderStyle> originalStyle)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
323926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EDisplay originalDisplay = originalStyle->display();
324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EDisplay newDisplay = originalDisplay;
325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (originalDisplay == INLINE || originalDisplay == INLINE_BLOCK)
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        newDisplay = INLINE_FLEX;
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (originalDisplay == BLOCK)
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        newDisplay = FLEX;
329bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    TextDirection contentDirection = element().locale().isRTL() ? RTL : LTR;
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (originalStyle->direction() == contentDirection && originalDisplay == newDisplay)
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return originalStyle;
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<RenderStyle> style = RenderStyle::clone(originalStyle.get());
334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    style->setDirection(contentDirection);
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    style->setDisplay(newDisplay);
336f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    style->setUnique();
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return style.release();
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::createShadowSubtree()
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
342bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(element().shadow());
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
344f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // Element must not have a renderer here, because if it did
3455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // DateTimeEditElement::customStyleForRenderer() is called in appendChild()
3465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // before the field wrapper element is created.
347f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // FIXME: This code should not depend on such craziness.
348bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(!element().renderer());
3495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
350bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    Document& document = element().document();
351bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ContainerNode* container = element().userAgentShadowRoot();
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    container->appendChild(DateTimeEditElement::create(document, *this));
354d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    element().updateView();
3555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    container->appendChild(ClearButtonElement::create(document, *this));
3565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    container->appendChild(SpinButtonElement::create(document, *this));
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (RenderTheme::theme().supportsCalendarPicker(formControlType()))
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_pickerIndicatorIsAlwaysVisible = true;
360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    container->appendChild(PickerIndicatorElement::create(document, *this));
361d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_pickerIndicatorIsVisible = true;
362d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    updatePickerIndicatorVisibility();
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::destroyShadowSubtree()
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT(!m_isDestroyingShadowSubtree);
3685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_isDestroyingShadowSubtree = true;
3695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (SpinButtonElement* element = spinButtonElement())
3705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeSpinButtonOwner();
3715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (ClearButtonElement* element = clearButtonElement())
3725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeClearButtonOwner();
3735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* element = dateTimeEditElement())
3745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removeEditControlOwner();
3755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (PickerIndicatorElement* element = pickerIndicatorElement())
3765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->removePickerIndicatorOwner();
37793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
37893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // If a field element has focus, set focus back to the <input> itself before
37993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // deleting the field. This prevents unnecessary focusout/blur events.
380e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (containsFocusedShadowElement())
381bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        element().focus();
38293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BaseDateAndTimeInputType::destroyShadowSubtree();
3845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_isDestroyingShadowSubtree = false;
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::handleFocusEvent(Element* oldFocusedElement, FocusType type)
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = dateTimeEditElement();
3905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!edit || m_isDestroyingShadowSubtree)
391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
39209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (type == FocusTypeBackward) {
393bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if (element().document().page())
39409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            element().document().page()->focusController().advanceFocus(type);
39509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else if (type == FocusTypeNone || type == FocusTypeMouse || type == FocusTypePage) {
39602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        edit->focusByOwner(oldFocusedElement);
39706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    } else {
3985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->focusByOwner();
39906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::forwardEvent(Event* event)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (SpinButtonElement* element = spinButtonElement()) {
4055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        element->forwardEvent(event);
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event->defaultHandled())
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
40902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
4115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->defaultEventHandler(event);
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::disabledAttributeChanged()
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    spinButtonElement()->releaseCapture();
4175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    clearButtonElement()->releaseCapture();
4185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
4195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->disabledStateChanged();
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
422926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::requiredAttributeChanged()
423926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
4245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    clearButtonElement()->releaseCapture();
425926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    updateClearButtonVisibility();
426926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::handleKeydownEvent(KeyboardEvent* event)
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pickerIndicatorIsVisible
431c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        && ((event->keyIdentifier() == "Down" && event->getModifierState("Alt")) || (RenderTheme::theme().shouldOpenPickerWithF4Key() && event->keyIdentifier() == "F4"))) {
4325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (PickerIndicatorElement* element = pickerIndicatorElement())
4335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            element->openPopup();
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
43506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    } else {
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        forwardEvent(event);
43706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::hasBadInput() const
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
4425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = dateTimeEditElement();
443bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().value().isEmpty() && edit && edit->anyEditableFieldsHaveValues();
444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)AtomicString BaseMultipleFieldsDateAndTimeInputType::localeIdentifier() const
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
448bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().computeInheritedLanguage();
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid BaseMultipleFieldsDateAndTimeInputType::editControlDidChangeValueByKeyboard()
4526f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
4536f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    element().dispatchFormControlChangeEvent();
4546f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
4556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::minOrMaxAttributeChanged()
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
45851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    updateView();
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::readonlyAttributeChanged()
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    spinButtonElement()->releaseCapture();
4645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    clearButtonElement()->releaseCapture();
4655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
4665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->readOnlyStateChanged();
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::restoreFormControlState(const FormControlState& state)
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = dateTimeEditElement();
4725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!edit)
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DateTimeFieldsState dateTimeFieldsState = DateTimeFieldsState::restoreFormControlState(state);
4755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    edit->setValueAsDateTimeFieldsState(dateTimeFieldsState);
476bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().setValueInternal(sanitizeValue(edit->value()), DispatchNoEvent);
477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    updateClearButtonVisibility();
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FormControlState BaseMultipleFieldsDateAndTimeInputType::saveFormControlState() const
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (DateTimeEditElement* edit = dateTimeEditElement())
4835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return edit->valueAsDateTimeFieldsState().saveFormControlState();
4845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return FormControlState();
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::setValue(const String& sanitizedValue, bool valueChanged, TextFieldEventBehavior eventBehavior)
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InputType::setValue(sanitizedValue, valueChanged, eventBehavior);
4905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = dateTimeEditElement();
4915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (valueChanged || (sanitizedValue.isEmpty() && edit && edit->anyEditableFieldsHaveValues())) {
492d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        element().updateView();
493bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        element().setNeedsValidityCheck();
494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::shouldUseInputMethod() const
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::stepAttributeChanged()
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
50451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    updateView();
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::updateView()
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DateTimeEditElement* edit = dateTimeEditElement();
5105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!edit)
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
513bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    DateTimeEditElement::LayoutParameters layoutParameters(element().locale(), createStepRange(AnyIsDefaultStep));
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DateComponents date;
516d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool hasValue = false;
517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!element().suggestedValue().isNull())
518d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        hasValue = parseToDateComponents(element().suggestedValue(), &date);
519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
520d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        hasValue = parseToDateComponents(element().value(), &date);
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasValue)
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setMillisecondToDateComponents(layoutParameters.stepRange.minimum().toDouble(), &date);
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setupLayoutParameters(layoutParameters, date);
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
526323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, datetimeformatAttr, ("datetimeformat", AtomicString::ConstructFromLiteral));
527323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    edit->setAttribute(datetimeformatAttr, AtomicString(layoutParameters.dateTimeFormat), ASSERT_NO_EXCEPTION);
5285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    const AtomicString pattern = edit->fastGetAttribute(HTMLNames::patternAttr);
529926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!pattern.isEmpty())
530926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        layoutParameters.dateTimeFormat = pattern;
531926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
532926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!DateTimeFormatValidator().validateFormat(layoutParameters.dateTimeFormat, *this))
533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        layoutParameters.dateTimeFormat = layoutParameters.fallbackDateTimeFormat;
534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasValue)
5365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->setValueAsDate(layoutParameters, date);
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
5385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        edit->setEmptyValue(layoutParameters, date);
539926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    updateClearButtonVisibility();
540926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
541926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
542926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::valueAttributeChanged()
543926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
544bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!element().hasDirtyValue())
54551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        updateView();
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::listAttributeTargetChanged()
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updatePickerIndicatorVisibility();
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::updatePickerIndicatorVisibility()
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pickerIndicatorIsAlwaysVisible) {
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        showPickerIndicator();
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
55909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (element().hasValidDataListOptions())
56009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        showPickerIndicator();
56109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    else
56293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        hidePickerIndicator();
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::hidePickerIndicator()
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_pickerIndicatorIsVisible)
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pickerIndicatorIsVisible = false;
5705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT(pickerIndicatorElement());
5715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    pickerIndicatorElement()->setInlineStyleProperty(CSSPropertyDisplay, CSSValueNone);
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::showPickerIndicator()
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pickerIndicatorIsVisible)
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pickerIndicatorIsVisible = true;
5795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT(pickerIndicatorElement());
5805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    pickerIndicatorElement()->removeInlineStyleProperty(CSSPropertyDisplay);
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::shouldHaveSecondField(const DateComponents& date) const
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StepRange stepRange = createStepRange(AnyIsDefaultStep);
586926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return date.second() || date.millisecond()
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !stepRange.minimum().remainder(static_cast<int>(msPerMinute)).isZero()
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !stepRange.step().remainder(static_cast<int>(msPerMinute)).isZero();
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
591926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::focusAndSelectClearButtonOwner()
592926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
593bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().focus();
594926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
596926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool BaseMultipleFieldsDateAndTimeInputType::shouldClearButtonRespondToMouseEvents()
597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
598bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return !element().isDisabledOrReadOnly() && !element().isRequired();
599926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::clearValue()
602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
603d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> input(element());
604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    input->setValue("", DispatchInputAndChangeEvent);
605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    input->updateClearButtonVisibility();
606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void BaseMultipleFieldsDateAndTimeInputType::updateClearButtonVisibility()
609926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
6105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ClearButtonElement* clearButton = clearButtonElement();
6115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!clearButton)
612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
61409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (element().isRequired() || !dateTimeEditElement()->anyEditableFieldsHaveValues()) {
61509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        clearButton->setInlineStyleProperty(CSSPropertyOpacity, 0.0, CSSPrimitiveValue::CSS_NUMBER);
61609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        clearButton->setInlineStyleProperty(CSSPropertyPointerEvents, CSSValueNone);
61709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else {
61809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        clearButton->removeInlineStyleProperty(CSSPropertyOpacity);
61909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        clearButton->removeInlineStyleProperty(CSSPropertyPointerEvents);
62009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
621926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
622926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
626