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