blob: c58e06be802bf8189262d2705c1a9d4905965adc [file] [log] [blame]
/*
* Copyright (C) 2012 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:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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 "web/ExternalDateTimeChooser.h"
#include "core/InputTypeNames.h"
#include "core/html/forms/DateTimeChooserClient.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "public/web/WebDateTimeChooserCompletion.h"
#include "public/web/WebDateTimeChooserParams.h"
#include "public/web/WebViewClient.h"
#include "web/ChromeClientImpl.h"
#include "wtf/text/AtomicString.h"
namespace blink {
class WebDateTimeChooserCompletionImpl : public WebDateTimeChooserCompletion {
public:
WebDateTimeChooserCompletionImpl(ExternalDateTimeChooser* chooser)
: m_chooser(chooser)
{
}
private:
void didChooseValue(const WebString& value) override
{
m_chooser->didChooseValue(value);
delete this;
}
void didChooseValue(double value) override
{
m_chooser->didChooseValue(value);
delete this;
}
void didCancelChooser() override
{
m_chooser->didCancelChooser();
delete this;
}
Persistent<ExternalDateTimeChooser> m_chooser;
};
ExternalDateTimeChooser::~ExternalDateTimeChooser()
{
}
DEFINE_TRACE(ExternalDateTimeChooser)
{
visitor->trace(m_client);
DateTimeChooser::trace(visitor);
}
ExternalDateTimeChooser::ExternalDateTimeChooser(DateTimeChooserClient* client)
: m_client(client)
{
DCHECK(!RuntimeEnabledFeatures::inputMultipleFieldsUIEnabled());
DCHECK(client);
}
ExternalDateTimeChooser* ExternalDateTimeChooser::create(ChromeClientImpl* chromeClient, WebViewClient* webViewClient, DateTimeChooserClient* client, const DateTimeChooserParameters& parameters)
{
DCHECK(chromeClient);
ExternalDateTimeChooser* chooser = new ExternalDateTimeChooser(client);
if (!chooser->openDateTimeChooser(chromeClient, webViewClient, parameters))
chooser = nullptr;
return chooser;
}
static WebDateTimeInputType toWebDateTimeInputType(const AtomicString& source)
{
if (source == InputTypeNames::date)
return WebDateTimeInputTypeDate;
if (source == InputTypeNames::datetime)
return WebDateTimeInputTypeDateTime;
if (source == InputTypeNames::datetime_local)
return WebDateTimeInputTypeDateTimeLocal;
if (source == InputTypeNames::month)
return WebDateTimeInputTypeMonth;
if (source == InputTypeNames::time)
return WebDateTimeInputTypeTime;
if (source == InputTypeNames::week)
return WebDateTimeInputTypeWeek;
return WebDateTimeInputTypeNone;
}
bool ExternalDateTimeChooser::openDateTimeChooser(ChromeClientImpl* chromeClient, WebViewClient* webViewClient, const DateTimeChooserParameters& parameters)
{
if (!webViewClient)
return false;
WebDateTimeChooserParams webParams;
webParams.type = toWebDateTimeInputType(parameters.type);
webParams.anchorRectInScreen = parameters.anchorRectInScreen;
webParams.currentValue = parameters.currentValue;
webParams.doubleValue = parameters.doubleValue;
webParams.suggestions = parameters.suggestions;
webParams.minimum = parameters.minimum;
webParams.maximum = parameters.maximum;
webParams.step = parameters.step;
webParams.stepBase = parameters.stepBase;
webParams.isRequired = parameters.required;
webParams.isAnchorElementRTL = parameters.isAnchorElementRTL;
WebDateTimeChooserCompletion* completion = new WebDateTimeChooserCompletionImpl(this);
if (webViewClient->openDateTimeChooser(webParams, completion))
return true;
// We can't open a chooser. Calling
// WebDateTimeChooserCompletionImpl::didCancelChooser to delete the
// WebDateTimeChooserCompletionImpl object and deref this.
completion->didCancelChooser();
return false;
}
void ExternalDateTimeChooser::didChooseValue(const WebString& value)
{
if (m_client)
m_client->didChooseValue(value);
// didChooseValue might run JavaScript code, and endChooser() might be
// called. However DateTimeChooserCompletionImpl still has one reference to
// this object.
if (m_client)
m_client->didEndChooser();
}
void ExternalDateTimeChooser::didChooseValue(double value)
{
if (m_client)
m_client->didChooseValue(value);
// didChooseValue might run JavaScript code, and endChooser() might be
// called. However DateTimeChooserCompletionImpl still has one reference to
// this object.
if (m_client)
m_client->didEndChooser();
}
void ExternalDateTimeChooser::didCancelChooser()
{
if (m_client)
m_client->didEndChooser();
}
void ExternalDateTimeChooser::endChooser()
{
DateTimeChooserClient* client = m_client;
m_client = nullptr;
client->didEndChooser();
}
AXObject* ExternalDateTimeChooser::rootAXObject()
{
return nullptr;
}
} // namespace blink