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