| Index: chrome/test/webdriver/webdriver_automation.cc
|
| diff --git a/chrome/test/webdriver/webdriver_automation.cc b/chrome/test/webdriver/webdriver_automation.cc
|
| deleted file mode 100644
|
| index 58d212b25dc9dd0f4680136818ff0e0603f6d0ab..0000000000000000000000000000000000000000
|
| --- a/chrome/test/webdriver/webdriver_automation.cc
|
| +++ /dev/null
|
| @@ -1,1215 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/test/webdriver/webdriver_automation.h"
|
| -
|
| -#if defined(OS_WIN)
|
| -#include <windows.h>
|
| -#endif
|
| -
|
| -#include "base/base_paths.h"
|
| -#include "base/basictypes.h"
|
| -#include "base/callback.h"
|
| -#include "base/environment.h"
|
| -#include "base/file_util.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/json/json_writer.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/path_service.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/string_split.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| -#include "base/values.h"
|
| -#include "chrome/common/automation_constants.h"
|
| -#include "chrome/common/automation_messages.h"
|
| -#include "chrome/common/chrome_constants.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| -#include "chrome/common/url_constants.h"
|
| -#include "chrome/test/automation/automation_json_requests.h"
|
| -#include "chrome/test/automation/automation_proxy.h"
|
| -#include "chrome/test/automation/browser_proxy.h"
|
| -#include "chrome/test/automation/proxy_launcher.h"
|
| -#include "chrome/test/automation/tab_proxy.h"
|
| -#include "chrome/test/base/chrome_process_util.h"
|
| -#include "chrome/test/webdriver/frame_path.h"
|
| -#include "chrome/test/webdriver/webdriver_basic_types.h"
|
| -#include "chrome/test/webdriver/webdriver_error.h"
|
| -#include "chrome/test/webdriver/webdriver_util.h"
|
| -
|
| -#if defined(OS_WIN)
|
| -#include "base/win/registry.h"
|
| -#include "base/win/windows_version.h"
|
| -#endif
|
| -
|
| -namespace {
|
| -
|
| -// Iterates through each browser executable path, and checks if the path exists
|
| -// in any of the given locations. If found, returns true and sets |browser_exe|.
|
| -bool CheckForChromeExe(const std::vector<base::FilePath>& browser_exes,
|
| - const std::vector<base::FilePath>& locations,
|
| - base::FilePath* browser_exe) {
|
| - for (size_t i = 0; i < browser_exes.size(); ++i) {
|
| - for (size_t j = 0; j < locations.size(); ++j) {
|
| - base::FilePath path = locations[j].Append(browser_exes[i]);
|
| - if (base::PathExists(path)) {
|
| - *browser_exe = path;
|
| - return true;
|
| - }
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// Gets the path to the default Chrome executable. Returns true on success.
|
| -bool GetDefaultChromeExe(base::FilePath* browser_exe) {
|
| - // Instead of using chrome constants, we hardcode these constants here so
|
| - // that we can locate chrome or chromium regardless of the branding
|
| - // chromedriver is built with. It may be argued that then we need to keep
|
| - // these in sync with chrome constants. However, if chrome constants changes,
|
| - // we need to look for the previous and new versions to support some
|
| - // backwards compatibility.
|
| -#if defined(OS_WIN)
|
| - base::FilePath browser_exes_array[] = {
|
| - base::FilePath(L"chrome.exe")
|
| - };
|
| -#elif defined(OS_MACOSX)
|
| - base::FilePath browser_exes_array[] = {
|
| - base::FilePath("Google Chrome.app/Contents/MacOS/Google Chrome"),
|
| - base::FilePath("Chromium.app/Contents/MacOS/Chromium")
|
| - };
|
| -#elif defined(OS_LINUX)
|
| - base::FilePath browser_exes_array[] = {
|
| - base::FilePath("google-chrome"),
|
| - base::FilePath("chrome"),
|
| - base::FilePath("chromium"),
|
| - base::FilePath("chromium-browser")
|
| - };
|
| -#endif
|
| - std::vector<base::FilePath> browser_exes(
|
| - browser_exes_array, browser_exes_array + arraysize(browser_exes_array));
|
| -
|
| - // Step 1: Check the directory this module resides in. This is done
|
| - // before all else so that the tests will pickup the built chrome.
|
| - base::FilePath module_dir;
|
| - if (PathService::Get(base::DIR_MODULE, &module_dir)) {
|
| - for (size_t j = 0; j < browser_exes.size(); ++j) {
|
| - base::FilePath path = module_dir.Append(browser_exes[j]);
|
| - if (base::PathExists(path)) {
|
| - *browser_exe = path;
|
| - return true;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Step 2: Add all possible install locations, in order they should be
|
| - // searched. If a location can only hold a chromium install, add it to
|
| - // |chromium_locations|. Since on some platforms we cannot tell by the binary
|
| - // name whether it is chrome or chromium, we search these locations last.
|
| - // We attempt to run chrome before chromium, if any install can be found.
|
| - std::vector<base::FilePath> locations;
|
| - std::vector<base::FilePath> chromium_locations;
|
| -#if defined(OS_WIN)
|
| - // Add the App Paths registry key location.
|
| - const wchar_t kSubKey[] =
|
| - L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe";
|
| - base::win::RegKey key(HKEY_CURRENT_USER, kSubKey, KEY_READ);
|
| - std::wstring path;
|
| - if (key.ReadValue(L"path", &path) == ERROR_SUCCESS)
|
| - locations.push_back(base::FilePath(path));
|
| - base::win::RegKey sys_key(HKEY_LOCAL_MACHINE, kSubKey, KEY_READ);
|
| - if (sys_key.ReadValue(L"path", &path) == ERROR_SUCCESS)
|
| - locations.push_back(base::FilePath(path));
|
| -
|
| - // Add the user-level location for Chrome.
|
| - base::FilePath app_from_google(L"Google\\Chrome\\Application");
|
| - base::FilePath app_from_chromium(L"Chromium\\Application");
|
| - scoped_ptr<base::Environment> env(base::Environment::Create());
|
| - std::string home_dir;
|
| - if (env->GetVar("userprofile", &home_dir)) {
|
| - base::FilePath default_location(UTF8ToWide(home_dir));
|
| - if (base::win::GetVersion() < base::win::VERSION_VISTA) {
|
| - default_location = default_location.Append(
|
| - L"Local Settings\\Application Data");
|
| - } else {
|
| - default_location = default_location.Append(L"AppData\\Local");
|
| - }
|
| - locations.push_back(default_location.Append(app_from_google));
|
| - chromium_locations.push_back(default_location.Append(app_from_chromium));
|
| - }
|
| -
|
| - // Add the system-level location for Chrome.
|
| - std::string program_dir;
|
| - if (env->GetVar("ProgramFiles", &program_dir)) {
|
| - locations.push_back(base::FilePath(UTF8ToWide(program_dir))
|
| - .Append(app_from_google));
|
| - chromium_locations.push_back(base::FilePath(UTF8ToWide(program_dir))
|
| - .Append(app_from_chromium));
|
| - }
|
| - if (env->GetVar("ProgramFiles(x86)", &program_dir)) {
|
| - locations.push_back(base::FilePath(UTF8ToWide(program_dir))
|
| - .Append(app_from_google));
|
| - chromium_locations.push_back(base::FilePath(UTF8ToWide(program_dir))
|
| - .Append(app_from_chromium));
|
| - }
|
| -#elif defined(OS_MACOSX)
|
| - std::vector<base::FilePath> app_dirs;
|
| - webdriver::GetApplicationDirs(&app_dirs);
|
| - locations.insert(locations.end(), app_dirs.begin(), app_dirs.end());
|
| -#elif defined(OS_LINUX)
|
| - locations.push_back(base::FilePath("/opt/google/chrome"));
|
| - locations.push_back(base::FilePath("/usr/local/bin"));
|
| - locations.push_back(base::FilePath("/usr/local/sbin"));
|
| - locations.push_back(base::FilePath("/usr/bin"));
|
| - locations.push_back(base::FilePath("/usr/sbin"));
|
| - locations.push_back(base::FilePath("/bin"));
|
| - locations.push_back(base::FilePath("/sbin"));
|
| -#endif
|
| -
|
| - // Add the current directory.
|
| - base::FilePath current_dir;
|
| - if (file_util::GetCurrentDirectory(¤t_dir))
|
| - locations.push_back(current_dir);
|
| -
|
| - // Step 3: For each browser exe path, check each location to see if the
|
| - // browser is installed there. Check the chromium locations lastly.
|
| - return CheckForChromeExe(browser_exes, locations, browser_exe) ||
|
| - CheckForChromeExe(browser_exes, chromium_locations, browser_exe);
|
| -}
|
| -
|
| -// Message that duplicates a given message but uses a different type.
|
| -class MessageWithAlternateType : public IPC::Message {
|
| - public:
|
| - MessageWithAlternateType(const IPC::Message& msg, int type)
|
| - : IPC::Message(msg) {
|
| - header()->type = type;
|
| - }
|
| - virtual ~MessageWithAlternateType() {}
|
| -};
|
| -
|
| -// Filters incoming and outgoing messages on the IO thread. Translates messages
|
| -// from old Chrome versions to the new version. This is needed so that new
|
| -// ChromeDriver releases support the current stable and beta channels of Chrome.
|
| -// TODO(kkania): Delete this when Chrome v21 is stable.
|
| -class BackwardsCompatAutomationMessageFilter
|
| - : public IPC::ChannelProxy::MessageFilter,
|
| - public IPC::ChannelProxy::OutgoingMessageFilter {
|
| - public:
|
| - explicit BackwardsCompatAutomationMessageFilter(AutomationProxy* server);
|
| -
|
| - // Overriden from IPC::ChannelProxy::MessageFiler.
|
| - virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
|
| -
|
| - // Overriden from IPC::ChannelProxy::OutgoingMessageFiler.
|
| - virtual IPC::Message* Rewrite(IPC::Message* message) OVERRIDE;
|
| -
|
| - private:
|
| - virtual ~BackwardsCompatAutomationMessageFilter();
|
| -
|
| - // The first version of Chrome using the new IPC automation message set,
|
| - // after r137672 changed most of the message IDs.
|
| - static const int kNewAutomationVersion = 1142;
|
| -
|
| - // The first version of Chrome using the new JSON interface which takes a
|
| - // browser index instead of a browser handle.
|
| - static const int kNewJSONInterfaceVersion = 1195;
|
| -
|
| - AutomationProxy* server_;
|
| - bool old_version_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(BackwardsCompatAutomationMessageFilter);
|
| -};
|
| -
|
| -BackwardsCompatAutomationMessageFilter::BackwardsCompatAutomationMessageFilter(
|
| - AutomationProxy* server)
|
| - : server_(server), old_version_(false) {
|
| -}
|
| -
|
| -bool BackwardsCompatAutomationMessageFilter::OnMessageReceived(
|
| - const IPC::Message& message) {
|
| - const uint32 kOldHelloType = 44,
|
| - kOldInitialLoadsCompleteType = 47,
|
| - kOldInitialNewTabUILoadCompleteType = 267;
|
| - if (message.type() == kOldHelloType) {
|
| - old_version_ = true;
|
| - std::string server_version;
|
| - PickleIterator iter(message);
|
| - CHECK(message.ReadString(&iter, &server_version));
|
| - server_->SignalAppLaunch(server_version);
|
| - return true;
|
| - }
|
| - if (!old_version_)
|
| - return false;
|
| -
|
| - switch (message.type()) {
|
| - case kOldInitialLoadsCompleteType:
|
| - server_->SignalInitialLoads();
|
| - break;
|
| - case kOldInitialNewTabUILoadCompleteType:
|
| - server_->SignalNewTabUITab(-1);
|
| - break;
|
| - default:
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -IPC::Message* BackwardsCompatAutomationMessageFilter::Rewrite(
|
| - IPC::Message* message) {
|
| - int build_no = -1;
|
| - std::string version = server_->server_version();
|
| - std::vector<std::string> version_parts;
|
| - base::SplitString(version, '.', &version_parts);
|
| - CHECK(version_parts.size() == 4 &&
|
| - base::StringToInt(version_parts[2], &build_no))
|
| - << "Can't rewrite message (type: " << message->type()
|
| - << ") because unknown server (version: " << version << ")";
|
| - CHECK_EQ(static_cast<uint32>(AutomationMsg_SendJSONRequest::ID),
|
| - message->type());
|
| - int type = AutomationMsg_SendJSONRequest::ID;
|
| - // These old message types are determined by inspecting the line number
|
| - // of the SendJSONRequest message in older versions of
|
| - // automation_messages_internal.h.
|
| - if (build_no < kNewAutomationVersion)
|
| - type = 1301;
|
| - else if (build_no < kNewJSONInterfaceVersion)
|
| - type = 863;
|
| - IPC::Message* new_message = new MessageWithAlternateType(*message, type);
|
| - delete message;
|
| - return new_message;
|
| -}
|
| -
|
| -BackwardsCompatAutomationMessageFilter::
|
| - ~BackwardsCompatAutomationMessageFilter() {
|
| -}
|
| -
|
| -void AddBackwardsCompatFilter(AutomationProxy* proxy) {
|
| - // The filter is ref-counted in AddFilter.
|
| - BackwardsCompatAutomationMessageFilter* filter =
|
| - new BackwardsCompatAutomationMessageFilter(proxy);
|
| - proxy->channel()->AddFilter(filter);
|
| - proxy->channel()->set_outgoing_message_filter(filter);
|
| -}
|
| -
|
| -class WebDriverAnonymousProxyLauncher : public AnonymousProxyLauncher {
|
| - public:
|
| - WebDriverAnonymousProxyLauncher()
|
| - : AnonymousProxyLauncher(false) {}
|
| - virtual ~WebDriverAnonymousProxyLauncher() {}
|
| -
|
| - virtual AutomationProxy* CreateAutomationProxy(
|
| - base::TimeDelta execution_timeout) OVERRIDE {
|
| - AutomationProxy* proxy =
|
| - AnonymousProxyLauncher::CreateAutomationProxy(execution_timeout);
|
| - AddBackwardsCompatFilter(proxy);
|
| - return proxy;
|
| - }
|
| -};
|
| -
|
| -class WebDriverNamedProxyLauncher : public NamedProxyLauncher {
|
| - public:
|
| - WebDriverNamedProxyLauncher(const std::string& channel_id,
|
| - bool launch_browser)
|
| - : NamedProxyLauncher(channel_id, launch_browser, false) {}
|
| - virtual ~WebDriverNamedProxyLauncher() {}
|
| -
|
| - virtual AutomationProxy* CreateAutomationProxy(
|
| - base::TimeDelta execution_timeout) OVERRIDE {
|
| - AutomationProxy* proxy =
|
| - NamedProxyLauncher::CreateAutomationProxy(execution_timeout);
|
| - // We can only add the filter here if the browser has not already been
|
| - // started. Otherwise the filter is not guaranteed to receive the
|
| - // first message. The only occasion where we don't launch the browser is
|
| - // in PyAuto, in which case the backwards compat filter isn't needed
|
| - // anyways because ChromeDriver and Chrome are at the same version there.
|
| - if (launch_browser_)
|
| - AddBackwardsCompatFilter(proxy);
|
| - return proxy;
|
| - }
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -namespace webdriver {
|
| -
|
| -Automation::BrowserOptions::BrowserOptions()
|
| - : command(CommandLine::NO_PROGRAM),
|
| - detach_process(false),
|
| - ignore_certificate_errors(false) {}
|
| -
|
| -Automation::BrowserOptions::~BrowserOptions() {}
|
| -
|
| -Automation::Automation(const Logger& logger)
|
| - : logger_(logger),
|
| - build_no_(0) {}
|
| -
|
| -Automation::~Automation() {}
|
| -
|
| -void Automation::Init(
|
| - const BrowserOptions& options,
|
| - int* build_no,
|
| - Error** error) {
|
| - // Prepare Chrome's command line.
|
| - CommandLine command(CommandLine::NO_PROGRAM);
|
| - if (CommandLine::ForCurrentProcess()->HasSwitch("no-sandbox")) {
|
| - command.AppendSwitch(switches::kNoSandbox);
|
| - }
|
| -
|
| - const char* excludable_switches[] = {
|
| - switches::kDisableHangMonitor,
|
| - switches::kDisablePromptOnRepost,
|
| - switches::kDomAutomationController,
|
| - switches::kFullMemoryCrashReport,
|
| - switches::kNoDefaultBrowserCheck,
|
| - switches::kNoFirstRun,
|
| - switches::kDisableBackgroundNetworking,
|
| - switches::kDisableSync,
|
| - switches::kDisableTranslate,
|
| - switches::kDisableWebResources,
|
| - switches::kSbDisableAutoUpdate,
|
| - switches::kSbDisableDownloadProtection,
|
| - switches::kDisableClientSidePhishingDetection,
|
| - switches::kDisableComponentUpdate,
|
| - switches::kDisableDefaultApps
|
| - };
|
| - std::vector<std::string> switches(excludable_switches,
|
| - excludable_switches + arraysize(excludable_switches));
|
| - for (size_t i = 0; i < switches.size(); ++i) {
|
| - const std::string& switch_name = switches[i];
|
| - if (options.exclude_switches.find(switch_name) ==
|
| - options.exclude_switches.end()) {
|
| - command.AppendSwitch(switch_name);
|
| - }
|
| - }
|
| -
|
| - command.AppendSwitch(switches::kEnableLogging);
|
| - command.AppendSwitchASCII(switches::kLoggingLevel, "1");
|
| -
|
| -#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
|
| - command.AppendSwitchASCII(switches::kPasswordStore, "basic");
|
| -#endif
|
| -#if defined(OS_MACOSX)
|
| - command.AppendSwitch(switches::kUseMockKeychain);
|
| -#endif
|
| - if (options.detach_process)
|
| - command.AppendSwitch(switches::kAutomationReinitializeOnChannelError);
|
| - if (options.ignore_certificate_errors)
|
| - command.AppendSwitch(switches::kIgnoreCertificateErrors);
|
| - if (options.user_data_dir.empty())
|
| - command.AppendArg(content::kAboutBlankURL);
|
| -
|
| - command.AppendArguments(options.command, true /* include_program */);
|
| -
|
| - // Find the Chrome binary.
|
| - if (command.GetProgram().empty()) {
|
| - base::FilePath browser_exe;
|
| - if (!GetDefaultChromeExe(&browser_exe)) {
|
| - *error = new Error(kUnknownError, "Could not find default Chrome binary");
|
| - return;
|
| - }
|
| - command.SetProgram(browser_exe);
|
| - }
|
| - if (!base::PathExists(command.GetProgram())) {
|
| - std::string message = base::StringPrintf(
|
| - "Could not find Chrome binary at: %" PRFilePath,
|
| - command.GetProgram().value().c_str());
|
| - *error = new Error(kUnknownError, message);
|
| - return;
|
| - }
|
| - std::string chrome_details = base::StringPrintf(
|
| - "Using Chrome binary at: %" PRFilePath,
|
| - command.GetProgram().value().c_str());
|
| -
|
| - // Create the ProxyLauncher and launch Chrome.
|
| - // In Chrome 13/14, the only way to detach the browser process is to use a
|
| - // named proxy launcher.
|
| - // TODO(kkania): Remove this when Chrome 15 is stable.
|
| - std::string channel_id = options.channel_id;
|
| - bool launch_browser = false;
|
| - if (options.detach_process) {
|
| - launch_browser = true;
|
| - if (!channel_id.empty()) {
|
| - *error = new Error(
|
| - kUnknownError, "Cannot detach an already running browser process");
|
| - return;
|
| - }
|
| -#if defined(OS_WIN)
|
| - channel_id = "chromedriver" + GenerateRandomID();
|
| -#elif defined(OS_POSIX)
|
| - base::FilePath temp_file;
|
| - if (!file_util::CreateTemporaryFile(&temp_file) ||
|
| - !base::DeleteFile(temp_file, false /* recursive */)) {
|
| - *error = new Error(kUnknownError, "Could not create temporary filename");
|
| - return;
|
| - }
|
| - channel_id = temp_file.value();
|
| -#endif
|
| - }
|
| - if (channel_id.empty()) {
|
| - std::string command_line_str;
|
| -#if defined(OS_WIN)
|
| - command_line_str = WideToUTF8(command.GetCommandLineString());
|
| -#elif defined(OS_POSIX)
|
| - command_line_str = command.GetCommandLineString();
|
| -#endif
|
| - logger_.Log(kInfoLogLevel, "Launching chrome: " + command_line_str);
|
| - launcher_.reset(new WebDriverAnonymousProxyLauncher());
|
| - } else {
|
| - logger_.Log(kInfoLogLevel, "Using named testing interface");
|
| - launcher_.reset(new WebDriverNamedProxyLauncher(
|
| - channel_id, launch_browser));
|
| - }
|
| - ProxyLauncher::LaunchState launch_props = {
|
| - false, // clear_profile
|
| - options.user_data_dir, // template_user_data
|
| - base::Closure(),
|
| - command,
|
| - true, // include_testing_id
|
| - true // show_window
|
| - };
|
| - if (!launcher_->InitializeConnection(launch_props, true)) {
|
| - logger_.Log(kSevereLogLevel, "Failed to initialize connection");
|
| - *error = new Error(
|
| - kUnknownError,
|
| - "Unable to either launch or connect to Chrome. Please check that "
|
| - "ChromeDriver is up-to-date. " + chrome_details);
|
| - return;
|
| - }
|
| -
|
| - launcher_->automation()->set_action_timeout(
|
| - base::TimeDelta::FromMilliseconds(base::kNoTimeout));
|
| - logger_.Log(kInfoLogLevel, "Connected to Chrome successfully. Version: " +
|
| - automation()->server_version());
|
| -
|
| - *error = DetermineBuildNumber();
|
| - if (*error)
|
| - return;
|
| - *build_no = build_no_;
|
| -
|
| - // Check the version of Chrome is compatible with this ChromeDriver.
|
| - chrome_details += ", version (" + automation()->server_version() + ")";
|
| - int version = 0;
|
| - automation::Error auto_error;
|
| - if (!SendGetChromeDriverAutomationVersion(
|
| - automation(), &version, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - return;
|
| - }
|
| - if (version > automation::kChromeDriverAutomationVersion) {
|
| - *error = new Error(
|
| - kUnknownError,
|
| - "ChromeDriver is not compatible with this version of Chrome. " +
|
| - chrome_details);
|
| - return;
|
| - }
|
| -}
|
| -
|
| -void Automation::Terminate() {
|
| - if (launcher_.get() && launcher_->process() != base::kNullProcessHandle) {
|
| -#if defined(OS_MACOSX)
|
| - // There's currently no way to shutdown gracefully with mac chrome.
|
| - // An alert could be open or (open before shutdown is started) and stop
|
| - // the whole process. Close any current dialog, try to kill gently, and
|
| - // if all else fails, kill it hard.
|
| - Error* error = NULL;
|
| - AcceptOrDismissAppModalDialog(true /* accept */, &error);
|
| - scoped_ptr<Error> scoped_error(error);
|
| -
|
| - kill(launcher_->process(), SIGTERM);
|
| -#else
|
| - automation()->Disconnect();
|
| -#endif
|
| - int exit_code = -1;
|
| - if (!launcher_->WaitForBrowserProcessToQuit(
|
| - base::TimeDelta::FromSeconds(10), &exit_code)) {
|
| - logger_.Log(kWarningLogLevel, "Chrome still running, terminating...");
|
| - ChromeProcessList process_pids(GetRunningChromeProcesses(
|
| - launcher_->process_id()));
|
| - TerminateAllChromeProcesses(process_pids);
|
| - }
|
| - base::CloseProcessHandle(launcher_->process());
|
| - logger_.Log(kInfoLogLevel, "Chrome shutdown");
|
| - }
|
| -}
|
| -
|
| -void Automation::ExecuteScript(const WebViewId& view_id,
|
| - const FramePath& frame_path,
|
| - const std::string& script,
|
| - std::string* result,
|
| - Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - scoped_ptr<Value> value;
|
| - if (!SendExecuteJavascriptJSONRequest(automation(), view_locator,
|
| - frame_path.value(), script,
|
| - &value, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - return;
|
| - }
|
| - if (!value->GetAsString(result))
|
| - *error = new Error(kUnknownError, "Execute script did not return string");
|
| -}
|
| -
|
| -void Automation::MouseMoveDeprecated(
|
| - const WebViewId& view_id,
|
| - const Point& p,
|
| - Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendMouseMoveJSONRequestDeprecated(
|
| - automation(), view_locator, p.rounded_x(), p.rounded_y(),
|
| - &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::MouseClickDeprecated(
|
| - const WebViewId& view_id,
|
| - const Point& p,
|
| - automation::MouseButton button,
|
| - Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendMouseClickJSONRequestDeprecated(
|
| - automation(), view_locator, button, p.rounded_x(),
|
| - p.rounded_y(), &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::MouseDragDeprecated(
|
| - const WebViewId& view_id,
|
| - const Point& start,
|
| - const Point& end,
|
| - Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendMouseDragJSONRequestDeprecated(
|
| - automation(), view_locator, start.rounded_x(), start.rounded_y(),
|
| - end.rounded_x(), end.rounded_y(), &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::MouseButtonUpDeprecated(
|
| - const WebViewId& view_id,
|
| - const Point& p,
|
| - Error** error) {
|
| - *error = CheckAdvancedInteractionsSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendMouseButtonUpJSONRequestDeprecated(
|
| - automation(), view_locator, p.rounded_x(), p.rounded_y(),
|
| - &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::MouseButtonDownDeprecated(
|
| - const WebViewId& view_id,
|
| - const Point& p,
|
| - Error** error) {
|
| - *error = CheckAdvancedInteractionsSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendMouseButtonDownJSONRequestDeprecated(
|
| - automation(), view_locator, p.rounded_x(), p.rounded_y(),
|
| - &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::MouseDoubleClickDeprecated(
|
| - const WebViewId& view_id,
|
| - const Point& p,
|
| - Error** error) {
|
| - *error = CheckAdvancedInteractionsSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendMouseDoubleClickJSONRequestDeprecated(
|
| - automation(), view_locator, p.rounded_x(), p.rounded_y(),
|
| - &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::DragAndDropFilePaths(
|
| - const WebViewId& view_id, const Point& location,
|
| - const std::vector<base::FilePath::StringType>& paths, Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error) {
|
| - return;
|
| - }
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendDragAndDropFilePathsJSONRequest(
|
| - automation(), view_locator, location.rounded_x(),
|
| - location.rounded_y(), paths, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::SendWebKeyEvent(const WebViewId& view_id,
|
| - const WebKeyEvent& key_event,
|
| - Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendWebKeyEventJSONRequest(
|
| - automation(), view_locator, key_event, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::SendWebMouseEvent(const WebViewId& view_id,
|
| - const WebMouseEvent& event,
|
| - Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendWebMouseEventJSONRequestDeprecated(
|
| - automation(), view_locator, event, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::CaptureEntirePageAsPNG(const WebViewId& view_id,
|
| - const base::FilePath& path,
|
| - Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendCaptureEntirePageJSONRequestDeprecated(
|
| - automation(), view_locator, path, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -#if !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
|
| -void Automation::HeapProfilerDump(const WebViewId& view_id,
|
| - const std::string& reason,
|
| - Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendHeapProfilerDumpJSONRequestDeprecated(
|
| - automation(), view_locator, reason, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -#endif // !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
|
| -
|
| -void Automation::NavigateToURL(const WebViewId& view_id,
|
| - const std::string& url,
|
| - Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - AutomationMsg_NavigationResponseValues navigate_response;
|
| - automation::Error auto_error;
|
| - if (!SendNavigateToURLJSONRequest(automation(), view_locator,
|
| - url, 1, &navigate_response,
|
| - &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - return;
|
| - }
|
| - // TODO(kkania): Do not rely on this enum.
|
| - if (navigate_response == AUTOMATION_MSG_NAVIGATION_ERROR)
|
| - *error = new Error(kUnknownError, "Navigation error occurred");
|
| -}
|
| -
|
| -void Automation::NavigateToURLAsync(const WebViewId& view_id,
|
| - const std::string& url,
|
| - Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!view_id.old_style()) {
|
| - AutomationMsg_NavigationResponseValues navigate_response;
|
| - if (!SendNavigateToURLJSONRequest(automation(), view_locator, url,
|
| - 0, &navigate_response, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - return;
|
| - }
|
| - } else {
|
| - scoped_refptr<BrowserProxy> browser =
|
| - automation()->GetBrowserWindow(view_locator.browser_index());
|
| - if (!browser.get()) {
|
| - *error = new Error(kUnknownError, "Couldn't obtain browser proxy");
|
| - return;
|
| - }
|
| - scoped_refptr<TabProxy> tab = browser->GetTab(view_locator.tab_index());
|
| - if (!tab.get()) {
|
| - *error = new Error(kUnknownError, "Couldn't obtain tab proxy");
|
| - return;
|
| - }
|
| - if (!tab->NavigateToURLAsync(GURL(url))) {
|
| - *error = new Error(kUnknownError, "Unable to navigate to url");
|
| - return;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void Automation::GoForward(const WebViewId& view_id, Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendGoForwardJSONRequest(
|
| - automation(), view_locator, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::GoBack(const WebViewId& view_id, Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendGoBackJSONRequest(automation(), view_locator, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::Reload(const WebViewId& view_id, Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendReloadJSONRequest(automation(), view_locator, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::GetCookies(const std::string& url,
|
| - scoped_ptr<ListValue>* cookies,
|
| - Error** error) {
|
| - automation::Error auto_error;
|
| - if (!SendGetCookiesJSONRequest(automation(), url, cookies, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::DeleteCookie(const std::string& url,
|
| - const std::string& cookie_name,
|
| - Error** error) {
|
| - automation::Error auto_error;
|
| - if (!SendDeleteCookieJSONRequest(
|
| - automation(), url, cookie_name, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::SetCookie(const std::string& url,
|
| - DictionaryValue* cookie_dict,
|
| - Error** error) {
|
| - automation::Error auto_error;
|
| - if (!SendSetCookieJSONRequest(automation(), url, cookie_dict, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::GetViews(std::vector<WebViewInfo>* views,
|
| - Error** error) {
|
| - automation::Error auto_error;
|
| - if (build_no_ >= 963) {
|
| - if (!SendGetWebViewsJSONRequest(automation(), views, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| - } else {
|
| - if (!SendGetTabIdsJSONRequest(automation(), views, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::DoesViewExist(
|
| - const WebViewId& view_id, bool* does_exist, Error** error) {
|
| - automation::Error auto_error;
|
| - if (view_id.old_style()) {
|
| - if (!SendIsTabIdValidJSONRequest(
|
| - automation(), view_id, does_exist, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| - } else {
|
| - if (!SendDoesAutomationObjectExistJSONRequest(
|
| - automation(), view_id, does_exist, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::CloseView(const WebViewId& view_id, Error** error) {
|
| - WebViewLocator view_locator;
|
| - *error = ConvertViewIdToLocator(view_id, &view_locator);
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendCloseViewJSONRequest(automation(), view_locator, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::SetViewBounds(const WebViewId& view_id,
|
| - const Rect& bounds,
|
| - Error** error) {
|
| - automation::Error auto_error;
|
| - if (!SendSetViewBoundsJSONRequest(
|
| - automation(), view_id, bounds.x(), bounds.y(),
|
| - bounds.width(), bounds.height(), &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::MaximizeView(const WebViewId& view_id, Error** error) {
|
| - *error = CheckMaximizeSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendMaximizeJSONRequest(
|
| - automation(), view_id, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::GetAppModalDialogMessage(std::string* message, Error** error) {
|
| - *error = CheckAlertsSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendGetAppModalDialogMessageJSONRequest(
|
| - automation(), message, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::AcceptOrDismissAppModalDialog(bool accept, Error** error) {
|
| - *error = CheckAlertsSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendAcceptOrDismissAppModalDialogJSONRequest(
|
| - automation(), accept, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::AcceptPromptAppModalDialog(const std::string& prompt_text,
|
| - Error** error) {
|
| - *error = CheckAlertsSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendAcceptPromptAppModalDialogJSONRequest(
|
| - automation(), prompt_text, &auto_error)) {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -void Automation::GetBrowserVersion(std::string* version) {
|
| - *version = automation()->server_version();
|
| -}
|
| -
|
| -void Automation::GetChromeDriverAutomationVersion(int* version, Error** error) {
|
| - automation::Error auto_error;
|
| - if (!SendGetChromeDriverAutomationVersion(automation(), version, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::WaitForAllViewsToStopLoading(Error** error) {
|
| - automation::Error auto_error;
|
| - if (!SendWaitForAllViewsToStopLoadingJSONRequestDeprecated(
|
| - automation(), &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::InstallExtension(
|
| - const base::FilePath& path, std::string* extension_id, Error** error) {
|
| - *error = CheckNewExtensionInterfaceSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendInstallExtensionJSONRequest(
|
| - automation(), path, false /* with_ui */, extension_id,
|
| - &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::GetExtensionsInfo(
|
| - base::ListValue* extensions_list, Error** error) {
|
| - *error = CheckNewExtensionInterfaceSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendGetExtensionsInfoJSONRequest(
|
| - automation(), extensions_list, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::IsPageActionVisible(
|
| - const WebViewId& tab_id,
|
| - const std::string& extension_id,
|
| - bool* is_visible,
|
| - Error** error) {
|
| - *error = CheckNewExtensionInterfaceSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendIsPageActionVisibleJSONRequest(
|
| - automation(), tab_id, extension_id, is_visible, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::SetExtensionState(
|
| - const std::string& extension_id,
|
| - bool enable,
|
| - Error** error) {
|
| - *error = CheckNewExtensionInterfaceSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendSetExtensionStateJSONRequest(
|
| - automation(), extension_id, enable /* enable */,
|
| - false /* allow_in_incognito */, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::ClickExtensionButton(
|
| - const std::string& extension_id,
|
| - bool browser_action,
|
| - Error** error) {
|
| - automation::Error auto_error;
|
| - if (!SendClickExtensionButtonJSONRequest(
|
| - automation(), extension_id, browser_action, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::UninstallExtension(
|
| - const std::string& extension_id, Error** error) {
|
| - *error = CheckNewExtensionInterfaceSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (!SendUninstallExtensionJSONRequest(
|
| - automation(), extension_id, &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| -}
|
| -
|
| -void Automation::SetLocalStatePreference(const std::string& pref,
|
| - base::Value* value,
|
| - Error** error) {
|
| - scoped_ptr<Value> scoped_value(value);
|
| - // In version 927, SetLocalStatePrefs was changed from taking a browser
|
| - // handle to a browser index.
|
| - if (build_no_ >= 927) {
|
| - automation::Error auto_error;
|
| - if (!SendSetLocalStatePreferenceJSONRequest(
|
| - automation(), pref, scoped_value.release(), &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| - } else {
|
| - std::string request, response;
|
| - DictionaryValue request_dict;
|
| - request_dict.SetString("command", "SetLocalStatePrefs");
|
| - request_dict.SetString("path", pref);
|
| - request_dict.Set("value", scoped_value.release());
|
| - base::JSONWriter::Write(&request_dict, &request);
|
| - if (!automation()->GetBrowserWindow(0)->SendJSONRequest(
|
| - request, -1, &response)) {
|
| - *error = new Error(kUnknownError, base::StringPrintf(
|
| - "Failed to set local state pref '%s'", pref.c_str()));
|
| - }
|
| - }
|
| -}
|
| -
|
| -void Automation::SetPreference(const std::string& pref,
|
| - base::Value* value,
|
| - Error** error) {
|
| - scoped_ptr<Value> scoped_value(value);
|
| - // Chrome 17 is on the 963 branch. The first released 18 build should have
|
| - // the new SetPrefs method which uses a browser index instead of handle.
|
| - if (build_no_ >= 964) {
|
| - automation::Error auto_error;
|
| - if (!SendSetPreferenceJSONRequest(
|
| - automation(), pref, scoped_value.release(), &auto_error))
|
| - *error = Error::FromAutomationError(auto_error);
|
| - } else {
|
| - std::string request, response;
|
| - DictionaryValue request_dict;
|
| - request_dict.SetString("command", "SetPrefs");
|
| - request_dict.SetInteger("windex", 0);
|
| - request_dict.SetString("path", pref);
|
| - request_dict.Set("value", scoped_value.release());
|
| - base::JSONWriter::Write(&request_dict, &request);
|
| - if (!automation()->GetBrowserWindow(0)->SendJSONRequest(
|
| - request, -1, &response)) {
|
| - *error = new Error(kUnknownError, base::StringPrintf(
|
| - "Failed to set pref '%s'", pref.c_str()));
|
| - }
|
| - }
|
| -}
|
| -
|
| -void Automation::GetGeolocation(scoped_ptr<DictionaryValue>* geolocation,
|
| - Error** error) {
|
| - *error = CheckGeolocationSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - if (geolocation_.get()) {
|
| - geolocation->reset(geolocation_->DeepCopy());
|
| - } else {
|
| - *error = new Error(kUnknownError,
|
| - "Location must be set before it can be retrieved");
|
| - }
|
| -}
|
| -
|
| -void Automation::OverrideGeolocation(const DictionaryValue* geolocation,
|
| - Error** error) {
|
| - *error = CheckGeolocationSupported();
|
| - if (*error)
|
| - return;
|
| -
|
| - automation::Error auto_error;
|
| - if (SendOverrideGeolocationJSONRequest(
|
| - automation(), geolocation, &auto_error)) {
|
| - geolocation_.reset(geolocation->DeepCopy());
|
| - } else {
|
| - *error = Error::FromAutomationError(auto_error);
|
| - }
|
| -}
|
| -
|
| -AutomationProxy* Automation::automation() const {
|
| - return launcher_->automation();
|
| -}
|
| -
|
| -Error* Automation::ConvertViewIdToLocator(
|
| - const WebViewId& view_id, WebViewLocator* view_locator) {
|
| - if (view_id.old_style()) {
|
| - int browser_index, tab_index;
|
| - automation::Error auto_error;
|
| - if (!SendGetIndicesFromTabIdJSONRequest(
|
| - automation(), view_id.tab_id(), &browser_index, &tab_index,
|
| - &auto_error))
|
| - return Error::FromAutomationError(auto_error);
|
| - *view_locator = WebViewLocator::ForIndexPair(browser_index, tab_index);
|
| - } else {
|
| - *view_locator = WebViewLocator::ForViewId(view_id.GetId());
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -Error* Automation::DetermineBuildNumber() {
|
| - std::string version = automation()->server_version();
|
| - std::vector<std::string> split_version;
|
| - base::SplitString(version, '.', &split_version);
|
| - if (split_version.size() != 4) {
|
| - return new Error(
|
| - kUnknownError, "Browser version has unrecognized format: " + version);
|
| - }
|
| - if (!base::StringToInt(split_version[2], &build_no_)) {
|
| - return new Error(
|
| - kUnknownError, "Browser version has unrecognized format: " + version);
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -Error* Automation::CheckVersion(int min_required_build_no,
|
| - const std::string& error_msg) {
|
| - if (build_no_ < min_required_build_no)
|
| - return new Error(kUnknownError, error_msg);
|
| - return NULL;
|
| -}
|
| -
|
| -Error* Automation::CheckAlertsSupported() {
|
| - return CheckVersion(
|
| - 768, "Alerts are not supported for this version of Chrome");
|
| -}
|
| -
|
| -Error* Automation::CheckAdvancedInteractionsSupported() {
|
| - const char* message =
|
| - "Advanced user interactions are not supported for this version of Chrome";
|
| - return CheckVersion(750, message);
|
| -}
|
| -
|
| -Error* Automation::CheckNewExtensionInterfaceSupported() {
|
| - const char* message =
|
| - "Extension interface is not supported for this version of Chrome";
|
| - return CheckVersion(947, message);
|
| -}
|
| -
|
| -Error* Automation::CheckGeolocationSupported() {
|
| - const char* message =
|
| - "Geolocation automation interface is not supported for this version of "
|
| - "Chrome.";
|
| - return CheckVersion(1119, message);
|
| -}
|
| -
|
| -Error* Automation::CheckMaximizeSupported() {
|
| - const char* message =
|
| - "Maximize automation interface is not supported for this version of "
|
| - "Chrome.";
|
| - return CheckVersion(1160, message);
|
| -}
|
| -
|
| -} // namespace webdriver
|
|
|