@@ -187,11 +187,109 @@ void QmlWebViewCmdExecutor::GetSource(std::string* source, Error** error) {
187187}
188188
189189void QmlWebViewCmdExecutor::SendKeys (const string16& keys, Error** error) {
190- // TODO:
190+ CHECK_VIEW_EXISTANCE
191+
192+ QDeclarativeItem* pFocusItem = qobject_cast<QDeclarativeItem*>(container_->scene ()->focusItem ());
193+
194+ std::string err_msg;
195+ std::vector<QKeyEvent> key_events;
196+ int modifiers = Qt::NoModifier;
197+
198+ if (!QKeyConverter::ConvertKeysToWebKeyEvents (keys,
199+ session_->logger (),
200+ true ,
201+ &modifiers,
202+ &key_events,
203+ &err_msg)) {
204+ session_->logger ().Log (kSevereLogLevel , " SendKeys - cant convert keys:" +err_msg);
205+ *error = new Error (kUnknownError , " SendKeys - cant convert keys:" +err_msg);
206+ return ;
207+ }
208+
209+ // set focus to element
210+ view_->setFocus (true );
211+ if (!view_->hasFocus ()) {
212+ // restore old focus
213+ if (NULL != pFocusItem) pFocusItem->setFocus (true );
214+
215+ *error = new Error (kInvalidElementState );
216+ return ;
217+ }
218+
219+ std::vector<QKeyEvent>::iterator it = key_events.begin ();
220+ while (it != key_events.end ()) {
221+ qApp->sendEvent (container_, &(*it));
222+ ++it;
223+ }
224+
225+ // restore old focus
226+ if (NULL != pFocusItem)
227+ pFocusItem->setFocus (true );
191228}
192229
193230void QmlWebViewCmdExecutor::SendKeys (const ElementId& element, const string16& keys, Error** error) {
194- // TODO:
231+ CHECK_VIEW_EXISTANCE
232+
233+ bool is_displayed = false ;
234+ *error = webkitProxy_->IsElementDisplayed (element, true , &is_displayed);
235+ if (*error)
236+ return ;
237+
238+ if (!is_displayed) {
239+ *error = new Error (kElementNotVisible );
240+ return ;
241+ }
242+
243+ bool is_enabled = false ;
244+ *error = webkitProxy_->IsElementEnabled (element, &is_enabled);
245+ if (*error)
246+ return ;
247+
248+ if (!is_enabled) {
249+ *error = new Error (kInvalidElementState );
250+ return ;
251+ }
252+
253+ *error = webkitProxy_->SetActiveElement (element);
254+ if (*error)
255+ return ;
256+
257+ std::string err_msg;
258+ std::vector<QKeyEvent> key_events;
259+ int modifiers = Qt::NoModifier;
260+
261+ if (!QKeyConverter::ConvertKeysToWebKeyEvents (keys,
262+ session_->logger (),
263+ true ,
264+ &modifiers,
265+ &key_events,
266+ &err_msg)) {
267+ session_->logger ().Log (kSevereLogLevel , " ElementSendKeys - cant convert keys:" +err_msg);
268+ *error = new Error (kUnknownError , " ElementSendKeys - cant convert keys:" +err_msg);
269+ return ;
270+ }
271+
272+ QDeclarativeItem* pFocusItem = qobject_cast<QDeclarativeItem*>(container_->scene ()->focusItem ());
273+
274+ // set focus to element
275+ view_->setFocus (true );
276+ if (!view_->hasFocus ()) {
277+ // restore old focus
278+ if (NULL != pFocusItem) pFocusItem->setFocus (true );
279+
280+ *error = new Error (kInvalidElementState );
281+ return ;
282+ }
283+
284+ std::vector<QKeyEvent>::iterator it = key_events.begin ();
285+ while (it != key_events.end ()) {
286+ qApp->sendEvent (container_, &(*it));
287+ ++it;
288+ }
289+
290+ // restore old focus
291+ if (NULL != pFocusItem)
292+ pFocusItem->setFocus (true );
195293}
196294
197295void QmlWebViewCmdExecutor::MouseDoubleClick (Error** error) {
0 commit comments