1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_TEST_AUTOMATION_AUTOMATION_JSON_REQUESTS_H_ 6#define CHROME_TEST_AUTOMATION_AUTOMATION_JSON_REQUESTS_H_ 7 8#include <string> 9#include <vector> 10 11#include "base/compiler_specific.h" 12#include "base/files/file_path.h" 13#include "base/memory/scoped_ptr.h" 14#include "base/strings/string_number_conversions.h" 15#include "chrome/common/automation_constants.h" 16#include "chrome/common/automation_id.h" 17#include "ui/base/keycodes/keyboard_codes.h" 18 19class AutomationMessageSender; 20 21namespace base { 22class DictionaryValue; 23class FilePath; 24class ListValue; 25class Value; 26} 27 28struct WebKeyEvent { 29 WebKeyEvent(automation::KeyEventTypes type, 30 ui::KeyboardCode key_code, 31 const std::string& unmodified_text, 32 const std::string& modified_text, 33 int modifiers); 34 35 automation::KeyEventTypes type; 36 ui::KeyboardCode key_code; 37 std::string unmodified_text; 38 std::string modified_text; 39 int modifiers; 40}; 41 42struct WebMouseEvent { 43 WebMouseEvent(automation::MouseEventType type, 44 automation::MouseButton button, 45 int x, 46 int y, 47 int click_count, 48 int modifiers); 49 50 automation::MouseEventType type; 51 automation::MouseButton button; 52 int x; 53 int y; 54 int click_count; 55 int modifiers; 56}; 57 58// Uniquely identifies a particular WebView. 59// This is needed because Chrome used to accept just tab IDs, while 60// now it accepts IDs for other types of WebViews. 61// TOOD(kkania): Remove this abstraction once Chrome 16 is unsupported. 62class WebViewId { 63 public: 64 // Creates an ID for the given view ID. 65 static WebViewId ForView(const AutomationId& view_id); 66 67 // Creates an ID for the given tab ID. 68 static WebViewId ForOldStyleTab(int tab_id); 69 70 // Creates an invalid ID. 71 WebViewId(); 72 73 // Updates the given dictionary to include this ID. If the ID refers to a 74 // view ID, |view_id_key| will be the key modified in the dictionary. 75 void UpdateDictionary(base::DictionaryValue* dictionary, 76 const std::string& view_id_key) const; 77 78 // Returns whether this ID is valid. Even if it is valid, the object it 79 // refers to may not exist. 80 bool IsValid() const; 81 82 // Returns an |AutomationId| made from this ID. 83 AutomationId GetId() const; 84 85 // Returns whether this ID refers to a tab. 86 bool IsTab() const; 87 88 int tab_id() const; 89 90 // The old style is to use a single integer ID for a tab. The new style is 91 // to use an automation ID which may refer to a number of different object 92 // types. 93 bool old_style() const; 94 95 private: 96 // Whether this ID is an old-style integer tab ID. 97 bool old_style_; 98 99 AutomationId id_; 100 int tab_id_; 101}; 102 103// Used to locate a WebView. The same locator may locate different WebViews 104// at different times. This is needed because Chrome used to only accept 105// browser/tab indices, while the new Chrome accepts a unique ID. 106// TOOD(kkania): Simplify this once Chrome 16 is unsupported. 107class WebViewLocator { 108 public: 109 // Creates a locator for locating the given tab. 110 static WebViewLocator ForIndexPair(int browser_index, int tab_index); 111 112 // Creates a locator for locating the given view. 113 static WebViewLocator ForViewId(const AutomationId& view_id); 114 115 // Creates an invalid locator. 116 WebViewLocator(); 117 ~WebViewLocator(); 118 119 // Updates the given dictionary to include the given locator information. 120 // If this locator is a view ID, |view_id_key| will be the name of the key 121 // to update. 122 void UpdateDictionary(base::DictionaryValue* dict, 123 const std::string& view_id_key) const; 124 125 int browser_index() const; 126 int tab_index() const; 127 128 private: 129 enum Type { 130 kTypeIndexPair, 131 kTypeViewId, 132 }; 133 134 struct IndexPair { 135 int browser_index; 136 int tab_index; 137 }; 138 139 struct Locator { 140 Locator(); 141 ~Locator(); 142 143 IndexPair index_pair; 144 AutomationId view_id; 145 }; 146 147 Type type_; 148 Locator locator_; 149}; 150 151// Collection of info about a given WebView. 152struct WebViewInfo { 153 WebViewInfo(const WebViewId& view_id, 154 const std::string& extension_id); 155 ~WebViewInfo(); 156 157 // The view's unique ID. 158 WebViewId view_id; 159 160 // If this view belongs to an extension, this ID will be set to it. 161 std::string extension_id; 162}; 163 164// Sends a JSON request to the chrome automation provider. Returns true 165// if the JSON request was successfully sent and the reply was received. 166// If true, |success| will be set to whether the JSON request was 167// completed successfully by the automation provider. 168bool SendAutomationJSONRequest(AutomationMessageSender* sender, 169 const std::string& request, 170 int timeout_ms, 171 std::string* reply, 172 bool* success) WARN_UNUSED_RESULT; 173 174// Same as above, but uses the given |AutomationMessageSender|'s default timeout 175// value. 176bool SendAutomationJSONRequestWithDefaultTimeout( 177 AutomationMessageSender* sender, 178 const std::string& request, 179 std::string* reply, 180 bool* success); 181 182// Requests the current browser and tab indices for the given tab ID. 183// Returns true on success. 184bool SendGetIndicesFromTabIdJSONRequest( 185 AutomationMessageSender* sender, 186 int tab_id, 187 int* browser_index, 188 int* tab_index, 189 automation::Error* error) WARN_UNUSED_RESULT; 190 191// Requests the current browser and tab indices for the given |TabProxy| 192// handle. Returns true on success. 193bool SendGetIndicesFromTabHandleJSONRequest( 194 AutomationMessageSender* sender, 195 int tab_proxy_handle, 196 int* browser_index, 197 int* tab_index, 198 automation::Error* error) WARN_UNUSED_RESULT; 199 200// Requests to navigate to the given url and wait for the given number of 201// navigations to complete. Returns true on success. 202bool SendNavigateToURLJSONRequest( 203 AutomationMessageSender* sender, 204 const WebViewLocator& locator, 205 const std::string& url, 206 int navigation_count, 207 AutomationMsg_NavigationResponseValues* nav_response, 208 automation::Error* error) WARN_UNUSED_RESULT; 209 210// Requests the given javascript to be executed in the frame specified by the 211// given xpath. Returns true on success. If true, |result| will be reset to the 212// result of the execution. 213bool SendExecuteJavascriptJSONRequest( 214 AutomationMessageSender* sender, 215 const WebViewLocator& locator, 216 const std::string& frame_xpath, 217 const std::string& javascript, 218 scoped_ptr<base::Value>* result, 219 automation::Error* error) WARN_UNUSED_RESULT; 220 221// Requests the specified view to go forward. Waits for the load to complete. 222// Returns true on success. 223bool SendGoForwardJSONRequest( 224 AutomationMessageSender* sender, 225 const WebViewLocator& locator, 226 automation::Error* error) WARN_UNUSED_RESULT; 227 228// Requests the specified view to go back. Waits for the load to complete. 229// Returns true on success. 230bool SendGoBackJSONRequest( 231 AutomationMessageSender* sender, 232 const WebViewLocator& locator, 233 automation::Error* error) WARN_UNUSED_RESULT; 234 235// Requests the specified view to reload. Waits for the load to complete. 236// Returns true on success. 237bool SendReloadJSONRequest( 238 AutomationMessageSender* sender, 239 const WebViewLocator& locator, 240 automation::Error* error) WARN_UNUSED_RESULT; 241 242// Deprecated, no longer works with Chrome 29+. 243// Requests a snapshot of the entire page to be saved to the given path 244// in PNG format. 245// Returns true on success. 246bool SendCaptureEntirePageJSONRequestDeprecated( 247 AutomationMessageSender* sender, 248 const WebViewLocator& locator, 249 const base::FilePath& path, 250 automation::Error* error) WARN_UNUSED_RESULT; 251 252#if !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS)) 253// Deprecated, no longer works with Chrome 29+. 254// Requests a heap profile dump. 255// Returns true on success. 256bool SendHeapProfilerDumpJSONRequestDeprecated( 257 AutomationMessageSender* sender, 258 const WebViewLocator& locator, 259 const std::string& reason, 260 automation::Error* error) WARN_UNUSED_RESULT; 261#endif // !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS)) 262 263// Requests all the cookies for the given URL. On success returns true and 264// caller takes ownership of |cookies|, which is a list of all the cookies in 265// dictionary format. 266bool SendGetCookiesJSONRequest( 267 AutomationMessageSender* sender, 268 const std::string& url, 269 scoped_ptr<base::ListValue>* cookies, 270 automation::Error* error) WARN_UNUSED_RESULT; 271 272// Requests deletion of the cookie with the given name and URL. Returns true 273// on success. 274bool SendDeleteCookieJSONRequest( 275 AutomationMessageSender* sender, 276 const std::string& url, 277 const std::string& cookie_name, 278 automation::Error* error) WARN_UNUSED_RESULT; 279 280// Requests setting the given cookie for the given URL. Returns true on 281// success. The caller retains ownership of |cookie_dict|. 282bool SendSetCookieJSONRequest( 283 AutomationMessageSender* sender, 284 const std::string& url, 285 base::DictionaryValue* cookie_dict, 286 automation::Error* error) WARN_UNUSED_RESULT; 287 288// Requests the IDs for all open tabs. Returns true on success. 289bool SendGetTabIdsJSONRequest( 290 AutomationMessageSender* sender, 291 std::vector<WebViewInfo>* views, 292 automation::Error* error) WARN_UNUSED_RESULT; 293 294// Requests info for all open views. Returns true on success. 295bool SendGetWebViewsJSONRequest( 296 AutomationMessageSender* sender, 297 std::vector<WebViewInfo>* views, 298 automation::Error* error) WARN_UNUSED_RESULT; 299 300// Requests whether the given tab ID is valid. Returns true on success. 301bool SendIsTabIdValidJSONRequest( 302 AutomationMessageSender* sender, 303 const WebViewId& view_id, 304 bool* is_valid, 305 automation::Error* error) WARN_UNUSED_RESULT; 306 307// Requests whether the given automation ID refers to an actual automation 308// object. Returns true on success. 309bool SendDoesAutomationObjectExistJSONRequest( 310 AutomationMessageSender* sender, 311 const WebViewId& view_id, 312 bool* does_exist, 313 automation::Error* error) WARN_UNUSED_RESULT; 314 315// Requests to close the given view. Returns true on success. 316bool SendCloseViewJSONRequest( 317 AutomationMessageSender* sender, 318 const WebViewLocator& locator, 319 automation::Error* error) WARN_UNUSED_RESULT; 320 321// Requests to send the WebKit event for a mouse move to the given 322// coordinate in the specified view. Returns true on success. 323// Deprecated. TODO(kkania): Remove when chrome 17 is unsupported. 324bool SendMouseMoveJSONRequestDeprecated( 325 AutomationMessageSender* sender, 326 const WebViewLocator& locator, 327 int x, 328 int y, 329 automation::Error* error) WARN_UNUSED_RESULT; 330 331// Requests to send the WebKit events for a mouse click at the given 332// coordinate in the specified view. Returns true on success. 333// Deprecated. TODO(kkania): Remove when chrome 17 is unsupported. 334bool SendMouseClickJSONRequestDeprecated( 335 AutomationMessageSender* sender, 336 const WebViewLocator& locator, 337 automation::MouseButton button, 338 int x, 339 int y, 340 automation::Error* error) WARN_UNUSED_RESULT; 341 342// Requests to send the WebKit events for a mouse drag from the start to end 343// coordinates given in the specified view. Returns true on success. 344// Deprecated. TODO(kkania): Remove when chrome 17 is unsupported. 345bool SendMouseDragJSONRequestDeprecated( 346 AutomationMessageSender* sender, 347 const WebViewLocator& locator, 348 int start_x, 349 int start_y, 350 int end_x, 351 int end_y, 352 automation::Error* error) WARN_UNUSED_RESULT; 353 354// Requests to send the WebKit event for a mouse button down at the given 355// coordinate in the specified view. Returns true on success. 356// Deprecated. TODO(kkania): Remove when chrome 17 is unsupported. 357bool SendMouseButtonDownJSONRequestDeprecated( 358 AutomationMessageSender* sender, 359 const WebViewLocator& locator, 360 int x, 361 int y, 362 automation::Error* error) WARN_UNUSED_RESULT; 363 364// Requests to send the WebKit event for a mouse button up at the given 365// coordinate in the specified view. Returns true on success. 366// Deprecated. TODO(kkania): Remove when chrome 17 is unsupported. 367bool SendMouseButtonUpJSONRequestDeprecated( 368 AutomationMessageSender* sender, 369 const WebViewLocator& locator, 370 int x, 371 int y, 372 automation::Error* error) WARN_UNUSED_RESULT; 373 374// Requests to send the WebKit event for a mouse double click at the given 375// coordinate in the specified view. Returns true on success. 376// Deprecated. TODO(kkania): Remove when chrome 17 is unsupported. 377bool SendMouseDoubleClickJSONRequestDeprecated( 378 AutomationMessageSender* sender, 379 const WebViewLocator& locator, 380 int x, 381 int y, 382 automation::Error* error) WARN_UNUSED_RESULT; 383 384// Requests to send the WebKit event for the given |WebKeyEvent| in a 385// specified view. Returns true on success. 386bool SendWebKeyEventJSONRequest( 387 AutomationMessageSender* sender, 388 const WebViewLocator& locator, 389 const WebKeyEvent& key_event, 390 automation::Error* error) WARN_UNUSED_RESULT; 391 392// Requests to send the key event for the given keycode+modifiers to a 393// browser window containing the specified view. Returns true on success. 394bool SendNativeKeyEventJSONRequest( 395 AutomationMessageSender* sender, 396 const WebViewLocator& locator, 397 ui::KeyboardCode key_code, 398 int modifiers, 399 automation::Error* error) WARN_UNUSED_RESULT; 400 401// Deprecated, no longer works with Chrome 29+. 402// Requests to send the WebKit event for the given |WebMouseEvent| in a 403// specified view. Returns true on success. 404bool SendWebMouseEventJSONRequestDeprecated( 405 AutomationMessageSender* sender, 406 const WebViewLocator& locator, 407 const WebMouseEvent& mouse_event, 408 automation::Error* error) WARN_UNUSED_RESULT; 409 410// Requests to drag and drop the file paths at the given coordinate in the 411// specified view. Returns true on success. 412bool SendDragAndDropFilePathsJSONRequest( 413 AutomationMessageSender* sender, 414 const WebViewLocator& locator, 415 int x, 416 int y, 417 const std::vector<base::FilePath::StringType>& paths, 418 automation::Error* error) WARN_UNUSED_RESULT; 419 420// Requests to set the given view's bounds. Returns true on success. 421bool SendSetViewBoundsJSONRequest( 422 AutomationMessageSender* sender, 423 const WebViewId& id, 424 int x, 425 int y, 426 int width, 427 int height, 428 automation::Error* error) WARN_UNUSED_RESULT; 429 430// Requests to maximize the given view. Returns true on success. 431bool SendMaximizeJSONRequest( 432 AutomationMessageSender* sender, 433 const WebViewId& id, 434 automation::Error* error) WARN_UNUSED_RESULT; 435 436// Requests to get the active JavaScript modal dialog's message. Returns true 437// on success. 438bool SendGetAppModalDialogMessageJSONRequest( 439 AutomationMessageSender* sender, 440 std::string* message, 441 automation::Error* error) WARN_UNUSED_RESULT; 442 443// Requests to accept or dismiss the active JavaScript modal dialog. 444// Returns true on success. 445bool SendAcceptOrDismissAppModalDialogJSONRequest( 446 AutomationMessageSender* sender, 447 bool accept, 448 automation::Error* error) WARN_UNUSED_RESULT; 449 450// Requests to accept the active JavaScript modal dialog with the given prompt 451// text. Returns true on success. 452bool SendAcceptPromptAppModalDialogJSONRequest( 453 AutomationMessageSender* sender, 454 const std::string& prompt_text, 455 automation::Error* error) WARN_UNUSED_RESULT; 456 457// Deprecated, no longer works with Chrome 29+. 458// Requests to wait for all views to stop loading. Returns true on success. 459bool SendWaitForAllViewsToStopLoadingJSONRequestDeprecated( 460 AutomationMessageSender* sender, 461 automation::Error* error) WARN_UNUSED_RESULT; 462 463// Requests the version of ChromeDriver automation supported by the automation 464// server. Returns true on success. 465bool SendGetChromeDriverAutomationVersion( 466 AutomationMessageSender* sender, 467 int* version, 468 automation::Error* error) WARN_UNUSED_RESULT; 469 470// Requests that the given extension be installed. If |with_ui| is false, 471// the extension will be installed silently. Returns true on success. 472bool SendInstallExtensionJSONRequest( 473 AutomationMessageSender* sender, 474 const base::FilePath& path, 475 bool with_ui, 476 std::string* extension_id, 477 automation::Error* error) WARN_UNUSED_RESULT; 478 479// Requests info about all installed extensions. Returns true on success. 480bool SendGetExtensionsInfoJSONRequest( 481 AutomationMessageSender* sender, 482 base::ListValue* extensions_list, 483 automation::Error* error) WARN_UNUSED_RESULT; 484 485// Requests whether the given extension's page action is visible in the 486// given tab. 487bool SendIsPageActionVisibleJSONRequest( 488 AutomationMessageSender* sender, 489 const WebViewId& tab_id, 490 const std::string& extension_id, 491 bool* is_visible, 492 automation::Error* error) WARN_UNUSED_RESULT; 493 494// Requests a modification of the given extension state. Returns true on 495// success. 496bool SendSetExtensionStateJSONRequest( 497 AutomationMessageSender* sender, 498 const std::string& extension_id, 499 bool enable, 500 bool allow_in_incognito, 501 automation::Error* error) WARN_UNUSED_RESULT; 502 503// Requests the given extension's action button be pressed. Returns true on 504// success. 505bool SendClickExtensionButtonJSONRequest( 506 AutomationMessageSender* sender, 507 const std::string& extension_id, 508 bool browser_action, 509 automation::Error* error) WARN_UNUSED_RESULT; 510 511// Requests the given extension be uninstalled. Returns true on success. 512bool SendUninstallExtensionJSONRequest( 513 AutomationMessageSender* sender, 514 const std::string& extension_id, 515 automation::Error* error) WARN_UNUSED_RESULT; 516 517// Requests the local state preference to be set to the given value. 518// Ownership of |value| is taken by this function. Returns true on success. 519bool SendSetLocalStatePreferenceJSONRequest( 520 AutomationMessageSender* sender, 521 const std::string& pref, 522 base::Value* value, 523 automation::Error* error) WARN_UNUSED_RESULT; 524 525// Requests the user preference to be set to the given value. 526// Ownership of |value| is taken by this function. Returns true on success. 527bool SendSetPreferenceJSONRequest( 528 AutomationMessageSender* sender, 529 const std::string& pref, 530 base::Value* value, 531 automation::Error* error) WARN_UNUSED_RESULT; 532 533// Requests to override the user's geolocation. Returns true on success. 534bool SendOverrideGeolocationJSONRequest( 535 AutomationMessageSender* sender, 536 const base::DictionaryValue* geolocation, 537 automation::Error* error) WARN_UNUSED_RESULT; 538 539#endif // CHROME_TEST_AUTOMATION_AUTOMATION_JSON_REQUESTS_H_ 540