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"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if !ENABLE(INPUT_MULTIPLE_FIELDS_UI)
2806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/BaseChooserOnlyDateAndTimeInputType.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionStatePlaceholder.h"
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/dom/Document.h"
32e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/FrameHost.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLDivElement.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h"
371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/UserGestureIndicator.h"
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)BaseChooserOnlyDateAndTimeInputType::~BaseChooserOnlyDateAndTimeInputType()
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    closeDateTimeChooser();
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::handleDOMActivateEvent(Event*)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
48bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (element().isDisabledOrReadOnly() || !element().renderer() || !UserGestureIndicator::processingUserGesture() || element().hasAuthorShadowRoot())
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_dateTimeChooser)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!element().document().isActive())
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DateTimeChooserParameters parameters;
56bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!element().setupDateTimeChooserParameters(parameters))
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_dateTimeChooser = element().document().frameHost()->chrome().openDateTimeChooser(this, parameters);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::createShadowSubtree()
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, valueContainerPseudo, ("-webkit-date-and-time-value", AtomicString::ConstructFromLiteral));
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLDivElement> valueContainer = HTMLDivElement::create(element().document());
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    valueContainer->setShadowPseudoId(valueContainerPseudo);
67bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().userAgentShadowRoot()->appendChild(valueContainer.get());
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    updateView();
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
71d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::updateView()
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
73bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    Node* node = element().userAgentShadowRoot()->firstChild();
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node || !node->isHTMLElement())
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    String displayValue;
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!element().suggestedValue().isNull())
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        displayValue = element().suggestedValue();
79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        displayValue = visibleValue();
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (displayValue.isEmpty()) {
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Need to put something to keep text baseline.
833c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        displayValue = " ";
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
851fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    toHTMLElement(node)->setInnerText(displayValue, ASSERT_NO_EXCEPTION);
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::setValue(const String& value, bool valueChanged, TextFieldEventBehavior eventBehavior)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BaseDateAndTimeInputType::setValue(value, valueChanged, eventBehavior);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (valueChanged)
92d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        updateView();
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::closePopupView()
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    closeDateTimeChooser();
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciElement& BaseChooserOnlyDateAndTimeInputType::ownerElement() const
1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return element();
1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::didChooseValue(const String& value)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
107bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().setValue(value, DispatchInputAndChangeEvent);
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::didChooseValue(double value)
11151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
11251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(std::isfinite(value) || std::isnan(value));
11351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (std::isnan(value))
11451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        element().setValue(emptyString(), DispatchInputAndChangeEvent);
11551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    else
11651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        element().setValueAsNumber(value, ASSERT_NO_EXCEPTION, DispatchInputAndChangeEvent);
11751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
11851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::didEndChooser()
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_dateTimeChooser.clear();
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::closeDateTimeChooser()
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_dateTimeChooser)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_dateTimeChooser->endChooser();
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::handleKeydownEvent(KeyboardEvent* event)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BaseClickableWithKeyInputType::handleKeydownEvent(element(), event);
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::handleKeypressEvent(KeyboardEvent* event)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BaseClickableWithKeyInputType::handleKeypressEvent(element(), event);
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::handleKeyupEvent(KeyboardEvent* event)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BaseClickableWithKeyInputType::handleKeyupEvent(*this, event);
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void BaseChooserOnlyDateAndTimeInputType::accessKeyAction(bool sendMouseEvents)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BaseDateAndTimeInputType::accessKeyAction(sendMouseEvents);
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BaseClickableWithKeyInputType::accessKeyAction(element(), sendMouseEvents);
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
153