| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/test/webdriver/session_manager.h" | 5 #include "chrome/test/webdriver/session_manager.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 return static_cast<ErrorCode>(status); | 166 return static_cast<ErrorCode>(status); |
| 167 } | 167 } |
| 168 | 168 |
| 169 ErrorCode Session::ExecuteScript(const std::string& script, | 169 ErrorCode Session::ExecuteScript(const std::string& script, |
| 170 const ListValue* const args, | 170 const ListValue* const args, |
| 171 Value** value) { | 171 Value** value) { |
| 172 return ExecuteScript(current_target_, script, args, value); | 172 return ExecuteScript(current_target_, script, args, value); |
| 173 } | 173 } |
| 174 | 174 |
| 175 ErrorCode Session::SendKeys(const WebElementId& element, const string16& keys) { | 175 ErrorCode Session::SendKeys(const WebElementId& element, const string16& keys) { |
| 176 bool is_displayed = false; |
| 177 ErrorCode code = IsElementDisplayed(current_target_, element, &is_displayed); |
| 178 if (code != kSuccess) |
| 179 return code; |
| 180 if (!is_displayed) |
| 181 return kElementNotVisible; |
| 182 |
| 176 ListValue args; | 183 ListValue args; |
| 177 args.Append(element.ToValue()); | 184 args.Append(element.ToValue()); |
| 178 // TODO(jleyba): Update this to use the correct atom. | 185 // TODO(jleyba): Update this to use the correct atom. |
| 179 std::string script = "document.activeElement.blur();arguments[0].focus();"; | 186 std::string script = "document.activeElement.blur();arguments[0].focus();"; |
| 180 Value* unscoped_result = NULL; | 187 Value* unscoped_result = NULL; |
| 181 ErrorCode code = ExecuteScript(script, &args, &unscoped_result); | 188 code = ExecuteScript(script, &args, &unscoped_result); |
| 182 scoped_ptr<Value> result(unscoped_result); | 189 scoped_ptr<Value> result(unscoped_result); |
| 183 if (code != kSuccess) { | 190 if (code != kSuccess) { |
| 184 LOG(ERROR) << "Failed to focus element before sending keys"; | 191 LOG(ERROR) << "Failed to focus element before sending keys"; |
| 185 return code; | 192 return code; |
| 186 } | 193 } |
| 187 | 194 |
| 188 bool success = false; | 195 bool success = false; |
| 189 RunSessionTask(NewRunnableMethod( | 196 RunSessionTask(NewRunnableMethod( |
| 190 this, | 197 this, |
| 191 &Session::SendKeysOnSessionThread, | 198 &Session::SendKeysOnSessionThread, |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 bool success = false; | 278 bool success = false; |
| 272 RunSessionTask(NewRunnableMethod( | 279 RunSessionTask(NewRunnableMethod( |
| 273 automation_.get(), | 280 automation_.get(), |
| 274 &Automation::GetTabTitle, | 281 &Automation::GetTabTitle, |
| 275 current_target_.window_id, | 282 current_target_.window_id, |
| 276 tab_title, | 283 tab_title, |
| 277 &success)); | 284 &success)); |
| 278 return success; | 285 return success; |
| 279 } | 286 } |
| 280 | 287 |
| 281 void Session::MouseClick(const gfx::Point& click, | 288 bool Session::MouseClick(const gfx::Point& click, |
| 282 automation::MouseButton button) { | 289 automation::MouseButton button) { |
| 283 bool success = false; | 290 bool success = false; |
| 284 RunSessionTask(NewRunnableMethod( | 291 RunSessionTask(NewRunnableMethod( |
| 285 automation_.get(), | 292 automation_.get(), |
| 286 &Automation::MouseClick, | 293 &Automation::MouseClick, |
| 287 current_target_.window_id, | 294 current_target_.window_id, |
| 288 click, | 295 click, |
| 289 button, | 296 button, |
| 290 &success)); | 297 &success)); |
| 298 return success; |
| 291 } | 299 } |
| 292 | 300 |
| 293 bool Session::MouseMove(const gfx::Point& location) { | 301 bool Session::MouseMove(const gfx::Point& location) { |
| 294 bool success = false; | 302 bool success = false; |
| 295 RunSessionTask(NewRunnableMethod( | 303 RunSessionTask(NewRunnableMethod( |
| 296 automation_.get(), | 304 automation_.get(), |
| 297 &Automation::MouseMove, | 305 &Automation::MouseMove, |
| 298 current_target_.window_id, | 306 current_target_.window_id, |
| 299 location, | 307 location, |
| 300 &success)); | 308 &success)); |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 ErrorCode code_top = GetElementEffectiveStyle( | 650 ErrorCode code_top = GetElementEffectiveStyle( |
| 643 frame_id, element, "border-top-width", &border_top_str); | 651 frame_id, element, "border-top-width", &border_top_str); |
| 644 if (code_left != kSuccess || code_top != kSuccess) | 652 if (code_left != kSuccess || code_top != kSuccess) |
| 645 return code_left; | 653 return code_left; |
| 646 | 654 |
| 647 base::StringToInt(border_left_str, border_left); | 655 base::StringToInt(border_left_str, border_left); |
| 648 base::StringToInt(border_top_str, border_top); | 656 base::StringToInt(border_top_str, border_top); |
| 649 return kSuccess; | 657 return kSuccess; |
| 650 } | 658 } |
| 651 | 659 |
| 660 ErrorCode Session::IsElementDisplayed(const FrameId& frame_id, |
| 661 const WebElementId& element, |
| 662 bool* is_displayed) { |
| 663 std::string script = base::StringPrintf( |
| 664 "return (%s).apply(null, arguments);", atoms::IS_DISPLAYED); |
| 665 ListValue args; |
| 666 args.Append(element.ToValue()); |
| 667 |
| 668 Value* unscoped_result = NULL; |
| 669 ErrorCode code = ExecuteScript(frame_id, script, &args, &unscoped_result); |
| 670 scoped_ptr<Value> result(unscoped_result); |
| 671 if (code != kSuccess) |
| 672 return code; |
| 673 if (!result->GetAsBoolean(is_displayed)) { |
| 674 LOG(ERROR) << "IsDisplayed atom returned non boolean"; |
| 675 return kUnknownError; |
| 676 } |
| 677 return kSuccess; |
| 678 } |
| 679 |
| 652 bool Session::WaitForAllTabsToStopLoading() { | 680 bool Session::WaitForAllTabsToStopLoading() { |
| 653 if (!automation_.get()) | 681 if (!automation_.get()) |
| 654 return true; | 682 return true; |
| 655 bool success = false; | 683 bool success = false; |
| 656 RunSessionTask(NewRunnableMethod( | 684 RunSessionTask(NewRunnableMethod( |
| 657 automation_.get(), | 685 automation_.get(), |
| 658 &Automation::WaitForAllTabsToStopLoading, | 686 &Automation::WaitForAllTabsToStopLoading, |
| 659 &success)); | 687 &success)); |
| 660 return success; | 688 return success; |
| 661 } | 689 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 current_target_ = FrameId(tab_ids[0], FramePath()); | 728 current_target_ = FrameId(tab_ids[0], FramePath()); |
| 701 } | 729 } |
| 702 } | 730 } |
| 703 | 731 |
| 704 void Session::TerminateOnSessionThread() { | 732 void Session::TerminateOnSessionThread() { |
| 705 if (automation_.get()) | 733 if (automation_.get()) |
| 706 automation_->Terminate(); | 734 automation_->Terminate(); |
| 707 automation_.reset(); | 735 automation_.reset(); |
| 708 } | 736 } |
| 709 | 737 |
| 710 void Session::SendKeysOnSessionThread(const string16& keys, | 738 void Session::SendKeysOnSessionThread(const string16& keys, bool* success) { |
| 711 bool* success) { | |
| 712 *success = true; | 739 *success = true; |
| 713 std::vector<WebKeyEvent> key_events; | 740 std::vector<WebKeyEvent> key_events; |
| 714 ConvertKeysToWebKeyEvents(keys, &key_events); | 741 std::string error_msg; |
| 742 if (!ConvertKeysToWebKeyEvents(keys, &key_events, &error_msg)) { |
| 743 // TODO(kkania): Return this message to the user. |
| 744 LOG(ERROR) << error_msg; |
| 745 *success = false; |
| 746 return; |
| 747 } |
| 715 for (size_t i = 0; i < key_events.size(); ++i) { | 748 for (size_t i = 0; i < key_events.size(); ++i) { |
| 716 bool key_success = false; | 749 bool key_success = false; |
| 717 automation_->SendWebKeyEvent( | 750 automation_->SendWebKeyEvent( |
| 718 current_target_.window_id, key_events[i], &key_success); | 751 current_target_.window_id, key_events[i], &key_success); |
| 719 if (!key_success) { | 752 if (!key_success) { |
| 720 LOG(ERROR) << "Failed to send key event. Event details:\n" | 753 LOG(ERROR) << "Failed to send key event. Event details:\n" |
| 721 << "Type: " << key_events[i].type << "\n" | 754 << "Type: " << key_events[i].type << "\n" |
| 722 << "KeyCode: " << key_events[i].key_code << "\n" | 755 << "KeyCode: " << key_events[i].key_code << "\n" |
| 723 << "UnmodifiedText: " << key_events[i].unmodified_text << "\n" | 756 << "UnmodifiedText: " << key_events[i].unmodified_text << "\n" |
| 724 << "ModifiedText: " << key_events[i].modified_text << "\n" | 757 << "ModifiedText: " << key_events[i].modified_text << "\n" |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 if (!loc_dict->GetInteger("x", &x) || | 895 if (!loc_dict->GetInteger("x", &x) || |
| 863 !loc_dict->GetInteger("y", &y)) { | 896 !loc_dict->GetInteger("y", &y)) { |
| 864 LOG(ERROR) << "Location atom returned bad coordinate dictionary"; | 897 LOG(ERROR) << "Location atom returned bad coordinate dictionary"; |
| 865 code = kUnknownError; | 898 code = kUnknownError; |
| 866 } | 899 } |
| 867 *location = gfx::Point(x, y); | 900 *location = gfx::Point(x, y); |
| 868 return kSuccess; | 901 return kSuccess; |
| 869 } | 902 } |
| 870 | 903 |
| 871 } // namespace webdriver | 904 } // namespace webdriver |
| OLD | NEW |