Skip to content

Commit 19ed533

Browse files
committed
added keys command for qml webview
1 parent fc1d24a commit 19ed533

File tree

1 file changed

+100
-2
lines changed

1 file changed

+100
-2
lines changed

src/webdriver/extension_qt/qml_web_view_executor.cc

Lines changed: 100 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,109 @@ void QmlWebViewCmdExecutor::GetSource(std::string* source, Error** error) {
187187
}
188188

189189
void 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

193230
void 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

197295
void QmlWebViewCmdExecutor::MouseDoubleClick(Error** error) {

0 commit comments

Comments
 (0)