2
* Copyright (C) 2010 Google Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions are
8
* * Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* * Redistributions in binary form must reproduce the above
11
* copyright notice, this list of conditions and the following disclaimer
12
* in the documentation and/or other materials provided with the
14
* * Neither the name of Google Inc. nor the names of its
15
* contributors may be used to endorse or promote products derived from
16
* this software without specific prior written permission.
18
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
#include "DateInputType.h"
34
#if ENABLE(INPUT_TYPE_DATE)
35
#include "DateComponents.h"
36
#include "DateTimeFieldsState.h"
37
#include "HTMLInputElement.h"
38
#include "HTMLNames.h"
39
#include "InputTypeNames.h"
40
#include "KeyboardEvent.h"
41
#include "LocalizedStrings.h"
42
#include "PickerIndicatorElement.h"
43
#include "PlatformLocale.h"
44
#include <wtf/PassOwnPtr.h>
48
using namespace HTMLNames;
50
static const int dateDefaultStep = 1;
51
static const int dateDefaultStepBase = 0;
52
static const int dateStepScaleFactor = 86400000;
54
inline DateInputType::DateInputType(HTMLInputElement* element)
55
: BaseDateInputType(element)
59
PassOwnPtr<InputType> DateInputType::create(HTMLInputElement* element)
61
return adoptPtr(new DateInputType(element));
64
const AtomicString& DateInputType::formControlType() const
66
return InputTypeNames::date();
69
DateComponents::Type DateInputType::dateType() const
71
return DateComponents::Date;
74
StepRange DateInputType::createStepRange(AnyStepHandling anyStepHandling) const
76
DEFINE_STATIC_LOCAL(const StepRange::StepDescription, stepDescription, (dateDefaultStep, dateDefaultStepBase, dateStepScaleFactor, StepRange::ParsedStepValueShouldBeInteger));
78
const Decimal stepBase = parseToNumber(element()->fastGetAttribute(minAttr), 0);
79
const Decimal minimum = parseToNumber(element()->fastGetAttribute(minAttr), Decimal::fromDouble(DateComponents::minimumDate()));
80
const Decimal maximum = parseToNumber(element()->fastGetAttribute(maxAttr), Decimal::fromDouble(DateComponents::maximumDate()));
81
const Decimal step = StepRange::parseStep(anyStepHandling, stepDescription, element()->fastGetAttribute(stepAttr));
82
return StepRange(stepBase, minimum, maximum, step, stepDescription);
85
bool DateInputType::parseToDateComponentsInternal(const UChar* characters, unsigned length, DateComponents* out) const
89
return out->parseDate(characters, length, 0, end) && end == length;
92
bool DateInputType::setMillisecondToDateComponents(double value, DateComponents* date) const
95
return date->setMillisecondsSinceEpochForDate(value);
98
bool DateInputType::isDateField() const
103
#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
104
String DateInputType::formatDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) const
106
if (!dateTimeFieldsState.hasDayOfMonth() || !dateTimeFieldsState.hasMonth() || !dateTimeFieldsState.hasYear())
107
return emptyString();
109
return String::format("%04u-%02u-%02u", dateTimeFieldsState.year(), dateTimeFieldsState.month(), dateTimeFieldsState.dayOfMonth());
112
void DateInputType::setupLayoutParameters(DateTimeEditElement::LayoutParameters& layoutParameters, const DateComponents& date) const
114
layoutParameters.dateTimeFormat = layoutParameters.locale.dateFormat();
115
layoutParameters.fallbackDateTimeFormat = ASCIILiteral("yyyy-MM-dd");
116
layoutParameters.minimumYear = fullYear(element()->fastGetAttribute(minAttr));
117
layoutParameters.maximumYear = fullYear(element()->fastGetAttribute(maxAttr));
118
layoutParameters.placeholderForDay = placeholderForDayOfMonthField();
119
layoutParameters.placeholderForMonth = placeholderForMonthField();
120
layoutParameters.placeholderForYear = placeholderForYearField();
124
} // namespace WebCore