| Index: Source/core/html/BaseMultipleFieldsDateAndTimeInputType.cpp
|
| diff --git a/Source/core/html/BaseMultipleFieldsDateAndTimeInputType.cpp b/Source/core/html/BaseMultipleFieldsDateAndTimeInputType.cpp
|
| deleted file mode 100644
|
| index 3d8f21e078b3575dd2e489dddc78723db868789e..0000000000000000000000000000000000000000
|
| --- a/Source/core/html/BaseMultipleFieldsDateAndTimeInputType.cpp
|
| +++ /dev/null
|
| @@ -1,604 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2010 Google Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions are
|
| - * met:
|
| - *
|
| - * * Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * * Redistributions in binary form must reproduce the above
|
| - * copyright notice, this list of conditions and the following disclaimer
|
| - * in the documentation and/or other materials provided with the
|
| - * distribution.
|
| - * * Neither the name of Google Inc. nor the names of its
|
| - * contributors may be used to endorse or promote products derived from
|
| - * this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
|
| -#include "core/html/BaseMultipleFieldsDateAndTimeInputType.h"
|
| -
|
| -#include "CSSValueKeywords.h"
|
| -#include "RuntimeEnabledFeatures.h"
|
| -#include "core/dom/KeyboardEvent.h"
|
| -#include "core/dom/shadow/ShadowRoot.h"
|
| -#include "core/html/DateTimeFieldsState.h"
|
| -#include "core/html/FormController.h"
|
| -#include "core/html/HTMLDataListElement.h"
|
| -#include "core/html/HTMLInputElement.h"
|
| -#include "core/html/HTMLOptionElement.h"
|
| -#include "core/html/shadow/PickerIndicatorElement.h"
|
| -#include "core/html/shadow/ShadowElementNames.h"
|
| -#include "core/page/FocusController.h"
|
| -#include "core/page/Page.h"
|
| -#include "core/platform/DateComponents.h"
|
| -#include "core/platform/LocalizedStrings.h"
|
| -#include "core/platform/text/DateTimeFormat.h"
|
| -#include "core/platform/text/PlatformLocale.h"
|
| -#include "core/rendering/RenderTheme.h"
|
| -#include "wtf/DateMath.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -class DateTimeFormatValidator : public DateTimeFormat::TokenHandler {
|
| -public:
|
| - DateTimeFormatValidator()
|
| - : m_hasYear(false)
|
| - , m_hasMonth(false)
|
| - , m_hasWeek(false)
|
| - , m_hasDay(false)
|
| - , m_hasAMPM(false)
|
| - , m_hasHour(false)
|
| - , m_hasMinute(false)
|
| - , m_hasSecond(false) { }
|
| -
|
| - virtual void visitField(DateTimeFormat::FieldType, int) OVERRIDE FINAL;
|
| - virtual void visitLiteral(const String&) OVERRIDE FINAL { }
|
| -
|
| - bool validateFormat(const String& format, const BaseMultipleFieldsDateAndTimeInputType&);
|
| -
|
| -private:
|
| - bool m_hasYear;
|
| - bool m_hasMonth;
|
| - bool m_hasWeek;
|
| - bool m_hasDay;
|
| - bool m_hasAMPM;
|
| - bool m_hasHour;
|
| - bool m_hasMinute;
|
| - bool m_hasSecond;
|
| -};
|
| -
|
| -void DateTimeFormatValidator::visitField(DateTimeFormat::FieldType fieldType, int)
|
| -{
|
| - switch (fieldType) {
|
| - case DateTimeFormat::FieldTypeYear:
|
| - m_hasYear = true;
|
| - break;
|
| - case DateTimeFormat::FieldTypeMonth: // Fallthrough.
|
| - case DateTimeFormat::FieldTypeMonthStandAlone:
|
| - m_hasMonth = true;
|
| - break;
|
| - case DateTimeFormat::FieldTypeWeekOfYear:
|
| - m_hasWeek = true;
|
| - break;
|
| - case DateTimeFormat::FieldTypeDayOfMonth:
|
| - m_hasDay = true;
|
| - break;
|
| - case DateTimeFormat::FieldTypePeriod:
|
| - m_hasAMPM = true;
|
| - break;
|
| - case DateTimeFormat::FieldTypeHour11: // Fallthrough.
|
| - case DateTimeFormat::FieldTypeHour12:
|
| - m_hasHour = true;
|
| - break;
|
| - case DateTimeFormat::FieldTypeHour23: // Fallthrough.
|
| - case DateTimeFormat::FieldTypeHour24:
|
| - m_hasHour = true;
|
| - m_hasAMPM = true;
|
| - break;
|
| - case DateTimeFormat::FieldTypeMinute:
|
| - m_hasMinute = true;
|
| - break;
|
| - case DateTimeFormat::FieldTypeSecond:
|
| - m_hasSecond = true;
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| -}
|
| -
|
| -bool DateTimeFormatValidator::validateFormat(const String& format, const BaseMultipleFieldsDateAndTimeInputType& inputType)
|
| -{
|
| - if (!DateTimeFormat::parse(format, *this))
|
| - return false;
|
| - return inputType.isValidFormat(m_hasYear, m_hasMonth, m_hasWeek, m_hasDay, m_hasAMPM, m_hasHour, m_hasMinute, m_hasSecond);
|
| -}
|
| -
|
| -DateTimeEditElement* BaseMultipleFieldsDateAndTimeInputType::dateTimeEditElement() const
|
| -{
|
| - return toDateTimeEditElement(element()->userAgentShadowRoot()->getElementById(ShadowElementNames::dateTimeEdit()));
|
| -}
|
| -
|
| -SpinButtonElement* BaseMultipleFieldsDateAndTimeInputType::spinButtonElement() const
|
| -{
|
| - return toSpinButtonElement(element()->userAgentShadowRoot()->getElementById(ShadowElementNames::spinButton()));
|
| -}
|
| -
|
| -ClearButtonElement* BaseMultipleFieldsDateAndTimeInputType::clearButtonElement() const
|
| -{
|
| - return toClearButtonElement(element()->userAgentShadowRoot()->getElementById(ShadowElementNames::clearButton()));
|
| -}
|
| -
|
| -PickerIndicatorElement* BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorElement() const
|
| -{
|
| - return toPickerIndicatorElement(element()->userAgentShadowRoot()->getElementById(ShadowElementNames::pickerIndicator()));
|
| -}
|
| -
|
| -inline bool BaseMultipleFieldsDateAndTimeInputType::containsFocusedShadowElement() const
|
| -{
|
| - return element()->userAgentShadowRoot()->contains(element()->document().focusedElement());
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::didBlurFromControl()
|
| -{
|
| - // We don't need to call blur(). This function is called when control
|
| - // lost focus.
|
| -
|
| - if (containsFocusedShadowElement())
|
| - return;
|
| - RefPtr<HTMLInputElement> protector(element());
|
| - // Remove focus ring by CSS "focus" pseudo class.
|
| - element()->setFocus(false);
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::didFocusOnControl()
|
| -{
|
| - // We don't need to call focus(). This function is called when control
|
| - // got focus.
|
| -
|
| - if (!containsFocusedShadowElement())
|
| - return;
|
| - // Add focus ring by CSS "focus" pseudo class.
|
| - // FIXME: Setting the focus flag to non-focused element is too tricky.
|
| - element()->setFocus(true);
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::editControlValueChanged()
|
| -{
|
| - RefPtr<HTMLInputElement> input(element());
|
| - String oldValue = input->value();
|
| - String newValue = sanitizeValue(dateTimeEditElement()->value());
|
| - // Even if oldValue is null and newValue is "", we should assume they are same.
|
| - if ((oldValue.isEmpty() && newValue.isEmpty()) || oldValue == newValue)
|
| - input->setNeedsValidityCheck();
|
| - else {
|
| - input->setValueInternal(newValue, DispatchNoEvent);
|
| - input->setNeedsStyleRecalc();
|
| - input->dispatchFormControlInputEvent();
|
| - input->dispatchFormControlChangeEvent();
|
| - }
|
| - input->notifyFormStateChanged();
|
| - input->updateClearButtonVisibility();
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::hasCustomFocusLogic() const
|
| -{
|
| - return false;
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::isEditControlOwnerDisabled() const
|
| -{
|
| - return element()->isDisabledFormControl();
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::isEditControlOwnerReadOnly() const
|
| -{
|
| - return element()->isReadOnly();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::focusAndSelectSpinButtonOwner()
|
| -{
|
| - if (DateTimeEditElement* edit = dateTimeEditElement())
|
| - edit->focusIfNoFocus();
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::shouldSpinButtonRespondToMouseEvents()
|
| -{
|
| - return !element()->isDisabledOrReadOnly();
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::shouldSpinButtonRespondToWheelEvents()
|
| -{
|
| - if (!shouldSpinButtonRespondToMouseEvents())
|
| - return false;
|
| - if (DateTimeEditElement* edit = dateTimeEditElement())
|
| - return edit->hasFocusedField();
|
| - return false;
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::spinButtonStepDown()
|
| -{
|
| - if (DateTimeEditElement* edit = dateTimeEditElement())
|
| - edit->stepDown();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::spinButtonStepUp()
|
| -{
|
| - if (DateTimeEditElement* edit = dateTimeEditElement())
|
| - edit->stepUp();
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::isPickerIndicatorOwnerDisabledOrReadOnly() const
|
| -{
|
| - return element()->isDisabledOrReadOnly();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorChooseValue(const String& value)
|
| -{
|
| - if (element()->isValidValue(value)) {
|
| - element()->setValue(value, DispatchInputAndChangeEvent);
|
| - return;
|
| - }
|
| -
|
| - DateTimeEditElement* edit = this->dateTimeEditElement();
|
| - if (!edit)
|
| - return;
|
| - DateComponents date;
|
| - unsigned end;
|
| - if (date.parseDate(value, 0, end) && end == value.length())
|
| - edit->setOnlyYearMonthDay(date);
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::setupDateTimeChooserParameters(DateTimeChooserParameters& parameters)
|
| -{
|
| - return element()->setupDateTimeChooserParameters(parameters);
|
| -}
|
| -
|
| -BaseMultipleFieldsDateAndTimeInputType::BaseMultipleFieldsDateAndTimeInputType(HTMLInputElement* element)
|
| - : BaseDateAndTimeInputType(element)
|
| - , m_isDestroyingShadowSubtree(false)
|
| - , m_pickerIndicatorIsVisible(false)
|
| - , m_pickerIndicatorIsAlwaysVisible(false)
|
| -{
|
| -}
|
| -
|
| -BaseMultipleFieldsDateAndTimeInputType::~BaseMultipleFieldsDateAndTimeInputType()
|
| -{
|
| - if (SpinButtonElement* element = spinButtonElement())
|
| - element->removeSpinButtonOwner();
|
| - if (ClearButtonElement* element = clearButtonElement())
|
| - element->removeClearButtonOwner();
|
| - if (DateTimeEditElement* element = dateTimeEditElement())
|
| - element->removeEditControlOwner();
|
| - if (PickerIndicatorElement* element = pickerIndicatorElement())
|
| - element->removePickerIndicatorOwner();
|
| -}
|
| -
|
| -String BaseMultipleFieldsDateAndTimeInputType::badInputText() const
|
| -{
|
| - return validationMessageBadInputForDateTimeText();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::blur()
|
| -{
|
| - if (DateTimeEditElement* edit = dateTimeEditElement())
|
| - edit->blurByOwner();
|
| -}
|
| -
|
| -PassRefPtr<RenderStyle> BaseMultipleFieldsDateAndTimeInputType::customStyleForRenderer(PassRefPtr<RenderStyle> originalStyle)
|
| -{
|
| - EDisplay originalDisplay = originalStyle->display();
|
| - EDisplay newDisplay = originalDisplay;
|
| - if (originalDisplay == INLINE || originalDisplay == INLINE_BLOCK)
|
| - newDisplay = INLINE_FLEX;
|
| - else if (originalDisplay == BLOCK)
|
| - newDisplay = FLEX;
|
| - TextDirection contentDirection = element()->locale().isRTL() ? RTL : LTR;
|
| - if (originalStyle->direction() == contentDirection && originalDisplay == newDisplay)
|
| - return originalStyle;
|
| -
|
| - RefPtr<RenderStyle> style = RenderStyle::clone(originalStyle.get());
|
| - style->setDirection(contentDirection);
|
| - style->setDisplay(newDisplay);
|
| - return style.release();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::createShadowSubtree()
|
| -{
|
| - ASSERT(element()->shadow());
|
| -
|
| - // Element must not have a renderer here, because if it did
|
| - // DateTimeEditElement::customStyleForRenderer() is called in appendChild()
|
| - // before the field wrapper element is created.
|
| - // FIXME: This code should not depend on such craziness.
|
| - ASSERT(!element()->renderer());
|
| -
|
| - Document& document = element()->document();
|
| - ContainerNode* container = element()->userAgentShadowRoot();
|
| -
|
| - container->appendChild(DateTimeEditElement::create(document, *this));
|
| - updateInnerTextValue();
|
| - container->appendChild(ClearButtonElement::create(document, *this));
|
| - container->appendChild(SpinButtonElement::create(document, *this));
|
| -
|
| - bool shouldAddPickerIndicator = false;
|
| - if (InputType::themeSupportsDataListUI(this))
|
| - shouldAddPickerIndicator = true;
|
| - if (RenderTheme::theme().supportsCalendarPicker(formControlType())) {
|
| - shouldAddPickerIndicator = true;
|
| - m_pickerIndicatorIsAlwaysVisible = true;
|
| - }
|
| - if (shouldAddPickerIndicator) {
|
| - container->appendChild(PickerIndicatorElement::create(document, *this));
|
| - m_pickerIndicatorIsVisible = true;
|
| - updatePickerIndicatorVisibility();
|
| - }
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::destroyShadowSubtree()
|
| -{
|
| - ASSERT(!m_isDestroyingShadowSubtree);
|
| - m_isDestroyingShadowSubtree = true;
|
| - if (SpinButtonElement* element = spinButtonElement())
|
| - element->removeSpinButtonOwner();
|
| - if (ClearButtonElement* element = clearButtonElement())
|
| - element->removeClearButtonOwner();
|
| - if (DateTimeEditElement* element = dateTimeEditElement())
|
| - element->removeEditControlOwner();
|
| - if (PickerIndicatorElement* element = pickerIndicatorElement())
|
| - element->removePickerIndicatorOwner();
|
| -
|
| - // If a field element has focus, set focus back to the <input> itself before
|
| - // deleting the field. This prevents unnecessary focusout/blur events.
|
| - if (containsFocusedShadowElement())
|
| - element()->focus();
|
| -
|
| - BaseDateAndTimeInputType::destroyShadowSubtree();
|
| - m_isDestroyingShadowSubtree = false;
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::handleFocusEvent(Element* oldFocusedElement, FocusDirection direction)
|
| -{
|
| - DateTimeEditElement* edit = dateTimeEditElement();
|
| - if (!edit || m_isDestroyingShadowSubtree)
|
| - return;
|
| - if (direction == FocusDirectionBackward) {
|
| - if (element()->document().page())
|
| - element()->document().page()->focusController().advanceFocus(direction);
|
| - } else if (direction == FocusDirectionNone || direction == FocusDirectionMouse || direction == FocusDirectionPage) {
|
| - edit->focusByOwner(oldFocusedElement);
|
| - } else
|
| - edit->focusByOwner();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::forwardEvent(Event* event)
|
| -{
|
| - if (SpinButtonElement* element = spinButtonElement()) {
|
| - element->forwardEvent(event);
|
| - if (event->defaultHandled())
|
| - return;
|
| - }
|
| -
|
| - if (DateTimeEditElement* edit = dateTimeEditElement())
|
| - edit->defaultEventHandler(event);
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::disabledAttributeChanged()
|
| -{
|
| - spinButtonElement()->releaseCapture();
|
| - clearButtonElement()->releaseCapture();
|
| - if (DateTimeEditElement* edit = dateTimeEditElement())
|
| - edit->disabledStateChanged();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::requiredAttributeChanged()
|
| -{
|
| - clearButtonElement()->releaseCapture();
|
| - updateClearButtonVisibility();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::handleKeydownEvent(KeyboardEvent* event)
|
| -{
|
| - if (m_pickerIndicatorIsVisible
|
| - && ((event->keyIdentifier() == "Down" && event->getModifierState("Alt")) || (RenderTheme::theme().shouldOpenPickerWithF4Key() && event->keyIdentifier() == "F4"))) {
|
| - if (PickerIndicatorElement* element = pickerIndicatorElement())
|
| - element->openPopup();
|
| - event->setDefaultHandled();
|
| - } else
|
| - forwardEvent(event);
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::hasBadInput() const
|
| -{
|
| - DateTimeEditElement* edit = dateTimeEditElement();
|
| - return element()->value().isEmpty() && edit && edit->anyEditableFieldsHaveValues();
|
| -}
|
| -
|
| -AtomicString BaseMultipleFieldsDateAndTimeInputType::localeIdentifier() const
|
| -{
|
| - return element()->computeInheritedLanguage();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::minOrMaxAttributeChanged()
|
| -{
|
| - updateInnerTextValue();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::readonlyAttributeChanged()
|
| -{
|
| - spinButtonElement()->releaseCapture();
|
| - clearButtonElement()->releaseCapture();
|
| - if (DateTimeEditElement* edit = dateTimeEditElement())
|
| - edit->readOnlyStateChanged();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::restoreFormControlState(const FormControlState& state)
|
| -{
|
| - DateTimeEditElement* edit = dateTimeEditElement();
|
| - if (!edit)
|
| - return;
|
| - DateTimeFieldsState dateTimeFieldsState = DateTimeFieldsState::restoreFormControlState(state);
|
| - edit->setValueAsDateTimeFieldsState(dateTimeFieldsState);
|
| - element()->setValueInternal(sanitizeValue(edit->value()), DispatchNoEvent);
|
| - updateClearButtonVisibility();
|
| -}
|
| -
|
| -FormControlState BaseMultipleFieldsDateAndTimeInputType::saveFormControlState() const
|
| -{
|
| - if (DateTimeEditElement* edit = dateTimeEditElement())
|
| - return edit->valueAsDateTimeFieldsState().saveFormControlState();
|
| - return FormControlState();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::setValue(const String& sanitizedValue, bool valueChanged, TextFieldEventBehavior eventBehavior)
|
| -{
|
| - InputType::setValue(sanitizedValue, valueChanged, eventBehavior);
|
| - DateTimeEditElement* edit = dateTimeEditElement();
|
| - if (valueChanged || (sanitizedValue.isEmpty() && edit && edit->anyEditableFieldsHaveValues())) {
|
| - updateInnerTextValue();
|
| - element()->setNeedsValidityCheck();
|
| - }
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::shouldUseInputMethod() const
|
| -{
|
| - return false;
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::stepAttributeChanged()
|
| -{
|
| - updateInnerTextValue();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::updateInnerTextValue()
|
| -{
|
| - DateTimeEditElement* edit = dateTimeEditElement();
|
| - if (!edit)
|
| - return;
|
| -
|
| - DateTimeEditElement::LayoutParameters layoutParameters(element()->locale(), createStepRange(AnyIsDefaultStep));
|
| -
|
| - DateComponents date;
|
| - const bool hasValue = parseToDateComponents(element()->value(), &date);
|
| - if (!hasValue)
|
| - setMillisecondToDateComponents(layoutParameters.stepRange.minimum().toDouble(), &date);
|
| -
|
| - setupLayoutParameters(layoutParameters, date);
|
| -
|
| - const AtomicString pattern = edit->fastGetAttribute(HTMLNames::patternAttr);
|
| - if (!pattern.isEmpty())
|
| - layoutParameters.dateTimeFormat = pattern;
|
| -
|
| - if (!DateTimeFormatValidator().validateFormat(layoutParameters.dateTimeFormat, *this))
|
| - layoutParameters.dateTimeFormat = layoutParameters.fallbackDateTimeFormat;
|
| -
|
| - if (hasValue)
|
| - edit->setValueAsDate(layoutParameters, date);
|
| - else
|
| - edit->setEmptyValue(layoutParameters, date);
|
| - updateClearButtonVisibility();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::valueAttributeChanged()
|
| -{
|
| - if (!element()->hasDirtyValue())
|
| - updateInnerTextValue();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::listAttributeTargetChanged()
|
| -{
|
| - updatePickerIndicatorVisibility();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::updatePickerIndicatorVisibility()
|
| -{
|
| - if (m_pickerIndicatorIsAlwaysVisible) {
|
| - showPickerIndicator();
|
| - return;
|
| - }
|
| - if (RuntimeEnabledFeatures::dataListElementEnabled()) {
|
| - if (HTMLDataListElement* dataList = element()->dataList()) {
|
| - RefPtr<HTMLCollection> options = dataList->options();
|
| - for (unsigned i = 0; HTMLOptionElement* option = toHTMLOptionElement(options->item(i)); ++i) {
|
| - if (element()->isValidValue(option->value())) {
|
| - showPickerIndicator();
|
| - return;
|
| - }
|
| - }
|
| - }
|
| - hidePickerIndicator();
|
| - }
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::hidePickerIndicator()
|
| -{
|
| - if (!m_pickerIndicatorIsVisible)
|
| - return;
|
| - m_pickerIndicatorIsVisible = false;
|
| - ASSERT(pickerIndicatorElement());
|
| - pickerIndicatorElement()->setInlineStyleProperty(CSSPropertyDisplay, CSSValueNone);
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::showPickerIndicator()
|
| -{
|
| - if (m_pickerIndicatorIsVisible)
|
| - return;
|
| - m_pickerIndicatorIsVisible = true;
|
| - ASSERT(pickerIndicatorElement());
|
| - pickerIndicatorElement()->removeInlineStyleProperty(CSSPropertyDisplay);
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::shouldHaveSecondField(const DateComponents& date) const
|
| -{
|
| - StepRange stepRange = createStepRange(AnyIsDefaultStep);
|
| - return date.second() || date.millisecond()
|
| - || !stepRange.minimum().remainder(static_cast<int>(msPerMinute)).isZero()
|
| - || !stepRange.step().remainder(static_cast<int>(msPerMinute)).isZero();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::focusAndSelectClearButtonOwner()
|
| -{
|
| - element()->focus();
|
| -}
|
| -
|
| -bool BaseMultipleFieldsDateAndTimeInputType::shouldClearButtonRespondToMouseEvents()
|
| -{
|
| - return !element()->isDisabledOrReadOnly() && !element()->isRequired();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::clearValue()
|
| -{
|
| - RefPtr<HTMLInputElement> input(element());
|
| - input->setValue("", DispatchInputAndChangeEvent);
|
| - input->updateClearButtonVisibility();
|
| -}
|
| -
|
| -void BaseMultipleFieldsDateAndTimeInputType::updateClearButtonVisibility()
|
| -{
|
| - ClearButtonElement* clearButton = clearButtonElement();
|
| - if (!clearButton)
|
| - return;
|
| -
|
| - if (element()->isRequired() || !dateTimeEditElement()->anyEditableFieldsHaveValues())
|
| - clearButton->setInlineStyleProperty(CSSPropertyVisibility, CSSValueHidden);
|
| - else
|
| - clearButton->removeInlineStyleProperty(CSSPropertyVisibility);
|
| -}
|
| -
|
| -} // namespace WebCore
|
| -
|
| -#endif
|
|
|