Diff
Modified: trunk/Source/WebCore/ChangeLog (130368 => 130369)
--- trunk/Source/WebCore/ChangeLog 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/ChangeLog 2012-10-04 07:49:58 UTC (rev 130369)
@@ -1,5 +1,76 @@
2012-10-04 Kent Tamura <[email protected]>
+ Add code for input[type=date] with the multiple fields UI
+ https://bugs.webkit.org/show_bug.cgi?id=98340
+
+ Reviewed by Hajime Morita.
+
+ The new code is available if !ENABLE(INPUT_TYPE_DATE_LEGACY_UI). At this
+ moment, there are no platforms enabling the new code. We're going to
+ enable it soon on desktop Chromium, and add tests. Then we're going to
+ remove the code for ENABLE(INPUT_TYPE_DATE_LEGACY_UI).
+
+ ENABLE(INPUT_TYPE_DATE_LEGACY_UI) means the current UI; input[type=date]
+ is represetnted as a kind of text field, and it has code to invoke a
+ calendar picker.
+ ENABLE(CALENDAR_PICKER) was used wrongly. It meant calendar picker
+ support + text field UI of input[type=date]. Now it means only calendar
+ picker support.
+
+ * html/DateInputType.h:
+ (WebCore): If ENABLE(INPUT_MULTIPLE_FIELDS_UI) &&
+ !ENABLE(INPUT_TYPE_DATE_LEGACY_UI), change the base class to the class
+ for multiple fields UI.
+ (DateInputType): Wrap the code for text fields behavior and calendar
+ picker UI with ENABLE(INPUT_TYPE_DATE_LEGACY_UI). Add functions for
+ ENABLE(INPUT_MULTIPLE_FIELDS_UI)
+ * html/DateInputType.cpp:
+ (WebCore::DateInputType::DateInputType):
+ Change the flag name; CALENDAR_PICKER -> INPUT_TYPE_DATE_LEGACY_UI
+ (WebCore): ditto.
+ (WebCore::DateInputType::formatDateTimeFieldsState):
+ A callback for multiple fields UI. This constructs a string value from
+ each of values of multiple fields.
+ Note that we don't need to do +1 to month().
+ (WebCore::DateInputType::setupLayoutParameters):
+ A callback for multiple fields UI. Passes information to build UI.
+
+ * html/BaseMultipleFieldsDateAndTimeInputType.h:
+ (BaseMultipleFieldsDateAndTimeInputType):
+ Add m_pickerIndicatorIsAlwaysVisible member, wrap some members with flags.
+ * html/BaseMultipleFieldsDateAndTimeInputType.cpp:
+ (WebCore::BaseMultipleFieldsDateAndTimeInputType::BaseMultipleFieldsDateAndTimeInputType):
+ Initialize m_pickerIndicatorIsAlwaysVisible.
+ (WebCore::BaseMultipleFieldsDateAndTimeInputType::createShadowSubtree):
+ If a type supports calendar picker, we should always show the picker
+ indicator. We introduce m_pickerIndicatorIsAlwaysVisible flag, and ask
+ RenderTheme for support status of each of types.
+ Add a local variable 'document' to avoid multiple element()->document().
+ (WebCore::BaseMultipleFieldsDateAndTimeInputType::updatePickerIndicatorVisibility):
+ - If m_pickerIndicatorIsAlwaysVisible, don't hide the picker indicator element.
+ - Wrap the code with appropriate flags.
+
+ * rendering/RenderTheme.h:
+ (WebCore::RenderTheme::supportsCalendarPicker): Added.
+ * rendering/RenderThemeChromiumMac.h: Override supportsCalendarPicker.
+ * rendering/RenderThemeChromiumMac.mm:
+ (WebCore::RenderThemeChromiumMac::supportsCalendarPicker):
+ Added. Delegate to RenderThemeChromiumCommon.
+ * rendering/RenderThemeChromiumSkia.h: Override supportsCalendarPicker.
+ * rendering/RenderThemeChromiumSkia.cpp:
+ (WebCore::RenderThemeChromiumSkia::supportsCalendarPicker):
+ Added. Delegate to RenderThemeChromiumCommon.
+ * rendering/RenderThemeChromiumCommon.h:
+ (RenderThemeChromiumCommon): Declare supportsCalendarPicker.
+ * rendering/RenderThemeChromiumCommon.cpp:
+ (WebCore::RenderThemeChromiumCommon::supportsCalendarPicker):
+ Returns true if the type is "date."
+
+ * html/DateTimeFieldsState.h:
+ (DateTimeFieldsState): Add a comment for the m_month field.
+
+2012-10-04 Kent Tamura <[email protected]>
+
DateTimeYearFieldElement should respect min/max values specified by page authors
https://bugs.webkit.org/show_bug.cgi?id=98227
Modified: trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp (130368 => 130369)
--- trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp 2012-10-04 07:49:58 UTC (rev 130369)
@@ -42,7 +42,9 @@
#include "HTMLOptionElement.h"
#include "KeyboardEvent.h"
#include "Localizer.h"
+#include "Page.h"
#include "PickerIndicatorElement.h"
+#include "RenderTheme.h"
#include "ShadowRoot.h"
#include <wtf/DateMath.h>
@@ -96,6 +98,7 @@
, m_dateTimeEditElement(0)
, m_pickerIndicatorElement(0)
, m_pickerIndicatorIsVisible(false)
+ , m_pickerIndicatorIsAlwaysVisible(false)
{
}
@@ -122,24 +125,37 @@
ASSERT(element()->shadow());
- RefPtr<HTMLDivElement> container = HTMLDivElement::create(element()->document());
+ Document* document = element()->document();
+ RefPtr<HTMLDivElement> container = HTMLDivElement::create(document);
element()->userAgentShadowRoot()->appendChild(container);
container->setShadowPseudoId(dateAndTimeInputContainerPseudoId);
- RefPtr<DateTimeEditElement> dateTimeEditElement(DateTimeEditElement::create(element()->document(), *this));
+ RefPtr<DateTimeEditElement> dateTimeEditElement(DateTimeEditElement::create(document, *this));
m_dateTimeEditElement = dateTimeEditElement.get();
container->appendChild(m_dateTimeEditElement);
updateInnerTextValue();
+#if ENABLE(DATALIST_ELEMENT) || ENABLE(CALENDAR_PICKER)
+ bool shouldAddPickerIndicator = false;
#if ENABLE(DATALIST_ELEMENT)
- if (InputType::themeSupportsDataListUI(this)) {
- RefPtr<PickerIndicatorElement> pickerElement = PickerIndicatorElement::create(element()->document());
+ if (InputType::themeSupportsDataListUI(this))
+ shouldAddPickerIndicator = true;
+#endif
+#if ENABLE(CALENDAR_PICKER)
+ RefPtr<RenderTheme> theme = document->page() ? document->page()->theme() : RenderTheme::defaultTheme();
+ if (theme->supportsCalendarPicker(formControlType())) {
+ shouldAddPickerIndicator = true;
+ m_pickerIndicatorIsAlwaysVisible = true;
+ }
+#endif
+ if (shouldAddPickerIndicator) {
+ RefPtr<PickerIndicatorElement> pickerElement = PickerIndicatorElement::create(document);
m_pickerIndicatorElement = pickerElement.get();
container->appendChild(m_pickerIndicatorElement);
m_pickerIndicatorIsVisible = true;
updatePickerIndicatorVisibility();
}
-#endif
+#endif // ENABLE(DATALIST_ELEMENT) || ENABLE(CALENDAR_PICKER)
}
void BaseMultipleFieldsDateAndTimeInputType::destroyShadowSubtree()
@@ -270,9 +286,18 @@
{
updatePickerIndicatorVisibility();
}
+#endif
+#if ENABLE(DATALIST_ELEMENT) || ENABLE(CALENDAR_PICKER)
void BaseMultipleFieldsDateAndTimeInputType::updatePickerIndicatorVisibility()
{
+#if ENABLE(CALENDAR_PICKER)
+ if (m_pickerIndicatorIsAlwaysVisible) {
+ showPickerIndicator();
+ return;
+ }
+#endif
+#if ENABLE(DATALIST_ELEMENT)
if (HTMLDataListElement* dataList = element()->dataList()) {
RefPtr<HTMLCollection> options = dataList->options();
for (unsigned i = 0; HTMLOptionElement* option = toHTMLOptionElement(options->item(i)); ++i) {
@@ -283,6 +308,7 @@
}
}
hidePickerIndicator();
+#endif
}
void BaseMultipleFieldsDateAndTimeInputType::hidePickerIndicator()
@@ -302,7 +328,7 @@
ASSERT(m_pickerIndicatorElement);
m_pickerIndicatorElement->removeInlineStyleProperty(CSSPropertyDisplay);
}
-#endif
+#endif // ENABLE(DATALIST_ELEMENT) || ENABLE(CALENDAR_PICKER)
int BaseMultipleFieldsDateAndTimeInputType::fullYear(const String& source) const
{
Modified: trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.h (130368 => 130369)
--- trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.h 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.h 2012-10-04 07:49:58 UTC (rev 130369)
@@ -86,8 +86,13 @@
void updatePickerIndicatorVisibility();
DateTimeEditElement* m_dateTimeEditElement;
+#if ENABLE(DATALIST_ELEMENT) || ENABLE(CALENDAR_PICKER)
PickerIndicatorElement* m_pickerIndicatorElement;
bool m_pickerIndicatorIsVisible;
+#if ENABLE(CALENDAR_PICKER)
+ bool m_pickerIndicatorIsAlwaysVisible;
+#endif
+#endif
};
} // namespace WebCore
Modified: trunk/Source/WebCore/html/DateInputType.cpp (130368 => 130369)
--- trunk/Source/WebCore/html/DateInputType.cpp 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/html/DateInputType.cpp 2012-10-04 07:49:58 UTC (rev 130369)
@@ -32,10 +32,12 @@
#include "DateInputType.h"
#include "DateComponents.h"
+#include "DateTimeFieldsState.h"
#include "HTMLInputElement.h"
#include "HTMLNames.h"
#include "InputTypeNames.h"
#include "KeyboardEvent.h"
+#include "LocalizedStrings.h"
#include "Localizer.h"
#include "PickerIndicatorElement.h"
#include <wtf/PassOwnPtr.h>
@@ -51,8 +53,8 @@
static const int dateStepScaleFactor = 86400000;
inline DateInputType::DateInputType(HTMLInputElement* element)
- : BaseDateAndTimeInputType(element)
-#if ENABLE(CALENDAR_PICKER)
+ : BaseDateInputType(element)
+#if ENABLE(INPUT_TYPE_DATE_LEGACY_UI)
, m_pickerElement(0)
#endif
{
@@ -102,7 +104,7 @@
return true;
}
-#if ENABLE(CALENDAR_PICKER)
+#if ENABLE(INPUT_TYPE_DATE_LEGACY_UI)
void DateInputType::createShadowSubtree()
{
BaseDateAndTimeInputType::createShadowSubtree();
@@ -166,7 +168,28 @@
{
return element()->localizer().dateFormatText();
}
-#endif // ENABLE(CALENDAR_PICKER)
+#endif // ENABLE(INPUT_TYPE_DATE_LEGACY_UI)
+#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) && !ENABLE(INPUT_TYPE_DATE_LEGACY_UI)
+String DateInputType::formatDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) const
+{
+ if (!dateTimeFieldsState.hasDayOfMonth() || !dateTimeFieldsState.hasMonth() || !dateTimeFieldsState.hasYear())
+ return emptyString();
+
+ return String::format("%04u-%02u-%02u", dateTimeFieldsState.year(), dateTimeFieldsState.month(), dateTimeFieldsState.dayOfMonth());
+}
+
+void DateInputType::setupLayoutParameters(DateTimeEditElement::LayoutParameters& layoutParameters, const DateComponents& date) const
+{
+ layoutParameters.dateTimeFormat = layoutParameters.localizer.dateFormat();
+ layoutParameters.fallbackDateTimeFormat = ASCIILiteral("yyyy-MM-dd");
+ layoutParameters.minimumYear = fullYear(element()->fastGetAttribute(minAttr));
+ layoutParameters.maximumYear = fullYear(element()->fastGetAttribute(maxAttr));
+ layoutParameters.placeholderForDay = placeholderForDayOfMonthField();
+ layoutParameters.placeholderForMonth = placeholderForMonthField();
+ layoutParameters.placeholderForYear = placeholderForYearField();
+}
+#endif
+
} // namespace WebCore
#endif
Modified: trunk/Source/WebCore/html/DateInputType.h (130368 => 130369)
--- trunk/Source/WebCore/html/DateInputType.h 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/html/DateInputType.h 2012-10-04 07:49:58 UTC (rev 130369)
@@ -31,16 +31,21 @@
#ifndef DateInputType_h
#define DateInputType_h
-#include "BaseDateAndTimeInputType.h"
+#if ENABLE(INPUT_TYPE_DATE)
+#include "BaseMultipleFieldsDateAndTimeInputType.h"
#include <wtf/RefPtr.h>
-#if ENABLE(INPUT_TYPE_DATE)
-
namespace WebCore {
class PickerIndicatorElement;
-class DateInputType : public BaseDateAndTimeInputType {
+#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) && !ENABLE(INPUT_TYPE_DATE_LEGACY_UI)
+typedef BaseMultipleFieldsDateAndTimeInputType BaseDateInputType;
+#else
+typedef BaseDateAndTimeInputType BaseDateInputType;
+#endif
+
+class DateInputType : public BaseDateInputType {
public:
static PassOwnPtr<InputType> create(HTMLInputElement*);
@@ -52,7 +57,8 @@
virtual bool parseToDateComponentsInternal(const UChar*, unsigned length, DateComponents*) const OVERRIDE;
virtual bool setMillisecondToDateComponents(double, DateComponents*) const OVERRIDE;
virtual bool isDateField() const OVERRIDE;
-#if ENABLE(CALENDAR_PICKER)
+
+#if ENABLE(INPUT_TYPE_DATE_LEGACY_UI)
virtual void createShadowSubtree() OVERRIDE;
virtual void destroyShadowSubtree() OVERRIDE;
virtual void handleKeydownEvent(KeyboardEvent*) OVERRIDE;
@@ -66,7 +72,13 @@
virtual bool shouldHaveSpinButton() const OVERRIDE;
PickerIndicatorElement* m_pickerElement;
+#else
+#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
+ // BaseMultipleFieldsDateAndTimeInputType functions
+ virtual String formatDateTimeFieldsState(const DateTimeFieldsState&) const OVERRIDE;
+ virtual void setupLayoutParameters(DateTimeEditElement::LayoutParameters&, const DateComponents&) const OVERRIDE;
#endif
+#endif
};
} // namespace WebCore
Modified: trunk/Source/WebCore/html/DateTimeFieldsState.h (130368 => 130369)
--- trunk/Source/WebCore/html/DateTimeFieldsState.h 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/html/DateTimeFieldsState.h 2012-10-04 07:49:58 UTC (rev 130369)
@@ -87,7 +87,7 @@
private:
unsigned m_year;
- unsigned m_month;
+ unsigned m_month; // 1 to 12.
unsigned m_dayOfMonth;
unsigned m_hour; // 1 to 12.
unsigned m_minute;
Modified: trunk/Source/WebCore/rendering/RenderTheme.h (130368 => 130369)
--- trunk/Source/WebCore/rendering/RenderTheme.h 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/rendering/RenderTheme.h 2012-10-04 07:49:58 UTC (rev 130369)
@@ -137,6 +137,11 @@
// A method asking if the platform is able to show datalist suggestions for a given input type.
virtual bool supportsDataListUI(const AtomicString&) const { return false; }
+#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) && ENABLE(CALENDAR_PICKER)
+ // A method asking if the platform is able to show a calendar picker for a given input type.
+ virtual bool supportsCalendarPicker(const AtomicString&) const { return false; }
+#endif
+
// Text selection colors.
Color activeSelectionBackgroundColor() const;
Color inactiveSelectionBackgroundColor() const;
Modified: trunk/Source/WebCore/rendering/RenderThemeChromiumCommon.cpp (130368 => 130369)
--- trunk/Source/WebCore/rendering/RenderThemeChromiumCommon.cpp 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/rendering/RenderThemeChromiumCommon.cpp 2012-10-04 07:49:58 UTC (rev 130369)
@@ -46,6 +46,14 @@
|| type == InputTypeNames::range();
}
+#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) && ENABLE(CALENDAR_PICKER)
+bool RenderThemeChromiumCommon::supportsCalendarPicker(const AtomicString& type)
+{
+ // FIXME: We'd like to support datetime, datetime-local, month, and week too.
+ return type == InputTypeNames::date();
+}
+#endif
+
LayoutUnit RenderThemeChromiumCommon::sliderTickSnappingThreshold()
{
return 5;
Modified: trunk/Source/WebCore/rendering/RenderThemeChromiumCommon.h (130368 => 130369)
--- trunk/Source/WebCore/rendering/RenderThemeChromiumCommon.h 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/rendering/RenderThemeChromiumCommon.h 2012-10-04 07:49:58 UTC (rev 130369)
@@ -35,6 +35,9 @@
class RenderThemeChromiumCommon {
public:
static bool supportsDataListUI(const AtomicString& type);
+#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) && ENABLE(CALENDAR_PICKER)
+ static bool supportsCalendarPicker(const AtomicString& type);
+#endif
static LayoutUnit sliderTickSnappingThreshold();
};
Modified: trunk/Source/WebCore/rendering/RenderThemeChromiumMac.h (130368 => 130369)
--- trunk/Source/WebCore/rendering/RenderThemeChromiumMac.h 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/rendering/RenderThemeChromiumMac.h 2012-10-04 07:49:58 UTC (rev 130369)
@@ -77,6 +77,9 @@
#if ENABLE(CALENDAR_PICKER)
virtual CString extraCalendarPickerStyleSheet() OVERRIDE;
#endif
+#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) && ENABLE(CALENDAR_PICKER)
+ virtual bool supportsCalendarPicker(const AtomicString& type) const OVERRIDE;
+#endif
virtual bool shouldShowPlaceholderWhenFocused() const OVERRIDE;
};
Modified: trunk/Source/WebCore/rendering/RenderThemeChromiumMac.mm (130368 => 130369)
--- trunk/Source/WebCore/rendering/RenderThemeChromiumMac.mm 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/rendering/RenderThemeChromiumMac.mm 2012-10-04 07:49:58 UTC (rev 130369)
@@ -189,6 +189,13 @@
}
#endif
+#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) && ENABLE(CALENDAR_PICKER)
+bool RenderThemeChromiumMac::supportsCalendarPicker(const AtomicString& type) const
+{
+ return RenderThemeChromiumCommon::supportsCalendarPicker(type);
+}
+#endif
+
bool RenderThemeChromiumMac::paintMediaVolumeSliderContainer(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
{
return true;
Modified: trunk/Source/WebCore/rendering/RenderThemeChromiumSkia.cpp (130368 => 130369)
--- trunk/Source/WebCore/rendering/RenderThemeChromiumSkia.cpp 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/rendering/RenderThemeChromiumSkia.cpp 2012-10-04 07:49:58 UTC (rev 130369)
@@ -131,6 +131,13 @@
return RenderThemeChromiumCommon::supportsDataListUI(type);
}
+#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) && ENABLE(CALENDAR_PICKER)
+bool RenderThemeChromiumSkia::supportsCalendarPicker(const AtomicString& type) const
+{
+ return RenderThemeChromiumCommon::supportsCalendarPicker(type);
+}
+#endif
+
#if ENABLE(VIDEO_TRACK)
bool RenderThemeChromiumSkia::supportsClosedCaptioning() const
{
Modified: trunk/Source/WebCore/rendering/RenderThemeChromiumSkia.h (130368 => 130369)
--- trunk/Source/WebCore/rendering/RenderThemeChromiumSkia.h 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebCore/rendering/RenderThemeChromiumSkia.h 2012-10-04 07:49:58 UTC (rev 130369)
@@ -181,6 +181,9 @@
#if ENABLE(DATALIST_ELEMENT)
virtual LayoutUnit sliderTickSnappingThreshold() const OVERRIDE;
#endif
+#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) && ENABLE(CALENDAR_PICKER)
+ virtual bool supportsCalendarPicker(const AtomicString& type) const OVERRIDE;
+#endif
int menuListInternalPadding(RenderStyle*, int paddingType) const;
bool paintMediaButtonInternal(GraphicsContext*, const IntRect&, Image*);
Modified: trunk/Source/WebKit/chromium/ChangeLog (130368 => 130369)
--- trunk/Source/WebKit/chromium/ChangeLog 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebKit/chromium/ChangeLog 2012-10-04 07:49:58 UTC (rev 130369)
@@ -1,3 +1,12 @@
+2012-10-04 Kent Tamura <[email protected]>
+
+ Add code for input[type=date] with the multiple fields UI
+ https://bugs.webkit.org/show_bug.cgi?id=98340
+
+ Reviewed by Hajime Morita.
+
+ * features.gypi: Add ENABLE_INPUT_TYPE_DATE_LEGACY_UI=1 for non-Android.
+
2012-10-03 Keishi Hattori <[email protected]>
Implement localizeValue for TimeInputType
Modified: trunk/Source/WebKit/chromium/features.gypi (130368 => 130369)
--- trunk/Source/WebKit/chromium/features.gypi 2012-10-04 07:27:05 UTC (rev 130368)
+++ trunk/Source/WebKit/chromium/features.gypi 2012-10-04 07:49:58 UTC (rev 130369)
@@ -176,6 +176,7 @@
'ENABLE_DATALIST_ELEMENT=1',
'ENABLE_INPUT_SPEECH=1',
'ENABLE_INPUT_TYPE_COLOR=1',
+ 'ENABLE_INPUT_TYPE_DATE_LEGACY_UI=1',
'ENABLE_INPUT_MULTIPLE_FIELDS_UI=1',
'ENABLE_JAVASCRIPT_I18N_API=1',
'ENABLE_LEGACY_NOTIFICATIONS=1',