Title: [139172] trunk
Revision
139172
Author
[email protected]
Date
2013-01-09 00:53:01 -0800 (Wed, 09 Jan 2013)

Log Message

INPUT_MULTIPLE_FIELDS_UI: Step-up/-down of week field should respect min/max attributes
https://bugs.webkit.org/show_bug.cgi?id=106416

Patch by Kunihiko Sakamoto <[email protected]> on 2013-01-09
Reviewed by Kent Tamura.

Source/WebCore:

Make step-up/-down of the week field respect the min/max attributes of the element.
Note that it still accepts any keyboard inputs (the element
becomes 'invalid' state when out-of-range values entered).

Tests: fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield.html
       fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer.html

* css/html.css: Add a CSS rule for week field.
* html/shadow/DateTimeEditElement.cpp:
(WebCore::DateTimeEditBuilder::visitField):
Compute minimum/maximum values of week field from the min/max parameters of the element.
* html/shadow/DateTimeFieldElements.cpp:
(WebCore::DateTimeWeekFieldElement::DateTimeWeekFieldElement): Add mininum/maximum arguments.
(WebCore::DateTimeWeekFieldElement::create): Ditto.
(WebCore::DateTimeWeekFieldElement::clampValueForHardLimits): Added.
* html/shadow/DateTimeFieldElements.h:
(DateTimeWeekFieldElement): Add mininum/maximum arguments and declare clampValueForHardLimits.

LayoutTests:

* fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield-expected.txt: Added.
* fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield.html: Added.
* fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer-expected.txt: Added.
* fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (139171 => 139172)


--- trunk/LayoutTests/ChangeLog	2013-01-09 08:32:27 UTC (rev 139171)
+++ trunk/LayoutTests/ChangeLog	2013-01-09 08:53:01 UTC (rev 139172)
@@ -1,3 +1,15 @@
+2013-01-09  Kunihiko Sakamoto  <[email protected]>
+
+        INPUT_MULTIPLE_FIELDS_UI: Step-up/-down of week field should respect min/max attributes
+        https://bugs.webkit.org/show_bug.cgi?id=106416
+
+        Reviewed by Kent Tamura.
+
+        * fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield-expected.txt: Added.
+        * fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield.html: Added.
+        * fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer-expected.txt: Added.
+        * fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer.html: Added.
+
 2013-01-09  Noel Gordon  <[email protected]>
 
         [chromium] Tighten svg/custom/feComponentTransfer-Table.svg on windows

Added: trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield-expected.txt (0 => 139172)


--- trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield-expected.txt	2013-01-09 08:53:01 UTC (rev 139172)
@@ -0,0 +1,31 @@
+Sub-fields in input[type=week] should be read-only in some cases. This requires window.internals.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+createWeekInput argument order: min, max, value
+
+Year field:
+PASS isReadOnlyField(createWeekInput("", "", ""), pseudoYear) is false
+PASS isReadOnlyField(createWeekInput("2012-W50", "", ""), pseudoYear) is false
+PASS isReadOnlyField(createWeekInput("", "2012-W50", ""), pseudoYear) is false
+PASS isReadOnlyField(createWeekInput("", "", "2012-W50"), pseudoYear) is false
+PASS isReadOnlyField(createWeekInput("2012-W01", "2012-W50", ""), pseudoYear) is true
+PASS isReadOnlyField(createWeekInput("2012-W01", "2013-W50", ""), pseudoYear) is false
+PASS isReadOnlyField(createWeekInput("2012-W01", "2012-W50", "2012-W05"), pseudoYear) is true
+PASS isReadOnlyField(createWeekInput("2012-W01", "2012-W50", "2013-W01"), pseudoYear) is false
+Week field:
+We should not make all the fields readonly by min/max, so week field is always editable.
+PASS isReadOnlyField(createWeekInput("", "", ""), pseudoWeek) is false
+PASS isReadOnlyField(createWeekInput("2012-W50", "", ""), pseudoWeek) is false
+PASS isReadOnlyField(createWeekInput("", "2012-W50", ""), pseudoWeek) is false
+PASS isReadOnlyField(createWeekInput("", "", "2012-W50"), pseudoWeek) is false
+PASS isReadOnlyField(createWeekInput("2012-W50", "2012-W50", ""), pseudoWeek) is false
+PASS isReadOnlyField(createWeekInput("2012-W49", "2013-W50", ""), pseudoWeek) is false
+PASS isReadOnlyField(createWeekInput("2012-W50", "2013-W50", ""), pseudoWeek) is false
+PASS isReadOnlyField(createWeekInput("2012-W50", "2012-W50", "2012-W50"), pseudoWeek) is false
+PASS isReadOnlyField(createWeekInput("2012-W50", "2012-W50", "2012-W49"), pseudoWeek) is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield.html (0 => 139172)


--- trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield.html	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield.html	2013-01-09 08:53:01 UTC (rev 139172)
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<body>
+<script src=""
+<script>
+function createWeekInput(min, max, value) {
+    var input = document.createElement('input');
+    input.type = 'week';
+    if (min)
+        input.min = min;
+    if (max)
+        input.max = max;
+    if (value)
+        input.value = value;
+    return input;
+}
+
+function isReadOnlyField(input, pseudo) {
+    var node = internals.youngestShadowRoot(input).querySelector('*[pseudo="' + pseudo + '"]');
+    if (!node)
+        testFailed('Requested node is missing.');
+    return node && node.hasAttribute('readonly');
+}
+
+var pseudoWeek = '-webkit-datetime-edit-week-field';
+var pseudoYear = '-webkit-datetime-edit-year-field';
+
+description('Sub-fields in input[type=week] should be read-only in some cases. This requires window.internals.');
+debug('createWeekInput argument order: min, max, value');
+debug('');
+
+debug('Year field:');
+shouldBeFalse('isReadOnlyField(createWeekInput("", "", ""), pseudoYear)');
+shouldBeFalse('isReadOnlyField(createWeekInput("2012-W50", "", ""), pseudoYear)');
+shouldBeFalse('isReadOnlyField(createWeekInput("", "2012-W50", ""), pseudoYear)');
+shouldBeFalse('isReadOnlyField(createWeekInput("", "", "2012-W50"), pseudoYear)');
+shouldBeTrue('isReadOnlyField(createWeekInput("2012-W01", "2012-W50", ""), pseudoYear)');
+shouldBeFalse('isReadOnlyField(createWeekInput("2012-W01", "2013-W50", ""), pseudoYear)');
+shouldBeTrue('isReadOnlyField(createWeekInput("2012-W01", "2012-W50", "2012-W05"), pseudoYear)');
+shouldBeFalse('isReadOnlyField(createWeekInput("2012-W01", "2012-W50", "2013-W01"), pseudoYear)');
+
+debug('Week field:');
+debug('We should not make all the fields readonly by min/max, so week field is always editable.');
+shouldBeFalse('isReadOnlyField(createWeekInput("", "", ""), pseudoWeek)');
+shouldBeFalse('isReadOnlyField(createWeekInput("2012-W50", "", ""), pseudoWeek)');
+shouldBeFalse('isReadOnlyField(createWeekInput("", "2012-W50", ""), pseudoWeek)');
+shouldBeFalse('isReadOnlyField(createWeekInput("", "", "2012-W50"), pseudoWeek)');
+shouldBeFalse('isReadOnlyField(createWeekInput("2012-W50", "2012-W50", ""), pseudoWeek)');
+shouldBeFalse('isReadOnlyField(createWeekInput("2012-W49", "2013-W50", ""), pseudoWeek)');
+shouldBeFalse('isReadOnlyField(createWeekInput("2012-W50", "2013-W50", ""), pseudoWeek)');
+shouldBeFalse('isReadOnlyField(createWeekInput("2012-W50", "2012-W50", "2012-W50"), pseudoWeek)');
+shouldBeFalse('isReadOnlyField(createWeekInput("2012-W50", "2012-W50", "2012-W49"), pseudoWeek)');
+
+</script>
+<script src=""
+</body>
+

Added: trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer-expected.txt (0 => 139172)


--- trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer-expected.txt	2013-01-09 08:53:01 UTC (rev 139172)
@@ -0,0 +1,35 @@
+Check stepping-up and -down for week input fields from renderer.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Function arguments are (value, min, max).
+Week
+PASS stepUp("2000-W05", "2000-W05", "2000-W40") is "2000-W06"
+PASS stepDown("2000-W05", "2000-W05", "2000-W40") is "2000-W40"
+PASS stepUp("2000-W05", "2000-W02", "2000-W05") is "2000-W02"
+PASS stepDown("2000-W05", "2000-W02", "2000-W05") is "2000-W04"
+PASS stepUp("2000-W05", "2000-W08", "2000-W10") is "2000-W08"
+PASS stepDown("2000-W05", "2000-W08", "2000-W10") is "2000-W10"
+PASS stepUp("2000-W05", "2000-W03", "2000-W03") is "2000-W03"
+PASS stepDown("2000-W05", "2000-W03", "2000-W03") is "2000-W03"
+PASS stepUp("2000-W05", "2000-W03", "2001-W05") is "2000-W06"
+PASS stepDown("2000-W05", "2000-W05", "2001-W08") is "2000-W04"
+Year
+PASS stepUp("2000-W01", "2000-W01", "2009-W52") is "2001-W01"
+PASS stepDown("2000-W01", "2000-W01", "2009-W52") is "2009-W01"
+PASS stepUp("2000-W01", "1990-W01", "2000-W52") is "1990-W01"
+PASS stepDown("2000-W01", "1990-W01", "2000-W52") is "1999-W01"
+PASS stepUp("275760-W01", "1990-W01", null) is "1990-W01"
+PASS stepDown("1990-W01", "1990-W01", null) is "275760-W01"
+PASS stepUp("2000-W01", null, "2000-W52") is "0001-W01"
+PASS stepDown("0001-W01", null, "2000-W52") is "2000-W01"
+PASS stepUp("1990-W01", "2000-W01", "2009-W52") is "2000-W01"
+PASS stepDown("1990-W01", "2000-W01", "2009-W52") is "2009-W01"
+PASS stepUp("2020-W01", "2000-W01", "2000-W52") is "2000-W01"
+PASS stepDown("2020-W01", "2000-W01", "2000-W52") is "2000-W01"
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer.html (0 => 139172)


--- trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer.html	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer.html	2013-01-09 08:53:01 UTC (rev 139172)
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script src=""
+</head>
+<body>
+<script>
+description('Check stepping-up and -down for week input fields from renderer.');
+if (!window.eventSender)
+    debug('This test requires eventSender.');
+
+var input = document.createElement('input');
+input.type = 'week';
+document.body.appendChild(input);
+
+function setInputAttributes(value, min, max) {
+    input.value = value;
+    input.min = min;
+    input.max = max;
+}
+
+function stepUp(value, min, max) {
+    setInputAttributes(value, min, max);
+    eventSender.keyDown('upArrow');
+    return input.value;
+}
+
+function stepDown(value, min, max) {
+    setInputAttributes(value, min, max);
+    eventSender.keyDown('downArrow');
+    return input.value;
+}
+
+input.focus();
+debug('Function arguments are (value, min, max).');
+debug('Week');
+shouldBeEqualToString('stepUp("2000-W05", "2000-W05", "2000-W40")', '2000-W06');
+shouldBeEqualToString('stepDown("2000-W05", "2000-W05", "2000-W40")', '2000-W40');
+shouldBeEqualToString('stepUp("2000-W05", "2000-W02", "2000-W05")', '2000-W02');
+shouldBeEqualToString('stepDown("2000-W05", "2000-W02", "2000-W05")', '2000-W04');
+shouldBeEqualToString('stepUp("2000-W05", "2000-W08", "2000-W10")', '2000-W08');
+shouldBeEqualToString('stepDown("2000-W05", "2000-W08", "2000-W10")', '2000-W10');
+shouldBeEqualToString('stepUp("2000-W05", "2000-W03", "2000-W03")', '2000-W03');
+shouldBeEqualToString('stepDown("2000-W05", "2000-W03", "2000-W03")', '2000-W03');
+shouldBeEqualToString('stepUp("2000-W05", "2000-W03", "2001-W05")', '2000-W06');
+shouldBeEqualToString('stepDown("2000-W05", "2000-W05", "2001-W08")', '2000-W04');
+
+debug('Year');
+eventSender.keyDown('rightArrow');
+shouldBeEqualToString('stepUp("2000-W01", "2000-W01", "2009-W52")', '2001-W01');
+shouldBeEqualToString('stepDown("2000-W01", "2000-W01", "2009-W52")', '2009-W01');
+shouldBeEqualToString('stepUp("2000-W01", "1990-W01", "2000-W52")', '1990-W01');
+shouldBeEqualToString('stepDown("2000-W01", "1990-W01", "2000-W52")', '1999-W01');
+shouldBeEqualToString('stepUp("275760-W01", "1990-W01", null)', '1990-W01');
+shouldBeEqualToString('stepDown("1990-W01", "1990-W01", null)', '275760-W01');
+shouldBeEqualToString('stepUp("2000-W01", null, "2000-W52")', '0001-W01');
+shouldBeEqualToString('stepDown("0001-W01", null, "2000-W52")', '2000-W01');
+shouldBeEqualToString('stepUp("1990-W01", "2000-W01", "2009-W52")', '2000-W01');
+shouldBeEqualToString('stepDown("1990-W01", "2000-W01", "2009-W52")', '2009-W01');
+shouldBeEqualToString('stepUp("2020-W01", "2000-W01", "2000-W52")', '2000-W01');
+shouldBeEqualToString('stepDown("2020-W01", "2000-W01", "2000-W52")', '2000-W01');
+
+debug('');
+input.remove();
+</script>
+<script src=""
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (139171 => 139172)


--- trunk/Source/WebCore/ChangeLog	2013-01-09 08:32:27 UTC (rev 139171)
+++ trunk/Source/WebCore/ChangeLog	2013-01-09 08:53:01 UTC (rev 139172)
@@ -1,3 +1,28 @@
+2013-01-09  Kunihiko Sakamoto  <[email protected]>
+
+        INPUT_MULTIPLE_FIELDS_UI: Step-up/-down of week field should respect min/max attributes
+        https://bugs.webkit.org/show_bug.cgi?id=106416
+
+        Reviewed by Kent Tamura.
+
+        Make step-up/-down of the week field respect the min/max attributes of the element.
+        Note that it still accepts any keyboard inputs (the element
+        becomes 'invalid' state when out-of-range values entered).
+
+        Tests: fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield.html
+               fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer.html
+
+        * css/html.css: Add a CSS rule for week field.
+        * html/shadow/DateTimeEditElement.cpp:
+        (WebCore::DateTimeEditBuilder::visitField):
+        Compute minimum/maximum values of week field from the min/max parameters of the element.
+        * html/shadow/DateTimeFieldElements.cpp:
+        (WebCore::DateTimeWeekFieldElement::DateTimeWeekFieldElement): Add mininum/maximum arguments.
+        (WebCore::DateTimeWeekFieldElement::create): Ditto.
+        (WebCore::DateTimeWeekFieldElement::clampValueForHardLimits): Added.
+        * html/shadow/DateTimeFieldElements.h:
+        (DateTimeWeekFieldElement): Add mininum/maximum arguments and declare clampValueForHardLimits.
+
 2013-01-08  Arpita Bahuguna  <[email protected]>
 
         Caret is incorrectly painted for a contenteditable <div> containing a <br> in vertical writing mode

Modified: trunk/Source/WebCore/css/html.css (139171 => 139172)


--- trunk/Source/WebCore/css/html.css	2013-01-09 08:32:27 UTC (rev 139171)
+++ trunk/Source/WebCore/css/html.css	2013-01-09 08:53:01 UTC (rev 139172)
@@ -581,6 +581,7 @@
 
 input::-webkit-datetime-edit-year-field[readonly],
 input::-webkit-datetime-edit-month-field[readonly],
+input::-webkit-datetime-edit-week-field[readonly],
 input::-webkit-datetime-edit-day-field[readonly],
 input::-webkit-datetime-edit-ampm-field[readonly],
 input::-webkit-datetime-edit-hour-field[readonly],

Modified: trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp (139171 => 139172)


--- trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp	2013-01-09 08:32:27 UTC (rev 139171)
+++ trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp	2013-01-09 08:53:01 UTC (rev 139172)
@@ -247,9 +247,19 @@
         return;
     }
 
-    case DateTimeFormat::FieldTypeWeekOfYear:
-        m_editElement.addField(DateTimeWeekFieldElement::create(document, m_editElement));
+    case DateTimeFormat::FieldTypeWeekOfYear: {
+        int minWeek = DateComponents::minimumWeekNumber;
+        int maxWeek = DateComponents::maximumWeekNumber;
+        if (m_parameters.minimum.type() != DateComponents::Invalid
+            && m_parameters.maximum.type() != DateComponents::Invalid
+            && m_parameters.minimum.fullYear() == m_parameters.maximum.fullYear()
+            && m_parameters.minimum.week() <= m_parameters.maximum.week()) {
+            minWeek = m_parameters.minimum.week();
+            maxWeek = m_parameters.maximum.week();
+        }
+        m_editElement.addField(DateTimeWeekFieldElement::create(document, m_editElement, minWeek, maxWeek));
         return;
+    }
 
     case DateTimeFormat::FieldTypeYear: {
         DateTimeYearFieldElement::Parameters yearParams;

Modified: trunk/Source/WebCore/html/shadow/DateTimeFieldElements.cpp (139171 => 139172)


--- trunk/Source/WebCore/html/shadow/DateTimeFieldElements.cpp	2013-01-09 08:32:27 UTC (rev 139171)
+++ trunk/Source/WebCore/html/shadow/DateTimeFieldElements.cpp	2013-01-09 08:53:01 UTC (rev 139172)
@@ -435,15 +435,15 @@
 
 // ----------------------------
 
-DateTimeWeekFieldElement::DateTimeWeekFieldElement(Document* document, FieldOwner& fieldOwner)
-    : DateTimeNumericFieldElement(document, fieldOwner, DateComponents::minimumWeekNumber, DateComponents::maximumWeekNumber, "--")
+DateTimeWeekFieldElement::DateTimeWeekFieldElement(Document* document, FieldOwner& fieldOwner, int minimum, int maximum)
+    : DateTimeNumericFieldElement(document, fieldOwner, minimum, maximum, "--")
 {
 }
 
-PassRefPtr<DateTimeWeekFieldElement> DateTimeWeekFieldElement::create(Document* document, FieldOwner& fieldOwner)
+PassRefPtr<DateTimeWeekFieldElement> DateTimeWeekFieldElement::create(Document* document, FieldOwner& fieldOwner, int minimum, int maximum)
 {
     DEFINE_STATIC_LOCAL(AtomicString, weekPsuedoId, ("-webkit-datetime-edit-week-field", AtomicString::ConstructFromLiteral));
-    RefPtr<DateTimeWeekFieldElement> field = adoptRef(new DateTimeWeekFieldElement(document, fieldOwner));
+    RefPtr<DateTimeWeekFieldElement> field = adoptRef(new DateTimeWeekFieldElement(document, fieldOwner, minimum, maximum));
     field->initialize(weekPsuedoId, AXWeekOfYearFieldText());
     return field.release();
 }
@@ -474,6 +474,11 @@
     setEmptyValue();
 }
 
+int DateTimeWeekFieldElement::clampValueForHardLimits(int value) const
+{
+    return Range(DateComponents::minimumWeekNumber, DateComponents::maximumWeekNumber).clampValue(value);
+}
+
 // ----------------------------
 
 DateTimeYearFieldElement::DateTimeYearFieldElement(Document* document, FieldOwner& fieldOwner, const DateTimeYearFieldElement::Parameters& parameters)

Modified: trunk/Source/WebCore/html/shadow/DateTimeFieldElements.h (139171 => 139172)


--- trunk/Source/WebCore/html/shadow/DateTimeFieldElements.h	2013-01-09 08:32:27 UTC (rev 139171)
+++ trunk/Source/WebCore/html/shadow/DateTimeFieldElements.h	2013-01-09 08:53:01 UTC (rev 139172)
@@ -172,15 +172,18 @@
     WTF_MAKE_NONCOPYABLE(DateTimeWeekFieldElement);
 
 public:
-    static PassRefPtr<DateTimeWeekFieldElement> create(Document*, FieldOwner&);
+    static PassRefPtr<DateTimeWeekFieldElement> create(Document*, FieldOwner&, int minimum, int maximum);
 
 private:
-    DateTimeWeekFieldElement(Document*, FieldOwner&);
+    DateTimeWeekFieldElement(Document*, FieldOwner&, int minimum, int maximum);
 
     // DateTimeFieldElement functions.
     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
+
+    // DateTimeNumericFieldElement function.
+    virtual int clampValueForHardLimits(int) const OVERRIDE FINAL;
 };
 
 class DateTimeYearFieldElement : public DateTimeNumericFieldElement {
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to