Changeset 129729 in webkit
- Timestamp:
- Sep 26, 2012 11:43:17 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r129728 r129729 1 2012-09-26 Yoshifumi Inoue <yosin@chromium.org> 2 3 [Forms] Move multiple fields related functions to BaseDateAndTimeInputType from TimeInputType 4 https://bugs.webkit.org/show_bug.cgi?id=97521 5 6 Reviewed by Kent Tamura. 7 8 This patch introduces new class BaseMultipleFieldsDateAndTimeInputType 9 for sharing code among multiple fields date/time input UI. 10 11 Member functions in BaseMultipleFieldsDateAndTimeInputType are moved 12 from TimeInputType. BaseMultipleFieldsDateAndTimeInputType.{cpp,h} 13 were copied from TimeInputType.{cpp,h} by r129721. 14 15 This patch affects ports which enable both ENABLE_INPUT_TYPE_TIME and 16 ENABLE_INPUT_MULTIPLE_FIELDS_UI. 17 18 No new tests. This patch doesn't change behavior. 19 20 * WebCore.gypi: Changed to have html/BaseMultipleFieldsDateAndTimeInputType.{cpp,h} 21 * html/BaseDateAndTimeInputType.h: 22 (BaseDateAndTimeInputType): Exposed setMillisecondToDateComponents as protected for BaseMultipleFieldsDateAndTimeInputType::restoreFormControlState(). 23 * html/BaseMultipleFieldsDateAndTimeInputType.cpp: 24 (WebCore::BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::DateTimeEditControlOwnerImpl): Moved from TimeInputType::DateTimeEditControlOwnerImpl. 25 (WebCore::BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::~DateTimeEditControlOwnerImpl): ditto. 26 (WebCore::BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::didBlurFromControl): ditto. 27 (WebCore::BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::didFocusOnControl): ditto. 28 (WebCore::BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::editControlValueChanged): ditto. 29 (WebCore::BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::formatDateTimeFieldsState): Moved from TimeInputType::DateTimeEditControlOwnerImpl and changed to call formatDateTimeFieldsState() in BaseMultipleFieldsDateAndTimeInputTypeInputType class. 30 (WebCore::BaseMultipleFieldsDateAndTimeInputType::hasCustomFocusLogic): Moved from TimeInputType. 31 (WebCore::BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::isEditControlOwnerDisabled): ditto. 32 (WebCore::BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::isEditControlOwnerReadOnly): ditto. 33 (WebCore::BaseMultipleFieldsDateAndTimeInputType::BaseMultipleFieldsDateAndTimeInputType): ditto. 34 (WebCore::BaseMultipleFieldsDateAndTimeInputType::~BaseMultipleFieldsDateAndTimeInputType): ditto. 35 (WebCore::BaseMultipleFieldsDateAndTimeInputType::blur): ditto. 36 (WebCore::BaseMultipleFieldsDateAndTimeInputType::createRenderer): ditto. 37 (WebCore::BaseMultipleFieldsDateAndTimeInputType::createShadowSubtree): ditto. 38 (WebCore::BaseMultipleFieldsDateAndTimeInputType::destroyShadowSubtree): ditto. 39 (WebCore::BaseMultipleFieldsDateAndTimeInputType::focus): ditto. 40 (WebCore::BaseMultipleFieldsDateAndTimeInputType::forwardEvent): ditto. 41 (WebCore::BaseMultipleFieldsDateAndTimeInputType::disabledAttributeChanged): ditto. 42 (WebCore::BaseMultipleFieldsDateAndTimeInputType::handleKeydownEvent): ditto. 43 (WebCore::BaseMultipleFieldsDateAndTimeInputType::isKeyboardFocusable): ditto. 44 (WebCore::BaseMultipleFieldsDateAndTimeInputType::isMouseFocusable): ditto. 45 (WebCore::BaseMultipleFieldsDateAndTimeInputType::minOrMaxAttributeChanged): ditto. 46 (WebCore::BaseMultipleFieldsDateAndTimeInputType::readonlyAttributeChanged): ditto. 47 (WebCore::BaseMultipleFieldsDateAndTimeInputType::isTextField): ditto. 48 (WebCore::BaseMultipleFieldsDateAndTimeInputType::restoreFormControlState): ditto. 49 (WebCore::BaseMultipleFieldsDateAndTimeInputType::saveFormControlState): ditto. 50 (WebCore::BaseMultipleFieldsDateAndTimeInputType::setValue): ditto. 51 (WebCore::BaseMultipleFieldsDateAndTimeInputType::shouldUseInputMethod): ditto. 52 (WebCore::BaseMultipleFieldsDateAndTimeInputType::stepAttributeChanged): ditto. 53 (WebCore::BaseMultipleFieldsDateAndTimeInputType::updateInnerTextValue): Moved from TimeInputType and changed to call setupLayoutParameters() to set date/time format by each input type. 54 * html/BaseMultipleFieldsDateAndTimeInputType.h: 55 (BaseMultipleFieldsDateAndTimeInputType): Added. 56 (DateTimeEditControlOwnerImpl): Moved from TimeInputType. 57 * html/TimeInputType.cpp: Moved multiple fields UI related functions to BaseMultipleFieldsDateAndTimeInputType. 58 (WebCore::TimeInputType::TimeInputType): Changed base class name to BaseTimeInput. 59 (WebCore::TimeInputType::formatDateTimeFieldsState): Moved from TimeINput::DateTImeEditControlOwnerImpl class. 60 (WebCore::TimeInputType::setupLayoutParameters): Added for set time format. 61 * html/TimeInputType.h: 62 (TimeInputType): Chaned base class to BaseTimeInput which is alias of BaseDateAndTimeInputType or BaseMultipleFieldsDateAndTimeInputType. 63 1 64 2012-09-26 Yoshifumi Inoue <yosin@chromium.org> 2 65 -
trunk/Source/WebCore/WebCore.gypi
r129689 r129729 4005 4005 'html/BaseDateAndTimeInputType.cpp', 4006 4006 'html/BaseDateAndTimeInputType.h', 4007 'html/BaseMultipleFieldsDateAndTimeInputType.cpp', 4008 'html/BaseMultipleFieldsDateAndTimeInputType.h', 4007 4009 'html/BaseTextInputType.cpp', 4008 4010 'html/BaseTextInputType.h', -
trunk/Source/WebCore/html/BaseDateAndTimeInputType.h
r125634 r129729 47 47 virtual String serialize(const Decimal&) const OVERRIDE; 48 48 String serializeWithComponents(const DateComponents&) const; 49 virtual bool setMillisecondToDateComponents(double, DateComponents*) const = 0; 49 50 50 51 private: 51 52 virtual bool parseToDateComponentsInternal(const UChar*, unsigned length, DateComponents*) const = 0; 52 virtual bool setMillisecondToDateComponents(double, DateComponents*) const = 0;53 53 virtual DateComponents::Type dateType() const = 0; 54 54 virtual double valueAsDate() const OVERRIDE; -
trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp
r129721 r129729 30 30 31 31 #include "config.h" 32 #include "TimeInputType.h" 32 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 33 #include "BaseMultipleFieldsDateAndTimeInputType.h" 33 34 34 35 #include "DateComponents.h" 35 #include "HTMLInputElement.h"36 #include "HTMLNames.h"37 #include "InputTypeNames.h"38 #include <wtf/CurrentTime.h>39 #include <wtf/DateMath.h>40 #include <wtf/MathExtras.h>41 #include <wtf/PassOwnPtr.h>42 43 #if ENABLE(INPUT_TYPE_TIME)44 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI)45 36 #include "DateTimeFieldsState.h" 46 37 #include "ElementShadow.h" 47 38 #include "FormController.h" 39 #include "HTMLInputElement.h" 48 40 #include "KeyboardEvent.h" 49 41 #include "Localizer.h" 50 42 #include "ShadowRoot.h" 51 #include <wtf/text/WTFString.h>52 #endif53 43 54 44 namespace WebCore { 55 45 56 using namespace HTMLNames; 57 58 static const int timeDefaultStep = 60; 59 static const int timeDefaultStepBase = 0; 60 static const int timeStepScaleFactor = 1000; 61 62 PassOwnPtr<InputType> TimeInputType::create(HTMLInputElement* element) 63 { 64 return adoptPtr(new TimeInputType(element)); 65 } 66 67 const AtomicString& TimeInputType::formControlType() const 68 { 69 return InputTypeNames::time(); 70 } 71 72 DateComponents::Type TimeInputType::dateType() const 73 { 74 return DateComponents::Time; 75 } 76 77 Decimal TimeInputType::defaultValueForStepUp() const 78 { 79 double current = currentTimeMS(); 80 double utcOffset = calculateUTCOffset(); 81 double dstOffset = calculateDSTOffset(current, utcOffset); 82 int offset = static_cast<int>((utcOffset + dstOffset) / msPerMinute); 83 current += offset * msPerMinute; 84 85 DateComponents date; 86 date.setMillisecondsSinceMidnight(current); 87 double milliseconds = date.millisecondsSinceEpoch(); 88 ASSERT(isfinite(milliseconds)); 89 return Decimal::fromDouble(milliseconds); 90 } 91 92 StepRange TimeInputType::createStepRange(AnyStepHandling anyStepHandling) const 93 { 94 DEFINE_STATIC_LOCAL(const StepRange::StepDescription, stepDescription, (timeDefaultStep, timeDefaultStepBase, timeStepScaleFactor, StepRange::ScaledStepValueShouldBeInteger)); 95 96 const Decimal stepBase = parseToNumber(element()->fastGetAttribute(minAttr), 0); 97 const Decimal minimum = parseToNumber(element()->fastGetAttribute(minAttr), Decimal::fromDouble(DateComponents::minimumTime())); 98 const Decimal maximum = parseToNumber(element()->fastGetAttribute(maxAttr), Decimal::fromDouble(DateComponents::maximumTime())); 99 const Decimal step = StepRange::parseStep(anyStepHandling, stepDescription, element()->fastGetAttribute(stepAttr)); 100 return StepRange(stepBase, minimum, maximum, step, stepDescription); 101 } 102 103 bool TimeInputType::parseToDateComponentsInternal(const UChar* characters, unsigned length, DateComponents* out) const 104 { 105 ASSERT(out); 106 unsigned end; 107 return out->parseTime(characters, length, 0, end) && end == length; 108 } 109 110 bool TimeInputType::setMillisecondToDateComponents(double value, DateComponents* date) const 111 { 112 ASSERT(date); 113 return date->setMillisecondsSinceMidnight(value); 114 } 115 116 bool TimeInputType::isTimeField() const 117 { 118 return true; 119 } 120 121 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 122 123 TimeInputType::DateTimeEditControlOwnerImpl::DateTimeEditControlOwnerImpl(TimeInputType& timeInputType) 124 : m_timeInputType(timeInputType) 125 { 126 } 127 128 TimeInputType::DateTimeEditControlOwnerImpl::~DateTimeEditControlOwnerImpl() 129 { 130 } 131 132 void TimeInputType::DateTimeEditControlOwnerImpl::didBlurFromControl() 46 BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::DateTimeEditControlOwnerImpl(BaseMultipleFieldsDateAndTimeInputType& dateAndTimeInputType) 47 : m_dateAndTimeInputType(dateAndTimeInputType) 48 { 49 } 50 51 BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::~DateTimeEditControlOwnerImpl() 52 { 53 } 54 55 void BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::didBlurFromControl() 133 56 { 134 57 // We don't need to call blur(). This function is called when control … … 136 59 137 60 // Remove focus ring by CSS "focus" pseudo class. 138 m_ timeInputType.element()->setFocus(false);139 } 140 141 void TimeInputType::DateTimeEditControlOwnerImpl::didFocusOnControl()61 m_dateAndTimeInputType.element()->setFocus(false); 62 } 63 64 void BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::didFocusOnControl() 142 65 { 143 66 // We don't need to call focus(). This function is called when control … … 145 68 146 69 // Add focus ring by CSS "focus" pseudo class. 147 m_ timeInputType.element()->setFocus(true);148 } 149 150 void TimeInputType::DateTimeEditControlOwnerImpl::editControlValueChanged()151 { 152 RefPtr<HTMLInputElement> input(m_ timeInputType.element());153 input->setValueInternal(m_ timeInputType.m_dateTimeEditElement->value(), DispatchNoEvent);70 m_dateAndTimeInputType.element()->setFocus(true); 71 } 72 73 void BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::editControlValueChanged() 74 { 75 RefPtr<HTMLInputElement> input(m_dateAndTimeInputType.element()); 76 input->setValueInternal(m_dateAndTimeInputType.m_dateTimeEditElement->value(), DispatchNoEvent); 154 77 input->setNeedsStyleRecalc(); 155 78 input->dispatchFormControlInputEvent(); … … 158 81 } 159 82 160 161 String TimeInputType::DateTimeEditControlOwnerImpl::formatDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) const 162 { 163 if (!dateTimeFieldsState.hasHour() || !dateTimeFieldsState.hasMinute() || !dateTimeFieldsState.hasAMPM()) 164 return emptyString(); 165 if (dateTimeFieldsState.hasMillisecond() && dateTimeFieldsState.millisecond()) 166 return String::format("%02u:%02u:%02u.%03u", 167 dateTimeFieldsState.hour23(), 168 dateTimeFieldsState.minute(), 169 dateTimeFieldsState.hasSecond() ? dateTimeFieldsState.second() : 0, 170 dateTimeFieldsState.millisecond()); 171 if (dateTimeFieldsState.hasSecond() && dateTimeFieldsState.second()) 172 return String::format("%02u:%02u:%02u", 173 dateTimeFieldsState.hour23(), 174 dateTimeFieldsState.minute(), 175 dateTimeFieldsState.second()); 176 return String::format("%02u:%02u", dateTimeFieldsState.hour23(), dateTimeFieldsState.minute()); 177 } 178 179 bool TimeInputType::hasCustomFocusLogic() const 180 { 181 return false; 182 } 183 184 bool TimeInputType::DateTimeEditControlOwnerImpl::isEditControlOwnerDisabled() const 185 { 186 return m_timeInputType.element()->readOnly(); 187 } 188 189 bool TimeInputType::DateTimeEditControlOwnerImpl::isEditControlOwnerReadOnly() const 190 { 191 return m_timeInputType.element()->disabled(); 192 } 193 194 TimeInputType::TimeInputType(HTMLInputElement* element) 83 String BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::formatDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) const 84 { 85 return m_dateAndTimeInputType.formatDateTimeFieldsState(dateTimeFieldsState); 86 } 87 88 bool BaseMultipleFieldsDateAndTimeInputType::hasCustomFocusLogic() const 89 { 90 return false; 91 } 92 93 bool BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::isEditControlOwnerDisabled() const 94 { 95 return m_dateAndTimeInputType.element()->readOnly(); 96 } 97 98 bool BaseMultipleFieldsDateAndTimeInputType::DateTimeEditControlOwnerImpl::isEditControlOwnerReadOnly() const 99 { 100 return m_dateAndTimeInputType.element()->disabled(); 101 } 102 103 BaseMultipleFieldsDateAndTimeInputType::BaseMultipleFieldsDateAndTimeInputType(HTMLInputElement* element) 195 104 : BaseDateAndTimeInputType(element) 196 105 , m_dateTimeEditElement(0) … … 199 108 } 200 109 201 TimeInputType::~TimeInputType()110 BaseMultipleFieldsDateAndTimeInputType::~BaseMultipleFieldsDateAndTimeInputType() 202 111 { 203 112 if (m_dateTimeEditElement) … … 205 114 } 206 115 207 void TimeInputType::blur()116 void BaseMultipleFieldsDateAndTimeInputType::blur() 208 117 { 209 118 if (m_dateTimeEditElement) … … 211 120 } 212 121 213 RenderObject* TimeInputType::createRenderer(RenderArena* arena, RenderStyle* style) const122 RenderObject* BaseMultipleFieldsDateAndTimeInputType::createRenderer(RenderArena* arena, RenderStyle* style) const 214 123 { 215 124 return InputType::createRenderer(arena, style); 216 125 } 217 126 218 void TimeInputType::createShadowSubtree()127 void BaseMultipleFieldsDateAndTimeInputType::createShadowSubtree() 219 128 { 220 129 ASSERT(element()->shadow()); … … 226 135 } 227 136 228 void TimeInputType::destroyShadowSubtree()137 void BaseMultipleFieldsDateAndTimeInputType::destroyShadowSubtree() 229 138 { 230 139 if (m_dateTimeEditElement) { … … 235 144 } 236 145 237 void TimeInputType::focus(bool)146 void BaseMultipleFieldsDateAndTimeInputType::focus(bool) 238 147 { 239 148 if (m_dateTimeEditElement) … … 241 150 } 242 151 243 void TimeInputType::forwardEvent(Event* event)152 void BaseMultipleFieldsDateAndTimeInputType::forwardEvent(Event* event) 244 153 { 245 154 if (m_dateTimeEditElement) … … 247 156 } 248 157 249 void TimeInputType::disabledAttributeChanged()158 void BaseMultipleFieldsDateAndTimeInputType::disabledAttributeChanged() 250 159 { 251 160 if (m_dateTimeEditElement) … … 253 162 } 254 163 255 void TimeInputType::handleKeydownEvent(KeyboardEvent* event)164 void BaseMultipleFieldsDateAndTimeInputType::handleKeydownEvent(KeyboardEvent* event) 256 165 { 257 166 forwardEvent(event); 258 167 } 259 168 260 bool TimeInputType::isKeyboardFocusable(KeyboardEvent*) const261 { 262 return false; 263 } 264 265 bool TimeInputType::isMouseFocusable() const266 { 267 return false; 268 } 269 270 void TimeInputType::minOrMaxAttributeChanged()169 bool BaseMultipleFieldsDateAndTimeInputType::isKeyboardFocusable(KeyboardEvent*) const 170 { 171 return false; 172 } 173 174 bool BaseMultipleFieldsDateAndTimeInputType::isMouseFocusable() const 175 { 176 return false; 177 } 178 179 void BaseMultipleFieldsDateAndTimeInputType::minOrMaxAttributeChanged() 271 180 { 272 181 updateInnerTextValue(); 273 182 } 274 183 275 void TimeInputType::readonlyAttributeChanged()184 void BaseMultipleFieldsDateAndTimeInputType::readonlyAttributeChanged() 276 185 { 277 186 if (m_dateTimeEditElement) … … 279 188 } 280 189 281 bool TimeInputType::isTextField() const282 { 283 return false; 284 } 285 286 void TimeInputType::restoreFormControlState(const FormControlState& state)190 bool BaseMultipleFieldsDateAndTimeInputType::isTextField() const 191 { 192 return false; 193 } 194 195 void BaseMultipleFieldsDateAndTimeInputType::restoreFormControlState(const FormControlState& state) 287 196 { 288 197 if (!m_dateTimeEditElement) … … 295 204 } 296 205 297 FormControlState TimeInputType::saveFormControlState() const206 FormControlState BaseMultipleFieldsDateAndTimeInputType::saveFormControlState() const 298 207 { 299 208 if (!m_dateTimeEditElement) … … 303 212 } 304 213 305 void TimeInputType::setValue(const String& sanitizedValue, bool valueChanged, TextFieldEventBehavior eventBehavior)214 void BaseMultipleFieldsDateAndTimeInputType::setValue(const String& sanitizedValue, bool valueChanged, TextFieldEventBehavior eventBehavior) 306 215 { 307 216 InputType::setValue(sanitizedValue, valueChanged, eventBehavior); … … 310 219 } 311 220 312 bool TimeInputType::shouldUseInputMethod() const313 { 314 return false; 315 } 316 317 void TimeInputType::stepAttributeChanged()221 bool BaseMultipleFieldsDateAndTimeInputType::shouldUseInputMethod() const 222 { 223 return false; 224 } 225 226 void BaseMultipleFieldsDateAndTimeInputType::stepAttributeChanged() 318 227 { 319 228 updateInnerTextValue(); 320 229 } 321 230 322 void TimeInputType::updateInnerTextValue()231 void BaseMultipleFieldsDateAndTimeInputType::updateInnerTextValue() 323 232 { 324 233 if (!m_dateTimeEditElement) … … 333 242 setMillisecondToDateComponents(layoutParameters.stepRange.minimum().toDouble(), &date); 334 243 335 if (date.second() || layoutParameters.shouldHaveSecondField()) { 336 layoutParameters.dateTimeFormat = localizer.timeFormat(); 337 layoutParameters.fallbackDateTimeFormat = "HH:mm:ss"; 338 } else { 339 layoutParameters.dateTimeFormat = localizer.shortTimeFormat(); 340 layoutParameters.fallbackDateTimeFormat = "HH:mm"; 341 } 244 setupLayoutParameters(layoutParameters, date); 342 245 343 246 if (hasValue) … … 346 249 m_dateTimeEditElement->setEmptyValue(layoutParameters, date); 347 250 } 348 #else 349 TimeInputType::TimeInputType(HTMLInputElement* element) 350 : BaseDateAndTimeInputType(element) 351 { 352 } 251 252 } // namespace WebCore 253 353 254 #endif 354 355 } // namespace WebCore356 357 #endif -
trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.h
r129721 r129729 29 29 */ 30 30 31 #ifndef TimeInputType_h32 #define TimeInputType_h31 #ifndef BaseMultipleFieldsDateAndTimeInputType_h 32 #define BaseMultipleFieldsDateAndTimeInputType_h 33 33 34 34 #include "BaseDateAndTimeInputType.h" 35 35 36 #if ENABLE(INPUT_TYPE_TIME)37 38 36 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 39 37 #include "DateTimeEditElement.h" 40 #endif41 38 42 39 namespace WebCore { 43 40 44 class TimeInputType : public BaseDateAndTimeInputType { 45 public: 46 static PassOwnPtr<InputType> create(HTMLInputElement*); 47 48 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 49 virtual ~TimeInputType(); 50 #endif 41 class BaseMultipleFieldsDateAndTimeInputType : public BaseDateAndTimeInputType { 42 protected: 43 BaseMultipleFieldsDateAndTimeInputType(HTMLInputElement*); 44 virtual ~BaseMultipleFieldsDateAndTimeInputType(); 45 virtual String formatDateTimeFieldsState(const DateTimeFieldsState&) const = 0; 46 virtual void setupLayoutParameters(DateTimeEditElement::LayoutParameters&, const DateComponents&) const = 0; 51 47 52 48 private: 53 TimeInputType(HTMLInputElement*); 54 virtual const AtomicString& formControlType() const OVERRIDE; 55 virtual DateComponents::Type dateType() const OVERRIDE; 56 virtual Decimal defaultValueForStepUp() const OVERRIDE; 57 virtual StepRange createStepRange(AnyStepHandling) const OVERRIDE; 58 virtual bool parseToDateComponentsInternal(const UChar*, unsigned length, DateComponents*) const OVERRIDE; 59 virtual bool setMillisecondToDateComponents(double, DateComponents*) const OVERRIDE; 60 virtual bool isTimeField() const OVERRIDE; 61 62 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 49 // FIXME: DateTimeEditControlOwnerImpl should be removed by moving 50 // DateTimeEditElement::EditControlOwner into base class list of 51 // BaseMultipleFieldsDateAndTimeInputType. 63 52 class DateTimeEditControlOwnerImpl : public DateTimeEditElement::EditControlOwner { 64 53 WTF_MAKE_NONCOPYABLE(DateTimeEditControlOwnerImpl); 65 54 66 55 public: 67 DateTimeEditControlOwnerImpl( TimeInputType&);56 DateTimeEditControlOwnerImpl(BaseMultipleFieldsDateAndTimeInputType&); 68 57 virtual ~DateTimeEditControlOwnerImpl(); 69 58 … … 76 65 virtual bool isEditControlOwnerReadOnly() const OVERRIDE FINAL; 77 66 78 TimeInputType& m_timeInputType;67 BaseMultipleFieldsDateAndTimeInputType& m_dateAndTimeInputType; 79 68 }; 80 69 … … 105 94 DateTimeEditElement* m_dateTimeEditElement; 106 95 DateTimeEditControlOwnerImpl m_dateTimeEditControlOwnerImpl; 107 #endif108 96 }; 109 97 -
trunk/Source/WebCore/html/TimeInputType.cpp
r129612 r129729 42 42 43 43 #if ENABLE(INPUT_TYPE_TIME) 44 44 45 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 45 46 #include "DateTimeFieldsState.h" 46 #include "ElementShadow.h"47 #include "FormController.h"48 #include "KeyboardEvent.h"49 47 #include "Localizer.h" 50 #include "ShadowRoot.h"51 48 #include <wtf/text/WTFString.h> 52 49 #endif … … 59 56 static const int timeDefaultStepBase = 0; 60 57 static const int timeStepScaleFactor = 1000; 58 59 TimeInputType::TimeInputType(HTMLInputElement* element) 60 : BaseTimeInputType(element) 61 { 62 } 61 63 62 64 PassOwnPtr<InputType> TimeInputType::create(HTMLInputElement* element) … … 121 123 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 122 124 123 TimeInputType::DateTimeEditControlOwnerImpl::DateTimeEditControlOwnerImpl(TimeInputType& timeInputType) 124 : m_timeInputType(timeInputType) 125 { 126 } 127 128 TimeInputType::DateTimeEditControlOwnerImpl::~DateTimeEditControlOwnerImpl() 129 { 130 } 131 132 void TimeInputType::DateTimeEditControlOwnerImpl::didBlurFromControl() 133 { 134 // We don't need to call blur(). This function is called when control 135 // lost focus. 136 137 // Remove focus ring by CSS "focus" pseudo class. 138 m_timeInputType.element()->setFocus(false); 139 } 140 141 void TimeInputType::DateTimeEditControlOwnerImpl::didFocusOnControl() 142 { 143 // We don't need to call focus(). This function is called when control 144 // got focus. 145 146 // Add focus ring by CSS "focus" pseudo class. 147 m_timeInputType.element()->setFocus(true); 148 } 149 150 void TimeInputType::DateTimeEditControlOwnerImpl::editControlValueChanged() 151 { 152 RefPtr<HTMLInputElement> input(m_timeInputType.element()); 153 input->setValueInternal(m_timeInputType.m_dateTimeEditElement->value(), DispatchNoEvent); 154 input->setNeedsStyleRecalc(); 155 input->dispatchFormControlInputEvent(); 156 input->dispatchFormControlChangeEvent(); 157 input->notifyFormStateChanged(); 158 } 159 160 161 String TimeInputType::DateTimeEditControlOwnerImpl::formatDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) const 125 String TimeInputType::formatDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState) const 162 126 { 163 127 if (!dateTimeFieldsState.hasHour() || !dateTimeFieldsState.hasMinute() || !dateTimeFieldsState.hasAMPM()) … … 177 141 } 178 142 179 bool TimeInputType::hasCustomFocusLogic() const143 void TimeInputType::setupLayoutParameters(DateTimeEditElement::LayoutParameters& layoutParameters, const DateComponents& date) const 180 144 { 181 return false;182 }183 184 bool TimeInputType::DateTimeEditControlOwnerImpl::isEditControlOwnerDisabled() const185 {186 return m_timeInputType.element()->readOnly();187 }188 189 bool TimeInputType::DateTimeEditControlOwnerImpl::isEditControlOwnerReadOnly() const190 {191 return m_timeInputType.element()->disabled();192 }193 194 TimeInputType::TimeInputType(HTMLInputElement* element)195 : BaseDateAndTimeInputType(element)196 , m_dateTimeEditElement(0)197 , m_dateTimeEditControlOwnerImpl(*this)198 {199 }200 201 TimeInputType::~TimeInputType()202 {203 if (m_dateTimeEditElement)204 m_dateTimeEditElement->removeEditControlOwner();205 }206 207 void TimeInputType::blur()208 {209 if (m_dateTimeEditElement)210 m_dateTimeEditElement->blurByOwner();211 }212 213 RenderObject* TimeInputType::createRenderer(RenderArena* arena, RenderStyle* style) const214 {215 return InputType::createRenderer(arena, style);216 }217 218 void TimeInputType::createShadowSubtree()219 {220 ASSERT(element()->shadow());221 222 RefPtr<DateTimeEditElement> dateTimeEditElement(DateTimeEditElement::create(element()->document(), m_dateTimeEditControlOwnerImpl));223 m_dateTimeEditElement = dateTimeEditElement.get();224 element()->userAgentShadowRoot()->appendChild(m_dateTimeEditElement);225 updateInnerTextValue();226 }227 228 void TimeInputType::destroyShadowSubtree()229 {230 if (m_dateTimeEditElement) {231 m_dateTimeEditElement->removeEditControlOwner();232 m_dateTimeEditElement = 0;233 }234 BaseDateAndTimeInputType::destroyShadowSubtree();235 }236 237 void TimeInputType::focus(bool)238 {239 if (m_dateTimeEditElement)240 m_dateTimeEditElement->focusByOwner();241 }242 243 void TimeInputType::forwardEvent(Event* event)244 {245 if (m_dateTimeEditElement)246 m_dateTimeEditElement->defaultEventHandler(event);247 }248 249 void TimeInputType::disabledAttributeChanged()250 {251 if (m_dateTimeEditElement)252 m_dateTimeEditElement->disabledStateChanged();253 }254 255 void TimeInputType::handleKeydownEvent(KeyboardEvent* event)256 {257 forwardEvent(event);258 }259 260 bool TimeInputType::isKeyboardFocusable(KeyboardEvent*) const261 {262 return false;263 }264 265 bool TimeInputType::isMouseFocusable() const266 {267 return false;268 }269 270 void TimeInputType::minOrMaxAttributeChanged()271 {272 updateInnerTextValue();273 }274 275 void TimeInputType::readonlyAttributeChanged()276 {277 if (m_dateTimeEditElement)278 m_dateTimeEditElement->readOnlyStateChanged();279 }280 281 bool TimeInputType::isTextField() const282 {283 return false;284 }285 286 void TimeInputType::restoreFormControlState(const FormControlState& state)287 {288 if (!m_dateTimeEditElement)289 return;290 DateComponents date;291 setMillisecondToDateComponents(createStepRange(AnyIsDefaultStep).minimum().toDouble(), &date);292 DateTimeFieldsState dateTimeFieldsState = DateTimeFieldsState::restoreFormControlState(state);293 m_dateTimeEditElement->setValueAsDateTimeFieldsState(dateTimeFieldsState, date);294 element()->setValueInternal(m_dateTimeEditElement->value(), DispatchNoEvent);295 }296 297 FormControlState TimeInputType::saveFormControlState() const298 {299 if (!m_dateTimeEditElement)300 return FormControlState();301 302 return m_dateTimeEditElement->valueAsDateTimeFieldsState().saveFormControlState();303 }304 305 void TimeInputType::setValue(const String& sanitizedValue, bool valueChanged, TextFieldEventBehavior eventBehavior)306 {307 InputType::setValue(sanitizedValue, valueChanged, eventBehavior);308 if (valueChanged)309 updateInnerTextValue();310 }311 312 bool TimeInputType::shouldUseInputMethod() const313 {314 return false;315 }316 317 void TimeInputType::stepAttributeChanged()318 {319 updateInnerTextValue();320 }321 322 void TimeInputType::updateInnerTextValue()323 {324 if (!m_dateTimeEditElement)325 return;326 327 Localizer& localizer = element()->document()->getLocalizer(element()->computeInheritedLanguage());328 DateTimeEditElement::LayoutParameters layoutParameters(localizer, createStepRange(AnyIsDefaultStep));329 330 DateComponents date;331 const bool hasValue = parseToDateComponents(element()->value(), &date);332 if (!hasValue)333 setMillisecondToDateComponents(layoutParameters.stepRange.minimum().toDouble(), &date);334 335 145 if (date.second() || layoutParameters.shouldHaveSecondField()) { 336 layoutParameters.dateTimeFormat = l ocalizer.timeFormat();146 layoutParameters.dateTimeFormat = layoutParameters.localizer.timeFormat(); 337 147 layoutParameters.fallbackDateTimeFormat = "HH:mm:ss"; 338 148 } else { 339 layoutParameters.dateTimeFormat = l ocalizer.shortTimeFormat();149 layoutParameters.dateTimeFormat = layoutParameters.localizer.shortTimeFormat(); 340 150 layoutParameters.fallbackDateTimeFormat = "HH:mm"; 341 151 } 342 343 if (hasValue)344 m_dateTimeEditElement->setValueAsDate(layoutParameters, date);345 else346 m_dateTimeEditElement->setEmptyValue(layoutParameters, date);347 }348 #else349 TimeInputType::TimeInputType(HTMLInputElement* element)350 : BaseDateAndTimeInputType(element)351 {352 152 } 353 153 #endif -
trunk/Source/WebCore/html/TimeInputType.h
r129612 r129729 32 32 #define TimeInputType_h 33 33 34 #if ENABLE(INPUT_TYPE_TIME) 35 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 36 #include "BaseMultipleFieldsDateAndTimeInputType.h" 37 #else 34 38 #include "BaseDateAndTimeInputType.h" 35 36 #if ENABLE(INPUT_TYPE_TIME)37 38 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI)39 #include "DateTimeEditElement.h"40 39 #endif 41 40 42 41 namespace WebCore { 43 42 44 class TimeInputType : public BaseDateAndTimeInputType { 43 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 44 typedef BaseMultipleFieldsDateAndTimeInputType BaseTimeInputType; 45 #else 46 typedef BaseDateAndTimeInputType BaseTimeInputType; 47 #endif 48 49 class TimeInputType : public BaseTimeInputType { 45 50 public: 46 51 static PassOwnPtr<InputType> create(HTMLInputElement*); 47 48 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI)49 virtual ~TimeInputType();50 #endif51 52 52 53 private: … … 61 62 62 63 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 63 class DateTimeEditControlOwnerImpl : public DateTimeEditElement::EditControlOwner { 64 WTF_MAKE_NONCOPYABLE(DateTimeEditControlOwnerImpl); 65 66 public: 67 DateTimeEditControlOwnerImpl(TimeInputType&); 68 virtual ~DateTimeEditControlOwnerImpl(); 69 70 private: 71 virtual void didBlurFromControl() OVERRIDE FINAL; 72 virtual void didFocusOnControl() OVERRIDE FINAL; 73 virtual void editControlValueChanged() OVERRIDE FINAL; 74 virtual String formatDateTimeFieldsState(const DateTimeFieldsState&) const OVERRIDE FINAL; 75 virtual bool isEditControlOwnerDisabled() const OVERRIDE FINAL; 76 virtual bool isEditControlOwnerReadOnly() const OVERRIDE FINAL; 77 78 TimeInputType& m_timeInputType; 79 }; 80 81 friend class DateTimeEditControlOwnerImpl; 82 83 // InputType functions 84 virtual void blur() OVERRIDE FINAL; 85 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) const OVERRIDE FINAL; 86 virtual void createShadowSubtree() OVERRIDE FINAL; 87 virtual void destroyShadowSubtree() OVERRIDE FINAL; 88 virtual void disabledAttributeChanged() OVERRIDE FINAL; 89 virtual void focus(bool restorePreviousSelection) OVERRIDE FINAL; 90 virtual void forwardEvent(Event*) OVERRIDE FINAL; 91 virtual void handleKeydownEvent(KeyboardEvent*) OVERRIDE FINAL; 92 virtual bool hasCustomFocusLogic() const OVERRIDE FINAL; 93 virtual bool isKeyboardFocusable(KeyboardEvent*) const OVERRIDE FINAL; 94 virtual bool isMouseFocusable() const OVERRIDE FINAL; 95 virtual bool isTextField() const OVERRIDE FINAL; 96 virtual void minOrMaxAttributeChanged() OVERRIDE FINAL; 97 virtual void readonlyAttributeChanged() OVERRIDE FINAL; 98 virtual void restoreFormControlState(const FormControlState&) OVERRIDE FINAL; 99 virtual FormControlState saveFormControlState() const OVERRIDE FINAL; 100 virtual void setValue(const String&, bool valueChanged, TextFieldEventBehavior) OVERRIDE FINAL; 101 virtual bool shouldUseInputMethod() const OVERRIDE FINAL; 102 virtual void stepAttributeChanged() OVERRIDE FINAL; 103 virtual void updateInnerTextValue() OVERRIDE FINAL; 104 105 DateTimeEditElement* m_dateTimeEditElement; 106 DateTimeEditControlOwnerImpl m_dateTimeEditControlOwnerImpl; 64 // BaseMultipleFieldsDateAndTimeInputType functions 65 virtual String formatDateTimeFieldsState(const DateTimeFieldsState&) const OVERRIDE FINAL; 66 virtual void setupLayoutParameters(DateTimeEditElement::LayoutParameters&, const DateComponents&) const OVERRIDE FINAL; 107 67 #endif 108 68 };
Note: See TracChangeset
for help on using the changeset viewer.