15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/shadow/DateTimeFieldElement.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/KeyboardEvent.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Text.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/LocalizedStrings.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/text/PlatformLocale.h"
35e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/text/WTFString.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DateTimeFieldElement::FieldOwner::~FieldOwner()
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DateTimeFieldElement::DateTimeFieldElement(Document* document, FieldOwner& fieldOwner)
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    : HTMLSpanElement(spanTag, document)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_fieldOwner(&fieldOwner)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeFieldElement::defaultEventHandler(Event* event)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event->type() == eventNames().blurEvent)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        didBlur();
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event->type() == eventNames().focusEvent)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        didFocus();
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event->isKeyboardEvent()) {
60591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        KeyboardEvent* keyboardEvent = toKeyboardEvent(event);
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!isDisabled() && !isFieldOwnerDisabled() && !isFieldOwnerReadOnly()) {
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            handleKeyboardEvent(keyboardEvent);
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (keyboardEvent->defaultHandled())
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return;
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        defaultKeyboardEventHandler(keyboardEvent);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (keyboardEvent->defaultHandled())
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLElement::defaultEventHandler(event);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeFieldElement::defaultKeyboardEventHandler(KeyboardEvent* keyboardEvent)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keyboardEvent->type() != eventNames().keydownEvent)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isDisabled() || isFieldOwnerDisabled())
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const String& keyIdentifier = keyboardEvent->keyIdentifier();
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keyIdentifier == "Left") {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_fieldOwner)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // FIXME: We'd like to use FocusController::advanceFocus(FocusDirectionLeft, ...)
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // but it doesn't work for shadow nodes. webkit.org/b/104650
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!localeForOwner().isRTL() && m_fieldOwner->focusOnPreviousField(*this))
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            keyboardEvent->setDefaultHandled();
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keyIdentifier == "Right") {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_fieldOwner)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // FIXME: We'd like to use FocusController::advanceFocus(FocusDirectionRight, ...)
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // but it doesn't work for shadow nodes. webkit.org/b/104650
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!localeForOwner().isRTL() && m_fieldOwner->focusOnNextField(*this))
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            keyboardEvent->setDefaultHandled();
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isFieldOwnerReadOnly())
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (keyIdentifier == "Down") {
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (keyboardEvent->getModifierState("Alt"))
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        keyboardEvent->setDefaultHandled();
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        stepDown();
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keyIdentifier == "Up") {
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        keyboardEvent->setDefaultHandled();
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        stepUp();
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keyIdentifier == "U+0008" || keyIdentifier == "U+007F") {
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        keyboardEvent->setDefaultHandled();
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue(DispatchEvent);
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeFieldElement::didBlur()
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_fieldOwner)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_fieldOwner->didBlurFromField();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeFieldElement::didFocus()
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_fieldOwner)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_fieldOwner->didFocusOnField();
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeFieldElement::focusOnNextField()
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_fieldOwner)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_fieldOwner->focusOnNextField(*this);
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeFieldElement::initialize(const AtomicString& pseudo, const String& axHelpText, int axMinimum, int axMaximum)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
149521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // On accessibility, DateTimeFieldElement acts like spin button.
150521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    setAttribute(roleAttr, AtomicString("spinbutton", AtomicString::ConstructFromLiteral));
151521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    setAttribute(aria_valuetextAttr, AXDateTimeFieldEmptyValueText());
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setAttribute(aria_valueminAttr, String::number(axMinimum));
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setAttribute(aria_valuemaxAttr, String::number(axMaximum));
154521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
155521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    setAttribute(aria_helpAttr, axHelpText);
156e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    setPart(pseudo);
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    appendChild(Text::create(document(), visibleValue()));
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool DateTimeFieldElement::isDateTimeFieldElement() const
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool DateTimeFieldElement::isFieldOwnerDisabled() const
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_fieldOwner && m_fieldOwner->isFieldOwnerDisabled();
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool DateTimeFieldElement::isFieldOwnerReadOnly() const
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_fieldOwner && m_fieldOwner->isFieldOwnerReadOnly();
173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool DateTimeFieldElement::isDisabled() const
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return fastHasAttribute(disabledAttr);
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Locale& DateTimeFieldElement::localeForOwner() const
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return document()->getCachedLocale(localeIdentifier());
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)AtomicString DateTimeFieldElement::localeIdentifier() const
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_fieldOwner ? m_fieldOwner->localeIdentifier() : nullAtom;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)float DateTimeFieldElement::maximumWidth(const Font&)
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const float paddingLeftAndRight = 2; // This should match to html.css.
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return paddingLeftAndRight;
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeFieldElement::setDisabled()
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Set HTML attribute disabled to change apperance.
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setBooleanAttribute(disabledAttr, true);
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsStyleRecalc();
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool DateTimeFieldElement::supportsFocus() const
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
205521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return !isDisabled() && !isFieldOwnerDisabled();
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeFieldElement::updateVisibleValue(EventBehavior eventBehavior)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Text* const textNode = toText(firstChild());
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String newVisibleValue = visibleValue();
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(newVisibleValue.length() > 0);
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (textNode->wholeText() == newVisibleValue)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
217e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    textNode->replaceWholeText(newVisibleValue);
218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (hasValue()) {
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setAttribute(aria_valuetextAttr, newVisibleValue);
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setAttribute(aria_valuenowAttr, String::number(valueForARIAValueNow()));
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else {
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setAttribute(aria_valuetextAttr, AXDateTimeFieldEmptyValueText());
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        removeAttribute(aria_valuenowAttr);
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventBehavior == DispatchEvent && m_fieldOwner)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_fieldOwner->fieldValueChanged();
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)int DateTimeFieldElement::valueForARIAValueNow() const
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return valueAsInteger();
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
238