Title: [134546] trunk
Revision
134546
Author
commit-qu...@webkit.org
Date
2012-11-13 22:30:04 -0800 (Tue, 13 Nov 2012)

Log Message

Enable calendar picker for input types datetime/datetime-local
https://bugs.webkit.org/show_bug.cgi?id=101889

Patch by Kunihiko Sakamoto <ksakam...@chromium.org> on 2012-11-13
Reviewed by Kent Tamura.

Source/WebCore:

This adds calendar picker to <input type=datetime> and <input type=datetime-local>.
When a user choose a date from calendar picker, year/month/day fields of the input
element are updated and hour/minute/second fields are unchanged.

Tests: platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime-local.html
       platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime.html

* Resources/pagepopups/calendarPicker.js: Day.parse accepts datetime string (just drops time part).
* html/BaseMultipleFieldsDateAndTimeInputType.cpp:
(WebCore::BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorChooseValue):
If the given value is not valid for the element, try to parse it as a date string.
* html/DateTimeInputType.cpp:
(WebCore::DateTimeInputType::formatDateTimeFieldsState): DateTimeFieldsState::month() returns 1-12, not 0-11.
* html/DateTimeLocalInputType.cpp:
(WebCore::DateTimeLocalInputType::formatDateTimeFieldsState): Ditto.
* html/shadow/DateTimeEditElement.cpp:
(WebCore::DateTimeEditElement::setOnlyYearMonthDay): Added.
(WebCore):
* html/shadow/DateTimeEditElement.h:
(DateTimeEditElement):
* rendering/RenderThemeChromiumCommon.cpp:
(WebCore::RenderThemeChromiumCommon::supportsCalendarPicker): Return true for datetime and datetimelocal too.

LayoutTests:

Added tests for calendar picker for inpt type=datetime/datetime-local.

* platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime-expected.txt: Added.
* platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime.html: Added.
* platform/chromium/fast/forms/calendar-picker/calendar-picker-datetimelocal-expected.txt: Added.
* platform/chromium/fast/forms/calendar-picker/calendar-picker-datetimelocal.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (134545 => 134546)


--- trunk/LayoutTests/ChangeLog	2012-11-14 06:18:03 UTC (rev 134545)
+++ trunk/LayoutTests/ChangeLog	2012-11-14 06:30:04 UTC (rev 134546)
@@ -1,3 +1,17 @@
+2012-11-13  Kunihiko Sakamoto  <ksakam...@chromium.org>
+
+        Enable calendar picker for input types datetime/datetime-local
+        https://bugs.webkit.org/show_bug.cgi?id=101889
+
+        Reviewed by Kent Tamura.
+
+        Added tests for calendar picker for inpt type=datetime/datetime-local.
+
+        * platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime-expected.txt: Added.
+        * platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime.html: Added.
+        * platform/chromium/fast/forms/calendar-picker/calendar-picker-datetimelocal-expected.txt: Added.
+        * platform/chromium/fast/forms/calendar-picker/calendar-picker-datetimelocal.html: Added.
+
 2012-11-13  Keishi Hattori  <kei...@webkit.org>
 
         Enable datalist UI for input types week and month

Added: trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime-expected.txt (0 => 134546)


--- trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime-expected.txt	2012-11-14 06:30:04 UTC (rev 134546)
@@ -0,0 +1,15 @@
+Tests if calendar picker works for datetime as expected.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Check that page popup doesn't exist at first.
+PASS document.getElementById("mock-page-popup") is null
+PASS selectedDate() is "2011-12-31"
+PASS selectedDate() is "2012-01-01"
+PASS document.getElementById("mock-page-popup") is null
+PASS document.getElementById("datetime").value is "2012-01-01T12:53:45Z"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime.html (0 => 134546)


--- trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime.html	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime.html	2012-11-14 06:30:04 UTC (rev 134546)
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script src=""
+<script src=""
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<input type=datetime id=datetime value="2011-12-31T12:53:45Z"> 
+<script>
+description("Tests if calendar picker works for datetime as expected.");
+
+debug('Check that page popup doesn\'t exist at first.');
+shouldBeNull('document.getElementById("mock-page-popup")');
+
+openPicker(document.getElementById('datetime'), test);
+
+function test() {
+    shouldBeEqualToString('selectedDate()', '2011-12-31');
+
+    eventSender.keyDown('rightArrow');
+    shouldBeEqualToString('selectedDate()', '2012-01-01');
+
+    eventSender.keyDown('\n');
+    waitUntilClosing(testAfterClosing);
+}
+
+function testAfterClosing() {
+    shouldBeNull('document.getElementById("mock-page-popup")');
+    shouldBeEqualToString('document.getElementById("datetime").value', '2012-01-01T12:53:45Z');
+
+    finishJSTest();
+}
+
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetimelocal-expected.txt (0 => 134546)


--- trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetimelocal-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetimelocal-expected.txt	2012-11-14 06:30:04 UTC (rev 134546)
@@ -0,0 +1,15 @@
+Tests if calendar picker works for datetime-local as expected.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Check that page popup doesn't exist at first.
+PASS document.getElementById("mock-page-popup") is null
+PASS selectedDate() is "2011-12-31"
+PASS selectedDate() is "2012-01-01"
+PASS document.getElementById("mock-page-popup") is null
+PASS document.getElementById("datetimelocal").value is "2012-01-01T12:53:45"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetimelocal.html (0 => 134546)


--- trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetimelocal.html	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/fast/forms/calendar-picker/calendar-picker-datetimelocal.html	2012-11-14 06:30:04 UTC (rev 134546)
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script src=""
+<script src=""
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<input type=datetime-local id=datetimelocal value="2011-12-31T12:53:45"> 
+<script>
+description("Tests if calendar picker works for datetime-local as expected.");
+
+debug('Check that page popup doesn\'t exist at first.');
+shouldBeNull('document.getElementById("mock-page-popup")');
+
+openPicker(document.getElementById('datetimelocal'), test);
+
+function test() {
+    shouldBeEqualToString('selectedDate()', '2011-12-31');
+
+    eventSender.keyDown('rightArrow');
+    shouldBeEqualToString('selectedDate()', '2012-01-01');
+
+    eventSender.keyDown('\n');
+    waitUntilClosing(testAfterClosing);
+}
+
+function testAfterClosing() {
+    shouldBeNull('document.getElementById("mock-page-popup")');
+    shouldBeEqualToString('document.getElementById("datetimelocal").value', '2012-01-01T12:53:45');
+
+    finishJSTest();
+}
+
+</script>
+<script src=""
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (134545 => 134546)


--- trunk/Source/WebCore/ChangeLog	2012-11-14 06:18:03 UTC (rev 134545)
+++ trunk/Source/WebCore/ChangeLog	2012-11-14 06:30:04 UTC (rev 134546)
@@ -1,3 +1,33 @@
+2012-11-13  Kunihiko Sakamoto  <ksakam...@chromium.org>
+
+        Enable calendar picker for input types datetime/datetime-local
+        https://bugs.webkit.org/show_bug.cgi?id=101889
+
+        Reviewed by Kent Tamura.
+
+        This adds calendar picker to <input type=datetime> and <input type=datetime-local>.
+        When a user choose a date from calendar picker, year/month/day fields of the input
+        element are updated and hour/minute/second fields are unchanged.
+
+        Tests: platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime-local.html
+               platform/chromium/fast/forms/calendar-picker/calendar-picker-datetime.html
+
+        * Resources/pagepopups/calendarPicker.js: Day.parse accepts datetime string (just drops time part).
+        * html/BaseMultipleFieldsDateAndTimeInputType.cpp:
+        (WebCore::BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorChooseValue):
+        If the given value is not valid for the element, try to parse it as a date string.
+        * html/DateTimeInputType.cpp:
+        (WebCore::DateTimeInputType::formatDateTimeFieldsState): DateTimeFieldsState::month() returns 1-12, not 0-11.
+        * html/DateTimeLocalInputType.cpp:
+        (WebCore::DateTimeLocalInputType::formatDateTimeFieldsState): Ditto.
+        * html/shadow/DateTimeEditElement.cpp:
+        (WebCore::DateTimeEditElement::setOnlyYearMonthDay): Added.
+        (WebCore):
+        * html/shadow/DateTimeEditElement.h:
+        (DateTimeEditElement):
+        * rendering/RenderThemeChromiumCommon.cpp:
+        (WebCore::RenderThemeChromiumCommon::supportsCalendarPicker): Return true for datetime and datetimelocal too.
+
 2012-11-13  Sheriff Bot  <webkit.review....@gmail.com>
 
         Unreviewed, rolling out r134524.

Modified: trunk/Source/WebCore/Resources/pagepopups/calendarPicker.js (134545 => 134546)


--- trunk/Source/WebCore/Resources/pagepopups/calendarPicker.js	2012-11-14 06:18:03 UTC (rev 134545)
+++ trunk/Source/WebCore/Resources/pagepopups/calendarPicker.js	2012-11-14 06:30:04 UTC (rev 134546)
@@ -220,7 +220,7 @@
     this.date = dateObject.getUTCDate();
 };
 
-Day.ISOStringRegExp = /^(\d+)-(\d+)-(\d+)$/;
+Day.ISOStringRegExp = /^(\d+)-(\d+)-(\d+)/;
 
 /**
  * @param {!string} str

Modified: trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp (134545 => 134546)


--- trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp	2012-11-14 06:18:03 UTC (rev 134545)
+++ trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp	2012-11-14 06:30:04 UTC (rev 134546)
@@ -130,7 +130,17 @@
 
 void BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorChooseValue(const String& value)
 {
-    element()->setValue(value, DispatchChangeEvent);
+    if (element()->isValidValue(value)) {
+        element()->setValue(value, DispatchChangeEvent);
+        return;
+    }
+
+    if (!m_dateTimeEditElement)
+        return;
+    DateComponents date;
+    unsigned end;
+    if (date.parseDate(value.characters(), value.length(), 0, end) && end == value.length())
+        m_dateTimeEditElement->setOnlyYearMonthDay(date);
 }
 
 bool BaseMultipleFieldsDateAndTimeInputType::setupDateTimeChooserParameters(DateTimeChooserParameters& parameters)

Modified: trunk/Source/WebCore/html/DateTimeInputType.cpp (134545 => 134546)


--- trunk/Source/WebCore/html/DateTimeInputType.cpp	2012-11-14 06:18:03 UTC (rev 134545)
+++ trunk/Source/WebCore/html/DateTimeInputType.cpp	2012-11-14 06:30:04 UTC (rev 134546)
@@ -117,7 +117,7 @@
     if (dateTimeFieldsState.hasMillisecond() && dateTimeFieldsState.millisecond()) {
         return String::format("%04u-%02u-%02uT%02u:%02u:%02u.%03uZ",
             dateTimeFieldsState.year(),
-            dateTimeFieldsState.month() + 1,
+            dateTimeFieldsState.month(),
             dateTimeFieldsState.dayOfMonth(),
             dateTimeFieldsState.hour23(),
             dateTimeFieldsState.minute(),
@@ -128,7 +128,7 @@
     if (dateTimeFieldsState.hasSecond() && dateTimeFieldsState.second()) {
         return String::format("%04u-%02u-%02uT%02u:%02u:%02uZ",
             dateTimeFieldsState.year(),
-            dateTimeFieldsState.month() + 1,
+            dateTimeFieldsState.month(),
             dateTimeFieldsState.dayOfMonth(),
             dateTimeFieldsState.hour23(),
             dateTimeFieldsState.minute(),
@@ -137,7 +137,7 @@
 
     return String::format("%04u-%02u-%02uT%02u:%02uZ",
         dateTimeFieldsState.year(),
-        dateTimeFieldsState.month() + 1,
+        dateTimeFieldsState.month(),
         dateTimeFieldsState.dayOfMonth(),
         dateTimeFieldsState.hour23(),
         dateTimeFieldsState.minute());

Modified: trunk/Source/WebCore/html/DateTimeLocalInputType.cpp (134545 => 134546)


--- trunk/Source/WebCore/html/DateTimeLocalInputType.cpp	2012-11-14 06:18:03 UTC (rev 134545)
+++ trunk/Source/WebCore/html/DateTimeLocalInputType.cpp	2012-11-14 06:30:04 UTC (rev 134546)
@@ -123,7 +123,7 @@
     if (dateTimeFieldsState.hasMillisecond() && dateTimeFieldsState.millisecond()) {
         return String::format("%04u-%02u-%02uT%02u:%02u:%02u.%03u",
             dateTimeFieldsState.year(),
-            dateTimeFieldsState.month() + 1,
+            dateTimeFieldsState.month(),
             dateTimeFieldsState.dayOfMonth(),
             dateTimeFieldsState.hour23(),
             dateTimeFieldsState.minute(),
@@ -134,7 +134,7 @@
     if (dateTimeFieldsState.hasSecond() && dateTimeFieldsState.second()) {
         return String::format("%04u-%02u-%02uT%02u:%02u:%02u",
             dateTimeFieldsState.year(),
-            dateTimeFieldsState.month() + 1,
+            dateTimeFieldsState.month(),
             dateTimeFieldsState.dayOfMonth(),
             dateTimeFieldsState.hour23(),
             dateTimeFieldsState.minute(),
@@ -143,7 +143,7 @@
 
     return String::format("%04u-%02u-%02uT%02u:%02u",
         dateTimeFieldsState.year(),
-        dateTimeFieldsState.month() + 1,
+        dateTimeFieldsState.month(),
         dateTimeFieldsState.dayOfMonth(),
         dateTimeFieldsState.hour23(),
         dateTimeFieldsState.minute());

Modified: trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp (134545 => 134546)


--- trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp	2012-11-14 06:18:03 UTC (rev 134545)
+++ trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp	2012-11-14 06:30:04 UTC (rev 134546)
@@ -529,6 +529,21 @@
     return focusedFieldIndex() != invalidFieldIndex;
 }
 
+void DateTimeEditElement::setOnlyYearMonthDay(const DateComponents& date)
+{
+    ASSERT(date.type() == DateComponents::Date);
+
+    if (!m_editControlOwner)
+        return;
+
+    DateTimeFieldsState dateTimeFieldsState = valueAsDateTimeFieldsState();
+    dateTimeFieldsState.setYear(date.fullYear());
+    dateTimeFieldsState.setMonth(date.month() + 1);
+    dateTimeFieldsState.setDayOfMonth(date.monthDay());
+    setValueAsDateTimeFieldsState(dateTimeFieldsState);
+    m_editControlOwner->editControlValueChanged();
+}
+
 void DateTimeEditElement::stepDown()
 {
     if (DateTimeFieldElement* const field = focusedField())

Modified: trunk/Source/WebCore/html/shadow/DateTimeEditElement.h (134545 => 134546)


--- trunk/Source/WebCore/html/shadow/DateTimeEditElement.h	2012-11-14 06:18:03 UTC (rev 134545)
+++ trunk/Source/WebCore/html/shadow/DateTimeEditElement.h	2012-11-14 06:30:04 UTC (rev 134546)
@@ -98,6 +98,7 @@
     void setEmptyValue(const LayoutParameters&, const DateComponents& dateForReadOnlyField);
     void setValueAsDate(const LayoutParameters&, const DateComponents&);
     void setValueAsDateTimeFieldsState(const DateTimeFieldsState&);
+    void setOnlyYearMonthDay(const DateComponents&);
     void stepDown();
     void stepUp();
     String value() const;

Modified: trunk/Source/WebCore/rendering/RenderThemeChromiumCommon.cpp (134545 => 134546)


--- trunk/Source/WebCore/rendering/RenderThemeChromiumCommon.cpp	2012-11-14 06:18:03 UTC (rev 134545)
+++ trunk/Source/WebCore/rendering/RenderThemeChromiumCommon.cpp	2012-11-14 06:30:04 UTC (rev 134546)
@@ -51,8 +51,9 @@
 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
 bool RenderThemeChromiumCommon::supportsCalendarPicker(const AtomicString& type)
 {
-    // FIXME: We'd like to support datetime, and datetime-local too.
     return type == InputTypeNames::date()
+        || type == InputTypeNames::datetime()
+        || type == InputTypeNames::datetimelocal()
         || type == InputTypeNames::month()
         || type == InputTypeNames::week();
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to