Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(363)

Side by Side Diff: third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.cpp

Issue 2815263002: Move form-related files in core/html/shadow to core/html/forms. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26 #include "core/html/shadow/DateTimeFieldElements.h"
27
28 #include "core/html/forms/DateTimeFieldsState.h"
29 #include "platform/DateComponents.h"
30 #include "platform/text/PlatformLocale.h"
31 #include "platform/wtf/CurrentTime.h"
32 #include "platform/wtf/DateMath.h"
33
34 namespace blink {
35
36 using blink::WebLocalizedString;
37
38 static String QueryString(WebLocalizedString::Name name) {
39 return Locale::DefaultLocale().QueryString(name);
40 }
41
42 DateTimeAMPMFieldElement::DateTimeAMPMFieldElement(
43 Document& document,
44 FieldOwner& field_owner,
45 const Vector<String>& ampm_labels)
46 : DateTimeSymbolicFieldElement(document, field_owner, ampm_labels, 0, 1) {}
47
48 DateTimeAMPMFieldElement* DateTimeAMPMFieldElement::Create(
49 Document& document,
50 FieldOwner& field_owner,
51 const Vector<String>& ampm_labels) {
52 DEFINE_STATIC_LOCAL(AtomicString, ampm_pseudo_id,
53 ("-webkit-datetime-edit-ampm-field"));
54 DateTimeAMPMFieldElement* field =
55 new DateTimeAMPMFieldElement(document, field_owner, ampm_labels);
56 field->Initialize(ampm_pseudo_id,
57 QueryString(WebLocalizedString::kAXAMPMFieldText));
58 return field;
59 }
60
61 void DateTimeAMPMFieldElement::PopulateDateTimeFieldsState(
62 DateTimeFieldsState& date_time_fields_state) {
63 if (HasValue())
64 date_time_fields_state.SetAMPM(ValueAsInteger()
65 ? DateTimeFieldsState::kAMPMValuePM
66 : DateTimeFieldsState::kAMPMValueAM);
67 else
68 date_time_fields_state.SetAMPM(DateTimeFieldsState::kAMPMValueEmpty);
69 }
70
71 void DateTimeAMPMFieldElement::SetValueAsDate(const DateComponents& date) {
72 SetValueAsInteger(date.Hour() >= 12 ? 1 : 0);
73 }
74
75 void DateTimeAMPMFieldElement::SetValueAsDateTimeFieldsState(
76 const DateTimeFieldsState& date_time_fields_state) {
77 if (date_time_fields_state.HasAMPM())
78 SetValueAsInteger(date_time_fields_state.Ampm());
79 else
80 SetEmptyValue();
81 }
82
83 // ----------------------------
84
85 DateTimeDayFieldElement::DateTimeDayFieldElement(Document& document,
86 FieldOwner& field_owner,
87 const String& placeholder,
88 const Range& range)
89 : DateTimeNumericFieldElement(document,
90 field_owner,
91 range,
92 Range(1, 31),
93 placeholder) {}
94
95 DateTimeDayFieldElement* DateTimeDayFieldElement::Create(
96 Document& document,
97 FieldOwner& field_owner,
98 const String& placeholder,
99 const Range& range) {
100 DEFINE_STATIC_LOCAL(AtomicString, day_pseudo_id,
101 ("-webkit-datetime-edit-day-field"));
102 DateTimeDayFieldElement* field = new DateTimeDayFieldElement(
103 document, field_owner, placeholder.IsEmpty() ? "--" : placeholder, range);
104 field->Initialize(day_pseudo_id,
105 QueryString(WebLocalizedString::kAXDayOfMonthFieldText));
106 return field;
107 }
108
109 void DateTimeDayFieldElement::PopulateDateTimeFieldsState(
110 DateTimeFieldsState& date_time_fields_state) {
111 date_time_fields_state.SetDayOfMonth(
112 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue);
113 }
114
115 void DateTimeDayFieldElement::SetValueAsDate(const DateComponents& date) {
116 SetValueAsInteger(date.MonthDay());
117 }
118
119 void DateTimeDayFieldElement::SetValueAsDateTimeFieldsState(
120 const DateTimeFieldsState& date_time_fields_state) {
121 if (!date_time_fields_state.HasDayOfMonth()) {
122 SetEmptyValue();
123 return;
124 }
125
126 const unsigned value = date_time_fields_state.DayOfMonth();
127 if (GetRange().IsInRange(static_cast<int>(value))) {
128 SetValueAsInteger(value);
129 return;
130 }
131
132 SetEmptyValue();
133 }
134
135 // ----------------------------
136
137 DateTimeHourFieldElementBase::DateTimeHourFieldElementBase(
138 Document& document,
139 FieldOwner& field_owner,
140 const Range& range,
141 const Range& hard_limits,
142 const Step& step)
143 : DateTimeNumericFieldElement(document,
144 field_owner,
145 range,
146 hard_limits,
147 "--",
148 step) {}
149
150 void DateTimeHourFieldElementBase::Initialize() {
151 DEFINE_STATIC_LOCAL(AtomicString, hour_pseudo_id,
152 ("-webkit-datetime-edit-hour-field"));
153 DateTimeNumericFieldElement::Initialize(
154 hour_pseudo_id, QueryString(WebLocalizedString::kAXHourFieldText));
155 }
156
157 void DateTimeHourFieldElementBase::SetValueAsDate(const DateComponents& date) {
158 SetValueAsInteger(date.Hour());
159 }
160
161 void DateTimeHourFieldElementBase::SetValueAsDateTimeFieldsState(
162 const DateTimeFieldsState& date_time_fields_state) {
163 if (!date_time_fields_state.HasHour()) {
164 SetEmptyValue();
165 return;
166 }
167
168 const int hour12 = date_time_fields_state.Hour();
169 if (hour12 < 1 || hour12 > 12) {
170 SetEmptyValue();
171 return;
172 }
173
174 const int hour11 = hour12 == 12 ? 0 : hour12;
175 const int hour23 =
176 date_time_fields_state.Ampm() == DateTimeFieldsState::kAMPMValuePM
177 ? hour11 + 12
178 : hour11;
179 SetValueAsInteger(hour23);
180 }
181 // ----------------------------
182
183 DateTimeHour11FieldElement::DateTimeHour11FieldElement(Document& document,
184 FieldOwner& field_owner,
185 const Range& range,
186 const Step& step)
187 : DateTimeHourFieldElementBase(document,
188 field_owner,
189 range,
190 Range(0, 11),
191 step) {}
192
193 DateTimeHour11FieldElement* DateTimeHour11FieldElement::Create(
194 Document& document,
195 FieldOwner& field_owner,
196 const Range& hour23_range,
197 const Step& step) {
198 DCHECK_GE(hour23_range.minimum, 0);
199 DCHECK_LE(hour23_range.maximum, 23);
200 DCHECK_LE(hour23_range.minimum, hour23_range.maximum);
201 Range range(0, 11);
202 if (hour23_range.maximum < 12) {
203 range = hour23_range;
204 } else if (hour23_range.minimum >= 12) {
205 range.minimum = hour23_range.minimum - 12;
206 range.maximum = hour23_range.maximum - 12;
207 }
208
209 DateTimeHour11FieldElement* field =
210 new DateTimeHour11FieldElement(document, field_owner, range, step);
211 field->Initialize();
212 return field;
213 }
214
215 void DateTimeHour11FieldElement::PopulateDateTimeFieldsState(
216 DateTimeFieldsState& date_time_fields_state) {
217 if (!HasValue()) {
218 date_time_fields_state.SetHour(DateTimeFieldsState::kEmptyValue);
219 return;
220 }
221 const int value = ValueAsInteger();
222 date_time_fields_state.SetHour(value ? value : 12);
223 }
224
225 void DateTimeHour11FieldElement::SetValueAsInteger(
226 int value,
227 EventBehavior event_behavior) {
228 value = Range(0, 23).ClampValue(value) % 12;
229 DateTimeNumericFieldElement::SetValueAsInteger(value, event_behavior);
230 }
231
232 // ----------------------------
233
234 DateTimeHour12FieldElement::DateTimeHour12FieldElement(Document& document,
235 FieldOwner& field_owner,
236 const Range& range,
237 const Step& step)
238 : DateTimeHourFieldElementBase(document,
239 field_owner,
240 range,
241 Range(1, 12),
242 step) {}
243
244 DateTimeHour12FieldElement* DateTimeHour12FieldElement::Create(
245 Document& document,
246 FieldOwner& field_owner,
247 const Range& hour23_range,
248 const Step& step) {
249 DCHECK_GE(hour23_range.minimum, 0);
250 DCHECK_LE(hour23_range.maximum, 23);
251 DCHECK_LE(hour23_range.minimum, hour23_range.maximum);
252 Range range(1, 12);
253 if (hour23_range.maximum < 12) {
254 range = hour23_range;
255 } else if (hour23_range.minimum >= 12) {
256 range.minimum = hour23_range.minimum - 12;
257 range.maximum = hour23_range.maximum - 12;
258 }
259 if (!range.minimum)
260 range.minimum = 12;
261 if (!range.maximum)
262 range.maximum = 12;
263 if (range.minimum > range.maximum) {
264 range.minimum = 1;
265 range.maximum = 12;
266 }
267 DateTimeHour12FieldElement* field =
268 new DateTimeHour12FieldElement(document, field_owner, range, step);
269 field->Initialize();
270 return field;
271 }
272
273 void DateTimeHour12FieldElement::PopulateDateTimeFieldsState(
274 DateTimeFieldsState& date_time_fields_state) {
275 date_time_fields_state.SetHour(HasValue() ? ValueAsInteger()
276 : DateTimeFieldsState::kEmptyValue);
277 }
278
279 void DateTimeHour12FieldElement::SetValueAsInteger(
280 int value,
281 EventBehavior event_behavior) {
282 value = Range(0, 24).ClampValue(value) % 12;
283 DateTimeNumericFieldElement::SetValueAsInteger(value ? value : 12,
284 event_behavior);
285 }
286
287 // ----------------------------
288
289 DateTimeHour23FieldElement::DateTimeHour23FieldElement(Document& document,
290 FieldOwner& field_owner,
291 const Range& range,
292 const Step& step)
293 : DateTimeHourFieldElementBase(document,
294 field_owner,
295 range,
296 Range(0, 23),
297 step) {}
298
299 DateTimeHour23FieldElement* DateTimeHour23FieldElement::Create(
300 Document& document,
301 FieldOwner& field_owner,
302 const Range& hour23_range,
303 const Step& step) {
304 DCHECK_GE(hour23_range.minimum, 0);
305 DCHECK_LE(hour23_range.maximum, 23);
306 DCHECK_LE(hour23_range.minimum, hour23_range.maximum);
307 DateTimeHour23FieldElement* field =
308 new DateTimeHour23FieldElement(document, field_owner, hour23_range, step);
309 field->Initialize();
310 return field;
311 }
312
313 void DateTimeHour23FieldElement::PopulateDateTimeFieldsState(
314 DateTimeFieldsState& date_time_fields_state) {
315 if (!HasValue()) {
316 date_time_fields_state.SetHour(DateTimeFieldsState::kEmptyValue);
317 return;
318 }
319
320 const int value = ValueAsInteger();
321
322 date_time_fields_state.SetHour(value % 12 ? value % 12 : 12);
323 date_time_fields_state.SetAMPM(value >= 12
324 ? DateTimeFieldsState::kAMPMValuePM
325 : DateTimeFieldsState::kAMPMValueAM);
326 }
327
328 void DateTimeHour23FieldElement::SetValueAsInteger(
329 int value,
330 EventBehavior event_behavior) {
331 value = Range(0, 23).ClampValue(value);
332 DateTimeNumericFieldElement::SetValueAsInteger(value, event_behavior);
333 }
334
335 // ----------------------------
336
337 DateTimeHour24FieldElement::DateTimeHour24FieldElement(Document& document,
338 FieldOwner& field_owner,
339 const Range& range,
340 const Step& step)
341 : DateTimeHourFieldElementBase(document,
342 field_owner,
343 range,
344 Range(1, 24),
345 step) {}
346
347 DateTimeHour24FieldElement* DateTimeHour24FieldElement::Create(
348 Document& document,
349 FieldOwner& field_owner,
350 const Range& hour23_range,
351 const Step& step) {
352 DCHECK_GE(hour23_range.minimum, 0);
353 DCHECK_LE(hour23_range.maximum, 23);
354 DCHECK_LE(hour23_range.minimum, hour23_range.maximum);
355 Range range(hour23_range.minimum ? hour23_range.minimum : 24,
356 hour23_range.maximum ? hour23_range.maximum : 24);
357 if (range.minimum > range.maximum) {
358 range.minimum = 1;
359 range.maximum = 24;
360 }
361
362 DateTimeHour24FieldElement* field =
363 new DateTimeHour24FieldElement(document, field_owner, range, step);
364 field->Initialize();
365 return field;
366 }
367
368 void DateTimeHour24FieldElement::PopulateDateTimeFieldsState(
369 DateTimeFieldsState& date_time_fields_state) {
370 if (!HasValue()) {
371 date_time_fields_state.SetHour(DateTimeFieldsState::kEmptyValue);
372 return;
373 }
374
375 const int value = ValueAsInteger();
376
377 if (value == 24) {
378 date_time_fields_state.SetHour(12);
379 date_time_fields_state.SetAMPM(DateTimeFieldsState::kAMPMValueAM);
380 } else {
381 date_time_fields_state.SetHour(value == 12 ? 12 : value % 12);
382 date_time_fields_state.SetAMPM(value >= 12
383 ? DateTimeFieldsState::kAMPMValuePM
384 : DateTimeFieldsState::kAMPMValueAM);
385 }
386 }
387
388 void DateTimeHour24FieldElement::SetValueAsInteger(
389 int value,
390 EventBehavior event_behavior) {
391 value = Range(0, 24).ClampValue(value);
392 DateTimeNumericFieldElement::SetValueAsInteger(value ? value : 24,
393 event_behavior);
394 }
395
396 // ----------------------------
397
398 DateTimeMillisecondFieldElement::DateTimeMillisecondFieldElement(
399 Document& document,
400 FieldOwner& field_owner,
401 const Range& range,
402 const Step& step)
403 : DateTimeNumericFieldElement(document,
404 field_owner,
405 range,
406 Range(0, 999),
407 "---",
408 step) {}
409
410 DateTimeMillisecondFieldElement* DateTimeMillisecondFieldElement::Create(
411 Document& document,
412 FieldOwner& field_owner,
413 const Range& range,
414 const Step& step) {
415 DEFINE_STATIC_LOCAL(AtomicString, millisecond_pseudo_id,
416 ("-webkit-datetime-edit-millisecond-field"));
417 DateTimeMillisecondFieldElement* field =
418 new DateTimeMillisecondFieldElement(document, field_owner, range, step);
419 field->Initialize(millisecond_pseudo_id,
420 QueryString(WebLocalizedString::kAXMillisecondFieldText));
421 return field;
422 }
423
424 void DateTimeMillisecondFieldElement::PopulateDateTimeFieldsState(
425 DateTimeFieldsState& date_time_fields_state) {
426 date_time_fields_state.SetMillisecond(
427 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue);
428 }
429
430 void DateTimeMillisecondFieldElement::SetValueAsDate(
431 const DateComponents& date) {
432 SetValueAsInteger(date.Millisecond());
433 }
434
435 void DateTimeMillisecondFieldElement::SetValueAsDateTimeFieldsState(
436 const DateTimeFieldsState& date_time_fields_state) {
437 if (!date_time_fields_state.HasMillisecond()) {
438 SetEmptyValue();
439 return;
440 }
441
442 const unsigned value = date_time_fields_state.Millisecond();
443 if (value > static_cast<unsigned>(Maximum())) {
444 SetEmptyValue();
445 return;
446 }
447
448 SetValueAsInteger(value);
449 }
450
451 // ----------------------------
452
453 DateTimeMinuteFieldElement::DateTimeMinuteFieldElement(Document& document,
454 FieldOwner& field_owner,
455 const Range& range,
456 const Step& step)
457 : DateTimeNumericFieldElement(document,
458 field_owner,
459 range,
460 Range(0, 59),
461 "--",
462 step) {}
463
464 DateTimeMinuteFieldElement* DateTimeMinuteFieldElement::Create(
465 Document& document,
466 FieldOwner& field_owner,
467 const Range& range,
468 const Step& step) {
469 DEFINE_STATIC_LOCAL(AtomicString, minute_pseudo_id,
470 ("-webkit-datetime-edit-minute-field"));
471 DateTimeMinuteFieldElement* field =
472 new DateTimeMinuteFieldElement(document, field_owner, range, step);
473 field->Initialize(minute_pseudo_id,
474 QueryString(WebLocalizedString::kAXMinuteFieldText));
475 return field;
476 }
477
478 void DateTimeMinuteFieldElement::PopulateDateTimeFieldsState(
479 DateTimeFieldsState& date_time_fields_state) {
480 date_time_fields_state.SetMinute(
481 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue);
482 }
483
484 void DateTimeMinuteFieldElement::SetValueAsDate(const DateComponents& date) {
485 SetValueAsInteger(date.Minute());
486 }
487
488 void DateTimeMinuteFieldElement::SetValueAsDateTimeFieldsState(
489 const DateTimeFieldsState& date_time_fields_state) {
490 if (!date_time_fields_state.HasMinute()) {
491 SetEmptyValue();
492 return;
493 }
494
495 const unsigned value = date_time_fields_state.Minute();
496 if (value > static_cast<unsigned>(Maximum())) {
497 SetEmptyValue();
498 return;
499 }
500
501 SetValueAsInteger(value);
502 }
503
504 // ----------------------------
505
506 DateTimeMonthFieldElement::DateTimeMonthFieldElement(Document& document,
507 FieldOwner& field_owner,
508 const String& placeholder,
509 const Range& range)
510 : DateTimeNumericFieldElement(document,
511 field_owner,
512 range,
513 Range(1, 12),
514 placeholder) {}
515
516 DateTimeMonthFieldElement* DateTimeMonthFieldElement::Create(
517 Document& document,
518 FieldOwner& field_owner,
519 const String& placeholder,
520 const Range& range) {
521 DEFINE_STATIC_LOCAL(AtomicString, month_pseudo_id,
522 ("-webkit-datetime-edit-month-field"));
523 DateTimeMonthFieldElement* field = new DateTimeMonthFieldElement(
524 document, field_owner, placeholder.IsEmpty() ? "--" : placeholder, range);
525 field->Initialize(month_pseudo_id,
526 QueryString(WebLocalizedString::kAXMonthFieldText));
527 return field;
528 }
529
530 void DateTimeMonthFieldElement::PopulateDateTimeFieldsState(
531 DateTimeFieldsState& date_time_fields_state) {
532 date_time_fields_state.SetMonth(
533 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue);
534 }
535
536 void DateTimeMonthFieldElement::SetValueAsDate(const DateComponents& date) {
537 SetValueAsInteger(date.Month() + 1);
538 }
539
540 void DateTimeMonthFieldElement::SetValueAsDateTimeFieldsState(
541 const DateTimeFieldsState& date_time_fields_state) {
542 if (!date_time_fields_state.HasMonth()) {
543 SetEmptyValue();
544 return;
545 }
546
547 const unsigned value = date_time_fields_state.Month();
548 if (GetRange().IsInRange(static_cast<int>(value))) {
549 SetValueAsInteger(value);
550 return;
551 }
552
553 SetEmptyValue();
554 }
555
556 // ----------------------------
557
558 DateTimeSecondFieldElement::DateTimeSecondFieldElement(Document& document,
559 FieldOwner& field_owner,
560 const Range& range,
561 const Step& step)
562 : DateTimeNumericFieldElement(document,
563 field_owner,
564 range,
565 Range(0, 59),
566 "--",
567 step) {}
568
569 DateTimeSecondFieldElement* DateTimeSecondFieldElement::Create(
570 Document& document,
571 FieldOwner& field_owner,
572 const Range& range,
573 const Step& step) {
574 DEFINE_STATIC_LOCAL(AtomicString, second_pseudo_id,
575 ("-webkit-datetime-edit-second-field"));
576 DateTimeSecondFieldElement* field =
577 new DateTimeSecondFieldElement(document, field_owner, range, step);
578 field->Initialize(second_pseudo_id,
579 QueryString(WebLocalizedString::kAXSecondFieldText));
580 return field;
581 }
582
583 void DateTimeSecondFieldElement::PopulateDateTimeFieldsState(
584 DateTimeFieldsState& date_time_fields_state) {
585 date_time_fields_state.SetSecond(
586 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue);
587 }
588
589 void DateTimeSecondFieldElement::SetValueAsDate(const DateComponents& date) {
590 SetValueAsInteger(date.Second());
591 }
592
593 void DateTimeSecondFieldElement::SetValueAsDateTimeFieldsState(
594 const DateTimeFieldsState& date_time_fields_state) {
595 if (!date_time_fields_state.HasSecond()) {
596 SetEmptyValue();
597 return;
598 }
599
600 const unsigned value = date_time_fields_state.Second();
601 if (value > static_cast<unsigned>(Maximum())) {
602 SetEmptyValue();
603 return;
604 }
605
606 SetValueAsInteger(value);
607 }
608
609 // ----------------------------
610
611 DateTimeSymbolicMonthFieldElement::DateTimeSymbolicMonthFieldElement(
612 Document& document,
613 FieldOwner& field_owner,
614 const Vector<String>& labels,
615 int minimum,
616 int maximum)
617 : DateTimeSymbolicFieldElement(document,
618 field_owner,
619 labels,
620 minimum,
621 maximum) {}
622
623 DateTimeSymbolicMonthFieldElement* DateTimeSymbolicMonthFieldElement::Create(
624 Document& document,
625 FieldOwner& field_owner,
626 const Vector<String>& labels,
627 int minimum,
628 int maximum) {
629 DEFINE_STATIC_LOCAL(AtomicString, month_pseudo_id,
630 ("-webkit-datetime-edit-month-field"));
631 DateTimeSymbolicMonthFieldElement* field =
632 new DateTimeSymbolicMonthFieldElement(document, field_owner, labels,
633 minimum, maximum);
634 field->Initialize(month_pseudo_id,
635 QueryString(WebLocalizedString::kAXMonthFieldText));
636 return field;
637 }
638
639 void DateTimeSymbolicMonthFieldElement::PopulateDateTimeFieldsState(
640 DateTimeFieldsState& date_time_fields_state) {
641 if (!HasValue())
642 date_time_fields_state.SetMonth(DateTimeFieldsState::kEmptyValue);
643 DCHECK_LT(ValueAsInteger(), static_cast<int>(SymbolsSize()));
644 date_time_fields_state.SetMonth(ValueAsInteger() + 1);
645 }
646
647 void DateTimeSymbolicMonthFieldElement::SetValueAsDate(
648 const DateComponents& date) {
649 SetValueAsInteger(date.Month());
650 }
651
652 void DateTimeSymbolicMonthFieldElement::SetValueAsDateTimeFieldsState(
653 const DateTimeFieldsState& date_time_fields_state) {
654 if (!date_time_fields_state.HasMonth()) {
655 SetEmptyValue();
656 return;
657 }
658
659 const unsigned value = date_time_fields_state.Month() - 1;
660 if (value >= SymbolsSize()) {
661 SetEmptyValue();
662 return;
663 }
664
665 SetValueAsInteger(value);
666 }
667
668 // ----------------------------
669
670 DateTimeWeekFieldElement::DateTimeWeekFieldElement(Document& document,
671 FieldOwner& field_owner,
672 const Range& range)
673 : DateTimeNumericFieldElement(document,
674 field_owner,
675 range,
676 Range(DateComponents::kMinimumWeekNumber,
677 DateComponents::kMaximumWeekNumber),
678 "--") {}
679
680 DateTimeWeekFieldElement* DateTimeWeekFieldElement::Create(
681 Document& document,
682 FieldOwner& field_owner,
683 const Range& range) {
684 DEFINE_STATIC_LOCAL(AtomicString, week_pseudo_id,
685 ("-webkit-datetime-edit-week-field"));
686 DateTimeWeekFieldElement* field =
687 new DateTimeWeekFieldElement(document, field_owner, range);
688 field->Initialize(week_pseudo_id,
689 QueryString(WebLocalizedString::kAXWeekOfYearFieldText));
690 return field;
691 }
692
693 void DateTimeWeekFieldElement::PopulateDateTimeFieldsState(
694 DateTimeFieldsState& date_time_fields_state) {
695 date_time_fields_state.SetWeekOfYear(
696 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue);
697 }
698
699 void DateTimeWeekFieldElement::SetValueAsDate(const DateComponents& date) {
700 SetValueAsInteger(date.Week());
701 }
702
703 void DateTimeWeekFieldElement::SetValueAsDateTimeFieldsState(
704 const DateTimeFieldsState& date_time_fields_state) {
705 if (!date_time_fields_state.HasWeekOfYear()) {
706 SetEmptyValue();
707 return;
708 }
709
710 const unsigned value = date_time_fields_state.WeekOfYear();
711 if (GetRange().IsInRange(static_cast<int>(value))) {
712 SetValueAsInteger(value);
713 return;
714 }
715
716 SetEmptyValue();
717 }
718
719 // ----------------------------
720
721 DateTimeYearFieldElement::DateTimeYearFieldElement(
722 Document& document,
723 FieldOwner& field_owner,
724 const DateTimeYearFieldElement::Parameters& parameters)
725 : DateTimeNumericFieldElement(
726 document,
727 field_owner,
728 Range(parameters.minimum_year, parameters.maximum_year),
729 Range(DateComponents::MinimumYear(), DateComponents::MaximumYear()),
730 parameters.placeholder.IsEmpty() ? "----" : parameters.placeholder),
731 min_is_specified_(parameters.min_is_specified),
732 max_is_specified_(parameters.max_is_specified) {
733 DCHECK_GE(parameters.minimum_year, DateComponents::MinimumYear());
734 DCHECK_LE(parameters.maximum_year, DateComponents::MaximumYear());
735 }
736
737 DateTimeYearFieldElement* DateTimeYearFieldElement::Create(
738 Document& document,
739 FieldOwner& field_owner,
740 const DateTimeYearFieldElement::Parameters& parameters) {
741 DEFINE_STATIC_LOCAL(AtomicString, year_pseudo_id,
742 ("-webkit-datetime-edit-year-field"));
743 DateTimeYearFieldElement* field =
744 new DateTimeYearFieldElement(document, field_owner, parameters);
745 field->Initialize(year_pseudo_id,
746 QueryString(WebLocalizedString::kAXYearFieldText));
747 return field;
748 }
749
750 static int CurrentFullYear() {
751 DateComponents date;
752 date.SetMillisecondsSinceEpochForMonth(ConvertToLocalTime(CurrentTimeMS()));
753 return date.FullYear();
754 }
755
756 int DateTimeYearFieldElement::DefaultValueForStepDown() const {
757 return max_is_specified_
758 ? DateTimeNumericFieldElement::DefaultValueForStepDown()
759 : CurrentFullYear();
760 }
761
762 int DateTimeYearFieldElement::DefaultValueForStepUp() const {
763 return min_is_specified_
764 ? DateTimeNumericFieldElement::DefaultValueForStepUp()
765 : CurrentFullYear();
766 }
767
768 void DateTimeYearFieldElement::PopulateDateTimeFieldsState(
769 DateTimeFieldsState& date_time_fields_state) {
770 date_time_fields_state.SetYear(HasValue() ? ValueAsInteger()
771 : DateTimeFieldsState::kEmptyValue);
772 }
773
774 void DateTimeYearFieldElement::SetValueAsDate(const DateComponents& date) {
775 SetValueAsInteger(date.FullYear());
776 }
777
778 void DateTimeYearFieldElement::SetValueAsDateTimeFieldsState(
779 const DateTimeFieldsState& date_time_fields_state) {
780 if (!date_time_fields_state.HasYear()) {
781 SetEmptyValue();
782 return;
783 }
784
785 const unsigned value = date_time_fields_state.Year();
786 if (GetRange().IsInRange(static_cast<int>(value))) {
787 SetValueAsInteger(value);
788 return;
789 }
790
791 SetEmptyValue();
792 }
793
794 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698