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