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

Side by Side Diff: chrome/test/webdriver/session.h

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
« no previous file with comments | « chrome/test/webdriver/server.cc ('k') | chrome/test/webdriver/session.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #ifndef CHROME_TEST_WEBDRIVER_SESSION_H_ 5 #ifndef CHROME_TEST_WEBDRIVER_SESSION_H_
6 #define CHROME_TEST_WEBDRIVER_SESSION_H_ 6 #define CHROME_TEST_WEBDRIVER_SESSION_H_
7 7
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/file_path.h" 12 #include "base/file_path.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "base/string16.h" 14 #include "base/string16.h"
15 #include "base/threading/thread.h" 15 #include "base/threading/thread.h"
16 #include "chrome/common/automation_constants.h" 16 #include "chrome/common/automation_constants.h"
17 #include "chrome/test/webdriver/automation.h" 17 #include "chrome/test/webdriver/automation.h"
18 #include "chrome/test/webdriver/frame_path.h" 18 #include "chrome/test/webdriver/frame_path.h"
19 #include "chrome/test/webdriver/web_element_id.h" 19 #include "chrome/test/webdriver/web_element_id.h"
20 #include "ui/gfx/point.h" 20 #include "chrome/test/webdriver/webdriver_basic_types.h"
21 21
22 class CommandLine; 22 class CommandLine;
23 class FilePath; 23 class FilePath;
24 24
25 namespace base { 25 namespace base {
26 class DictionaryValue; 26 class DictionaryValue;
27 class ListValue; 27 class ListValue;
28 class Value; 28 class Value;
29 class WaitableEvent; 29 class WaitableEvent;
30 } 30 }
31 31
32 namespace gfx {
33 class Rect;
34 class Size;
35 }
36
37 namespace webdriver { 32 namespace webdriver {
38 33
39 class Error; 34 class Error;
35 class ValueParser;
40 36
41 // A window ID and frame path combination that uniquely identifies a specific 37 // A window ID and frame path combination that uniquely identifies a specific
42 // frame within a session. 38 // frame within a session.
43 struct FrameId { 39 struct FrameId {
44 FrameId(int window_id, const FramePath& frame_path); 40 FrameId(int window_id, const FramePath& frame_path);
45 FrameId& operator=(const FrameId& other); 41 FrameId& operator=(const FrameId& other);
46 int window_id; 42 int window_id;
47 FramePath frame_path; 43 FramePath frame_path;
48 }; 44 };
49 45
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 Error* ExecuteScript(const FrameId& frame_id, 92 Error* ExecuteScript(const FrameId& frame_id,
97 const std::string& script, 93 const std::string& script,
98 const base::ListValue* const args, 94 const base::ListValue* const args,
99 base::Value** value); 95 base::Value** value);
100 96
101 // Same as above, but uses the currently targeted window and frame. 97 // Same as above, but uses the currently targeted window and frame.
102 Error* ExecuteScript(const std::string& script, 98 Error* ExecuteScript(const std::string& script,
103 const base::ListValue* const args, 99 const base::ListValue* const args,
104 base::Value** value); 100 base::Value** value);
105 101
102 // Executes the given script in the context of the given frame and parses
103 // the value with the given parser. The script should be in the form of an
104 // anonymous function. |script_name| is only used when creating error
105 // messages. This function takes ownership of |args| and |parser|.
106 Error* ExecuteScriptAndParse(const FrameId& frame_id,
107 const std::string& anonymous_func_script,
108 const std::string& script_name,
109 const base::ListValue* args,
110 const ValueParser* parser);
111
106 // Executes given |script| in the context of the given frame. 112 // Executes given |script| in the context of the given frame.
107 // The |script| should be in the form of a function body 113 // The |script| should be in the form of a function body
108 // (e.g. "return arguments[0]"), where |args| is the list of arguments to 114 // (e.g. "return arguments[0]"), where |args| is the list of arguments to
109 // pass to the function. The caller is responsible for the script result 115 // pass to the function. The caller is responsible for the script result
110 // |value|, which is set only if there is no error. 116 // |value|, which is set only if there is no error.
111 Error* ExecuteAsyncScript(const FrameId& frame_id, 117 Error* ExecuteAsyncScript(const FrameId& frame_id,
112 const std::string& script, 118 const std::string& script,
113 const base::ListValue* const args, 119 const base::ListValue* const args,
114 base::Value** value); 120 base::Value** value);
115 121
116 // Send the given keys to the given element dictionary. This function takes 122 // Send the given keys to the given element dictionary. This function takes
117 // ownership of |element|. 123 // ownership of |element|.
118 Error* SendKeys(const WebElementId& element, const string16& keys); 124 Error* SendKeys(const WebElementId& element, const string16& keys);
119 125
120 // Sets the file paths to the file upload control under the given location. 126 // Sets the file paths to the file upload control under the given location.
121 Error* DragAndDropFilePaths(const gfx::Point& location, 127 Error* DragAndDropFilePaths(const Point& location,
122 const std::vector<FilePath::StringType>& paths); 128 const std::vector<FilePath::StringType>& paths);
123 129
124 // Clicks the mouse at the given location using the given button. 130 // Clicks the mouse at the given location using the given button.
125 Error* MouseMoveAndClick(const gfx::Point& location, 131 Error* MouseMoveAndClick(const Point& location,
126 automation::MouseButton button); 132 automation::MouseButton button);
127 Error* MouseMove(const gfx::Point& location); 133 Error* MouseMove(const Point& location);
128 Error* MouseDrag(const gfx::Point& start, const gfx::Point& end); 134 Error* MouseDrag(const Point& start, const Point& end);
129 Error* MouseClick(automation::MouseButton button); 135 Error* MouseClick(automation::MouseButton button);
130 Error* MouseButtonDown(); 136 Error* MouseButtonDown();
131 Error* MouseButtonUp(); 137 Error* MouseButtonUp();
132 Error* MouseDoubleClick(); 138 Error* MouseDoubleClick();
133 139
134 Error* NavigateToURL(const std::string& url); 140 Error* NavigateToURL(const std::string& url);
135 Error* GoForward(); 141 Error* GoForward();
136 Error* GoBack(); 142 Error* GoBack();
137 Error* Reload(); 143 Error* Reload();
138 Error* GetURL(std::string* url); 144 Error* GetURL(std::string* url);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 Error* FindElements(const FrameId& frame_id, 213 Error* FindElements(const FrameId& frame_id,
208 const WebElementId& root_element, 214 const WebElementId& root_element,
209 const std::string& locator, 215 const std::string& locator,
210 const std::string& query, 216 const std::string& query,
211 std::vector<WebElementId>* elements); 217 std::vector<WebElementId>* elements);
212 218
213 // Scroll the element into view and get its location relative to 219 // Scroll the element into view and get its location relative to
214 // the client's viewport. 220 // the client's viewport.
215 Error* GetElementLocationInView( 221 Error* GetElementLocationInView(
216 const WebElementId& element, 222 const WebElementId& element,
217 gfx::Point* location); 223 Point* location);
218 224
219 // Scroll the element's region into view and get its location relative to 225 // Scroll the element's region into view and get its location relative to
220 // the client's viewport. If |center| is true, the element will be centered 226 // the client's viewport. If |center| is true, the element will be centered
221 // if it is too big to fit in view. If |verify_clickable_at_middle| is true, 227 // if it is too big to fit in view. If |verify_clickable_at_middle| is true,
222 // an error will be returned if the element is not clickable in the middle 228 // an error will be returned if the element is not clickable in the middle
223 // of the given region. 229 // of the given region.
224 Error* GetElementRegionInView( 230 Error* GetElementRegionInView(
225 const WebElementId& element, 231 const WebElementId& element,
226 const gfx::Rect& region, 232 const Rect& region,
227 bool center, 233 bool center,
228 bool verify_clickable_at_middle, 234 bool verify_clickable_at_middle,
229 gfx::Point* location); 235 Point* location);
230 236
231 // Gets the size of the element from the given window and frame, even if 237 // Gets the size of the element from the given window and frame, even if
232 // its display is none. 238 // its display is none.
233 Error* GetElementSize(const FrameId& frame_id, 239 Error* GetElementSize(const FrameId& frame_id,
234 const WebElementId& element, 240 const WebElementId& element,
235 gfx::Size* size); 241 Size* size);
236 242
237 // Gets the size of the element's first client rect. If the element has 243 // Gets the size of the element's first client rect. If the element has
238 // no client rects, this will return an error. 244 // no client rects, this will return an error.
239 Error* GetElementFirstClientRect(const FrameId& frame_id, 245 Error* GetElementFirstClientRect(const FrameId& frame_id,
240 const WebElementId& element, 246 const WebElementId& element,
241 gfx::Rect* rect); 247 Rect* rect);
242 248
243 // Gets the element's effective style for the given property. 249 // Gets the element's effective style for the given property.
244 Error* GetElementEffectiveStyle( 250 Error* GetElementEffectiveStyle(
245 const FrameId& frame_id, 251 const FrameId& frame_id,
246 const WebElementId& element, 252 const WebElementId& element,
247 const std::string& prop, 253 const std::string& prop,
248 std::string* value); 254 std::string* value);
249 255
250 // Gets the top and left element border widths for the given frame. 256 // Gets the top and left element border widths for the given frame.
251 Error* GetElementBorder(const FrameId& frame_id, 257 Error* GetElementBorder(const FrameId& frame_id,
(...skipping 30 matching lines...) Expand all
282 288
283 // Gets the tag name of the given element. 289 // Gets the tag name of the given element.
284 Error* GetElementTagName(const FrameId& frame_id, 290 Error* GetElementTagName(const FrameId& frame_id,
285 const WebElementId& element, 291 const WebElementId& element,
286 std::string* tag_name); 292 std::string* tag_name);
287 293
288 // Gets the clickable location of the given element. It will be the center 294 // Gets the clickable location of the given element. It will be the center
289 // location of the element. If the element is not clickable, or if the 295 // location of the element. If the element is not clickable, or if the
290 // location cannot be determined, an error will be returned. 296 // location cannot be determined, an error will be returned.
291 Error* GetClickableLocation(const WebElementId& element, 297 Error* GetClickableLocation(const WebElementId& element,
292 gfx::Point* location); 298 Point* location);
293 299
294 // Gets the attribute of the given element. If there are no errors, the 300 // Gets the attribute of the given element. If there are no errors, the
295 // function sets |value| and the caller takes ownership. 301 // function sets |value| and the caller takes ownership.
296 Error* GetAttribute(const WebElementId& element, const std::string& key, 302 Error* GetAttribute(const WebElementId& element, const std::string& key,
297 base::Value** value); 303 base::Value** value);
298 304
299 // Waits for all tabs to stop loading. Returns true on success. 305 // Waits for all tabs to stop loading. Returns true on success.
300 Error* WaitForAllTabsToStopLoading(); 306 Error* WaitForAllTabsToStopLoading();
301 307
302 // Install packed extension at |path|. 308 // Install packed extension at |path|.
303 Error* InstallExtension(const FilePath& path); 309 Error* InstallExtension(const FilePath& path);
304 310
305 const std::string& id() const; 311 const std::string& id() const;
306 312
307 const FrameId& current_target() const; 313 const FrameId& current_target() const;
308 314
309 void set_async_script_timeout(int timeout_ms); 315 void set_async_script_timeout(int timeout_ms);
310 int async_script_timeout() const; 316 int async_script_timeout() const;
311 317
312 void set_implicit_wait(int timeout_ms); 318 void set_implicit_wait(int timeout_ms);
313 int implicit_wait() const; 319 int implicit_wait() const;
314 320
315 const gfx::Point& get_mouse_position() const; 321 const Point& get_mouse_position() const;
316 322
317 const Options& options() const; 323 const Options& options() const;
318 324
319 // Gets the browser connection state. 325 // Gets the browser connection state.
320 Error* GetBrowserConnectionState(bool* online); 326 Error* GetBrowserConnectionState(bool* online);
321 327
322 // Gets the status of the application cache. 328 // Gets the status of the application cache.
323 Error* GetAppCacheStatus(int* status); 329 Error* GetAppCacheStatus(int* status);
324 330
325 private: 331 private:
326 void RunSessionTask(Task* task); 332 void RunSessionTask(Task* task);
327 void RunSessionTaskOnSessionThread( 333 void RunSessionTaskOnSessionThread(
328 Task* task, 334 Task* task,
329 base::WaitableEvent* done_event); 335 base::WaitableEvent* done_event);
330 void InitOnSessionThread(const Automation::BrowserOptions& options, 336 void InitOnSessionThread(const Automation::BrowserOptions& options,
331 Error** error); 337 Error** error);
332 void TerminateOnSessionThread(); 338 void TerminateOnSessionThread();
333 339
334 // Executes the given |script| in the context of the given frame. 340 // Executes the given |script| in the context of the given frame.
335 // Waits for script to finish and parses the response. 341 // Waits for script to finish and parses the response.
336 // The caller is responsible for the script result |value|. 342 // The caller is responsible for the script result |value|.
337 Error* ExecuteScriptAndParseResponse(const FrameId& frame_id, 343 Error* ExecuteScriptAndParseValue(const FrameId& frame_id,
338 const std::string& script, 344 const std::string& script,
339 base::Value** value); 345 base::Value** value);
340 346
341 void SendKeysOnSessionThread(const string16& keys, Error** error); 347 void SendKeysOnSessionThread(const string16& keys, Error** error);
342 Error* SwitchToFrameWithJavaScriptLocatedFrame( 348 Error* SwitchToFrameWithJavaScriptLocatedFrame(
343 const std::string& script, 349 const std::string& script,
344 base::ListValue* args); 350 base::ListValue* args);
345 Error* FindElementsHelper(const FrameId& frame_id, 351 Error* FindElementsHelper(const FrameId& frame_id,
346 const WebElementId& root_element, 352 const WebElementId& root_element,
347 const std::string& locator, 353 const std::string& locator,
348 const std::string& query, 354 const std::string& query,
349 bool find_one, 355 bool find_one,
350 std::vector<WebElementId>* elements); 356 std::vector<WebElementId>* elements);
357 Error* ExecuteFindElementScriptAndParse(const FrameId& frame_id,
358 const WebElementId& root_element,
359 const std::string& locator,
360 const std::string& query,
361 bool find_one,
362 std::vector<WebElementId>* elements);
351 // Returns an error if the element is not clickable. 363 // Returns an error if the element is not clickable.
352 Error* VerifyElementIsClickable( 364 Error* VerifyElementIsClickable(
353 const FrameId& frame_id, 365 const FrameId& frame_id,
354 const WebElementId& element, 366 const WebElementId& element,
355 const gfx::Point& location); 367 const Point& location);
356 Error* GetElementRegionInViewHelper( 368 Error* GetElementRegionInViewHelper(
357 const FrameId& frame_id, 369 const FrameId& frame_id,
358 const WebElementId& element, 370 const WebElementId& element,
359 const gfx::Rect& region, 371 const Rect& region,
360 bool center, 372 bool center,
361 bool verify_clickable_at_middle, 373 bool verify_clickable_at_middle,
362 gfx::Point* location); 374 Point* location);
363 375
364 const std::string id_; 376 const std::string id_;
365 FrameId current_target_; 377 FrameId current_target_;
366 378
367 scoped_ptr<Automation> automation_; 379 scoped_ptr<Automation> automation_;
368 base::Thread thread_; 380 base::Thread thread_;
369 381
370 // Timeout (in ms) for asynchronous script execution. 382 // Timeout (in ms) for asynchronous script execution.
371 int async_script_timeout_; 383 int async_script_timeout_;
372 384
373 // Time (in ms) of how long to wait while searching for a single element. 385 // Time (in ms) of how long to wait while searching for a single element.
374 int implicit_wait_; 386 int implicit_wait_;
375 387
376 // Vector of the |WebElementId|s for each frame of the current target frame 388 // Vector of the |WebElementId|s for each frame of the current target frame
377 // path. The first refers to the first frame element in the root document. 389 // path. The first refers to the first frame element in the root document.
378 // If the target frame is window.top, this will be empty. 390 // If the target frame is window.top, this will be empty.
379 std::vector<WebElementId> frame_elements_; 391 std::vector<WebElementId> frame_elements_;
380 392
381 // Last mouse position. Advanced APIs need this value. 393 // Last mouse position. Advanced APIs need this value.
382 gfx::Point mouse_position_; 394 Point mouse_position_;
383 395
384 // Chrome does not have an individual method for setting the prompt text 396 // Chrome does not have an individual method for setting the prompt text
385 // of an alert. Instead, when the WebDriver client wants to set the text, 397 // of an alert. Instead, when the WebDriver client wants to set the text,
386 // we store it here and pass the text when the alert is accepted or 398 // we store it here and pass the text when the alert is accepted or
387 // dismissed. This text should only be used if |has_alert_prompt_text_| 399 // dismissed. This text should only be used if |has_alert_prompt_text_|
388 // is true, so that the default prompt text is not overridden. 400 // is true, so that the default prompt text is not overridden.
389 std::string alert_prompt_text_; 401 std::string alert_prompt_text_;
390 bool has_alert_prompt_text_; 402 bool has_alert_prompt_text_;
391 403
392 Options options_; 404 Options options_;
393 405
394 DISALLOW_COPY_AND_ASSIGN(Session); 406 DISALLOW_COPY_AND_ASSIGN(Session);
395 }; 407 };
396 408
397 } // namespace webdriver 409 } // namespace webdriver
398 410
399 DISABLE_RUNNABLE_METHOD_REFCOUNT(webdriver::Session); 411 DISABLE_RUNNABLE_METHOD_REFCOUNT(webdriver::Session);
400 412
401 #endif // CHROME_TEST_WEBDRIVER_SESSION_H_ 413 #endif // CHROME_TEST_WEBDRIVER_SESSION_H_
OLDNEW
« no previous file with comments | « chrome/test/webdriver/server.cc ('k') | chrome/test/webdriver/session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698