172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/automation/testing_automation_provider.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <map>
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <set>
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string>
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <vector>
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/command_line.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/file_path.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/json/json_reader.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/json/json_writer.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/json/string_escape.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/path_service.h"
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/process.h"
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/process_util.h"
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/stringprintf.h"
213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread_restrictions.h"
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/time.h"
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h"
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h"
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete.h"
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/autocomplete/autocomplete_edit.h"
27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h"
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/autofill/autofill_manager.h"
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/credit_card.h"
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/personal_data_manager.h"
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/automation/automation_autocomplete_edit_tracker.h"
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/automation/automation_browser_tracker.h"
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/automation/automation_provider_json.h"
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/automation/automation_provider_list.h"
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/automation/automation_provider_observers.h"
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/automation/automation_tab_tracker.h"
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/automation/automation_util.h"
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/automation/automation_window_tracker.h"
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/automation/ui_controls.h"
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/blocked_content_container.h"
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/bookmarks/bookmark_model.h"
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/bookmarks/bookmark_storage.h"
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_process.h"
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_shutdown.h"
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/debugger/devtools_manager.h"
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/download/download_prefs.h"
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/download/download_shelf.h"
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/download/save_package.h"
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_host.h"
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_updater.h"
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/history/top_sites.h"
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/importer/importer_host.h"
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/instant/instant_controller.h"
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/notifications/balloon.h"
564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/notifications/balloon_collection.h"
574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/notifications/notification.h"
584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/notifications/notification_ui_manager.h"
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/password_manager/password_store.h"
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/platform_util.h"
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/prefs/pref_service.h"
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/profiles/profile.h"
6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h"
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/search_engines/template_url.h"
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/search_engines/template_url_model.h"
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/link_infobar_delegate.h"
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service.h"
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service_factory.h"
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/translate/translate_infobar_delegate.h"
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/translate/translate_tab_helper.h"
7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h"
7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h"
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/download/download_tab_helper.h"
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/find_bar/find_bar.h"
7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/login/login_prompt.h"
7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/omnibox/location_bar.h"
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/search_engines/keyword_editor_controller.h"
8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/active_downloads_ui.h"
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/shown_sections_handler.h"
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/automation_messages.h"
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/chrome_constants.h"
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/chrome_paths.h"
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/chrome_switches.h"
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension.h"
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension_extent.h"
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/url_pattern.h"
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/pref_names.h"
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/url_constants.h"
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h"
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/interstitial_page.h"
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/common_param_traits.h"
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "net/base/cookie_store.h"
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/events.h"
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/message_box_flags.h"
10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "webkit/plugins/npapi/plugin_list.h"
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid SendMouseClick(int flags) {
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ui_controls::MouseButton button = ui_controls::LEFT;
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if ((flags & ui::EF_LEFT_BUTTON_DOWN) ==
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ui::EF_LEFT_BUTTON_DOWN) {
11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    button = ui_controls::LEFT;
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if ((flags & ui::EF_RIGHT_BUTTON_DOWN) ==
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             ui::EF_RIGHT_BUTTON_DOWN) {
11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    button = ui_controls::RIGHT;
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if ((flags & ui::EF_MIDDLE_BUTTON_DOWN) ==
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             ui::EF_MIDDLE_BUTTON_DOWN) {
11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    button = ui_controls::MIDDLE;
11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else {
11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    NOTREACHED();
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ui_controls::SendMouseClick(button);
12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass AutomationInterstitialPage : public InterstitialPage {
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationInterstitialPage(TabContents* tab,
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                             const GURL& url,
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                             const std::string& contents)
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : InterstitialPage(tab, true, url),
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        contents_(contents) {
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual std::string GetHTMLContents() { return contents_; }
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const std::string contents_;
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(AutomationInterstitialPage);
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTestingAutomationProvider::TestingAutomationProvider(Profile* profile)
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : AutomationProvider(profile),
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(TOOLKIT_VIEWS)
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      popup_menu_waiter_(NULL),
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      redirect_query_(0) {
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  BrowserList::AddObserver(this);
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::SESSION_END,
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTestingAutomationProvider::~TestingAutomationProvider() {
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  BrowserList::RemoveObserver(this);
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::OnBrowserAdded(const Browser* browser) {
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::OnBrowserRemoved(const Browser* browser) {
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // For backwards compatibility with the testing automation interface, we
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // want the automation provider (and hence the process) to go away when the
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // last browser goes away.
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (BrowserList::empty() && !CommandLine::ForCurrentProcess()->HasSwitch(
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          switches::kKeepAliveForTest)) {
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // If you change this, update Observer for NotificationType::SESSION_END
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // below.
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    MessageLoop::current()->PostTask(FROM_HERE,
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        NewRunnableMethod(this, &TestingAutomationProvider::OnRemoveProvider));
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::OnSourceProfilesLoaded() {
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK_NE(static_cast<ImporterList*>(NULL), importer_list_.get());
17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Get the correct profile based on the browser that the user provided.
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  importer::SourceProfile source_profile;
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  size_t i = 0;
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  size_t importers_count = importer_list_->count();
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for ( ; i < importers_count; ++i) {
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    importer::SourceProfile profile = importer_list_->GetSourceProfileAt(i);
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (profile.importer_name == import_settings_data_.browser_name) {
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      source_profile = profile;
18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      break;
18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // If we made it to the end of the loop, then the input was bad.
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (i == importers_count) {
190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, import_settings_data_.reply_message)
191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("Invalid browser name string found.");
19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return;
19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<ImporterHost> importer_host(new ImporterHost);
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  importer_host->SetObserver(
19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      new AutomationProviderImportSettingsObserver(
19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          this, import_settings_data_.reply_message));
19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Profile* target_profile = import_settings_data_.browser->profile();
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  importer_host->StartImportSettings(source_profile,
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     target_profile,
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     import_settings_data_.import_items,
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     new ProfileWriter(target_profile),
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     import_settings_data_.first_run);
20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
20721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
20821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid TestingAutomationProvider::Observe(NotificationType type,
20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                        const NotificationSource& source,
21021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                        const NotificationDetails& details) {
21121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DCHECK(type == NotificationType::SESSION_END);
21221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // OnBrowserRemoved does a ReleaseLater. When session end is received we exit
21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // before the task runs resulting in this object not being deleted. This
21421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Release balance out the Release scheduled by OnBrowserRemoved.
21521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Release();
21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool TestingAutomationProvider::OnMessageReceived(
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const IPC::Message& message) {
22021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  bool handled = true;
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool deserialize_success = true;
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  IPC_BEGIN_MESSAGE_MAP_EX(TestingAutomationProvider,
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           message,
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           deserialize_success)
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_CloseBrowser, CloseBrowser)
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_CloseBrowserRequestAsync,
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        CloseBrowserAsync)
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ActivateTab, ActivateTab)
229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_AppendTab, AppendTab)
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ActiveTabIndex, GetActiveTabIndex)
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_CloseTab, CloseTab)
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetCookies, GetCookies)
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SetCookie, SetCookie)
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_DeleteCookie, DeleteCookie)
235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ShowCollectedCookiesDialog,
236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        ShowCollectedCookiesDialog)
237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        AutomationMsg_NavigateToURLBlockUntilNavigationsComplete,
239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        NavigateToURLBlockUntilNavigationsComplete)
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_NavigationAsync, NavigationAsync)
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_NavigationAsyncWithDisposition,
242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        NavigationAsyncWithDisposition)
243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_Reload, Reload)
244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_SetAuth, SetAuth)
245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_CancelAuth, CancelAuth)
246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_NeedsAuth, NeedsAuth)
247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_RedirectsFrom,
248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    GetRedirectsFrom)
249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_BrowserWindowCount, GetBrowserWindowCount)
250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_NormalBrowserWindowCount,
251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetNormalBrowserWindowCount)
252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_BrowserWindow, GetBrowserWindow)
253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetBrowserLocale, GetBrowserLocale)
254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_LastActiveBrowserWindow,
255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetLastActiveBrowserWindow)
256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ActiveWindow, GetActiveWindow)
257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_FindNormalBrowserWindow,
258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        FindNormalBrowserWindow)
259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_IsWindowActive, IsWindowActive)
260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ActivateWindow, ActivateWindow)
261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_IsWindowMaximized, IsWindowMaximized)
262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_WindowExecuteCommandAsync,
263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        ExecuteBrowserCommandAsync)
264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WindowExecuteCommand,
265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        ExecuteBrowserCommand)
266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_TerminateSession, TerminateSession)
267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_WindowViewBounds, WindowGetViewBounds)
268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetWindowBounds, GetWindowBounds)
269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SetWindowBounds, SetWindowBounds)
270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SetWindowVisible, SetWindowVisible)
271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_WindowClick, WindowSimulateClick)
272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_WindowMouseMove, WindowSimulateMouseMove)
273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_WindowKeyPress, WindowSimulateKeyPress)
274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_TabCount, GetTabCount)
275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_Type, GetType)
276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_Tab, GetTab)
277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_TabProcessID, GetTabProcessID)
278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_TabTitle, GetTabTitle)
279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_TabIndex, GetTabIndex)
280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_TabURL, GetTabURL)
281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ShelfVisibility, GetShelfVisibility)
282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_IsFullscreen, IsFullscreen)
283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_IsFullscreenBubbleVisible,
284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetFullscreenBubbleVisibility)
285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditForBrowser,
286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetAutocompleteEditForBrowser)
287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditGetText,
288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetAutocompleteEditText)
289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditSetText,
290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        SetAutocompleteEditText)
291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditIsQueryInProgress,
292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        AutocompleteEditIsQueryInProgress)
293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditGetMatches,
294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        AutocompleteEditGetMatches)
295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForAutocompleteEditFocus,
296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    WaitForAutocompleteEditFocus)
297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_DomOperation,
298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    ExecuteJavascript)
299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ConstrainedWindowCount,
300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetConstrainedWindowCount)
301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(TOOLKIT_VIEWS)
302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetFocusedViewID, GetFocusedViewID)
303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForFocusedViewIDToChange,
304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    WaitForFocusedViewIDToChange)
305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_StartTrackingPopupMenus,
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        StartTrackingPopupMenus)
307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForPopupMenuToOpen,
308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    WaitForPopupMenuToOpen)
309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif  // defined(TOOLKIT_VIEWS)
310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_InspectElement,
311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    HandleInspectElementRequest)
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_DownloadDirectory, GetDownloadDirectory)
313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_OpenNewBrowserWindowOfType,
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    OpenNewBrowserWindowOfType)
315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_WindowForBrowser, GetWindowForBrowser)
316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_BrowserForWindow, GetBrowserForWindow)
317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_ShowInterstitialPage,
318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    ShowInterstitialPage)
319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_HideInterstitialPage,
320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        HideInterstitialPage)
321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForTabToBeRestored,
322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    WaitForTabToBeRestored)
323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetSecurityState, GetSecurityState)
324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetPageType, GetPageType)
325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetMetricEventDuration,
326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetMetricEventDuration)
327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_ActionOnSSLBlockingPage,
328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    ActionOnSSLBlockingPage)
329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_BringBrowserToFront, BringBrowserToFront)
330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_IsMenuCommandEnabled,
331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        IsMenuCommandEnabled)
332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_PrintNow, PrintNow)
333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SavePage, SavePage)
334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_OpenFindInPage,
335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        HandleOpenFindInPageRequest)
336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_FindWindowVisibility,
337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetFindWindowVisibility)
338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_FindWindowLocation,
339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        HandleFindWindowLocationRequest)
340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_BookmarkBarVisibility,
341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetBookmarkBarVisibility)
342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetBookmarksAsJSON,
343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetBookmarksAsJSON)
344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForBookmarkModelToLoad,
345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    WaitForBookmarkModelToLoad)
346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_AddBookmarkGroup,
347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        AddBookmarkGroup)
348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_AddBookmarkURL,
349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        AddBookmarkURL)
350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ReparentBookmark,
351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        ReparentBookmark)
352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SetBookmarkTitle,
353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        SetBookmarkTitle)
354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SetBookmarkURL,
355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        SetBookmarkURL)
356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_RemoveBookmark,
357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        RemoveBookmark)
358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetInfoBarCount, GetInfoBarCount)
359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_ClickInfoBarAccept,
360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    ClickInfoBarAccept)
361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetLastNavigationTime,
362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetLastNavigationTime)
363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForNavigation,
364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    WaitForNavigation)
365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SetIntPreference, SetIntPreference)
366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ShowingAppModalDialog,
367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetShowingAppModalDialog)
368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ClickAppModalDialogButton,
369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        ClickAppModalDialogButton)
370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SetStringPreference, SetStringPreference)
371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetBooleanPreference,
372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetBooleanPreference)
373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SetBooleanPreference,
374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        SetBooleanPreference)
375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(
376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        AutomationMsg_WaitForBrowserWindowCountToBecome,
377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        WaitForBrowserWindowCountToBecome)
378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(
379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        AutomationMsg_WaitForAppModalDialogToBeShown,
380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        WaitForAppModalDialogToBeShown)
381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(
382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        AutomationMsg_GoBackBlockUntilNavigationsComplete,
383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        GoBackBlockUntilNavigationsComplete)
384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(
385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        AutomationMsg_GoForwardBlockUntilNavigationsComplete,
386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        GoForwardBlockUntilNavigationsComplete)
387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SavePackageShouldPromptUser,
388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        SavePackageShouldPromptUser)
389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_WindowTitle, GetWindowTitle)
390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SetShelfVisibility, SetShelfVisibility)
391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_BlockedPopupCount, GetBlockedPopupCount)
392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_SendJSONRequest,
393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    SendJSONRequest)
394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForTabCountToBecome,
395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    WaitForTabCountToBecome)
396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForInfoBarCount,
397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    WaitForInfoBarCount)
398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetPageCurrentEncoding,
399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        GetPageCurrentEncoding)
400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ShutdownSessionService,
401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        ShutdownSessionService)
402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_SetContentSetting, SetContentSetting)
403513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    IPC_MESSAGE_HANDLER(AutomationMsg_LoadBlockedPlugins, LoadBlockedPlugins)
404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_ResetToDefaultTheme, ResetToDefaultTheme)
40572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(
40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        AutomationMsg_WaitForProcessLauncherThreadToGoIdle,
40772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        WaitForProcessLauncherThreadToGoIdle)
408dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC_MESSAGE_HANDLER(AutomationMsg_GetParentBrowserOfTab,
409dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                        GetParentBrowserOfTab)
410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
41121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    IPC_MESSAGE_UNHANDLED(
41221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        handled = AutomationProvider::OnMessageReceived(message))
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  IPC_END_MESSAGE_MAP_EX()
414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!deserialize_success)
415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    OnMessageDeserializationFailure();
41621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return handled;
417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::OnChannelError() {
420dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!reinitialize_on_channel_error_ &&
421dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      browser_shutdown::GetShutdownType() == browser_shutdown::NOT_VALID)
422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    BrowserList::CloseAllBrowsersAndExit();
423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationProvider::OnChannelError();
424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::CloseBrowser(int browser_handle,
427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                             IPC::Message* reply_message) {
42821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!browser_tracker_->ContainsHandle(browser_handle))
42921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return;
43021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
43121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Browser* browser = browser_tracker_->GetResource(browser_handle);
43221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  new BrowserClosedNotificationObserver(browser, this, reply_message);
43321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  browser->window()->Close();
434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::CloseBrowserAsync(int browser_handle) {
43721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!browser_tracker_->ContainsHandle(browser_handle))
43821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return;
43921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
44021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Browser* browser = browser_tracker_->GetResource(browser_handle);
44121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  browser->window()->Close();
442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ActivateTab(int handle,
445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                            int at_index,
446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                            int* status) {
447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *status = -1;
448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle) && at_index > -1) {
449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (at_index >= 0 && at_index < browser->tab_count()) {
451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      browser->ActivateTabAt(at_index, true);
452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *status = 0;
453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
45721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid TestingAutomationProvider::AppendTab(int handle,
45821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                          const GURL& url,
459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                          IPC::Message* reply_message) {
460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int append_tab_response = -1;  // -1 is the error code
461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NotificationObserver* observer = NULL;
462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
46572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    observer = new TabAppendedNotificationObserver(browser, this,
46672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                   reply_message);
467201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    TabContentsWrapper* contents =
468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        browser->AddSelectedTabWithURL(url, PageTransition::TYPED);
469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (contents) {
470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      append_tab_response =
471731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          GetIndexForNavigationController(&contents->controller(), browser);
472bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
473bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
474bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
475bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (append_tab_response < 0) {
47672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Appending tab failed. Clean up and send failure response.
47772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (observer)
479bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      delete observer;
480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
481bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_AppendTab::WriteReplyParams(reply_message,
482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                              append_tab_response);
483bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message);
484bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
485bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
486bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
487bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetActiveTabIndex(int handle,
488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                  int* active_tab_index) {
489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *active_tab_index = -1;  // -1 is the error code
490bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
491bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *active_tab_index = browser->active_index();
493bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
494bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
495bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
496bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::CloseTab(int tab_handle,
497bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                         bool wait_until_closed,
498bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                         IPC::Message* reply_message) {
499bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(tab_handle)) {
500bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* controller = tab_tracker_->GetResource(tab_handle);
501bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int index;
502bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = Browser::GetBrowserForController(controller, &index);
503bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DCHECK(browser);
504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    new TabClosedNotificationObserver(this, wait_until_closed, reply_message);
505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser->CloseTabContents(controller->tab_contents());
506bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
507bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
508bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
509bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_CloseTab::WriteReplyParams(reply_message, false);
510bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
511bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetCookies(const GURL& url, int handle,
514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                           int* value_size,
515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                           std::string* value) {
516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContents *contents = tab_tracker_->ContainsHandle(handle) ?
517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab_tracker_->GetResource(handle)->tab_contents() : NULL;
518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  automation_util::GetCookies(url, contents, value_size, value);
519bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetCookie(const GURL& url,
522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                          const std::string& value,
523bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                          int handle,
524bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                          int* response_value) {
525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContents *contents = tab_tracker_->ContainsHandle(handle) ?
526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab_tracker_->GetResource(handle)->tab_contents() : NULL;
527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  automation_util::SetCookie(url, value, contents, response_value);
528bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
529bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
530bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::DeleteCookie(const GURL& url,
531bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                             const std::string& cookie_name,
532bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                             int handle, bool* success) {
533ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContents *contents = tab_tracker_->ContainsHandle(handle) ?
534ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab_tracker_->GetResource(handle)->tab_contents() : NULL;
535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  automation_util::DeleteCookie(url, cookie_name, contents, success);
536bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
537bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
538bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ShowCollectedCookiesDialog(
539bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle, bool* success) {
540bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
541bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
542bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab_contents =
543bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        tab_tracker_->GetResource(handle)->tab_contents();
544bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    tab_contents->delegate()->ShowCollectedCookiesDialog(tab_contents);
545bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
546bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
547bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
548bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
549bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::NavigateToURLBlockUntilNavigationsComplete(
550bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle, const GURL& url, int number_of_navigations,
551bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
552bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
553bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
554bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
555bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Simulate what a user would do. Activate the tab and then navigate.
556bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // We could allow navigating in a background tab in future.
557bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = FindAndActivateTab(tab);
558bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
559bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
56072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new NavigationNotificationObserver(tab, this, reply_message,
561dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                         number_of_navigations, false, false);
562bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
56321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      // TODO(darin): avoid conversion to GURL.
564bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      browser->OpenURL(url, GURL(), CURRENT_TAB, PageTransition::TYPED);
565bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
566bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
567bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
568bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
56921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  AutomationMsg_NavigateToURLBlockUntilNavigationsComplete::WriteReplyParams(
570bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
571bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
572bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
573bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
574bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::NavigationAsync(int handle,
575bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                const GURL& url,
576bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                bool* status) {
577bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NavigationAsyncWithDisposition(handle, url, CURRENT_TAB, status);
578bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
579bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
580bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::NavigationAsyncWithDisposition(
581bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
582bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& url,
583bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    WindowOpenDisposition disposition,
584bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* status) {
585bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *status = false;
586bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
587bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
588bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
589bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
590bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Simulate what a user would do. Activate the tab and then navigate.
591bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // We could allow navigating in a background tab in future.
592bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = FindAndActivateTab(tab);
593bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
594bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
595bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Don't add any listener unless a callback mechanism is desired.
596bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // TODO(vibhor): Do this if such a requirement arises in future.
597bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      browser->OpenURL(url, GURL(), disposition, PageTransition::TYPED);
598bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *status = true;
599bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
600bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
601bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
602bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
603bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::Reload(int handle,
604bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                       IPC::Message* reply_message) {
605bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
606bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
607bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = FindAndActivateTab(tab);
608bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser && browser->command_updater()->IsCommandEnabled(IDC_RELOAD)) {
609dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      new NavigationNotificationObserver(
610dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          tab, this, reply_message, 1, false, false);
611bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      browser->Reload(CURRENT_TAB);
612bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
613bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
614bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
615bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
616bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_Reload::WriteReplyParams(
617bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
618bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
619bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
620bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
621bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetAuth(int tab_handle,
622bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                        const std::wstring& username,
623bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                        const std::wstring& password,
624bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                        IPC::Message* reply_message) {
625bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(tab_handle)) {
626bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(tab_handle);
627bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LoginHandlerMap::iterator iter = login_handler_map_.find(tab);
628bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
629bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (iter != login_handler_map_.end()) {
630bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // If auth is needed again after this, assume login has failed.  This is
631bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // not strictly correct, because a navigation can require both proxy and
632bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // server auth, but it should be OK for now.
633bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      LoginHandler* handler = iter->second;
634dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      new NavigationNotificationObserver(
635dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          tab, this, reply_message, 1, false, false);
63672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      handler->SetAuth(WideToUTF16Hack(username), WideToUTF16Hack(password));
637bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
638bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
639bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
640bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
641bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_SetAuth::WriteReplyParams(
642bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_message, AUTOMATION_MSG_NAVIGATION_AUTH_NEEDED);
643bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
644bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
645bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
646bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::CancelAuth(int tab_handle,
647bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                           IPC::Message* reply_message) {
648bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(tab_handle)) {
649bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(tab_handle);
650bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LoginHandlerMap::iterator iter = login_handler_map_.find(tab);
651bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
652bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (iter != login_handler_map_.end()) {
653bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // If auth is needed again after this, something is screwy.
654bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      LoginHandler* handler = iter->second;
655dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      new NavigationNotificationObserver(
656dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          tab, this, reply_message, 1, false, false);
657bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      handler->CancelAuth();
658bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
659bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
660bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
661bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
662bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_CancelAuth::WriteReplyParams(
663bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_message, AUTOMATION_MSG_NAVIGATION_AUTH_NEEDED);
664bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
665bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
666bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
667bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::NeedsAuth(int tab_handle, bool* needs_auth) {
668bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *needs_auth = false;
669bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
670bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(tab_handle)) {
671bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(tab_handle);
672bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LoginHandlerMap::iterator iter = login_handler_map_.find(tab);
673bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
674bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (iter != login_handler_map_.end()) {
675bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // The LoginHandler will be in our map IFF the tab needs auth.
676bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *needs_auth = true;
677bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
678bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
679bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
680bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
681bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetRedirectsFrom(int tab_handle,
682bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 const GURL& source_url,
683bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 IPC::Message* reply_message) {
68421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (redirect_query_) {
68521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    LOG(ERROR) << "Can only handle one redirect query at once.";
68621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (tab_tracker_->ContainsHandle(tab_handle)) {
687bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(tab_handle);
688bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    HistoryService* history_service =
689bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        tab->profile()->GetHistoryService(Profile::EXPLICIT_ACCESS);
690bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
691bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DCHECK(history_service) << "Tab " << tab_handle << "'s profile " <<
692bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                               "has no history service";
693bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (history_service) {
694dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      DCHECK(!reply_message_);
695bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_message_ = reply_message;
696bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Schedule a history query for redirects. The response will be sent
697bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // asynchronously from the callback the history system uses to notify us
698bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // that it's done: OnRedirectQueryComplete.
699bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      redirect_query_ = history_service->QueryRedirectsFrom(
700bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          source_url, &consumer_,
701bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          NewCallback(this,
702bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      &TestingAutomationProvider::OnRedirectQueryComplete));
703bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;  // Response will be sent when query completes.
704bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
705bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
706bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
707bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Send failure response.
708bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<GURL> empty;
709bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_RedirectsFrom::WriteReplyParams(reply_message, false, empty);
710bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
711bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
712bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
713bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetBrowserWindowCount(int* window_count) {
714bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *window_count = static_cast<int>(BrowserList::size());
715bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
716bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
717bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetNormalBrowserWindowCount(int* window_count) {
718bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *window_count = static_cast<int>(
719bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      BrowserList::GetBrowserCountForType(profile_, Browser::TYPE_NORMAL));
720bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
721bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
722bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetBrowserWindow(int index, int* handle) {
723bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *handle = 0;
724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Browser* browser = automation_util::GetBrowserAt(index);
725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (browser)
726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *handle = browser_tracker_->Add(browser);
727bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
728bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
729bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::FindNormalBrowserWindow(int* handle) {
730bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *handle = 0;
731bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Browser* browser = BrowserList::FindBrowserWithType(profile_,
732bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                      Browser::TYPE_NORMAL,
733bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                      false);
734bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser)
735bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *handle = browser_tracker_->Add(browser);
736bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
737bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
738bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetLastActiveBrowserWindow(int* handle) {
739bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *handle = 0;
740bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Browser* browser = BrowserList::GetLastActive();
741bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser)
742bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *handle = browser_tracker_->Add(browser);
743bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
744bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
745bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetActiveWindow(int* handle) {
746513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  *handle = 0;
747513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Browser* browser = BrowserList::GetLastActive();
748513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (browser) {
749513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    gfx::NativeWindow window = browser->window()->GetNativeHandle();
750513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    *handle = window_tracker_->Add(window);
751513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
752bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
753bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
754bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ExecuteBrowserCommandAsync(int handle,
755bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                           int command,
756bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                           bool* success) {
757bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
758bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
759bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
760bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser->command_updater()->SupportsCommand(command) &&
761bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        browser->command_updater()->IsCommandEnabled(command)) {
762bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      browser->ExecuteCommand(command);
763bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *success = true;
764bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
765bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
766bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
767bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
768bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ExecuteBrowserCommand(
769bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle, int command, IPC::Message* reply_message) {
770bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // List of commands which just finish synchronously and don't require
771bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // setting up an observer.
772bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  static const int kSynchronousCommands[] = {
773bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IDC_HOME,
774bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IDC_SELECT_NEXT_TAB,
775bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IDC_SELECT_PREVIOUS_TAB,
776bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IDC_SHOW_BOOKMARK_MANAGER,
777bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
778bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
779bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
780bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser->command_updater()->SupportsCommand(command) &&
781bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        browser->command_updater()->IsCommandEnabled(command)) {
782bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // First check if we can handle the command without using an observer.
783bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      for (size_t i = 0; i < arraysize(kSynchronousCommands); i++) {
784bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        if (command == kSynchronousCommands[i]) {
785bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          browser->ExecuteCommand(command);
786bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          AutomationMsg_WindowExecuteCommand::WriteReplyParams(reply_message,
787bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                               true);
788bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          Send(reply_message);
789bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          return;
790bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        }
791bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
792bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
793bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Use an observer if we have one, otherwise fail.
794bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (ExecuteBrowserCommandObserver::CreateAndRegisterObserver(
795bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          this, browser, command, reply_message)) {
796bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        browser->ExecuteCommand(command);
797bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        return;
798bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
799bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
800bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
801bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_WindowExecuteCommand::WriteReplyParams(reply_message, false);
802bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
803bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
804bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
805bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetBrowserLocale(string16* locale) {
806bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *locale = ASCIIToUTF16(g_browser_process->GetApplicationLocale());
807bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
808bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
809bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::IsWindowActive(int handle,
810bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               bool* success,
811bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               bool* is_active) {
812bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (window_tracker_->ContainsHandle(handle)) {
813bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *is_active =
814bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        platform_util::IsWindowActive(window_tracker_->GetResource(handle));
815bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
816bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
817bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = false;
818bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *is_active = false;
819bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
820bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
821bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
822bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WindowSimulateClick(const IPC::Message& message,
823bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    int handle,
824bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    const gfx::Point& click,
825bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    int flags) {
826bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (window_tracker_->ContainsHandle(handle)) {
82721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // TODO(phajdan.jr): This is flaky. We should wait for the final click.
82821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ui_controls::SendMouseMoveNotifyWhenDone(
82921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        click.x(), click.y(), NewRunnableFunction(&SendMouseClick, flags));
830bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
831bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
832bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
833bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WindowSimulateMouseMove(
834bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const IPC::Message& message,
835bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
836bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const gfx::Point& location) {
837bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (window_tracker_->ContainsHandle(handle))
838bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ui_controls::SendMouseMove(location.x(), location.y());
839bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
840bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
841bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WindowSimulateKeyPress(
842bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const IPC::Message& message,
843bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
844bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int key,
845bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int flags) {
846bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!window_tracker_->ContainsHandle(handle))
847bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
848bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
849bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::NativeWindow window = window_tracker_->GetResource(handle);
850bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The key event is sent to whatever window is active.
85172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui_controls::SendKeyPress(window, static_cast<ui::KeyboardCode>(key),
85272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            ((flags & ui::EF_CONTROL_DOWN) ==
85372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             ui::EF_CONTROL_DOWN),
85472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            ((flags & ui::EF_SHIFT_DOWN) ==
85572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             ui::EF_SHIFT_DOWN),
85672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            ((flags & ui::EF_ALT_DOWN) ==
85772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             ui::EF_ALT_DOWN),
85872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            ((flags & ui::EF_COMMAND_DOWN) ==
85972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             ui::EF_COMMAND_DOWN));
860bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
861bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
862dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::WebkitMouseClick(DictionaryValue* args,
863dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                 IPC::Message* reply_message) {
864dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
865dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
866dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
867dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
868dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
869dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
870dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
871dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  WebKit::WebMouseEvent mouse_event;
872dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetInteger("x", &mouse_event.x) ||
873dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !args->GetInteger("y", &mouse_event.y)) {
874dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
875dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("(X,Y) coordinates missing or invalid");
876dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
877dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
878dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
879dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int button;
880dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetInteger("button", &button)) {
881dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
882dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("Mouse button missing or invalid");
883dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
884dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
885dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (button == automation::kLeftButton) {
886dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
887dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (button == automation::kRightButton) {
888dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    mouse_event.button = WebKit::WebMouseEvent::ButtonRight;
889dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (button == automation::kMiddleButton) {
890dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    mouse_event.button = WebKit::WebMouseEvent::ButtonMiddle;
891dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
892dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
893dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("Invalid button press requested");
894dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
895dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
896dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
897dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.type = WebKit::WebInputEvent::MouseDown;
898dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.clickCount = 1;
899dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
900dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
901dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
902dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.type = WebKit::WebInputEvent::MouseUp;
903dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  new InputEventAckNotificationObserver(this, reply_message, mouse_event.type);
904dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
905dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
906dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
907dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::WebkitMouseMove(
908dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
909dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
910dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
911dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
912dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
913dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
914dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
915dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
916dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  WebKit::WebMouseEvent mouse_event;
917dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetInteger("x", &mouse_event.x) ||
918dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !args->GetInteger("y", &mouse_event.y)) {
919dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
920dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("(X,Y) coordinates missing or invalid");
921dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
922dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
923dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
924dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.type = WebKit::WebInputEvent::MouseMove;
925dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  new InputEventAckNotificationObserver(this, reply_message, mouse_event.type);
926dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
927dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
928dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
929dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::WebkitMouseDrag(DictionaryValue* args,
930dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                IPC::Message* reply_message) {
931dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
932dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
933dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
934dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
935dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
936dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
937dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
938dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  WebKit::WebMouseEvent mouse_event;
939dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int start_x, start_y, end_x, end_y;
940dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetInteger("start_x", &start_x) ||
941dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !args->GetInteger("start_y", &start_y) ||
942dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !args->GetInteger("end_x", &end_x) ||
943dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !args->GetInteger("end_y", &end_y)) {
944dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
945dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("Invalid start/end positions");
946dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
947dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
948dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
949dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.type = WebKit::WebInputEvent::MouseMove;
950dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Step 1- Move the mouse to the start position.
951dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.x = start_x;
952dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.y = start_y;
953dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
954dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
955dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Step 2- Left click mouse down, the mouse button is fixed.
956dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.type = WebKit::WebInputEvent::MouseDown;
957dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
958dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.clickCount = 1;
959dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
960dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
961dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Step 3 - Move the mouse to the end position.
962dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // TODO(JMikhail): See if we should simulate the by not making such
963dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // a drastic jump by placing incrmental stops along the way.
964dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.type = WebKit::WebInputEvent::MouseMove;
965dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.x = end_x;
966dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.y = end_y;
967dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.clickCount = 0;
968dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
969dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
970dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Step 4 - Release the left mouse button.
971dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.type = WebKit::WebInputEvent::MouseUp;
972dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  mouse_event.clickCount = 1;
973dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  new InputEventAckNotificationObserver(this, reply_message, mouse_event.type);
974dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
975dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
976dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
977bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetTabCount(int handle, int* tab_count) {
978bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *tab_count = -1;  // -1 is the error code
979bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
980bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
981bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
982bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *tab_count = browser->tab_count();
983bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
984bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
985bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
986bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetType(int handle, int* type_as_int) {
987bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *type_as_int = -1;  // -1 is the error code
988bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
989bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
990bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
991bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *type_as_int = static_cast<int>(browser->type());
992bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
993bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
994bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
995bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetTab(int win_handle,
996bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                       int tab_index,
997bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                       int* tab_handle) {
998bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *tab_handle = 0;
999bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(win_handle) && (tab_index >= 0)) {
1000bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(win_handle);
1001bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (tab_index < browser->tab_count()) {
1002201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      TabContents* tab_contents = browser->GetTabContentsAt(tab_index);
1003bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *tab_handle = tab_tracker_->Add(&tab_contents->controller());
1004bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1005bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1006bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1007bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1008bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetTabProcessID(int handle, int* process_id) {
1009bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *process_id = -1;
1010bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1011bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1012bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *process_id = 0;
1013bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab_contents =
1014bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        tab_tracker_->GetResource(handle)->tab_contents();
1015bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    RenderProcessHost* rph = tab_contents->GetRenderProcessHost();
1016bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (rph)
1017bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *process_id = base::GetProcId(rph->GetHandle());
1018bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1019bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1020bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1021bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetTabTitle(int handle,
1022bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                            int* title_string_size,
1023bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                            std::wstring* title) {
1024bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *title_string_size = -1;  // -1 is the error code
1025bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1026bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
1027bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationEntry* entry = tab->GetActiveEntry();
1028bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (entry != NULL) {
1029dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      *title = UTF16ToWideHack(entry->GetTitleForDisplay(""));
1030bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else {
1031bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *title = std::wstring();
1032bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1033bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *title_string_size = static_cast<int>(title->size());
1034bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1035bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1036bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1037bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetTabIndex(int handle, int* tabstrip_index) {
1038bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *tabstrip_index = -1;  // -1 is the error code
1039bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1040bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1041bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
1042bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = Browser::GetBrowserForController(tab, NULL);
1043bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *tabstrip_index = browser->tabstrip_model()->GetIndexOfController(tab);
1044bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1045bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1046bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1047bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetTabURL(int handle,
1048bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                          bool* success,
1049bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                          GURL* url) {
1050bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1051bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1052bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
1053bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Return what the user would see in the location bar.
1054bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *url = tab->GetActiveEntry()->virtual_url();
1055bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1056bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1057bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1058bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1059bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetShelfVisibility(int handle, bool* visible) {
1060bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *visible = false;
1061bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1062bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1063bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1064bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
1065ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS)
1066ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      *visible = ActiveDownloadsUI::GetPopup(browser->profile());
1067ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#else
1068bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *visible = browser->window()->IsDownloadShelfVisible();
1069bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
1070ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1071bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1072bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1073bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1074bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::IsFullscreen(int handle, bool* visible) {
1075bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *visible = false;
1076bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1077bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1078bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1079bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser)
1080bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *visible = browser->window()->IsFullscreen();
1081bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1082bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1083bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1084bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetFullscreenBubbleVisibility(int handle,
1085bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                              bool* visible) {
1086bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *visible = false;
1087bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1088bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1089bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1090bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser)
1091bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *visible = browser->window()->IsFullscreenBubbleVisible();
1092bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1093bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1094bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1095bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetAutocompleteEditText(
1096bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int autocomplete_edit_handle,
1097bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* success,
109872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    string16* text) {
1099bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (autocomplete_edit_tracker_->ContainsHandle(autocomplete_edit_handle)) {
1101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *text = autocomplete_edit_tracker_->GetResource(autocomplete_edit_handle)->
1102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        GetText();
1103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetAutocompleteEditText(
1108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int autocomplete_edit_handle,
110972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16& text,
1110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* success) {
1111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (autocomplete_edit_tracker_->ContainsHandle(autocomplete_edit_handle)) {
1113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    autocomplete_edit_tracker_->GetResource(autocomplete_edit_handle)->
1114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        SetUserText(text);
1115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::AutocompleteEditGetMatches(
1120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int autocomplete_edit_handle,
1121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* success,
1122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    std::vector<AutocompleteMatchData>* matches) {
1123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (autocomplete_edit_tracker_->ContainsHandle(autocomplete_edit_handle)) {
1125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const AutocompleteResult& result = autocomplete_edit_tracker_->
1126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        GetResource(autocomplete_edit_handle)->model()->result();
1127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    for (AutocompleteResult::const_iterator i = result.begin();
1128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        i != result.end(); ++i)
1129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      matches->push_back(AutocompleteMatchData(*i));
1130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Waits for the autocomplete edit to receive focus
1135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid  TestingAutomationProvider::WaitForAutocompleteEditFocus(
1136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int autocomplete_edit_handle,
1137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
1138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!autocomplete_edit_tracker_->ContainsHandle(autocomplete_edit_handle)) {
1139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_WaitForAutocompleteEditFocus::WriteReplyParams(
1140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        reply_message_, false);
1141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message);
1142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutocompleteEditModel* model = autocomplete_edit_tracker_->
1146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetResource(autocomplete_edit_handle)-> model();
1147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (model->has_focus()) {
1148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_WaitForAutocompleteEditFocus::WriteReplyParams(
1149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        reply_message, true);
1150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message);
1151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The observer deletes itself when the notification arrives.
1155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  new AutocompleteEditFocusedObserver(this, model, reply_message);
1156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetAutocompleteEditForBrowser(
1159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int browser_handle,
1160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* success,
1161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int* autocomplete_edit_handle) {
1162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *autocomplete_edit_handle = 0;
1164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(browser_handle)) {
1166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(browser_handle);
1167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LocationBar* loc_bar = browser->window()->GetLocationBar();
1168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutocompleteEditView* edit_view = loc_bar->location_entry();
1169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Add() returns the existing handle for the resource if any.
1170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *autocomplete_edit_handle = autocomplete_edit_tracker_->Add(edit_view);
1171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::AutocompleteEditIsQueryInProgress(
1176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int autocomplete_edit_handle,
1177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* success,
1178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* query_in_progress) {
1179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *query_in_progress = false;
1181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (autocomplete_edit_tracker_->ContainsHandle(autocomplete_edit_handle)) {
1182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    *query_in_progress = !autocomplete_edit_tracker_->
1183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        GetResource(autocomplete_edit_handle)->model()->
1184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        autocomplete_controller()->done();
1185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ExecuteJavascript(
1190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
1191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::wstring& frame_xpath,
1192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::wstring& script,
1193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
1194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents = GetTabContentsForHandle(handle, NULL);
119521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!tab_contents) {
1196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_DomOperation::WriteReplyParams(reply_message, std::string());
1197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message);
119821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return;
1199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
120021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
120121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Set the routing id of this message with the controller.
120221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // This routing id needs to be remembered for the reverse
120321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // communication while sending back the response of
120421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // this javascript execution.
120572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string set_automation_id;
120621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  base::SStringPrintf(&set_automation_id,
120772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                      "window.domAutomationController.setAutomationId(%d);",
120821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                      reply_message->routing_id());
120921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  new DomOperationMessageSender(this, reply_message, false);
121121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  tab_contents->render_view_host()->ExecuteJavascriptInWebFrame(
121272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      WideToUTF16Hack(frame_xpath), UTF8ToUTF16(set_automation_id));
121321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  tab_contents->render_view_host()->ExecuteJavascriptInWebFrame(
121472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      WideToUTF16Hack(frame_xpath), WideToUTF16Hack(script));
1215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetConstrainedWindowCount(int handle,
1218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                          int* count) {
1219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *count = -1;  // -1 is the error code
1220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
122121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    NavigationController* nav_controller = tab_tracker_->GetResource(handle);
122221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    TabContents* tab_contents = nav_controller->tab_contents();
122321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (tab_contents)
122421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      *count = static_cast<int>(tab_contents->child_windows_.size());
1225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::HandleInspectElementRequest(
1229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle, int x, int y, IPC::Message* reply_message) {
1230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents = GetTabContentsForHandle(handle, NULL);
1231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_contents) {
1232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(!reply_message_);
1233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply_message_ = reply_message;
1234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DevToolsManager::GetInstance()->InspectElement(
1236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        tab_contents->render_view_host(), x, y);
1237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
1238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_InspectElement::WriteReplyParams(reply_message, -1);
1239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message);
1240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetDownloadDirectory(
1244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle, FilePath* download_directory) {
1245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
1247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DownloadManager* dlm = tab->profile()->GetDownloadManager();
1248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *download_directory = dlm->download_prefs()->download_path();
1249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::OpenNewBrowserWindowOfType(
1253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int type, bool show, IPC::Message* reply_message) {
1254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  new BrowserOpenedNotificationObserver(this, reply_message);
1255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // We may have no current browser windows open so don't rely on
1256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // asking an existing browser to execute the IDC_NEWWINDOW command
1257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Browser* browser = new Browser(static_cast<Browser::Type>(type), profile_);
1258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser->InitBrowserWindow();
1259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser->AddBlankTab(true);
1260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (show)
1261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser->window()->Show();
1262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetWindowForBrowser(int browser_handle,
1265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    bool* success,
1266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    int* handle) {
1267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *handle = 0;
1269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(browser_handle)) {
1271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(browser_handle);
1272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gfx::NativeWindow win = browser->window()->GetNativeHandle();
1273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Add() returns the existing handle for the resource if any.
1274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *handle = window_tracker_->Add(win);
1275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetBrowserForWindow(int window_handle,
1280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    bool* success,
1281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    int* browser_handle) {
1282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *browser_handle = 0;
1284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::NativeWindow window = window_tracker_->GetResource(window_handle);
1286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!window)
1287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  BrowserList::const_iterator iter = BrowserList::begin();
1290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (;iter != BrowserList::end(); ++iter) {
1291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gfx::NativeWindow this_window = (*iter)->window()->GetNativeHandle();
1292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (window == this_window) {
1293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Add() returns the existing handle for the resource if any.
1294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *browser_handle = browser_tracker_->Add(*iter);
1295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *success = true;
1296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
1297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ShowInterstitialPage(
1302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int tab_handle,
1303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::string& html_text,
1304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
1305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(tab_handle)) {
1306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* controller = tab_tracker_->GetResource(tab_handle);
1307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab_contents = controller->tab_contents();
1308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
130972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    new NavigationNotificationObserver(controller, this, reply_message, 1,
1310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       false, false);
131172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationInterstitialPage* interstitial =
1313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        new AutomationInterstitialPage(tab_contents,
1314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                       GURL("about:interstitial"),
1315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                       html_text);
1316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    interstitial->Show();
1317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_ShowInterstitialPage::WriteReplyParams(
1321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
1322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
1323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::HideInterstitialPage(int tab_handle,
1326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     bool* success) {
1327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents = GetTabContentsForHandle(tab_handle, NULL);
1329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_contents && tab_contents->interstitial_page()) {
1330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    tab_contents->interstitial_page()->DontProceed();
1331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WaitForTabToBeRestored(
1336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int tab_handle,
1337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
1338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(tab_handle)) {
1339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(tab_handle);
1340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    restore_tracker_.reset(
1341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        new NavigationControllerRestoredObserver(this, tab, reply_message));
134272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else {
134372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    AutomationMsg_WaitForTabToBeRestored::WriteReplyParams(
134472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        reply_message, false);
134572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    Send(reply_message);
1346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetSecurityState(int handle,
1350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 bool* success,
1351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 SecurityStyle* security_style,
1352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 int* ssl_cert_status,
1353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 int* insecure_content_status) {
1354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
1356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationEntry* entry = tab->GetActiveEntry();
1357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *security_style = entry->ssl().security_style();
1359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *ssl_cert_status = entry->ssl().cert_status();
1360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *insecure_content_status = entry->ssl().content_status();
1361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
1362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = false;
1363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *security_style = SECURITY_STYLE_UNKNOWN;
1364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *ssl_cert_status = 0;
1365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *insecure_content_status = 0;
1366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetPageType(
1370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
1371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* success,
13724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    PageType* page_type) {
1373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
1375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationEntry* entry = tab->GetActiveEntry();
1376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *page_type = entry->page_type();
1377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // In order to return the proper result when an interstitial is shown and
1379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // no navigation entry were created for it we need to ask the TabContents.
13804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    if (*page_type == NORMAL_PAGE &&
1381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        tab->tab_contents()->showing_interstitial_page())
13824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      *page_type = INTERSTITIAL_PAGE;
1383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
1384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = false;
13854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    *page_type = NORMAL_PAGE;
1386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetMetricEventDuration(
1390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::string& event_name,
1391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int* duration_ms) {
1392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *duration_ms = metric_event_duration_observer_->GetEventDurationMs(
1393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      event_name);
1394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ActionOnSSLBlockingPage(
1397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
1398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool proceed,
1399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
1400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
1402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationEntry* entry = tab->GetActiveEntry();
14034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    if (entry->page_type() == INTERSTITIAL_PAGE) {
1404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      TabContents* tab_contents = tab->tab_contents();
1405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      InterstitialPage* ssl_blocking_page =
1406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          InterstitialPage::GetInterstitialPage(tab_contents);
1407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (ssl_blocking_page) {
1408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        if (proceed) {
140972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          new NavigationNotificationObserver(tab, this, reply_message, 1,
1410dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                             false, false);
1411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          ssl_blocking_page->Proceed();
1412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          return;
1413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        }
1414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        ssl_blocking_page->DontProceed();
1415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        AutomationMsg_ActionOnSSLBlockingPage::WriteReplyParams(
1416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            reply_message, AUTOMATION_MSG_NAVIGATION_SUCCESS);
1417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        Send(reply_message);
1418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        return;
1419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // We failed.
1423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_ActionOnSSLBlockingPage::WriteReplyParams(
1424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
1425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
1426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::BringBrowserToFront(int browser_handle,
1429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    bool* success) {
143021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  *success = false;
1431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(browser_handle)) {
1432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(browser_handle);
1433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser->window()->Activate();
1434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::IsMenuCommandEnabled(int browser_handle,
1439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     int message_num,
1440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     bool* menu_item_enabled) {
144121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  *menu_item_enabled = false;
1442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(browser_handle)) {
1443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(browser_handle);
1444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *menu_item_enabled =
1445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        browser->command_updater()->IsCommandEnabled(message_num);
1446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::PrintNow(int tab_handle,
1450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                         IPC::Message* reply_message) {
1451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NavigationController* tab = NULL;
1452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents = GetTabContentsForHandle(tab_handle, &tab);
1453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_contents) {
1454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FindAndActivateTab(tab);
145572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
145672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    NotificationObserver* observer =
145772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        new DocumentPrintedNotificationObserver(this, reply_message);
145872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TabContentsWrapper* wrapper =
1460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        TabContentsWrapper::GetCurrentWrapperForContents(tab_contents);
1461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!wrapper->print_view_manager()->PrintNow()) {
146272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // Clean up the observer. It will send the reply message.
146372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      delete observer;
146472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
146572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
146672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Return now to avoid sending reply message twice.
146772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
1468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
146972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_PrintNow::WriteReplyParams(reply_message, false);
1471bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
1472bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1473bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1474bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SavePage(int tab_handle,
1475bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                         const FilePath& file_name,
1476bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                         const FilePath& dir_path,
1477bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                         int type,
1478bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                         bool* success) {
147921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  SavePackage::SavePackageType save_type =
148021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      static_cast<SavePackage::SavePackageType>(type);
148121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (save_type < SavePackage::SAVE_AS_ONLY_HTML ||
148221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      save_type > SavePackage::SAVE_AS_COMPLETE_HTML) {
148321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    *success = false;
148421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return;
148521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
148621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1487bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!tab_tracker_->ContainsHandle(tab_handle)) {
1488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = false;
1489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1490bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1491bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1492bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NavigationController* nav = tab_tracker_->GetResource(tab_handle);
1493bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Browser* browser = FindAndActivateTab(nav);
1494bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!browser->command_updater()->IsCommandEnabled(IDC_SAVE_PAGE)) {
1495bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = false;
1496bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1497bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1498bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContentsWrapper* wrapper =
1500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      TabContentsWrapper::GetCurrentWrapperForContents(nav->tab_contents());
1501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  wrapper->download_tab_helper()->SavePage(file_name, dir_path, save_type);
1502bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = true;
1503bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::HandleOpenFindInPageRequest(
1506bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const IPC::Message& message, int handle) {
1507bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1508bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1509bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser->FindInPage(false, false);
1510bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1511bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetFindWindowVisibility(int handle,
1514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                        bool* visible) {
1515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *visible = false;
1516bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Browser* browser = browser_tracker_->GetResource(handle);
1517bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser) {
1518bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FindBarTesting* find_bar =
1519bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        browser->GetFindBarController()->find_bar()->GetFindBarTesting();
1520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    find_bar->GetFindBarWindowInfo(NULL, visible);
1521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1522bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1523bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1524bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::HandleFindWindowLocationRequest(int handle,
1525bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                                int* x,
1526bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                                int* y) {
1527bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Point position(0, 0);
1528bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool visible = false;
1529bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1530bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     Browser* browser = browser_tracker_->GetResource(handle);
1531bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     FindBarTesting* find_bar =
1532bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       browser->GetFindBarController()->find_bar()->GetFindBarTesting();
1533bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     find_bar->GetFindBarWindowInfo(&position, &visible);
1534bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1535bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1536bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *x = position.x();
1537bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *y = position.y();
1538bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1539bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1540bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Bookmark bar visibility is based on the pref (e.g. is it in the toolbar).
1541bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Presence in the NTP is NOT considered visible by this call.
1542bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetBookmarkBarVisibility(int handle,
1543bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                         bool* visible,
1544bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                         bool* animating) {
1545bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *visible = false;
1546bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *animating = false;
1547bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1548bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1549bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1550bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
1551bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if 0  // defined(TOOLKIT_VIEWS) && defined(OS_LINUX)
1552bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // TODO(jrg): Was removed in rev43789 for perf. Need to investigate.
1553bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1554bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // IsBookmarkBarVisible() line looks correct but is not
1555bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // consistent across platforms.  Specifically, on Mac/Linux, it
1556bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // returns false if the bar is hidden in a pref (even if visible
1557bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // on the NTP).  On ChromeOS, it returned true if on NTP
1558bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // independent of the pref.  Making the code more consistent
1559bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // caused a perf bot regression on Windows (which shares views).
1560bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // See http://crbug.com/40225
1561bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *visible = browser->profile()->GetPrefs()->GetBoolean(
1562bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          prefs::kShowBookmarkBar);
1563bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
1564bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *visible = browser->window()->IsBookmarkBarVisible();
1565bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
1566bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *animating = browser->window()->IsBookmarkBarAnimating();
1567bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1568bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1569bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1570bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1571bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetBookmarksAsJSON(
1572bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
1573bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    std::string* bookmarks_as_json,
1574bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool *success) {
1575bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1576bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1577bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1578bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
1579bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (!browser->profile()->GetBookmarkModel()->IsLoaded()) {
1580bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        return;
1581bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1582513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      scoped_refptr<BookmarkStorage> storage(new BookmarkStorage(
1583bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          browser->profile(),
1584513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          browser->profile()->GetBookmarkModel()));
1585bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *success = storage->SerializeData(bookmarks_as_json);
1586bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1587bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1588bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1589bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1590bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WaitForBookmarkModelToLoad(
1591bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
1592bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
1593bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1594bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1595bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    BookmarkModel* model = browser->profile()->GetBookmarkModel();
1596bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (model->IsLoaded()) {
1597bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      AutomationMsg_WaitForBookmarkModelToLoad::WriteReplyParams(
1598bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          reply_message, true);
1599bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      Send(reply_message);
1600bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else {
1601bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // The observer will delete itself when done.
1602bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new AutomationProviderBookmarkModelObserver(this, reply_message,
1603bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                  model);
1604bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1605bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1606bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1607bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1608bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::AddBookmarkGroup(int handle,
1609bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 int64 parent_id,
1610bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 int index,
1611bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 std::wstring title,
1612bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 bool* success) {
1613bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1614bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1615bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
1616bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      BookmarkModel* model = browser->profile()->GetBookmarkModel();
1617bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (!model->IsLoaded()) {
1618bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        *success = false;
1619bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        return;
1620bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1621bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      const BookmarkNode* parent = model->GetNodeByID(parent_id);
1622bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DCHECK(parent);
1623bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (parent) {
1624ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const BookmarkNode* child = model->AddFolder(parent, index,
1625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     WideToUTF16Hack(title));
1626bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        DCHECK(child);
1627bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        if (child)
1628bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          *success = true;
1629bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1630bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1631bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1632bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1633bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1634bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1635bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::AddBookmarkURL(int handle,
1636bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               int64 parent_id,
1637bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               int index,
1638bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               std::wstring title,
1639bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               const GURL& url,
1640bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               bool* success) {
1641bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1642bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1643bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
1644bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      BookmarkModel* model = browser->profile()->GetBookmarkModel();
1645bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (!model->IsLoaded()) {
1646bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        *success = false;
1647bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        return;
1648bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1649bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      const BookmarkNode* parent = model->GetNodeByID(parent_id);
1650bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DCHECK(parent);
1651bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (parent) {
1652bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        const BookmarkNode* child = model->AddURL(parent, index,
1653bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                  WideToUTF16Hack(title), url);
1654bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        DCHECK(child);
1655bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        if (child)
1656bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          *success = true;
1657bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1658bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1659bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1660bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1661bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1662bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1663bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ReparentBookmark(int handle,
1664bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 int64 id,
1665bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 int64 new_parent_id,
1666bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 int index,
1667bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 bool* success) {
1668bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1669bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1670bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
1671bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      BookmarkModel* model = browser->profile()->GetBookmarkModel();
1672bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (!model->IsLoaded()) {
1673bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        *success = false;
1674bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        return;
1675bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1676bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      const BookmarkNode* node = model->GetNodeByID(id);
1677bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DCHECK(node);
1678bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      const BookmarkNode* new_parent = model->GetNodeByID(new_parent_id);
1679bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DCHECK(new_parent);
1680bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (node && new_parent) {
1681bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        model->Move(node, new_parent, index);
1682bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        *success = true;
1683bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1684bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1685bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1686bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1687bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1688bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1689bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetBookmarkTitle(int handle,
1690bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 int64 id,
1691bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 std::wstring title,
1692bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 bool* success) {
1693bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1694bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1695bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
1696bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      BookmarkModel* model = browser->profile()->GetBookmarkModel();
1697bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (!model->IsLoaded()) {
1698bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        *success = false;
1699bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        return;
1700bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1701bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      const BookmarkNode* node = model->GetNodeByID(id);
1702bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DCHECK(node);
1703bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (node) {
1704bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        model->SetTitle(node, WideToUTF16Hack(title));
1705bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        *success = true;
1706bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1707bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1708bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1709bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1710bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1711bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1712bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetBookmarkURL(int handle,
1713bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               int64 id,
1714bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               const GURL& url,
1715bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               bool* success) {
1716bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1717bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1718bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
1719bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      BookmarkModel* model = browser->profile()->GetBookmarkModel();
1720bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (!model->IsLoaded()) {
1721bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        *success = false;
1722bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        return;
1723bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1724bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      const BookmarkNode* node = model->GetNodeByID(id);
1725bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DCHECK(node);
1726bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (node) {
1727bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        model->SetURL(node, url);
1728bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        *success = true;
1729bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1730bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1731bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1732bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1733bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1734bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1735bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::RemoveBookmark(int handle,
1736bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               int64 id,
1737bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               bool* success) {
1738bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1739bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1740bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
1741bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      BookmarkModel* model = browser->profile()->GetBookmarkModel();
1742bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (!model->IsLoaded()) {
1743bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        *success = false;
1744bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        return;
1745bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1746bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      const BookmarkNode* node = model->GetNodeByID(id);
1747bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DCHECK(node);
1748bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (node) {
1749ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const BookmarkNode* parent = node->parent();
1750bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        DCHECK(parent);
1751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        model->Remove(parent, parent->GetIndexOf(node));
1752bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        *success = true;
1753bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1754bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1755bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1756bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1757bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1758bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
175972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TestingAutomationProvider::GetInfoBarCount(int handle, size_t* count) {
176072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  *count = static_cast<size_t>(-1);  // -1 means error.
1761bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1762bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* nav_controller = tab_tracker_->GetResource(handle);
1763bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (nav_controller)
176472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      *count = nav_controller->tab_contents()->infobar_count();
1765bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1766bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1767bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1768bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ClickInfoBarAccept(
1769bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
177072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    size_t info_bar_index,
1771bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool wait_for_navigation,
1772bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
1773bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool success = false;
1774bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1775bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* nav_controller = tab_tracker_->GetResource(handle);
1776bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (nav_controller) {
177772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (info_bar_index < nav_controller->tab_contents()->infobar_count()) {
1778bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        if (wait_for_navigation) {
177972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          new NavigationNotificationObserver(nav_controller, this,
1780dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                             reply_message, 1, false, false);
1781bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        }
1782bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        InfoBarDelegate* delegate =
1783bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            nav_controller->tab_contents()->GetInfoBarDelegateAt(
1784bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                info_bar_index);
1785bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        if (delegate->AsConfirmInfoBarDelegate())
1786bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          delegate->AsConfirmInfoBarDelegate()->Accept();
1787bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        success = true;
1788bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1789bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1790bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1791bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1792bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // This "!wait_for_navigation || !success condition" logic looks suspicious.
1793bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // It will send a failure message when success is true but
1794bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // |wait_for_navigation| is false.
1795bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // TODO(phajdan.jr): investgate whether the reply param (currently
1796bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // AUTOMATION_MSG_NAVIGATION_ERROR) should depend on success.
1797bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!wait_for_navigation || !success)
1798bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_ClickInfoBarAccept::WriteReplyParams(
1799bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
1800bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1801bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1802bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetLastNavigationTime(
1803bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
1804bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int64* last_navigation_time) {
1805bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::Time time(tab_tracker_->GetLastNavigationTime(handle));
1806bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *last_navigation_time = time.ToInternalValue();
1807bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1808bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1809bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WaitForNavigation(int handle,
1810bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                  int64 last_navigation_time,
1811bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                  IPC::Message* reply_message) {
1812bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NavigationController* controller = tab_tracker_->GetResource(handle);
1813bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::Time time(tab_tracker_->GetLastNavigationTime(handle));
1814bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1815bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (time.ToInternalValue() > last_navigation_time || !controller) {
1816bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_WaitForNavigation::WriteReplyParams(reply_message,
1817bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        controller == NULL ? AUTOMATION_MSG_NAVIGATION_ERROR :
1818bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                             AUTOMATION_MSG_NAVIGATION_SUCCESS);
1819bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message);
1820bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1821bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1822bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1823dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  new NavigationNotificationObserver(
1824dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      controller, this, reply_message, 1, true, false);
1825bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1826bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1827bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetIntPreference(int handle,
1828bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 const std::string& name,
1829bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 int value,
1830bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 bool* success) {
1831bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1832bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1833bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1834bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser->profile()->GetPrefs()->SetInteger(name.c_str(), value);
1835bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1836bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1837bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1838bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1839bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetStringPreference(int handle,
1840bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    const std::string& name,
1841bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    const std::string& value,
1842bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                    bool* success) {
1843bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1844bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1845bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1846bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser->profile()->GetPrefs()->SetString(name.c_str(), value);
1847bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1848bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1849bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1850bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1851bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetBooleanPreference(int handle,
1852bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     const std::string& name,
1853bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     bool* success,
1854bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     bool* value) {
1855bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1856bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *value = false;
1857bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1858bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1859bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *value = browser->profile()->GetPrefs()->GetBoolean(name.c_str());
1860bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1861bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1862bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1863bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1864bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetBooleanPreference(int handle,
1865bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     const std::string& name,
1866bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     bool value,
1867bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     bool* success) {
1868bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1869bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1870bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1871bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser->profile()->GetPrefs()->SetBoolean(name.c_str(), value);
1872bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
1873bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1874bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1875bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1876bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetShowingAppModalDialog(bool* showing_dialog,
1877bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                         int* dialog_button) {
1878731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AppModalDialog* active_dialog =
187921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      AppModalDialogQueue::GetInstance()->active_dialog();
1880731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!active_dialog) {
1881731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    *showing_dialog = false;
188272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    *dialog_button = ui::MessageBoxFlags::DIALOGBUTTON_NONE;
1883731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
1884731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1885731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NativeAppModalDialog* native_dialog = active_dialog->native_dialog();
1886bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *showing_dialog = (native_dialog != NULL);
1887bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (*showing_dialog)
1888bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *dialog_button = native_dialog->GetAppModalDialogButtons();
1889bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  else
189072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    *dialog_button = ui::MessageBoxFlags::DIALOGBUTTON_NONE;
1891bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1892bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1893bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ClickAppModalDialogButton(int button,
1894bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                          bool* success) {
1895bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
1896bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1897bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NativeAppModalDialog* native_dialog =
189821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      AppModalDialogQueue::GetInstance()->active_dialog()->native_dialog();
1899bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (native_dialog &&
1900bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      (native_dialog->GetAppModalDialogButtons() & button) == button) {
190172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if ((button & ui::MessageBoxFlags::DIALOGBUTTON_OK) ==
190272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        ui::MessageBoxFlags::DIALOGBUTTON_OK) {
1903bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      native_dialog->AcceptAppModalDialog();
1904bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *success =  true;
1905bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
190672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if ((button & ui::MessageBoxFlags::DIALOGBUTTON_CANCEL) ==
190772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        ui::MessageBoxFlags::DIALOGBUTTON_CANCEL) {
1908bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DCHECK(!*success) << "invalid param, OK and CANCEL specified";
1909bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      native_dialog->CancelAppModalDialog();
1910bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *success =  true;
1911bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1912bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1913bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1914bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1915bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WaitForBrowserWindowCountToBecome(
191672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int target_count,
191772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    IPC::Message* reply_message) {
1918bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (static_cast<int>(BrowserList::size()) == target_count) {
1919bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_WaitForBrowserWindowCountToBecome::WriteReplyParams(
1920bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        reply_message, true);
1921bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message);
1922bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1923bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1924bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1925bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Set up an observer (it will delete itself).
1926bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  new BrowserCountChangeNotificationObserver(target_count, this, reply_message);
1927bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1928bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1929bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WaitForAppModalDialogToBeShown(
1930bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
193121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (AppModalDialogQueue::GetInstance()->HasActiveDialog()) {
1932bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_WaitForAppModalDialogToBeShown::WriteReplyParams(
1933bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        reply_message, true);
1934bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message);
1935bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1936bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1937bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1938bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Set up an observer (it will delete itself).
1939bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  new AppModalDialogShownObserver(this, reply_message);
1940bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1941bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1942bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GoBackBlockUntilNavigationsComplete(
1943bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle, int number_of_navigations, IPC::Message* reply_message) {
1944bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1945bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
1946bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = FindAndActivateTab(tab);
1947bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser && browser->command_updater()->IsCommandEnabled(IDC_BACK)) {
194872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new NavigationNotificationObserver(tab, this, reply_message,
1949dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                         number_of_navigations, false, false);
1950bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      browser->GoBack(CURRENT_TAB);
1951bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
1952bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1953bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1954bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1955bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_GoBackBlockUntilNavigationsComplete::WriteReplyParams(
1956bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
1957bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
1958bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1959bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1960bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GoForwardBlockUntilNavigationsComplete(
1961bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle, int number_of_navigations, IPC::Message* reply_message) {
1962bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
1963bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* tab = tab_tracker_->GetResource(handle);
1964bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = FindAndActivateTab(tab);
1965bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser && browser->command_updater()->IsCommandEnabled(IDC_FORWARD)) {
196672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new NavigationNotificationObserver(tab, this, reply_message,
1967dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                         number_of_navigations, false, false);
1968bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      browser->GoForward(CURRENT_TAB);
1969bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
1970bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1971bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1972bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1973bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_GoForwardBlockUntilNavigationsComplete::WriteReplyParams(
1974bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
1975bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
1976bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1977bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1978bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SavePackageShouldPromptUser(
1979bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool should_prompt) {
1980bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SavePackage::SetShouldPromptUser(should_prompt);
1981bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1982bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1983bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetShelfVisibility(int handle, bool visible) {
1984bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
1985bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
1986bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser) {
1987ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS)
1988ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Browser* popup_browser =
1989ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          ActiveDownloadsUI::GetPopup(browser->profile());
1990ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!popup_browser && visible)
1991ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ActiveDownloadsUI::OpenPopup(browser->profile());
1992ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (popup_browser && !visible)
1993ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        popup_browser->CloseWindow();
1994ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#else
1995bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (visible)
1996bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        browser->window()->GetDownloadShelf()->Show();
1997bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      else
1998bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        browser->window()->GetDownloadShelf()->Close();
1999ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
2000bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
2001bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2002bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2003bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2004bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetBlockedPopupCount(int handle, int* count) {
2005bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *count = -1;  // -1 is the error code
2006bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(handle)) {
2007bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NavigationController* nav_controller = tab_tracker_->GetResource(handle);
2008bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      TabContents* tab_contents = nav_controller->tab_contents();
2009bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (tab_contents) {
2010731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        BlockedContentContainer* container =
2011731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            tab_contents->blocked_content_container();
2012bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        if (container) {
2013731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          *count = static_cast<int>(container->GetBlockedContentsCount());
2014bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        } else {
2015bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          // If we don't have a container, we don't have any blocked popups to
2016bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          // contain!
2017bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          *count = 0;
2018bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        }
2019bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
2020bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2021bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2022bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2023bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SendJSONRequest(int handle,
2024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                const std::string& json_request,
2025bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                IPC::Message* reply_message) {
2026bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<Value> values;
2027bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::JSONReader reader;
2028bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string error;
2029bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  values.reset(reader.ReadAndReturnError(json_request, true, NULL, &error));
2030bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!error.empty()) {
2031bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
2032bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2033bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2034bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2035bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Make sure input is a dict with a string command.
2036bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string command;
2037bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue* dict_value = NULL;
2038bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (values->GetType() != Value::TYPE_DICTIONARY) {
2039bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message).SendError("not a dict");
2040bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2041bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2042bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Ownership remains with "values" variable.
2043bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  dict_value = static_cast<DictionaryValue*>(values.get());
2044bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!dict_value->GetStringASCII(std::string("command"), &command)) {
2045dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
2046dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("no command key in dict or not a string command");
2047bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2048bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2049bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2050bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Map json commands to their handlers.
2051bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<std::string, JsonHandler> handler_map;
2052dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["WaitForAllTabsToStopLoading"] =
2053dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::WaitForAllTabsToStopLoading;
2054dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["GetIndicesFromTab"] =
2055dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::GetIndicesFromTab;
2056dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["NavigateToURL"] =
2057dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::NavigateToURL;
2058dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["ExecuteJavascript"] =
2059dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::ExecuteJavascriptJSON;
2060dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["GoForward"] =
2061dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::GoForward;
2062dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["GoBack"] =
2063dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::GoBack;
2064dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["Reload"] =
2065dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::ReloadJSON;
2066dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["GetTabURL"] =
2067dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::GetTabURLJSON;
2068dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["GetTabTitle"] =
2069dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::GetTabTitleJSON;
2070ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["CaptureEntirePage"] =
2071ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::CaptureEntirePageJSON;
2072dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["GetCookies"] =
2073dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::GetCookiesJSON;
2074dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["DeleteCookie"] =
2075dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::DeleteCookieJSON;
2076dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["SetCookie"] =
2077dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::SetCookieJSON;
2078dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["GetTabIds"] =
2079dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::GetTabIds;
2080dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["IsTabIdValid"] =
2081dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::IsTabIdValid;
2082dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["CloseTab"] =
2083dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::CloseTabJSON;
2084dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["WebkitMouseMove"] =
2085dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::WebkitMouseMove;
2086dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["WebkitMouseClick"] =
2087dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::WebkitMouseClick;
2088dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["WebkitMouseDrag"] =
2089dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::WebkitMouseDrag;
2090dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["SendWebkitKeyEvent"] =
2091dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::SendWebkitKeyEvent;
2092ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["SendOSLevelKeyEventToTab"] =
2093ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::SendOSLevelKeyEventToTab;
2094dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  handler_map["ActivateTab"] =
2095dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::ActivateTabJSON;
2096ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["UpdateExtensionsNow"] =
2097ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::UpdateExtensionsNow;
2098ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["GetChromeDriverAutomationVersion"] =
2099ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::GetChromeDriverAutomationVersion;
210072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_CHROMEOS)
2101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["GetLoginInfo"] = &TestingAutomationProvider::GetLoginInfo;
210272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  handler_map["LoginAsGuest"] = &TestingAutomationProvider::LoginAsGuest;
210372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  handler_map["Login"] = &TestingAutomationProvider::Login;
2104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["LockScreen"] = &TestingAutomationProvider::LockScreen;
2106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["UnlockScreen"] = &TestingAutomationProvider::UnlockScreen;
2107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["SignoutInScreenLocker"] =
2108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::SignoutInScreenLocker;
2109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["GetBatteryInfo"] = &TestingAutomationProvider::GetBatteryInfo;
2111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["GetNetworkInfo"] = &TestingAutomationProvider::GetNetworkInfo;
2113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["NetworkScan"] = &TestingAutomationProvider::NetworkScan;
2114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["GetProxySettings"] =
2115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::GetProxySettings;
2116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["SetProxySettings"] =
2117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::SetProxySettings;
2118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["ConnectToWifiNetwork"] =
2119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::ConnectToWifiNetwork;
2120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["ConnectToHiddenWifiNetwork"] =
2121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::ConnectToHiddenWifiNetwork;
2122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["DisconnectFromWifiNetwork"] =
2123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::DisconnectFromWifiNetwork;
2124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["GetUpdateInfo"] = &TestingAutomationProvider::GetUpdateInfo;
2126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["UpdateCheck"] = &TestingAutomationProvider::UpdateCheck;
2127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handler_map["SetReleaseTrack"] = &TestingAutomationProvider::SetReleaseTrack;
212872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // defined(OS_CHROMEOS)
212972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
213072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::map<std::string, BrowserJsonHandler> browser_handler_map;
213172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["DisablePlugin"] =
213272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::DisablePlugin;
213372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["EnablePlugin"] =
213472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::EnablePlugin;
213572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetPluginsInfo"] =
213672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::GetPluginsInfo;
213772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
213872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetBrowserInfo"] =
213972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::GetBrowserInfo;
214072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
214172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetNavigationInfo"] =
2142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::GetNavigationInfo;
2143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
214472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["PerformActionOnInfobar"] =
2145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::PerformActionOnInfobar;
2146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
214772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetHistoryInfo"] =
214872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::GetHistoryInfo;
214972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["AddHistoryItem"] =
215072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::AddHistoryItem;
2151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
215272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetOmniboxInfo"] =
215372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::GetOmniboxInfo;
215472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["SetOmniboxText"] =
215572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::SetOmniboxText;
215672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["OmniboxAcceptInput"] =
2157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::OmniboxAcceptInput;
215872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["OmniboxMovePopupSelection"] =
2159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::OmniboxMovePopupSelection;
2160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
216172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetInstantInfo"] =
216272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::GetInstantInfo;
216321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
216472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["LoadSearchEngineInfo"] =
2165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      &TestingAutomationProvider::LoadSearchEngineInfo;
216672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetSearchEngineInfo"] =
2167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::GetSearchEngineInfo;
216872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["AddOrEditSearchEngine"] =
2169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      &TestingAutomationProvider::AddOrEditSearchEngine;
217072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["PerformActionOnSearchEngine"] =
2171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      &TestingAutomationProvider::PerformActionOnSearchEngine;
2172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
217372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetPrefsInfo"] =
217472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::GetPrefsInfo;
217572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["SetPrefs"] = &TestingAutomationProvider::SetPrefs;
2176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
217772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["SetWindowDimensions"] =
2178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::SetWindowDimensions;
2179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
218072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetDownloadsInfo"] =
2181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::GetDownloadsInfo;
218272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["WaitForAllDownloadsToComplete"] =
2183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::WaitForDownloadsToComplete;
218472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["PerformActionOnDownload"] =
2185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::PerformActionOnDownload;
2186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
218772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetInitialLoadTimes"] =
2188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::GetInitialLoadTimes;
2189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
219072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["SaveTabContents"] =
219172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::SaveTabContents;
2192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
219372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["ImportSettings"] =
219472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::ImportSettings;
2195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
219672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["AddSavedPassword"] =
2197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::AddSavedPassword;
219872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["RemoveSavedPassword"] =
2199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::RemoveSavedPassword;
220072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetSavedPasswords"] =
2201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::GetSavedPasswords;
2202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
220372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["ClearBrowsingData"] =
2204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::ClearBrowsingData;
2205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
220672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetBlockedPopupsInfo"] =
2207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      &TestingAutomationProvider::GetBlockedPopupsInfo;
220872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["UnblockAndLaunchBlockedPopup"] =
2209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      &TestingAutomationProvider::UnblockAndLaunchBlockedPopup;
2210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
2211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // SetTheme() implemented using InstallExtension().
221272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetThemeInfo"] =
221372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::GetThemeInfo;
2214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // InstallExtension() present in pyauto.py.
221672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetExtensionsInfo"] =
2217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::GetExtensionsInfo;
221872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["UninstallExtensionById"] =
2219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::UninstallExtensionById;
2220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
222172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["FindInPage"] = &TestingAutomationProvider::FindInPage;
2222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
222372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["SelectTranslateOption"] =
2224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::SelectTranslateOption;
222572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetTranslateInfo"] =
2226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &TestingAutomationProvider::GetTranslateInfo;
2227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser_handler_map["GetAutofillProfile"] =
2229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::GetAutofillProfile;
2230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser_handler_map["FillAutofillProfile"] =
2231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::FillAutofillProfile;
2232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
223372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetActiveNotifications"] =
2234513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      &TestingAutomationProvider::GetActiveNotifications;
223572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["CloseNotification"] =
2236513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      &TestingAutomationProvider::CloseNotification;
223772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["WaitForNotificationCount"] =
2238513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      &TestingAutomationProvider::WaitForNotificationCount;
2239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
224072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["SignInToSync"] =
224172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &TestingAutomationProvider::SignInToSync;
224272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetSyncInfo"] = &TestingAutomationProvider::GetSyncInfo;
224372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["AwaitSyncCycleCompletion"] =
2244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      &TestingAutomationProvider::AwaitSyncCycleCompletion;
224572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["EnableSyncForDatatypes"] =
2246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      &TestingAutomationProvider::EnableSyncForDatatypes;
224772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["DisableSyncForDatatypes"] =
2248513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      &TestingAutomationProvider::DisableSyncForDatatypes;
2249513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
225072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["GetNTPInfo"] =
2251201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      &TestingAutomationProvider::GetNTPInfo;
225272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["MoveNTPMostVisitedThumbnail"] =
2253201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      &TestingAutomationProvider::MoveNTPMostVisitedThumbnail;
225472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["RemoveNTPMostVisitedThumbnail"] =
2255201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      &TestingAutomationProvider::RemoveNTPMostVisitedThumbnail;
225672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["UnpinNTPMostVisitedThumbnail"] =
2257201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      &TestingAutomationProvider::UnpinNTPMostVisitedThumbnail;
225872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["RestoreAllNTPMostVisitedThumbnails"] =
2259201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      &TestingAutomationProvider::RestoreAllNTPMostVisitedThumbnails;
2260201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
226172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser_handler_map["KillRendererProcess"] =
226221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      &TestingAutomationProvider::KillRendererProcess;
226321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
2264dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  browser_handler_map["GetNTPThumbnailMode"] =
2265dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::GetNTPThumbnailMode;
2266dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  browser_handler_map["SetNTPThumbnailMode"] =
2267dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::SetNTPThumbnailMode;
2268dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  browser_handler_map["GetNTPMenuMode"] =
2269dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::GetNTPMenuMode;
2270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  browser_handler_map["SetNTPMenuMode"] =
2271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &TestingAutomationProvider::SetNTPMenuMode;
227272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser_handler_map["LaunchApp"] = &TestingAutomationProvider::LaunchApp;
2274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser_handler_map["SetAppLaunchType"] =
2275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &TestingAutomationProvider::SetAppLaunchType;
2276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (handler_map.find(std::string(command)) != handler_map.end()) {
227872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    (this->*handler_map[command])(dict_value, reply_message);
227972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (browser_handler_map.find(std::string(command)) !=
228072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             browser_handler_map.end()) {
228172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    Browser* browser = NULL;
228272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (!browser_tracker_->ContainsHandle(handle) ||
228372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        !(browser = browser_tracker_->GetResource(handle))) {
228472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      AutomationJSONReply(this, reply_message).SendError("No browser object.");
228572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
228672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
228772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    (this->*browser_handler_map[command])(browser, dict_value, reply_message);
2288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
2289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    std::string error_string = "Unknown command. Options: ";
2290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    for (std::map<std::string, JsonHandler>::const_iterator it =
2291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen         handler_map.begin(); it != handler_map.end(); ++it) {
2292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      error_string += it->first + ", ";
2293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
229472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    for (std::map<std::string, BrowserJsonHandler>::const_iterator it =
229572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen         browser_handler_map.begin(); it != browser_handler_map.end(); ++it) {
229672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      error_string += it->first + ", ";
229772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
2298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(error_string);
2299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "SetWindowDimensions",
2303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "x": 20,         # optional
2304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "y": 20,         # optional
2305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "width": 800,    # optional
2306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "height": 600 }  # optional
2307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetWindowDimensions(
2308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
2309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
2310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
2311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Rect rect = browser->window()->GetRestoredBounds();
2312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int x, y, width, height;
2313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (args->GetInteger("x", &x))
2314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    rect.set_x(x);
2315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (args->GetInteger("y", &y))
2316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    rect.set_y(y);
2317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (args->GetInteger("width", &width))
2318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    rect.set_width(width);
2319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (args->GetInteger("height", &height))
2320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    rect.set_height(height);
2321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser->window()->SetBounds(rect);
2322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(NULL);
2323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenListValue* TestingAutomationProvider::GetInfobarsInfo(TabContents* tc) {
2326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Each infobar may have different properties depending on the type.
2327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* infobars = new ListValue;
232872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (size_t i = 0; i < tc->infobar_count(); ++i) {
2329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* infobar_item = new DictionaryValue;
233072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    InfoBarDelegate* infobar = tc->GetInfoBarDelegateAt(i);
2331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (infobar->AsConfirmInfoBarDelegate()) {
2332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Also covers ThemeInstalledInfoBarDelegate.
2333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->SetString("type", "confirm_infobar");
2334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ConfirmInfoBarDelegate* confirm_infobar =
2335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        infobar->AsConfirmInfoBarDelegate();
2336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->SetString("text", confirm_infobar->GetMessageText());
2337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->SetString("link_text", confirm_infobar->GetLinkText());
2338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ListValue* buttons_list = new ListValue;
2339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      int buttons = confirm_infobar->GetButtons();
234072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (buttons & ConfirmInfoBarDelegate::BUTTON_OK) {
2341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        StringValue* button_label = new StringValue(
2342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            confirm_infobar->GetButtonLabel(
2343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              ConfirmInfoBarDelegate::BUTTON_OK));
2344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        buttons_list->Append(button_label);
2345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
234672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (buttons & ConfirmInfoBarDelegate::BUTTON_CANCEL) {
2347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        StringValue* button_label = new StringValue(
2348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            confirm_infobar->GetButtonLabel(
2349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              ConfirmInfoBarDelegate::BUTTON_CANCEL));
2350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        buttons_list->Append(button_label);
2351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
2352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->Set("buttons", buttons_list);
2353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else if (infobar->AsLinkInfoBarDelegate()) {
2354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->SetString("type", "link_infobar");
2355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      LinkInfoBarDelegate* link_infobar = infobar->AsLinkInfoBarDelegate();
2356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->SetString("link_text", link_infobar->GetLinkText());
2357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else if (infobar->AsTranslateInfoBarDelegate()) {
2358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->SetString("type", "translate_infobar");
2359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      TranslateInfoBarDelegate* translate_infobar =
2360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          infobar->AsTranslateInfoBarDelegate();
2361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->SetString("original_lang_code",
2362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              translate_infobar->GetOriginalLanguageCode());
2363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->SetString("target_lang_code",
2364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              translate_infobar->GetTargetLanguageCode());
2365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else if (infobar->AsExtensionInfoBarDelegate()) {
2366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->SetString("type", "extension_infobar");
2367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else {
2368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      infobar_item->SetString("type", "unknown_infobar");
2369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
2370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    infobars->Append(infobar_item);
2371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return infobars;
2373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "PerformActionOnInfobar",
2376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "action": "dismiss",
2377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "infobar_index": 0,
2378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "tab_index": 0 }
2379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample output: {}
2380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::PerformActionOnInfobar(
2381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
2382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
2383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
2384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
2385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int tab_index;
238672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int infobar_index_int;
2387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string action;
2388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetInteger("tab_index", &tab_index) ||
238972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      !args->GetInteger("infobar_index", &infobar_index_int) ||
2390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      !args->GetString("action", &action)) {
2391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("Invalid or missing args");
2392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents = browser->GetTabContentsAt(tab_index);
2395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!tab_contents) {
2396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError(StringPrintf("No such tab at index %d", tab_index));
2397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InfoBarDelegate* infobar = NULL;
240072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  size_t infobar_index = static_cast<size_t>(infobar_index_int);
240172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (infobar_index >= tab_contents->infobar_count() ||
2402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      !(infobar = tab_contents->GetInfoBarDelegateAt(infobar_index))) {
240372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    reply.SendError(StringPrintf("No such infobar at index %" PRIuS,
240472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                 infobar_index));
2405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if ("dismiss" == action) {
2408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    infobar->InfoBarDismissed();
2409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    tab_contents->RemoveInfoBar(infobar);
2410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendSuccess(NULL);
2411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if ("accept" == action || "cancel" == action) {
2414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ConfirmInfoBarDelegate* confirm_infobar;
2415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!(confirm_infobar = infobar->AsConfirmInfoBarDelegate())) {
2416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply.SendError("Not a confirm infobar");
2417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
2418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
2419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if ("accept" == action) {
2420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (confirm_infobar->Accept())
2421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        tab_contents->RemoveInfoBar(infobar);
2422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else if ("cancel" == action) {
2423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (confirm_infobar->Cancel())
2424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        tab_contents->RemoveInfoBar(infobar);
2425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
2426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendSuccess(NULL);
2427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendError("Invalid action");
2430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
2433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Task to get info about BrowserChildProcessHost. Must run on IO thread to
2435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// honor the semantics of BrowserChildProcessHost.
2436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Used by AutomationProvider::GetBrowserInfo().
2437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass GetChildProcessHostInfoTask : public Task {
2438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
2439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GetChildProcessHostInfoTask(base::WaitableEvent* event,
2440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              ListValue* child_processes)
2441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : event_(event),
2442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      child_processes_(child_processes) {}
2443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void Run() {
2445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
2446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    for (BrowserChildProcessHost::Iterator iter; !iter.Done(); ++iter) {
2447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Only add processes which are already started,
2448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // since we need their handle.
2449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if ((*iter)->handle() == base::kNullProcessHandle) {
2450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        continue;
2451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
2452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ChildProcessInfo* info = *iter;
2453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DictionaryValue* item = new DictionaryValue;
2454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      item->SetString("name", WideToUTF16Hack(info->name()));
2455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      item->SetString("type",
2456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      ChildProcessInfo::GetTypeNameInEnglish(info->type()));
2457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      item->SetInteger("pid", base::GetProcId(info->handle()));
2458bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      child_processes_->Append(item);
2459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
2460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    event_->Signal();
2461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
2464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::WaitableEvent* const event_;  // weak
2465bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* child_processes_;
2466bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2467bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(GetChildProcessHostInfoTask);
2468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
2469bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace
2471bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2472bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetBrowserInfo" }
2473bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer to GetBrowserInfo() in chrome/test/pyautolib/pyauto.py for
2474bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// sample json output.
2475bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetBrowserInfo(
2476bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
2477bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
2478bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
24794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  base::ThreadRestrictions::ScopedAllowIO allow_io;  // needed for PathService
2480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue* properties = new DictionaryValue;
2481bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  properties->SetString("ChromeVersion", chrome::kChromeVersion);
2482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  properties->SetString("BrowserProcessExecutableName",
248321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                        chrome::kBrowserProcessExecutableName);
2484bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  properties->SetString("HelperProcessExecutableName",
248521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                        chrome::kHelperProcessExecutableName);
2486bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  properties->SetString("BrowserProcessExecutablePath",
248721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                        chrome::kBrowserProcessExecutablePath);
2488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  properties->SetString("HelperProcessExecutablePath",
2489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        chrome::kHelperProcessExecutablePath);
2490bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  properties->SetString("command_line_string",
2491bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      CommandLine::ForCurrentProcess()->command_line_string());
2492bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FilePath dumps_path;
2493bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  PathService::Get(chrome::DIR_CRASH_DUMPS, &dumps_path);
2494bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  properties->SetString("DIR_CRASH_DUMPS", dumps_path.value());
2495bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2496bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string branding;
2497bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(GOOGLE_CHROME_BUILD)
2498bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  branding = "Google Chrome";
2499bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(CHROMIUM_BUILD)
2500bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  branding = "Chromium";
2501bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
2502bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  branding = "Unknown Branding";
2503bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
2504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  properties->SetString("branding", branding);
2505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2506bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
2507bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("properties", properties);
2508bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2509bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->SetInteger("browser_pid", base::GetCurrentProcId());
2510bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Add info about all windows in a list of dictionaries, one dictionary
2511bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // item per window.
2512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* windows = new ListValue;
2513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int windex = 0;
2514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (BrowserList::const_iterator it = BrowserList::begin();
2515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != BrowserList::end();
2516bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       ++it, ++windex) {
2517bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* browser_item = new DictionaryValue;
2518bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser = *it;
2519bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser_item->SetInteger("index", windex);
2520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Window properties
2521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    gfx::Rect rect = browser->window()->GetRestoredBounds();
2522bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser_item->SetInteger("x", rect.x());
2523bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser_item->SetInteger("y", rect.y());
2524bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser_item->SetInteger("width", rect.width());
2525bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser_item->SetInteger("height", rect.height());
2526bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser_item->SetBoolean("fullscreen",
2527bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                             browser->window()->IsFullscreen());
2528ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    browser_item->SetInteger("selected_tab", browser->active_index());
2529bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser_item->SetBoolean("incognito",
2530bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                             browser->profile()->IsOffTheRecord());
2531bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // For each window, add info about all tabs in a list of dictionaries,
2532bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // one dictionary item per tab.
2533bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ListValue* tabs = new ListValue;
2534bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    for (int i = 0; i < browser->tab_count(); ++i) {
2535bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      TabContents* tc = browser->GetTabContentsAt(i);
2536bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DictionaryValue* tab = new DictionaryValue;
2537bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      tab->SetInteger("index", i);
2538bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      tab->SetString("url", tc->GetURL().spec());
2539bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      tab->SetInteger("renderer_pid",
2540bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      base::GetProcId(tc->GetRenderProcessHost()->GetHandle()));
2541bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      tab->Set("infobars", GetInfobarsInfo(tc));
2542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab->SetBoolean("pinned", browser->IsTabPinned(i));
2543bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      tabs->Append(tab);
2544bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
2545bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser_item->Set("tabs", tabs);
2546bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2547bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    windows->Append(browser_item);
2548bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2549bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("windows", windows);
2550bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2551bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->SetString("child_process_path",
2552bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                          ChildProcessHost::GetChildPath(true).value());
2553bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Child processes are the processes for plugins and other workers.
2554bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Add all child processes in a list of dictionaries, one dictionary item
2555bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // per child process.
2556bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* child_processes = new ListValue;
2557bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::WaitableEvent event(true   /* manual reset */,
2558bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                            false  /* not initially signaled */);
2559731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  CHECK(BrowserThread::PostTask(
2560731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::IO, FROM_HERE,
2561bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new GetChildProcessHostInfoTask(&event, child_processes)));
2562bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  event.Wait();
2563bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("child_processes", child_processes);
2564bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2565bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Add all extension processes in a list of dictionaries, one dictionary
2566bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // item per extension process.
2567bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* extension_processes = new ListValue;
2568bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ProfileManager* profile_manager = g_browser_process->profile_manager();
2569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles());
2570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = 0; i < profiles.size(); ++i) {
2571bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ExtensionProcessManager* process_manager =
2572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        profiles[i]->GetExtensionProcessManager();
2573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!process_manager)
2574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      continue;
2575bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ExtensionProcessManager::const_iterator jt;
2576bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    for (jt = process_manager->begin(); jt != process_manager->end(); ++jt) {
2577bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ExtensionHost* ex_host = *jt;
2578bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Don't add dead extension processes.
2579bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (!ex_host->IsRenderViewLive())
2580bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        continue;
2581bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DictionaryValue* item = new DictionaryValue;
2582bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      item->SetString("name", ex_host->extension()->name());
2583bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      item->SetInteger(
2584bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          "pid",
2585bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          base::GetProcId(ex_host->render_process_host()->GetHandle()));
2586bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      extension_processes->Append(item);
2587bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
2588bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2589bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("extension_processes", extension_processes);
2590bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
2591bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2592bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2593bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetNavigationInfo" }
2594bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer to GetNavigationInfo() in chrome/test/pyautolib/pyauto.py for
2595bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// sample json output.
2596bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetNavigationInfo(
2597bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
2598bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
2599bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
2600bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
2601bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int tab_index;
2602bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents = NULL;
2603bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetInteger("tab_index", &tab_index) ||
2604bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      !(tab_contents = browser->GetTabContentsAt(tab_index))) {
2605bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("tab_index missing or invalid.");
2606bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2607bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2608bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
2609bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const NavigationController& controller = tab_contents->controller();
2610bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NavigationEntry* nav_entry = controller.GetActiveEntry();
2611bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(nav_entry);
2612bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2613bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Security info.
2614bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue* ssl = new DictionaryValue;
2615bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<SecurityStyle, std::string> style_to_string;
2616bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  style_to_string[SECURITY_STYLE_UNKNOWN] = "SECURITY_STYLE_UNKNOWN";
2617bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  style_to_string[SECURITY_STYLE_UNAUTHENTICATED] =
2618bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      "SECURITY_STYLE_UNAUTHENTICATED";
2619bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  style_to_string[SECURITY_STYLE_AUTHENTICATION_BROKEN] =
2620bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      "SECURITY_STYLE_AUTHENTICATION_BROKEN";
2621bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  style_to_string[SECURITY_STYLE_AUTHENTICATED] =
2622bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      "SECURITY_STYLE_AUTHENTICATED";
2623bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2624bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NavigationEntry::SSLStatus ssl_status = nav_entry->ssl();
2625bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ssl->SetString("security_style",
2626bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 style_to_string[ssl_status.security_style()]);
2627bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ssl->SetBoolean("ran_insecure_content", ssl_status.ran_insecure_content());
2628bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ssl->SetBoolean("displayed_insecure_content",
2629bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                  ssl_status.displayed_insecure_content());
2630bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("ssl", ssl);
2631bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2632bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Page type.
26334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::map<PageType, std::string> pagetype_to_string;
26344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  pagetype_to_string[NORMAL_PAGE] = "NORMAL_PAGE";
26354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  pagetype_to_string[ERROR_PAGE] = "ERROR_PAGE";
26364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  pagetype_to_string[INTERSTITIAL_PAGE] = "INTERSTITIAL_PAGE";
2637bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->SetString("page_type",
2638bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                          pagetype_to_string[nav_entry->page_type()]);
2639bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2640bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->SetString("favicon_url", nav_entry->favicon().url().spec());
2641bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(return_value.get());
2642bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2643bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2644bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetHistoryInfo",
2645bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "search_text": "some text" }
2646bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer chrome/test/pyautolib/history_info.py for sample json output.
2647bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetHistoryInfo(Browser* browser,
2648bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               DictionaryValue* args,
2649bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               IPC::Message* reply_message) {
2650bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  consumer_.CancelAllRequests();
2651bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2652bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 search_text;
2653bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  args->GetString("search_text", &search_text);
2654bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2655bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Fetch history.
2656bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
2657bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  history::QueryOptions options;
2658bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The observer owns itself.  It deletes itself after it fetches history.
2659bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationProviderHistoryObserver* history_observer =
2660bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new AutomationProviderHistoryObserver(this, reply_message);
2661bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  hs->QueryHistory(
2662bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      search_text,
2663bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      options,
2664bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &consumer_,
2665bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewCallback(history_observer,
2666bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                  &AutomationProviderHistoryObserver::HistoryQueryComplete));
2667bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2668bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2669bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "AddHistoryItem",
2670bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "item": { "URL": "http://www.google.com",
2671bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                                "title": "Google",   # optional
2672bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                                "time": 12345        # optional (time_t)
2673bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                               } }
2674bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer chrome/test/pyautolib/pyauto.py for details on input.
2675bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::AddHistoryItem(Browser* browser,
2676bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               DictionaryValue* args,
2677bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               IPC::Message* reply_message) {
2678bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue* item = NULL;
2679bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  args->GetDictionary("item", &item);
2680bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 url_text;
2681bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 title;
2682bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::Time time = base::Time::Now();
2683bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
2684bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2685bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!item->GetString("url", &url_text)) {
2686bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("bad args (no URL in dict?)");
2687bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2688bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2689bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GURL gurl(url_text);
2690bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  item->GetString("title", &title);  // Don't care if it fails.
2691bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int it;
2692bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  double dt;
2693bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (item->GetInteger("time", &it))
2694bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    time = base::Time::FromTimeT(it);
269572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  else if (item->GetDouble("time", &dt))
2696bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    time = base::Time::FromDoubleT(dt);
2697bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2698bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Ideas for "dummy" values (e.g. id_scope) came from
2699bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // chrome/browser/autocomplete/history_contents_provider_unittest.cc
2700bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
2701bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const void* id_scope = reinterpret_cast<void*>(1);
2702bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  hs->AddPage(gurl, time,
2703bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              id_scope,
2704bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              0,
2705bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              GURL(),
2706bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              PageTransition::LINK,
2707bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              history::RedirectList(),
2708bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              history::SOURCE_BROWSED,
2709bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              false);
2710bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (title.length())
2711bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    hs->SetPageTitle(gurl, title);
2712bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(NULL);
2713bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2714bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2715bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetDownloadsInfo" }
2716bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer chrome/test/pyautolib/download_info.py for sample json output.
2717bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetDownloadsInfo(Browser* browser,
2718bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 DictionaryValue* args,
2719bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                 IPC::Message* reply_message) {
2720bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
2721bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
2722bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* list_of_downloads = new ListValue;
2723ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (browser->profile()->HasCreatedDownloadManager()) {
2725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<DownloadItem*> downloads;
2726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    browser->profile()->GetDownloadManager()->
2727ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        GetAllDownloads(FilePath(), &downloads);
2728ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2729ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (std::vector<DownloadItem*>::iterator it = downloads.begin();
2730ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         it != downloads.end();
2731ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         it++) {  // Fill info about each download item.
2732ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      list_of_downloads->Append(GetDictionaryFromDownloadItem(*it));
2733ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2734bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2735bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("downloads", list_of_downloads);
2736bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(return_value.get());
2737bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2738bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2739bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WaitForDownloadsToComplete(
2740bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
2741bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
2742bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
2743bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2744bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Look for a quick return.
274572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!browser->profile()->HasCreatedDownloadManager()) {
274621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // No download manager.
274721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
2748bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2749bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2750bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<DownloadItem*> downloads;
275172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser->profile()->GetDownloadManager()->
275272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GetCurrentDownloads(FilePath(), &downloads);
2753bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (downloads.empty()) {
275421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
2755bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2756bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2757bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The observer owns itself.  When the last observed item pings, it
2758bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // deletes itself.
2759bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationProviderDownloadItemObserver* item_observer =
2760bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new AutomationProviderDownloadItemObserver(
2761bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          this, reply_message, downloads.size());
2762bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (std::vector<DownloadItem*>::iterator i = downloads.begin();
2763bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       i != downloads.end();
2764bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       i++) {
2765bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    (*i)->AddObserver(item_observer);
2766bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2767bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2768bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2769bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
2770bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2771bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenDownloadItem* GetDownloadItemFromId(int id, DownloadManager* download_manager) {
2772bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<DownloadItem*> downloads;
2773bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  download_manager->GetAllDownloads(FilePath(), &downloads);
2774bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DownloadItem* selected_item = NULL;
2775bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2776bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (std::vector<DownloadItem*>::iterator it = downloads.begin();
2777bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != downloads.end();
2778bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it++) {
2779bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DownloadItem* curr_item = *it;
2780bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (curr_item->id() == id) {
2781bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      selected_item = curr_item;
2782bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      break;
2783bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
2784bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2785bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return selected_item;
2786bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2787bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
278872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace
2789bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2790bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// See PerformActionOnDownload() in chrome/test/pyautolib/pyauto.py for sample
2791bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// json input and output.
2792bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::PerformActionOnDownload(
2793bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
2794bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
2795bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
2796bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int id;
2797bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string action;
2798bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
279972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!browser->profile()->HasCreatedDownloadManager()) {
2800bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message).SendError("No download manager.");
2801bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2802bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2803bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetInteger("id", &id) || !args->GetString("action", &action)) {
2804dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
2805dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("Must include int id and string action.");
2806bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2807bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2808bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
280972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DownloadManager* download_manager = browser->profile()->GetDownloadManager();
2810bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DownloadItem* selected_item = GetDownloadItemFromId(id, download_manager);
2811bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!selected_item) {
2812dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
2813dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError(StringPrintf("No download with an id of %d\n", id));
2814bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
2815bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2816bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2817bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (action == "open") {
2818bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_item->AddObserver(
2819bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        new AutomationProviderDownloadUpdatedObserver(
2820bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            this, reply_message, true));
2821bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_item->OpenDownload();
2822bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (action == "toggle_open_files_like_this") {
2823bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_item->OpenFilesBasedOnExtension(
2824bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        !selected_item->ShouldOpenFileBasedOnExtension());
2825bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
2826bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (action == "remove") {
2827bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    download_manager->AddObserver(
2828bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        new AutomationProviderDownloadModelChangedObserver(
2829bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            this, reply_message, download_manager));
2830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    selected_item->Remove();
2831bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (action == "decline_dangerous_download") {
2832bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    download_manager->AddObserver(
2833bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        new AutomationProviderDownloadModelChangedObserver(
2834bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            this, reply_message, download_manager));
2835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    selected_item->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD);
2836bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (action == "save_dangerous_download") {
2837bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_item->AddObserver(new AutomationProviderDownloadUpdatedObserver(
2838bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        this, reply_message, false));
2839bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_item->DangerousDownloadValidated();
2840bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (action == "toggle_pause") {
2841bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_item->AddObserver(new AutomationProviderDownloadUpdatedObserver(
2842bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        this, reply_message, false));
2843bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // This will still return if download has already completed.
2844bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_item->TogglePause();
2845bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (action == "cancel") {
2846bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_item->AddObserver(new AutomationProviderDownloadUpdatedObserver(
2847bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        this, reply_message, false));
2848bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_item->Cancel(true);
2849bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
2850dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
2851dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError(StringPrintf("Invalid action '%s' given.", action.c_str()));
2852bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2853bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2854bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2855731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Sample JSON input { "command": "LoadSearchEngineInfo" }
2856731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TestingAutomationProvider::LoadSearchEngineInfo(
2857bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
2858bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
2859bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
2860bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TemplateURLModel* url_model(profile_->GetTemplateURLModel());
2861bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (url_model->loaded()) {
2862731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
2863731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
2864731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2865731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  url_model->AddObserver(new AutomationProviderSearchEngineObserver(
2866731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      this, reply_message));
2867731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  url_model->Load();
2868731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
2869731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
2870731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Sample JSON input { "command": "GetSearchEngineInfo" }
2871731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Refer to pyauto.py for sample output.
2872731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TestingAutomationProvider::GetSearchEngineInfo(
2873731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Browser* browser,
2874731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DictionaryValue* args,
2875731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    IPC::Message* reply_message) {
2876731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TemplateURLModel* url_model(profile_->GetTemplateURLModel());
2877731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
2878731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ListValue* search_engines = new ListValue;
2879731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::vector<const TemplateURL*> template_urls = url_model->GetTemplateURLs();
2880731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (std::vector<const TemplateURL*>::const_iterator it =
2881731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick       template_urls.begin(); it != template_urls.end(); ++it) {
2882731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DictionaryValue* search_engine = new DictionaryValue;
288372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_engine->SetString("short_name", UTF16ToUTF8((*it)->short_name()));
288472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_engine->SetString("description", UTF16ToUTF8((*it)->description()));
288572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_engine->SetString("keyword", UTF16ToUTF8((*it)->keyword()));
2886731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    search_engine->SetBoolean("in_default_list", (*it)->ShowInDefaultList());
2887731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    search_engine->SetBoolean("is_default",
2888731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        (*it) == url_model->GetDefaultSearchProvider());
2889731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    search_engine->SetBoolean("is_valid", (*it)->url()->IsValid());
2890731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    search_engine->SetBoolean("supports_replacement",
2891731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              (*it)->url()->SupportsReplacement());
2892731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    search_engine->SetString("url", (*it)->url()->url());
2893731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    search_engine->SetString("host", (*it)->url()->GetHost());
2894731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    search_engine->SetString("path", (*it)->url()->GetPath());
2895731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    search_engine->SetString("display_url",
289672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             UTF16ToUTF8((*it)->url()->DisplayURL()));
2897731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    search_engines->Append(search_engine);
2898731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2899731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return_value->Set("search_engines", search_engines);
2900731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
2901731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
2902731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
2903731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Refer to pyauto.py for sample JSON input.
2904731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TestingAutomationProvider::AddOrEditSearchEngine(
2905731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Browser* browser,
2906731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DictionaryValue* args,
2907731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    IPC::Message* reply_message) {
2908731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TemplateURLModel* url_model(profile_->GetTemplateURLModel());
2909731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const TemplateURL* template_url;
2910731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  string16 new_title;
2911731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  string16 new_keyword;
2912731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string new_url;
2913731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string keyword;
2914731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!args->GetString("new_title", &new_title) ||
2915731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      !args->GetString("new_keyword", &new_keyword) ||
2916731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      !args->GetString("new_url", &new_url)) {
2917dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
2918dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("One or more inputs invalid");
2919731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
2920731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2921731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string new_ref_url = TemplateURLRef::DisplayURLToURLRef(
292272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      UTF8ToUTF16(new_url));
2923731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_ptr<KeywordEditorController> controller(
2924731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new KeywordEditorController(profile_));
2925731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (args->GetString("keyword", &keyword)) {
292672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    template_url = url_model->GetTemplateURLForKeyword(UTF8ToUTF16(keyword));
2927731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (template_url == NULL) {
2928dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      AutomationJSONReply(this, reply_message)
2929dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          .SendError(StringPrintf("No match for keyword: %s", keyword.c_str()));
2930731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return;
2931731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
2932731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    url_model->AddObserver(new AutomationProviderSearchEngineObserver(
2933731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        this, reply_message));
2934731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    controller->ModifyTemplateURL(template_url, new_title, new_keyword,
2935731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  new_ref_url);
2936bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
2937bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    url_model->AddObserver(new AutomationProviderSearchEngineObserver(
2938731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        this, reply_message));
2939731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    controller->AddTemplateURL(new_title, new_keyword, new_ref_url);
2940731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2941731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
2942731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
2943731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Sample json input: { "command": "PerformActionOnSearchEngine",
2944731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//                      "keyword": keyword, "action": action }
2945731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TestingAutomationProvider::PerformActionOnSearchEngine(
2946731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Browser* browser,
2947731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DictionaryValue* args,
2948731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    IPC::Message* reply_message) {
2949731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TemplateURLModel* url_model(profile_->GetTemplateURLModel());
2950731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string keyword;
2951731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string action;
2952731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!args->GetString("keyword", &keyword) ||
2953731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      !args->GetString("action", &action)) {
2954731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AutomationJSONReply(this, reply_message).SendError(
2955731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        "One or more inputs invalid");
2956731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
2957731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2958731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const TemplateURL* template_url(
295972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      url_model->GetTemplateURLForKeyword(UTF8ToUTF16(keyword)));
2960731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (template_url == NULL) {
2961dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
2962dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError(StringPrintf("No match for keyword: %s", keyword.c_str()));
2963731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
2964731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2965731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (action == "delete") {
2966731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    url_model->AddObserver(new AutomationProviderSearchEngineObserver(
2967731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      this, reply_message));
2968731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    url_model->Remove(template_url);
2969731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  } else if (action == "default") {
2970731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    url_model->AddObserver(new AutomationProviderSearchEngineObserver(
2971bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      this, reply_message));
2972731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    url_model->SetDefaultSearchProvider(template_url);
2973731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  } else {
2974dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
2975dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError(StringPrintf("Invalid action: %s", action.c_str()));
2976bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
2977bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2978bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2979bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetPrefsInfo" }
2980bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer chrome/test/pyautolib/prefs_info.py for sample json output.
2981bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetPrefsInfo(Browser* browser,
2982bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                             DictionaryValue* args,
2983bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                             IPC::Message* reply_message) {
298472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* items = profile_->GetPrefs()->GetPreferenceValues();
298572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2986bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
2987bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("prefs", items);  // return_value owns items.
2988bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
2989bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
2990bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2991bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "SetPrefs", "path": path, "value": value }
2992bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetPrefs(Browser* browser,
2993bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                         DictionaryValue* args,
2994bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                         IPC::Message* reply_message) {
2995bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string path;
2996bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Value* val;
2997bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
2998bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (args->GetString("path", &path) && args->Get("value", &val)) {
2999bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    PrefService* pref_service = profile_->GetPrefs();
3000bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const PrefService::Preference* pref =
3001bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        pref_service->FindPreference(path.c_str());
3002bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!pref) {  // Not a registered pref.
3003bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply.SendError("pref not registered.");
3004bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3005bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else if (pref->IsManaged()) {  // Do not attempt to change a managed pref.
3006bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply.SendError("pref is managed. cannot be changed.");
3007bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3008bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else {  // Set the pref.
3009bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      pref_service->Set(path.c_str(), *val);
3010bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3011bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
3012bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("no pref path or value given.");
3013bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3014bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3015bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3016bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(NULL);
3017bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3018bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3019bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetOmniboxInfo" }
3020bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer chrome/test/pyautolib/omnibox_info.py for sample json output.
3021bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetOmniboxInfo(Browser* browser,
3022bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               DictionaryValue* args,
3023bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               IPC::Message* reply_message) {
3024bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
3025bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3026bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  LocationBar* loc_bar = browser->window()->GetLocationBar();
3027bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutocompleteEditView* edit_view = loc_bar->location_entry();
3028bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutocompleteEditModel* model = edit_view->model();
3029bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3030bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Fill up matches.
3031bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* matches = new ListValue;
3032bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const AutocompleteResult& result = model->result();
3033bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (AutocompleteResult::const_iterator i = result.begin();
3034bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       i != result.end(); ++i) {
3035bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const AutocompleteMatch& match = *i;
3036bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* item = new DictionaryValue;  // owned by return_value
3037bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    item->SetString("type", AutocompleteMatch::TypeToString(match.type));
3038bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    item->SetBoolean("starred", match.starred);
3039bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    item->SetString("destination_url", match.destination_url.spec());
304072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    item->SetString("contents", match.contents);
304172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    item->SetString("description", match.description);
3042bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    matches->Append(item);
3043bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3044bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("matches", matches);
3045bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3046bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Fill up other properties.
3047bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue* properties = new DictionaryValue;  // owned by return_value
3048bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  properties->SetBoolean("has_focus", model->has_focus());
3049dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  properties->SetBoolean("query_in_progress",
3050dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                         !model->autocomplete_controller()->done());
305172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  properties->SetString("keyword", model->keyword());
305272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  properties->SetString("text", edit_view->GetText());
3053bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("properties", properties);
3054bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3055bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
3056bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3057bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3058bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "SetOmniboxText",
3059bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "text": "goog" }
3060bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetOmniboxText(Browser* browser,
3061bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               DictionaryValue* args,
3062bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               IPC::Message* reply_message) {
3063bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 text;
3064bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
3065bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetString("text", &text)) {
3066bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("text missing");
3067bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3068bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3069bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser->FocusLocationBar();
3070bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  LocationBar* loc_bar = browser->window()->GetLocationBar();
3071bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutocompleteEditView* edit_view = loc_bar->location_entry();
3072bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  edit_view->model()->OnSetFocus(false);
307372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  edit_view->SetUserText(text);
3074bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(NULL);
3075bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3076bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3077bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "OmniboxMovePopupSelection",
3078bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//                      "count": 1 }
3079bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Negative count implies up, positive implies down. Count values will be
3080bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// capped by the size of the popup list.
3081bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::OmniboxMovePopupSelection(
3082bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3083bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3084bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3085bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int count;
3086bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
3087bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetInteger("count", &count)) {
3088bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("count missing");
3089bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3090bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3091bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  LocationBar* loc_bar = browser->window()->GetLocationBar();
3092bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutocompleteEditModel* model = loc_bar->location_entry()->model();
3093bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  model->OnUpOrDownKeyPressed(count);
3094bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(NULL);
3095bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3096bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3097bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "OmniboxAcceptInput" }
3098bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::OmniboxAcceptInput(
3099bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NavigationController& controller =
3103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      browser->GetSelectedTabContents()->controller();
310472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  new OmniboxAcceptNotificationObserver(&controller, this, reply_message);
3105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser->window()->GetLocationBar()->AcceptInput();
3106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
310821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Sample json input: { "command": "GetInstantInfo" }
310921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid TestingAutomationProvider::GetInstantInfo(Browser* browser,
311021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                               DictionaryValue* args,
311121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                               IPC::Message* reply_message) {
311221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DictionaryValue* info = new DictionaryValue;
311321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (browser->instant()) {
311421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    InstantController* instant = browser->instant();
311521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    info->SetBoolean("enabled", true);
311621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    info->SetBoolean("showing", instant->IsShowingInstant());
311721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    info->SetBoolean("active", instant->is_active());
311821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    info->SetBoolean("current", instant->IsCurrent());
311921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (instant->GetPreviewContents() &&
312021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        instant->GetPreviewContents()->tab_contents()) {
312121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      TabContents* contents = instant->GetPreviewContents()->tab_contents();
312221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      info->SetBoolean("loading", contents->is_loading());
312321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      info->SetString("location", contents->GetURL().spec());
312421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      info->SetString("title", contents->GetTitle());
312521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
312621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else {
312721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    info->SetBoolean("enabled", false);
312821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
312921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
313021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return_value->Set("instant", info);
313121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
313221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
313321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetInitialLoadTimes" }
3135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer to InitialLoadObserver::GetTimingInformation() for sample output.
3136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetInitialLoadTimes(
3137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser*,
3138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue*,
3139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<DictionaryValue> return_value(
3141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      initial_load_observer_->GetTimingInformation());
3142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string json_return;
3144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::JSONWriter::Write(return_value.get(), false, &json_return);
3145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationMsg_SendJSONRequest::WriteReplyParams(
3146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_message, json_return, true);
3147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message);
3148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetPluginsInfo" }
3151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer chrome/test/pyautolib/plugins_info.py for sample json output.
3152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetPluginsInfo(
3153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
315621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  std::vector<webkit::npapi::WebPluginInfo> plugins;
315721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  webkit::npapi::PluginList::Singleton()->GetPlugins(false, &plugins);
3158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* items = new ListValue;
315921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  for (std::vector<webkit::npapi::WebPluginInfo>::const_iterator it =
316021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen           plugins.begin();
3161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != plugins.end();
3162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       ++it) {
3163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* item = new DictionaryValue;
3164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    item->SetString("name", it->name);
3165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    item->SetString("path", it->path.value());
3166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    item->SetString("version", it->version);
3167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    item->SetString("desc", it->desc);
316872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    item->SetBoolean("enabled", webkit::npapi::IsPluginEnabled(*it));
3169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Add info about mime types.
3170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ListValue* mime_types = new ListValue();
317121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    for (std::vector<webkit::npapi::WebPluginMimeType>::const_iterator type_it =
3172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen             it->mime_types.begin();
3173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen         type_it != it->mime_types.end();
3174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen         ++type_it) {
3175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      DictionaryValue* mime_type = new DictionaryValue();
3176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      mime_type->SetString("mimeType", type_it->mime_type);
3177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      mime_type->SetString("description", type_it->description);
3178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ListValue* file_extensions = new ListValue();
3180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      for (std::vector<std::string>::const_iterator ext_it =
3181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen               type_it->file_extensions.begin();
3182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen           ext_it != type_it->file_extensions.end();
3183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen           ++ext_it) {
3184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        file_extensions->Append(new StringValue(*ext_it));
3185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
3186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      mime_type->Set("fileExtensions", file_extensions);
3187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      mime_types->Append(mime_type);
3189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    item->Set("mimeTypes", mime_types);
3191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    items->Append(item);
3192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
3194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("plugins", items);  // return_value owns items.
3195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
3197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input:
3200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//    { "command": "EnablePlugin",
3201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//      "path": "/Library/Internet Plug-Ins/Flash Player.plugin" }
3202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::EnablePlugin(Browser* browser,
3203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                             DictionaryValue* args,
3204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                             IPC::Message* reply_message) {
3205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FilePath::StringType path;
3206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
3207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetString("path", &path)) {
3208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("path not specified.");
3209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
321021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (!webkit::npapi::PluginList::Singleton()->EnablePlugin(
321121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        FilePath(path))) {
3212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError(StringPrintf("Could not enable plugin for path %s.",
3213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                 path.c_str()));
3214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(NULL);
3217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input:
3220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//    { "command": "DisablePlugin",
3221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//      "path": "/Library/Internet Plug-Ins/Flash Player.plugin" }
3222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::DisablePlugin(Browser* browser,
3223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                              DictionaryValue* args,
3224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                              IPC::Message* reply_message) {
3225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FilePath::StringType path;
3226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
3227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetString("path", &path)) {
3228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("path not specified.");
3229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
323021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (!webkit::npapi::PluginList::Singleton()->DisablePlugin(
323121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        FilePath(path))) {
3232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError(StringPrintf("Could not disable plugin for path %s.",
3233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                 path.c_str()));
3234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(NULL);
3237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input:
3240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//    { "command": "SaveTabContents",
3241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//      "tab_index": 0,
3242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//      "filename": <a full pathname> }
3243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json output:
3244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//    {}
3245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SaveTabContents(
3246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int tab_index = 0;
3250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FilePath::StringType filename;
3251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FilePath::StringType parent_directory;
3252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContentsWrapper* tab_contents = NULL;
3253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetInteger("tab_index", &tab_index) ||
3255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      !args->GetString("filename", &filename)) {
3256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
3257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("tab_index or filename param missing");
3258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
3260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    tab_contents = browser->GetTabContentsWrapperAt(tab_index);
3261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!tab_contents) {
3262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      AutomationJSONReply(this, reply_message).SendError("no tab at tab_index");
3263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // We're doing a SAVE_AS_ONLY_HTML so the the directory path isn't
3267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // used.  Nevertheless, SavePackage requires it be valid.  Sigh.
3268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  parent_directory = FilePath(filename).DirName().value();
3269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!tab_contents->download_tab_helper()->SavePage(
3270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          FilePath(filename),
3271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          FilePath(parent_directory),
3272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          SavePackage::SAVE_AS_ONLY_HTML)) {
3273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
3274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        "Could not initiate SavePage");
3275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The observer will delete itself when done.
3278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  new SavePackageNotificationObserver(
3279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab_contents->download_tab_helper()->save_package(), this, reply_message);
3280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer to ImportSettings() in chrome/test/pyautolib/pyauto.py for sample
3283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// json input.
3284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json output: "{}"
3285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ImportSettings(Browser* browser,
3286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               DictionaryValue* args,
3287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               IPC::Message* reply_message) {
3288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Map from the json string passed over to the import item masks.
3289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::map<std::string, importer::ImportItem> string_to_import_item;
3290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_import_item["HISTORY"] = importer::HISTORY;
3291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_import_item["FAVORITES"] = importer::FAVORITES;
3292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_import_item["COOKIES"] = importer::COOKIES;
3293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_import_item["PASSWORDS"] = importer::PASSWORDS;
3294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_import_item["SEARCH_ENGINES"] = importer::SEARCH_ENGINES;
3295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_import_item["HOME_PAGE"] = importer::HOME_PAGE;
3296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_import_item["ALL"] = importer::ALL;
3297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* import_items_list = NULL;
329921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!args->GetString("import_from", &import_settings_data_.browser_name) ||
330021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      !args->GetBoolean("first_run", &import_settings_data_.first_run) ||
3301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      !args->GetList("import_items", &import_items_list)) {
3302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
3303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("Incorrect type for one or more of the arguments.");
3304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
330721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  import_settings_data_.import_items = 0;
3308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int num_items = import_items_list->GetSize();
3309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (int i = 0; i < num_items; i++) {
3310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    std::string item;
3311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    import_items_list->GetString(i, &item);
3312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // If the provided string is not part of the map, error out.
3313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!ContainsKey(string_to_import_item, item)) {
3314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      AutomationJSONReply(this, reply_message)
3315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          .SendError("Invalid item string found in import_items.");
3316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
331821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    import_settings_data_.import_items |= string_to_import_item[item];
3319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
332121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  import_settings_data_.browser = browser;
332221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  import_settings_data_.reply_message = reply_message;
3323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
332472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  importer_list_ = new ImporterList;
332572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  importer_list_->DetectSourceProfiles(this);
3326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
3329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Translates a dictionary password to a PasswordForm struct.
3331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenwebkit_glue::PasswordForm GetPasswordFormFromDict(
3332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const DictionaryValue& password_dict) {
3333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // If the time is specified, change time to the specified time.
3335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::Time time = base::Time::Now();
3336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int it;
3337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  double dt;
3338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (password_dict.GetInteger("time", &it))
3339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    time = base::Time::FromTimeT(it);
334072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  else if (password_dict.GetDouble("time", &dt))
3341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    time = base::Time::FromDoubleT(dt);
3342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string signon_realm;
3344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 username_value;
3345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 password_value;
3346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 origin_url_text;
3347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 username_element;
3348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 password_element;
3349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 submit_element;
3350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 action_target_text;
3351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool blacklist = false;
3352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 old_password_element;
3353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 old_password_value;
3354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // We don't care if any of these fail - they are either optional or checked
3356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // before this function is called.
3357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_dict.GetString("signon_realm", &signon_realm);
3358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_dict.GetString("username_value", &username_value);
3359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_dict.GetString("password_value", &password_value);
3360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_dict.GetString("origin_url", &origin_url_text);
3361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_dict.GetString("username_element", &username_element);
3362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_dict.GetString("password_element", &password_element);
3363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_dict.GetString("submit_element", &submit_element);
3364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_dict.GetString("action_target", &action_target_text);
3365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_dict.GetBoolean("blacklist", &blacklist);
3366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GURL origin_gurl(origin_url_text);
3368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GURL action_target(action_target_text);
3369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  webkit_glue::PasswordForm password_form;
3371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_form.signon_realm = signon_realm;
3372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_form.username_value = username_value;
3373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_form.password_value = password_value;
3374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_form.origin = origin_gurl;
3375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_form.username_element = username_element;
3376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_form.password_element = password_element;
3377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_form.submit_element = submit_element;
3378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_form.action = action_target;
3379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_form.blacklisted_by_user = blacklist;
3380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_form.date_created = time;
3381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return password_form;
3383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
338572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace
3386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// See AddSavedPassword() in chrome/test/functional/pyauto.py for sample json
3388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// input.
3389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json output: { "password_added": true }
3390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::AddSavedPassword(
3391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
3395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue* password_dict = NULL;
3396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetDictionary("password", &password_dict)) {
3398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("Password must be a dictionary.");
3399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The signon realm is effectively the primary key and must be included.
3403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Check here before calling GetPasswordFormFromDict.
3404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!password_dict->HasKey("signon_realm")) {
3405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("Password must include signon_realm.");
3406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  webkit_glue::PasswordForm new_password =
3409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetPasswordFormFromDict(*password_dict);
3410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Profile* profile = browser->profile();
3412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Use IMPLICIT_ACCESS since new passwords aren't added in incognito mode.
3413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  PasswordStore* password_store =
3414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      profile->GetPasswordStore(Profile::IMPLICIT_ACCESS);
3415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Set the return based on whether setting the password succeeded.
3417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
3418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // It will be null if it's accessed in an incognito window.
3420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (password_store != NULL) {
3421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    password_store->AddLogin(new_password);
3422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return_value->SetBoolean("password_added", true);
3423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
3424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return_value->SetBoolean("password_added", false);
3425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(return_value.get());
3428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// See RemoveSavedPassword() in chrome/test/functional/pyauto.py for sample
3431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// json input.
3432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json output: {}
3433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::RemoveSavedPassword(
3434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
3438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue* password_dict = NULL;
3439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetDictionary("password", &password_dict)) {
3441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("Password must be a dictionary.");
3442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The signon realm is effectively the primary key and must be included.
3446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Check here before calling GetPasswordFormFromDict.
3447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!password_dict->HasKey("signon_realm")) {
3448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("Password must include signon_realm.");
3449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  webkit_glue::PasswordForm to_remove =
3452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetPasswordFormFromDict(*password_dict);
3453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Profile* profile = browser->profile();
3455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Use EXPLICIT_ACCESS since passwords can be removed in incognito mode.
3456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  PasswordStore* password_store =
3457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      profile->GetPasswordStore(Profile::EXPLICIT_ACCESS);
3458bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_store->RemoveLogin(to_remove);
3460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(NULL);
3461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetSavedPasswords" }
3464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer to GetSavedPasswords() in chrome/test/pyautolib/pyauto.py for sample
3465bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// json output.
3466bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetSavedPasswords(
3467bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3469bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Profile* profile = browser->profile();
3471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Use EXPLICIT_ACCESS since saved passwords can be retrieved in
3472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // incognito mode.
3473bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  PasswordStore* password_store =
3474bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      profile->GetPasswordStore(Profile::EXPLICIT_ACCESS);
3475bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_store->GetAutofillableLogins(
3476bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new AutomationProviderGetPasswordsObserver(this, reply_message));
3477bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Observer deletes itself after returning.
3478bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3479bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer to ClearBrowsingData() in chrome/test/pyautolib/pyauto.py for sample
3481bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// json input.
3482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json output: {}
3483bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ClearBrowsingData(
3484bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3485bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3486bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3487bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<std::string, BrowsingDataRemover::TimePeriod> string_to_time_period;
3488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_time_period["LAST_HOUR"] = BrowsingDataRemover::LAST_HOUR;
3489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_time_period["LAST_DAY"] = BrowsingDataRemover::LAST_DAY;
3490bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_time_period["LAST_WEEK"] = BrowsingDataRemover::LAST_WEEK;
3491bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_time_period["FOUR_WEEKS"] = BrowsingDataRemover::FOUR_WEEKS;
3492bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_time_period["EVERYTHING"] = BrowsingDataRemover::EVERYTHING;
3493bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3494bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<std::string, int> string_to_mask_value;
3495bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_mask_value["HISTORY"] = BrowsingDataRemover::REMOVE_HISTORY;
3496bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_mask_value["DOWNLOADS"] = BrowsingDataRemover::REMOVE_DOWNLOADS;
3497bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_mask_value["COOKIES"] = BrowsingDataRemover::REMOVE_COOKIES;
3498bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_mask_value["PASSWORDS"] = BrowsingDataRemover::REMOVE_PASSWORDS;
3499bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_mask_value["FORM_DATA"] = BrowsingDataRemover::REMOVE_FORM_DATA;
3500bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string_to_mask_value["CACHE"] = BrowsingDataRemover::REMOVE_CACHE;
3501bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3502bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string time_period;
3503bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* to_remove;
3504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetString("time_period", &time_period) ||
3505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      !args->GetList("to_remove", &to_remove)) {
3506dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
3507dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("time_period must be a string and to_remove a list.");
3508bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3509bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3510bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3511bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int remove_mask = 0;
3512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int num_removals = to_remove->GetSize();
3513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (int i = 0; i < num_removals; i++) {
3514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    std::string removal;
3515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    to_remove->GetString(i, &removal);
3516bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // If the provided string is not part of the map, then error out.
3517bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!ContainsKey(string_to_mask_value, removal)) {
3518dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      AutomationJSONReply(this, reply_message)
3519dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          .SendError("Invalid browsing data string found in to_remove.");
3520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3522bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    remove_mask |= string_to_mask_value[removal];
3523bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3524bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3525bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!ContainsKey(string_to_time_period, time_period)) {
3526dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
3527dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("Invalid string for time_period.");
3528bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3529bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3530bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3531bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  BrowsingDataRemover* remover = new BrowsingDataRemover(
3532bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      profile(), string_to_time_period[time_period], base::Time());
3533bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3534bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  remover->AddObserver(
3535bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new AutomationProviderBrowsingDataObserver(this, reply_message));
3536bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  remover->Remove(remove_mask);
3537bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // BrowsingDataRemover deletes itself using DeleteTask.
3538bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The observer also deletes itself after sending the reply.
3539bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3540bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3541bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
3542bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3543bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Get the TabContents from a dictionary of arguments.
3544bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* GetTabContentsFromDict(const Browser* browser,
3545bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                      const DictionaryValue* args,
3546bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                      std::string* error_message) {
3547bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int tab_index;
3548bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!args->GetInteger("tab_index", &tab_index)) {
3549bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *error_message = "Must include tab_index.";
3550bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return NULL;
3551bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3552bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3553bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab_contents = browser->GetTabContentsAt(tab_index);
3554bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!tab_contents) {
3555bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *error_message = StringPrintf("No tab at index %d.", tab_index);
3556bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return NULL;
3557bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3558bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return tab_contents;
3559bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3560bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3561bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Get the TranslateInfoBarDelegate from TabContents.
3562bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TranslateInfoBarDelegate* GetTranslateInfoBarDelegate(
3563bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      TabContents* tab_contents) {
356472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    for (size_t i = 0; i < tab_contents->infobar_count(); i++) {
3565bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      InfoBarDelegate* infobar = tab_contents->GetInfoBarDelegateAt(i);
3566bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (infobar->AsTranslateInfoBarDelegate())
3567bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        return infobar->AsTranslateInfoBarDelegate();
3568bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3569bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // No translate infobar.
3570bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
3571bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3572bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace
3573bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3574731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TestingAutomationProvider::FindInPage(
3575731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Browser* browser,
3576731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DictionaryValue* args,
3577731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    IPC::Message* reply_message) {
3578731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string error_message;
3579731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TabContents* tab_contents = GetTabContentsFromDict(browser, args,
3580731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     &error_message);
3581731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!tab_contents) {
3582731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AutomationJSONReply(this, reply_message).SendError(error_message);
3583731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
3584731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3585731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  string16 search_string;
3586731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool forward;
3587731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool match_case;
3588731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool find_next;
3589731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!args->GetString("search_string", &search_string)) {
3590731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AutomationJSONReply(this, reply_message).
3591731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        SendError("Must include search_string string.");
3592731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
3593731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3594731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!args->GetBoolean("forward", &forward)) {
3595731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AutomationJSONReply(this, reply_message).
3596731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        SendError("Must include forward boolean.");
3597731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
3598731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3599731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!args->GetBoolean("match_case", &match_case)) {
3600731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AutomationJSONReply(this, reply_message).
3601731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        SendError("Must include match_case boolean.");
3602731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
3603731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3604731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!args->GetBoolean("find_next", &find_next)) {
3605731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AutomationJSONReply(this, reply_message).
3606731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        SendError("Must include find_next boolean.");
3607731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
3608731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3609731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SendFindRequest(tab_contents,
3610731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  true,
3611731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  search_string,
3612731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  forward,
3613731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  match_case,
3614731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  find_next,
3615731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  reply_message);
3616731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
3617731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3618bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// See GetTranslateInfo() in chrome/test/pyautolib/pyauto.py for sample json
3619bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// input and output.
3620bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetTranslateInfo(
3621bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3622bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3623bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3624bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string error_message;
3625bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents = GetTabContentsFromDict(browser, args,
3626bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     &error_message);
3627bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!tab_contents) {
3628bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(error_message);
3629bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3630bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3631bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3632bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Get the translate bar if there is one and pass it to the observer.
3633bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The observer will check for null and populate the information accordingly.
3634bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TranslateInfoBarDelegate* translate_bar =
3635bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetTranslateInfoBarDelegate(tab_contents);
3636bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3637bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabLanguageDeterminedObserver* observer = new TabLanguageDeterminedObserver(
3638bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      this, reply_message, tab_contents, translate_bar);
3639bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // If the language for the page hasn't been loaded yet, then just make
3640bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // the observer, otherwise call observe directly.
3641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TranslateTabHelper* helper = TabContentsWrapper::GetCurrentWrapperForContents(
3642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab_contents)->translate_tab_helper();
3643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string language = helper->language_state().original_language();
3644bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!language.empty()) {
3645bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    observer->Observe(NotificationType::TAB_LANGUAGE_DETERMINED,
3646bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      Source<TabContents>(tab_contents),
3647bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      Details<std::string>(&language));
3648bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3649bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3650bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3651bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// See SelectTranslateOption() in chrome/test/pyautolib/pyauto.py for sample
3652bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// json input.
3653bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json output: {}
3654bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SelectTranslateOption(
3655bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3656bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3657bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3658bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string option;
3659bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string error_message;
3660bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents = GetTabContentsFromDict(browser, args,
3661bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                     &error_message);
3662bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!tab_contents) {
3663bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(error_message);
3664bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3665bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3666bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3667bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TranslateInfoBarDelegate* translate_bar =
3668bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetTranslateInfoBarDelegate(tab_contents);
3669bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!translate_bar) {
3670bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message)
3671bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        .SendError("There is no translate bar open.");
3672bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3673bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3674bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3675bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetString("option", &option)) {
3676bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message).SendError("Must include option");
3677bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3678bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3679bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3680bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (option == "translate_page") {
3681bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Make a new notification observer which will send the reply.
3682bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    new PageTranslatedObserver(this, reply_message, tab_contents);
3683bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    translate_bar->Translate();
3684bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3685bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (option == "set_target_language") {
3686bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    string16 target_language;
3687bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!args->GetString("target_language", &target_language)) {
3688dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       AutomationJSONReply(this, reply_message)
3689dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen           .SendError("Must include target_language string.");
3690bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3691bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3692bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Get the target language index based off of the language name.
369372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    size_t target_language_index = TranslateInfoBarDelegate::kNoIndex;
369472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    for (size_t i = 0; i < translate_bar->GetLanguageCount(); i++) {
3695bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (translate_bar->GetLanguageDisplayableNameAt(i) == target_language) {
3696bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        target_language_index = i;
3697bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        break;
3698bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
3699bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
370072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (target_language_index == TranslateInfoBarDelegate::kNoIndex) {
3701bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       AutomationJSONReply(this, reply_message)
3702bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen           .SendError("Invalid target language string.");
3703bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       return;
3704bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3705bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // If the page has already been translated it will be translated again to
3706bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // the new language. The observer will wait until the page has been
3707bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // translated to reply.
3708bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (translate_bar->type() == TranslateInfoBarDelegate::AFTER_TRANSLATE) {
3709bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new PageTranslatedObserver(this, reply_message, tab_contents);
3710bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      translate_bar->SetTargetLanguage(target_language_index);
3711bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3712bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3713bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Otherwise just send the reply back immediately.
3714bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    translate_bar->SetTargetLanguage(target_language_index);
3715bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
3716bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return_value->SetBoolean("translation_success", true);
3717bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
3718bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3719bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (option == "click_always_translate_lang_button") {
3720bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!translate_bar->ShouldShowAlwaysTranslateButton()) {
3721bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      AutomationJSONReply(this, reply_message)
3722bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          .SendError("Always translate button not showing.");
3723bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3724bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3725bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Clicking 'Always Translate' triggers a translation. The observer will
3726bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // wait until the translation is complete before sending the reply.
3727bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    new PageTranslatedObserver(this, reply_message, tab_contents);
3728bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    translate_bar->AlwaysTranslatePageLanguage();
3729bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3730bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3731bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3732bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
3733bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (option == "never_translate_language") {
3734bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (translate_bar->IsLanguageBlacklisted()) {
3735bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply.SendError("The language was already blacklisted.");
3736bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3737bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3738bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    translate_bar->ToggleLanguageBlacklist();
3739bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendSuccess(NULL);
3740bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (option == "never_translate_site") {
3741bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (translate_bar->IsSiteBlacklisted()) {
3742bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply.SendError("The site was already blacklisted.");
3743bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3744bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3745bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    translate_bar->ToggleSiteBlacklist();
3746bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendSuccess(NULL);
3747bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (option == "toggle_always_translate") {
3748bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    translate_bar->ToggleAlwaysTranslate();
3749bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendSuccess(NULL);
3750bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (option == "revert_translation") {
3751bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    translate_bar->RevertTranslation();
3752bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendSuccess(NULL);
3753bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (option == "click_never_translate_lang_button") {
3754bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!translate_bar->ShouldShowNeverTranslateButton()) {
3755bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply.SendError("Always translate button not showing.");
3756bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3757bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3758bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    translate_bar->NeverTranslatePageLanguage();
3759bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendSuccess(NULL);
3760bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else if (option == "decline_translation") {
3761bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // This is the function called when an infobar is dismissed or when the
3762bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // user clicks the 'Nope' translate button.
3763bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    translate_bar->TranslationDeclined();
3764bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    tab_contents->RemoveInfoBar(translate_bar);
3765bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendSuccess(NULL);
3766bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
3767bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("Invalid string found for option.");
3768bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3769bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3770bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3771731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Sample json input: { "command": "GetBlockedPopupsInfo",
3772731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//                      "tab_index": 1 }
3773731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Refer GetBlockedPopupsInfo() in pyauto.py for sample output.
3774731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TestingAutomationProvider::GetBlockedPopupsInfo(
3775731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Browser* browser,
3776731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DictionaryValue* args,
3777731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    IPC::Message* reply_message) {
3778731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AutomationJSONReply reply(this, reply_message);
3779731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string error_message;
3780731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TabContents* tab_contents = GetTabContentsFromDict(
3781731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      browser, args, &error_message);
3782731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!tab_contents) {
3783731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    reply.SendError(error_message);
3784731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
3785731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3786731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
3787731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BlockedContentContainer* popup_container =
3788731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      tab_contents->blocked_content_container();
3789731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ListValue* blocked_popups_list = new ListValue;
3790731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (popup_container) {
3791731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    std::vector<TabContents*> blocked_contents;
3792731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    popup_container->GetBlockedContents(&blocked_contents);
3793731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    for (std::vector<TabContents*>::const_iterator it =
3794731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick             blocked_contents.begin(); it != blocked_contents.end(); ++it) {
3795731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      DictionaryValue* item = new DictionaryValue;
3796731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      item->SetString("url", (*it)->GetURL().spec());
3797731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      item->SetString("title", (*it)->GetTitle());
3798731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      blocked_popups_list->Append(item);
3799731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
3800731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3801731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return_value->Set("blocked_popups", blocked_popups_list);
3802731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  reply.SendSuccess(return_value.get());
3803731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
3804731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3805731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Refer UnblockAndLaunchBlockedPopup() in pyauto.py for sample input.
3806731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TestingAutomationProvider::UnblockAndLaunchBlockedPopup(
3807731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Browser* browser,
3808731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DictionaryValue* args,
3809731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    IPC::Message* reply_message) {
3810731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AutomationJSONReply reply(this, reply_message);
3811731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string error_message;
3812731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TabContents* tab_contents = GetTabContentsFromDict(
3813731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      browser, args, &error_message);
3814731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!tab_contents) {
3815731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    reply.SendError(error_message);
3816731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
3817731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3818731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int popup_index;
3819731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!args->GetInteger("popup_index", &popup_index)) {
3820731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    reply.SendError("Need popup_index arg");
3821731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
3822731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3823731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
3824731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BlockedContentContainer* content_container =
3825731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      tab_contents->blocked_content_container();
3826731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!content_container ||
3827731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      popup_index >= (int)content_container->GetBlockedContentsCount()) {
3828731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    reply.SendError(StringPrintf("No popup at index %d", popup_index));
3829731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
3830731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3831731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::vector<TabContents*> blocked_contents;
3832731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  content_container->GetBlockedContents(&blocked_contents);
3833731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  content_container->LaunchForContents(blocked_contents[popup_index]);
3834731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  reply.SendSuccess(NULL);
3835731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
3836731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3837bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetThemeInfo" }
3838bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Refer GetThemeInfo() in chrome/test/pyautolib/pyauto.py for sample output.
3839bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetThemeInfo(
3840bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3841bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3842bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3843bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
3844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension* theme = ThemeServiceFactory::GetThemeForProfile(profile());
3845bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (theme) {
3846bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return_value->SetString("name", theme->name());
3847bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return_value->Set("images", theme->GetThemeImages()->DeepCopy());
3848bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return_value->Set("colors", theme->GetThemeColors()->DeepCopy());
3849bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return_value->Set("tints", theme->GetThemeTints()->DeepCopy());
3850bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3851bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
3852bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3853bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3854ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
3855ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3856ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenListValue* GetHostPermissions(const Extension* ext) {
3857ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ListValue* permissions = new ListValue;
3858ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const URLPatternList pattern_list =
3859ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ext->GetEffectiveHostPermissions().patterns();
3860ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (URLPatternList::const_iterator perm = pattern_list.begin();
3861ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       perm != pattern_list.end(); ++perm) {
3862ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    permissions->Append(new StringValue(perm->GetAsString()));
3863ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3864ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return permissions;
3865ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
3866ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3867ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenListValue* GetAPIPermissions(const Extension* ext) {
3868ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ListValue* permissions = new ListValue;
3869ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::set<std::string> perm_list = ext->api_permissions();
3870ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (std::set<std::string>::const_iterator perm = perm_list.begin();
3871ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       perm != perm_list.end(); ++perm) {
3872ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    permissions->Append(new StringValue(perm->c_str()));
3873ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3874ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return permissions;
3875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
3876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace
3878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3879bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input: { "command": "GetExtensionsInfo" }
3880bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// See GetExtensionsInfo() in chrome/test/pyautolib/pyauto.py for sample json
3881bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// output.
3882bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetExtensionsInfo(
3883bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3884bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3885bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3886bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
388721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* service = profile()->GetExtensionService();
3888bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!service) {
3889bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("No extensions service.");
3890bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3891bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
3892bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* extensions_values = new ListValue;
3893bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const ExtensionList* extensions = service->extensions();
3894bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (ExtensionList::const_iterator it = extensions->begin();
3895bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != extensions->end(); ++it) {
3896bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const Extension* extension = *it;
3897bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* extension_value = new DictionaryValue;
3898bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    extension_value->SetString("id", extension->id());
3899bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    extension_value->SetString("version", extension->VersionString());
3900bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    extension_value->SetString("name", extension->name());
3901bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    extension_value->SetString("public_key", extension->public_key());
3902bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    extension_value->SetString("description", extension->description());
3903bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    extension_value->SetString("background_url",
3904bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                               extension->background_url().spec());
3905bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    extension_value->SetString("options_url",
3906bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                               extension->options_url().spec());
3907ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    extension_value->Set("host_permissions", GetHostPermissions(extension));
3908ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    extension_value->Set("api_permissions", GetAPIPermissions(extension));
3909bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    extensions_values->Append(extension_value);
3910bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3911bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return_value->Set("extensions", extensions_values);
3912bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(return_value.get());
3913bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3914bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3915bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// See UninstallExtensionById() in chrome/test/pyautolib/pyauto.py for sample
3916bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// json input.
3917bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json output: {}
3918bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::UninstallExtensionById(
3919bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3920bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3921bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3922bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string id;
3923bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetString("id", &id)) {
3924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
3925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "Must include string id.");
3926bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3927bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
392821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* service = profile()->GetExtensionService();
3929bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!service) {
3930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
3931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "No extensions service.");
3932bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3933bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!service->GetExtensionById(id, true) &&
3936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !service->GetTerminatedExtension(id)) {
3937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // The extension ID does not correspond to any extension, whether crashed
3938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // or not.
3939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(base::StringPrintf(
3940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "Extension does not exist: %s.", id.c_str()));
3941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
3942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Wait for a notification indicating that the extension with the given ID
3945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // has been uninstalled.  This observer will delete itself.
3946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  new ExtensionUninstallObserver(this, reply_message, id);
3947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  service->UninstallExtension(id, false, NULL);
3948bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3949bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3950bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json input:
3951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//    { "command": "GetAutofillProfile" }
3952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Refer to GetAutofillProfile() in chrome/test/pyautolib/pyauto.py for sample
3953bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// json output.
3954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::GetAutofillProfile(
3955bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3956bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3957bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
395872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AutomationJSONReply reply(this, reply_message);
3959ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Get the AutofillProfiles currently in the database.
3960bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int tab_index = 0;
396172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!args->GetInteger("tab_index", &tab_index)) {
396272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    reply.SendError("Invalid or missing tab_index integer value.");
396372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
396472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
3965bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
396672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContents* tab_contents = browser->GetTabContentsAt(tab_index);
3967bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_contents) {
3968bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    PersonalDataManager* pdm = tab_contents->profile()->GetOriginalProfile()
3969bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        ->GetPersonalDataManager();
3970bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (pdm) {
3971ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::vector<AutofillProfile*> autofill_profiles = pdm->profiles();
3972bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      std::vector<CreditCard*> credit_cards = pdm->credit_cards();
3973bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3974ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ListValue* profiles = GetListFromAutofillProfiles(autofill_profiles);
3975bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ListValue* cards = GetListFromCreditCards(credit_cards);
3976bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3977bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
3978bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3979bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return_value->Set("profiles", profiles);
3980bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return_value->Set("credit_cards", cards);
3981bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply.SendSuccess(return_value.get());
3982bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else {
3983bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply.SendError("No PersonalDataManager.");
3984bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
3985bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
3986bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
3987bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("No tab at that index.");
3988bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
3989bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
3990bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
3991bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3992ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Refer to FillAutofillProfile() in chrome/test/pyautolib/pyauto.py for sample
3993bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// json input.
3994bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Sample json output: {}
3995ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::FillAutofillProfile(
3996bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser,
3997bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* args,
3998bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
3999bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationJSONReply reply(this, reply_message);
4000bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* profiles = NULL;
4001bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* cards = NULL;
400272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
400372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // It's ok for profiles/credit_cards elements to be missing.
4004bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  args->GetList("profiles", &profiles);
4005bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  args->GetList("credit_cards", &cards);
400672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4007bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string error_mesg;
4008bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4009ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<AutofillProfile> autofill_profiles;
4010bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<CreditCard> credit_cards;
4011ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Create an AutofillProfile for each of the dictionary profiles.
4012bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (profiles) {
4013ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    autofill_profiles = GetAutofillProfilesFromList(*profiles, &error_mesg);
4014bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
4015bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Create a CreditCard for each of the dictionary values.
4016bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (cards) {
4017bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    credit_cards = GetCreditCardsFromList(*cards, &error_mesg);
4018bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
4019bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!error_mesg.empty()) {
4020bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError(error_mesg);
4021bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
4022bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
4023bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Save the AutofillProfiles.
4025bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int tab_index = 0;
402672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!args->GetInteger("tab_index", &tab_index)) {
402772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    reply.SendError("Invalid or missing tab_index integer");
402872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
402972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
403072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4031bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents = browser->GetTabContentsAt(tab_index);
4032bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4033bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_contents) {
4034bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    PersonalDataManager* pdm = tab_contents->profile()
4035bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        ->GetPersonalDataManager();
4036bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (pdm) {
4037ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (profiles)
4038ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        pdm->SetProfiles(&autofill_profiles);
4039ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (cards)
4040ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        pdm->SetCreditCards(&credit_cards);
4041bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else {
4042bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply.SendError("No PersonalDataManager.");
4043bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
4044bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
4045bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
4046bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    reply.SendError("No tab at that index.");
4047bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
4048bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
4049bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply.SendSuccess(NULL);
4050bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
4051bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4052513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Sample json output: { "success": true }
4053513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestingAutomationProvider::SignInToSync(Browser* browser,
4054513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                             DictionaryValue* args,
4055513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                             IPC::Message* reply_message) {
4056513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutomationJSONReply reply(this, reply_message);
4057513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string username;
4058513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string password;
4059513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!args->GetString("username", &username) ||
4060513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      !args->GetString("password", &password)) {
4061513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      reply.SendError("Invalid or missing args");
4062513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
4063513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4064513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (sync_waiter_.get() == NULL) {
4065513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_waiter_.reset(new ProfileSyncServiceHarness(
4066513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        browser->profile(), username, password, 0));
4067513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  } else {
4068513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_waiter_->SetCredentials(username, password);
4069513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4070513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (sync_waiter_->SetupSync()) {
4071ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
4072513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return_value->SetBoolean("success", true);
4073ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendSuccess(return_value.get());
4074513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  } else {
4075513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    reply.SendError("Signing in to sync was unsuccessful");
4076513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4077513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
4078513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4079513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Sample json output:
4080513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// {u'summary': u'SYNC DISABLED'}
4081513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//
4082513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// { u'authenticated': True,
4083513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//   u'last synced': u'Just now',
4084513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//   u'summary': u'READY',
4085513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//   u'sync url': u'clients4.google.com',
4086ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//   u'updates received': 42,
4087513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//   u'synced datatypes': [ u'Bookmarks',
4088513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//                          u'Preferences',
4089513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//                          u'Passwords',
4090513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//                          u'Autofill',
4091513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//                          u'Themes',
4092513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//                          u'Extensions',
4093513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//                          u'Apps']}
4094513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestingAutomationProvider::GetSyncInfo(Browser* browser,
4095513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            DictionaryValue* args,
4096513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            IPC::Message* reply_message) {
4097513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutomationJSONReply reply(this, reply_message);
4098513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DictionaryValue* sync_info = new DictionaryValue;
4099ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
4100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (sync_waiter_.get() == NULL) {
4101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_waiter_.reset(
4102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ProfileSyncServiceHarness::CreateAndAttach(browser->profile()));
4103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!sync_waiter_->IsSyncAlreadySetup()) {
4105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_info->SetString("summary", "SYNC DISABLED");
4106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  } else {
4107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ProfileSyncService* service = sync_waiter_->service();
4108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ProfileSyncService::Status status = sync_waiter_->GetStatus();
4109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_info->SetString("summary",
4110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ProfileSyncService::BuildSyncStatusSummaryText(status.summary));
4111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_info->SetString("sync url", service->sync_service_url().host());
4112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_info->SetBoolean("authenticated", status.authenticated);
4113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_info->SetString("last synced", service->GetLastSyncedTimeString());
4114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sync_info->SetInteger("updates received", status.updates_received);
4115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ListValue* synced_datatype_list = new ListValue;
4116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    syncable::ModelTypeSet synced_datatypes;
4117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    service->GetPreferredDataTypes(&synced_datatypes);
4118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    for (syncable::ModelTypeSet::iterator it = synced_datatypes.begin();
4119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch         it != synced_datatypes.end(); ++it) {
4120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      synced_datatype_list->Append(
4121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          new StringValue(syncable::ModelTypeToString(*it)));
4122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
4123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_info->Set("synced datatypes", synced_datatype_list);
4124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return_value->Set("sync_info", sync_info);
4126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply.SendSuccess(return_value.get());
4127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
4128513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Sample json output: { "success": true }
4130513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestingAutomationProvider::AwaitSyncCycleCompletion(
4131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Browser* browser,
4132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DictionaryValue* args,
4133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    IPC::Message* reply_message) {
4134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutomationJSONReply reply(this, reply_message);
4135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (sync_waiter_.get() == NULL) {
4136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_waiter_.reset(
4137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ProfileSyncServiceHarness::CreateAndAttach(browser->profile()));
4138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!sync_waiter_->IsSyncAlreadySetup()) {
4140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    reply.SendError("Not signed in to sync");
4141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
4142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Ensure that the profile sync service is initialized before waiting for sync
4144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // to complete. In cases where the browser is restarted with sync enabled,
4145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the sync service may take a while to get reinitialized.
4146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!browser->profile()->GetProfileSyncService()) {
4147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError("ProfileSyncService not initialized.");
4148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  sync_waiter_->AwaitSyncCycleCompletion("Waiting for sync cycle");
4151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ProfileSyncService::Status status = sync_waiter_->GetStatus();
4152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (status.summary == ProfileSyncService::Status::READY) {
4153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
4154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return_value->SetBoolean("success", true);
4155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    reply.SendSuccess(return_value.get());
4156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  } else {
4157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string error_msg = "Wait for sync cycle was unsuccessful. "
4158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            "Sync status: ";
4159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    error_msg.append(
4160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ProfileSyncService::BuildSyncStatusSummaryText(status.summary));
4161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError(error_msg);
4162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
4164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Refer to EnableSyncForDatatypes() in chrome/test/pyautolib/pyauto.py for
4166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// sample json input. Sample json output: { "success": true }
4167513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestingAutomationProvider::EnableSyncForDatatypes(
4168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Browser* browser,
4169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DictionaryValue* args,
4170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    IPC::Message* reply_message) {
4171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutomationJSONReply reply(this, reply_message);
4172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (sync_waiter_.get() == NULL) {
4173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_waiter_.reset(
4174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ProfileSyncServiceHarness::CreateAndAttach(browser->profile()));
4175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!sync_waiter_->IsSyncAlreadySetup()) {
4177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    reply.SendError("Not signed in to sync");
4178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
4179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ListValue* datatypes = NULL;
4181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!args->GetList("datatypes", &datatypes)) {
4182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    reply.SendError("Invalid or missing args");
4183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
4184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string first_datatype;
4186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  datatypes->GetString(0, &first_datatype);
4187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (first_datatype == "All") {
4188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_waiter_->EnableSyncForAllDatatypes();
4189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  } else {
4190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int num_datatypes = datatypes->GetSize();
4191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    for (int i = 0; i < num_datatypes; ++i) {
4192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      std::string datatype_string;
4193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      datatypes->GetString(i, &datatype_string);
4194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      syncable::ModelType datatype =
4195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          syncable::ModelTypeFromString(datatype_string);
4196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (datatype == syncable::UNSPECIFIED) {
4197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        AutomationJSONReply(this, reply_message).SendError(StringPrintf(
4198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            "Invalid datatype string: %s.", datatype_string.c_str()));
4199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        return;
4200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
4201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      sync_waiter_->EnableSyncForDatatype(datatype);
4202513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      sync_waiter_->AwaitSyncCycleCompletion(StringPrintf(
4203513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          "Enabling datatype: %s", datatype_string.c_str()));
4204513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
4205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4206513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ProfileSyncService::Status status = sync_waiter_->GetStatus();
4207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (status.summary == ProfileSyncService::Status::READY ||
4208513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      status.summary == ProfileSyncService::Status::SYNCING) {
4209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
4210513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return_value->SetBoolean("success", true);
4211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendSuccess(return_value.get());
4212513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  } else {
4213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    reply.SendError("Enabling sync for given datatypes was unsuccessful");
4214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4215513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
4216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Refer to DisableSyncForDatatypes() in chrome/test/pyautolib/pyauto.py for
4218513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// sample json input. Sample json output: { "success": true }
4219513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestingAutomationProvider::DisableSyncForDatatypes(
4220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Browser* browser,
4221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DictionaryValue* args,
4222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    IPC::Message* reply_message) {
4223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutomationJSONReply reply(this, reply_message);
4224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (sync_waiter_.get() == NULL) {
4225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_waiter_.reset(
4226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ProfileSyncServiceHarness::CreateAndAttach(browser->profile()));
4227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4228513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!sync_waiter_->IsSyncAlreadySetup()) {
4229513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    reply.SendError("Not signed in to sync");
4230513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
4231513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4232513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ListValue* datatypes = NULL;
4233513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!args->GetList("datatypes", &datatypes)) {
4234513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    reply.SendError("Invalid or missing args");
4235513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
4236513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4237513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string first_datatype;
423872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!datatypes->GetString(0, &first_datatype)) {
423972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    reply.SendError("Invalid or missing string");
424072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
424172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
4242513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (first_datatype == "All") {
4243513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    sync_waiter_->DisableSyncForAllDatatypes();
4244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ProfileSyncService::Status status = sync_waiter_->GetStatus();
4245513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (status.summary != ProfileSyncService::Status::READY &&
4246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        status.summary != ProfileSyncService::Status::SYNCING) {
4247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
4248513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return_value->SetBoolean("success", true);
4249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      reply.SendSuccess(return_value.get());
4250513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
4251513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      reply.SendError("Disabling all sync datatypes was unsuccessful");
4252513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
4253513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  } else {
4254513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int num_datatypes = datatypes->GetSize();
4255513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    for (int i = 0; i < num_datatypes; i++) {
4256513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      std::string datatype_string;
4257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      datatypes->GetString(i, &datatype_string);
4258513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      syncable::ModelType datatype =
4259513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          syncable::ModelTypeFromString(datatype_string);
4260513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (datatype == syncable::UNSPECIFIED) {
4261513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        AutomationJSONReply(this, reply_message).SendError(StringPrintf(
4262513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            "Invalid datatype string: %s.", datatype_string.c_str()));
4263513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        return;
4264513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
4265513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      sync_waiter_->DisableSyncForDatatype(datatype);
4266513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      sync_waiter_->AwaitSyncCycleCompletion(StringPrintf(
4267513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          "Disabling datatype: %s", datatype_string.c_str()));
4268513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
4269513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ProfileSyncService::Status status = sync_waiter_->GetStatus();
4270513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (status.summary == ProfileSyncService::Status::READY ||
4271513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        status.summary == ProfileSyncService::Status::SYNCING) {
4272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
4273513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return_value->SetBoolean("success", true);
4274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      reply.SendSuccess(return_value.get());
4275513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
4276513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      reply.SendError("Disabling sync for given datatypes was unsuccessful");
4277513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
4278513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4279513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
4280513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen/* static */
4282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenListValue* TestingAutomationProvider::GetListFromAutofillProfiles(
4283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::vector<AutofillProfile*>& autofill_profiles) {
4284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* profiles = new ListValue;
4285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::map<AutofillFieldType, std::string> autofill_type_to_string
4287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      = GetAutofillFieldToStringMap();
4288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // For each AutofillProfile, transform it to a dictionary object to return.
4290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (std::vector<AutofillProfile*>::const_iterator it =
4291513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch           autofill_profiles.begin();
4292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != autofill_profiles.end(); ++it) {
4293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutofillProfile* profile = *it;
4294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* profile_info = new DictionaryValue;
4295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // For each of the types, if it has a value, add it to the dictionary.
4296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (std::map<AutofillFieldType, std::string>::iterator
4297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen         type_it = autofill_type_to_string.begin();
4298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen         type_it != autofill_type_to_string.end(); ++type_it) {
4299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      string16 value = profile->GetInfo(type_it->first);
4300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (value.length()) {  // If there was something stored for that value.
430172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        profile_info->SetString(type_it->second, value);
4302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
4303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
4304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    profiles->Append(profile_info);
4305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
4306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return profiles;
4307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
4308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen/* static */
4310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenListValue* TestingAutomationProvider::GetListFromCreditCards(
4311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const std::vector<CreditCard*>& credit_cards) {
4312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue* cards = new ListValue;
4313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::map<AutofillFieldType, std::string> credit_card_type_to_string =
4315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetCreditCardFieldToStringMap();
4316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // For each AutofillProfile, transform it to a dictionary object to return.
4318513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (std::vector<CreditCard*>::const_iterator it =
4319513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch           credit_cards.begin();
4320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != credit_cards.end(); ++it) {
4321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    CreditCard* card = *it;
4322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* card_info = new DictionaryValue;
4323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // For each of the types, if it has a value, add it to the dictionary.
4324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (std::map<AutofillFieldType, std::string>::iterator type_it =
4325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        credit_card_type_to_string.begin();
4326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        type_it != credit_card_type_to_string.end(); ++type_it) {
4327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      string16 value = card->GetInfo(type_it->first);
4328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // If there was something stored for that value.
4329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (value.length()) {
433072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        card_info->SetString(type_it->second, value);
4331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
4332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
4333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    cards->Append(card_info);
4334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
4335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return cards;
4336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
4337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen/* static */
4339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::vector<AutofillProfile>
4340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTestingAutomationProvider::GetAutofillProfilesFromList(
4341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const ListValue& profiles, std::string* error_message) {
4342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<AutofillProfile> autofill_profiles;
4343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue* profile_info = NULL;
4344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 current_value;
4345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4346dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::map<AutofillFieldType, std::string> autofill_type_to_string =
4347dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      GetAutofillFieldToStringMap();
4348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int num_profiles = profiles.GetSize();
4350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (int i = 0; i < num_profiles; i++) {
4351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    profiles.GetDictionary(i, &profile_info);
4352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutofillProfile profile;
4353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Loop through the possible profile types and add those provided.
4354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (std::map<AutofillFieldType, std::string>::iterator type_it =
4355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen         autofill_type_to_string.begin();
4356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen         type_it != autofill_type_to_string.end(); ++type_it) {
435772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (profile_info->HasKey(type_it->second)) {
435872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (profile_info->GetString(type_it->second,
4359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    &current_value)) {
4360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          profile.SetInfo(type_it->first, current_value);
4361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        } else {
4362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          *error_message= "All values must be strings";
4363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          break;
4364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        }
4365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
4366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
4367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    autofill_profiles.push_back(profile);
4368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
4369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return autofill_profiles;
4370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
4371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen/* static */
4373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::vector<CreditCard> TestingAutomationProvider::GetCreditCardsFromList(
4374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const ListValue& cards, std::string* error_message) {
4375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<CreditCard> credit_cards;
4376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue* card_info = NULL;
4377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 current_value;
4378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4379dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::map<AutofillFieldType, std::string> credit_card_type_to_string =
4380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetCreditCardFieldToStringMap();
4381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int num_credit_cards = cards.GetSize();
4383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (int i = 0; i < num_credit_cards; i++) {
4384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    cards.GetDictionary(i, &card_info);
4385513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    CreditCard card;
4386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Loop through the possible credit card fields and add those provided.
4387dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (std::map<AutofillFieldType, std::string>::iterator type_it =
4388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        credit_card_type_to_string.begin();
4389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        type_it != credit_card_type_to_string.end(); ++type_it) {
439072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (card_info->HasKey(type_it->second)) {
439172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (card_info->GetString(type_it->second, &current_value)) {
4392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          card.SetInfo(type_it->first, current_value);
4393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        } else {
4394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          *error_message= "All values must be strings";
4395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          break;
4396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        }
4397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
4398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
4399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    credit_cards.push_back(card);
4400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
4401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return credit_cards;
4402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
4403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen/* static */
4405dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::map<AutofillFieldType, std::string>
4406dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    TestingAutomationProvider::GetAutofillFieldToStringMap() {
4407dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::map<AutofillFieldType, std::string> autofill_type_to_string;
4408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Strings ordered by order of fields when adding a profile in Autofill prefs.
440972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[NAME_FIRST] = "NAME_FIRST";
441072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[NAME_MIDDLE] = "NAME_MIDDLE";
441172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[NAME_LAST] = "NAME_LAST";
441272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[COMPANY_NAME] = "COMPANY_NAME";
441372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[EMAIL_ADDRESS] = "EMAIL_ADDRESS";
441472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[ADDRESS_HOME_LINE1] = "ADDRESS_HOME_LINE1";
441572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[ADDRESS_HOME_LINE2] = "ADDRESS_HOME_LINE2";
441672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[ADDRESS_HOME_CITY] = "ADDRESS_HOME_CITY";
441772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[ADDRESS_HOME_STATE] = "ADDRESS_HOME_STATE";
441872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[ADDRESS_HOME_ZIP] = "ADDRESS_HOME_ZIP";
441972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[ADDRESS_HOME_COUNTRY] = "ADDRESS_HOME_COUNTRY";
4420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  autofill_type_to_string[PHONE_HOME_COUNTRY_CODE] =
4421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "PHONE_HOME_COUNTRY_CODE";
4422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  autofill_type_to_string[PHONE_HOME_CITY_CODE] = "PHONE_HOME_CITY_CODE";
4423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  autofill_type_to_string[PHONE_HOME_WHOLE_NUMBER] =
442472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "PHONE_HOME_WHOLE_NUMBER";
4425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  autofill_type_to_string[PHONE_FAX_COUNTRY_CODE] = "PHONE_FAX_COUNTRY_CODE";
4426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  autofill_type_to_string[PHONE_FAX_CITY_CODE] = "PHONE_FAX_CITY_CODE";
442772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  autofill_type_to_string[PHONE_FAX_WHOLE_NUMBER] = "PHONE_FAX_WHOLE_NUMBER";
4428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return autofill_type_to_string;
4429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
4430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen/* static */
4432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::map<AutofillFieldType, std::string>
4433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TestingAutomationProvider::GetCreditCardFieldToStringMap() {
4434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::map<AutofillFieldType, std::string> credit_card_type_to_string;
443572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  credit_card_type_to_string[CREDIT_CARD_NAME] = "CREDIT_CARD_NAME";
443672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  credit_card_type_to_string[CREDIT_CARD_NUMBER] = "CREDIT_CARD_NUMBER";
443772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  credit_card_type_to_string[CREDIT_CARD_EXP_MONTH] = "CREDIT_CARD_EXP_MONTH";
4438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  credit_card_type_to_string[CREDIT_CARD_EXP_4_DIGIT_YEAR] =
443972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "CREDIT_CARD_EXP_4_DIGIT_YEAR";
4440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return credit_card_type_to_string;
4441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
4442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4443513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Refer to GetActiveNotifications() in chrome/test/pyautolib/pyauto.py for
4444513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// sample json input/output.
4445513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestingAutomationProvider::GetActiveNotifications(
4446513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Browser* browser,
4447513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DictionaryValue* args,
4448513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    IPC::Message* reply_message) {
444921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  new GetActiveNotificationsObserver(this, reply_message);
4450513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
4451513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4452513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Refer to CloseNotification() in chrome/test/pyautolib/pyauto.py for
4453513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// sample json input.
4454513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Returns empty json message.
4455513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestingAutomationProvider::CloseNotification(
4456513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Browser* browser,
4457513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DictionaryValue* args,
4458513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    IPC::Message* reply_message) {
4459513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int index;
4460513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!args->GetInteger("index", &index)) {
4461dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
4462dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("'index' missing or invalid.");
4463513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
4464513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4465513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  NotificationUIManager* manager = g_browser_process->notification_ui_manager();
4466513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  BalloonCollection* collection = manager->balloon_collection();
4467513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const BalloonCollection::Balloons& balloons = collection->GetActiveBalloons();
4468513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int balloon_count = static_cast<int>(balloons.size());
4469513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (index < 0 || index >= balloon_count) {
4470dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
4471dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError(StringPrintf("No notification at index %d", index));
4472513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
4473513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4474513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This will delete itself when finished.
4475513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  new OnNotificationBalloonCountObserver(
4476513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      this, reply_message, collection, balloon_count - 1);
4477201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  manager->CancelById(balloons[index]->notification().notification_id());
4478513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
4479513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4480513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Refer to WaitForNotificationCount() in chrome/test/pyautolib/pyauto.py for
4481513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// sample json input.
4482513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Returns empty json message.
4483513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestingAutomationProvider::WaitForNotificationCount(
4484513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Browser* browser,
4485513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DictionaryValue* args,
4486513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    IPC::Message* reply_message) {
4487513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int count;
4488513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!args->GetInteger("count", &count)) {
4489dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
4490dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("'count' missing or invalid.");
4491513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
4492513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4493513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  NotificationUIManager* manager = g_browser_process->notification_ui_manager();
4494513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  BalloonCollection* collection = manager->balloon_collection();
4495513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const BalloonCollection::Balloons& balloons = collection->GetActiveBalloons();
4496513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (static_cast<int>(balloons.size()) == count) {
4497513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
4498513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
4499513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4500513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This will delete itself when finished.
4501513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  new OnNotificationBalloonCountObserver(
4502513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      this, reply_message, collection, count);
4503513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
4504513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4505201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Sample JSON input: { "command": "GetNTPInfo" }
4506201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// For output, refer to chrome/test/pyautolib/ntp_model.py.
4507201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid TestingAutomationProvider::GetNTPInfo(
4508201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Browser* browser,
4509201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DictionaryValue* args,
4510201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    IPC::Message* reply_message) {
4511201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // This observer will delete itself.
4512201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  new NTPInfoObserver(this, reply_message, &consumer_);
4513201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
4514201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
4515201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid TestingAutomationProvider::MoveNTPMostVisitedThumbnail(
4516201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Browser* browser,
4517201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DictionaryValue* args,
4518201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    IPC::Message* reply_message) {
4519201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutomationJSONReply reply(this, reply_message);
4520201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string url, error;
4521201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int index, old_index;
4522201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!args->GetString("url", &url)) {
4523201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    reply.SendError("Missing or invalid 'url' key.");
4524201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
4525201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
4526201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!args->GetInteger("index", &index)) {
4527201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    reply.SendError("Missing or invalid 'index' key.");
4528201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
4529201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
4530201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!args->GetInteger("old_index", &old_index)) {
4531201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    reply.SendError("Missing or invalid 'old_index' key");
4532201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
4533201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
4534201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  history::TopSites* top_sites = browser->profile()->GetTopSites();
4535201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!top_sites) {
4536201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    reply.SendError("TopSites service is not initialized.");
4537201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
4538201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
4539201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GURL swapped;
4540201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // If thumbnail A is switching positions with a pinned thumbnail B, B
4541201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // should be pinned in the old index of A.
4542201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (top_sites->GetPinnedURLAtIndex(index, &swapped)) {
4543201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    top_sites->AddPinnedURL(swapped, old_index);
4544201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
4545201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  top_sites->AddPinnedURL(GURL(url), index);
4546201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  reply.SendSuccess(NULL);
4547201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
4548201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
4549201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid TestingAutomationProvider::RemoveNTPMostVisitedThumbnail(
4550201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Browser* browser,
4551201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DictionaryValue* args,
4552201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    IPC::Message* reply_message) {
4553201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutomationJSONReply reply(this, reply_message);
4554201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string url;
4555201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!args->GetString("url", &url)) {
4556201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    reply.SendError("Missing or invalid 'url' key.");
4557201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
4558201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
4559201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  history::TopSites* top_sites = browser->profile()->GetTopSites();
4560201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!top_sites) {
4561201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    reply.SendError("TopSites service is not initialized.");
4562201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
4563201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
4564201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  top_sites->AddBlacklistedURL(GURL(url));
4565201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  reply.SendSuccess(NULL);
4566201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
4567201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
4568201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid TestingAutomationProvider::UnpinNTPMostVisitedThumbnail(
4569201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Browser* browser,
4570201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DictionaryValue* args,
4571201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    IPC::Message* reply_message) {
4572201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutomationJSONReply reply(this, reply_message);
4573201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string url;
4574201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!args->GetString("url", &url)) {
4575201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    reply.SendError("Missing or invalid 'url' key.");
4576201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
4577201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
4578201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  history::TopSites* top_sites = browser->profile()->GetTopSites();
4579201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!top_sites) {
4580201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    reply.SendError("TopSites service is not initialized.");
4581201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
4582201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
4583201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  top_sites->RemovePinnedURL(GURL(url));
4584201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  reply.SendSuccess(NULL);
4585201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
4586201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
4587201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid TestingAutomationProvider::RestoreAllNTPMostVisitedThumbnails(
4588201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Browser* browser,
4589201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DictionaryValue* args,
4590201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    IPC::Message* reply_message) {
4591201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutomationJSONReply reply(this, reply_message);
4592201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  history::TopSites* top_sites = browser->profile()->GetTopSites();
4593201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!top_sites) {
4594201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    reply.SendError("TopSites service is not initialized.");
4595201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
4596201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
4597201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  top_sites->ClearBlacklistedURLs();
4598201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  reply.SendSuccess(NULL);
4599201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
4600201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
460121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid TestingAutomationProvider::KillRendererProcess(
460221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    Browser* browser,
460321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    DictionaryValue* args,
460421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    IPC::Message* reply_message) {
460521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  int pid;
460621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!args->GetInteger("pid", &pid)) {
4607dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
4608dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("'pid' key missing or invalid.");
460921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return;
461021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
461121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  base::ProcessHandle process;
461221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!base::OpenProcessHandle(static_cast<base::ProcessId>(pid), &process)) {
461321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    AutomationJSONReply(this, reply_message).SendError(base::StringPrintf(
461421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        "Failed to open process handle for pid %d", pid));
461521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return;
461621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
461721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  new RendererProcessClosedObserver(this, reply_message);
461821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  base::KillProcess(process, 0, false);
461921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  base::CloseProcessHandle(process);
462021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
462121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4622ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool TestingAutomationProvider::BuildWebKeyEventFromArgs(
462372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DictionaryValue* args,
4624ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string* error,
4625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NativeWebKeyboardEvent* event) {
462672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int type, modifiers;
462772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool is_system_key;
462872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 unmodified_text, text;
462972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string key_identifier;
463072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!args->GetInteger("type", &type)) {
4631ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *error = "'type' missing or invalid.";
4632ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
463372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
463472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!args->GetBoolean("isSystemKey", &is_system_key)) {
4635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *error = "'isSystemKey' missing or invalid.";
4636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
463772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
463872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!args->GetString("unmodifiedText", &unmodified_text)) {
4639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *error = "'unmodifiedText' missing or invalid.";
4640ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
464172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
464272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!args->GetString("text", &text)) {
4643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *error = "'text' missing or invalid.";
4644ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
464572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
4646ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetInteger("nativeKeyCode", &event->nativeKeyCode)) {
4647ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *error = "'nativeKeyCode' missing or invalid.";
4648ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
464972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
4650ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetInteger("windowsKeyCode", &event->windowsKeyCode)) {
4651ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *error = "'windowsKeyCode' missing or invalid.";
4652ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
465372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
465472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!args->GetInteger("modifiers", &modifiers)) {
4655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *error = "'modifiers' missing or invalid.";
4656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
465772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
465872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (args->GetString("keyIdentifier", &key_identifier)) {
4659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    base::strlcpy(event->keyIdentifier,
466072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                  key_identifier.c_str(),
466172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                  WebKit::WebKeyboardEvent::keyIdentifierLengthCap);
466272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else {
4663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    event->setKeyIdentifierFromWindowsKeyCode();
466472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
466572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
466672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (type == automation::kRawKeyDownType) {
4667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    event->type = WebKit::WebInputEvent::RawKeyDown;
466872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (type == automation::kKeyDownType) {
4669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    event->type = WebKit::WebInputEvent::KeyDown;
467072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (type == automation::kKeyUpType) {
4671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    event->type = WebKit::WebInputEvent::KeyUp;
467272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (type == automation::kCharType) {
4673ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    event->type = WebKit::WebInputEvent::Char;
467472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else {
4675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *error = "'type' refers to an unrecognized keyboard event type";
4676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
467772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
467872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
467972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 unmodified_text_truncated = unmodified_text.substr(
468072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      0, WebKit::WebKeyboardEvent::textLengthCap - 1);
4681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  memcpy(event->unmodifiedText,
468272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen         unmodified_text_truncated.c_str(),
468372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen         unmodified_text_truncated.length() + 1);
468472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 text_truncated = text.substr(
468572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      0, WebKit::WebKeyboardEvent::textLengthCap - 1);
4686ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  memcpy(event->text, text_truncated.c_str(), text_truncated.length() + 1);
468772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  event->modifiers = 0;
468972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (modifiers & automation::kShiftKeyMask)
4690ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    event->modifiers |= WebKit::WebInputEvent::ShiftKey;
469172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (modifiers & automation::kControlKeyMask)
4692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    event->modifiers |= WebKit::WebInputEvent::ControlKey;
469372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (modifiers & automation::kAltKeyMask)
4694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    event->modifiers |= WebKit::WebInputEvent::AltKey;
469572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (modifiers & automation::kMetaKeyMask)
4696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    event->modifiers |= WebKit::WebInputEvent::MetaKey;
469772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  event->isSystemKey = is_system_key;
4699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  event->timeStampSeconds = base::Time::Now().ToDoubleT();
4700ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  event->skip_in_browser = true;
4701ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
4702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
4703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::SendWebkitKeyEvent(
4705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args,
4706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC::Message* reply_message) {
4707ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NativeWebKeyboardEvent event;
4708ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // BuildWebKeyEventFromArgs handles telling what when wrong and sending
4709ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the reply message, if it failed we just have to stop here.
4710ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string error;
4711ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!BuildWebKeyEventFromArgs(args, &error, &event)) {
4712ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
4713ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4714ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4715ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4716ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContents* tab_contents;
4717ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
4718ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
4719ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
472172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  new InputEventAckNotificationObserver(this, reply_message, event.type);
4722dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents->render_view_host()->ForwardKeyboardEvent(event);
4723dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
4724dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::SendOSLevelKeyEventToTab(
4726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args,
4727ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC::Message* reply_message) {
4728ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int modifiers, keycode;
4729ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetInteger("keyCode", &keycode)) {
4730ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message)
4731ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .SendError("'keyCode' missing or invalid.");
4732ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4733ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4734ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetInteger("modifiers", &modifiers)) {
4735ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message)
4736ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .SendError("'modifiers' missing or invalid.");
4737ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4738ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4739ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4740ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string error;
4741ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Browser* browser;
4742ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContents* tab_contents;
4743ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab_contents, &error)) {
4744ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
4745ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4746ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4747ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The key events will be sent to the browser window, we need the current tab
4748ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // containing the element we send the text in to be shown.
4749ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser->ActivateTabAt(
4750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      browser->GetIndexOfController(&tab_contents->controller()), true);
4751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4752ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BrowserWindow* browser_window = browser->window();
4753ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!browser_window) {
4754ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message)
4755ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .SendError("Could not get the browser window");
4756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  gfx::NativeWindow window = browser_window->GetNativeHandle();
4759ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!window) {
4760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message)
4761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .SendError("Could not get the browser window handle");
4762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool control = !!(modifiers & automation::kControlKeyMask);
4766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool shift = !!(modifiers & automation::kShiftKeyMask);
4767ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool alt = !!(modifiers & automation::kAltKeyMask);
4768ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool meta = !!(modifiers & automation::kMetaKeyMask);
4769ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!ui_controls::SendKeyPressNotifyWhenDone(
4770ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          window, static_cast<ui::KeyboardCode>(keycode),
4771ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          control, shift, alt, meta,
4772ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          NewRunnableMethod(this,
4773ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              &TestingAutomationProvider::SendSuccessReply, reply_message))) {
4774ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message)
4775ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .SendError("Could not send the native key event");
4776ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
4778ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4779ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::SendSuccessReply(IPC::Message* reply_message) {
4780ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(NULL);
4781ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
4782ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4783dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Sample JSON input: { "command": "GetNTPThumbnailMode" }
4784dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// For output, refer to GetNTPThumbnailMode() in
4785dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// chrome/test/pyautolib/pyauto.py.
4786dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::GetNTPThumbnailMode(
4787dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Browser* browser,
4788dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
4789dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
4790dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const int shown_sections = ShownSectionsHandler::GetShownSections(
4791dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      browser->profile()->GetPrefs());
4792dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
4794dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return_value->SetBoolean("apps", shown_sections & APPS ? true : false);
4795dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return_value->SetBoolean("most_visited",
4796dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                           shown_sections & THUMB ? true : false);
4797dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4798dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply reply(this, reply_message);
4799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply.SendSuccess(return_value.get());
4800dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
4801dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4802dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Sample JSON input: { "command": "SetNTPThumbnailMode", "section": "apps",
4803dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//                      "turn_on": true }
4804dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Refer to SetNTPThumbnailMode() in chrome/test/pyautolib/pyauto.py for
4805dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// all possible input values.
4806dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Sample JSON output: {}
4807dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::SetNTPThumbnailMode(
4808dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Browser* browser,
4809dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
4810dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
4811dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply reply(this, reply_message);
4812dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string section_name;
4813dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool turn_on;
4814dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetString("section", &section_name) ||
4815dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !args->GetBoolean("turn_on", &turn_on)) {
4816dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError("Invalid or missing args");
4817dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
4818dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4819dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4820dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PrefService* prefs = browser->profile()->GetPrefs();
4821dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Section section;
4822dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (section_name.compare("apps") == 0) {
4823dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    section = APPS;
4824dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (section_name.compare("most_visited") == 0) {
4825dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    section = THUMB;
4826dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (section_name.compare("recently_closed") == 0) {
4827dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError("Thumbnail mode does not apply to the recently closed "
4828dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                    "section.");
4829dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
4830dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
4831dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError(StringPrintf("Unexpected section name: '%s'",
4832dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                 section_name.c_str()));
4833dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
4834dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4835dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4836dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (turn_on) {
4837dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ShownSectionsHandler::SetShownSection(prefs, section);
4838dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
4839dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int shown_sections = ShownSectionsHandler::GetShownSections(prefs);
4840dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Change the bit for the relevant section in the bitmask to 0.
4841dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    shown_sections &= ~(0xFFFFFFFF & section);
4842dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    prefs->SetInteger(prefs::kNTPShownSections, shown_sections);
4843dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4844dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4845dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  reply.SendSuccess(NULL);
4846dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
4847dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4848dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Sample JSON input: { "command": "GetNTPMenuMode" }
4849dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// For output, refer to GetNTPMenuMode() in
4850dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// chrome/test/pyautolib/pyauto.py.
4851dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::GetNTPMenuMode(
4852dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Browser* browser,
4853dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
4854dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
4855dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const int shown_sections = ShownSectionsHandler::GetShownSections(
4856dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      browser->profile()->GetPrefs());
4857dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4858ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
4859dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return_value->SetBoolean("apps", shown_sections & MENU_APPS ? true : false);
4860dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return_value->SetBoolean("most_visited",
4861dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                           shown_sections & MENU_THUMB ? true : false);
4862dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return_value->SetBoolean("recently_closed",
4863dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                           shown_sections & MENU_RECENT ? true : false);
4864dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4865dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply reply(this, reply_message);
4866ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply.SendSuccess(return_value.get());
4867dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
4868dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4869dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Sample JSON input: { "command": "SetNTPMenuMode", "section": "apps",
4870dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//                      "turn_on": false }
4871dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Refer to SetNTPMenuMode() in chrome/test/pyautolib/pyauto.py for all possible
4872dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// input values.
4873dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Sample JSON output: {}
4874dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::SetNTPMenuMode(
4875dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Browser* browser,
4876dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
4877dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
4878dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply reply(this, reply_message);
4879dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string section_name;
4880dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool turn_on;
4881dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetString("section", &section_name) ||
4882dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !args->GetBoolean("turn_on", &turn_on)) {
4883dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError("Invalid or missing args");
4884dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
4885dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4886dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4887dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PrefService* prefs = browser->profile()->GetPrefs();
4888dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Section section;
4889dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (section_name.compare("apps") == 0) {
4890dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    section = MENU_APPS;
4891dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (section_name.compare("most_visited") == 0) {
4892dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    section = MENU_THUMB;
4893dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (section_name.compare("recently_closed") == 0) {
4894dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    section = MENU_RECENT;
4895dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
4896dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError(StringPrintf("Unexpected section name: '%s'",
4897dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                 section_name.c_str()));
4898dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
4899dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4900dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4901dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int shown_sections = ShownSectionsHandler::GetShownSections(prefs);
4902dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (turn_on) {
4903dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Change the bit for the relevant section in the bitmask to 1.
4904dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    shown_sections |= section;
4905dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
4906dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Change the bit for the relevant section in the bitmask to 0.
4907dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    shown_sections &= ~(0xFFFFFFFF & section);
4908dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4909dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->SetInteger(prefs::kNTPShownSections, shown_sections);
4910dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4911dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  reply.SendSuccess(NULL);
4912dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
4913dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4914ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Sample JSON input: { "command": "LaunchApp",
4915ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//                      "id": "ahfgeienlihckogmohjhadlkjgocpleb" }
4916ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Sample JSON output: {}
4917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::LaunchApp(
4918ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Browser* browser,
4919ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args,
4920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC::Message* reply_message) {
4921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string id;
4922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetString("id", &id)) {
4923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
4924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "Must include string id.");
4925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4926ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4928ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionService* service = browser->profile()->GetExtensionService();
4929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!service) {
4930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
4931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "No extensions service.");
4932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension* extension = service->GetExtensionById(
4936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      id, false  /* do not include disabled extensions */);
4937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!extension) {
4938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
4939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        StringPrintf("Extension with ID '%s' doesn't exist or is disabled.",
4940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     id.c_str()));
4941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Look at preferences to find the right launch container.  If no preference
4945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // is set, launch as a regular tab.
4946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension_misc::LaunchContainer launch_container =
4947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      service->extension_prefs()->GetLaunchContainer(
4948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          extension, ExtensionPrefs::LAUNCH_REGULAR);
4949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContents* old_contents = browser->GetSelectedTabContents();
4951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!old_contents) {
4952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
4953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "Cannot identify selected tab contents.");
4954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4955ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4956ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4957ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // This observer will delete itself.
4958ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  new AppLaunchObserver(&old_contents->controller(), this, reply_message,
4959ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        launch_container);
4960ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Browser::OpenApplication(profile(), extension, launch_container,
4961ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           old_contents);
4962ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
4963ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4964ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Sample JSON input: { "command": "SetAppLaunchType",
4965ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//                      "id": "ahfgeienlihckogmohjhadlkjgocpleb",
4966ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//                      "launch_type": "pinned" }
4967ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Sample JSON output: {}
4968ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::SetAppLaunchType(
4969ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Browser* browser,
4970ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args,
4971ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC::Message* reply_message) {
4972ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply reply(this, reply_message);
4973ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4974ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string id;
4975ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetString("id", &id)) {
4976ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError("Must include string id.");
4977ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4978ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4979ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4980ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string launch_type_str;
4981ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetString("launch_type", &launch_type_str)) {
4982ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError("Must specify app launch type.");
4983ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4984ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4985ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4986ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionService* service = browser->profile()->GetExtensionService();
4987ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!service) {
4988ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError("No extensions service.");
4989ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4990ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4991ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4992ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension* extension = service->GetExtensionById(
4993ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      id, true  /* include disabled extensions */);
4994ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!extension) {
4995ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError(
4996ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        StringPrintf("Extension with ID '%s' doesn't exist.", id.c_str()));
4997ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
4998ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4999ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5000ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionPrefs::LaunchType launch_type;
5001ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (launch_type_str == "pinned") {
5002ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    launch_type = ExtensionPrefs::LAUNCH_PINNED;
5003ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (launch_type_str == "regular") {
5004ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    launch_type = ExtensionPrefs::LAUNCH_REGULAR;
5005ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (launch_type_str == "fullscreen") {
5006ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    launch_type = ExtensionPrefs::LAUNCH_FULLSCREEN;
5007ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (launch_type_str == "window") {
5008ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    launch_type = ExtensionPrefs::LAUNCH_WINDOW;
5009ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
5010ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    reply.SendError(
5011ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        StringPrintf("Unexpected launch type '%s'.", launch_type_str.c_str()));
5012ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
5013ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
5014ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5015ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  service->extension_prefs()->SetLaunchType(extension->id(), launch_type);
5016ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply.SendSuccess(NULL);
5017ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
5018ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5019dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::WaitForAllTabsToStopLoading(
5020dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
5021dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
5022ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // This class will send the message immediately if no tab is loading.
5023dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  new AllTabsStoppedLoadingObserver(this, reply_message);
5024dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5025dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5026dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::GetIndicesFromTab(
5027dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
5028dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
5029dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply reply(this, reply_message);
5030dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int id_or_handle = 0;
5031dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool has_id = args->HasKey("tab_id");
5032dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool has_handle = args->HasKey("tab_handle");
5033dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (has_id && has_handle) {
5034dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError(
5035dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        "Both 'tab_id' and 'tab_handle' were specified. Only one is allowed");
5036dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5037dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (!has_id && !has_handle) {
5038dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError("Either 'tab_id' or 'tab_handle' must be specified");
5039dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5040dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5041dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (has_id && !args->GetInteger("tab_id", &id_or_handle)) {
5042dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError("'tab_id' is invalid");
5043dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5044dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5045dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (has_handle && (!args->GetInteger("tab_handle", &id_or_handle) ||
5046dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                     !tab_tracker_->ContainsHandle(id_or_handle))) {
5047dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError("'tab_handle' is invalid");
5048dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5049dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5050dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int id = id_or_handle;
5051dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (has_handle)
5052dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    id = tab_tracker_->GetResource(id_or_handle)->session_id().id();
5053dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BrowserList::const_iterator iter = BrowserList::begin();
5054dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int browser_index = 0;
5055dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (; iter != BrowserList::end(); ++iter, ++browser_index) {
5056dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Browser* browser = *iter;
5057dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (int tab_index = 0; tab_index < browser->tab_count(); ++tab_index) {
5058dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      TabContents* tab = browser->GetTabContentsAt(tab_index);
5059dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (tab->controller().session_id().id() == id) {
5060dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DictionaryValue dict;
5061dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        dict.SetInteger("windex", browser_index);
5062dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        dict.SetInteger("tab_index", tab_index);
5063dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        reply.SendSuccess(&dict);
5064dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return;
5065dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
5066dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
5067dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5068dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  reply.SendError("Could not find tab among current browser windows");
5069dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5070dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5071dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::NavigateToURL(
5072dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
5073dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
5074dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int navigation_count;
5075dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string url, error;
5076dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Browser* browser;
5077dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
5078dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab_contents, &error)) {
5079dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
5080dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5081dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5082dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetString("url", &url)) {
5083dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
5084dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("'url' missing or invalid");
5085dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5086dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5087dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetInteger("navigation_count", &navigation_count)) {
5088dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
5089dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("'navigation_count' missing or invalid");
5090dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5091dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5092dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  new NavigationNotificationObserver(
5093dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      &tab_contents->controller(), this, reply_message,
5094dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      navigation_count, false, true);
5095dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  browser->OpenURLFromTab(
5096dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      tab_contents, GURL(url), GURL(), CURRENT_TAB, PageTransition::TYPED);
5097dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5098dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5099dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::ExecuteJavascriptJSON(
5100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
5101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
5102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 frame_xpath, javascript;
5103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
5104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
5105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
5107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetString("frame_xpath", &frame_xpath)) {
5110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
5111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("'frame_xpath' missing or invalid");
5112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetString("javascript", &javascript)) {
5115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message)
5116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .SendError("'javascript' missing or invalid");
5117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Set the routing id of this message with the controller.
5121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This routing id needs to be remembered for the reverse
5122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // communication while sending back the response of
5123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // this javascript execution.
5124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string set_automation_id;
5125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::SStringPrintf(&set_automation_id,
5126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                      "window.domAutomationController.setAutomationId(%d);",
5127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                      reply_message->routing_id());
5128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  new DomOperationMessageSender(this, reply_message, true);
5130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents->render_view_host()->ExecuteJavascriptInWebFrame(
5131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      frame_xpath, UTF8ToUTF16(set_automation_id));
5132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents->render_view_host()->ExecuteJavascriptInWebFrame(
5133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      frame_xpath, javascript);
5134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::GoForward(
5137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
5138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
5139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
5140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
5141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
5143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NavigationController& controller = tab_contents->controller();
5146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!controller.CanGoForward()) {
5147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue dict;
5148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    dict.SetBoolean("did_go_forward", false);
5149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message).SendSuccess(&dict);
5150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  new NavigationNotificationObserver(&controller, this, reply_message,
5153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     1, false, true);
5154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  controller.GoForward();
5155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::GoBack(
5158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
5159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
5160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
5161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
5162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
5164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NavigationController& controller = tab_contents->controller();
5167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!controller.CanGoBack()) {
5168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue dict;
5169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    dict.SetBoolean("did_go_back", false);
5170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message).SendSuccess(&dict);
5171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  new NavigationNotificationObserver(&controller, this, reply_message,
5174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     1, false, true);
5175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  controller.GoBack();
5176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::ReloadJSON(
5179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
5180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
5181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
5182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
5183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
5185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NavigationController& controller = tab_contents->controller();
5188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  new NavigationNotificationObserver(&controller, this, reply_message,
5189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     1, false, true);
5190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  controller.Reload(false);
5191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::GetTabURLJSON(
5194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
5195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
5196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply reply(this, reply_message);
5197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
5198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
5199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError(error);
5201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DictionaryValue dict;
5204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  dict.SetString("url", tab_contents->GetURL().possibly_invalid_spec());
5205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  reply.SendSuccess(&dict);
5206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::GetTabTitleJSON(
5209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
5210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
5211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply reply(this, reply_message);
5212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
5213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
5214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError(error);
5216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DictionaryValue dict;
5219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  dict.SetString("title", tab_contents->GetTitle());
5220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  reply.SendSuccess(&dict);
5221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::CaptureEntirePageJSON(
5224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args,
5225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC::Message* reply_message) {
5226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContents* tab_contents;
5227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
5228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(error);
5231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FilePath::StringType path_str;
5235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!args->GetString("path", &path_str)) {
5236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message)
5237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .SendError("'path' missing or invalid");
5238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RenderViewHost* render_view = tab_contents->render_view_host();
5242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (render_view) {
5243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    FilePath path(path_str);
5244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // This will delete itself when finished.
5245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PageSnapshotTaker* snapshot_taker = new PageSnapshotTaker(
5246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        this, reply_message, render_view, path);
5247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    snapshot_taker->Start();
5248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
5249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message)
5250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .SendError("Tab has no associated RenderViewHost");
5251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
5253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::GetCookiesJSON(
5255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
5256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  automation_util::GetCookiesJSON(this, args, reply_message);
5257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::DeleteCookieJSON(
5260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
5261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  automation_util::DeleteCookieJSON(this, args, reply_message);
5262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5264dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::SetCookieJSON(
5265dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
5266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  automation_util::SetCookieJSON(this, args, reply_message);
5267dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5268dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5269dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::GetTabIds(
5270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
5271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ListValue* id_list = new ListValue();
5272dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BrowserList::const_iterator iter = BrowserList::begin();
5273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (; iter != BrowserList::end(); ++iter) {
5274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Browser* browser = *iter;
5275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (int i = 0; i < browser->tab_count(); ++i) {
5276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      int id = browser->GetTabContentsAt(i)->controller().session_id().id();
5277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      id_list->Append(Value::CreateIntegerValue(id));
5278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
5279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DictionaryValue dict;
5281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  dict.Set("ids", id_list);
5282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
5283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::IsTabIdValid(
5286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
5287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply reply(this, reply_message);
5288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int id;
5289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetInteger("id", &id)) {
5290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError("'id' missing or invalid");
5291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool is_valid = false;
5294dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BrowserList::const_iterator iter = BrowserList::begin();
5295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (; iter != BrowserList::end(); ++iter) {
5296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Browser* browser = *iter;
5297dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (int i = 0; i < browser->tab_count(); ++i) {
5298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      TabContents* tab = browser->GetTabContentsAt(i);
5299dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (tab->controller().session_id().id() == id) {
5300dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        is_valid = true;
5301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
5302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
5303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
5304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5305dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DictionaryValue dict;
5306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  dict.SetBoolean("is_valid", is_valid);
5307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  reply.SendSuccess(&dict);
5308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::CloseTabJSON(
5311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args, IPC::Message* reply_message) {
5312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply reply(this, reply_message);
5313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Browser* browser;
5314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
5315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
5316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab_contents, &error)) {
5317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError(error);
5318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  browser->CloseTabContents(tab_contents);
5321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  reply.SendSuccess(NULL);
5322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::ActivateTabJSON(
5325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DictionaryValue* args,
5326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC::Message* reply_message) {
5327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutomationJSONReply reply(this, reply_message);
5328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Browser* browser;
5329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents;
5330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string error;
5331dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab_contents, &error)) {
5332dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    reply.SendError(error);
5333dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
5334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser->ActivateTabAt(
5336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      browser->GetIndexOfController(&tab_contents->controller()), true);
5337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  reply.SendSuccess(NULL);
533872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
533972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Sample json input: { "command": "UpdateExtensionsNow" }
5341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Sample json output: {}
5342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::UpdateExtensionsNow(
5343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args,
5344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC::Message* reply_message) {
5345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionService* service = profile()->GetExtensionService();
5346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!service) {
5347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
5348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "No extensions service.");
5349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
5350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
5351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionUpdater* updater = service->updater();
5353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!updater) {
5354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
5355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "No updater for extensions service.");
5356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
5357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
5358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionProcessManager* manager = profile()->GetExtensionProcessManager();
5360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!manager) {
5361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutomationJSONReply(this, reply_message).SendError(
5362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "No extension process manager.");
5363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
5364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
5365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Create a new observer that waits until the extensions have been fully
5367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // updated (we should not send the reply until after all extensions have
5368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // been updated).  This observer will delete itself.
5369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  new ExtensionsUpdatedObserver(manager, this, reply_message);
5370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  updater->CheckNow();
5371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
5372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TestingAutomationProvider::GetChromeDriverAutomationVersion(
5374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue* args,
5375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC::Message* reply_message) {
5376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DictionaryValue reply_dict;
5377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  reply_dict.SetInteger("version", automation::kChromeDriverAutomationVersion);
5378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationJSONReply(this, reply_message).SendSuccess(&reply_dict);
5379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
5380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WaitForTabCountToBecome(
5382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int browser_handle,
5383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int target_tab_count,
5384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
5385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!browser_tracker_->ContainsHandle(browser_handle)) {
5386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_WaitForTabCountToBecome::WriteReplyParams(reply_message,
5387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                            false);
5388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message);
5389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
5390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
5391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Browser* browser = browser_tracker_->GetResource(browser_handle);
5393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The observer will delete itself.
5395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  new TabCountChangeObserver(this, browser, reply_message, target_tab_count);
5396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
5397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::WaitForInfoBarCount(
5399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int tab_handle,
540072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    size_t target_count,
5401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_message) {
5402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!tab_tracker_->ContainsHandle(tab_handle)) {
5403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_WaitForInfoBarCount::WriteReplyParams(reply_message_, false);
5404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message_);
5405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
5406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
5407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NavigationController* controller = tab_tracker_->GetResource(tab_handle);
5409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!controller) {
5410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AutomationMsg_WaitForInfoBarCount::WriteReplyParams(reply_message_, false);
5411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Send(reply_message_);
5412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
5413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
5414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The delegate will delete itself.
5416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  new InfoBarCountObserver(this, reply_message, controller->tab_contents(),
5417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                           target_count);
5418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
5419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Gets the current used encoding name of the page in the specified tab.
5421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::GetPageCurrentEncoding(
5422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int tab_handle, std::string* current_encoding) {
5423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_tracker_->ContainsHandle(tab_handle)) {
5424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NavigationController* nav = tab_tracker_->GetResource(tab_handle);
5425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = FindAndActivateTab(nav);
5426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DCHECK(browser);
5427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (browser->command_updater()->IsCommandEnabled(IDC_ENCODING_MENU))
5429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *current_encoding = nav->tab_contents()->encoding();
5430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
5431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
5432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ShutdownSessionService(int handle,
5434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                                       bool* result) {
5435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
5436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
5437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser->profile()->ShutdownSessionService();
5438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *result = true;
5439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
5440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *result = false;
5441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
5442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
5443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::SetContentSetting(
5445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int handle,
5446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::string& host,
5447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ContentSettingsType content_type,
5448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ContentSetting setting,
5449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* success) {
5450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  *success = false;
5451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser_tracker_->ContainsHandle(handle)) {
5452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Browser* browser = browser_tracker_->GetResource(handle);
5453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    HostContentSettingsMap* map =
5454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        browser->profile()->GetHostContentSettingsMap();
5455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (host.empty()) {
5456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      map->SetDefaultContentSetting(content_type, setting);
5457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else {
545821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      map->SetContentSetting(ContentSettingsPattern(host),
5459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                             content_type, "", setting);
5460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
5461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    *success = true;
5462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
5463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
5464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5465513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestingAutomationProvider::LoadBlockedPlugins(int tab_handle,
5466513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                   bool* success) {
5467513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  *success = false;
5468513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (tab_tracker_->ContainsHandle(tab_handle)) {
5469513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NavigationController* nav = tab_tracker_->GetResource(tab_handle);
5470513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!nav)
5471513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
5472513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TabContents* contents = nav->tab_contents();
5473513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!contents)
5474513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
5475513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    contents->render_view_host()->LoadBlockedPlugins();
5476513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    *success = true;
5477513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
5478513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
5479513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
5480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::ResetToDefaultTheme() {
5481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ThemeServiceFactory::GetForProfile(profile_)->UseDefaultTheme();
5482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
5483bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
548472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TestingAutomationProvider::WaitForProcessLauncherThreadToGoIdle(
548572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    IPC::Message* reply_message) {
548672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  new WaitForProcessLauncherThreadToGoIdleObserver(this, reply_message);
548772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
548872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5489dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestingAutomationProvider::GetParentBrowserOfTab(int tab_handle,
5490dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                      int* browser_handle,
5491dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                      bool* success) {
5492dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  *success = false;
5493dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (tab_tracker_->ContainsHandle(tab_handle)) {
5494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NavigationController* controller = tab_tracker_->GetResource(tab_handle);
5495dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int index;
5496dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Browser* browser = Browser::GetBrowserForController(controller, &index);
5497dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (browser) {
5498dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      *browser_handle = browser_tracker_->Add(browser);
5499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      *success = true;
5500dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
5501dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5502dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
5503dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TODO(brettw) change this to accept GURLs when history supports it
5505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::OnRedirectQueryComplete(
5506bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    HistoryService::Handle request_handle,
5507bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    GURL from_url,
5508bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool success,
5509bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    history::RedirectList* redirects) {
5510dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK_EQ(redirect_query_, request_handle);
5511bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(reply_message_ != NULL);
5512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<GURL> redirects_gurl;
5514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply_message_->WriteBool(success);
5515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (success) {
5516bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    for (size_t i = 0; i < redirects->size(); i++)
5517bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      redirects_gurl.push_back(redirects->at(i));
5518bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
5519bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  IPC::ParamTraits<std::vector<GURL> >::Write(reply_message_, redirects_gurl);
5521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5522bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_message_);
5523bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  redirect_query_ = 0;
5524bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  reply_message_ = NULL;
5525bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
5526bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5527bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestingAutomationProvider::OnRemoveProvider() {
5528bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AutomationProviderList::GetInstance()->RemoveProvider(this);
5529bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
5530