Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Side by Side Diff: chrome/test/webdriver/commands/mouse_commands.cc

Issue 7522024: Refactor chromedriver's script execution to reduce amount of custom Value parsing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/commands/mouse_commands.h" 5 #include "chrome/test/webdriver/commands/mouse_commands.h"
6 6
7 #include "base/values.h" 7 #include "base/values.h"
8 #include "chrome/common/automation_constants.h" 8 #include "chrome/common/automation_constants.h"
9 #include "chrome/test/automation/value_conversion_util.h"
9 #include "chrome/test/webdriver/commands/response.h" 10 #include "chrome/test/webdriver/commands/response.h"
10 #include "chrome/test/webdriver/session.h" 11 #include "chrome/test/webdriver/session.h"
11 #include "chrome/test/webdriver/utility_functions.h"
12 #include "chrome/test/webdriver/web_element_id.h" 12 #include "chrome/test/webdriver/web_element_id.h"
13 #include "chrome/test/webdriver/webdriver_basic_types.h"
13 #include "chrome/test/webdriver/webdriver_error.h" 14 #include "chrome/test/webdriver/webdriver_error.h"
14 #include "ui/gfx/point.h" 15 #include "chrome/test/webdriver/webdriver_util.h"
15 #include "ui/gfx/size.h"
16 16
17 namespace { 17 namespace {
18 18
19 const int kLeftButton = 0; 19 const int kLeftButton = 0;
20 const int kMiddleButton = 1; 20 const int kMiddleButton = 1;
21 const int kRightButton = 2; 21 const int kRightButton = 2;
22 22
23 } // namespace 23 } // namespace
24 24
25 namespace webdriver { 25 namespace webdriver {
(...skipping 13 matching lines...) Expand all
39 std::string tag_name; 39 std::string tag_name;
40 Error* error = session_->GetElementTagName( 40 Error* error = session_->GetElementTagName(
41 session_->current_target(), element, &tag_name); 41 session_->current_target(), element, &tag_name);
42 if (error) { 42 if (error) {
43 response->SetError(error); 43 response->SetError(error);
44 return; 44 return;
45 } 45 }
46 46
47 if (tag_name == "option") { 47 if (tag_name == "option") {
48 const char* kCanOptionBeToggledScript = 48 const char* kCanOptionBeToggledScript =
49 "return (function(option) {" 49 "function(option) {"
50 " var select = option.parentElement;" 50 " var select = option.parentElement;"
51 " if (!select || select.tagName.toLowerCase() != 'select')" 51 " if (!select || select.tagName.toLowerCase() != 'select')"
52 " throw new Error('Option element is not in a select');" 52 " throw new Error('Option element is not in a select');"
53 " return select.multiple;" 53 " return select.multiple;"
54 "}).apply(null, arguments);"; 54 "}";
55 ListValue args; 55 bool can_be_toggled;
56 args.Append(element.ToValue()); 56 error = session_->ExecuteScriptAndParse(
57 Value* value = NULL; 57 session_->current_target(),
58 error = session_->ExecuteScript( 58 kCanOptionBeToggledScript,
59 session_->current_target(), kCanOptionBeToggledScript, &args, &value); 59 "canOptionBeToggled",
60 CreateListValueFrom(element),
61 CreateDirectValueParser(&can_be_toggled));
60 if (error) { 62 if (error) {
61 response->SetError(error); 63 response->SetError(error);
62 return; 64 return;
63 } 65 }
64 scoped_ptr<Value> scoped_value(value);
65 bool can_be_toggled;
66 if (!value->GetAsBoolean(&can_be_toggled)) {
67 response->SetError(
68 new Error(kUnknownError, "canOptionBeToggled returned non-boolean: " +
69 JsonStringify(value)));
70 return;
71 }
72 66
73 if (can_be_toggled) { 67 if (can_be_toggled) {
74 error = session_->ToggleOptionElement( 68 error = session_->ToggleOptionElement(
75 session_->current_target(), element); 69 session_->current_target(), element);
76 } else { 70 } else {
77 error = session_->SetOptionElementSelected( 71 error = session_->SetOptionElementSelected(
78 session_->current_target(), element, true); 72 session_->current_target(), element, true);
79 } 73 }
80 } else { 74 } else {
81 gfx::Point location; 75 Point location;
82 error = session_->GetClickableLocation(element, &location); 76 error = session_->GetClickableLocation(element, &location);
83 if (!error) 77 if (!error)
84 error = session_->MouseMoveAndClick(location, automation::kLeftButton); 78 error = session_->MouseMoveAndClick(location, automation::kLeftButton);
85 } 79 }
86 if (error) { 80 if (error) {
87 response->SetError(error); 81 response->SetError(error);
88 return; 82 return;
89 } 83 }
90 } 84 }
91 85
92 HoverCommand::HoverCommand(const std::vector<std::string>& path_segments, 86 HoverCommand::HoverCommand(const std::vector<std::string>& path_segments,
93 const DictionaryValue* const parameters) 87 const DictionaryValue* const parameters)
94 : WebElementCommand(path_segments, parameters) {} 88 : WebElementCommand(path_segments, parameters) {}
95 89
96 HoverCommand::~HoverCommand() {} 90 HoverCommand::~HoverCommand() {}
97 91
98 bool HoverCommand::DoesPost() { 92 bool HoverCommand::DoesPost() {
99 return true; 93 return true;
100 } 94 }
101 95
102 void HoverCommand::ExecutePost(Response* response) { 96 void HoverCommand::ExecutePost(Response* response) {
103 Error* error = NULL; 97 Error* error = NULL;
104 gfx::Point location; 98 Point location;
105 error = session_->GetClickableLocation(element, &location); 99 error = session_->GetClickableLocation(element, &location);
106 if (!error) 100 if (!error)
107 error = session_->MouseMove(location); 101 error = session_->MouseMove(location);
108 if (error) { 102 if (error) {
109 response->SetError(error); 103 response->SetError(error);
110 return; 104 return;
111 } 105 }
112 } 106 }
113 107
114 DragCommand::DragCommand(const std::vector<std::string>& path_segments, 108 DragCommand::DragCommand(const std::vector<std::string>& path_segments,
(...skipping 14 matching lines...) Expand all
129 123
130 return true; 124 return true;
131 } 125 }
132 126
133 bool DragCommand::DoesPost() { 127 bool DragCommand::DoesPost() {
134 return true; 128 return true;
135 } 129 }
136 130
137 void DragCommand::ExecutePost(Response* response) { 131 void DragCommand::ExecutePost(Response* response) {
138 Error* error = NULL; 132 Error* error = NULL;
139 gfx::Point drag_from; 133 Point drag_from;
140 error = session_->GetClickableLocation(element, &drag_from); 134 error = session_->GetClickableLocation(element, &drag_from);
141 if (error) { 135 if (error) {
142 response->SetError(error); 136 response->SetError(error);
143 return; 137 return;
144 } 138 }
145 139
146 gfx::Point drag_to(drag_from); 140 Point drag_to(drag_from);
147 drag_to.Offset(drag_x_, drag_y_); 141 drag_to.Offset(drag_x_, drag_y_);
148 if (drag_to.x() < 0 || drag_to.y() < 0) 142 if (drag_to.x() < 0 || drag_to.y() < 0)
149 error = new Error(kBadRequest, "Invalid (x,y) coordinates"); 143 error = new Error(kBadRequest, "Invalid (x,y) coordinates");
150 if (!error) 144 if (!error)
151 error = session_->MouseDrag(drag_from, drag_to); 145 error = session_->MouseDrag(drag_from, drag_to);
152 146
153 if (error) { 147 if (error) {
154 response->SetError(error); 148 response->SetError(error);
155 return; 149 return;
156 } 150 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 if (!has_element_ && !has_offset_) { 186 if (!has_element_ && !has_offset_) {
193 response->SetError(new Error( 187 response->SetError(new Error(
194 kBadRequest, "Invalid command arguments")); 188 kBadRequest, "Invalid command arguments"));
195 return false; 189 return false;
196 } 190 }
197 191
198 return true; 192 return true;
199 } 193 }
200 194
201 void MoveToCommand::ExecutePost(Response* const response) { 195 void MoveToCommand::ExecutePost(Response* const response) {
202 gfx::Point location; 196 Point location;
203 Error* error; 197 Error* error;
204 198
205 if (has_element_) { 199 if (has_element_) {
206 // If an element is specified, calculate the coordinate. 200 // If an element is specified, calculate the coordinate.
207 error = session_->GetElementLocationInView(element_, &location); 201 error = session_->GetElementLocationInView(element_, &location);
208 if (error) { 202 if (error) {
209 response->SetError(error); 203 response->SetError(error);
210 return; 204 return;
211 } 205 }
212 } else { 206 } else {
213 // If not, use the current mouse position. 207 // If not, use the current mouse position.
214 location = session_->get_mouse_position(); 208 location = session_->get_mouse_position();
215 } 209 }
216 210
217 if (has_offset_) { 211 if (has_offset_) {
218 // If an offset is specified, translate by the offset. 212 // If an offset is specified, translate by the offset.
219 location.Offset(x_offset_, y_offset_); 213 location.Offset(x_offset_, y_offset_);
220 } else { 214 } else {
221 DCHECK(has_element_); 215 DCHECK(has_element_);
222 216
223 // If not, calculate the half of the element size and translate by it. 217 // If not, calculate the half of the element size and translate by it.
224 gfx::Size size; 218 Size size;
225 error = session_->GetElementSize(session_->current_target(), 219 error = session_->GetElementSize(session_->current_target(),
226 element_, &size); 220 element_, &size);
227 if (error) { 221 if (error) {
228 response->SetError(error); 222 response->SetError(error);
229 return; 223 return;
230 } 224 }
231 225
232 location.Offset(size.width() / 2, size.height() / 2); 226 location.Offset(size.width() / 2, size.height() / 2);
233 } 227 }
234 228
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 302
309 void DoubleClickCommand::ExecutePost(Response* const response) { 303 void DoubleClickCommand::ExecutePost(Response* const response) {
310 Error* error = session_->MouseDoubleClick(); 304 Error* error = session_->MouseDoubleClick();
311 if (error) { 305 if (error) {
312 response->SetError(error); 306 response->SetError(error);
313 return; 307 return;
314 } 308 }
315 } 309 }
316 310
317 } // namespace webdriver 311 } // namespace webdriver
OLDNEW
« no previous file with comments | « chrome/test/webdriver/automation.cc ('k') | chrome/test/webdriver/commands/webelement_commands.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698