Title: [131853] trunk
Revision
131853
Author
[email protected]
Date
2012-10-18 21:45:47 -0700 (Thu, 18 Oct 2012)

Log Message

Implement value sanitization algorithm for type=datetime
https://bugs.webkit.org/show_bug.cgi?id=76893

Patch by Kunihiko Sakamoto <[email protected]> on 2012-10-18
Reviewed by Kent Tamura.

Source/WebCore:

Implement the value sanitization algorithm for type=datetime that adjusts
the value to a valid normalized forced-UTC global date and time string.
See http://www.whatwg.org/specs/web-apps/current-work/multipage/common-microsyntaxes.html#valid-normalized-forced-utc-global-date-and-time-string

Test: fast/forms/datetime/datetime-value-sanitization.html

* html/DateTimeInputType.cpp:
(WebCore::DateTimeInputType::sanitizeValue): Implemented.
(WebCore):
* html/DateTimeInputType.h:
(DateTimeInputType): Add sanitizeValue.
* platform/DateComponents.cpp:
(WebCore::DateComponents::addMinute): Fixed a bug that caused wrong adjustment
of timezone offset (e.g. 2012-10-17T01:00+01:00 -> 2012-10-17T01:-60Z).

LayoutTests:

Added a test for the value sanitization algorithm for type=datetime.
Also updated affected tests.

* fast/forms/datetime/ValidityState-typeMismatch-datetime-expected.txt:
* fast/forms/datetime/ValidityState-typeMismatch-datetime.html:
'0001-01-01T00:00+01:00' is an invalid value because that is before
0001-01-01 00:00 UTC. '0001-01-01T00:00-01:00' is a valid value.
* fast/forms/datetime/datetime-value-sanitization-expected.txt: Added.
* fast/forms/datetime/datetime-value-sanitization.html: Added.
* fast/forms/datetime/input-valueasdate-datetime-expected.txt:
* fast/forms/datetime/input-valueasdate-datetime.html:
Setting valueAsDate should run the algorithm to convert a Date object to a
string, that returns valid normalized forced-UTC global date and time string.
See http://www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#dom-input-valueasdate
* fast/forms/datetime/input-valueasnumber-datetime-expected.txt:
* fast/forms/datetime/input-valueasnumber-datetime.html:
Setting valueAsNumber should run the algorithm to convert a number to a
string, that returns valid normalized forced-UTC global date and time string.
See http://www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#dom-input-valueasnumber

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (131852 => 131853)


--- trunk/LayoutTests/ChangeLog	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/LayoutTests/ChangeLog	2012-10-19 04:45:47 UTC (rev 131853)
@@ -1,3 +1,30 @@
+2012-10-18  Kunihiko Sakamoto  <[email protected]>
+
+        Implement value sanitization algorithm for type=datetime
+        https://bugs.webkit.org/show_bug.cgi?id=76893
+
+        Reviewed by Kent Tamura.
+
+        Added a test for the value sanitization algorithm for type=datetime.
+        Also updated affected tests.
+
+        * fast/forms/datetime/ValidityState-typeMismatch-datetime-expected.txt:
+        * fast/forms/datetime/ValidityState-typeMismatch-datetime.html:
+        '0001-01-01T00:00+01:00' is an invalid value because that is before
+        0001-01-01 00:00 UTC. '0001-01-01T00:00-01:00' is a valid value.
+        * fast/forms/datetime/datetime-value-sanitization-expected.txt: Added.
+        * fast/forms/datetime/datetime-value-sanitization.html: Added.
+        * fast/forms/datetime/input-valueasdate-datetime-expected.txt:
+        * fast/forms/datetime/input-valueasdate-datetime.html:
+        Setting valueAsDate should run the algorithm to convert a Date object to a
+        string, that returns valid normalized forced-UTC global date and time string.
+        See http://www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#dom-input-valueasdate
+        * fast/forms/datetime/input-valueasnumber-datetime-expected.txt:
+        * fast/forms/datetime/input-valueasnumber-datetime.html:
+        Setting valueAsNumber should run the algorithm to convert a number to a
+        string, that returns valid normalized forced-UTC global date and time string.
+        See http://www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#dom-input-valueasnumber
+
 2012-10-18  Dirk Pranke  <[email protected]>
 
         Unreviewed, expectations and baselines for chromium-mac-mountainlion

Modified: trunk/LayoutTests/fast/forms/datetime/ValidityState-typeMismatch-datetime-expected.txt (131852 => 131853)


--- trunk/LayoutTests/fast/forms/datetime/ValidityState-typeMismatch-datetime-expected.txt	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/LayoutTests/fast/forms/datetime/ValidityState-typeMismatch-datetime-expected.txt	2012-10-19 04:45:47 UTC (rev 131853)
@@ -15,7 +15,7 @@
 PASS "0001-01-01T00:00:00.000Z" is a correct valid datetime string.
 PASS "0001-01-01T00:00:00.000+00:00" is a correct valid datetime string.
 PASS "0001-01-01T01:30+01:30" is a correct valid datetime string.
-PASS "0001-01-01T00:00+01:00" is a correct valid datetime string.
+PASS "0001-01-01T00:00-01:00" is a correct valid datetime string.
 PASS " 2009-09-07T16:49Z " is an invalid datetime string and was sanitized.
 PASS "2009-09-07T16:49z" is an invalid datetime string and was sanitized.
 PASS "2009-09-07t16:49Z" is an invalid datetime string and was sanitized.
@@ -34,6 +34,7 @@
 PASS "0000-12-31T23:59:59Z" is an invalid datetime string and was sanitized.
 PASS "2147483647-12-31T23:59-00:01" is an invalid datetime string and was sanitized.
 PASS "2147483648-01-01T00:00:00Z" is an invalid datetime string and was sanitized.
+PASS "0001-01-01T00:00+01:00" is an invalid datetime string and was sanitized.
 PASS "invalid" is an invalid datetime string and was sanitized while disabled.
 PASS successfullyParsed is true
 

Modified: trunk/LayoutTests/fast/forms/datetime/ValidityState-typeMismatch-datetime.html (131852 => 131853)


--- trunk/LayoutTests/fast/forms/datetime/ValidityState-typeMismatch-datetime.html	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/LayoutTests/fast/forms/datetime/ValidityState-typeMismatch-datetime.html	2012-10-19 04:45:47 UTC (rev 131853)
@@ -51,7 +51,7 @@
 shouldBeValid('0001-01-01T00:00:00.000Z');
 shouldBeValid('0001-01-01T00:00:00.000+00:00');
 shouldBeValid('0001-01-01T01:30+01:30');
-shouldBeValid('0001-01-01T00:00+01:00');
+shouldBeValid('0001-01-01T00:00-01:00');
 
 // Invalid values
 shouldBeInvalid(' 2009-09-07T16:49Z ');
@@ -72,6 +72,7 @@
 shouldBeInvalid('0000-12-31T23:59:59Z');
 shouldBeInvalid('2147483647-12-31T23:59-00:01');
 shouldBeInvalid('2147483648-01-01T00:00:00Z');
+shouldBeInvalid('0001-01-01T00:00+01:00');
 
 // Disabled
 shouldBeInvalid('invalid', true);

Added: trunk/LayoutTests/fast/forms/datetime/datetime-value-sanitization-expected.txt (0 => 131853)


--- trunk/LayoutTests/fast/forms/datetime/datetime-value-sanitization-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/datetime/datetime-value-sanitization-expected.txt	2012-10-19 04:45:47 UTC (rev 131853)
@@ -0,0 +1,38 @@
+Tests for value sanitization algorithm.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Valid values:
+PASS input.value = "2009-09-07T16:49Z"; input.value is "2009-09-07T16:49Z"
+PASS input.value = "2009-09-07T16:49:31.123Z"; input.value is "2009-09-07T16:49:31.123Z"
+Valid values, normalized:
+PASS input.value = "2009-09-07T16:49:00Z"; input.value is "2009-09-07T16:49Z"
+PASS input.value = "2009-09-07T16:49:00.000Z"; input.value is "2009-09-07T16:49Z"
+PASS input.value = "2012-01-01T00:00+00:00"; input.value is "2012-01-01T00:00Z"
+PASS input.value = "2012-01-01T00:00-00:00"; input.value is "2012-01-01T00:00Z"
+PASS input.value = "2012-01-01T00:00+01:00"; input.value is "2011-12-31T23:00Z"
+PASS input.value = "2012-01-01T00:00-01:00"; input.value is "2012-01-01T01:00Z"
+PASS input.value = "2011-12-31T23:59:59.999-23:59"; input.value is "2012-01-01T23:58:59.999Z"
+Invalid values:
+PASS input.value = "a"; input.value is ""
+PASS input.value = "2009-09-07T16:49Z "; input.value is ""
+PASS input.value = " 2009-09-07T16:49Z"; input.value is ""
+PASS input.value = "2009-09-07T16:49"; input.value is ""
+PASS input.value = "2009-09-07T16:49"; input.value is ""
+PASS input.value = "2009-09-07T16:49-24:00"; input.value is ""
+PASS input.value = "2009-09-07T16:49-01:00:00"; input.value is ""
+PASS input.value = "0000-12-31T23:59"; input.value is ""
+PASS input.value = "2012-01-00T00:00"; input.value is ""
+PASS input.value = "2012-00-01T00:00"; input.value is ""
+PASS input.value = "0001-01-01T00:00:60"; input.value is ""
+PASS input.value = "0001-01-01T00:60:00"; input.value is ""
+PASS input.value = "0001-01-01T24:00:00"; input.value is ""
+PASS input.value = "0001-01-32T00:00:00"; input.value is ""
+PASS input.value = "0001-02-29T00:00:00"; input.value is ""
+PASS input.value = "0001-13-01T00:00:00"; input.value is ""
+PASS input.value = "2147483648-01-01T00:00:00"; input.value is ""
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/forms/datetime/datetime-value-sanitization.html (0 => 131853)


--- trunk/LayoutTests/fast/forms/datetime/datetime-value-sanitization.html	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/datetime/datetime-value-sanitization.html	2012-10-19 04:45:47 UTC (rev 131853)
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script>
+description('Tests for value sanitization algorithm.');
+
+var input = document.createElement('input');
+input.type = 'datetime';
+
+debug('Valid values:');
+shouldBeEqualToString('input.value = "2009-09-07T16:49Z"; input.value', '2009-09-07T16:49Z');
+shouldBeEqualToString('input.value = "2009-09-07T16:49:31.123Z"; input.value', '2009-09-07T16:49:31.123Z');
+
+debug('Valid values, normalized:');
+shouldBeEqualToString('input.value = "2009-09-07T16:49:00Z"; input.value', '2009-09-07T16:49Z');
+shouldBeEqualToString('input.value = "2009-09-07T16:49:00.000Z"; input.value', '2009-09-07T16:49Z');
+shouldBeEqualToString('input.value = "2012-01-01T00:00+00:00"; input.value', '2012-01-01T00:00Z');
+shouldBeEqualToString('input.value = "2012-01-01T00:00-00:00"; input.value', '2012-01-01T00:00Z');
+shouldBeEqualToString('input.value = "2012-01-01T00:00+01:00"; input.value', '2011-12-31T23:00Z');
+shouldBeEqualToString('input.value = "2012-01-01T00:00-01:00"; input.value', '2012-01-01T01:00Z');
+shouldBeEqualToString('input.value = "2011-12-31T23:59:59.999-23:59"; input.value', '2012-01-01T23:58:59.999Z');
+
+debug('Invalid values:');
+shouldBeEqualToString('input.value = "a"; input.value', '');
+shouldBeEqualToString('input.value = "2009-09-07T16:49Z "; input.value', '');
+shouldBeEqualToString('input.value = " 2009-09-07T16:49Z"; input.value', '');
+shouldBeEqualToString('input.value = "2009-09-07T16:49"; input.value', '');
+shouldBeEqualToString('input.value = "2009-09-07T16:49"; input.value', '');
+shouldBeEqualToString('input.value = "2009-09-07T16:49-24:00"; input.value', '');
+shouldBeEqualToString('input.value = "2009-09-07T16:49-01:00:00"; input.value', '');
+shouldBeEqualToString('input.value = "0000-12-31T23:59"; input.value', '');
+shouldBeEqualToString('input.value = "2012-01-00T00:00"; input.value', '');
+shouldBeEqualToString('input.value = "2012-00-01T00:00"; input.value', '');
+shouldBeEqualToString('input.value = "0001-01-01T00:00:60"; input.value', '');
+shouldBeEqualToString('input.value = "0001-01-01T00:60:00"; input.value', '');
+shouldBeEqualToString('input.value = "0001-01-01T24:00:00"; input.value', '');
+shouldBeEqualToString('input.value = "0001-01-32T00:00:00"; input.value', '');
+shouldBeEqualToString('input.value = "0001-02-29T00:00:00"; input.value', '');
+shouldBeEqualToString('input.value = "0001-13-01T00:00:00"; input.value', '');
+shouldBeEqualToString('input.value = "2147483648-01-01T00:00:00"; input.value', '');
+
+</script>
+<script src=""
+</body>
+</html>

Modified: trunk/LayoutTests/fast/forms/datetime/input-valueasdate-datetime-expected.txt (131852 => 131853)


--- trunk/LayoutTests/fast/forms/datetime/input-valueasdate-datetime-expected.txt	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/LayoutTests/fast/forms/datetime/input-valueasdate-datetime-expected.txt	2012-10-19 04:45:47 UTC (rev 131853)
@@ -20,8 +20,8 @@
 PASS input.value = "2010-01-01T00:00Z"; input.valueAsDate = document; input.value is ""
 PASS input.value = "2010-01-01T00:00Z"; input.valueAsDate = null; input.value is ""
 Step attribute value and string representation:
-PASS input.step = "1"; setValueAsDateAndGetValue(2010, 0, 21, 0, 0, 0, 0) is "2010-01-21T00:00:00Z"
-PASS input.step = "0.001"; setValueAsDateAndGetValue(2010, 0, 21, 0, 0, 0, 0) is "2010-01-21T00:00:00.000Z"
+PASS input.step = "1"; setValueAsDateAndGetValue(2010, 0, 21, 0, 0, 0, 0) is "2010-01-21T00:00Z"
+PASS input.step = "0.001"; setValueAsDateAndGetValue(2010, 0, 21, 0, 0, 0, 0) is "2010-01-21T00:00Z"
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/fast/forms/datetime/input-valueasdate-datetime.html (131852 => 131853)


--- trunk/LayoutTests/fast/forms/datetime/input-valueasdate-datetime.html	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/LayoutTests/fast/forms/datetime/input-valueasdate-datetime.html	2012-10-19 04:45:47 UTC (rev 131853)
@@ -47,10 +47,9 @@
 shouldBe('input.value = "2010-01-01T00:00Z"; input.valueAsDate = null; input.value', '""');
 
 debug('Step attribute value and string representation:');
-// If the step attribute value is 1 second and the second part is 0, we should show the second part.
-shouldBe('input.step = "1"; setValueAsDateAndGetValue(2010, 0, 21, 0, 0, 0, 0)', '"2010-01-21T00:00:00Z"');
-// If the step attribute value is 0.001 second and the millisecond part is 0, we should show the millisecond part.
-shouldBe('input.step = "0.001"; setValueAsDateAndGetValue(2010, 0, 21, 0, 0, 0, 0)', '"2010-01-21T00:00:00.000Z"');
+// String representation should not depend on the step attribute.
+shouldBe('input.step = "1"; setValueAsDateAndGetValue(2010, 0, 21, 0, 0, 0, 0)', '"2010-01-21T00:00Z"');
+shouldBe('input.step = "0.001"; setValueAsDateAndGetValue(2010, 0, 21, 0, 0, 0, 0)', '"2010-01-21T00:00Z"');
 </script>
 <script src=""
 </body>

Modified: trunk/LayoutTests/fast/forms/datetime/input-valueasnumber-datetime-expected.txt (131852 => 131853)


--- trunk/LayoutTests/fast/forms/datetime/input-valueasnumber-datetime-expected.txt	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/LayoutTests/fast/forms/datetime/input-valueasnumber-datetime-expected.txt	2012-10-19 04:45:47 UTC (rev 131853)
@@ -26,8 +26,8 @@
 PASS input.valueAsNumber = Number.NEGATIVE_INFINITY threw exception Error: NOT_SUPPORTED_ERR: DOM Exception 9.
 PASS input.valueAsNumber = Date.UTC(275760, 8, 13, 0, 0, 0, 1) threw exception Error: NOT_SUPPORTED_ERR: DOM Exception 9.
 Step attribute value and string representation:
-PASS input.step = "1"; setValueAsNumberAndGetValue(2010, 0, 21, 0, 0, 0, 0) is "2010-01-21T00:00:00Z"
-PASS input.step = "0.001"; setValueAsNumberAndGetValue(2010, 0, 21, 0, 0, 0, 0) is "2010-01-21T00:00:00.000Z"
+PASS input.step = "1"; setValueAsNumberAndGetValue(2010, 0, 21, 0, 0, 0, 0) is "2010-01-21T00:00Z"
+PASS input.step = "0.001"; setValueAsNumberAndGetValue(2010, 0, 21, 0, 0, 0, 0) is "2010-01-21T00:00Z"
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/fast/forms/datetime/input-valueasnumber-datetime.html (131852 => 131853)


--- trunk/LayoutTests/fast/forms/datetime/input-valueasnumber-datetime.html	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/LayoutTests/fast/forms/datetime/input-valueasnumber-datetime.html	2012-10-19 04:45:47 UTC (rev 131853)
@@ -53,10 +53,9 @@
 shouldThrow('input.valueAsNumber = Date.UTC(275760, 8, 13, 0, 0, 0, 1)', '"Error: NOT_SUPPORTED_ERR: DOM Exception 9"');
 
 debug('Step attribute value and string representation:');
-// If the step attribute value is 1 second and the second part is 0, we should show the second part.
-shouldBe('input.step = "1"; setValueAsNumberAndGetValue(2010, 0, 21, 0, 0, 0, 0)', '"2010-01-21T00:00:00Z"');
-// If the step attribute value is 0.001 second and the millisecond part is 0, we should show the millisecond part.
-shouldBe('input.step = "0.001"; setValueAsNumberAndGetValue(2010, 0, 21, 0, 0, 0, 0)', '"2010-01-21T00:00:00.000Z"');
+// String representation should not depend on the step attribute.
+shouldBe('input.step = "1"; setValueAsNumberAndGetValue(2010, 0, 21, 0, 0, 0, 0)', '"2010-01-21T00:00Z"');
+shouldBe('input.step = "0.001"; setValueAsNumberAndGetValue(2010, 0, 21, 0, 0, 0, 0)', '"2010-01-21T00:00Z"');
 </script>
 <script src=""
 </body>

Modified: trunk/Source/WebCore/ChangeLog (131852 => 131853)


--- trunk/Source/WebCore/ChangeLog	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/Source/WebCore/ChangeLog	2012-10-19 04:45:47 UTC (rev 131853)
@@ -1,3 +1,25 @@
+2012-10-18  Kunihiko Sakamoto  <[email protected]>
+
+        Implement value sanitization algorithm for type=datetime
+        https://bugs.webkit.org/show_bug.cgi?id=76893
+
+        Reviewed by Kent Tamura.
+
+        Implement the value sanitization algorithm for type=datetime that adjusts
+        the value to a valid normalized forced-UTC global date and time string.
+        See http://www.whatwg.org/specs/web-apps/current-work/multipage/common-microsyntaxes.html#valid-normalized-forced-utc-global-date-and-time-string
+
+        Test: fast/forms/datetime/datetime-value-sanitization.html
+
+        * html/DateTimeInputType.cpp:
+        (WebCore::DateTimeInputType::sanitizeValue): Implemented.
+        (WebCore):
+        * html/DateTimeInputType.h:
+        (DateTimeInputType): Add sanitizeValue.
+        * platform/DateComponents.cpp:
+        (WebCore::DateComponents::addMinute): Fixed a bug that caused wrong adjustment
+        of timezone offset (e.g. 2012-10-17T01:00+01:00 -> 2012-10-17T01:-60Z).
+
 2012-10-18  Byungwoo Lee  <[email protected]>
 
         Fix build warning.

Modified: trunk/Source/WebCore/html/DateTimeInputType.cpp (131852 => 131853)


--- trunk/Source/WebCore/html/DateTimeInputType.cpp	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/Source/WebCore/html/DateTimeInputType.cpp	2012-10-19 04:45:47 UTC (rev 131853)
@@ -160,6 +160,14 @@
 }
 #endif
 
+String DateTimeInputType::sanitizeValue(const String& proposedValue) const
+{
+    DateComponents date;
+    if (!parseToDateComponents(proposedValue, &date))
+        return String();
+    return date.toString();
+}
+
 } // namespace WebCore
 
 #endif

Modified: trunk/Source/WebCore/html/DateTimeInputType.h (131852 => 131853)


--- trunk/Source/WebCore/html/DateTimeInputType.h	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/Source/WebCore/html/DateTimeInputType.h	2012-10-19 04:45:47 UTC (rev 131853)
@@ -57,6 +57,7 @@
     virtual bool parseToDateComponentsInternal(const UChar*, unsigned length, DateComponents*) const OVERRIDE;
     virtual bool setMillisecondToDateComponents(double, DateComponents*) const OVERRIDE;
     virtual bool isDateTimeField() const OVERRIDE;
+    virtual String sanitizeValue(const String&) const OVERRIDE;
 
 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
     // BaseMultipleFieldsDateAndTimeInputType functions

Modified: trunk/Source/WebCore/platform/DateComponents.cpp (131852 => 131853)


--- trunk/Source/WebCore/platform/DateComponents.cpp	2012-10-19 04:35:15 UTC (rev 131852)
+++ trunk/Source/WebCore/platform/DateComponents.cpp	2012-10-19 04:45:47 UTC (rev 131853)
@@ -247,8 +247,8 @@
     if (minute > 59) {
         carry = minute / 60;
         minute = minute % 60;
-    } else if (m_minute < 0) {
-        carry = (59 - m_minute) / 60;
+    } else if (minute < 0) {
+        carry = (59 - minute) / 60;
         minute += carry * 60;
         carry = -carry;
         ASSERT(minute >= 0 && minute <= 59);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to