Index: chrome/test/webdriver/session.cc |
diff --git a/chrome/test/webdriver/session.cc b/chrome/test/webdriver/session.cc |
index ebb7fae51ab67c7e07f8124585ccd6f4ba31935d..39bcd86887b5d7ff6205900d7bd89aa2fb56c538 100644 |
--- a/chrome/test/webdriver/session.cc |
+++ b/chrome/test/webdriver/session.cc |
@@ -173,12 +173,19 @@ ErrorCode Session::ExecuteScript(const std::string& script, |
} |
ErrorCode Session::SendKeys(const WebElementId& element, const string16& keys) { |
+ bool is_displayed = false; |
+ ErrorCode code = IsElementDisplayed(current_target_, element, &is_displayed); |
+ if (code != kSuccess) |
+ return code; |
+ if (!is_displayed) |
+ return kElementNotVisible; |
+ |
ListValue args; |
args.Append(element.ToValue()); |
// TODO(jleyba): Update this to use the correct atom. |
std::string script = "document.activeElement.blur();arguments[0].focus();"; |
Value* unscoped_result = NULL; |
- ErrorCode code = ExecuteScript(script, &args, &unscoped_result); |
+ code = ExecuteScript(script, &args, &unscoped_result); |
scoped_ptr<Value> result(unscoped_result); |
if (code != kSuccess) { |
LOG(ERROR) << "Failed to focus element before sending keys"; |
@@ -278,7 +285,7 @@ bool Session::GetTabTitle(std::string* tab_title) { |
return success; |
} |
-void Session::MouseClick(const gfx::Point& click, |
+bool Session::MouseClick(const gfx::Point& click, |
automation::MouseButton button) { |
bool success = false; |
RunSessionTask(NewRunnableMethod( |
@@ -288,6 +295,7 @@ void Session::MouseClick(const gfx::Point& click, |
click, |
button, |
&success)); |
+ return success; |
} |
bool Session::MouseMove(const gfx::Point& location) { |
@@ -649,6 +657,26 @@ ErrorCode Session::GetElementBorder(const FrameId& frame_id, |
return kSuccess; |
} |
+ErrorCode Session::IsElementDisplayed(const FrameId& frame_id, |
+ const WebElementId& element, |
+ bool* is_displayed) { |
+ std::string script = base::StringPrintf( |
+ "return (%s).apply(null, arguments);", atoms::IS_DISPLAYED); |
+ ListValue args; |
+ args.Append(element.ToValue()); |
+ |
+ Value* unscoped_result = NULL; |
+ ErrorCode code = ExecuteScript(frame_id, script, &args, &unscoped_result); |
+ scoped_ptr<Value> result(unscoped_result); |
+ if (code != kSuccess) |
+ return code; |
+ if (!result->GetAsBoolean(is_displayed)) { |
+ LOG(ERROR) << "IsDisplayed atom returned non boolean"; |
+ return kUnknownError; |
+ } |
+ return kSuccess; |
+} |
+ |
bool Session::WaitForAllTabsToStopLoading() { |
if (!automation_.get()) |
return true; |
@@ -707,11 +735,16 @@ void Session::TerminateOnSessionThread() { |
automation_.reset(); |
} |
-void Session::SendKeysOnSessionThread(const string16& keys, |
- bool* success) { |
+void Session::SendKeysOnSessionThread(const string16& keys, bool* success) { |
*success = true; |
std::vector<WebKeyEvent> key_events; |
- ConvertKeysToWebKeyEvents(keys, &key_events); |
+ std::string error_msg; |
+ if (!ConvertKeysToWebKeyEvents(keys, &key_events, &error_msg)) { |
+ // TODO(kkania): Return this message to the user. |
+ LOG(ERROR) << error_msg; |
+ *success = false; |
+ return; |
+ } |
for (size_t i = 0; i < key_events.size(); ++i) { |
bool key_success = false; |
automation_->SendWebKeyEvent( |