12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/testing_automation_provider.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/string_escape.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
21bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process.h"
22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process_iterator.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_controller.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_match.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_result.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_browser_tracker.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_provider_json.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_provider_list.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_provider_observers.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_tab_tracker.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_util.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_window_tracker.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_storage.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h"
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_shelf.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/save_package_file_picker.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/browser_action_test_util.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/crx_installer.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action_manager.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_process_manager.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/unpacked_installer.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/updater/extension_updater.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites.h"
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/confirm_infobar_delegate.h"
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/balloon.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/balloon_collection.h"
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/notifications/balloon_notification_ui_manager.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_change.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_factory.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_prefs.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
809ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/profiles/profile_window.h"
819ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/profiles/profiles_state.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url.h"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service_factory.h"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h"
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_bar.h"
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h"
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.h"
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar.h"
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar_controller.h"
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_exit_bubble_type.h"
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/login/login_prompt.h"
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/location_bar.h"
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_edit_model.h"
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_view.h"
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search_engines/keyword_editor_controller.h"
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_types.h"
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/automation_constants.h"
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/automation_id.h"
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/automation_messages.h"
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/chrome_paths.h"
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/background_info.h"
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_url_handler.h"
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/permissions/permission_set.h"
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/common/extensions/permissions/permissions_data.h"
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_child_process_host_iterator.h"
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_data.h"
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/favicon_status.h"
126b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/public/browser/geolocation_provider.h"
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page_delegate.h"
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h"
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/child_process_host.h"
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits.h"
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/drop_data.h"
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/geoposition.h"
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/ssl_status.h"
141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h"
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/browser/view_type_utils.h"
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern.h"
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern_set.h"
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store.h"
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event_constants.h"
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h"
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_types.h"
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/policy_service.h"
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <mach/mach.h>
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <mach/mach_vm.h>
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h"
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
168a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING)
169a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#include "chrome/browser/printing/print_preview_dialog_controller.h"
170a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#endif
171a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using automation::Error;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using automation::ErrorCode;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using automation_util::SendErrorIfModalDialogActive;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserChildProcessHostIterator;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ChildProcessHost;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManager;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NativeWebKeyboardEvent;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::PluginService;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::SSLStatus;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::ExtensionActionManager;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::ExtensionList;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper to reply asynchronously if |automation| is still valid.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SendSuccessReply(base::WeakPtr<AutomationProvider> automation,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      IPC::Message* reply_message) {
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (automation.get())
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(automation.get(), reply_message).SendSuccess(NULL);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper to process the result of CanEnablePlugin.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidEnablePlugin(base::WeakPtr<AutomationProvider> automation,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     IPC::Message* reply_message,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const base::FilePath::StringType& path,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& error_msg,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     bool did_enable) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (did_enable) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendSuccessReply(automation, reply_message);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (automation.get()) {
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      AutomationJSONReply(automation.get(), reply_message)
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          .SendError(base::StringPrintf(error_msg.c_str(), path.c_str()));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper to resolve the overloading of PostTask.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PostTask(BrowserThread::ID id, const base::Closure& callback) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(id, FROM_HERE, callback);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutomationInterstitialPage : public content::InterstitialPageDelegate {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationInterstitialPage(WebContents* tab,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const GURL& url,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const std::string& contents)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : contents_(contents) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_ = InterstitialPage::Create(tab, true, url, this);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Show();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetHTMLContents() OVERRIDE { return contents_; }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string contents_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* interstitial_page_;  // Owns us.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AutomationInterstitialPage);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int TestingAutomationProvider::kSynchronousCommands[] = {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDC_HOME,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDC_SELECT_NEXT_TAB,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDC_SELECT_PREVIOUS_TAB,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDC_SHOW_BOOKMARK_MANAGER,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestingAutomationProvider::TestingAutomationProvider(Profile* profile)
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : AutomationProvider(profile) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserList::AddObserver(this);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_SESSION_END,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChromeosObservers();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestingAutomationProvider::~TestingAutomationProvider() {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveChromeosObservers();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserList::RemoveObserver(this);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IPC::Channel::Mode TestingAutomationProvider::GetChannelMode(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool use_named_interface) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (use_named_interface)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return IPC::Channel::MODE_OPEN_NAMED_SERVER;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return IPC::Channel::MODE_NAMED_SERVER;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return IPC::Channel::MODE_CLIENT;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OnBrowserAdded(Browser* browser) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OnBrowserRemoved(Browser* browser) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS) && !defined(OS_MACOSX)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For backwards compatibility with the testing automation interface, we
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // want the automation provider (and hence the process) to go away when the
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // last browser goes away.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The automation layer doesn't support non-native desktops.
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->empty() &&
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !CommandLine::ForCurrentProcess()->HasSwitch(
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          switches::kKeepAliveForTest)) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If you change this, update Observer for chrome::SESSION_END
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // below.
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&TestingAutomationProvider::OnRemoveProvider, this));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS) && !defined(OS_MACOSX)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::Observe(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type == chrome::NOTIFICATION_SESSION_END);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnBrowserRemoved does a ReleaseLater. When session end is received we exit
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before the task runs resulting in this object not being deleted. This
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Release balance out the Release scheduled by OnBrowserRemoved.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Release();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestingAutomationProvider::OnMessageReceived(
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& message) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadRestrictions::ScopedAllowWait allow_wait;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deserialize_success = true;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP_EX(TestingAutomationProvider,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           message,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           deserialize_success)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_CloseBrowser, CloseBrowser)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_ActivateTab, ActivateTab)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_AppendTab, AppendTab)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_GetMachPortCount, GetMachPortCount)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_ActiveTabIndex, GetActiveTabIndex)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_CloseTab, CloseTab)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_GetCookies, GetCookies)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutomationMsg_NavigateToURLBlockUntilNavigationsComplete,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NavigateToURLBlockUntilNavigationsComplete)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_NavigationAsync, NavigationAsync)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_Reload, Reload)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_BrowserWindowCount, GetBrowserWindowCount)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_NormalBrowserWindowCount,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GetNormalBrowserWindowCount)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_BrowserWindow, GetBrowserWindow)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_WindowExecuteCommandAsync,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ExecuteBrowserCommandAsync)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WindowExecuteCommand,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ExecuteBrowserCommand)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_TerminateSession, TerminateSession)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_WindowViewBounds, WindowGetViewBounds)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_SetWindowBounds, SetWindowBounds)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_TabCount, GetTabCount)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_Type, GetType)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_Tab, GetTab)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_TabTitle, GetTabTitle)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_TabIndex, GetTabIndex)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_TabURL, GetTabURL)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_DomOperation,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ExecuteJavascript)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_OpenNewBrowserWindowOfType,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    OpenNewBrowserWindowOfType)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_WindowForBrowser, GetWindowForBrowser)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_GetMetricEventDuration,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GetMetricEventDuration)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_BringBrowserToFront, BringBrowserToFront)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AutomationMsg_FindWindowVisibility,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GetFindWindowVisibility)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForBookmarkModelToLoad,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    WaitForBookmarkModelToLoad)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutomationMsg_WaitForBrowserWindowCountToBecome,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WaitForBrowserWindowCountToBecome)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutomationMsg_GoBackBlockUntilNavigationsComplete,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GoBackBlockUntilNavigationsComplete)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutomationMsg_GoForwardBlockUntilNavigationsComplete,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GoForwardBlockUntilNavigationsComplete)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_SendJSONRequest,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    SendJSONRequestWithBrowserIndex)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutomationMsg_SendJSONRequestWithBrowserHandle,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SendJSONRequestWithBrowserHandle)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForTabCountToBecome,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    WaitForTabCountToBecome)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForInfoBarCount,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    WaitForInfoBarCount)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutomationMsg_WaitForProcessLauncherThreadToGoIdle,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WaitForProcessLauncherThreadToGoIdle)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handled = AutomationProvider::OnMessageReceived(message))
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP_EX()
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!deserialize_success)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnMessageDeserializationFailure();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OnChannelError() {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reinitialize_on_channel_error_ &&
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_shutdown::GetShutdownType() == browser_shutdown::NOT_VALID) {
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::AttemptExit();
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationProvider::OnChannelError();
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::CloseBrowser(int browser_handle,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             IPC::Message* reply_message) {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!browser_tracker_->ContainsHandle(browser_handle))
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = browser_tracker_->GetResource(browser_handle);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new BrowserClosedNotificationObserver(browser, this, reply_message, false);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->window()->Close();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ActivateTab(int handle,
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int at_index,
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int* status) {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *status = -1;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(handle) && at_index > -1) {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = browser_tracker_->GetResource(handle);
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (at_index >= 0 && at_index < browser->tab_strip_model()->count()) {
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->tab_strip_model()->ActivateTabAt(at_index, true);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *status = 0;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::AppendTab(int handle,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const GURL& url,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          IPC::Message* reply_message) {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int append_tab_response = -1;  // -1 is the error code
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabAppendedNotificationObserver* observer = NULL;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(handle)) {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = browser_tracker_->GetResource(handle);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer = new TabAppendedNotificationObserver(browser, this,
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   reply_message, false);
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* contents =
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::AddSelectedTabWithURL(browser, url,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      content::PAGE_TRANSITION_TYPED);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (contents) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      append_tab_response = GetIndexForNavigationController(
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &contents->GetController(), browser);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (append_tab_response < 0) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Appending tab failed. Clean up and send failure response.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (observer)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete observer;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationMsg_AppendTab::WriteReplyParams(reply_message,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              append_tab_response);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(reply_message);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetMachPortCount(int* port_count) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mach_port_name_array_t names;
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mach_msg_type_number_t names_count;
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mach_port_type_array_t types;
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mach_msg_type_number_t types_count;
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mach_port_t port = mach_task_self();
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A friendlier interface would allow NULL buffers to only get the counts.
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kern_return_t kr = mach_port_names(port, &names, &names_count,
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     &types, &types_count);
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (kr != KERN_SUCCESS) {
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *port_count = 0;
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The documentation states this is an invariant.
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_EQ(names_count, types_count);
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *port_count = names_count;
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mach_vm_deallocate(port, reinterpret_cast<mach_vm_address_t>(names),
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      names_count * sizeof(mach_port_name_array_t));
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mach_vm_deallocate(port, reinterpret_cast<mach_vm_address_t>(types),
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      types_count * sizeof(mach_port_type_array_t));
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *port_count = 0;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetActiveTabIndex(int handle,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  int* active_tab_index) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *active_tab_index = -1;  // -1 is the error code
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(handle)) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = browser_tracker_->GetResource(handle);
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *active_tab_index = browser->tab_strip_model()->active_index();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::CloseTab(int tab_handle,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool wait_until_closed,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         IPC::Message* reply_message) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab_tracker_->ContainsHandle(tab_handle)) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController* controller = tab_tracker_->GetResource(tab_handle);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser* browser = chrome::FindBrowserWithWebContents(
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        controller->GetWebContents());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(browser);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new TabClosedNotificationObserver(this, wait_until_closed, reply_message,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      false);
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::CloseWebContents(browser, controller->GetWebContents(), false);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationMsg_CloseTab::WriteReplyParams(reply_message, false);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(reply_message);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetCookies(const GURL& url, int handle,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int* value_size,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           std::string* value) {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* contents = tab_tracker_->ContainsHandle(handle) ?
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab_tracker_->GetResource(handle)->GetWebContents() : NULL;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  automation_util::GetCookies(url, contents, value_size, value);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::NavigateToURLBlockUntilNavigationsComplete(
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle, const GURL& url, int number_of_navigations,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab_tracker_->ContainsHandle(handle)) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController* tab = tab_tracker_->GetResource(handle);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Simulate what a user would do. Activate the tab and then navigate.
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We could allow navigating in a background tab in future.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = FindAndActivateTab(tab);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (browser) {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new NavigationNotificationObserver(tab, this, reply_message,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         number_of_navigations, false, false);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(darin): avoid conversion to GURL.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenURLParams params(
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, Referrer(), CURRENT_TAB,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PageTransitionFromInt(
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content::PAGE_TRANSITION_TYPED |
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content::PAGE_TRANSITION_FROM_ADDRESS_BAR),
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->OpenURL(params);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationMsg_NavigateToURLBlockUntilNavigationsComplete::WriteReplyParams(
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(reply_message);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::NavigationAsync(int handle,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const GURL& url,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                bool* status) {
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *status = false;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab_tracker_->ContainsHandle(handle)) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController* tab = tab_tracker_->GetResource(handle);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Simulate what a user would do. Activate the tab and then navigate.
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We could allow navigating in a background tab in future.
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = FindAndActivateTab(tab);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (browser) {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Don't add any listener unless a callback mechanism is desired.
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(vibhor): Do this if such a requirement arises in future.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenURLParams params(
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, Referrer(), CURRENT_TAB,
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PageTransitionFromInt(
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content::PAGE_TRANSITION_TYPED |
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content::PAGE_TRANSITION_FROM_ADDRESS_BAR),
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->OpenURL(params);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *status = true;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::Reload(int handle,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       IPC::Message* reply_message) {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab_tracker_->ContainsHandle(handle)) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController* tab = tab_tracker_->GetResource(handle);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = FindAndActivateTab(tab);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (chrome::IsCommandEnabled(browser, IDC_RELOAD)) {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new NavigationNotificationObserver(
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          tab, this, reply_message, 1, false, false);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::ExecuteCommand(browser, IDC_RELOAD);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationMsg_Reload::WriteReplyParams(
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(reply_message);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetBrowserWindowCount(int* window_count) {
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The automation layer doesn't support non-native desktops.
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *window_count = static_cast<int>(BrowserList::GetInstance(
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      chrome::HOST_DESKTOP_TYPE_NATIVE)->size());
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetNormalBrowserWindowCount(int* window_count) {
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *window_count = static_cast<int>(chrome::GetTabbedBrowserCount(
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      profile_, chrome::HOST_DESKTOP_TYPE_NATIVE));
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetBrowserWindow(int index, int* handle) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *handle = 0;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = automation_util::GetBrowserAt(index);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *handle = browser_tracker_->Add(browser);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ExecuteBrowserCommandAsync(int handle,
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           int command,
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           bool* success) {
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *success = false;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!browser_tracker_->ContainsHandle(handle)) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Browser tracker does not contain handle: " << handle;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = browser_tracker_->GetResource(handle);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!chrome::SupportsCommand(browser, command)) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Browser does not support command: " << command;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!chrome::IsCommandEnabled(browser, command)) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Browser command not enabled: " << command;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ExecuteCommand(browser, command);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *success = true;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ExecuteBrowserCommand(
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle, int command, IPC::Message* reply_message) {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(handle)) {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = browser_tracker_->GetResource(handle);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (chrome::SupportsCommand(browser, command) &&
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::IsCommandEnabled(browser, command)) {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // First check if we can handle the command without using an observer.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t i = 0; i < arraysize(kSynchronousCommands); i++) {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (command == kSynchronousCommands[i]) {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          chrome::ExecuteCommand(browser, command);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          AutomationMsg_WindowExecuteCommand::WriteReplyParams(reply_message,
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                               true);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Send(reply_message);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Use an observer if we have one, otherwise fail.
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ExecuteBrowserCommandObserver::CreateAndRegisterObserver(
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this, browser, command, reply_message, false)) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::ExecuteCommand(browser, command);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationMsg_WindowExecuteCommand::WriteReplyParams(reply_message, false);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(reply_message);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WebkitMouseClick(DictionaryValue* args,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 IPC::Message* reply_message) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* view;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewFromJSONArgs(args, profile(), &view, &error)) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent mouse_event;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("x", &mouse_event.x) ||
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("y", &mouse_event.y)) {
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("(X,Y) coordinates missing or invalid");
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int button;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("button", &button)) {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("Mouse button missing or invalid");
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (button == automation::kLeftButton) {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (button == automation::kRightButton) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_event.button = WebKit::WebMouseEvent::ButtonRight;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (button == automation::kMiddleButton) {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_event.button = WebKit::WebMouseEvent::ButtonMiddle;
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("Invalid button press requested");
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseDown;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseUp;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new InputEventAckNotificationObserver(this, reply_message, mouse_event.type,
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        1);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WebkitMouseMove(
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* view;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewFromJSONArgs(args, profile(), &view, &error)) {
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent mouse_event;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("x", &mouse_event.x) ||
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("y", &mouse_event.y)) {
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("(X,Y) coordinates missing or invalid");
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseMove;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new InputEventAckNotificationObserver(this, reply_message, mouse_event.type,
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        1);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WebkitMouseDrag(DictionaryValue* args,
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                IPC::Message* reply_message) {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* view;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewFromJSONArgs(args, profile(), &view, &error)) {
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent mouse_event;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int start_x, start_y, end_x, end_y;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("start_x", &start_x) ||
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("start_y", &start_y) ||
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("end_x", &end_x) ||
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("end_y", &end_y)) {
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("Invalid start/end positions");
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseMove;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 1- Move the mouse to the start position.
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.x = start_x;
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.y = start_y;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 2- Left click mouse down, the mouse button is fixed.
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseDown;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 3 - Move the mouse to the end position.
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseMove;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.x = end_x;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.y = end_y;
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 0;
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 4 - Release the left mouse button.
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseUp;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new InputEventAckNotificationObserver(this, reply_message, mouse_event.type,
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        1);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WebkitMouseButtonDown(
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* view;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewFromJSONArgs(args, profile(), &view, &error)) {
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent mouse_event;
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("x", &mouse_event.x) ||
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("y", &mouse_event.y)) {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("(X,Y) coordinates missing or invalid");
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseDown;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new InputEventAckNotificationObserver(this, reply_message, mouse_event.type,
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        1);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WebkitMouseButtonUp(
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* view;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewFromJSONArgs(args, profile(), &view, &error)) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent mouse_event;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("x", &mouse_event.x) ||
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("y", &mouse_event.y)) {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("(X,Y) coordinates missing or invalid");
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseUp;
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new InputEventAckNotificationObserver(this, reply_message, mouse_event.type,
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        1);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WebkitMouseDoubleClick(
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* view;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewFromJSONArgs(args, profile(), &view, &error)) {
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent mouse_event;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("x", &mouse_event.x) ||
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("y", &mouse_event.y)) {
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("(X,Y) coordinates missing or invalid");
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseDown;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseUp;
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new InputEventAckNotificationObserver(this, reply_message, mouse_event.type,
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        2);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseDown;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 2;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseUp;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardMouseEvent(mouse_event);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::DragAndDropFilePaths(
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* view;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewFromJSONArgs(args, profile(), &view, &error)) {
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int x, y;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("x", &x) || !args->GetInteger("y", &y)) {
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("(X,Y) coordinates missing or invalid");
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* paths = NULL;
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetList("paths", &paths)) {
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'paths' missing or invalid");
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emulate drag and drop to set the file paths to the file upload control.
911eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::DropData drop_data;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t path_index = 0; path_index < paths->GetSize(); ++path_index) {
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 path;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!paths->GetString(path_index, &path)) {
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutomationJSONReply(this, reply_message)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .SendError("'paths' contains a non-string type");
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data.filenames.push_back(
921eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        content::DropData::FileInfo(path, string16()));
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point client(x, y);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't set any values in screen variable because DragTarget*** ignore the
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // screen argument.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point screen;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int operations = 0;
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  operations |= WebKit::WebDragOperationCopy;
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  operations |= WebKit::WebDragOperationLink;
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  operations |= WebKit::WebDragOperationMove;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->DragTargetDragEnter(
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      drop_data, client, screen,
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<WebKit::WebDragOperationsMask>(operations), 0);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new DragTargetDropAckNotificationObserver(this, reply_message);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->DragTargetDrop(client, screen, 0);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetTabCount(int handle, int* tab_count) {
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *tab_count = -1;  // -1 is the error code
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(handle)) {
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = browser_tracker_->GetResource(handle);
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *tab_count = browser->tab_strip_model()->count();
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetType(int handle, int* type_as_int) {
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *type_as_int = -1;  // -1 is the error code
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(handle)) {
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = browser_tracker_->GetResource(handle);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *type_as_int = static_cast<int>(browser->type());
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetTab(int win_handle,
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int tab_index,
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int* tab_handle) {
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *tab_handle = 0;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(win_handle) && (tab_index >= 0)) {
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = browser_tracker_->GetResource(win_handle);
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (tab_index < browser->tab_strip_model()->count()) {
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents* web_contents =
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser->tab_strip_model()->GetWebContentsAt(tab_index);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *tab_handle = tab_tracker_->Add(&web_contents->GetController());
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetTabTitle(int handle,
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int* title_string_size,
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            std::wstring* title) {
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *title_string_size = -1;  // -1 is the error code
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab_tracker_->ContainsHandle(handle)) {
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController* tab = tab_tracker_->GetResource(handle);
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationEntry* entry = tab->GetActiveEntry();
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry != NULL) {
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *title = UTF16ToWideHack(entry->GetTitleForDisplay(std::string()));
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *title = std::wstring();
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *title_string_size = static_cast<int>(title->size());
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetTabIndex(int handle, int* tabstrip_index) {
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *tabstrip_index = -1;  // -1 is the error code
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab_tracker_->ContainsHandle(handle)) {
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController* tab = tab_tracker_->GetResource(handle);
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser* browser = chrome::FindBrowserWithWebContents(
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tab->GetWebContents());
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *tabstrip_index = browser->tab_strip_model()->GetIndexOfWebContents(
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tab->GetWebContents());
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetTabURL(int handle,
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          bool* success,
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          GURL* url) {
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *success = false;
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab_tracker_->ContainsHandle(handle)) {
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController* tab = tab_tracker_->GetResource(handle);
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Return what the user would see in the location bar.
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *url = tab->GetActiveEntry()->GetVirtualURL();
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *success = true;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ExecuteJavascriptInRenderViewFrame(
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& frame_xpath,
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& script,
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message,
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the routing id of this message with the controller.
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This routing id needs to be remembered for the reverse
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // communication while sending back the response of
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this javascript execution.
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view_host->ExecuteJavascriptInWebFrame(
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_xpath,
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UTF8ToUTF16("window.domAutomationController.setAutomationId(0);"));
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view_host->ExecuteJavascriptInWebFrame(
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_xpath, script);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ExecuteJavascript(
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle,
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::wstring& frame_xpath,
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::wstring& script,
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents = GetWebContentsForHandle(handle, NULL);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents) {
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationMsg_DomOperation::WriteReplyParams(reply_message, std::string());
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(reply_message);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new DomOperationMessageSender(this, reply_message, false);
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExecuteJavascriptInRenderViewFrame(WideToUTF16Hack(frame_xpath),
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     WideToUTF16Hack(script), reply_message,
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     web_contents->GetRenderViewHost());
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "OpenNewBrowserWindowWithNewProfile" }
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample output: {}
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OpenNewBrowserWindowWithNewProfile(
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args, IPC::Message* reply_message) {
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new BrowserOpenedWithNewProfileNotificationObserver(this, reply_message);
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->CreateMultiProfileAsync(
10542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      string16(), string16(), ProfileManager::CreateCallback(), std::string());
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetMultiProfileInfo" }
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See GetMultiProfileInfo() in pyauto.py for sample output.
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetMultiProfileInfo(
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args, IPC::Message* reply_message) {
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ProfileInfoCache& profile_info_cache =
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_manager->GetProfileInfoCache();
10659ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return_value->SetBoolean("enabled", profiles::IsMultipleProfilesEnabled());
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* profiles = new ListValue;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t index = 0; index < profile_info_cache.GetNumberOfProfiles();
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++index) {
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* item = new DictionaryValue;
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetString("name", profile_info_cache.GetNameOfProfileAtIndex(index));
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetString("path",
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    profile_info_cache.GetPathOfProfileAtIndex(index).value());
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profiles->Append(item);
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("profiles", profiles);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OpenNewBrowserWindowOfType(
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type, bool show, IPC::Message* reply_message) {
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new BrowserOpenedNotificationObserver(this, reply_message, false);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We may have no current browser windows open so don't rely on
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // asking an existing browser to execute the IDC_NEWWINDOW command.
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = new Browser(
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser::CreateParams(static_cast<Browser::Type>(type), profile_,
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            chrome::HOST_DESKTOP_TYPE_NATIVE));
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddBlankTabAt(browser, -1, true);
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (show)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser->window()->Show();
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OpenNewBrowserWindow(
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool show;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("show", &show)) {
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'show' missing or invalid.");
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new BrowserOpenedNotificationObserver(this, reply_message, true);
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = new Browser(
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser::CreateParams(Browser::TYPE_TABBED, profile_,
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            chrome::HOST_DESKTOP_TYPE_NATIVE));
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddBlankTabAt(browser, -1, true);
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (show)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser->window()->Show();
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetBrowserWindowCountJSON(
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The automation layer doesn't support non-native desktops.
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger("count",
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  static_cast<int>(BrowserList::GetInstance(
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      chrome::HOST_DESKTOP_TYPE_NATIVE)->size()));
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::CloseBrowserWindow(
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new BrowserClosedNotificationObserver(browser, this, reply_message, true);
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->window()->Close();
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OpenProfileWindow(
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args, IPC::Message* reply_message) {
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType path;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("path", &path)) {
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Invalid or missing arg: 'path'");
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile = profile_manager->GetProfileByPath(base::FilePath(path));
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!profile) {
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::StringPrintf("Invalid profile path: %s", path.c_str()));
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_loads;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("num_loads", &num_loads)) {
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Invalid or missing arg: 'num_loads'");
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new BrowserOpenedWithExistingProfileNotificationObserver(
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, reply_message, num_loads);
11599ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  profiles::FindOrCreateNewWindowForProfile(
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile,
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_NOT_PROCESS_STARTUP,
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_NOT_FIRST_RUN,
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::HOST_DESKTOP_TYPE_NATIVE,
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false);
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetWindowForBrowser(int browser_handle,
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    bool* success,
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    int* handle) {
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *success = false;
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *handle = 0;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(browser_handle)) {
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = browser_tracker_->GetResource(browser_handle);
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::NativeWindow win = browser->window()->GetNativeWindow();
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add() returns the existing handle for the resource if any.
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *handle = window_tracker_->Add(win);
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *success = true;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetMetricEventDuration(
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& event_name,
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int* duration_ms) {
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *duration_ms = metric_event_duration_observer_->GetEventDurationMs(
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event_name);
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::BringBrowserToFront(int browser_handle,
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    bool* success) {
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *success = false;
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(browser_handle)) {
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = browser_tracker_->GetResource(browser_handle);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser->window()->Activate();
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *success = true;
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetFindWindowVisibility(int handle,
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        bool* visible) {
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *visible = false;
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = browser_tracker_->GetResource(handle);
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser) {
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FindBarTesting* find_bar =
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser->GetFindBarController()->find_bar()->GetFindBarTesting();
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    find_bar->GetFindBarWindowInfo(NULL, visible);
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bookmark bar visibility is based on the pref (e.g. is it in the toolbar).
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Presence in the NTP is signalled in |detached|.
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetBookmarkBarStatus(
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser->window()->IsBookmarkBarVisible() is not consistent across
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platforms. bookmark_bar_state() also follows prefs::kShowBookmarkBar
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and has a shared implementation on all platforms.
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("visible",
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  browser->bookmark_bar_state() == BookmarkBar::SHOW);
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("animating", browser->window()->IsBookmarkBarAnimating());
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("detached",
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  browser->bookmark_bar_state() == BookmarkBar::DETACHED);
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetBookmarksAsJSON(
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg, bookmarks_as_json;
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* bookmark_model =
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkModelFactory::GetForProfile(browser->profile());
1246b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!bookmark_model->loaded()) {
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Bookmark model is not loaded");
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<BookmarkStorage> storage(
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new BookmarkStorage(browser->profile(),
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          bookmark_model,
12537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          browser->profile()->GetIOTaskRunner().get()));
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!storage->SerializeData(&bookmarks_as_json)) {
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Failed to serialize bookmarks");
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetString("bookmarks_as_json", bookmarks_as_json);
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WaitForBookmarkModelToLoad(
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle,
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(handle)) {
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = browser_tracker_->GetResource(handle);
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BookmarkModel* model =
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BookmarkModelFactory::GetForProfile(browser->profile());
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationProviderBookmarkModelObserver* observer =
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new AutomationProviderBookmarkModelObserver(this, reply_message,
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    model, false);
1273b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (model->loaded()) {
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      observer->ReleaseReply();
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete observer;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutomationMsg_WaitForBookmarkModelToLoad::WriteReplyParams(
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reply_message, true);
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Send(reply_message);
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WaitForBookmarkModelToLoadJSON(
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
12873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string error_msg;
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error_msg);
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model =
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkModelFactory::GetForProfile(browser->profile());
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationProviderBookmarkModelObserver* observer =
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new AutomationProviderBookmarkModelObserver(this, reply_message, model,
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  true);
1297b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (model->loaded()) {
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer->ReleaseReply();
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete observer;
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::AddBookmark(
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg, url;
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 title;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int parent_id, index;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool folder;
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("is_folder", &folder)) {
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'is_folder' missing or invalid");
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!folder && !args->GetString("url", &url)) {
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'url' missing or invalid");
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("parent_id", &parent_id)) {
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'parent_id' missing or invalid");
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("index", &index)) {
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'index' missing or invalid");
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("title", &title)) {
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'title' missing or invalid");
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model =
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkModelFactory::GetForProfile(browser->profile());
1340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!model->loaded()) {
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Bookmark model is not loaded");
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* parent = model->GetNodeByID(parent_id);
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!parent) {
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Failed to get parent bookmark node");
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* child;
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (folder) {
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = model->AddFolder(parent, index, title);
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = model->AddURL(parent, index, title, GURL(url));
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!child) {
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Failed to add bookmark");
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ReparentBookmark(DictionaryValue* args,
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 IPC::Message* reply_message) {
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int new_parent_id, id, index;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("id", &id)) {
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'id' missing or invalid");
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("new_parent_id", &new_parent_id)) {
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'new_parent_id' missing or invalid");
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("index", &index)) {
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'index' missing or invalid");
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model =
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkModelFactory::GetForProfile(browser->profile());
1386b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!model->loaded()) {
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Bookmark model is not loaded");
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* node = model->GetNodeByID(id);
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* new_parent = model->GetNodeByID(new_parent_id);
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!node) {
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Failed to get bookmark node");
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!new_parent) {
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Failed to get new parent bookmark node");
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->Move(node, new_parent, index);
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetBookmarkTitle(DictionaryValue* args,
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 IPC::Message* reply_message) {
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 title;
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id;
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("id", &id)) {
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'id' missing or invalid");
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("title", &title)) {
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'title' missing or invalid");
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model =
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkModelFactory::GetForProfile(browser->profile());
1425b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!model->loaded()) {
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Bookmark model is not loaded");
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* node = model->GetNodeByID(id);
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!node) {
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Failed to get bookmark node");
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetTitle(node, title);
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetBookmarkURL(DictionaryValue* args,
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               IPC::Message* reply_message) {
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg, url;
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id;
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("id", &id)) {
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'id' missing or invalid");
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("url", &url)) {
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'url' missing or invalid");
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model =
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkModelFactory::GetForProfile(browser->profile());
1458b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!model->loaded()) {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Bookmark model is not loaded");
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* node = model->GetNodeByID(id);
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!node) {
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Failed to get bookmark node");
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetURL(node, GURL(url));
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::RemoveBookmark(DictionaryValue* args,
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               IPC::Message* reply_message) {
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id;
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("id", &id)) {
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'id' missing or invalid");
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model =
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkModelFactory::GetForProfile(browser->profile());
1487b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!model->loaded()) {
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Bookmark model is not loaded");
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* node = model->GetNodeByID(id);
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!node) {
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Failed to get bookmark node");
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* parent = node->parent();
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!parent) {
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Failed to get parent bookmark node");
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->Remove(parent, parent->GetIndexOf(node));
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WaitForBrowserWindowCountToBecome(
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_count,
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The automation layer doesn't support non-native desktops.
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int current_count = static_cast<int>(BrowserList::GetInstance(
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          chrome::HOST_DESKTOP_TYPE_NATIVE)->size());
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_count == target_count) {
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationMsg_WaitForBrowserWindowCountToBecome::WriteReplyParams(
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reply_message, true);
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(reply_message);
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up an observer (it will delete itself).
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new BrowserCountChangeNotificationObserver(target_count, this, reply_message);
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GoBackBlockUntilNavigationsComplete(
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle, int number_of_navigations, IPC::Message* reply_message) {
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab_tracker_->ContainsHandle(handle)) {
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController* tab = tab_tracker_->GetResource(handle);
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = FindAndActivateTab(tab);
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (chrome::IsCommandEnabled(browser, IDC_BACK)) {
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new NavigationNotificationObserver(tab, this, reply_message,
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         number_of_navigations, false, false);
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::ExecuteCommand(browser, IDC_BACK);
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationMsg_GoBackBlockUntilNavigationsComplete::WriteReplyParams(
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(reply_message);
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GoForwardBlockUntilNavigationsComplete(
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle, int number_of_navigations, IPC::Message* reply_message) {
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab_tracker_->ContainsHandle(handle)) {
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController* tab = tab_tracker_->GetResource(handle);
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = FindAndActivateTab(tab);
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (chrome::IsCommandEnabled(browser, IDC_FORWARD)) {
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new NavigationNotificationObserver(tab, this, reply_message,
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         number_of_navigations, false, false);
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::ExecuteCommand(browser, IDC_FORWARD);
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationMsg_GoForwardBlockUntilNavigationsComplete::WriteReplyParams(
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(reply_message);
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::BuildJSONHandlerMaps() {
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map json commands to their handlers.
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ApplyAccelerator"] =
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ExecuteBrowserCommandAsyncJSON;
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["RunCommand"] =
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ExecuteBrowserCommandJSON;
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["IsMenuCommandEnabled"] =
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsMenuCommandEnabledJSON;
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ActivateTab"] =
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ActivateTabJSON;
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["BringBrowserToFront"] =
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::BringBrowserToFrontJSON;
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetIndicesFromTab"] =
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetIndicesFromTab;
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["NavigateToURL"] =
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::NavigateToURL;
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetActiveTabIndex"] =
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetActiveTabIndexJSON;
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["AppendTab"] =
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::AppendTabJSON;
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["OpenNewBrowserWindow"] =
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::OpenNewBrowserWindow;
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["CloseBrowserWindow"] =
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::CloseBrowserWindow;
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["WaitUntilNavigationCompletes"] =
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::WaitUntilNavigationCompletes;
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetLocalStatePrefsInfo"] =
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetLocalStatePrefsInfo;
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetLocalStatePrefs"] =
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetLocalStatePrefs;
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetPrefsInfo"] = &TestingAutomationProvider::GetPrefsInfo;
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetPrefs"] = &TestingAutomationProvider::SetPrefs;
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ExecuteJavascript"] =
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ExecuteJavascriptJSON;
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["AddDomEventObserver"] =
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::AddDomEventObserver;
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["RemoveEventObserver"] =
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::RemoveEventObserver;
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetNextEvent"] =
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetNextEvent;
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ClearEventQueue"] =
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ClearEventQueue;
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ExecuteJavascriptInRenderView"] =
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ExecuteJavascriptInRenderView;
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GoForward"] =
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GoForward;
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GoBack"] =
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GoBack;
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["Reload"] =
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ReloadJSON;
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["OpenFindInPage"] =
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::OpenFindInPage;
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["IsFindInPageVisible"] =
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsFindInPageVisible;
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetDownloadShelfVisible"] =
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetDownloadShelfVisibleJSON;
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["IsDownloadShelfVisible"] =
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsDownloadShelfVisibleJSON;
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetDownloadDirectory"] =
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetDownloadDirectoryJSON;
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetCookies"] =
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetCookiesJSON;
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["DeleteCookie"] =
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::DeleteCookieJSON;
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetCookie"] =
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetCookieJSON;
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetCookiesInBrowserContext"] =
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetCookiesInBrowserContext;
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["DeleteCookieInBrowserContext"] =
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::DeleteCookieInBrowserContext;
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetCookieInBrowserContext"] =
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetCookieInBrowserContext;
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["WaitForBookmarkModelToLoad"] =
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::WaitForBookmarkModelToLoadJSON;
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetBookmarksAsJSON"] =
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetBookmarksAsJSON;
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetBookmarkBarStatus"] =
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetBookmarkBarStatus;
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["AddBookmark"] =
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::AddBookmark;
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ReparentBookmark"] =
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ReparentBookmark;
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetBookmarkTitle"] =
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetBookmarkTitle;
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetBookmarkURL"] =
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetBookmarkURL;
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["RemoveBookmark"] =
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::RemoveBookmark;
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetTabIds"] =
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetTabIds;
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetViews"] =
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetViews;
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["IsTabIdValid"] =
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsTabIdValid;
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["DoesAutomationObjectExist"] =
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::DoesAutomationObjectExist;
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["CloseTab"] =
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::CloseTabJSON;
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetViewBounds"] =
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetViewBounds;
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["MaximizeView"] =
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::MaximizeView;
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["WebkitMouseMove"] =
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::WebkitMouseMove;
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["WebkitMouseClick"] =
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::WebkitMouseClick;
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["WebkitMouseDrag"] =
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::WebkitMouseDrag;
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["WebkitMouseButtonUp"] =
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::WebkitMouseButtonUp;
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["WebkitMouseButtonDown"] =
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::WebkitMouseButtonDown;
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["WebkitMouseDoubleClick"] =
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::WebkitMouseDoubleClick;
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["DragAndDropFilePaths"] =
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::DragAndDropFilePaths;
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SendWebkitKeyEvent"] =
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SendWebkitKeyEvent;
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ActivateTab"] =
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ActivateTabJSON;
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetAppModalDialogMessage"] =
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetAppModalDialogMessage;
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["AcceptOrDismissAppModalDialog"] =
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::AcceptOrDismissAppModalDialog;
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ActionOnSSLBlockingPage"] =
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ActionOnSSLBlockingPage;
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetSecurityState"] =
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetSecurityState;
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetChromeDriverAutomationVersion"] =
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetChromeDriverAutomationVersion;
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["IsPageActionVisible"] =
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsPageActionVisible;
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["CreateNewAutomationProvider"] =
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::CreateNewAutomationProvider;
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetBrowserWindowCount"] =
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetBrowserWindowCountJSON;
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetBrowserInfo"] =
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetBrowserInfo;
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetTabInfo"] =
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetTabInfo;
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetTabCount"] =
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetTabCountJSON;
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["OpenNewBrowserWindowWithNewProfile"] =
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::OpenNewBrowserWindowWithNewProfile;
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetMultiProfileInfo"] =
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetMultiProfileInfo;
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["OpenProfileWindow"] =
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::OpenProfileWindow;
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetProcessInfo"] =
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetProcessInfo;
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["RefreshPolicies"] =
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::RefreshPolicies;
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["InstallExtension"] =
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::InstallExtension;
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetExtensionsInfo"] =
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetExtensionsInfo;
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["UninstallExtensionById"] =
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::UninstallExtensionById;
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetExtensionStateById"] =
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetExtensionStateById;
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["TriggerPageActionById"] =
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::TriggerPageActionById;
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["TriggerBrowserActionById"] =
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::TriggerBrowserActionById;
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["UpdateExtensionsNow"] =
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::UpdateExtensionsNow;
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["OverrideGeoposition"] =
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::OverrideGeoposition;
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SimulateAsanMemoryBug"] =
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SimulateAsanMemoryBug;
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["AcceptOOBENetworkScreen"] =
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::AcceptOOBENetworkScreen;
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["AcceptOOBEEula"] = &TestingAutomationProvider::AcceptOOBEEula;
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["CancelOOBEUpdate"] =
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::CancelOOBEUpdate;
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["PickUserImage"] = &TestingAutomationProvider::PickUserImage;
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SkipToLogin"] = &TestingAutomationProvider::SkipToLogin;
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetOOBEScreenInfo"] =
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetOOBEScreenInfo;
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetLoginInfo"] = &TestingAutomationProvider::GetLoginInfo;
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ShowCreateAccountUI"] =
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ShowCreateAccountUI;
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ExecuteJavascriptInOOBEWebUI"] =
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ExecuteJavascriptInOOBEWebUI;
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["LoginAsGuest"] = &TestingAutomationProvider::LoginAsGuest;
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SubmitLoginForm"] =
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SubmitLoginForm;
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["AddLoginEventObserver"] =
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::AddLoginEventObserver;
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SignOut"] = &TestingAutomationProvider::SignOut;
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["LockScreen"] = &TestingAutomationProvider::LockScreen;
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["UnlockScreen"] = &TestingAutomationProvider::UnlockScreen;
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SignoutInScreenLocker"] =
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SignoutInScreenLocker;
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetBatteryInfo"] = &TestingAutomationProvider::GetBatteryInfo;
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetNetworkInfo"] = &TestingAutomationProvider::GetNetworkInfo;
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["NetworkScan"] = &TestingAutomationProvider::NetworkScan;
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ToggleNetworkDevice"] =
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ToggleNetworkDevice;
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ConnectToCellularNetwork"] =
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ConnectToCellularNetwork;
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["DisconnectFromCellularNetwork"] =
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::DisconnectFromCellularNetwork;
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ConnectToWifiNetwork"] =
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ConnectToWifiNetwork;
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ConnectToHiddenWifiNetwork"] =
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ConnectToHiddenWifiNetwork;
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["DisconnectFromWifiNetwork"] =
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::DisconnectFromWifiNetwork;
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ForgetWifiNetwork"] =
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ForgetWifiNetwork;
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["AddPrivateNetwork"] =
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::AddPrivateNetwork;
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetPrivateNetworkInfo"] =
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetPrivateNetworkInfo;
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["ConnectToPrivateNetwork"] =
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::ConnectToPrivateNetwork;
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["DisconnectFromPrivateNetwork"] =
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::DisconnectFromPrivateNetwork;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["EnableSpokenFeedback"] =
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::EnableSpokenFeedback;
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["IsSpokenFeedbackEnabled"] =
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsSpokenFeedbackEnabled;
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetTimeInfo"] = &TestingAutomationProvider::GetTimeInfo;
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetTimezone"] = &TestingAutomationProvider::SetTimezone;
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["UpdateCheck"] = &TestingAutomationProvider::UpdateCheck;
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["GetVolumeInfo"] = &TestingAutomationProvider::GetVolumeInfo;
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetVolume"] = &TestingAutomationProvider::SetVolume;
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetMute"] = &TestingAutomationProvider::SetMute;
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["OpenCrosh"] = &TestingAutomationProvider::OpenCrosh;
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetProxySettings"] =
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetProxySettings;
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_map_["SetSharedProxies"] =
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetSharedProxies;
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetTimeInfo"] =
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetTimeInfo;
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["DisablePlugin"] =
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::DisablePlugin;
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["EnablePlugin"] =
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::EnablePlugin;
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetPluginsInfo"] =
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetPluginsInfo;
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetNavigationInfo"] =
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetNavigationInfo;
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["PerformActionOnInfobar"] =
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::PerformActionOnInfobar;
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetHistoryInfo"] =
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetHistoryInfo;
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetOmniboxInfo"] =
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetOmniboxInfo;
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["SetOmniboxText"] =
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetOmniboxText;
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["OmniboxAcceptInput"] =
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::OmniboxAcceptInput;
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["OmniboxMovePopupSelection"] =
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::OmniboxMovePopupSelection;
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["LoadSearchEngineInfo"] =
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::LoadSearchEngineInfo;
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetSearchEngineInfo"] =
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetSearchEngineInfo;
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["AddOrEditSearchEngine"] =
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::AddOrEditSearchEngine;
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["PerformActionOnSearchEngine"] =
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::PerformActionOnSearchEngine;
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["SetWindowDimensions"] =
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetWindowDimensions;
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetDownloadsInfo"] =
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetDownloadsInfo;
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["WaitForAllDownloadsToComplete"] =
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::WaitForAllDownloadsToComplete;
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["PerformActionOnDownload"] =
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::PerformActionOnDownload;
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetInitialLoadTimes"] =
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetInitialLoadTimes;
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["SaveTabContents"] =
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SaveTabContents;
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["AddSavedPassword"] =
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::AddSavedPassword;
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["RemoveSavedPassword"] =
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::RemoveSavedPassword;
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetSavedPasswords"] =
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetSavedPasswords;
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["FindInPage"] = &TestingAutomationProvider::FindInPage;
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetAllNotifications"] =
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetAllNotifications;
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["CloseNotification"] =
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::CloseNotification;
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["WaitForNotificationCount"] =
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::WaitForNotificationCount;
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetNTPInfo"] =
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetNTPInfo;
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["RemoveNTPMostVisitedThumbnail"] =
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::RemoveNTPMostVisitedThumbnail;
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["RestoreAllNTPMostVisitedThumbnails"] =
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::RestoreAllNTPMostVisitedThumbnails;
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["KillRendererProcess"] =
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::KillRendererProcess;
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["LaunchApp"] = &TestingAutomationProvider::LaunchApp;
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["SetAppLaunchType"] =
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::SetAppLaunchType;
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetV8HeapStats"] =
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetV8HeapStats;
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["GetFPS"] =
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::GetFPS;
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["IsFullscreenForBrowser"] =
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsFullscreenForBrowser;
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["IsFullscreenForTab"] =
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsFullscreenForTab;
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["IsMouseLocked"] =
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsMouseLocked;
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["IsMouseLockPermissionRequested"] =
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsMouseLockPermissionRequested;
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["IsFullscreenPermissionRequested"] =
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsFullscreenPermissionRequested;
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["IsFullscreenBubbleDisplayed"] =
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsFullscreenBubbleDisplayed;
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["IsFullscreenBubbleDisplayingButtons"] =
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::IsFullscreenBubbleDisplayingButtons;
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["AcceptCurrentFullscreenOrMouseLockRequest"] =
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::AcceptCurrentFullscreenOrMouseLockRequest;
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_handler_map_["DenyCurrentFullscreenOrMouseLockRequest"] =
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestingAutomationProvider::DenyCurrentFullscreenOrMouseLockRequest;
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<DictionaryValue> TestingAutomationProvider::ParseJSONRequestCommand(
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& json_request,
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* command,
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* error) {
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> dict_value;
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> values(base::JSONReader::ReadAndReturnError(json_request,
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSON_ALLOW_TRAILING_COMMAS, NULL, error));
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (values.get()) {
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure input is a dict with a string command.
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (values->GetType() != Value::TYPE_DICTIONARY) {
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *error = "Command dictionary is not a dictionary.";
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict_value.reset(static_cast<DictionaryValue*>(values.release()));
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!dict_value->GetStringASCII("command", command)) {
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *error = "Command key string missing from dictionary.";
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dict_value.reset(NULL);
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict_value.Pass();
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SendJSONRequestWithBrowserHandle(
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle,
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& json_request,
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = NULL;
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_tracker_->ContainsHandle(handle))
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser = browser_tracker_->GetResource(handle);
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser || handle < 0) {
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendJSONRequest(browser, json_request, reply_message);
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "The browser window does not exist.");
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SendJSONRequestWithBrowserIndex(
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int index,
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& json_request,
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = index < 0 ? NULL : automation_util::GetBrowserAt(index);
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!browser && index >= 0) {
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(base::StringPrintf(
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Browser window with index=%d does not exist.", index));
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendJSONRequest(browser, json_request, reply_message);
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SendJSONRequest(Browser* browser,
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const std::string& json_request,
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                IPC::Message* reply_message) {
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string command, error_string;
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> dict_value(
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ParseJSONRequestCommand(json_request, &command, &error_string));
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dict_value.get() || command.empty()) {
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error_string);
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handler_map_.empty() || browser_handler_map_.empty())
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BuildJSONHandlerMaps();
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Look for command in handlers that take a Browser.
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_handler_map_.find(std::string(command)) !=
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_handler_map_.end() && browser) {
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (this->*browser_handler_map_[command])(browser, dict_value.get(),
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           reply_message);
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Look for command in handlers that don't take a Browser.
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (handler_map_.find(std::string(command)) != handler_map_.end()) {
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (this->*handler_map_[command])(dict_value.get(), reply_message);
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Command has no handler.
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    error_string = base::StringPrintf("Unknown command '%s'. Options: ",
19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      command.c_str());
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::map<std::string, JsonHandler>::const_iterator it =
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         handler_map_.begin(); it != handler_map_.end(); ++it) {
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_string += it->first + ", ";
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::map<std::string, BrowserJsonHandler>::const_iterator it =
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         browser_handler_map_.begin(); it != browser_handler_map_.end(); ++it) {
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_string += it->first + ", ";
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error_string);
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::BringBrowserToFrontJSON(
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->window()->Activate();
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "SetWindowDimensions",
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "x": 20,         # optional
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "y": 20,         # optional
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "width": 800,    # optional
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "height": 600 }  # optional
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetWindowDimensions(
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect = browser->window()->GetRestoredBounds();
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int x, y, width, height;
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetInteger("x", &x))
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rect.set_x(x);
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetInteger("y", &y))
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rect.set_y(y);
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetInteger("width", &width))
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rect.set_width(width);
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetInteger("height", &height))
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rect.set_height(height);
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->window()->SetBounds(rect);
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(NULL);
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue* TestingAutomationProvider::GetInfobarsInfo(WebContents* wc) {
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Each infobar may have different properties depending on the type.
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* infobars = new ListValue;
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InfoBarService* infobar_service = InfoBarService::FromWebContents(wc);
2045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < infobar_service->infobar_count(); ++i) {
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* infobar_item = new DictionaryValue;
2047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    InfoBarDelegate* infobar = infobar_service->infobar_at(i);
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (infobar->GetInfoBarAutomationType()) {
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case InfoBarDelegate::CONFIRM_INFOBAR:
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        infobar_item->SetString("type", "confirm_infobar");
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case InfoBarDelegate::PASSWORD_INFOBAR:
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        infobar_item->SetString("type", "password_infobar");
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case InfoBarDelegate::RPH_INFOBAR:
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        infobar_item->SetString("type", "rph_infobar");
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case InfoBarDelegate::UNKNOWN_INFOBAR:
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        infobar_item->SetString("type", "unknown_infobar");
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (infobar->AsConfirmInfoBarDelegate()) {
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Also covers ThemeInstalledInfoBarDelegate.
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConfirmInfoBarDelegate* confirm_infobar =
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        infobar->AsConfirmInfoBarDelegate();
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      infobar_item->SetString("text", confirm_infobar->GetMessageText());
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      infobar_item->SetString("link_text", confirm_infobar->GetLinkText());
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ListValue* buttons_list = new ListValue;
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int buttons = confirm_infobar->GetButtons();
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (buttons & ConfirmInfoBarDelegate::BUTTON_OK) {
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StringValue* button_label = new StringValue(
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            confirm_infobar->GetButtonLabel(
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ConfirmInfoBarDelegate::BUTTON_OK));
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buttons_list->Append(button_label);
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (buttons & ConfirmInfoBarDelegate::BUTTON_CANCEL) {
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StringValue* button_label = new StringValue(
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            confirm_infobar->GetButtonLabel(
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ConfirmInfoBarDelegate::BUTTON_CANCEL));
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buttons_list->Append(button_label);
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      infobar_item->Set("buttons", buttons_list);
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (infobar->AsExtensionInfoBarDelegate()) {
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      infobar_item->SetString("type", "extension_infobar");
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      infobar_item->SetString("type", "unknown_infobar");
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    infobars->Append(infobar_item);
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return infobars;
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "PerformActionOnInfobar",
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "action": "dismiss",
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "infobar_index": 0,
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "tab_index": 0 }
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample output: {}
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::PerformActionOnInfobar(
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tab_index;
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int infobar_index_int;
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string action;
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("tab_index", &tab_index) ||
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("infobar_index", &infobar_index_int) ||
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString("action", &action)) {
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Invalid or missing args");
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t infobar_index = static_cast<size_t>(infobar_index_int);
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents =
21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->tab_strip_model()->GetWebContentsAt(tab_index);
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents) {
21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reply.SendError(base::StringPrintf("No such tab at index %d", tab_index));
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InfoBarService* infobar_service =
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InfoBarService::FromWebContents(web_contents);
2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (infobar_index >= infobar_service->infobar_count()) {
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reply.SendError(base::StringPrintf("No such infobar at index %" PRIuS,
21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       infobar_index));
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2128ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  InfoBarDelegate* infobar_delegate =
2129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      infobar_service->infobar_at(infobar_index);
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (action == "dismiss") {
2132ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    infobar_delegate->InfoBarDismissed();
2133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    infobar_service->RemoveInfoBar(infobar_delegate);
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendSuccess(NULL);
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if ((action == "accept") || (action == "cancel")) {
2138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ConfirmInfoBarDelegate* confirm_infobar_delegate =
2139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        infobar_delegate->AsConfirmInfoBarDelegate();
2140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (!confirm_infobar_delegate) {
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply.SendError("Not a confirm infobar");
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if ((action == "accept") ?
2145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        confirm_infobar_delegate->Accept() : confirm_infobar_delegate->Cancel())
2146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      infobar_service->RemoveInfoBar(infobar_delegate);
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendSuccess(NULL);
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendError("Invalid action");
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets info about BrowserChildProcessHost. Must run on IO thread to
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// honor the semantics of BrowserChildProcessHostIterator.
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by AutomationProvider::GetBrowserInfo().
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetChildProcessHostInfo(ListValue* child_processes) {
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (BrowserChildProcessHostIterator iter; !iter.Done(); ++iter) {
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Only add processes which are already started, since we need their handle.
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iter.GetData().handle == base::kNullProcessHandle)
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* item = new DictionaryValue;
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetString("name", iter.GetData().name);
21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    item->SetString(
21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "type",
21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::GetProcessTypeNameInEnglish(iter.GetData().process_type));
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetInteger("pid", base::GetProcId(iter.GetData().handle));
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_processes->Append(item);
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetBrowserInfo" }
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to GetBrowserInfo() in chrome/test/pyautolib/pyauto.py for
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sample json output.
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetBrowserInfo(
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadRestrictions::ScopedAllowIO allow_io;  // needed for PathService
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* properties = new DictionaryValue;
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetString("ChromeVersion", chrome::kChromeVersion);
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetString("BrowserProcessExecutableName",
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        chrome::kBrowserProcessExecutableName);
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetString("HelperProcessExecutableName",
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        chrome::kHelperProcessExecutableName);
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetString("BrowserProcessExecutablePath",
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        chrome::kBrowserProcessExecutablePath);
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetString("HelperProcessExecutablePath",
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        chrome::kHelperProcessExecutablePath);
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetString("command_line_string",
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandLine::ForCurrentProcess()->GetCommandLineString());
21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dumps_path;
2196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PathService::Get(chrome::DIR_CRASH_DUMPS, &dumps_path);
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetString("DIR_CRASH_DUMPS", dumps_path.value());
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetBoolean("aura", true);
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetBoolean("aura", false);
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string branding;
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  branding = "Google Chrome";
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(CHROMIUM_BUILD)
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  branding = "Chromium";
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  branding = "Unknown Branding";
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetString("branding", branding);
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_official_build = false;
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OFFICIAL_BUILD)
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_official_build = true;
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetBoolean("is_official", is_official_build);
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("properties", properties);
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->SetInteger("browser_pid", base::GetCurrentProcId());
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add info about all windows in a list of dictionaries, one dictionary
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // item per window.
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* windows = new ListValue;
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int windex = 0;
22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next(), ++windex) {
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* browser_item = new DictionaryValue;
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser = *it;
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->SetInteger("index", windex);
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Window properties
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect rect = browser->window()->GetRestoredBounds();
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->SetInteger("x", rect.x());
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->SetInteger("y", rect.y());
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->SetInteger("width", rect.width());
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->SetInteger("height", rect.height());
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->SetBoolean("fullscreen",
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             browser->window()->IsFullscreen());
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* visible_page_actions = new ListValue;
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add info about all visible page actions. Skipped on panels, which do not
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // have a location bar.
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LocationBar* loc_bar = browser->window()->GetLocationBar();
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (loc_bar) {
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LocationBarTesting* loc_bar_test =
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          loc_bar->GetLocationBarForTesting();
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t page_action_visible_count =
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<size_t>(loc_bar_test->PageActionVisibleCount());
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t i = 0; i < page_action_visible_count; ++i) {
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StringValue* extension_id = new StringValue(
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loc_bar_test->GetVisiblePageAction(i)->extension_id());
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        visible_page_actions->Append(extension_id);
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->Set("visible_page_actions", visible_page_actions);
22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser_item->SetInteger("selected_tab",
22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             browser->tab_strip_model()->active_index());
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->SetBoolean("incognito",
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             browser->profile()->IsOffTheRecord());
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->SetString("profile_path",
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser->profile()->GetPath().BaseName().MaybeAsASCII());
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string type;
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (browser->type()) {
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case Browser::TYPE_TABBED:
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type = "tabbed";
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case Browser::TYPE_POPUP:
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type = "popup";
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type = "unknown";
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->SetString("type", type);
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For each window, add info about all tabs in a list of dictionaries,
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // one dictionary item per tab.
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* tabs = new ListValue;
22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < browser->tab_strip_model()->count(); ++i) {
22802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents* wc = browser->tab_strip_model()->GetWebContentsAt(i);
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DictionaryValue* tab = new DictionaryValue;
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab->SetInteger("index", i);
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab->SetString("url", wc->GetURL().spec());
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab->SetInteger("renderer_pid",
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      base::GetProcId(wc->GetRenderProcessHost()->GetHandle()));
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab->Set("infobars", GetInfobarsInfo(wc));
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab->SetBoolean("pinned", browser->tab_strip_model()->IsTabPinned(i));
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tabs->Append(tab);
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_item->Set("tabs", tabs);
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    windows->Append(browser_item);
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("windows", windows);
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags = ChildProcessHost::CHILD_ALLOW_SELF;
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags = ChildProcessHost::CHILD_NORMAL;
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add all extension processes in a list of dictionaries, one dictionary
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // item per extension process.
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* extension_views = new ListValue;
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles());
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < profiles.size(); ++i) {
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionProcessManager* process_manager =
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::ExtensionSystem::Get(profiles[i])->process_manager();
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!process_manager)
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ExtensionProcessManager::ViewSet view_set =
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_manager->GetAllViews();
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (ExtensionProcessManager::ViewSet::const_iterator jt =
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             view_set.begin();
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         jt != view_set.end(); ++jt) {
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host = *jt;
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Don't add dead extension processes.
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!render_view_host->IsRenderViewLive())
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Don't add views for which we can't obtain an extension.
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(benwells): work out why this happens. It only happens for one
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // test, and only on the bots.
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension* extension =
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          process_manager->GetExtensionForRenderViewHost(render_view_host);
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!extension)
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DictionaryValue* item = new DictionaryValue;
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item->SetString("name", extension->name());
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item->SetString("extension_id", extension->id());
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item->SetInteger(
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "pid",
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::GetProcId(render_view_host->GetProcess()->GetHandle()));
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DictionaryValue* view = new DictionaryValue;
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      view->SetInteger(
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "render_process_id",
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          render_view_host->GetProcess()->GetID());
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      view->SetInteger(
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "render_view_id",
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          render_view_host->GetRoutingID());
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item->Set("view", view);
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string type;
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebContents* web_contents =
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WebContents::FromRenderViewHost(render_view_host);
2345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extensions::ViewType view_type = extensions::GetViewType(web_contents);
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (view_type) {
2347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        case extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE:
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          type = "EXTENSION_BACKGROUND_PAGE";
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        case extensions::VIEW_TYPE_EXTENSION_POPUP:
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          type = "EXTENSION_POPUP";
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        case extensions::VIEW_TYPE_EXTENSION_INFOBAR:
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          type = "EXTENSION_INFOBAR";
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        case extensions::VIEW_TYPE_EXTENSION_DIALOG:
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          type = "EXTENSION_DIALOG";
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        case extensions::VIEW_TYPE_APP_SHELL:
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          type = "APP_SHELL";
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        case extensions::VIEW_TYPE_PANEL:
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          type = "PANEL";
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          type = "unknown";
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item->SetString("view_type", type);
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item->SetString("url", web_contents->GetURL().spec());
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item->SetBoolean("loaded", !render_view_host->IsLoading());
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_views->Append(item);
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("extension_views", extension_views);
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->SetString("child_process_path",
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ChildProcessHost::GetChildPath(flags).value());
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Child processes are the processes for plugins and other workers.
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add all child processes in a list of dictionaries, one dictionary item
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // per child process.
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* child_processes = new ListValue;
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("child_processes", child_processes);
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTaskAndReply(
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&GetChildProcessHostInfo, child_processes),
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&AutomationJSONReply::SendSuccess,
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Owned(new AutomationJSONReply(this, reply_message)),
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Owned(return_value.release())));
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetProcessInfo" }
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to GetProcessInfo() in chrome/test/pyautolib/pyauto.py for
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sample json output.
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetProcessInfo(
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ProcessInfoObserver>
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proc_observer(new ProcessInfoObserver(this, reply_message));
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jamescook): Maybe this shouldn't update UMA stats?
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proc_observer->StartFetch(MemoryDetails::UPDATE_USER_METRICS);
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetNavigationInfo" }
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to GetNavigationInfo() in chrome/test/pyautolib/pyauto.py for
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sample json output.
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetNavigationInfo(
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tab_index;
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents = NULL;
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("tab_index", &tab_index) ||
24152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !(web_contents =
24162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser->tab_strip_model()->GetWebContentsAt(tab_index))) {
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("tab_index missing or invalid.");
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const NavigationController& controller = web_contents->GetController();
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* nav_entry = controller.GetActiveEntry();
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(nav_entry);
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Security info.
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* ssl = new DictionaryValue;
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<content::SecurityStyle, std::string> style_to_string;
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  style_to_string[content::SECURITY_STYLE_UNKNOWN] = "SECURITY_STYLE_UNKNOWN";
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  style_to_string[content::SECURITY_STYLE_UNAUTHENTICATED] =
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SECURITY_STYLE_UNAUTHENTICATED";
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  style_to_string[content::SECURITY_STYLE_AUTHENTICATION_BROKEN] =
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SECURITY_STYLE_AUTHENTICATION_BROKEN";
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  style_to_string[content::SECURITY_STYLE_AUTHENTICATED] =
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SECURITY_STYLE_AUTHENTICATED";
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLStatus ssl_status = nav_entry->GetSSL();
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl->SetString("security_style",
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 style_to_string[ssl_status.security_style]);
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl->SetBoolean("ran_insecure_content",
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !!(ssl_status.content_status & SSLStatus::RAN_INSECURE_CONTENT));
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl->SetBoolean("displayed_insecure_content",
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !!(ssl_status.content_status & SSLStatus::DISPLAYED_INSECURE_CONTENT));
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("ssl", ssl);
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Page type.
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<content::PageType, std::string> pagetype_to_string;
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pagetype_to_string[content::PAGE_TYPE_NORMAL] = "NORMAL_PAGE";
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pagetype_to_string[content::PAGE_TYPE_ERROR] = "ERROR_PAGE";
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pagetype_to_string[content::PAGE_TYPE_INTERSTITIAL] =
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INTERSTITIAL_PAGE";
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->SetString("page_type",
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          pagetype_to_string[nav_entry->GetPageType()]);
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->SetString("favicon_url", nav_entry->GetFavicon().url.spec());
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(return_value.get());
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetHistoryInfo",
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "search_text": "some text" }
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer chrome/test/pyautolib/history_info.py for sample json output.
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetHistoryInfo(Browser* browser,
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               DictionaryValue* args,
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               IPC::Message* reply_message) {
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  consumer_.CancelAllRequests();
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 search_text;
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args->GetString("search_text", &search_text);
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetch history.
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryService* hs = HistoryServiceFactory::GetForProfile(
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->profile(), Profile::EXPLICIT_ACCESS);
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::QueryOptions options;
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The observer owns itself.  It deletes itself after it fetches history.
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationProviderHistoryObserver* history_observer =
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new AutomationProviderHistoryObserver(this, reply_message);
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hs->QueryHistory(
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      search_text,
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options,
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &consumer_,
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&AutomationProviderHistoryObserver::HistoryQueryComplete,
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(history_observer)));
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetDownloadsInfo" }
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer chrome/test/pyautolib/download_info.py for sample json output.
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetDownloadsInfo(Browser* browser,
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 DictionaryValue* args,
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 IPC::Message* reply_message) {
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* list_of_downloads = new ListValue;
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadService* download_service(
2494a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      DownloadServiceFactory::GetForBrowserContext(browser->profile()));
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (download_service->HasCreatedDownloadManager()) {
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<DownloadItem*> downloads;
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserContext::GetDownloadManager(browser->profile())->GetAllDownloads(
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &downloads);
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<DownloadItem*>::iterator it = downloads.begin();
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != downloads.end();
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it++) {  // Fill info about each download item.
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list_of_downloads->Append(GetDictionaryFromDownloadItem(
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *it, browser->profile()->IsOffTheRecord()));
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("downloads", list_of_downloads);
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(return_value.get());
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WaitForAllDownloadsToComplete(
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* pre_download_ids = NULL;
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetList("pre_download_ids", &pre_download_ids)) {
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .SendError(
25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::StringPrintf("List of IDs of previous downloads required."));
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadService* download_service =
2526a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      DownloadServiceFactory::GetForBrowserContext(browser->profile());
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!download_service->HasCreatedDownloadManager()) {
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No download manager, so no downloads to wait for.
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This observer will delete itself.
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new AllDownloadsCompleteObserver(
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, reply_message,
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext::GetDownloadManager(browser->profile()),
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pre_download_ids);
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See PerformActionOnDownload() in chrome/test/pyautolib/pyauto.py for sample
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// json input and output.
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::PerformActionOnDownload(
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id;
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string action;
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadService* download_service =
2550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      DownloadServiceFactory::GetForBrowserContext(browser->profile());
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!download_service->HasCreatedDownloadManager()) {
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError("No download manager.");
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("id", &id) || !args->GetString("action", &action)) {
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("Must include int id and string action.");
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* download_manager =
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext::GetDownloadManager(browser->profile());
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* selected_item = download_manager->GetDownload(id);
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!selected_item) {
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
25662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .SendError(base::StringPrintf("No download with an id of %d\n", id));
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DownloadItem::DownloadState download_state = selected_item->GetState();
25717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to be IN_PROGRESS for these actions.
25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((action == "pause" || action == "resume" || action == "cancel") &&
25747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      download_state != DownloadItem::IN_PROGRESS) {
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
25767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        .SendError(base::StringPrintf(
25777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            "Action '%s' called on download that is not in progress.",
25787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            action.c_str()));
25797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (action == "open") {
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selected_item->AddObserver(
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new AutomationProviderDownloadUpdatedObserver(
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            this, reply_message, true, browser->profile()->IsOffTheRecord()));
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selected_item->OpenDownload();
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (action == "toggle_open_files_like_this") {
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadPrefs* prefs =
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DownloadPrefs::FromBrowserContext(selected_item->GetBrowserContext());
259090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::FilePath path = selected_item->GetTargetFilePath();
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!selected_item->ShouldOpenFileBasedOnExtension())
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs->EnableAutoOpenBasedOnExtension(path);
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs->DisableAutoOpenBasedOnExtension(path);
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (action == "remove") {
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new AutomationProviderDownloadModelChangedObserver(
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, reply_message, download_manager);
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selected_item->Remove();
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (action == "decline_dangerous_download") {
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new AutomationProviderDownloadModelChangedObserver(
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, reply_message, download_manager);
2603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    selected_item->Remove();
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (action == "save_dangerous_download") {
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selected_item->AddObserver(new AutomationProviderDownloadUpdatedObserver(
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, reply_message, false, browser->profile()->IsOffTheRecord()));
2607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    selected_item->ValidateDangerousDownload();
26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (action == "pause") {
26097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (selected_item->IsPaused()) {
26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Action would be a no-op; respond right from here.  No-op implies
26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // the test is poorly written or failing, so make it an error return.
26127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      AutomationJSONReply(this, reply_message)
26137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          .SendError("Action 'pause' called on already paused download.");
26142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
26152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      selected_item->AddObserver(new AutomationProviderDownloadUpdatedObserver(
26162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this, reply_message, false, browser->profile()->IsOffTheRecord()));
26172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      selected_item->Pause();
26182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
26192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (action == "resume") {
26207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!selected_item->IsPaused()) {
26212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Action would be a no-op; respond right from here.  No-op implies
26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // the test is poorly written or failing, so make it an error return.
26237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      AutomationJSONReply(this, reply_message)
26247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          .SendError("Action 'resume' called on unpaused download.");
26252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
26262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      selected_item->AddObserver(new AutomationProviderDownloadUpdatedObserver(
26272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this, reply_message, false, browser->profile()->IsOffTheRecord()));
26282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      selected_item->Resume();
26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (action == "cancel") {
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selected_item->AddObserver(new AutomationProviderDownloadUpdatedObserver(
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, reply_message, false, browser->profile()->IsOffTheRecord()));
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selected_item->Cancel(true);
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
26362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .SendError(
26372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::StringPrintf("Invalid action '%s' given.", action.c_str()));
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetDownloadShelfVisibleJSON(
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_visible;
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("is_visible", &is_visible)) {
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'is_visible' missing or invalid.");
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_visible) {
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser->window()->GetDownloadShelf()->Show();
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    browser->window()->GetDownloadShelf()->Close(DownloadShelf::AUTOMATIC);
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsDownloadShelfVisibleJSON(
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("is_visible", browser->window()->IsDownloadShelfVisible());
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetDownloadDirectoryJSON(
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetTabFromJSONArgs(args, &web_contents, &error)) {
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error);
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* dlm =
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext::GetDownloadManager(
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          web_contents->GetController().GetBrowserContext());
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetString("path",
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadPrefs::FromDownloadManager(dlm)->DownloadPath().value());
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample JSON input { "command": "LoadSearchEngineInfo" }
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::LoadSearchEngineInfo(
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* url_model =
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(browser->profile());
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (url_model->loaded()) {
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_model->AddObserver(new AutomationProviderSearchEngineObserver(
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, browser->profile(), reply_message));
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_model->Load();
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample JSON input { "command": "GetSearchEngineInfo" }
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to pyauto.py for sample output.
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetSearchEngineInfo(
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* url_model =
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(browser->profile());
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* search_engines = new ListValue;
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService::TemplateURLVector template_urls =
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url_model->GetTemplateURLs();
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (TemplateURLService::TemplateURLVector::const_iterator it =
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       template_urls.begin(); it != template_urls.end(); ++it) {
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* search_engine = new DictionaryValue;
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engine->SetString("short_name", UTF16ToUTF8((*it)->short_name()));
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engine->SetString("keyword", UTF16ToUTF8((*it)->keyword()));
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engine->SetBoolean("in_default_list", (*it)->ShowInDefaultList());
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engine->SetBoolean("is_default",
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*it) == url_model->GetDefaultSearchProvider());
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engine->SetBoolean("is_valid", (*it)->url_ref().IsValid());
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engine->SetBoolean("supports_replacement",
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              (*it)->url_ref().SupportsReplacement());
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engine->SetString("url", (*it)->url());
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engine->SetString("host", (*it)->url_ref().GetHost());
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engine->SetString("path", (*it)->url_ref().GetPath());
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engine->SetString("display_url",
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             UTF16ToUTF8((*it)->url_ref().DisplayURL()));
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_engines->Append(search_engine);
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("search_engines", search_engines);
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to pyauto.py for sample JSON input.
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::AddOrEditSearchEngine(
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* url_model =
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(browser->profile());
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 new_title;
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 new_keyword;
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string new_url;
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string keyword;
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("new_title", &new_title) ||
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString("new_keyword", &new_keyword) ||
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString("new_url", &new_url)) {
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "One or more inputs invalid");
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string new_ref_url = TemplateURLRef::DisplayURLToURLRef(
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UTF8ToUTF16(new_url));
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<KeywordEditorController> controller(
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new KeywordEditorController(browser->profile()));
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetString("keyword", &keyword)) {
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TemplateURL* template_url =
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url_model->GetTemplateURLForKeyword(UTF8ToUTF16(keyword));
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (template_url == NULL) {
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutomationJSONReply(this, reply_message).SendError(
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "No match for keyword: " + keyword);
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_model->AddObserver(new AutomationProviderSearchEngineObserver(
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, browser->profile(), reply_message));
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller->ModifyTemplateURL(template_url, new_title, new_keyword,
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  new_ref_url);
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_model->AddObserver(new AutomationProviderSearchEngineObserver(
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, browser->profile(), reply_message));
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller->AddTemplateURL(new_title, new_keyword, new_ref_url);
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "PerformActionOnSearchEngine",
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "keyword": keyword, "action": action }
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::PerformActionOnSearchEngine(
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* url_model =
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(browser->profile());
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string keyword;
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string action;
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("keyword", &keyword) ||
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString("action", &action)) {
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "One or more inputs invalid");
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURL* template_url =
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url_model->GetTemplateURLForKeyword(UTF8ToUTF16(keyword));
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (template_url == NULL) {
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "No match for keyword: " + keyword);
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (action == "delete") {
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_model->AddObserver(new AutomationProviderSearchEngineObserver(
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, browser->profile(), reply_message));
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_model->Remove(template_url);
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (action == "default") {
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_model->AddObserver(new AutomationProviderSearchEngineObserver(
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, browser->profile(), reply_message));
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_model->SetDefaultSearchProvider(template_url);
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Invalid action: " + action);
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetLocalStatePrefsInfo" }
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer chrome/test/pyautolib/prefs_info.py for sample json output.
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetLocalStatePrefsInfo(
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* items = g_browser_process->local_state()->
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetPreferenceValues();
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("prefs", items);  // return_value owns items.
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "SetLocalStatePrefs", "path": path,
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "value": value }
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetLocalStatePrefs(
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string path;
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* val = NULL;
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetString("path", &path) && args->Get("value", &val)) {
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefService* pref_service = g_browser_process->local_state();
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PrefService::Preference* pref =
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pref_service->FindPreference(path.c_str());
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pref) {  // Not a registered pref.
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply.SendError("pref not registered.");
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (pref->IsManaged()) {  // Do not attempt to change a managed pref.
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply.SendError("pref is managed. cannot be changed.");
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {  // Set the pref.
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service->Set(path.c_str(), *val);
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("no pref path or value given.");
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetPrefsInfo", "windex": 0 }
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer chrome/test/pyautolib/prefs_info.py for sample json output.
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetPrefsInfo(DictionaryValue* args,
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             IPC::Message* reply_message) {
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* items = browser->profile()->GetPrefs()->
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetPreferenceValues();
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("prefs", items);  // return_value owns items.
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(return_value.get());
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input:
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// { "command": "SetPrefs",
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   "windex": 0,
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   "path": path,
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   "value": value }
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetPrefs(DictionaryValue* args,
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         IPC::Message* reply_message) {
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string path;
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* val = NULL;
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetString("path", &path) && args->Get("value", &val)) {
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefService* pref_service = browser->profile()->GetPrefs();
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PrefService::Preference* pref =
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pref_service->FindPreference(path.c_str());
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pref) {  // Not a registered pref.
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply.SendError("pref not registered.");
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (pref->IsManaged()) {  // Do not attempt to change a managed pref.
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply.SendError("pref is managed. cannot be changed.");
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {  // Set the pref.
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service->Set(path.c_str(), *val);
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("no pref path or value given.");
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetOmniboxInfo" }
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer chrome/test/pyautolib/omnibox_info.py for sample json output.
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetOmniboxInfo(Browser* browser,
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               DictionaryValue* args,
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               IPC::Message* reply_message) {
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocationBar* loc_bar = browser->window()->GetLocationBar();
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!loc_bar) {
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("The specified browser does not have a location bar.");
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const OmniboxView* omnibox_view = loc_bar->GetLocationEntry();
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const OmniboxEditModel* model = omnibox_view->model();
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill up matches.
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* matches = new ListValue;
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AutocompleteResult& result = model->result();
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (AutocompleteResult::const_iterator i(result.begin()); i != result.end();
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++i) {
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AutocompleteMatch& match = *i;
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* item = new DictionaryValue;  // owned by return_value
294690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    item->SetString("type", AutocompleteMatchType::ToString(match.type));
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetBoolean("starred", match.starred);
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetString("destination_url", match.destination_url.spec());
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetString("contents", match.contents);
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetString("description", match.description);
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    matches->Append(item);
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("matches", matches);
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill up other properties.
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* properties = new DictionaryValue;  // owned by return_value
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetBoolean("has_focus", model->has_focus());
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetBoolean("query_in_progress",
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         !model->autocomplete_controller()->done());
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetString("keyword", model->keyword());
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties->SetString("text", omnibox_view->GetText());
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("properties", properties);
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(return_value.get());
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "SetOmniboxText",
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "text": "goog" }
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetOmniboxText(Browser* browser,
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               DictionaryValue* args,
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               IPC::Message* reply_message) {
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 text;
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("text", &text)) {
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("text missing");
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::FocusLocationBar(browser);
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocationBar* loc_bar = browser->window()->GetLocationBar();
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!loc_bar) {
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("The specified browser does not have a location bar.");
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OmniboxView* omnibox_view = loc_bar->GetLocationEntry();
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  omnibox_view->model()->OnSetFocus(false);
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  omnibox_view->SetUserText(text);
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "OmniboxMovePopupSelection",
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "count": 1 }
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Negative count implies up, positive implies down. Count values will be
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// capped by the size of the popup list.
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OmniboxMovePopupSelection(
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int count;
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("count", &count)) {
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("count missing");
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocationBar* loc_bar = browser->window()->GetLocationBar();
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!loc_bar) {
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("The specified browser does not have a location bar.");
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loc_bar->GetLocationEntry()->model()->OnUpOrDownKeyPressed(count);
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "OmniboxAcceptInput" }
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OmniboxAcceptInput(
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationController& controller =
30192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->tab_strip_model()->GetActiveWebContents()->GetController();
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocationBar* loc_bar = browser->window()->GetLocationBar();
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!loc_bar) {
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "The specified browser does not have a location bar.");
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new OmniboxAcceptNotificationObserver(&controller, this, reply_message);
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loc_bar->AcceptInput();
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetInitialLoadTimes" }
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to InitialLoadObserver::GetTimingInformation() for sample output.
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetInitialLoadTimes(
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser*,
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue*,
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      initial_load_observer_->GetTimingInformation());
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string json_return;
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONWriter::Write(return_value.get(), &json_return);
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationMsg_SendJSONRequest::WriteReplyParams(
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply_message, json_return, true);
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(reply_message);
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetPluginsInfo" }
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer chrome/test/pyautolib/plugins_info.py for sample json output.
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetPluginsInfo(
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginService::GetInstance()->GetPlugins(
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TestingAutomationProvider::GetPluginsInfoCallback,
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this, browser, args, reply_message));
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetPluginsInfoCallback(
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message,
3061ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const std::vector<content::WebPluginInfo>& plugins) {
30627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PluginPrefs* plugin_prefs =
30637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      PluginPrefs::GetForProfile(browser->profile()).get();
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* items = new ListValue;
3065ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (std::vector<content::WebPluginInfo>::const_iterator it =
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           plugins.begin();
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != plugins.end();
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* item = new DictionaryValue;
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetString("name", it->name);
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetString("path", it->path.value());
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetString("version", it->version);
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetString("desc", it->desc);
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->SetBoolean("enabled", plugin_prefs->IsPluginEnabled(*it));
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add info about mime types.
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* mime_types = new ListValue();
3077ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    for (std::vector<content::WebPluginMimeType>::const_iterator type_it =
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             it->mime_types.begin();
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         type_it != it->mime_types.end();
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++type_it) {
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DictionaryValue* mime_type = new DictionaryValue();
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mime_type->SetString("mimeType", type_it->mime_type);
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mime_type->SetString("description", type_it->description);
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ListValue* file_extensions = new ListValue();
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (std::vector<std::string>::const_iterator ext_it =
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               type_it->file_extensions.begin();
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ext_it != type_it->file_extensions.end();
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ++ext_it) {
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_extensions->Append(new StringValue(*ext_it));
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mime_type->Set("fileExtensions", file_extensions);
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mime_types->Append(mime_type);
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->Set("mimeTypes", mime_types);
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    items->Append(item);
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("plugins", items);  // return_value owns items.
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input:
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    { "command": "EnablePlugin",
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      "path": "/Library/Internet Plug-Ins/Flash Player.plugin" }
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::EnablePlugin(Browser* browser,
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             DictionaryValue* args,
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             IPC::Message* reply_message) {
31112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType path;
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("path", &path)) {
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError("path not specified.");
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PluginPrefs* plugin_prefs =
31177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      PluginPrefs::GetForProfile(browser->profile()).get();
31187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin_prefs->EnablePlugin(
31197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      true,
31207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::FilePath(path),
31217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&DidEnablePlugin,
31227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 AsWeakPtr(),
31237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 reply_message,
31247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 path,
31257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 "Could not enable plugin for path %s."));
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input:
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    { "command": "DisablePlugin",
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      "path": "/Library/Internet Plug-Ins/Flash Player.plugin" }
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::DisablePlugin(Browser* browser,
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              DictionaryValue* args,
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              IPC::Message* reply_message) {
31342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType path;
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("path", &path)) {
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError("path not specified.");
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PluginPrefs* plugin_prefs =
31407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      PluginPrefs::GetForProfile(browser->profile()).get();
31417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin_prefs->EnablePlugin(
31427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      false,
31437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::FilePath(path),
31447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&DidEnablePlugin,
31457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 AsWeakPtr(),
31467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 reply_message,
31477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 path,
31487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 "Could not disable plugin for path %s."));
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input:
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    { "command": "SaveTabContents",
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      "tab_index": 0,
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      "filename": <a full pathname> }
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json output:
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    {}
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SaveTabContents(
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tab_index = 0;
31622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType filename;
31632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType parent_directory;
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents = NULL;
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("tab_index", &tab_index) ||
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString("filename", &filename)) {
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("tab_index or filename param missing");
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
31722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents = browser->tab_strip_model()->GetWebContentsAt(tab_index);
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!web_contents) {
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutomationJSONReply(this, reply_message).SendError("no tab at tab_index");
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We're doing a SAVE_AS_ONLY_HTML so the the directory path isn't
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used.  Nevertheless, SavePackage requires it be valid.  Sigh.
31802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent_directory = base::FilePath(filename).DirName().value();
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents->SavePage(
31822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::FilePath(filename),
31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::FilePath(parent_directory),
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::SAVE_PAGE_TYPE_AS_ONLY_HTML)) {
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Could not initiate SavePage");
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The observer will delete itself when done.
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new SavePackageNotificationObserver(
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext::GetDownloadManager(browser->profile()),
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, reply_message);
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Translates a dictionary password to a PasswordForm struct.
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::PasswordForm GetPasswordFormFromDict(
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DictionaryValue& password_dict) {
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the time is specified, change time to the specified time.
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time time = base::Time::Now();
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int it;
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double dt;
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (password_dict.GetInteger("time", &it))
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    time = base::Time::FromTimeT(it);
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (password_dict.GetDouble("time", &dt))
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    time = base::Time::FromDoubleT(dt);
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string signon_realm;
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 username_value;
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 password_value;
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 origin_url_text;
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 username_element;
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 password_element;
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 submit_element;
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 action_target_text;
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool blacklist;
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 old_password_element;
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 old_password_value;
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't care if any of these fail - they are either optional or checked
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before this function is called.
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_dict.GetString("signon_realm", &signon_realm);
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_dict.GetString("username_value", &username_value);
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_dict.GetString("password_value", &password_value);
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_dict.GetString("origin_url", &origin_url_text);
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_dict.GetString("username_element", &username_element);
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_dict.GetString("password_element", &password_element);
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_dict.GetString("submit_element", &submit_element);
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_dict.GetString("action_target", &action_target_text);
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!password_dict.GetBoolean("blacklist", &blacklist))
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blacklist = false;
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL origin_gurl(origin_url_text);
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL action_target(action_target_text);
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PasswordForm password_form;
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_form.signon_realm = signon_realm;
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_form.username_value = username_value;
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_form.password_value = password_value;
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_form.origin = origin_gurl;
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_form.username_element = username_element;
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_form.password_element = password_element;
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_form.submit_element = submit_element;
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_form.action = action_target;
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_form.blacklisted_by_user = blacklist;
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_form.date_created = time;
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return password_form;
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See AddSavedPassword() in chrome/test/functional/pyauto.py for sample json
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// input.
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json output: { "password_added": true }
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::AddSavedPassword(
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* password_dict = NULL;
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetDictionary("password", &password_dict)) {
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Must specify a password dictionary.");
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The "signon realm" is effectively the primary key and must be included.
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check here before calling GetPasswordFormFromDict.
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!password_dict->HasKey("signon_realm")) {
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Password must include a value for 'signon_realm.'");
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PasswordForm new_password =
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetPasswordFormFromDict(*password_dict);
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use IMPLICIT_ACCESS since new passwords aren't added in incognito mode.
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordStore* password_store = PasswordStoreFactory::GetForProfile(
32827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      browser->profile(), Profile::IMPLICIT_ACCESS).get();
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The password store does not exist for an incognito window.
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (password_store == NULL) {
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return_value->SetBoolean("password_added", false);
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(return_value.get());
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This observer will delete itself.
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordStoreLoginsChangedObserver* observer =
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PasswordStoreLoginsChangedObserver(this, reply_message,
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PasswordStoreChange::ADD,
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             "password_added");
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer->Init();
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_store->AddLogin(new_password);
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See RemoveSavedPassword() in chrome/test/functional/pyauto.py for sample
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// json input.
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json output: {}
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::RemoveSavedPassword(
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* password_dict = NULL;
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetDictionary("password", &password_dict)) {
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Must specify a password dictionary.");
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The "signon realm" is effectively the primary key and must be included.
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check here before calling GetPasswordFormFromDict.
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!password_dict->HasKey("signon_realm")) {
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Password must include a value for 'signon_realm.'");
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PasswordForm to_remove =
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetPasswordFormFromDict(*password_dict);
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use EXPLICIT_ACCESS since passwords can be removed in incognito mode.
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordStore* password_store = PasswordStoreFactory::GetForProfile(
33287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      browser->profile(), Profile::EXPLICIT_ACCESS).get();
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (password_store == NULL) {
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Unable to get password store.");
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This observer will delete itself.
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordStoreLoginsChangedObserver* observer =
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PasswordStoreLoginsChangedObserver(
3338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          this, reply_message, PasswordStoreChange::REMOVE, std::string());
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer->Init();
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_store->RemoveLogin(to_remove);
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetSavedPasswords" }
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to GetSavedPasswords() in chrome/test/pyautolib/pyauto.py for sample
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// json output.
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetSavedPasswords(
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use EXPLICIT_ACCESS since saved passwords can be retrieved in
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // incognito mode.
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordStore* password_store = PasswordStoreFactory::GetForProfile(
33547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      browser->profile(), Profile::EXPLICIT_ACCESS).get();
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (password_store == NULL) {
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply reply(this, reply_message);
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Unable to get password store.");
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_store->GetAutofillableLogins(
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new AutomationProviderGetPasswordsObserver(this, reply_message));
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observer deletes itself after sending the result.
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Get the WebContents from a dictionary of arguments.
33692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* GetWebContentsFromDict(const Browser* browser,
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const DictionaryValue* args,
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    std::string* error_message) {
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tab_index;
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("tab_index", &tab_index)) {
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error_message = "Must include tab_index.";
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents =
33792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->tab_strip_model()->GetWebContentsAt(tab_index);
33802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents) {
33812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *error_message = base::StringPrintf("No tab at index %d.", tab_index);
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return web_contents;
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::FindInPage(
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_message;
33942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents =
33952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetWebContentsFromDict(browser, args, &error_message);
33962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents) {
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error_message);
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 search_string;
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool forward;
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match_case;
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool find_next;
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("search_string", &search_string)) {
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SendError("Must include search_string string.");
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("forward", &forward)) {
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SendError("Must include forward boolean.");
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("match_case", &match_case)) {
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SendError("Must include match_case boolean.");
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("find_next", &find_next)) {
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SendError("Must include find_next boolean.");
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendFindRequest(web_contents,
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  true,
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  search_string,
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  forward,
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  match_case,
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  find_next,
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  reply_message);
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OpenFindInPage(
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::FindInPage(browser, false, false);
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsFindInPageVisible(
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool visible;
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FindBarTesting* find_bar =
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->GetFindBarController()->find_bar()->GetFindBarTesting();
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  find_bar->GetFindBarWindowInfo(NULL, &visible);
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("is_visible", visible);
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::InstallExtension(
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
34682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType path_string;
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool with_ui;
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool from_webstore = false;
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebContents* tab;
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab, &error_msg)) {
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error_msg);
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("path", &path_string)) {
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Missing or invalid 'path'");
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("with_ui", &with_ui)) {
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Missing or invalid 'with_ui'");
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args->GetBoolean("from_webstore", &from_webstore);
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
34912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->profile())->extension_service();
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionProcessManager* manager =
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::ExtensionSystem::Get(browser->profile())->process_manager();
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (service && manager) {
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The observer will delete itself when done.
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new ExtensionReadyNotificationObserver(
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager,
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        service,
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this,
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reply_message);
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath extension_path(path_string);
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the given path has a 'crx' extension, assume it is a packed extension
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and install it. Otherwise load it as an unpacked extension.
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_path.MatchesExtension(FILE_PATH_LITERAL(".crx"))) {
35064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      scoped_ptr<ExtensionInstallPrompt> client(
35074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch          with_ui ? new ExtensionInstallPrompt(tab) : NULL);
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<extensions::CrxInstaller> installer(
35094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch          extensions::CrxInstaller::Create(service, client.Pass()));
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!with_ui)
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        installer->set_allow_silent_install(true);
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer->set_install_cause(extension_misc::INSTALL_CAUSE_AUTOMATION);
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (from_webstore)
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        installer->set_creation_flags(Extension::FROM_WEBSTORE);
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer->InstallCrx(extension_path);
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<extensions::UnpackedInstaller> installer(
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extensions::UnpackedInstaller::Create(service));
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer->set_prompt_for_plugins(with_ui);
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer->Load(extension_path);
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Extensions service/process manager is not available");
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue* GetHostPermissions(const Extension* ext, bool effective_perm) {
35312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::URLPatternSet pattern_set;
353290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (effective_perm) {
353390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    pattern_set =
353490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        extensions::PermissionsData::GetEffectiveHostPermissions(ext);
353590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pattern_set = ext->GetActivePermissions()->explicit_hosts();
353790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* permissions = new ListValue;
35402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (extensions::URLPatternSet::const_iterator perm = pattern_set.begin();
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       perm != pattern_set.end(); ++perm) {
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    permissions->Append(new StringValue(perm->GetAsString()));
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions;
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue* GetAPIPermissions(const Extension* ext) {
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* permissions = new ListValue;
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> perm_list =
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ext->GetActivePermissions()->GetAPIsAsStrings();
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<std::string>::const_iterator perm = perm_list.begin();
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       perm != perm_list.end(); ++perm) {
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    permissions->Append(new StringValue(perm->c_str()));
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return permissions;
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetExtensionsInfo" }
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See GetExtensionsInfo() in chrome/test/pyautolib/pyauto.py for sample json
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// output.
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetExtensionsInfo(DictionaryValue* args,
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  IPC::Message* reply_message) {
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
35742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->profile())->extension_service();
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service) {
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("No extensions service.");
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* extensions_values = new ListValue;
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ExtensionSet* extensions = service->extensions();
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ExtensionSet* disabled_extensions = service->disabled_extensions();
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionList all;
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  all.insert(all.end(),
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             extensions->begin(),
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             extensions->end());
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  all.insert(all.end(),
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             disabled_extensions->begin(),
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             disabled_extensions->end());
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionActionManager* extension_action_manager =
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionActionManager::Get(browser->profile());
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ExtensionList::const_iterator it = all.begin();
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != all.end(); ++it) {
3594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const Extension* extension = it->get();
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string id = extension->id();
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* extension_value = new DictionaryValue;
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetString("id", id);
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetString("version", extension->VersionString());
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetString("name", extension->name());
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetString("public_key", extension->public_key());
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetString("description", extension->description());
36022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extension_value->SetString(
36032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "background_url",
36042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extensions::BackgroundInfo::GetBackgroundURL(extension).spec());
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetString("options_url",
36062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extensions::ManifestURL::GetOptionsPage(extension).spec());
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->Set("host_permissions",
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         GetHostPermissions(extension, false));
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->Set("effective_host_permissions",
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         GetHostPermissions(extension, true));
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->Set("api_permissions", GetAPIPermissions(extension));
36122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Manifest::Location location = extension->location();
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetBoolean("is_component",
36142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                location == Manifest::COMPONENT);
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetBoolean("is_internal",
36162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                location == Manifest::INTERNAL);
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetBoolean("is_user_installed",
36182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        location == Manifest::INTERNAL ||
36192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Manifest::IsUnpackedLocation(location));
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetBoolean("is_enabled", service->IsExtensionEnabled(id));
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetBoolean("allowed_in_incognito",
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                service->IsIncognitoEnabled(id));
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_value->SetBoolean(
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "has_page_action",
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_action_manager->GetPageAction(*extension) != NULL);
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_values->Append(extension_value);
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->Set("extensions", extensions_values);
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(return_value.get());
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See UninstallExtensionById() in chrome/test/pyautolib/pyauto.py for sample
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// json input.
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json output: {}
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::UninstallExtensionById(
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension;
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetExtensionFromJSONArgs(
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          args, "id", browser->profile(), &extension, &error)) {
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
36512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->profile())->extension_service();
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service) {
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "No extensions service.");
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for a notification indicating that the extension with the given ID
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has been uninstalled.  This observer will delete itself.
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new ExtensionUninstallObserver(this, reply_message, extension->id());
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->UninstallExtension(extension->id(), false, NULL);
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See SetExtensionStateById() in chrome/test/pyautolib/pyauto.py
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for sample json input.
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetExtensionStateById(
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension;
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetExtensionFromJSONArgs(
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          args, "id", browser->profile(), &extension, &error)) {
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enable;
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("enable", &enable)) {
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("Missing or invalid key: enable");
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_in_incognito;
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("allow_in_incognito", &allow_in_incognito)) {
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("Missing or invalid key: allow_in_incognito");
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (allow_in_incognito && !enable) {
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("Invalid state: Disabled extension "
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "cannot be allowed in incognito mode.");
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
37042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->profile())->extension_service();
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionProcessManager* manager =
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::ExtensionSystem::Get(browser->profile())->process_manager();
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service) {
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("No extensions service or process manager.");
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enable) {
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!service->IsExtensionEnabled(extension->id())) {
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ExtensionReadyNotificationObserver(
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          manager,
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          service,
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this,
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reply_message);
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->EnableExtension(extension->id());
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutomationJSONReply(this, reply_message).SendSuccess(NULL);
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service->DisableExtension(extension->id(),
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Extension::DISABLE_USER_ACTION);
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->SetIsIncognitoEnabled(extension->id(), allow_in_incognito);
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See TriggerPageActionById() in chrome/test/pyautolib/pyauto.py
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for sample json input.
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::TriggerPageActionById(
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* tab;
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab, &error)) {
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension;
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetEnabledExtensionFromJSONArgs(
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          args, "id", browser->profile(), &extension, &error)) {
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionAction* page_action =
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionActionManager::Get(browser->profile())->
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetPageAction(*extension);
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!page_action) {
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Extension doesn't have any page action.");
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnsureTabSelected(browser, tab);
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool pressed = false;
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocationBarTesting* loc_bar =
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->window()->GetLocationBar()->GetLocationBarForTesting();
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t page_action_visible_count =
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<size_t>(loc_bar->PageActionVisibleCount());
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < page_action_visible_count; ++i) {
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (loc_bar->GetVisiblePageAction(i) == page_action) {
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loc_bar->TestPageActionPressed(i);
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pressed = true;
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!pressed) {
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Extension's page action is not visible.");
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_action->HasPopup(ExtensionTabUtil::GetTabId(tab))) {
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This observer will delete itself.
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new ExtensionPopupObserver(
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, reply_message, extension->id());
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See TriggerBrowserActionById() in chrome/test/pyautolib/pyauto.py
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for sample json input.
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::TriggerBrowserActionById(
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* tab;
37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab, &error)) {
37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension;
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetEnabledExtensionFromJSONArgs(
38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          args, "id", browser->profile(), &extension, &error)) {
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionAction* action = ExtensionActionManager::Get(browser->profile())->
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetBrowserAction(*extension);
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!action) {
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Extension doesn't have any browser action.");
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnsureTabSelected(browser, tab);
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserActionTestUtil browser_actions(browser);
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_browser_actions = browser_actions.NumberOfBrowserActions();
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int action_index = -1;
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS)
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < num_browser_actions; ++i) {
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension->id() == browser_actions.GetExtensionId(i)) {
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      action_index = i;
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kkania): Implement the platform-specific GetExtensionId() in
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserActionTestUtil.
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (num_browser_actions != 1) {
38292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(base::StringPrintf(
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Found %d browser actions. Only one browser action must be active.",
38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        num_browser_actions));
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This extension has a browser action, and there's only one action, so this
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must be the first one.
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  action_index = 0;
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (action_index == -1) {
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Extension's browser action is not visible.");
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_actions.Press(action_index);
38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (action->HasPopup(ExtensionTabUtil::GetTabId(tab))) {
38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This observer will delete itself.
38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new ExtensionPopupObserver(
38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, reply_message, extension->id());
38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ActionOnSSLBlockingPage(
38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool proceed;
38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetTabFromJSONArgs(args, &web_contents, &error)) {
38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("proceed", &proceed)) {
38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "'proceed' is missing or invalid");
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationController& controller = web_contents->GetController();
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = controller.GetActiveEntry();
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry->GetPageType() == content::PAGE_TYPE_INTERSTITIAL) {
38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InterstitialPage* ssl_blocking_page =
38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        InterstitialPage::GetInterstitialPage(web_contents);
38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_blocking_page) {
38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (proceed) {
38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new NavigationNotificationObserver(&controller, this, reply_message, 1,
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           false, true);
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ssl_blocking_page->Proceed();
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_blocking_page->DontProceed();
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutomationJSONReply(this, reply_message).SendSuccess(NULL);
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendError(error);
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetSecurityState(DictionaryValue* args,
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 IPC::Message* reply_message) {
38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetTabFromJSONArgs(args, &web_contents, &error)) {
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error);
38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = web_contents->GetController().GetActiveEntry();
38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetInteger("security_style",
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  static_cast<int>(entry->GetSSL().security_style));
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetInteger("ssl_cert_status",
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  static_cast<int>(entry->GetSSL().cert_status));
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetInteger("insecure_content_status",
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  static_cast<int>(entry->GetSSL().content_status));
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "UpdateExtensionsNow" }
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json output: {}
39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::UpdateExtensionsNow(
39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
39212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->profile())->extension_service();
39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service) {
39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "No extensions service.");
39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionUpdater* updater = service->updater();
39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!updater) {
39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "No updater for extensions service.");
39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionProcessManager* manager =
39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::ExtensionSystem::Get(browser->profile())->process_manager();
39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!manager) {
39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "No extension process manager.");
39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new observer that waits until the extensions have been fully
39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updated (we should not send the reply until after all extensions have
39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been updated).  This observer will delete itself.
39462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionsUpdatedObserver* observer = new ExtensionsUpdatedObserver(
39472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager, this, reply_message);
39482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionUpdater::CheckParams params;
39492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.install_immediately = true;
39502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.callback = base::Bind(&ExtensionsUpdatedObserver::UpdateCheckFinished,
39512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               base::Unretained(observer));
39522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  updater->CheckNow(params);
39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SendSuccessIfAlive(
39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WeakPtr<AutomationProvider> provider,
39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
3960868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (provider.get())
39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(provider.get(), reply_message).SendSuccess(NULL);
39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OverrideGeoposition(
39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double latitude, longitude, altitude;
39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetDouble("latitude", &latitude) ||
39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetDouble("longitude", &longitude) ||
39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetDouble("altitude", &altitude)) {
39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Missing or invalid geolocation parameters");
39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::Geoposition position;
39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position.latitude = latitude;
39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position.longitude = longitude;
39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position.altitude = altitude;
39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position.accuracy = 0.;
39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position.timestamp = base::Time::Now();
3983b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3984b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  content::GeolocationProvider::OverrideLocationForTesting(
39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      position,
39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&SendSuccessIfAlive, AsWeakPtr(), reply_message));
39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to GetAllNotifications() in chrome/test/pyautolib/pyauto.py for
39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sample json input/output.
39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetAllNotifications(
39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new GetAllNotificationsObserver(this, reply_message);
39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to CloseNotification() in chrome/test/pyautolib/pyauto.py for
39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sample json input.
40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns empty json message.
40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::CloseNotification(
40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index;
40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("index", &index)) {
40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'index' missing or invalid.");
40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BalloonNotificationUIManager* manager =
40122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BalloonNotificationUIManager::GetInstanceForTesting();
40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BalloonCollection* collection = manager->balloon_collection();
40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BalloonCollection::Balloons& balloons = collection->GetActiveBalloons();
40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int balloon_count = static_cast<int>(balloons.size());
40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index < 0 || index >= balloon_count) {
40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
40182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .SendError(base::StringPrintf("No notification at index %d", index));
40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const Notification*> queued_notes;
40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetQueuedNotificationsForTesting(&queued_notes);
40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (queued_notes.empty()) {
40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new OnNotificationBalloonCountObserver(
40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, reply_message, balloon_count - 1);
40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new NewNotificationBalloonObserver(this, reply_message);
40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->CancelById(balloons[index]->notification().notification_id());
40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to WaitForNotificationCount() in chrome/test/pyautolib/pyauto.py for
40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sample json input.
40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns empty json message.
40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WaitForNotificationCount(
40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int count;
40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("count", &count)) {
40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'count' missing or invalid.");
40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will delete itself when finished.
40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new OnNotificationBalloonCountObserver(this, reply_message, count);
40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample JSON input: { "command": "GetNTPInfo" }
40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For output, refer to chrome/test/pyautolib/ntp_model.py.
40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetNTPInfo(
40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This observer will delete itself.
40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new NTPInfoObserver(this, reply_message);
40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::RemoveNTPMostVisitedThumbnail(
40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url;
40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("url", &url)) {
40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Missing or invalid 'url' key.");
40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::TopSites* top_sites = browser->profile()->GetTopSites();
40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!top_sites) {
40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("TopSites service is not initialized.");
40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_sites->AddBlacklistedURL(GURL(url));
40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::RestoreAllNTPMostVisitedThumbnails(
40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::TopSites* top_sites = browser->profile()->GetTopSites();
40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!top_sites) {
40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("TopSites service is not initialized.");
40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_sites->ClearBlacklistedURLs();
40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::KillRendererProcess(
40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pid;
4097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32 kAccessFlags = base::kProcessAccessTerminate |
4098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        base::kProcessAccessWaitForTermination |
4099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        base::kProcessAccessQueryInformation;
4100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("pid", &pid)) {
41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'pid' key missing or invalid.");
41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessHandle process;
4107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!base::OpenProcessHandleWithAccess(static_cast<base::ProcessId>(pid),
4108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         kAccessFlags,
4109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         &process)) {
41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(base::StringPrintf(
41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Failed to open process handle for pid %d", pid));
41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new RendererProcessClosedObserver(this, reply_message);
41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::KillProcess(process, 0, false);
41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::CloseProcessHandle(process);
41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestingAutomationProvider::BuildWebKeyEventFromArgs(
41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* error,
41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeWebKeyboardEvent* event) {
41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int type, modifiers;
41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_system_key;
41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 unmodified_text, text;
41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key_identifier;
41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("type", &type)) {
41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = "'type' missing or invalid.";
41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("isSystemKey", &is_system_key)) {
41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = "'isSystemKey' missing or invalid.";
41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("unmodifiedText", &unmodified_text)) {
41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = "'unmodifiedText' missing or invalid.";
41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("text", &text)) {
41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = "'text' missing or invalid.";
41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("nativeKeyCode", &event->nativeKeyCode)) {
41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = "'nativeKeyCode' missing or invalid.";
41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("windowsKeyCode", &event->windowsKeyCode)) {
41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = "'windowsKeyCode' missing or invalid.";
41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("modifiers", &modifiers)) {
41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = "'modifiers' missing or invalid.";
41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetString("keyIdentifier", &key_identifier)) {
41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::strlcpy(event->keyIdentifier,
41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  key_identifier.c_str(),
41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WebKit::WebKeyboardEvent::keyIdentifierLengthCap);
41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4160558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error = "'keyIdentifier' missing or invalid.";
4161558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == automation::kRawKeyDownType) {
41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->type = WebKit::WebInputEvent::RawKeyDown;
41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type == automation::kKeyDownType) {
41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->type = WebKit::WebInputEvent::KeyDown;
41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type == automation::kKeyUpType) {
41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->type = WebKit::WebInputEvent::KeyUp;
41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type == automation::kCharType) {
41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->type = WebKit::WebInputEvent::Char;
41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = "'type' refers to an unrecognized keyboard event type";
41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 unmodified_text_truncated = unmodified_text.substr(
41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, WebKit::WebKeyboardEvent::textLengthCap - 1);
41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(event->unmodifiedText,
41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unmodified_text_truncated.c_str(),
41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unmodified_text_truncated.length() + 1);
41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 text_truncated = text.substr(
41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, WebKit::WebKeyboardEvent::textLengthCap - 1);
41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(event->text, text_truncated.c_str(), text_truncated.length() + 1);
41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->modifiers = 0;
41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (modifiers & automation::kShiftKeyMask)
41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->modifiers |= WebKit::WebInputEvent::ShiftKey;
41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (modifiers & automation::kControlKeyMask)
41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->modifiers |= WebKit::WebInputEvent::ControlKey;
41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (modifiers & automation::kAltKeyMask)
41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->modifiers |= WebKit::WebInputEvent::AltKey;
41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (modifiers & automation::kMetaKeyMask)
41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->modifiers |= WebKit::WebInputEvent::MetaKey;
41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->isSystemKey = is_system_key;
41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->timeStampSeconds = base::Time::Now().ToDoubleT();
41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->skip_in_browser = true;
41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SendWebkitKeyEvent(
42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeWebKeyboardEvent event;
42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In the event of an error, BuildWebKeyEventFromArgs handles telling what
42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // went wrong and sending the reply message; if it fails, we just have to
42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stop here.
42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BuildWebKeyEventFromArgs(args, &error, &event)) {
42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* view;
42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewFromJSONArgs(args, profile(), &view, &error)) {
42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new InputEventAckNotificationObserver(this, reply_message, event.type, 1);
42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ForwardKeyboardEvent(event);
42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the active JavaScript modal dialog, or NULL if none.
42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)JavaScriptAppModalDialog* GetActiveJavaScriptModalDialog(
42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ErrorCode* error_code) {
42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialogQueue* dialog_queue = AppModalDialogQueue::GetInstance();
42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dialog_queue->HasActiveDialog() ||
42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !dialog_queue->active_dialog()->IsJavaScriptModalDialog()) {
42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error_code = automation::kNoJavaScriptModalDialogOpen;
42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<JavaScriptAppModalDialog*>(dialog_queue->active_dialog());
42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetAppModalDialogMessage(
42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ErrorCode code;
42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JavaScriptAppModalDialog* dialog = GetActiveJavaScriptModalDialog(&code);
42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dialog) {
42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendErrorCode(code);
42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue result_dict;
42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result_dict.SetString("message", UTF16ToUTF8(dialog->message_text()));
42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&result_dict);
42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::AcceptOrDismissAppModalDialog(
42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool accept;
42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("accept", &accept)) {
42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Missing or invalid 'accept'");
42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ErrorCode code;
42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JavaScriptAppModalDialog* dialog = GetActiveJavaScriptModalDialog(&code);
42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dialog) {
42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendErrorCode(code);
42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (accept) {
42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string prompt_text;
42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (args->GetString("prompt_text", &prompt_text))
42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dialog->SetOverridePromptText(UTF8ToUTF16(prompt_text));
42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dialog->native_dialog()->AcceptAppModalDialog();
42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dialog->native_dialog()->CancelAppModalDialog();
42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample JSON input: { "command": "LaunchApp",
42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "id": "ahfgeienlihckogmohjhadlkjgocpleb" }
42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample JSON output: {}
42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::LaunchApp(
42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id;
42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("id", &id)) {
42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Must include string id.");
42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
42982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->profile())->extension_service();
42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service) {
43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "No extensions service.");
43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = service->GetExtensionById(
43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id, false  /* do not include disabled extensions */);
43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!extension) {
43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
43092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::StringPrintf(
43102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "Extension with ID '%s' doesn't exist or is disabled.",
43112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            id.c_str()));
43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* old_contents =
43162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->tab_strip_model()->GetActiveWebContents();
43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!old_contents) {
43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Cannot identify selected tab contents.");
43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::AppLaunchParams launch_params(profile(), extension, CURRENT_TAB);
43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This observer will delete itself.
43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new AppLaunchObserver(&old_contents->GetController(), this, reply_message,
43262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        launch_params.container);
43272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::OpenApplication(launch_params);
43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample JSON input: { "command": "SetAppLaunchType",
43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "id": "ahfgeienlihckogmohjhadlkjgocpleb",
43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "launch_type": "pinned" }
43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample JSON output: {}
43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetAppLaunchType(
43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id;
43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("id", &id)) {
43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Must include string id.");
43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string launch_type_str;
43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("launch_type", &launch_type_str)) {
43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Must specify app launch type.");
43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
43532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->profile())->extension_service();
43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service) {
43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("No extensions service.");
43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = service->GetExtensionById(
43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id, true  /* include disabled extensions */);
43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!extension) {
43622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reply.SendError(base::StringPrintf(
43632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Extension with ID '%s' doesn't exist.", id.c_str()));
43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionPrefs::LaunchType launch_type;
43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (launch_type_str == "pinned") {
43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launch_type = extensions::ExtensionPrefs::LAUNCH_PINNED;
43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (launch_type_str == "regular") {
43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launch_type = extensions::ExtensionPrefs::LAUNCH_REGULAR;
43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (launch_type_str == "fullscreen") {
43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launch_type = extensions::ExtensionPrefs::LAUNCH_FULLSCREEN;
43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (launch_type_str == "window") {
43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launch_type = extensions::ExtensionPrefs::LAUNCH_WINDOW;
43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
43772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reply.SendError(base::StringPrintf(
43782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Unexpected launch type '%s'.", launch_type_str.c_str()));
43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->extension_prefs()->SetLaunchType(extension->id(), launch_type);
43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetV8HeapStats",
43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "tab_index": 0 }
43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to GetV8HeapStats() in chrome/test/pyautolib/pyauto.py for
43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sample json output.
43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetV8HeapStats(
43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tab_index;
43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("tab_index", &tab_index)) {
43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Missing 'tab_index' argument.");
44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_contents = browser->tab_strip_model()->GetWebContentsAt(tab_index);
44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents) {
44052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(base::StringPrintf(
44062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Could not get WebContents at tab index %d", tab_index));
44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* render_view = web_contents->GetRenderViewHost();
44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This observer will delete itself.
44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new V8HeapStatsObserver(
44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, reply_message,
44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::GetProcId(render_view->GetProcess()->GetHandle()));
44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view->Send(new ChromeViewMsg_GetV8HeapStats);
44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample json input: { "command": "GetFPS",
44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                      "tab_index": 0 }
44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Refer to GetFPS() in chrome/test/pyautolib/pyauto.py for
44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sample json output.
44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetFPS(
44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tab_index;
44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("tab_index", &tab_index)) {
44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Missing 'tab_index' argument.");
44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_contents = browser->tab_strip_model()->GetWebContentsAt(tab_index);
44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents) {
44382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(base::StringPrintf(
44392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Could not get WebContents at tab index %d", tab_index));
44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* render_view = web_contents->GetRenderViewHost();
44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int routing_id = render_view->GetRoutingID();
44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This observer will delete itself.
44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new FPSObserver(
44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, reply_message,
44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::GetProcId(render_view->GetProcess()->GetHandle()),
44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      routing_id);
44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view->Send(new ChromeViewMsg_GetFPS(routing_id));
44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsFullscreenForBrowser(Browser* browser,
44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("result",
44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  browser->fullscreen_controller()->IsFullscreenForBrowser());
44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsFullscreenForTab(Browser* browser,
44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("result",
44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->fullscreen_controller()->IsFullscreenForTabOrPending());
44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsMouseLocked(Browser* browser,
44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
44762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean("result", browser->tab_strip_model()->GetActiveWebContents()->
44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRenderViewHost()->GetView()->IsMouseLocked());
44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsMouseLockPermissionRequested(
44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenExitBubbleType type =
44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->fullscreen_controller()->GetFullscreenExitBubbleType();
44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool mouse_lock = false;
44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fullscreen_bubble::PermissionRequestedByType(type, NULL, &mouse_lock);
44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("result", mouse_lock);
44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsFullscreenPermissionRequested(
44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenExitBubbleType type =
44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->fullscreen_controller()->GetFullscreenExitBubbleType();
45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fullscreen = false;
45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fullscreen_bubble::PermissionRequestedByType(type, &fullscreen, NULL);
45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("result", fullscreen);
45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsFullscreenBubbleDisplayed(Browser* browser,
45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenExitBubbleType type =
45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->fullscreen_controller()->GetFullscreenExitBubbleType();
45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("result",
45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  type != FEB_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION);
45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsFullscreenBubbleDisplayingButtons(
45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenExitBubbleType type =
45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->fullscreen_controller()->GetFullscreenExitBubbleType();
45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("result", fullscreen_bubble::ShowButtonsForType(type));
45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::AcceptCurrentFullscreenOrMouseLockRequest(
45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
45332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser->fullscreen_controller()->OnAcceptFullscreenPermission();
45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(NULL);
45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::DenyCurrentFullscreenOrMouseLockRequest(
45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
45412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser->fullscreen_controller()->OnDenyFullscreenPermission();
45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(NULL);
45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WaitForTabToBeRestored(
45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetTabFromJSONArgs(args, &web_contents, &error)) {
45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationController& controller = web_contents->GetController();
45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new NavigationControllerRestoredObserver(this, &controller, reply_message);
45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::RefreshPolicies(
45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(ENABLE_CONFIGURATION_POLICY)
45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendError(
45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Configuration Policy disabled");
45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some policies (e.g. URLBlacklist) post tasks to other message loops
45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before they start enforcing updated policy values; make sure those tasks
45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have finished after a policy update.
45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates of the URLBlacklist are done on IO, after building the blacklist
45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on FILE, which is initiated from IO.
45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure reply =
45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(SendSuccessReply, AsWeakPtr(), reply_message);
45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_browser_process->policy_service()->RefreshPolicies(
45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(PostTask, BrowserThread::IO,
45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(PostTask, BrowserThread::FILE,
45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              base::Bind(PostTask, BrowserThread::IO,
45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::Bind(PostTask, BrowserThread::UI, reply)))));
45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int AccessArray(const volatile int arr[], const volatile int *index) {
45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arr[*index];
45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SimulateAsanMemoryBug(
45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args, IPC::Message* reply_message) {
45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This array is volatile not to let compiler optimize us out.
45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile int testarray[3] = {0, 0, 0};
45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the reply while we can.
45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(NULL);
45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cause Address Sanitizer to abort this process.
45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile int index = 5;
45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AccessArray(testarray, &index);
45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetIndicesFromTab(
45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id_or_handle = 0;
46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_id = args->HasKey("tab_id");
46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_handle = args->HasKey("tab_handle");
46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_id && has_handle) {
46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(
46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Both 'tab_id' and 'tab_handle' were specified. Only one is allowed");
46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (!has_id && !has_handle) {
46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Either 'tab_id' or 'tab_handle' must be specified");
46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_id && !args->GetInteger("tab_id", &id_or_handle)) {
46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'tab_id' is invalid");
46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_handle && (!args->GetInteger("tab_handle", &id_or_handle) ||
46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     !tab_tracker_->ContainsHandle(id_or_handle))) {
46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'tab_handle' is invalid");
46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = id_or_handle;
46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_handle) {
46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionTabHelper* session_tab_helper =
46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SessionTabHelper::FromWebContents(
46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tab_tracker_->GetResource(id_or_handle)->GetWebContents());
46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    id = session_tab_helper->session_id().id();
46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::BrowserIterator it;
46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int browser_index = 0;
46302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (; !it.done(); it.Next(), ++browser_index) {
46312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser* browser = *it;
46322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int tab_index = 0;
46332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         tab_index < browser->tab_strip_model()->count();
46342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ++tab_index) {
46352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents* tab =
46362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser->tab_strip_model()->GetWebContentsAt(tab_index);
46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SessionTabHelper* session_tab_helper =
46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SessionTabHelper::FromWebContents(tab);
46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (session_tab_helper->session_id().id() == id) {
46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DictionaryValue dict;
46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dict.SetInteger("windex", browser_index);
46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dict.SetInteger("tab_index", tab_index);
46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reply.SendSuccess(&dict);
46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendError("Could not find tab among current browser windows");
46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::NavigateToURL(
46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int navigation_count;
46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url, error;
46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserAndTabFromJSONArgs(args, &browser, &web_contents, &error)) {
46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("url", &url)) {
46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'url' missing or invalid");
46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("navigation_count", &navigation_count)) {
46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'navigation_count' missing or invalid");
46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (navigation_count > 0) {
46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new NavigationNotificationObserver(
46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &web_contents->GetController(), this, reply_message,
46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        navigation_count, false, true);
46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(NULL);
46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenURLParams params(
46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL(url), content::Referrer(), CURRENT_TAB,
46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::PageTransitionFromInt(
46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_TYPED |
46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_FROM_ADDRESS_BAR),
46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false);
46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->OpenURLFromTab(web_contents, params);
46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetActiveTabIndexJSON(
46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int tab_index = browser->tab_strip_model()->active_index();
47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->SetInteger("tab_index", tab_index);
47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(return_value.get());
47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::AppendTabJSON(DictionaryValue* args,
47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              IPC::Message* reply_message) {
47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabAppendedNotificationObserver* observer = NULL;
47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int append_tab_response = -1;
47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg, url;
47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error_msg)) {
47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error_msg);
47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("url", &url)) {
47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'url' missing or invalid");
47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer = new TabAppendedNotificationObserver(browser, this, reply_message,
47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 true);
47242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* contents =
47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::AddSelectedTabWithURL(browser, GURL(url),
47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    content::PAGE_TRANSITION_TYPED);
47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (contents) {
47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    append_tab_response = GetIndexForNavigationController(
47292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &contents->GetController(), browser);
47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!contents || append_tab_response < 0) {
47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (observer) {
47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      observer->ReleaseReply();
47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete observer;
47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError("Failed to append tab.");
47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WaitUntilNavigationCompletes(
47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserAndTabFromJSONArgs(args, &browser, &web_contents, &error)) {
47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationNotificationObserver* observer =
47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new NavigationNotificationObserver(&web_contents->GetController(), this,
47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         reply_message, 1, true, true);
47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents->IsLoading()) {
47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer->ConditionMet(AUTOMATION_MSG_NAVIGATION_SUCCESS);
47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ExecuteJavascriptJSON(
47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 frame_xpath, javascript;
47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* render_view;
47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewFromJSONArgs(args, profile(), &render_view, &error)) {
47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Error(automation::kInvalidId, error));
47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("frame_xpath", &frame_xpath)) {
47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'frame_xpath' missing or invalid");
47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("javascript", &javascript)) {
47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'javascript' missing or invalid");
47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new DomOperationMessageSender(this, reply_message, true);
47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExecuteJavascriptInRenderViewFrame(frame_xpath, javascript, reply_message,
47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     render_view);
47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ExecuteJavascriptInRenderView(
47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 frame_xpath, javascript, extension_id, url_text;
47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_process_id, render_view_id;
47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("frame_xpath", &frame_xpath)) {
47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'frame_xpath' missing or invalid");
48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("javascript", &javascript)) {
48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'javascript' missing or invalid");
48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("view.render_process_id", &render_process_id)) {
48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'view.render_process_id' missing or invalid");
48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("view.render_view_id", &render_view_id)) {
48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError("'view.render_view_id' missing or invalid");
48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* rvh = RenderViewHost::FromID(render_process_id,
48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               render_view_id);
48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rvh) {
48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "A RenderViewHost object was not found with the given view ID.");
48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new DomOperationMessageSender(this, reply_message, true);
48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExecuteJavascriptInRenderViewFrame(frame_xpath, javascript, reply_message,
48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     rvh);
48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::AddDomEventObserver(
48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string event_name;
48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int automation_id;
48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool recurring;
48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("event_name", &event_name)) {
48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'event_name' missing or invalid");
48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("automation_id", &automation_id)) {
48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'automation_id' missing or invalid");
48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("recurring", &recurring)) {
48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'recurring' missing or invalid");
48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!automation_event_queue_.get())
48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    automation_event_queue_.reset(new AutomationEventQueue);
48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int observer_id = automation_event_queue_->AddObserver(
48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DomEventObserver(automation_event_queue_.get(), event_name,
48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           automation_id, recurring));
48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return_value->SetInteger("observer_id", observer_id);
48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(return_value.get());
48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::RemoveEventObserver(
48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int observer_id;
48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("observer_id", &observer_id) ||
48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !automation_event_queue_.get()) {
48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'observer_id' missing or invalid");
48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (automation_event_queue_->RemoveObserver(observer_id)) {
48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendSuccess(NULL);
48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendError("Invalid observer id.");
48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ClearEventQueue(
48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  automation_event_queue_.reset();
48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(NULL);
48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetNextEvent(
48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AutomationJSONReply> reply(
48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new AutomationJSONReply(this, reply_message));
48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int observer_id;
48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool blocking;
48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("observer_id", &observer_id)) {
48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply->SendError("'observer_id' missing or invalid");
48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean("blocking", &blocking)) {
49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply->SendError("'blocking' missing or invalid");
49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!automation_event_queue_.get()) {
49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply->SendError(
49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "No observers are attached to the queue. Did you create any?");
49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The reply will be freed once a matching event is added to the queue.
49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  automation_event_queue_->GetNextEvent(reply.release(), observer_id, blocking);
49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GoForward(
49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetTabFromJSONArgs(args, &web_contents, &error)) {
49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationController& controller = web_contents->GetController();
49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!controller.CanGoForward()) {
49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.SetBoolean("did_go_forward", false);
49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(&dict);
49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new NavigationNotificationObserver(&controller, this, reply_message,
49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     1, false, true);
49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller.GoForward();
49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ExecuteBrowserCommandAsyncJSON(
49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int command;
49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error);
49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("accelerator", &command)) {
49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'accelerator' missing or invalid.");
49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!chrome::SupportsCommand(browser, command)) {
49552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reply.SendError(base::StringPrintf("Browser does not support command=%d.",
49562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       command));
49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!chrome::IsCommandEnabled(browser, command)) {
49602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reply.SendError(base::StringPrintf(
49612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Browser command=%d not enabled.", command));
49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ExecuteCommand(browser, command);
49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ExecuteBrowserCommandJSON(
49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int command;
49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("accelerator", &command)) {
49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "'accelerator' missing or invalid.");
49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!chrome::SupportsCommand(browser, command)) {
49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
49852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::StringPrintf("Browser does not support command=%d.", command));
49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!chrome::IsCommandEnabled(browser, command)) {
49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
49902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::StringPrintf("Browser command=%d not enabled.", command));
49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First check if we can handle the command without using an observer.
49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kSynchronousCommands); i++) {
49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (command == kSynchronousCommands[i]) {
49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::ExecuteCommand(browser, command);
49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutomationJSONReply(this, reply_message).SendSuccess(NULL);
49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use an observer if we have one, otherwise fail.
50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ExecuteBrowserCommandObserver::CreateAndRegisterObserver(
50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, browser, command, reply_message, true)) {
50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ExecuteCommand(browser, command);
50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutomationJSONReply(this, reply_message).SendError(base::StringPrintf(
50082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Unable to register observer for browser command=%d.", command));
50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsMenuCommandEnabledJSON(
50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int command;
50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("accelerator", &command)) {
50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(
50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "'accelerator' missing or invalid.");
50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("enabled", chrome::IsCommandEnabled(browser, command));
50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetTabInfo(
50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* tab;
50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetBrowserAndTabFromJSONArgs(args, &browser, &tab, &error)) {
50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationEntry* entry = tab->GetController().GetActiveEntry();
50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!entry) {
50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply.SendError("Unable to get active navigation entry");
50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
5045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dict.SetString("title", entry->GetTitleForDisplay(std::string()));
50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.SetString("url", entry->GetVirtualURL().spec());
50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendSuccess(&dict);
50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error);
50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetTabCountJSON(
50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error);
50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
50642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger("tab_count", browser->tab_strip_model()->count());
50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GoBack(
50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetTabFromJSONArgs(args, &web_contents, &error)) {
50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationController& controller = web_contents->GetController();
50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!controller.CanGoBack()) {
50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.SetBoolean("did_go_back", false);
50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendSuccess(&dict);
50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new NavigationNotificationObserver(&controller, this, reply_message,
50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     1, false, true);
50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller.GoBack();
50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ReloadJSON(
50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetTabFromJSONArgs(args, &web_contents, &error)) {
51015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationController& controller = web_contents->GetController();
51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new NavigationNotificationObserver(&controller, this, reply_message,
51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     1, false, true);
51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller.Reload(false);
51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetCookiesJSON(
51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  automation_util::GetCookiesJSON(this, args, reply_message);
51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::DeleteCookieJSON(
51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  automation_util::DeleteCookieJSON(this, args, reply_message);
51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetCookieJSON(
51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  automation_util::SetCookieJSON(this, args, reply_message);
51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetCookiesInBrowserContext(
51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value, url_string;
51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int windex, value_size;
51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("windex", &windex)) {
51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'windex' missing or invalid.");
51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents = automation_util::GetWebContentsAt(windex, 0);
51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents) {
51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'windex' does not refer to a browser window.");
51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("url", &url_string)) {
51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'url' missing or invalid.");
51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(url_string);
51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url.is_valid()) {
51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Invalid url.");
51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  automation_util::GetCookies(url, web_contents, &value_size, &value);
51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value_size == -1) {
51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(
51532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::StringPrintf("Unable to retrieve cookies for url=%s.",
51542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           url_string.c_str()));
51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetString("cookies", value);
51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::DeleteCookieInBrowserContext(
51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
51673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string cookie_name, url_string;
51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int windex;
51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("windex", &windex)) {
51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'windex' missing or invalid.");
51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents = automation_util::GetWebContentsAt(windex, 0);
51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents) {
51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'windex' does not refer to a browser window.");
51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("cookie_name", &cookie_name)) {
51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'cookie_name' missing or invalid.");
51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("url", &url_string)) {
51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'url' missing or invalid.");
51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(url_string);
51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url.is_valid()) {
51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Invalid url.");
51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  automation_util::DeleteCookie(url, cookie_name, web_contents, &success);
51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!success) {
51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(
51952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::StringPrintf("Failed to delete cookie with name=%s for url=%s.",
51962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           cookie_name.c_str(), url_string.c_str()));
51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetCookieInBrowserContext(
52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
52073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string value, url_string;
52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int windex, response_value = -1;
52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("windex", &windex)) {
52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'windex' missing or invalid.");
52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents = automation_util::GetWebContentsAt(windex, 0);
52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents) {
52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'windex' does not refer to a browser window.");
52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("value", &value)) {
52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'value' missing or invalid.");
52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("url", &url_string)) {
52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'url' missing or invalid.");
52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(url_string);
52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url.is_valid()) {
52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Invalid url.");
52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  automation_util::SetCookie(url, value, web_contents, &response_value);
52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (response_value != 1) {
52332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reply.SendError(base::StringPrintf(
52342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Unable set cookie for url=%s.", url_string.c_str()));
52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetTabIds(
52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* id_list = new ListValue();
52432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next()) {
52442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser* browser = *it;
52452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < browser->tab_strip_model()->count(); ++i) {
52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int id = SessionTabHelper::FromWebContents(
52472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser->tab_strip_model()->GetWebContentsAt(i))->session_id().id();
52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id_list->Append(Value::CreateIntegerValue(id));
52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.Set("ids", id_list);
52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetViews(
52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* view_list = new ListValue();
5259a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING)
52602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrintPreviewDialogController* preview_controller =
52612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintPreviewDialogController::GetInstance();
5262a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#endif
52632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next()) {
52642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser* browser = *it;
52652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < browser->tab_strip_model()->count(); ++i) {
52662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents* contents = browser->tab_strip_model()->GetWebContentsAt(i);
52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DictionaryValue* dict = new DictionaryValue();
52682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AutomationId id = automation_util::GetIdForTab(contents);
52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->Set("auto_id", id.ToValue());
52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      view_list->Append(dict);
5271a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING)
52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (preview_controller) {
52732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WebContents* preview_dialog =
52742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            preview_controller->GetPrintPreviewForContents(contents);
52752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (preview_dialog) {
52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DictionaryValue* dict = new DictionaryValue();
52772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          AutomationId id = automation_util::GetIdForTab(preview_dialog);
52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          dict->Set("auto_id", id.ToValue());
52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          view_list->Append(dict);
52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5282a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#endif
52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionProcessManager* extension_mgr =
52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::ExtensionSystem::Get(profile())->process_manager();
52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ExtensionProcessManager::ViewSet all_views =
52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_mgr->GetAllViews();
52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionProcessManager::ViewSet::const_iterator iter;
52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iter = all_views.begin(); iter != all_views.end(); ++iter) {
52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RenderViewHost* host = (*iter);
52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationId id = automation_util::GetIdForExtensionView(host);
52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!id.is_valid())
52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension =
52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_mgr->GetExtensionForRenderViewHost(host);
52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* dict = new DictionaryValue();
52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set("auto_id", id.ToValue());
53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("extension_id", extension->id());
53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_list->Append(dict);
53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.Set("views", view_list);
53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&dict);
53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsTabIdValid(
53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id;
53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("id", &id)) {
53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'id' missing or invalid");
53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_valid = false;
53172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next()) {
53182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser* browser = *it;
53192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < browser->tab_strip_model()->count(); ++i) {
53202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents* tab = browser->tab_strip_model()->GetWebContentsAt(i);
53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SessionTabHelper* session_tab_helper =
53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SessionTabHelper::FromWebContents(tab);
53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (session_tab_helper->session_id().id() == id) {
53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_valid = true;
53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("is_valid", is_valid);
53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::DoesAutomationObjectExist(
53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationId id;
53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_msg;
53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetAutomationIdFromJSONArgs(args, "auto_id", &id, &error_msg)) {
53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error_msg);
53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean(
53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "does_exist",
53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      automation_util::DoesObjectWithIdExist(id, profile()));
53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::CloseTabJSON(
53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args, IPC::Message* reply_message) {
53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* tab;
53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool wait_until_closed = false;  // ChromeDriver does not use this.
53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args->GetBoolean("wait_until_closed", &wait_until_closed);
53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close tabs synchronously.
53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetBrowserAndTabFromJSONArgs(args, &browser, &tab, &error)) {
53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wait_until_closed) {
53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TabClosedNotificationObserver(this, wait_until_closed, reply_message,
53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        true);
53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
53632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::CloseWebContents(browser, tab, false);
53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!wait_until_closed)
53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutomationJSONReply(this, reply_message).SendSuccess(NULL);
53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close other types of views asynchronously.
53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* view;
53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewFromJSONArgs(args, profile(), &view, &error)) {
53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message).SendError(error);
53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->ClosePage();
53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(NULL);
53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::SetViewBounds(
53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int x, y, width, height;
53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger("bounds.x", &x) ||
53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("bounds.y", &y) ||
53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("bounds.width", &width) ||
53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetInteger("bounds.height", &height)) {
53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Missing or invalid 'bounds'");
53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(Error(automation::kInvalidId, error));
53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserWindow* browser_window = browser->window();
53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_window->IsMaximized()) {
53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_window->Restore();
53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_window->SetBounds(gfx::Rect(x, y, width, height));
54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::MaximizeView(
54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationJSONReply(this, reply_message)
54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .SendError(Error(automation::kInvalidId, error));
54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maximization on Linux is asynchronous, so create an observer object to be
54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notified upon maximization completion.
54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new WindowMaximizedObserver(this, reply_message);
54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_LINUX)
54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->window()->Maximize();
54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_LINUX)
54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send success reply right away for OS's with synchronous maximize command.
54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(NULL);
54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_LINUX)
54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::ActivateTabJSON(
54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendErrorIfModalDialogActive(this, reply_message))
54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser;
54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents;
54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetBrowserAndTabFromJSONArgs(args, &browser, &web_contents, &error)) {
54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error);
54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabStripModel* tab_strip = browser->tab_strip_model();
54442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tab_strip->ActivateTabAt(tab_strip->GetIndexOfWebContents(web_contents),
54452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           true);
54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::IsPageActionVisible(
54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* args,
54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* tab;
54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetTabFromJSONArgs(args, &tab, &error)) {
54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error);
54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = automation_util::GetBrowserForTab(tab);
54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension;
54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetEnabledExtensionFromJSONArgs(
54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          args, "extension_id", browser->profile(), &extension, &error)) {
54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError(error);
54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!browser) {
54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Tab does not belong to an open browser");
54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionAction* page_action =
54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionActionManager::Get(browser->profile())->
54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetPageAction(*extension);
54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!page_action) {
54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Extension doesn't have any page action");
54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnsureTabSelected(browser, tab);
54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_visible = false;
54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocationBarTesting* loc_bar =
54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->window()->GetLocationBar()->GetLocationBarForTesting();
54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t page_action_visible_count =
54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<size_t>(loc_bar->PageActionVisibleCount());
54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < page_action_visible_count; ++i) {
54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (loc_bar->GetVisiblePageAction(i) == page_action) {
54875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_visible = true;
54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("is_visible", is_visible);
54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(&dict);
54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::GetChromeDriverAutomationVersion(
54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue reply_dict;
55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply_dict.SetInteger("version", automation::kChromeDriverAutomationVersion);
55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply(this, reply_message).SendSuccess(&reply_dict);
55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::CreateNewAutomationProvider(
55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* args,
55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationJSONReply reply(this, reply_message);
55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string channel_id;
55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString("channel_id", &channel_id)) {
55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("'channel_id' missing or invalid");
55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationProvider* provider = new TestingAutomationProvider(profile_);
55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider->DisableInitialLoadObservers();
55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kkania): Remove this when crbug.com/91311 is fixed.
55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Named server channels should ideally be created and closed on the file
55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread, within the IPC channel code.
55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadRestrictions::ScopedAllowIO allow_io;
55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!provider->InitializeChannel(
55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          automation::kNamedInterfacePrefix + channel_id)) {
55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply.SendError("Failed to initialize channel: " + channel_id);
55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(g_browser_process);
55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_browser_process->GetAutomationProviderList()->AddProvider(provider);
55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reply.SendSuccess(NULL);
55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WaitForTabCountToBecome(
55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int browser_handle,
55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_tab_count,
55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!browser_tracker_->ContainsHandle(browser_handle)) {
55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationMsg_WaitForTabCountToBecome::WriteReplyParams(reply_message,
55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                            false);
55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(reply_message);
55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = browser_tracker_->GetResource(browser_handle);
55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The observer will delete itself.
55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new TabCountChangeObserver(this, browser, reply_message, target_tab_count);
55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WaitForInfoBarCount(
55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int tab_handle,
55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t target_count,
55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!tab_tracker_->ContainsHandle(tab_handle)) {
55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationMsg_WaitForInfoBarCount::WriteReplyParams(reply_message_, false);
55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(reply_message_);
55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationController* controller = tab_tracker_->GetResource(tab_handle);
55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!controller) {
55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutomationMsg_WaitForInfoBarCount::WriteReplyParams(reply_message_, false);
55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(reply_message_);
55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The delegate will delete itself.
55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new InfoBarCountObserver(this, reply_message,
55662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           controller->GetWebContents(), target_count);
55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::WaitForProcessLauncherThreadToGoIdle(
55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_message) {
55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new WaitForProcessLauncherThreadToGoIdleObserver(this, reply_message);
55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::OnRemoveProvider() {
55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (g_browser_process)
55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_browser_process->GetAutomationProviderList()->RemoveProvider(this);
55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingAutomationProvider::EnsureTabSelected(Browser* browser,
55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  WebContents* tab) {
55812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabStripModel* tab_strip = browser->tab_strip_model();
55822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (tab_strip->GetActiveWebContents() != tab)
55832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tab_strip->ActivateTabAt(tab_strip->GetIndexOfWebContents(tab), true);
55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585