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
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_AUTOMATION_TESTING_AUTOMATION_PROVIDER_H_
6#define CHROME_BROWSER_AUTOMATION_TESTING_AUTOMATION_PROVIDER_H_
7#pragma once
8
9#include <string>
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "base/memory/scoped_ptr.h"
14#include "chrome/browser/automation/automation_provider.h"
15#include "chrome/browser/automation/automation_provider_json.h"
16#include "chrome/browser/history/history.h"
17#include "chrome/browser/importer/importer_list.h"
18#include "chrome/browser/sync/profile_sync_service_harness.h"
19#include "chrome/browser/ui/browser_list.h"
20#include "content/common/notification_registrar.h"
21#include "content/common/page_type.h"
22
23class DictionaryValue;
24class TemplateURLModel;
25
26// This is an automation provider containing testing calls.
27class TestingAutomationProvider : public AutomationProvider,
28                                  public BrowserList::Observer,
29                                  public ImporterList::Observer,
30                                  public NotificationObserver {
31 public:
32  explicit TestingAutomationProvider(Profile* profile);
33
34  // IPC::Channel::Listener:
35  virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
36  virtual void OnChannelError() OVERRIDE;
37
38 private:
39  class PopupMenuWaiter;
40
41  // Storage for ImportSettings() to resume operations after a callback.
42  struct ImportSettingsData {
43    string16 browser_name;
44    int import_items;
45    bool first_run;
46    Browser* browser;
47    IPC::Message* reply_message;
48  };
49
50  virtual ~TestingAutomationProvider();
51
52  // BrowserList::Observer:
53  virtual void OnBrowserAdded(const Browser* browser) OVERRIDE;
54  virtual void OnBrowserRemoved(const Browser* browser) OVERRIDE;
55
56  // ImporterList::Observer:
57  virtual void OnSourceProfilesLoaded() OVERRIDE;
58
59  // NotificationObserver:
60  virtual void Observe(NotificationType type,
61                       const NotificationSource& source,
62                       const NotificationDetails& details) OVERRIDE;
63
64  // IPC Message callbacks.
65  void CloseBrowser(int handle, IPC::Message* reply_message);
66  void CloseBrowserAsync(int browser_handle);
67  void ActivateTab(int handle, int at_index, int* status);
68  void AppendTab(int handle, const GURL& url, IPC::Message* reply_message);
69  void GetActiveTabIndex(int handle, int* active_tab_index);
70  void CloseTab(int tab_handle, bool wait_until_closed,
71                IPC::Message* reply_message);
72  void GetCookies(const GURL& url, int handle, int* value_size,
73                  std::string* value);
74  void SetCookie(const GURL& url,
75                 const std::string& value,
76                 int handle,
77                 int* response_value);
78  void DeleteCookie(const GURL& url, const std::string& cookie_name,
79                    int handle, bool* success);
80  void ShowCollectedCookiesDialog(int handle, bool* success);
81  void NavigateToURLBlockUntilNavigationsComplete(int handle, const GURL& url,
82                                                  int number_of_navigations,
83                                                  IPC::Message* reply_message);
84  void NavigationAsync(int handle, const GURL& url, bool* status);
85  void NavigationAsyncWithDisposition(int handle,
86                                      const GURL& url,
87                                      WindowOpenDisposition disposition,
88                                      bool* status);
89  void Reload(int handle, IPC::Message* reply_message);
90  void SetAuth(int tab_handle, const std::wstring& username,
91               const std::wstring& password, IPC::Message* reply_message);
92  void CancelAuth(int tab_handle, IPC::Message* reply_message);
93  void NeedsAuth(int tab_handle, bool* needs_auth);
94  void GetRedirectsFrom(int tab_handle,
95                        const GURL& source_url,
96                        IPC::Message* reply_message);
97  void GetBrowserWindowCount(int* window_count);
98  void GetNormalBrowserWindowCount(int* window_count);
99  // Be aware that the browser window returned might be of non TYPE_NORMAL
100  // or in incognito mode.
101  void GetBrowserWindow(int index, int* handle);
102  void FindNormalBrowserWindow(int* handle);
103  void GetLastActiveBrowserWindow(int* handle);
104  void GetActiveWindow(int* handle);
105  void ExecuteBrowserCommandAsync(int handle, int command, bool* success);
106  void ExecuteBrowserCommand(int handle, int command,
107                             IPC::Message* reply_message);
108  void GetBrowserLocale(string16* locale);
109  void IsWindowActive(int handle, bool* success, bool* is_active);
110  void ActivateWindow(int handle);
111  void IsWindowMaximized(int handle, bool* is_maximized, bool* success);
112  void TerminateSession(int handle, bool* success);
113  void WindowGetViewBounds(int handle, int view_id, bool screen_coordinates,
114                           bool* success, gfx::Rect* bounds);
115  void GetWindowBounds(int handle, gfx::Rect* bounds, bool* result);
116  void SetWindowBounds(int handle, const gfx::Rect& bounds, bool* result);
117  void SetWindowVisible(int handle, bool visible, bool* result);
118  void WindowSimulateClick(const IPC::Message& message,
119                           int handle,
120                           const gfx::Point& click,
121                           int flags);
122  void WindowSimulateMouseMove(const IPC::Message& message,
123                               int handle,
124                               const gfx::Point& location);
125  void WindowSimulateKeyPress(const IPC::Message& message,
126                              int handle,
127                              int key,
128                              int flags);
129  void GetTabCount(int handle, int* tab_count);
130  void GetType(int handle, int* type_as_int);
131  void GetTab(int win_handle, int tab_index, int* tab_handle);
132  void GetTabProcessID(int handle, int* process_id);
133  void GetTabTitle(int handle, int* title_string_size, std::wstring* title);
134  void GetTabIndex(int handle, int* tabstrip_index);
135  void GetTabURL(int handle, bool* success, GURL* url);
136  void GetShelfVisibility(int handle, bool* visible);
137  void IsFullscreen(int handle, bool* is_fullscreen);
138  void GetFullscreenBubbleVisibility(int handle, bool* is_visible);
139  void GetAutocompleteEditForBrowser(int browser_handle, bool* success,
140                                     int* autocomplete_edit_handle);
141
142  // Retrieves the visible text from the autocomplete edit.
143  void GetAutocompleteEditText(int autocomplete_edit_handle,
144                               bool* success, string16* text);
145
146  // Sets the visible text from the autocomplete edit.
147  void SetAutocompleteEditText(int autocomplete_edit_handle,
148                               const string16& text,
149                               bool* success);
150
151  // Retrieves if a query to an autocomplete provider is in progress.
152  void AutocompleteEditIsQueryInProgress(int autocomplete_edit_handle,
153                                         bool* success,
154                                         bool* query_in_progress);
155
156  // Retrieves the individual autocomplete matches displayed by the popup.
157  void AutocompleteEditGetMatches(int autocomplete_edit_handle,
158                                  bool* success,
159                                  std::vector<AutocompleteMatchData>* matches);
160
161  // Waits for the autocomplete edit to receive focus
162  void WaitForAutocompleteEditFocus(int autocomplete_edit_handle,
163                                    IPC::Message* reply_message);
164
165  void ExecuteJavascript(int handle,
166                         const std::wstring& frame_xpath,
167                         const std::wstring& script,
168                         IPC::Message* reply_message);
169
170  void GetConstrainedWindowCount(int handle, int* count);
171
172#if defined(TOOLKIT_VIEWS)
173  void GetFocusedViewID(int handle, int* view_id);
174
175  // Block until the focused view ID changes to something other than
176  // previous_view_id.
177  void WaitForFocusedViewIDToChange(int handle,
178                                    int previous_view_id,
179                                    IPC::Message* reply_message);
180
181  // Start tracking popup menus. Must be called before executing the
182  // command that might open the popup menu; then call WaitForPopupMenuToOpen.
183  void StartTrackingPopupMenus(int browser_handle, bool* success);
184
185  // Wait until a popup menu has opened.
186  void WaitForPopupMenuToOpen(IPC::Message* reply_message);
187#endif  // defined(TOOLKIT_VIEWS)
188
189  void HandleInspectElementRequest(int handle,
190                                   int x,
191                                   int y,
192                                   IPC::Message* reply_message);
193
194  void GetDownloadDirectory(int handle, FilePath* download_directory);
195
196  // If |show| is true, call Show() on the new window after creating it.
197  void OpenNewBrowserWindowOfType(int type,
198                                  bool show,
199                                  IPC::Message* reply_message);
200
201  // Retrieves a Browser from a Window and vice-versa.
202  void GetWindowForBrowser(int window_handle, bool* success, int* handle);
203  void GetBrowserForWindow(int window_handle, bool* success,
204                           int* browser_handle);
205
206  void ShowInterstitialPage(int tab_handle,
207                            const std::string& html_text,
208                            IPC::Message* reply_message);
209  void HideInterstitialPage(int tab_handle, bool* success);
210
211  void WaitForTabToBeRestored(int tab_handle, IPC::Message* reply_message);
212
213  // Gets the security state for the tab associated to the specified |handle|.
214  void GetSecurityState(int handle, bool* success,
215                        SecurityStyle* security_style, int* ssl_cert_status,
216                        int* insecure_content_status);
217
218  // Gets the page type for the tab associated to the specified |handle|.
219  void GetPageType(int handle, bool* success, PageType* page_type);
220
221  // Gets the duration in ms of the last event matching |event_name|.
222  // |duration_ms| is -1 if the event hasn't occurred yet.
223  void GetMetricEventDuration(const std::string& event_name, int* duration_ms);
224
225  // Simulates an action on the SSL blocking page at the tab specified by
226  // |handle|. If |proceed| is true, it is equivalent to the user pressing the
227  // 'Proceed' button, if false the 'Get me out of there button'.
228  // Not that this fails if the tab is not displaying a SSL blocking page.
229  void ActionOnSSLBlockingPage(int handle,
230                               bool proceed,
231                               IPC::Message* reply_message);
232
233  // Brings the browser window to the front and activates it.
234  void BringBrowserToFront(int browser_handle, bool* success);
235
236  // Checks to see if a command on the browser's CommandController is enabled.
237  void IsMenuCommandEnabled(int browser_handle,
238                            int message_num,
239                            bool* menu_item_enabled);
240
241  // Prints the current tab immediately.
242  void PrintNow(int tab_handle, IPC::Message* reply_message);
243
244  // Save the current web page.
245  void SavePage(int tab_handle,
246                const FilePath& file_name,
247                const FilePath& dir_path,
248                int type,
249                bool* success);
250
251  // Responds to requests to open the FindInPage window.
252  void HandleOpenFindInPageRequest(const IPC::Message& message,
253                                   int handle);
254
255  // Get the visibility state of the Find window.
256  void GetFindWindowVisibility(int handle, bool* visible);
257
258  // Responds to requests to find the location of the Find window.
259  void HandleFindWindowLocationRequest(int handle, int* x, int* y);
260
261  // Get the visibility state of the Bookmark bar.
262  void GetBookmarkBarVisibility(int handle, bool* visible, bool* animating);
263
264  // Get the bookmarks as a JSON string.
265  void GetBookmarksAsJSON(int handle, std::string* bookmarks_as_json,
266                          bool *success);
267
268  // Wait for the bookmark model to load.
269  void WaitForBookmarkModelToLoad(int handle, IPC::Message* reply_message);
270
271  // Set |loaded| to true if the bookmark model has loaded, else false.
272  void BookmarkModelHasLoaded(int handle, bool* loaded);
273
274  // Editing, modification, and removal of bookmarks.
275  // Bookmarks are referenced by id.
276  void AddBookmarkGroup(int handle,
277                        int64 parent_id, int index, std::wstring title,
278                        bool* success);
279  void AddBookmarkURL(int handle,
280                      int64 parent_id, int index,
281                      std::wstring title, const GURL& url,
282                      bool* success);
283  void ReparentBookmark(int handle,
284                        int64 id, int64 new_parent_id, int index,
285                        bool* success);
286  void SetBookmarkTitle(int handle,
287                        int64 id, std::wstring title,
288                        bool* success);
289  void SetBookmarkURL(int handle,
290                      int64 id, const GURL& url,
291                      bool* success);
292  void RemoveBookmark(int handle,
293                      int64 id,
294                      bool* success);
295
296  // Retrieves the number of info-bars currently showing in |count|.
297  void GetInfoBarCount(int handle, size_t* count);
298
299  // Causes a click on the "accept" button of the info-bar at |info_bar_index|.
300  // If |wait_for_navigation| is true, it sends the reply after a navigation has
301  // occurred.
302  void ClickInfoBarAccept(int handle,
303                          size_t info_bar_index,
304                          bool wait_for_navigation,
305                          IPC::Message* reply_message);
306
307  // Retrieves the last time a navigation occurred for the tab.
308  void GetLastNavigationTime(int handle, int64* last_navigation_time);
309
310  // Waits for a new navigation in the tab if none has happened since
311  // |last_navigation_time|.
312  void WaitForNavigation(int handle,
313                         int64 last_navigation_time,
314                         IPC::Message* reply_message);
315
316  // Sets the int value for preference with name |name|.
317  void SetIntPreference(int handle,
318                        const std::string& name,
319                        int value,
320                        bool* success);
321
322  // Sets the string value for preference with name |name|.
323  void SetStringPreference(int handle,
324                           const std::string& name,
325                           const std::string& value,
326                           bool* success);
327
328  // Gets the bool value for preference with name |name|.
329  void GetBooleanPreference(int handle,
330                            const std::string& name,
331                            bool* success,
332                            bool* value);
333
334  // Sets the bool value for preference with name |name|.
335  void SetBooleanPreference(int handle,
336                            const std::string& name,
337                            bool value,
338                            bool* success);
339
340  void GetShowingAppModalDialog(bool* showing_dialog, int* dialog_button);
341  void ClickAppModalDialogButton(int button, bool* success);
342
343  void WaitForBrowserWindowCountToBecome(int target_count,
344                                         IPC::Message* reply_message);
345
346  void WaitForAppModalDialogToBeShown(IPC::Message* reply_message);
347
348  void GoBackBlockUntilNavigationsComplete(int handle,
349                                           int number_of_navigations,
350                                           IPC::Message* reply_message);
351
352  void GoForwardBlockUntilNavigationsComplete(int handle,
353                                              int number_of_navigations,
354                                              IPC::Message* reply_message);
355
356  void SavePackageShouldPromptUser(bool should_prompt);
357
358  void GetWindowTitle(int handle, string16* text);
359
360  void SetShelfVisibility(int handle, bool visible);
361
362  // Returns the number of blocked popups in the tab |handle|.
363  void GetBlockedPopupCount(int handle, int* count);
364
365  // Generic pattern for pyautolib
366  // Uses the JSON interface for input/output.
367  void SendJSONRequest(int handle,
368                       const std::string& json_request,
369                       IPC::Message* reply_message);
370
371  // Method ptr for json handlers.
372  // Uses the JSON interface for input/output.
373  typedef void (TestingAutomationProvider::*JsonHandler)(DictionaryValue*,
374                                                         IPC::Message*);
375
376  // Method ptr for json handlers that take a browser argument.
377  // Uses the JSON interface for input/output.
378  typedef void (TestingAutomationProvider::*BrowserJsonHandler)(
379      Browser* browser,
380      DictionaryValue*,
381      IPC::Message*);
382
383    // Set window dimensions.
384  // Uses the JSON interface for input/output.
385  void SetWindowDimensions(Browser* browser,
386                           DictionaryValue* args,
387                           IPC::Message* reply_message);
388
389  // Get info about infobars in the given TabContents object.
390  // This includes info about the type of infobars, the message text,
391  // buttons, etc.
392  // Caller owns the returned object.
393  ListValue* GetInfobarsInfo(TabContents* tc);
394
395  // Perform actions on an infobar like dismiss, accept, cancel.
396  // Uses the JSON interface for input/output.
397  void PerformActionOnInfobar(Browser* browser,
398                              DictionaryValue* args,
399                              IPC::Message* reply_message);
400
401  // Get info about the chromium/chrome in use.
402  // This includes things like version, executable name, executable path.
403  // Uses the JSON interface for input/output.
404  void GetBrowserInfo(Browser* browser,
405                      DictionaryValue* args,
406                      IPC::Message* reply_message);
407
408  // Get info about the state of navigation in a given tab.
409  // This includes ssl info.
410  // Uses the JSON interface for input/output.
411  void GetNavigationInfo(Browser* browser,
412                         DictionaryValue* args,
413                         IPC::Message* reply_message);
414
415  // Get info about downloads. This includes only ones that have been
416  // registered by the history system.
417  // Uses the JSON interface for input/output.
418  void GetDownloadsInfo(Browser* browser,
419                        DictionaryValue* args,
420                        IPC::Message* reply_message);
421
422  // Wait for all downloads to complete.
423  // Uses the JSON interface for input/output.
424  void WaitForDownloadsToComplete(Browser* browser,
425                                  DictionaryValue* args,
426                                  IPC::Message* reply_message);
427
428  // Performs the given action on the specified download.
429  // Uses the JSON interface for input/output.
430  void PerformActionOnDownload(Browser* browser,
431                               DictionaryValue* args,
432                               IPC::Message* reply_message);
433
434  // Get info about history.
435  // Uses the JSON interface for input/output.
436  void GetHistoryInfo(Browser* browser,
437                      DictionaryValue* args,
438                      IPC::Message* reply_message);
439
440  // Add an item to the history service.
441  // Uses the JSON interface for input/output.
442  void AddHistoryItem(Browser* browser,
443                      DictionaryValue* args,
444                      IPC::Message* reply_message);
445
446  // Invoke loading of template url model.
447  // Uses the JSON interface for input/output.
448  void LoadSearchEngineInfo(Browser* browser,
449                            DictionaryValue* args,
450                            IPC::Message* reply_message);
451
452  // Get search engines list.
453  // Assumes that the profile's template url model is loaded.
454  // Uses the JSON interface for input/output.
455  void GetSearchEngineInfo(Browser* browser,
456                           DictionaryValue* args,
457                           IPC::Message* reply_message);
458
459  // Add or edit search engine.
460  // Assumes that the profile's template url model is loaded.
461  // Uses the JSON interface for input/output.
462  void AddOrEditSearchEngine(Browser* browser,
463                             DictionaryValue* args,
464                             IPC::Message* reply_message);
465
466  // Perform a given action on an existing search engine.
467  // Assumes that the profile's template url model is loaded.
468  // Uses the JSON interface for input/output.
469  void PerformActionOnSearchEngine(Browser* browser,
470                                   DictionaryValue* args,
471                                   IPC::Message* reply_message);
472
473  // Get info about preferences.
474  // Uses the JSON interface for input/output.
475  void GetPrefsInfo(Browser* browser,
476                    DictionaryValue* args,
477                    IPC::Message* reply_message);
478
479  // Set prefs.
480  // Uses the JSON interface for input/output.
481  void SetPrefs(Browser* browser,
482                DictionaryValue* args,
483                IPC::Message* reply_message);
484
485  // Return load times of initial tabs.
486  // Uses the JSON interface for input/output.
487  // Only includes tabs from command line arguments or session restore.
488  // See declaration of InitialLoadObserver in automation_provider_observers.h
489  // for example response.
490  void GetInitialLoadTimes(Browser* browser,
491                           DictionaryValue* args,
492                           IPC::Message* reply_message);
493
494  // Get info about plugins.
495  // Uses the JSON interface for input/output.
496  void GetPluginsInfo(Browser* browser,
497                      DictionaryValue* args,
498                      IPC::Message* reply_message);
499
500  // Enable a plugin.
501  // Uses the JSON interface for input/output.
502  void EnablePlugin(Browser* browser,
503                    DictionaryValue* args,
504                    IPC::Message* reply_message);
505
506  // Disable a plugin.
507  // Uses the JSON interface for input/output.
508  void DisablePlugin(Browser* browser,
509                     DictionaryValue* args,
510                     IPC::Message* reply_message);
511
512  // Get info about omnibox.
513  // Contains data about the matches (url, content, description)
514  // in the omnibox popup, the text in the omnibox.
515  // Uses the JSON interface for input/output.
516  void GetOmniboxInfo(Browser* browser,
517                      DictionaryValue* args,
518                      IPC::Message* reply_message);
519
520  // Set text in the omnibox. This sets focus to the omnibox.
521  // Uses the JSON interface for input/output.
522  void SetOmniboxText(Browser* browser,
523                      DictionaryValue* args,
524                      IPC::Message* reply_message);
525
526  // Move omnibox popup selection up or down.
527  // Uses the JSON interface for input/output.
528  void OmniboxMovePopupSelection(Browser* browser,
529                                 DictionaryValue* args,
530                                 IPC::Message* reply_message);
531
532  // Accept the current string of text in the omnibox.
533  // This is equivalent to clicking or hiting enter on a popup selection.
534  // Blocks until the page loads.
535  // Uses the JSON interface for input/output.
536  void OmniboxAcceptInput(Browser* browser,
537                          DictionaryValue* args,
538                          IPC::Message* reply_message);
539
540  // Generate dictionary info about instant tab.
541  // Uses the JSON interface for input/output.
542  void GetInstantInfo(Browser* browser,
543                      DictionaryValue* args,
544                      IPC::Message* reply_message);
545
546  // Save the contents of a tab into a file.
547  // Uses the JSON interface for input/output.
548  void SaveTabContents(Browser* browser,
549                       DictionaryValue* args,
550                       IPC::Message* reply_message);
551
552  // Import the given settings from the given browser.
553  // Uses the JSON interface for input/output.
554  void ImportSettings(Browser* browser,
555                      DictionaryValue* args,
556                      IPC::Message* reply_message);
557
558  // Add a new entry to the password store based on the password information
559  // provided. This method can also be used to add a blacklisted site (which
560  // will never fill in the password).
561  // Uses the JSON interface for input/output.
562  void AddSavedPassword(Browser* browser,
563                        DictionaryValue* args,
564                        IPC::Message* reply_message);
565
566  // Removes the password matching the information provided. This method can
567  // also be used to remove a blacklisted site.
568  // Uses the JSON interface for input/output.
569  void RemoveSavedPassword(Browser* browser,
570                           DictionaryValue* args,
571                           IPC::Message* reply_message);
572
573  // Return the saved username/password combinations.
574  // Uses the JSON interface for input/output.
575  void GetSavedPasswords(Browser* browser,
576                         DictionaryValue* args,
577                         IPC::Message* reply_message);
578
579  // Clear the specified browsing data. This call provides similar
580  // functionality to RemoveBrowsingData but is synchronous.
581  // Uses the JSON interface for input/output.
582  void ClearBrowsingData(Browser* browser,
583                         DictionaryValue* args,
584                         IPC::Message* reply_message);
585
586  // Get info about blocked popups in a tab.
587  // Uses the JSON interface for input/output.
588  void GetBlockedPopupsInfo(Browser* browser,
589                            DictionaryValue* args,
590                            IPC::Message* reply_message);
591
592  // Launch a blocked popup.
593  // Uses the JSON interface for input/output.
594  void UnblockAndLaunchBlockedPopup(Browser* browser,
595                                    DictionaryValue* args,
596                                    IPC::Message* reply_message);
597
598  // Get info about theme.
599  // Uses the JSON interface for input/output.
600  void GetThemeInfo(Browser* browser,
601                    DictionaryValue* args,
602                    IPC::Message* reply_message);
603
604  // Get info about all intalled extensions.
605  // Uses the JSON interface for input/output.
606  void GetExtensionsInfo(Browser* browser,
607                         DictionaryValue* args,
608                         IPC::Message* reply_message);
609
610  // Uninstalls the extension with the given id.
611  // Uses the JSON interface for input/output.
612  void UninstallExtensionById(Browser* browser,
613                              DictionaryValue* args,
614                              IPC::Message* reply_message);
615
616  // Responds to the Find request and returns the match count.
617  void FindInPage(Browser* browser,
618                  DictionaryValue* args,
619                  IPC::Message* reply_message);
620
621  // Returns information about translation for a given tab. Includes
622  // information about the translate bar if it is showing.
623  void GetTranslateInfo(Browser* browser,
624                        DictionaryValue* args,
625                        IPC::Message* reply_message);
626
627  // Takes the specified action on the translate bar.
628  // Uses the JSON interface for input/output.
629  void SelectTranslateOption(Browser* browser,
630                             DictionaryValue* args,
631                             IPC::Message* reply_message);
632
633  // Get the profiles that are currently saved to the DB.
634  // Uses the JSON interface for input/output.
635  void GetAutofillProfile(Browser* browser,
636                          DictionaryValue* args,
637                          IPC::Message* reply_message);
638
639  // Fill in an AutofillProfile with the given profile information.
640  // Uses the JSON interface for input/output.
641  void FillAutofillProfile(Browser* browser,
642                           DictionaryValue* args,
643                           IPC::Message* reply_message);
644
645  // Signs in to sync using the given username and password.
646  // Uses the JSON interface for input/output.
647  void SignInToSync(Browser* browser,
648                    DictionaryValue* args,
649                    IPC::Message* reply_message);
650
651  // Returns info about sync.
652  // Uses the JSON interface for input/output.
653  void GetSyncInfo(Browser* browser,
654                   DictionaryValue* args,
655                   IPC::Message* reply_message);
656
657  // Waits for the ongoing sync cycle to complete.
658  // Uses the JSON interface for input/output.
659  void AwaitSyncCycleCompletion(Browser* browser,
660                                DictionaryValue* args,
661                                IPC::Message* reply_message);
662
663  // Enables sync for one or more sync datatypes.
664  // Uses the JSON interface for input/output.
665  void EnableSyncForDatatypes(Browser* browser,
666                              DictionaryValue* args,
667                              IPC::Message* reply_message);
668
669  // Disables sync for one or more sync datatypes.
670  // Uses the JSON interface for input/output.
671  void DisableSyncForDatatypes(Browser* browser,
672                               DictionaryValue* args,
673                               IPC::Message* reply_message);
674
675  // Translate DictionaryValues of autofill profiles and credit cards to the
676  // data structure used in the browser.
677  // Args:
678  //   profiles/cards: the ListValue of profiles/credit cards to translate.
679  //   error_message: a pointer to the return string in case of error.
680  static std::vector<AutofillProfile> GetAutofillProfilesFromList(
681      const ListValue& profiles, std::string* error_message);
682  static std::vector<CreditCard> GetCreditCardsFromList(
683      const ListValue& cards, std::string* error_message);
684
685  // The opposite of the above: translates from the internal data structure
686  // for profiles and credit cards to a ListValue of DictionaryValues. The
687  // caller owns the returned object.
688  static ListValue* GetListFromAutofillProfiles(
689      const std::vector<AutofillProfile*>& autofill_profiles);
690  static ListValue* GetListFromCreditCards(
691      const std::vector<CreditCard*>& credit_cards);
692
693  // Return the map from the internal data representation to the string value
694  // of auto fill fields and credit card fields.
695  static std::map<AutofillFieldType, std::string>
696      GetAutofillFieldToStringMap();
697  static std::map<AutofillFieldType, std::string>
698      GetCreditCardFieldToStringMap();
699
700  // Get a list of active HTML5 notifications.
701  // Uses the JSON interface for input/output.
702  void GetActiveNotifications(Browser* browser,
703                              DictionaryValue* args,
704                              IPC::Message* reply_message);
705
706  // Close an active HTML5 notification.
707  // Uses the JSON interface for input/output.
708  void CloseNotification(Browser* browser,
709                         DictionaryValue* args,
710                         IPC::Message* reply_message);
711
712  // Waits for the number of active HTML5 notifications to reach a given count.
713  // Uses the JSON interface for input/output.
714  void WaitForNotificationCount(Browser* browser,
715                                DictionaryValue* args,
716                                IPC::Message* reply_message);
717
718  // Gets info about the elements in the NTP.
719  // Uses the JSON interface for input/output.
720  void GetNTPInfo(Browser* browser,
721                  DictionaryValue* args,
722                  IPC::Message* reply_message);
723
724  // Moves a thumbnail in the NTP's Most Visited sites section to a different
725  // index.
726  // Uses the JSON interface for input/output.
727  void MoveNTPMostVisitedThumbnail(Browser* browser,
728                                   DictionaryValue* args,
729                                   IPC::Message* reply_message);
730
731  // Removes a thumbnail from the NTP's Most Visited sites section.
732  // Uses the JSON interface for input/output.
733  void RemoveNTPMostVisitedThumbnail(Browser* browser,
734                                     DictionaryValue* args,
735                                     IPC::Message* reply_message);
736
737  // Unpins a thumbnail in the NTP's Most Visited sites section.
738  // Uses the JSON interface for input/output.
739  void UnpinNTPMostVisitedThumbnail(Browser* browser,
740                                    DictionaryValue* args,
741                                    IPC::Message* reply_message);
742
743  // Restores all thumbnails that have been removed (i.e., blacklisted) from the
744  // NTP's Most Visited sites section.
745  // Uses the JSON interface for input/output.
746  void RestoreAllNTPMostVisitedThumbnails(Browser* browser,
747                                          DictionaryValue* args,
748                                          IPC::Message* reply_message);
749
750  // Kills the given renderer process and returns after the associated
751  // RenderProcessHost receives notification of its closing.
752  void KillRendererProcess(Browser* browser,
753                           DictionaryValue* args,
754                           IPC::Message* reply_message);
755
756  // Populates the fields of the event parameters with what is found
757  // on the args one. If fails return false and puts the error message in
758  // the error parameter, else returns true.
759  bool BuildWebKeyEventFromArgs(DictionaryValue* args,
760                                std::string* error,
761                                NativeWebKeyboardEvent* event);
762
763  // Determines whether each relevant section of the NTP is in thumbnail mode.
764  void GetNTPThumbnailMode(Browser* browser,
765                           DictionaryValue* args,
766                           IPC::Message* reply_message);
767
768  // Puts or removes the specified section of the NTP into/from thumbnail mode.
769  // If the section is put into thumbnail mode, all other relevant sections are
770  // removed from thumbnail mode.
771  void SetNTPThumbnailMode(Browser* browser,
772                           DictionaryValue* args,
773                           IPC::Message* reply_message);
774
775  // Determines whether each relevant section of the NTP is in menu mode.
776  void GetNTPMenuMode(Browser* browser,
777                      DictionaryValue* args,
778                      IPC::Message* reply_message);
779
780  // Puts or removes the specified section of the NTP into/from menu mode.
781  void SetNTPMenuMode(Browser* browser,
782                      DictionaryValue* args,
783                      IPC::Message* reply_message);
784
785  // Launches the specified app from the currently-selected tab.
786  void LaunchApp(Browser* browser,
787                 DictionaryValue* args,
788                 IPC::Message* reply_message);
789
790  // Sets the launch type for the specified app.
791  void SetAppLaunchType(Browser* browser,
792                        DictionaryValue* args,
793                        IPC::Message* reply_message);
794
795  // Waits for all tabs to stop loading.
796  void WaitForAllTabsToStopLoading(DictionaryValue* args,
797                                   IPC::Message* reply_message);
798
799  // Gets the browser and tab index of the given tab. Uses the JSON interface.
800  // Either "tab_id" or "tab_handle" must be specified, but not both. "tab_id"
801  // refers to the ID from the |NavigationController|, while "tab_handle" is
802  // the handle number assigned by the automation system.
803  // Example:
804  //   input: { "tab_id": 1,     // optional
805  //            "tab_handle": 3  // optional
806  //          }
807  //   output: { "windex": 1, "tab_index": 5 }
808  void GetIndicesFromTab(DictionaryValue* args, IPC::Message* reply_message);
809
810  // Navigates to the given URL. Uses the JSON interface.
811  // Example:
812  //   input: { "windex": 1,
813  //            "tab_index": 3,
814  //            "url": "http://www.google.com",
815  //            "navigation_count": 1  // number of navigations to wait for
816  //          }
817  //   output: { "result": AUTOMATION_MSG_NAVIGATION_SUCCESS }
818  void NavigateToURL(DictionaryValue* args, IPC::Message* reply_message);
819
820  // Executes javascript in the specified frame. Uses the JSON interface.
821  // Waits for a result from the |DOMAutomationController|. The javascript
822  // must send a string.
823  // Example:
824  //   input: { "windex": 1,
825  //            "tab_index": 1,
826  //            "frame_xpath": "//frames[1]",
827  //            "javascript":
828  //                "window.domAutomationController.send(window.name)",
829  //           }
830  //   output: { "result": "My Window Name" }
831  // This and some following methods have a suffix of JSON to distingush them
832  // from already existing methods which perform the same function, but use
833  // custom IPC messages instead of the JSON IPC message. These functions will
834  // eventually be replaced with the JSON ones and the JSON suffix will be
835  // dropped.
836  // TODO(kkania): Replace the non-JSON counterparts and drop the JSON suffix.
837  void ExecuteJavascriptJSON(
838      DictionaryValue* args, IPC::Message* reply_message);
839
840  // Goes forward in the specified tab. Uses the JSON interface.
841  // Example:
842  //   input: { "windex": 1, "tab_index": 1 }
843  //   output: { "did_go_forward": true,                      // optional
844  //             "result": AUTOMATION_MSG_NAVIGATION_SUCCESS  // optional
845  //           }
846  void GoForward(DictionaryValue* args, IPC::Message* reply_message);
847
848  // Goes back in the specified tab. Uses the JSON interface.
849  // Example:
850  //   input: { "windex": 1, "tab_index": 1 }
851  //   output: { "did_go_back": true,                         // optional
852  //             "result": AUTOMATION_MSG_NAVIGATION_SUCCESS  // optional
853  //           }
854  void GoBack(DictionaryValue* args, IPC::Message* reply_message);
855
856  // Reload the specified tab. Uses the JSON interface.
857  // Example:
858  //   input: { "windex": 1, "tab_index": 1 }
859  //   output: { "result": AUTOMATION_MSG_NAVIGATION_SUCCESS  // optional }
860  void ReloadJSON(DictionaryValue* args, IPC::Message* reply_message);
861
862  // Get the current url of the specified tab. Uses the JSON interface.
863  // Example:
864  //   input: { "windex": 1, "tab_index": 1 }
865  //   output: { "url": "http://www.google.com" }
866  void GetTabURLJSON(DictionaryValue* args, IPC::Message* reply_message);
867
868  // Get the current url of the specified tab. Uses the JSON interface.
869  // Example:
870  //   input: { "windex": 1, "tab_index": 1 }
871  //   output: { "title": "Google" }
872  void GetTabTitleJSON(DictionaryValue* args, IPC::Message* reply_message);
873
874  // Captures the entire page of the the specified tab, including the
875  // non-visible portions of the page, and saves the PNG to a file.
876  // Example:
877  //   input: { "windex": 1, "tab_index": 1, "path":"/tmp/foo.png"}
878  //   output: none
879  void CaptureEntirePageJSON(
880      DictionaryValue* args, IPC::Message* reply_message);
881
882  // Gets the cookies for the given URL. Uses the JSON interface.
883  // "expiry" refers to the amount of seconds since the Unix epoch. If omitted,
884  // the cookie is valid for the duration of the browser session.
885  // Example:
886  //   input: { "url": "http://www.google.com" }
887  //   output: { "cookies": [
888  //               {
889  //                 "name": "PREF",
890  //                 "value": "123101",
891  //                 "path": "/",
892  //                 "domain": "www.google.com",
893  //                 "secure": false,
894  //                 "expiry": 1401982012
895  //               }
896  //             ]
897  //           }
898  void GetCookiesJSON(DictionaryValue* args, IPC::Message* reply_message);
899
900  // Deletes the cookie with the given name for the URL. Uses the JSON
901  // interface.
902  // Example:
903  //   input: {
904  //            "url": "http://www.google.com",
905  //            "name": "my_cookie"
906  //          }
907  //   output: none
908  void DeleteCookieJSON(DictionaryValue* args, IPC::Message* reply_message);
909
910  // Sets a cookie for the given URL. Uses the JSON interface.
911  // "expiry" refers to the amount of seconds since the Unix epoch. If omitted,
912  // the cookie will be valid for the duration of the browser session.
913  // "domain" refers to the applicable domain for the cookie. Valid domain
914  // choices for the site "http://www.google.com" and resulting cookie
915  // applicability:
916  //   [.]www.google.com - applicable on www.google.com and its subdomains
917  //   [.]google.com - applicable on google.com and its subdomains
918  //   <none> - applicable only on www.google.com
919  //
920  // Example:
921  //   input: { "url": "http://www.google.com",
922  //            "cookie": {
923  //              "name": "PREF",
924  //              "value": "123101",
925  //              "path": "/",                  // optional
926  //              "domain": ".www.google.com",  // optional
927  //              "secure": false,              // optional
928  //              "expiry": 1401982012          // optional
929  //            }
930  //          }
931  //   output: none
932  void SetCookieJSON(DictionaryValue* args, IPC::Message* reply_message);
933
934  // Gets the ID for every open tab. This ID is unique per session.
935  // Example:
936  //   input: none
937  //   output: { "ids": [4124, 213, 1] }
938  void GetTabIds(DictionaryValue* args, IPC::Message* reply_message);
939
940  // Checks if the given tab ID refers to an open tab.
941  // Example:
942  //   input: { "id": 41 }
943  //   output: { "is_valid": false }
944  void IsTabIdValid(DictionaryValue* args, IPC::Message* reply_message);
945
946  // Closes the specified tab.
947  // Example:
948  //   input: { "windex": 1, "tab_index": 1 }
949  //   output: none
950  void CloseTabJSON(DictionaryValue* args, IPC::Message* reply_message);
951
952  // Sends the WebKit events for a mouse click at a given coordinate.
953  // Example:
954  //   input: { "windex": 1,
955  //            "tab_index": 1,
956  //            "button": automation::kLeftButton,
957  //            "x": 100,
958  //            "y": 100
959  //          }
960  //   output: none
961  void WebkitMouseClick(DictionaryValue* args,
962                        IPC::Message* message);
963
964  // Sends the WebKit event for a mouse move to a given coordinate.
965  // Example:
966  //   input: { "windex": 1,
967  //            "tab_index": 1,
968  //            "x": 100,
969  //            "y": 100
970  //          }
971  //   output: none
972  void WebkitMouseMove(DictionaryValue* args,
973                       IPC::Message* message);
974
975  // Sends the WebKit events for a mouse drag between two coordinates.
976  // Example:
977  //   input: { "windex": 1,
978  //            "tab_index": 1,
979  //            "start_x": 100,
980  //            "start_y": 100,
981  //            "end_x": 100,
982  //            "end_y": 100
983  //          }
984  //   output: none
985  void WebkitMouseDrag(DictionaryValue* args,
986                       IPC::Message* message);
987
988  // Sends the WebKit key event with the specified properties.
989  // Example:
990  //   input: { "windex": 1,
991  //            "tab_index": 1,
992  //            "type": automation::kRawKeyDownType,
993  //            "nativeKeyCode": ui::VKEY_X,
994  //            "windowsKeyCode": ui::VKEY_X,
995  //            "unmodifiedText": "x",
996  //            "text": "X",
997  //            "modifiers": automation::kShiftKeyMask,
998  //            "isSystemKey": false
999  //          }
1000  //   output: none
1001  void SendWebkitKeyEvent(DictionaryValue* args,
1002                          IPC::Message* message);
1003
1004  // Sends the key event from the OS level to the browser window,
1005  // allowing it to be preprocessed by some external application (ie. IME).
1006  // Will switch to the tab specified by tab_index before sending the event.
1007  // Example:
1008  //   input: { "windex": 1,
1009  //            "tab_index": 1,
1010  //            "keyCode": ui::VKEY_X,
1011  //            "modifiers": automation::kShiftKeyMask,
1012  //          }
1013  //   output: none
1014  void SendOSLevelKeyEventToTab(DictionaryValue* args,
1015                                IPC::Message* message);
1016
1017  // Method used as a Task that sends a success AutomationJSONReply.
1018  void SendSuccessReply(IPC::Message* reply_message);
1019
1020  // Activates the given tab.
1021  // Example:
1022  //   input: { "windex": 1,
1023  //            "tab_index": 1,
1024  //          }
1025  //   output: none
1026  void ActivateTabJSON(DictionaryValue* args, IPC::Message* message);
1027
1028  // Auto-updates installed extensions.
1029  // Uses the JSON interface for input/output.
1030  void UpdateExtensionsNow(DictionaryValue* args, IPC::Message* reply_message);
1031
1032  // Gets the version of ChromeDriver automation supported by this server.
1033  // Example:
1034  //   input: none
1035  //   output: { "version": 1 }
1036  void GetChromeDriverAutomationVersion(DictionaryValue* args,
1037                                        IPC::Message* message);
1038
1039#if defined(OS_CHROMEOS)
1040  void GetLoginInfo(DictionaryValue* args, IPC::Message* reply_message);
1041
1042  void LoginAsGuest(DictionaryValue* args, IPC::Message* reply_message);
1043
1044  void Login(DictionaryValue* args, IPC::Message* reply_message);
1045
1046  void LockScreen(DictionaryValue* args, IPC::Message* reply_message);
1047
1048  void UnlockScreen(DictionaryValue* args, IPC::Message* reply_message);
1049
1050  void SignoutInScreenLocker(DictionaryValue* args,
1051                             IPC::Message* reply_message);
1052
1053  void GetBatteryInfo(DictionaryValue* args, IPC::Message* reply_message);
1054
1055  void GetNetworkInfo(DictionaryValue* args, IPC::Message* reply_message);
1056
1057  void NetworkScan(DictionaryValue* args, IPC::Message* reply_message);
1058
1059  void GetProxySettings(DictionaryValue* args, IPC::Message* reply_message);
1060
1061  void SetProxySettings(DictionaryValue* args, IPC::Message* reply_message);
1062
1063  void ConnectToWifiNetwork(DictionaryValue* args, IPC::Message* reply_message);
1064
1065  void ConnectToHiddenWifiNetwork(DictionaryValue* args,
1066                                  IPC::Message* reply_message);
1067
1068  void DisconnectFromWifiNetwork(DictionaryValue* args,
1069                                 IPC::Message* reply_message);
1070
1071  void GetUpdateInfo(DictionaryValue* args, IPC::Message* reply_message);
1072
1073  void UpdateCheck(DictionaryValue* args, IPC::Message* reply_message);
1074
1075  void SetReleaseTrack(DictionaryValue* args, IPC::Message* reply_message);
1076#endif  // defined(OS_CHROMEOS)
1077
1078  void WaitForTabCountToBecome(int browser_handle,
1079                               int target_tab_count,
1080                               IPC::Message* reply_message);
1081
1082  void WaitForInfoBarCount(int tab_handle,
1083                           size_t target_count,
1084                           IPC::Message* reply_message);
1085
1086  // Gets the current used encoding name of the page in the specified tab.
1087  void GetPageCurrentEncoding(int tab_handle, std::string* current_encoding);
1088
1089  void ShutdownSessionService(int handle, bool* result);
1090
1091  void SetContentSetting(int handle,
1092                         const std::string& host,
1093                         ContentSettingsType content_type,
1094                         ContentSetting setting,
1095                         bool* success);
1096
1097  // Load all plug-ins on the page.
1098  void LoadBlockedPlugins(int tab_handle, bool* success);
1099
1100  // Resets to the default theme.
1101  void ResetToDefaultTheme();
1102
1103  void WaitForProcessLauncherThreadToGoIdle(IPC::Message* reply_message);
1104
1105  // Gets the browser that contains the given tab.
1106  void GetParentBrowserOfTab(
1107      int tab_handle, int* browser_handle, bool* success);
1108
1109  // Callback for history redirect queries.
1110  virtual void OnRedirectQueryComplete(
1111      HistoryService::Handle request_handle,
1112      GURL from_url,
1113      bool success,
1114      history::RedirectList* redirects);
1115
1116  void OnRemoveProvider();  // Called via PostTask
1117
1118#if defined(TOOLKIT_VIEWS)
1119  // Keep track of whether a popup menu has been opened since the last time
1120  // that StartTrackingPopupMenus has been called.
1121  bool popup_menu_opened_;
1122
1123  // A temporary object that receives a notification when a popup menu opens.
1124  PopupMenuWaiter* popup_menu_waiter_;
1125#endif  // defined(TOOLKIT_VIEWS)
1126
1127  // Used to wait on various browser sync events.
1128  scoped_ptr<ProfileSyncServiceHarness> sync_waiter_;
1129
1130  // Handle for an in-process redirect query. We expect only one redirect query
1131  // at a time (we should have only one caller, and it will block while waiting
1132  // for the results) so there is only one handle. When non-0, indicates a
1133  // query in progress.
1134  HistoryService::Handle redirect_query_;
1135
1136  NotificationRegistrar registrar_;
1137
1138  // Used to enumerate browser profiles.
1139  scoped_refptr<ImporterList> importer_list_;
1140
1141  // The stored data for the ImportSettings operation.
1142  ImportSettingsData import_settings_data_;
1143
1144  DISALLOW_COPY_AND_ASSIGN(TestingAutomationProvider);
1145};
1146
1147#endif  // CHROME_BROWSER_AUTOMATION_TESTING_AUTOMATION_PROVIDER_H_
1148