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