Title: [126534] trunk
Revision
126534
Author
[email protected]
Date
2012-08-23 21:23:10 -0700 (Thu, 23 Aug 2012)

Log Message

[Forms] Step mismatched value should be editable in multiple field time UI.
https://bugs.webkit.org/show_bug.cgi?id=94664

Reviewed by Kent Tamura.

Source/WebCore:

This patch changes layout method of multiple field time input UI to
check value of the "input" element in addition to step and range to
allow users to change step mismatched value from UI.

Tests: fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value.html: for changing layout by value change.
This patch also adds new test case into fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic.html.

* html/TimeInputType.cpp:
(WebCore::TimeInputType::createShadowSubtree): Changed for DateTimeEditElement::create signature change.
(WebCore::TimeInputType::minOrMaxAttributeChanged): Changed to call updateInnerTextValue instead of removed updateEditElementLayout()
(WebCore::TimeInputType::stepAttributeChanged): ditto.
(WebCore::TimeInputType::updateInnerTextValue): Changed for DateTimeEditElement::setValueAsDate() and setEmptyValue() signature change.
* html/TimeInputType.h:
(TimeInputType): Removed updateEditElementLayout() declaration.
* html/shadow/DateTimeEditElement.cpp:
(DateTimeEditBuilder):
(WebCore::DateTimeEditBuilder::DateTimeEditBuilder): Added a new parameter date value to constructor to use it for layout decision.
(WebCore::DateTimeEditBuilder::needMillisecondField): Changed to check date value too.
(WebCore::DateTimeEditBuilder::needMinuteField): ditto
(WebCore::DateTimeEditBuilder::needSecondField): ditto
(WebCore::DateTimeEditBuilder::shouldMillisecondFieldReadOnly): ditto
(WebCore::DateTimeEditBuilder::shouldMinuteFieldReadOnly): ditto
(WebCore::DateTimeEditBuilder::shouldSecondFieldReadOnly): ditto
(WebCore::DateTimeEditElement::create): Changed for removing stepRange parameter.
(WebCore::DateTimeEditElement::layout): Changed to keep focus field for new layout.
(WebCore::DateTimeEditElement::setValueAsDate): Changed to call layout() with StepRange and date value.
(WebCore::DateTimeEditElement::setEmptyValue): ditto
* html/shadow/DateTimeEditElement.h:
(DateTimeEditElement):

LayoutTests:

This patch adds new test case for step mismatched value case and
updates test cases to avoid step mismatched value, and a test file
for dynamic layout change casued by input element's value change.

Note: We need to do rebaseline for Chromium-Mac and Chromium-Win.

* fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic-expected.html: Updated for new test case and behavior change.
* fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic.html: ditto
* fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly.html: Updated for behavior change.
* fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-elements.html: ditto
* fast/forms/time-multiple-fields/time-multiple-fields-appearance-style.html: ditto
* fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value-expected.txt: Added.
* fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value.html: Added for dynamic layout change from value change.
* platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly-expected.png: ditto
* platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly-expected.txt: ditto
* platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-classes-expected.png: ditto
* platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-classes-expected.txt: ditto

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (126533 => 126534)


--- trunk/LayoutTests/ChangeLog	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/LayoutTests/ChangeLog	2012-08-24 04:23:10 UTC (rev 126534)
@@ -1,3 +1,28 @@
+2012-08-23  Yoshifumi Inoue  <[email protected]>
+
+        [Forms] Step mismatched value should be editable in multiple field time UI.
+        https://bugs.webkit.org/show_bug.cgi?id=94664
+
+        Reviewed by Kent Tamura.
+
+        This patch adds new test case for step mismatched value case and
+        updates test cases to avoid step mismatched value, and a test file
+        for dynamic layout change casued by input element's value change.
+
+        Note: We need to do rebaseline for Chromium-Mac and Chromium-Win.
+
+        * fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic-expected.html: Updated for new test case and behavior change.
+        * fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic.html: ditto
+        * fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly.html: Updated for behavior change.
+        * fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-elements.html: ditto
+        * fast/forms/time-multiple-fields/time-multiple-fields-appearance-style.html: ditto
+        * fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value-expected.txt: Added.
+        * fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value.html: Added for dynamic layout change from value change.
+        * platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly-expected.png: ditto
+        * platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly-expected.txt: ditto
+        * platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-classes-expected.png: ditto
+        * platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-classes-expected.txt: ditto
+
 2012-08-23  Kenneth Russell  <[email protected]>
 
         [Chromium] LayoutTests: css3/selector3/xml tests are flaky / have wrong expectations on Snow Leopard

Modified: trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic-expected.html (126533 => 126534)


--- trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic-expected.html	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic-expected.html	2012-08-24 04:23:10 UTC (rev 126534)
@@ -4,11 +4,12 @@
 </head>
 <body>
 <ul>
-    <li>step=none <span id="focus" type="time"></span> <span type="time" value="12:34:56.789"></span></li>
-    <li>step=1 <span type="time" step="1"></span> <span step="1" type="time" value="12:34:56.789"></span></li>
+    <li>step=none <span id="focus" type="time"></span> <span type="time" value="12:34"></span></li>
+    <li>step=1 <span type="time" step="1"></span> <span step="1" type="time" value="12:34:56"></span></li>
     <li>step=0.0001 <span type="time" step="0.001"></span> <span step="0.001" type="time" value="12:34:56.789"></span></li>
-    <li>step=60 <span type="time" step="60"></span> <span step="60" type="time" value="12:34:56.789"></span></li>
-    <li>step=3600 <span type="time" step="3600"></span> <span step="3600" type="time" value="12:34:56.789"></span></li>
+    <li>step=60 <span type="time" step="60"></span> <span step="60" type="time" value="12:34"></span></li>
+    <li>step=3600 <span type="time" step="3600"></span> <span step="3600" type="time" value="12:00"></span></li>
+    <li>step mismatched <span type="time" step="1" value="12:34:56"></span></li>
 </ul>
 </body>
 <script src=""

Modified: trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic.html (126533 => 126534)


--- trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic.html	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic.html	2012-08-24 04:23:10 UTC (rev 126534)
@@ -1,11 +1,12 @@
 <html>
 <body>
 <ul>
-    <li>step=none <input id="focus" type="time"> <input type="time" value="12:34:56.789"></li>
-    <li>step=1 <input type="time" step="1"> <input step="1" type="time" value="12:34:56.789"></li>
+    <li>step=none <input id="focus" type="time"> <input type="time" value="12:34"></li>
+    <li>step=1 <input type="time" step="1"> <input step="1" type="time" value="12:34:56"></li>
     <li>step=0.0001 <input type="time" step="0.001"> <input step="0.001" type="time" value="12:34:56.789"></li>
-    <li>step=60 <input type="time" step="60"> <input step="60" type="time" value="12:34:56.789"></li>
-    <li>step=3600 <input type="time" step="3600"> <input step="3600" type="time" value="12:34:56.789"></li>
+    <li>step=60 <input type="time" step="60"> <input step="60" type="time" value="12:34"></li>
+    <li>step=3600 <input type="time" step="3600"> <input step="3600" type="time" value="12:00"></li>
+    <li>step mismatched   <input type="time" step="60" value="12:34:56"></li>
 </ul>
 </body>
 <script>

Modified: trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly.html (126533 => 126534)


--- trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly.html	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly.html	2012-08-24 04:23:10 UTC (rev 126534)
@@ -2,19 +2,19 @@
 <body>
 Disabled
 <ul>
-    <li>step=none <input disabled  type="time"> <input disabled  type="time" value="12:34:56.789"></li>
-    <li>step=1 <input disabled  type="time" step="1"> <input disabled  step="1" type="time" value="12:34:56.789"></li>
+    <li>step=none <input disabled  type="time"> <input disabled  type="time" value="12:34"></li>
+    <li>step=1 <input disabled  type="time" step="1"> <input disabled  step="1" type="time" value="12:34:56"></li>
     <li>step=0.0001 <input disabled  type="time" step="0.001"> <input disabled  step="0.001" type="time" value="12:34:56.789"></li>
-    <li>step=60 <input disabled  type="time" step="60"> <input disabled  step="60" type="time" value="12:34:56.789"></li>
-    <li>step=3600 <input disabled  type="time" step="3600"> <input disabled  step="3600" type="time" value="12:34:56.789"></li>
+    <li>step=60 <input disabled  type="time" step="60"> <input disabled  step="60" type="time" value="12:34"></li>
+    <li>step=3600 <input disabled  type="time" step="3600"> <input disabled  step="3600" type="time" value="12:34"></li>
 </ul>
 Readonly
 <ul>
-    <li>step=none <input readonly  type="time"> <input readonly  type="time" value="12:34:56.789"></li>
-    <li>step=1 <input readonly  type="time" step="1"> <input readonly  step="1" type="time" value="12:34:56.789"></li>
+    <li>step=none <input readonly  type="time"> <input readonly  type="time" value="12:34"></li>
+    <li>step=1 <input readonly  type="time" step="1"> <input readonly  step="1" type="time" value="12:34:56"></li>
     <li>step=0.0001 <input readonly  type="time" step="0.001"> <input readonly  step="0.001" type="time" value="12:34:56.789"></li>
-    <li>step=60 <input readonly  type="time" step="60"> <input readonly  step="60" type="time" value="12:34:56.789"></li>
-    <li>step=3600 <input readonly  type="time" step="3600"> <input readonly  step="3600" type="time" value="12:34:56.789"></li>
+    <li>step=60 <input readonly  type="time" step="60"> <input readonly  step="60" type="time" value="12:34"></li>
+    <li>step=3600 <input readonly  type="time" step="3600"> <input readonly  step="3600" type="time" value="12:34"></li>
 </ul>
 </body>
 </html>

Modified: trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-elements.html (126533 => 126534)


--- trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-elements.html	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-elements.html	2012-08-24 04:23:10 UTC (rev 126534)
@@ -4,9 +4,9 @@
 </head>
 <body>
 <ul>
-    <li><input type="time" value="12:34:56" class="after"></li>
-    <li><input type="time" value="12:34:56" class="before"></li>
-    <li><input type="time" value="12:34:56" class="first-letter"></li>
+    <li><input type="time" value="12:34" class="after"></li>
+    <li><input type="time" value="12:34" class="before"></li>
+    <li><input type="time" value="12:34" class="first-letter"></li>
 </ul>
 </body>
 </html>

Modified: trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-style.html (126533 => 126534)


--- trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-style.html	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-appearance-style.html	2012-08-24 04:23:10 UTC (rev 126534)
@@ -1,11 +1,11 @@
 <html>
 <body>
 <ul>
-    <li>text-align: <input type="time" value="12:34:56" style="text-align: left"></li>
-    <li>text-transform: <input type="time" value="12:34:56" style="text-transform: lowercase"></li>
-    <li>background, color: <input type="time" value="12:34:56" style="border: 0px; background: green; color: yellow"></li>
-    <li>font-size: <input type="time" value="12:34:56" style="font-size: 20pt"></li>
-    <li>font-size with fixed input width: <input type="time" value="12:34:56" style="font-size: 20pt; width: 10em;"></li>
+    <li>text-align: <input type="time" value="12:34" style="text-align: left"></li>
+    <li>text-transform: <input type="time" value="12:34" style="text-transform: lowercase"></li>
+    <li>background, color: <input type="time" value="12:34" style="border: 0px; background: green; color: yellow"></li>
+    <li>font-size: <input type="time" value="12:34" style="font-size: 20pt"></li>
+    <li>font-size with fixed input width: <input type="time" value="12:34" style="font-size: 20pt; width: 10em;"></li>
 </ul>
 </body>
 </html>

Added: trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value-expected.txt (0 => 126534)


--- trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value-expected.txt	2012-08-24 04:23:10 UTC (rev 126534)
@@ -0,0 +1,11 @@
+Change multiple fields time input UI layout by value
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS widthOfStep60 < widthWithMillisecond is true
+PASS widthOfStep60 == widthWithSecond is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Property changes on: trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value-expected.txt
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value.html (0 => 126534)


--- trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value.html	                        (rev 0)
+++ trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value.html	2012-08-24 04:23:10 UTC (rev 126534)
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script>
+description("Change multiple fields time input UI layout by value");
+var testInput = document.createElement("input");
+testInput.setAttribute("type", "time");
+testInput.setAttribute("step", "60");
+testInput.setAttribute("value", "12:34:56");
+document.body.appendChild(testInput);
+var widthOfStep60 = testInput.offsetWidth;
+
+testInput.value = "12:34:56.789";
+var widthWithMillisecond = testInput.offsetWidth;
+shouldBeTrue('widthOfStep60 < widthWithMillisecond');
+
+testInput.value = "12:34:56";
+var widthWithSecond = testInput.offsetWidth;
+shouldBeTrue('widthOfStep60 == widthWithSecond');
+
+document.body.removeChild(testInput);
+</script>
+<script src=""
+</body>
+</html>
Property changes on: trunk/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value.html
___________________________________________________________________

Added: svn:eol-style

Modified: trunk/LayoutTests/platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly-expected.txt (126533 => 126534)


--- trunk/LayoutTests/platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly-expected.txt	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/LayoutTests/platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-disabled-readonly-expected.txt	2012-08-24 04:23:10 UTC (rev 126534)
@@ -219,7 +219,7 @@
                     text run at (2,2) width 16: "12"
                 RenderText {#text} at (20,2) size 8x16
                   text run at (20,2) width 8: ":"
-                RenderBlock {SPAN} at (28,0) size 20x20 [color=#808080]
+                RenderBlock {SPAN} at (28,0) size 20x20
                   RenderText {#text} at (2,2) size 16x16
                     text run at (2,2) width 16: "34"
                 RenderText {#text} at (48,2) size 8x16
@@ -443,7 +443,7 @@
                     text run at (2,2) width 16: "12"
                 RenderText {#text} at (20,2) size 8x16
                   text run at (20,2) width 8: ":"
-                RenderBlock {SPAN} at (28,0) size 20x20 [color=#808080]
+                RenderBlock {SPAN} at (28,0) size 20x20
                   RenderText {#text} at (2,2) size 16x16
                     text run at (2,2) width 16: "34"
                 RenderText {#text} at (48,2) size 8x16

Modified: trunk/LayoutTests/platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-classes-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-classes-expected.txt (126533 => 126534)


--- trunk/LayoutTests/platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-classes-expected.txt	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/LayoutTests/platform/chromium-linux/fast/forms/time-multiple-fields/time-multiple-fields-appearance-pseudo-classes-expected.txt	2012-08-24 04:23:10 UTC (rev 126534)
@@ -66,7 +66,7 @@
                         text run at (2,2) width 16: "12"
                     RenderText {#text} at (20,2) size 8x16
                       text run at (20,2) width 8: ":"
-                    RenderBlock {SPAN} at (28,0) size 20x20 [color=#808080]
+                    RenderBlock {SPAN} at (28,0) size 20x20
                       RenderText {#text} at (2,2) size 16x16
                         text run at (2,2) width 16: "34"
                     RenderText {#text} at (48,2) size 8x16

Modified: trunk/Source/WebCore/ChangeLog (126533 => 126534)


--- trunk/Source/WebCore/ChangeLog	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/Source/WebCore/ChangeLog	2012-08-24 04:23:10 UTC (rev 126534)
@@ -1,3 +1,40 @@
+2012-08-23  Yoshifumi Inoue  <[email protected]>
+
+        [Forms] Step mismatched value should be editable in multiple field time UI.
+        https://bugs.webkit.org/show_bug.cgi?id=94664
+
+        Reviewed by Kent Tamura.
+
+        This patch changes layout method of multiple field time input UI to
+        check value of the "input" element in addition to step and range to
+        allow users to change step mismatched value from UI.
+
+        Tests: fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value.html: for changing layout by value change.
+        This patch also adds new test case into fast/forms/time-multiple-fields/time-multiple-fields-appearance-basic.html.
+
+        * html/TimeInputType.cpp:
+        (WebCore::TimeInputType::createShadowSubtree): Changed for DateTimeEditElement::create signature change.
+        (WebCore::TimeInputType::minOrMaxAttributeChanged): Changed to call updateInnerTextValue instead of removed updateEditElementLayout()
+        (WebCore::TimeInputType::stepAttributeChanged): ditto.
+        (WebCore::TimeInputType::updateInnerTextValue): Changed for DateTimeEditElement::setValueAsDate() and setEmptyValue() signature change.
+        * html/TimeInputType.h:
+        (TimeInputType): Removed updateEditElementLayout() declaration.
+        * html/shadow/DateTimeEditElement.cpp:
+        (DateTimeEditBuilder):
+        (WebCore::DateTimeEditBuilder::DateTimeEditBuilder): Added a new parameter date value to constructor to use it for layout decision.
+        (WebCore::DateTimeEditBuilder::needMillisecondField): Changed to check date value too.
+        (WebCore::DateTimeEditBuilder::needMinuteField): ditto
+        (WebCore::DateTimeEditBuilder::needSecondField): ditto
+        (WebCore::DateTimeEditBuilder::shouldMillisecondFieldReadOnly): ditto
+        (WebCore::DateTimeEditBuilder::shouldMinuteFieldReadOnly): ditto
+        (WebCore::DateTimeEditBuilder::shouldSecondFieldReadOnly): ditto
+        (WebCore::DateTimeEditElement::create): Changed for removing stepRange parameter.
+        (WebCore::DateTimeEditElement::layout): Changed to keep focus field for new layout.
+        (WebCore::DateTimeEditElement::setValueAsDate): Changed to call layout() with StepRange and date value.
+        (WebCore::DateTimeEditElement::setEmptyValue): ditto
+        * html/shadow/DateTimeEditElement.h:
+        (DateTimeEditElement):
+
 2012-08-23  Andreas Kling  <[email protected]>
 
         Use immutable StylePropertySets for element inline style declarations.

Modified: trunk/Source/WebCore/html/TimeInputType.cpp (126533 => 126534)


--- trunk/Source/WebCore/html/TimeInputType.cpp	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/Source/WebCore/html/TimeInputType.cpp	2012-08-24 04:23:10 UTC (rev 126534)
@@ -182,8 +182,7 @@
 {
     ASSERT(element()->shadow());
 
-    const StepRange stepRange(createStepRange(AnyIsDefaultStep));
-    RefPtr<DateTimeEditElement> dateTimeEditElement(DateTimeEditElement::create(element()->document(), m_dateTimeEditControlOwnerImpl, stepRange));
+    RefPtr<DateTimeEditElement> dateTimeEditElement(DateTimeEditElement::create(element()->document(), m_dateTimeEditControlOwnerImpl));
     m_dateTimeEditElement = dateTimeEditElement.get();
     element()->userAgentShadowRoot()->appendChild(m_dateTimeEditElement);
     updateInnerTextValue();
@@ -238,7 +237,7 @@
 
 void TimeInputType::minOrMaxAttributeChanged()
 {
-    updateEditElementLayout();
+    updateInnerTextValue();
 }
 
 void TimeInputType::readonlyAttributeChanged()
@@ -266,27 +265,21 @@
 
 void TimeInputType::stepAttributeChanged()
 {
-    updateEditElementLayout();
+    updateInnerTextValue();
 }
 
-void TimeInputType::updateEditElementLayout()
-{
-    if (m_dateTimeEditElement)
-        m_dateTimeEditElement->layout(createStepRange(AnyIsDefaultStep));
-}
-
 void TimeInputType::updateInnerTextValue()
 {
     if (!m_dateTimeEditElement)
         return;
 
+    const StepRange stepRange(createStepRange(AnyIsDefaultStep));
     DateComponents date;
     if (parseToDateComponents(element()->value(), &date))
-        m_dateTimeEditElement->setValueAsDate(date);
+        m_dateTimeEditElement->setValueAsDate(stepRange, date);
     else {
-        const StepRange stepRange(createStepRange(AnyIsDefaultStep));
         setMillisecondToDateComponents(stepRange.minimum().toDouble(), &date);
-        m_dateTimeEditElement->setEmptyValue(date);
+        m_dateTimeEditElement->setEmptyValue(stepRange, date);
     }
 }
 #else

Modified: trunk/Source/WebCore/html/TimeInputType.h (126533 => 126534)


--- trunk/Source/WebCore/html/TimeInputType.h	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/Source/WebCore/html/TimeInputType.h	2012-08-24 04:23:10 UTC (rev 126534)
@@ -80,8 +80,6 @@
 
     friend class DateTimeEditControlOwnerImpl;
 
-    void updateEditElementLayout();
-
     // InputType functions
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) const OVERRIDE FINAL;
     virtual void createShadowSubtree() OVERRIDE FINAL;

Modified: trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp (126533 => 126534)


--- trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp	2012-08-24 04:23:10 UTC (rev 126534)
@@ -50,7 +50,7 @@
     WTF_MAKE_NONCOPYABLE(DateTimeEditBuilder);
 
 public:
-    DateTimeEditBuilder(DateTimeEditElement&, const StepRange&);
+    DateTimeEditBuilder(DateTimeEditElement&, const StepRange&, const DateComponents&);
 
     bool build(const String&);
     bool needSecondField() const;
@@ -67,11 +67,13 @@
     virtual void visitLiteral(const String&) OVERRIDE FINAL;
 
     DateTimeEditElement& m_editElement;
+    const DateComponents& m_dateValue;
     const StepRange& m_stepRange;
 };
 
-DateTimeEditBuilder::DateTimeEditBuilder(DateTimeEditElement& elemnt, const StepRange& stepRange)
+DateTimeEditBuilder::DateTimeEditBuilder(DateTimeEditElement& elemnt, const StepRange& stepRange, const DateComponents& dateValue)
     : m_editElement(elemnt)
+    , m_dateValue(dateValue)
     , m_stepRange(stepRange)
 {
 }
@@ -84,19 +86,22 @@
 
 bool DateTimeEditBuilder::needMillisecondField() const
 {
-    return !m_stepRange.minimum().remainder(static_cast<int>(msPerSecond)).isZero()
+    return m_dateValue.millisecond()
+        || !m_stepRange.minimum().remainder(static_cast<int>(msPerSecond)).isZero()
         || !m_stepRange.step().remainder(static_cast<int>(msPerSecond)).isZero();
 }
 
 bool DateTimeEditBuilder::needMinuteField() const
 {
-    return !m_stepRange.minimum().remainder(static_cast<int>(msPerHour)).isZero()
+    return m_dateValue.minute()
+        || !m_stepRange.minimum().remainder(static_cast<int>(msPerHour)).isZero()
         || !m_stepRange.step().remainder(static_cast<int>(msPerHour)).isZero();
 }
 
 bool DateTimeEditBuilder::needSecondField() const
 {
-    return !m_stepRange.minimum().remainder(static_cast<int>(msPerMinute)).isZero()
+    return m_dateValue.second()
+        || !m_stepRange.minimum().remainder(static_cast<int>(msPerMinute)).isZero()
         || !m_stepRange.step().remainder(static_cast<int>(msPerMinute)).isZero();
 }
 
@@ -161,17 +166,17 @@
 
 bool DateTimeEditBuilder::shouldMillisecondFieldReadOnly() const
 {
-    return m_stepRange.step().remainder(static_cast<int>(msPerSecond)).isZero();
+    return !m_dateValue.millisecond() && m_stepRange.step().remainder(static_cast<int>(msPerSecond)).isZero();
 }
 
 bool DateTimeEditBuilder::shouldMinuteFieldReadOnly() const
 {
-    return m_stepRange.step().remainder(static_cast<int>(msPerHour)).isZero();
+    return !m_dateValue.minute() && m_stepRange.step().remainder(static_cast<int>(msPerHour)).isZero();
 }
 
 bool DateTimeEditBuilder::shouldSecondFieldReadOnly() const
 {
-    return m_stepRange.step().remainder(static_cast<int>(msPerMinute)).isZero();
+    return !m_dateValue.second() && m_stepRange.step().remainder(static_cast<int>(msPerMinute)).isZero();
 }
 
 void DateTimeEditBuilder::visitLiteral(const String& text)
@@ -213,10 +218,9 @@
     appendChild(field);
 }
 
-PassRefPtr<DateTimeEditElement> DateTimeEditElement::create(Document* document, EditControlOwner& editControlOwner, const StepRange& stepRange)
+PassRefPtr<DateTimeEditElement> DateTimeEditElement::create(Document* document, EditControlOwner& editControlOwner)
 {
     RefPtr<DateTimeEditElement> container = adoptRef(new DateTimeEditElement(document, editControlOwner));
-    container->layout(stepRange);
     return container.release();
 }
 
@@ -341,12 +345,14 @@
     return m_editControlOwner && m_editControlOwner->isEditControlOwnerReadOnly();
 }
 
-void DateTimeEditElement::layout(const StepRange& stepRange)
+void DateTimeEditElement::layout(const StepRange& stepRange, const DateComponents& dateValue)
 {
+    size_t focusFieldIndex = m_focusFieldIndex;
     DateTimeFieldElement* const focusField = fieldAt(m_focusFieldIndex);
+    const AtomicString focusFieldId = focusField ? focusField->shadowPseudoId() : nullAtom;
     focusFieldAt(invalidFieldIndex);
 
-    DateTimeEditBuilder builder(*this, stepRange);
+    DateTimeEditBuilder builder(*this, stepRange, dateValue);
     const String dateTimeFormat = builder.needSecondField() ? localizedTimeFormatText() : localizedShortTimeFormatText();
     if (!builder.build(dateTimeFormat) || m_fields.isEmpty())
         builder.build(builder.needSecondField() ? "HH:mm:ss" : "HH:mm");
@@ -355,13 +361,14 @@
     m_spinButton = spinButton.get();
     appendChild(spinButton);
 
-    if (focusField) {
+    if (focusFieldIndex != invalidFieldIndex) {
         for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex) {
-            if (focusField == m_fields[fieldIndex]) {
-                focusFieldAt(fieldIndex);
+            if (m_fields[fieldIndex]->shadowPseudoId() == focusFieldId) {
+                focusFieldIndex = fieldIndex;
                 break;
             }
         }
+        focusFieldAt(std::min(focusFieldIndex, m_fields.size() - 1));
     }
 }
 
@@ -434,14 +441,16 @@
     focusField->defaultEventHandler(event);
 }
 
-void DateTimeEditElement::setValueAsDate(const DateComponents& date)
+void DateTimeEditElement::setValueAsDate(const StepRange& stepRange, const DateComponents& date)
 {
+    layout(stepRange, date);
     for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex)
         m_fields[fieldIndex]->setValueAsDate(date);
 }
 
-void DateTimeEditElement::setEmptyValue(const DateComponents& dateForReadOnlyField)
+void DateTimeEditElement::setEmptyValue(const StepRange& stepRange, const DateComponents& dateForReadOnlyField)
 {
+    layout(stepRange, dateForReadOnlyField);
     for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex)
         m_fields[fieldIndex]->setEmptyValue(dateForReadOnlyField, DateTimeFieldElement::DispatchNoEvent);
 }

Modified: trunk/Source/WebCore/html/shadow/DateTimeEditElement.h (126533 => 126534)


--- trunk/Source/WebCore/html/shadow/DateTimeEditElement.h	2012-08-24 04:03:31 UTC (rev 126533)
+++ trunk/Source/WebCore/html/shadow/DateTimeEditElement.h	2012-08-24 04:23:10 UTC (rev 126534)
@@ -59,18 +59,17 @@
         virtual bool isEditControlOwnerReadOnly() const = 0;
     };
 
-    static PassRefPtr<DateTimeEditElement> create(Document*, EditControlOwner&, const StepRange&);
+    static PassRefPtr<DateTimeEditElement> create(Document*, EditControlOwner&);
 
     virtual ~DateTimeEditElement();
     void addField(PassRefPtr<DateTimeFieldElement>);
     virtual void defaultEventHandler(Event*) OVERRIDE;
     void disabledStateChanged();
-    void layout(const StepRange&);
     void readOnlyStateChanged();
     void removeEditControlOwner() { m_editControlOwner = 0; }
     void resetLayout();
-    void setEmptyValue(const DateComponents&  dateForReadOnlyField);
-    void setValueAsDate(const DateComponents&);
+    void setEmptyValue(const StepRange&, const DateComponents&  dateForReadOnlyField);
+    void setValueAsDate(const StepRange&, const DateComponents&);
     double valueAsDouble() const;
 
 private:
@@ -95,6 +94,7 @@
     void handleMouseEvent(MouseEvent*);
     bool isDisabled() const;
     bool isReadOnly() const;
+    void layout(const StepRange&, const DateComponents&);
     size_t nextFieldIndex() const;
     size_t previousFieldIndex() const;
     void updateUIState();
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to