Changeset 129855 in webkit
- Timestamp:
- Sep 28, 2012 12:03:29 AM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r129854 r129855 1 2012-09-28 Yoshifumi Inoue <yosin@chromium.org> 2 3 [Forms] Adding DateTimeMonthFieldElement and DateTimeYearFieldElement 4 https://bugs.webkit.org/show_bug.cgi?id=97864 5 6 Reviewed by Kent Tamura. 7 8 This patch is a part of preparation of implementing multiple fields 9 date/time input UI. 10 11 This patch introduces DateTimeMonthFieldElement and DateTimeYearFieldElement 12 classes for implementing multiple fields "month" input type. 13 14 Multiple fields "month" input type uses two fields for month and year 15 in locale dependent order. Month field display month as two digit. 16 Year field display year as four digits in usual case and can display 17 up to 6 digits to support maximum year 275760, defined in HTML5 18 specification. 19 20 This patch also changes default value for step down and up on empty 21 field to better UI in year field. Year field displays current year 22 when step down and up on empty field rather than minimum year 1, or 23 maximum year 275760. 24 25 Note: This patch affects ports which enable both ENABLE_INPUT_TYPE_TIME 26 and ENABLE_INPUT_MULTIPLE_FIELDS_UI. 27 28 No new tests. This patch doesn't change behavior. 29 30 * html/shadow/DateTimeFieldElements.cpp: 31 (WebCore::DateTimeMonthFieldElement::DateTimeMonthFieldElement): Added. 32 (WebCore::DateTimeMonthFieldElement::create): Added. 33 (WebCore::DateTimeMonthFieldElement::populateDateTimeFieldsState): Added. 34 (WebCore::DateTimeMonthFieldElement::setValueAsDate): Added. 35 (WebCore::DateTimeMonthFieldElement::setValueAsDateTimeFieldsState): Added. 36 (WebCore::DateTimeYearFieldElement::DateTimeYearFieldElement): Added. 37 (WebCore::DateTimeYearFieldElement::create): Added. 38 (WebCore::DateTimeYearFieldElement::defaultValueForStepDown): Added. 39 (WebCore::DateTimeYearFieldElement::defaultValueForStepUp): Added. 40 (WebCore::DateTimeYearFieldElement::populateDateTimeFieldsState): Added. 41 (WebCore::DateTimeYearFieldElement::setValueAsDate): Added. 42 (WebCore::DateTimeYearFieldElement::setValueAsDateTimeFieldsState): Added. 43 * html/shadow/DateTimeFieldElements.h: 44 (DateTimeMonthFieldElement): Added. 45 (DateTimeYearFieldElement): Added. 46 * html/shadow/DateTimeNumericFieldElement.cpp: 47 (WebCore::DateTimeNumericFieldElement::Range::isInRange): Added for ease of checking value is in range. 48 (WebCore::DateTimeNumericFieldElement::defaultValueForStepDown): Added for default behavior. 49 (WebCore::DateTimeNumericFieldElement::defaultValueForStepUp): ditto. 50 (WebCore::DateTimeNumericFieldElement::stepDown): Changed to use defaultValueForStepDown instead of maximum field value. 51 (WebCore::DateTimeNumericFieldElement::stepUp): Changed to use defaultValueForStepUp minium field value. 52 (WebCore::DateTimeNumericFieldElement::value): Changed to use "%04d" when maximum field value is greater than 999 for year field. 53 * html/shadow/DateTimeNumericFieldElement.h: 54 (DateTimeNumericFieldElement): Changed to add declarations of defaultValueForStepDown() and defaultValueForStepUp(). 55 1 56 2012-09-27 Yoshifumi Inoue <yosin@chromium.org> 2 57 -
trunk/Source/WebCore/html/shadow/DateTimeFieldElements.cpp
r129854 r129855 31 31 #include "DateTimeFieldsState.h" 32 32 #include "LocalizedStrings.h" 33 #include <wtf/CurrentTime.h> 34 #include <wtf/DateMath.h> 33 35 34 36 namespace WebCore { … … 257 259 // ---------------------------- 258 260 261 DateTimeMonthFieldElement::DateTimeMonthFieldElement(Document* document, FieldOwner& fieldOwner, const String& placeholder) 262 : DateTimeNumericFieldElement(document, fieldOwner, 1, 12, placeholder) 263 { 264 } 265 266 PassRefPtr<DateTimeMonthFieldElement> DateTimeMonthFieldElement::create(Document* document, FieldOwner& fieldOwner, const String& placeholder) 267 { 268 DEFINE_STATIC_LOCAL(AtomicString, monthPsuedoId, ("-webkit-datetime-edit-month-field")); 269 RefPtr<DateTimeMonthFieldElement> field = adoptRef(new DateTimeMonthFieldElement(document, fieldOwner, placeholder)); 270 field->initialize(monthPsuedoId, AXMonthFieldText()); 271 return field.release(); 272 } 273 274 void DateTimeMonthFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 275 { 276 dateTimeFieldsState.setMonth(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue); 277 } 278 279 void DateTimeMonthFieldElement::setValueAsDate(const DateComponents& date) 280 { 281 setValueAsInteger(date.month() + 1); 282 } 283 284 void DateTimeMonthFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState, const DateComponents& dateForReadOnlyField) 285 { 286 if (!dateTimeFieldsState.hasMonth()) { 287 setEmptyValue(dateForReadOnlyField); 288 return; 289 } 290 291 const unsigned value = dateTimeFieldsState.month(); 292 if (range().isInRange(static_cast<int>(value))) { 293 setValueAsInteger(value); 294 return; 295 } 296 297 setEmptyValue(dateForReadOnlyField); 298 } 299 300 // ---------------------------- 301 259 302 DateTimeSecondFieldElement::DateTimeSecondFieldElement(Document* document, FieldOwner& fieldOwner) 260 303 : DateTimeNumericFieldElement(document, fieldOwner, 0, 59, "--") … … 296 339 } 297 340 341 // ---------------------------- 342 343 // HTML5 uses ISO-8601 format with year >= 1. Gregorian calendar started in 344 // 1582. However, we need to support 0001-01-01 in Gregorian calendar rule. 345 static const int minimumYear = 1; 346 // Date in ECMAScript can't represent dates later than 275760-09-13T00:00Z. 347 // So, we have the same upper limit in HTML5 dates. 348 static const int maximumYear = 275760; 349 350 DateTimeYearFieldElement::DateTimeYearFieldElement(Document* document, FieldOwner& fieldOwner, const String& placeholder) 351 : DateTimeNumericFieldElement(document, fieldOwner, minimumYear, maximumYear, placeholder) 352 { 353 } 354 355 PassRefPtr<DateTimeYearFieldElement> DateTimeYearFieldElement::create(Document* document, FieldOwner& fieldOwner, const String& placeholder) 356 { 357 DEFINE_STATIC_LOCAL(AtomicString, yearPsuedoId, ("-webkit-datetime-edit-year-field")); 358 RefPtr<DateTimeYearFieldElement> field = adoptRef(new DateTimeYearFieldElement(document, fieldOwner, placeholder)); 359 field->initialize(yearPsuedoId, AXYearFieldText()); 360 return field.release(); 361 } 362 363 int DateTimeYearFieldElement::defaultValueForStepDown() const 364 { 365 double current = currentTimeMS(); 366 double utcOffset = calculateUTCOffset(); 367 double dstOffset = calculateDSTOffset(current, utcOffset); 368 int offset = static_cast<int>((utcOffset + dstOffset) / msPerMinute); 369 current += offset * msPerMinute; 370 371 DateComponents date; 372 date.setMillisecondsSinceEpochForMonth(current); 373 return date.fullYear(); 374 } 375 376 int DateTimeYearFieldElement::defaultValueForStepUp() const 377 { 378 return defaultValueForStepDown(); 379 } 380 381 void DateTimeYearFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState) 382 { 383 dateTimeFieldsState.setYear(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue); 384 } 385 386 void DateTimeYearFieldElement::setValueAsDate(const DateComponents& date) 387 { 388 setValueAsInteger(date.fullYear()); 389 } 390 391 void DateTimeYearFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState, const DateComponents& dateForReadOnlyField) 392 { 393 if (!dateTimeFieldsState.hasYear()) { 394 setEmptyValue(dateForReadOnlyField); 395 return; 396 } 397 398 const unsigned value = dateTimeFieldsState.year(); 399 if (range().isInRange(static_cast<int>(value))) { 400 setValueAsInteger(value); 401 return; 402 } 403 404 setEmptyValue(dateForReadOnlyField); 405 } 406 298 407 } // namespace WebCore 299 408 -
trunk/Source/WebCore/html/shadow/DateTimeFieldElements.h
r129612 r129855 104 104 }; 105 105 106 class DateTimeMonthFieldElement : public DateTimeNumericFieldElement { 107 WTF_MAKE_NONCOPYABLE(DateTimeMonthFieldElement); 108 109 public: 110 static PassRefPtr<DateTimeMonthFieldElement> create(Document*, FieldOwner&, const String& placeholder); 111 112 private: 113 DateTimeMonthFieldElement(Document*, FieldOwner&, const String& placeholder); 114 115 // DateTimeFieldElement functions. 116 virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; 117 virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; 118 virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&, const DateComponents& dateForReadOnlyField) OVERRIDE FINAL; 119 }; 120 106 121 class DateTimeSecondFieldElement : public DateTimeNumericFieldElement { 107 122 WTF_MAKE_NONCOPYABLE(DateTimeSecondFieldElement); … … 119 134 }; 120 135 136 class DateTimeYearFieldElement : public DateTimeNumericFieldElement { 137 WTF_MAKE_NONCOPYABLE(DateTimeYearFieldElement); 138 139 public: 140 static PassRefPtr<DateTimeYearFieldElement> create(Document*, FieldOwner&, const String& placeholder); 141 142 private: 143 DateTimeYearFieldElement(Document*, FieldOwner&, const String& placeholder); 144 145 // DateTimeFieldElement functions. 146 virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; 147 virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; 148 virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&, const DateComponents& dateForReadOnlyField) OVERRIDE FINAL; 149 150 // DateTimeNumericFieldElement functions. 151 virtual int defaultValueForStepDown() const OVERRIDE FINAL; 152 virtual int defaultValueForStepUp() const OVERRIDE FINAL; 153 }; 154 121 155 } // namespace WebCore 122 156 -
trunk/Source/WebCore/html/shadow/DateTimeNumericFieldElement.cpp
r129854 r129855 48 48 } 49 49 50 bool DateTimeNumericFieldElement::Range::isInRange(int value) const 51 { 52 return value >= minimum && value <= maximum; 53 } 54 55 // ---------------------------- 56 50 57 DateTimeNumericFieldElement::DateTimeNumericFieldElement(Document* document, FieldOwner& fieldOwner, int minimum, int maximum, const String& placeholder) 51 58 : DateTimeFieldElement(document, fieldOwner) … … 56 63 , m_hasValue(false) 57 64 { 65 } 66 67 int DateTimeNumericFieldElement::defaultValueForStepDown() const 68 { 69 return m_range.maximum; 70 } 71 72 int DateTimeNumericFieldElement::defaultValueForStepUp() const 73 { 74 return m_range.minimum; 58 75 } 59 76 … … 139 156 setValueAsInteger(m_value == m_range.minimum ? m_range.maximum : clampValue(m_value - 1), DispatchEvent); 140 157 else 141 setValueAsInteger( m_range.maximum, DispatchEvent);158 setValueAsInteger(defaultValueForStepDown(), DispatchEvent); 142 159 } 143 160 … … 147 164 setValueAsInteger(m_value == m_range.maximum ? m_range.minimum : clampValue(m_value + 1), DispatchEvent); 148 165 else 149 setValueAsInteger( m_range.minimum, DispatchEvent);166 setValueAsInteger(defaultValueForStepUp(), DispatchEvent); 150 167 } 151 168 … … 157 174 Localizer& localizer = this->localizer(); 158 175 if (m_range.maximum > 999) 159 return localizer.convertToLocalizedNumber(String:: number(m_value));176 return localizer.convertToLocalizedNumber(String::format("%04d", m_value)); 160 177 161 178 if (m_range.maximum > 99) -
trunk/Source/WebCore/html/shadow/DateTimeNumericFieldElement.h
r129854 r129855 46 46 Range(int minimum, int maximum); 47 47 int clampValue(int) const; 48 bool isInRange(int) const; 48 49 49 50 int maximum; … … 54 55 55 56 int clampValue(int value) const { return m_range.clampValue(value); } 57 virtual int defaultValueForStepDown() const; 58 virtual int defaultValueForStepUp() const; 56 59 const Range& range() const { return m_range; } 57 60
Note: See TracChangeset
for help on using the changeset viewer.