15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 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 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/shadow/DateTimeFieldElements.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/DateTimeFieldsState.h" 311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/DateComponents.h" 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/PlatformLocale.h" 33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/CurrentTime.h" 34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/DateMath.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using blink::WebLocalizedString; 391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static String queryString(WebLocalizedString::Name name) 411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 42bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return Locale::defaultLocale().queryString(name); 431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeAMPMFieldElement::DateTimeAMPMFieldElement(Document& document, FieldOwner& fieldOwner, const Vector<String>& ampmLabels) 46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeSymbolicFieldElement(document, fieldOwner, ampmLabels, 0, 1) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeAMPMFieldElement> DateTimeAMPMFieldElement::create(Document& document, FieldOwner& fieldOwner, const Vector<String>& ampmLabels) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, ampmPsuedoId, ("-webkit-datetime-edit-ampm-field", AtomicString::ConstructFromLiteral)); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<DateTimeAMPMFieldElement> field = adoptRef(new DateTimeAMPMFieldElement(document, fieldOwner, ampmLabels)); 541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) field->initialize(ampmPsuedoId, queryString(WebLocalizedString::AXAMPMFieldText)); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return field.release(); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeAMPMFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasValue()) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setAMPM(valueAsInteger() ? DateTimeFieldsState::AMPMValuePM : DateTimeFieldsState::AMPMValueAM); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setAMPM(DateTimeFieldsState::AMPMValueEmpty); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeAMPMFieldElement::setValueAsDate(const DateComponents& date) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(date.hour() >= 12 ? 1 : 0); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeAMPMFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (dateTimeFieldsState.hasAMPM()) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(dateTimeFieldsState.ampm()); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ---------------------------- 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeDayFieldElement::DateTimeDayFieldElement(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range) 82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeNumericFieldElement(document, fieldOwner, range, Range(1, 31), placeholder) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeDayFieldElement> DateTimeDayFieldElement::create(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, dayPsuedoId, ("-webkit-datetime-edit-day-field", AtomicString::ConstructFromLiteral)); 893c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch RefPtr<DateTimeDayFieldElement> field = adoptRef(new DateTimeDayFieldElement(document, fieldOwner, placeholder.isEmpty() ? "--" : placeholder, range)); 901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) field->initialize(dayPsuedoId, queryString(WebLocalizedString::AXDayOfMonthFieldText)); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return field.release(); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeDayFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setDayOfMonth(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeDayFieldElement::setValueAsDate(const DateComponents& date) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(date.monthDay()); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeDayFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!dateTimeFieldsState.hasDayOfMonth()) { 107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned value = dateTimeFieldsState.dayOfMonth(); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (range().isInRange(static_cast<int>(value))) { 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(value); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ---------------------------- 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeHourFieldElementBase::DateTimeHourFieldElementBase(Document& document, FieldOwner& fieldOwner, const Range& range, const Range& hardLimits, const Step& step) 123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeNumericFieldElement(document, fieldOwner, range, hardLimits, "--", step) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHourFieldElementBase::initialize() 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, hourPsuedoId, ("-webkit-datetime-edit-hour-field", AtomicString::ConstructFromLiteral)); 1301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) DateTimeNumericFieldElement::initialize(hourPsuedoId, queryString(WebLocalizedString::AXHourFieldText)); 131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHourFieldElementBase::setValueAsDate(const DateComponents& date) 134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setValueAsInteger(date.hour()); 136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHourFieldElementBase::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) 139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!dateTimeFieldsState.hasHour()) { 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const int hour12 = dateTimeFieldsState.hour(); 146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (hour12 < 1 || hour12 > 12) { 147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 151e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) const int hour11 = hour12 == 12 ? 0 : hour12; 152e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) const int hour23 = dateTimeFieldsState.ampm() == DateTimeFieldsState::AMPMValuePM ? hour11 + 12 : hour11; 153e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) setValueAsInteger(hour23); 154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// ---------------------------- 156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeHour11FieldElement::DateTimeHour11FieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) 158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeHourFieldElementBase(document, fieldOwner, range, Range(0, 11), step) 159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeHour11FieldElement> DateTimeHour11FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) 163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.minimum >= 0); 165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.maximum <= 23); 166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.minimum <= hour23Range.maximum); 167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Range range(0, 11); 168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (hour23Range.maximum < 12) 169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range = hour23Range; 170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (hour23Range.minimum >= 12) { 171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range.minimum = hour23Range.minimum - 12; 172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range.maximum = hour23Range.maximum - 12; 173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DateTimeHour11FieldElement> field = adoptRef(new DateTimeHour11FieldElement(document, fieldOwner, range, step)); 176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) field->initialize(); 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return field.release(); 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour11FieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!hasValue()) { 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setHour(DateTimeFieldsState::emptyValue); 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const int value = valueAsInteger(); 187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) dateTimeFieldsState.setHour(value ? value : 12); 188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour11FieldElement::setValueAsInteger(int value, EventBehavior eventBehavior) 191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) value = Range(0, 23).clampValue(value) % 12; 193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) DateTimeNumericFieldElement::setValueAsInteger(value, eventBehavior); 194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// ---------------------------- 197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeHour12FieldElement::DateTimeHour12FieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) 199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeHourFieldElementBase(document, fieldOwner, range, Range(1, 12), step) 200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeHour12FieldElement> DateTimeHour12FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) 204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.minimum >= 0); 206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.maximum <= 23); 207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.minimum <= hour23Range.maximum); 208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Range range(1, 12); 209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (hour23Range.maximum < 12) 210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range = hour23Range; 211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (hour23Range.minimum >= 12) { 212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range.minimum = hour23Range.minimum - 12; 213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range.maximum = hour23Range.maximum - 12; 214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!range.minimum) 216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range.minimum = 12; 217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!range.maximum) 218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range.maximum = 12; 219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (range.minimum > range.maximum) { 220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range.minimum = 1; 221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range.maximum = 12; 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DateTimeHour12FieldElement> field = adoptRef(new DateTimeHour12FieldElement(document, fieldOwner, range, step)); 224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) field->initialize(); 225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return field.release(); 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour12FieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) dateTimeFieldsState.setHour(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue); 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour12FieldElement::setValueAsInteger(int value, EventBehavior eventBehavior) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) value = Range(0, 24).clampValue(value) % 12; 236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) DateTimeNumericFieldElement::setValueAsInteger(value ? value : 12, eventBehavior); 237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// ---------------------------- 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeHour23FieldElement::DateTimeHour23FieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) 242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeHourFieldElementBase(document, fieldOwner, range, Range(0, 23), step) 243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeHour23FieldElement> DateTimeHour23FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) 247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.minimum >= 0); 249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.maximum <= 23); 250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.minimum <= hour23Range.maximum); 251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DateTimeHour23FieldElement> field = adoptRef(new DateTimeHour23FieldElement(document, fieldOwner, hour23Range, step)); 252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) field->initialize(); 253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return field.release(); 254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour23FieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!hasValue()) { 259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) dateTimeFieldsState.setHour(DateTimeFieldsState::emptyValue); 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const int value = valueAsInteger(); 264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 265e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) dateTimeFieldsState.setHour(value % 12 ? value % 12 : 12); 266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) dateTimeFieldsState.setAMPM(value >= 12 ? DateTimeFieldsState::AMPMValuePM : DateTimeFieldsState::AMPMValueAM); 267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour23FieldElement::setValueAsInteger(int value, EventBehavior eventBehavior) 270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) value = Range(0, 23).clampValue(value); 272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) DateTimeNumericFieldElement::setValueAsInteger(value, eventBehavior); 273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// ---------------------------- 276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeHour24FieldElement::DateTimeHour24FieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) 278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeHourFieldElementBase(document, fieldOwner, range, Range(1, 24), step) 279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeHour24FieldElement> DateTimeHour24FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) 283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.minimum >= 0); 285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.maximum <= 23); 286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hour23Range.minimum <= hour23Range.maximum); 287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Range range(hour23Range.minimum ? hour23Range.minimum : 24, hour23Range.maximum ? hour23Range.maximum : 24); 288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (range.minimum > range.maximum) { 289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range.minimum = 1; 290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range.maximum = 24; 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DateTimeHour24FieldElement> field = adoptRef(new DateTimeHour24FieldElement(document, fieldOwner, range, step)); 294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) field->initialize(); 295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return field.release(); 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour24FieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!hasValue()) { 301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) dateTimeFieldsState.setHour(DateTimeFieldsState::emptyValue); 302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const int value = valueAsInteger(); 306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (value == 24) { 308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) dateTimeFieldsState.setHour(12); 309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) dateTimeFieldsState.setAMPM(DateTimeFieldsState::AMPMValueAM); 310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else { 311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) dateTimeFieldsState.setHour(value == 12 ? 12 : value % 12); 312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) dateTimeFieldsState.setAMPM(value >= 12 ? DateTimeFieldsState::AMPMValuePM : DateTimeFieldsState::AMPMValueAM); 313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour24FieldElement::setValueAsInteger(int value, EventBehavior eventBehavior) 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 318926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) value = Range(0, 24).clampValue(value); 319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) DateTimeNumericFieldElement::setValueAsInteger(value ? value : 24, eventBehavior); 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ---------------------------- 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeMillisecondFieldElement::DateTimeMillisecondFieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) 325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeNumericFieldElement(document, fieldOwner, range, Range(0, 999), "---", step) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeMillisecondFieldElement> DateTimeMillisecondFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, millisecondPsuedoId, ("-webkit-datetime-edit-millisecond-field", AtomicString::ConstructFromLiteral)); 332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DateTimeMillisecondFieldElement> field = adoptRef(new DateTimeMillisecondFieldElement(document, fieldOwner, range, step)); 3331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) field->initialize(millisecondPsuedoId, queryString(WebLocalizedString::AXMillisecondFieldText)); 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return field.release(); 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMillisecondFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setMillisecond(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue); 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMillisecondFieldElement::setValueAsDate(const DateComponents& date) 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(date.millisecond()); 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeMillisecondFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!dateTimeFieldsState.hasMillisecond()) { 350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned value = dateTimeFieldsState.millisecond(); 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value > static_cast<unsigned>(maximum())) { 356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(value); 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ---------------------------- 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeMinuteFieldElement::DateTimeMinuteFieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) 366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeNumericFieldElement(document, fieldOwner, range, Range(0, 59), "--", step) 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeMinuteFieldElement> DateTimeMinuteFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, minutePsuedoId, ("-webkit-datetime-edit-minute-field", AtomicString::ConstructFromLiteral)); 373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DateTimeMinuteFieldElement> field = adoptRef(new DateTimeMinuteFieldElement(document, fieldOwner, range, step)); 3741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) field->initialize(minutePsuedoId, queryString(WebLocalizedString::AXMinuteFieldText)); 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return field.release(); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMinuteFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setMinute(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue); 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMinuteFieldElement::setValueAsDate(const DateComponents& date) 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(date.minute()); 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeMinuteFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!dateTimeFieldsState.hasMinute()) { 391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned value = dateTimeFieldsState.minute(); 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value > static_cast<unsigned>(maximum())) { 397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(value); 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ---------------------------- 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeMonthFieldElement::DateTimeMonthFieldElement(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range) 407926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeNumericFieldElement(document, fieldOwner, range, Range(1, 12), placeholder) 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeMonthFieldElement> DateTimeMonthFieldElement::create(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range) 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, monthPsuedoId, ("-webkit-datetime-edit-month-field", AtomicString::ConstructFromLiteral)); 4143c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch RefPtr<DateTimeMonthFieldElement> field = adoptRef(new DateTimeMonthFieldElement(document, fieldOwner, placeholder.isEmpty() ? "--" : placeholder, range)); 4151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) field->initialize(monthPsuedoId, queryString(WebLocalizedString::AXMonthFieldText)); 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return field.release(); 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMonthFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setMonth(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue); 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMonthFieldElement::setValueAsDate(const DateComponents& date) 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(date.month() + 1); 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeMonthFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!dateTimeFieldsState.hasMonth()) { 432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned value = dateTimeFieldsState.month(); 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (range().isInRange(static_cast<int>(value))) { 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(value); 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ---------------------------- 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeSecondFieldElement::DateTimeSecondFieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) 448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeNumericFieldElement(document, fieldOwner, range, Range(0, 59), "--", step) 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeSecondFieldElement> DateTimeSecondFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, secondPsuedoId, ("-webkit-datetime-edit-second-field", AtomicString::ConstructFromLiteral)); 455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DateTimeSecondFieldElement> field = adoptRef(new DateTimeSecondFieldElement(document, fieldOwner, range, step)); 4561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) field->initialize(secondPsuedoId, queryString(WebLocalizedString::AXSecondFieldText)); 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return field.release(); 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeSecondFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setSecond(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue); 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeSecondFieldElement::setValueAsDate(const DateComponents& date) 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(date.second()); 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 470926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeSecondFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!dateTimeFieldsState.hasSecond()) { 473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned value = dateTimeFieldsState.second(); 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value > static_cast<unsigned>(maximum())) { 479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(value); 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ---------------------------- 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeSymbolicMonthFieldElement::DateTimeSymbolicMonthFieldElement(Document& document, FieldOwner& fieldOwner, const Vector<String>& labels, int minimum, int maximum) 489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeSymbolicFieldElement(document, fieldOwner, labels, minimum, maximum) 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeSymbolicMonthFieldElement> DateTimeSymbolicMonthFieldElement::create(Document& document, FieldOwner& fieldOwner, const Vector<String>& labels, int minimum, int maximum) 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, monthPsuedoId, ("-webkit-datetime-edit-month-field", AtomicString::ConstructFromLiteral)); 496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DateTimeSymbolicMonthFieldElement> field = adoptRef(new DateTimeSymbolicMonthFieldElement(document, fieldOwner, labels, minimum, maximum)); 4971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) field->initialize(monthPsuedoId, queryString(WebLocalizedString::AXMonthFieldText)); 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return field.release(); 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeSymbolicMonthFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!hasValue()) 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setMonth(DateTimeFieldsState::emptyValue); 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(valueAsInteger() < static_cast<int>(symbolsSize())); 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setMonth(valueAsInteger() + 1); 5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeSymbolicMonthFieldElement::setValueAsDate(const DateComponents& date) 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(date.month()); 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 514926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeSymbolicMonthFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!dateTimeFieldsState.hasMonth()) { 517926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned value = dateTimeFieldsState.month() - 1; 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value >= symbolsSize()) { 523926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(value); 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ---------------------------- 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeWeekFieldElement::DateTimeWeekFieldElement(Document& document, FieldOwner& fieldOwner, const Range& range) 533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : DateTimeNumericFieldElement(document, fieldOwner, range, Range(DateComponents::minimumWeekNumber, DateComponents::maximumWeekNumber), "--") 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeWeekFieldElement> DateTimeWeekFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range) 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, weekPsuedoId, ("-webkit-datetime-edit-week-field", AtomicString::ConstructFromLiteral)); 540926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DateTimeWeekFieldElement> field = adoptRef(new DateTimeWeekFieldElement(document, fieldOwner, range)); 5411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) field->initialize(weekPsuedoId, queryString(WebLocalizedString::AXWeekOfYearFieldText)); 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return field.release(); 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeWeekFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setWeekOfYear(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue); 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeWeekFieldElement::setValueAsDate(const DateComponents& date) 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(date.week()); 5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeWeekFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!dateTimeFieldsState.hasWeekOfYear()) { 558926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned value = dateTimeFieldsState.weekOfYear(); 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (range().isInRange(static_cast<int>(value))) { 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(value); 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 568926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ---------------------------- 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeYearFieldElement::DateTimeYearFieldElement(Document& document, FieldOwner& fieldOwner, const DateTimeYearFieldElement::Parameters& parameters) 5743c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch : DateTimeNumericFieldElement(document, fieldOwner, Range(parameters.minimumYear, parameters.maximumYear), Range(DateComponents::minimumYear(), DateComponents::maximumYear()), parameters.placeholder.isEmpty() ? "----" : parameters.placeholder) 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_minIsSpecified(parameters.minIsSpecified) 5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_maxIsSpecified(parameters.maxIsSpecified) 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(parameters.minimumYear >= DateComponents::minimumYear()); 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(parameters.maximumYear <= DateComponents::maximumYear()); 5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeYearFieldElement> DateTimeYearFieldElement::create(Document& document, FieldOwner& fieldOwner, const DateTimeYearFieldElement::Parameters& parameters) 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, yearPsuedoId, ("-webkit-datetime-edit-year-field", AtomicString::ConstructFromLiteral)); 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<DateTimeYearFieldElement> field = adoptRef(new DateTimeYearFieldElement(document, fieldOwner, parameters)); 5861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) field->initialize(yearPsuedoId, queryString(WebLocalizedString::AXYearFieldText)); 5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return field.release(); 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static int currentFullYear() 5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double current = currentTimeMS(); 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double utcOffset = calculateUTCOffset(); 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double dstOffset = calculateDSTOffset(current, utcOffset); 5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int offset = static_cast<int>((utcOffset + dstOffset) / msPerMinute); 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) current += offset * msPerMinute; 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DateComponents date; 5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) date.setMillisecondsSinceEpochForMonth(current); 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return date.fullYear(); 6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int DateTimeYearFieldElement::defaultValueForStepDown() const 6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_maxIsSpecified ? DateTimeNumericFieldElement::defaultValueForStepDown() : currentFullYear(); 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int DateTimeYearFieldElement::defaultValueForStepUp() const 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_minIsSpecified ? DateTimeNumericFieldElement::defaultValueForStepUp() : currentFullYear(); 6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeYearFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dateTimeFieldsState.setYear(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue); 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeYearFieldElement::setValueAsDate(const DateComponents& date) 6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(date.fullYear()); 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeYearFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!dateTimeFieldsState.hasYear()) { 626926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned value = dateTimeFieldsState.year(); 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (range().isInRange(static_cast<int>(value))) { 6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValueAsInteger(value); 6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setEmptyValue(); 6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 642