2 * Copyright (C) 2012 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #if !ENABLE(INPUT_MULTIPLE_FIELDS_UI)
28 #include "web/ExternalDateTimeChooser.h"
30 #include "core/InputTypeNames.h"
31 #include "platform/DateTimeChooserClient.h"
32 #include "public/web/WebDateTimeChooserCompletion.h"
33 #include "public/web/WebDateTimeChooserParams.h"
34 #include "public/web/WebViewClient.h"
35 #include "web/ChromeClientImpl.h"
36 #include "wtf/text/AtomicString.h"
40 class WebDateTimeChooserCompletionImpl : public WebDateTimeChooserCompletion {
42 WebDateTimeChooserCompletionImpl(ExternalDateTimeChooser* chooser)
48 virtual void didChooseValue(const WebString& value) OVERRIDE
50 m_chooser->didChooseValue(value);
54 virtual void didChooseValue(double value) OVERRIDE
56 m_chooser->didChooseValue(value);
60 virtual void didCancelChooser() OVERRIDE
62 m_chooser->didCancelChooser();
66 RefPtrWillBePersistent<ExternalDateTimeChooser> m_chooser;
69 ExternalDateTimeChooser::~ExternalDateTimeChooser()
73 ExternalDateTimeChooser::ExternalDateTimeChooser(DateTimeChooserClient* client)
79 PassRefPtrWillBeRawPtr<ExternalDateTimeChooser> ExternalDateTimeChooser::create(ChromeClientImpl* chromeClient, WebViewClient* webViewClient, DateTimeChooserClient* client, const DateTimeChooserParameters& parameters)
82 RefPtrWillBeRawPtr<ExternalDateTimeChooser> chooser = adoptRefWillBeNoop(new ExternalDateTimeChooser(client));
83 if (!chooser->openDateTimeChooser(chromeClient, webViewClient, parameters))
85 return chooser.release();
89 static WebDateTimeInputType toWebDateTimeInputType(const AtomicString& source)
91 if (source == InputTypeNames::date)
92 return WebDateTimeInputTypeDate;
93 if (source == InputTypeNames::datetime)
94 return WebDateTimeInputTypeDateTime;
95 if (source == InputTypeNames::datetime_local)
96 return WebDateTimeInputTypeDateTimeLocal;
97 if (source == InputTypeNames::month)
98 return WebDateTimeInputTypeMonth;
99 if (source == InputTypeNames::time)
100 return WebDateTimeInputTypeTime;
101 if (source == InputTypeNames::week)
102 return WebDateTimeInputTypeWeek;
103 return WebDateTimeInputTypeNone;
106 bool ExternalDateTimeChooser::openDateTimeChooser(ChromeClientImpl* chromeClient, WebViewClient* webViewClient, const DateTimeChooserParameters& parameters)
111 WebDateTimeChooserParams webParams;
112 webParams.type = toWebDateTimeInputType(parameters.type);
113 webParams.anchorRectInScreen = chromeClient->rootViewToScreen(parameters.anchorRectInRootView);
114 webParams.currentValue = parameters.currentValue;
115 webParams.doubleValue = parameters.doubleValue;
116 webParams.suggestions = parameters.suggestions;
117 webParams.minimum = parameters.minimum;
118 webParams.maximum = parameters.maximum;
119 webParams.step = parameters.step;
120 webParams.stepBase = parameters.stepBase;
121 webParams.isRequired = parameters.required;
122 webParams.isAnchorElementRTL = parameters.isAnchorElementRTL;
124 WebDateTimeChooserCompletion* completion = new WebDateTimeChooserCompletionImpl(this);
125 if (webViewClient->openDateTimeChooser(webParams, completion))
127 // We can't open a chooser. Calling
128 // WebDateTimeChooserCompletionImpl::didCancelChooser to delete the
129 // WebDateTimeChooserCompletionImpl object and deref this.
130 completion->didCancelChooser();
134 void ExternalDateTimeChooser::didChooseValue(const WebString& value)
137 m_client->didChooseValue(value);
138 // didChooseValue might run JavaScript code, and endChooser() might be
139 // called. However DateTimeChooserCompletionImpl still has one reference to
142 m_client->didEndChooser();
145 void ExternalDateTimeChooser::didChooseValue(double value)
148 m_client->didChooseValue(value);
149 // didChooseValue might run JavaScript code, and endChooser() might be
150 // called. However DateTimeChooserCompletionImpl still has one reference to
153 m_client->didEndChooser();
156 void ExternalDateTimeChooser::didCancelChooser()
159 m_client->didEndChooser();
162 void ExternalDateTimeChooser::endChooser()
164 DateTimeChooserClient* client = m_client;
166 client->didEndChooser();