BaseChooserOnlyDateAndTimeInputType.cpp [plain text]
#include "config.h"
#include "BaseChooserOnlyDateAndTimeInputType.h"
#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
#include "HTMLDivElement.h"
#include "HTMLInputElement.h"
#include "Page.h"
#include "RenderElement.h"
#include "ShadowRoot.h"
#include "UserGestureIndicator.h"
#include <wtf/NeverDestroyed.h>
namespace WebCore {
BaseChooserOnlyDateAndTimeInputType::~BaseChooserOnlyDateAndTimeInputType()
{
closeDateTimeChooser();
}
void BaseChooserOnlyDateAndTimeInputType::handleDOMActivateEvent(Event&)
{
ASSERT(element());
if (element()->isDisabledOrReadOnly() || !element()->renderer() || !UserGestureIndicator::processingUserGesture())
return;
if (m_dateTimeChooser)
return;
if (!element()->document().page())
return;
DateTimeChooserParameters parameters;
if (!element()->setupDateTimeChooserParameters(parameters))
return;
}
void BaseChooserOnlyDateAndTimeInputType::createShadowSubtree()
{
static MainThreadNeverDestroyed<const AtomString> valueContainerPseudo("-webkit-date-and-time-value", AtomString::ConstructFromLiteral);
ASSERT(element());
auto valueContainer = HTMLDivElement::create(element()->document());
valueContainer->setPseudo(valueContainerPseudo);
element()->userAgentShadowRoot()->appendChild(valueContainer);
updateInnerTextValue();
}
void BaseChooserOnlyDateAndTimeInputType::updateInnerTextValue()
{
ASSERT(element());
RefPtr<Node> node = element()->userAgentShadowRoot()->firstChild();
if (!is<HTMLElement>(node))
return;
String displayValue = visibleValue();
if (displayValue.isEmpty()) {
displayValue = " "_s;
}
downcast<HTMLElement>(*node).setInnerText(displayValue);
}
void BaseChooserOnlyDateAndTimeInputType::setValue(const String& value, bool valueChanged, TextFieldEventBehavior eventBehavior)
{
BaseDateAndTimeInputType::setValue(value, valueChanged, eventBehavior);
if (valueChanged)
updateInnerTextValue();
}
void BaseChooserOnlyDateAndTimeInputType::detach()
{
closeDateTimeChooser();
}
void BaseChooserOnlyDateAndTimeInputType::didChooseValue(const String& value)
{
ASSERT(element());
element()->setValue(value, DispatchInputAndChangeEvent);
}
void BaseChooserOnlyDateAndTimeInputType::didEndChooser()
{
m_dateTimeChooser = nullptr;
}
void BaseChooserOnlyDateAndTimeInputType::closeDateTimeChooser()
{
if (m_dateTimeChooser)
m_dateTimeChooser->endChooser();
}
auto BaseChooserOnlyDateAndTimeInputType::handleKeydownEvent(KeyboardEvent& event) -> ShouldCallBaseEventHandler
{
ASSERT(element());
return BaseClickableWithKeyInputType::handleKeydownEvent(*element(), event);
}
void BaseChooserOnlyDateAndTimeInputType::handleKeypressEvent(KeyboardEvent& event)
{
ASSERT(element());
BaseClickableWithKeyInputType::handleKeypressEvent(*element(), event);
}
void BaseChooserOnlyDateAndTimeInputType::handleKeyupEvent(KeyboardEvent& event)
{
BaseClickableWithKeyInputType::handleKeyupEvent(*this, event);
}
bool BaseChooserOnlyDateAndTimeInputType::accessKeyAction(bool sendMouseEvents)
{
BaseDateAndTimeInputType::accessKeyAction(sendMouseEvents);
ASSERT(element());
return BaseClickableWithKeyInputType::accessKeyAction(*element(), sendMouseEvents);
}
bool BaseChooserOnlyDateAndTimeInputType::isMouseFocusable() const
{
ASSERT(element());
return element()->isTextFormControlFocusable();
}
void BaseChooserOnlyDateAndTimeInputType::attributeChanged(const QualifiedName& name)
{
if (name == valueAttr) {
if (auto* element = this->element()) {
if (!element->hasDirtyValue())
updateInnerTextValue();
}
}
BaseDateAndTimeInputType::attributeChanged(name);
}
}
#endif