Index: chrome/test/webdriver/commands/webelement_commands.cc |
diff --git a/chrome/test/webdriver/commands/webelement_commands.cc b/chrome/test/webdriver/commands/webelement_commands.cc |
index dae3e4eba697cf4ea7397069c73313c502834cbb..0bf78d6854d2842016a2251e9eeeb71dfd00098a 100644 |
--- a/chrome/test/webdriver/commands/webelement_commands.cc |
+++ b/chrome/test/webdriver/commands/webelement_commands.cc |
@@ -498,12 +498,91 @@ void ElementValueCommand::ExecuteGet(Response* const response) { |
} |
void ElementValueCommand::ExecutePost(Response* const response) { |
+ std::string tag_name; |
+ Error* error = GetElementAttribute("tagName", &tag_name); |
+ if (error) { |
+ response->SetError(error); |
+ return; |
+ } |
+ |
+ std::string type; |
+ error = GetElementAttribute("type", &type); |
+ if (error) { |
+ response->SetError(error); |
+ return; |
+ } |
+ |
+ // If the element is a file upload control, set the file paths to the element. |
+ // Otherwise send the value to the element as key input. |
+ if (tag_name == "INPUT" && type == "file") { |
kkania
2011/05/23 18:43:49
do case insensitive comparison
nodchip
2011/05/26 01:14:53
Done.
|
+ SetFilePathsToFileUploadControl(response); |
+ } else { |
+ SendKeys(response); |
+ } |
+} |
+ |
+void ElementValueCommand::SetFilePathsToFileUploadControl( |
+ Response* const response) const { |
+ ListValue* key_list; |
kkania
2011/05/23 18:43:49
rename key_list
nodchip
2011/05/26 01:14:53
Done.
|
+ if (!GetListParameter("value", &key_list)) { |
+ response->SetError(new Error(kBadRequest, |
+ "Missing or invalid 'value' parameter")); |
+ return; |
+ } |
+ |
+ std::vector<std::string> paths; |
+ for (size_t i = 0; i < key_list->GetSize(); ++i) { |
+ std::string path; |
+ key_list->GetString(i, &path); |
kkania
2011/05/23 18:43:49
handle errors
kkania
2011/05/23 18:43:49
what do you think about checking that the path exi
nodchip
2011/05/26 01:14:53
Done.
nodchip
2011/05/26 01:14:53
Done.
|
+ paths.push_back(path); |
+ } |
+ |
+ bool is_displayed; |
+ Error* error = session_->IsElementDisplayed( |
kkania
2011/05/23 18:43:49
I think this code and the following bit is in quit
nodchip
2011/05/26 01:14:53
Done.
|
+ session_->current_target(), element, &is_displayed); |
+ if (error) { |
+ response->SetError(error); |
+ return; |
+ } |
+ if (!is_displayed) { |
+ response->SetError(new Error(kElementNotVisible, |
+ "Element must be displayed")); |
+ return; |
+ } |
+ |
+ gfx::Point location; |
+ error = session_->GetElementLocationInView(element, &location); |
+ if (error) { |
+ response->SetError(error); |
+ return; |
+ } |
+ |
+ gfx::Size size; |
+ error = session_->GetElementSize(session_->current_target(), element, &size); |
+ if (error) { |
+ response->SetError(error); |
+ return; |
+ } |
+ |
+ location.Offset(size.width() / 2, size.height() / 2); |
+ |
+ error = session_->SetFilePathsToFileUploadControl(location, paths); |
+ if (error) { |
+ response->SetError(error); |
+ return; |
+ } |
+ |
+ response->SetStatus(kSuccess); |
+} |
+ |
+void ElementValueCommand::SendKeys(Response* const response) const { |
ListValue* key_list; |
if (!GetListParameter("value", &key_list)) { |
response->SetError(new Error( |
kBadRequest, "Missing or invalid 'value' parameter")); |
return; |
} |
+ |
// Flatten the given array of strings into one. |
string16 keys; |
for (size_t i = 0; i < key_list->GetSize(); ++i) { |
@@ -524,6 +603,30 @@ void ElementValueCommand::ExecutePost(Response* const response) { |
response->SetError(error); |
} |
+Error* ElementValueCommand::GetElementAttribute(const std::string& key, |
+ std::string* value) const { |
+ std::string script = base::StringPrintf( |
+ "return (%s).apply(null, arguments);", atoms::GET_ATTRIBUTE); |
kkania
2011/05/23 18:43:49
can we share this code with the attribute command
nodchip
2011/05/26 01:14:53
Done.
|
+ |
+ scoped_ptr<ListValue> args(new ListValue); |
+ args->Append(element.ToValue()); |
+ args->Append(Value::CreateStringValue(key)); |
+ |
+ Value* result = NULL; |
+ Error* error = session_->ExecuteScript(script, args.get(), &result); |
+ if (error) { |
+ return error; |
+ } |
+ |
+ if (result) { |
+ result->GetAsString(value); |
kkania
2011/05/23 18:43:49
return an error if not a string
nodchip
2011/05/26 01:14:53
Done.
|
+ delete result; |
kkania
2011/05/23 18:43:49
use scoped_ptr
nodchip
2011/05/26 01:14:53
Done.
|
+ result = NULL; |
+ } |
+ |
+ return NULL; |
+} |
+ |
///////////////////// ElementTextCommand //////////////////// |
ElementTextCommand::ElementTextCommand( |