| Index: chrome/test/webdriver/automation.cc
|
| diff --git a/chrome/test/webdriver/automation.cc b/chrome/test/webdriver/automation.cc
|
| index 2477ef65b174569aa26e3a5c979225f627b7a595..5ce1614ce045a1e236473b044eca4aac9e0349b7 100644
|
| --- a/chrome/test/webdriver/automation.cc
|
| +++ b/chrome/test/webdriver/automation.cc
|
| @@ -9,6 +9,7 @@
|
| #endif
|
|
|
| #include "base/base_paths.h"
|
| +#include "base/basictypes.h"
|
| #include "base/callback.h"
|
| #include "base/command_line.h"
|
| #include "base/environment.h"
|
| @@ -16,6 +17,7 @@
|
| #include "base/file_util.h"
|
| #include "base/json/json_writer.h"
|
| #include "base/logging.h"
|
| +#include "base/memory/ref_counted.h"
|
| #include "base/path_service.h"
|
| #include "base/string_number_conversions.h"
|
| #include "base/string_split.h"
|
| @@ -29,9 +31,12 @@
|
| #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/extension_proxy.h"
|
| #include "chrome/test/automation/proxy_launcher.h"
|
| +#include "chrome/test/automation/tab_proxy.h"
|
| #include "chrome/test/webdriver/frame_path.h"
|
| +#include "chrome/test/webdriver/utility_functions.h"
|
| #include "chrome/test/webdriver/webdriver_error.h"
|
| #include "ui/gfx/point.h"
|
|
|
| @@ -42,14 +47,71 @@
|
|
|
| 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<FilePath>& browser_exes,
|
| + const std::vector<FilePath>& locations,
|
| + FilePath* browser_exe) {
|
| + for (size_t i = 0; i < browser_exes.size(); ++i) {
|
| + for (size_t j = 0; j < locations.size(); ++j) {
|
| + FilePath path = locations[j].Append(browser_exes[i]);
|
| + if (file_util::PathExists(path)) {
|
| + *browser_exe = path;
|
| + return true;
|
| + }
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +
|
| // Gets the path to the default Chrome executable. Returns true on success.
|
| bool GetDefaultChromeExe(FilePath* browser_exe) {
|
| - std::vector<FilePath> locations;
|
| - // Add the directory which this module resides in.
|
| + // 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)
|
| + FilePath browser_exes_array[] = {
|
| + FilePath(L"chrome.exe")
|
| + };
|
| +#elif defined(OS_MACOSX)
|
| + FilePath browser_exes_array[] = {
|
| + FilePath("Google Chrome.app/Contents/MacOS/Google Chrome"),
|
| + FilePath("Chromium.app/Contents/MacOS/Chromium")
|
| + };
|
| +#elif defined(OS_LINUX)
|
| + FilePath browser_exes_array[] = {
|
| + FilePath("google-chrome"),
|
| + FilePath("chrome"),
|
| + FilePath("chromium"),
|
| + FilePath("chromium-browser")
|
| + };
|
| +#endif
|
| + std::vector<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.
|
| FilePath module_dir;
|
| - if (PathService::Get(base::DIR_MODULE, &module_dir))
|
| - locations.push_back(module_dir);
|
| + if (PathService::Get(base::DIR_MODULE, &module_dir)) {
|
| + for (size_t j = 0; j < browser_exes.size(); ++j) {
|
| + FilePath path = module_dir.Append(browser_exes[j]);
|
| + if (file_util::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<FilePath> locations;
|
| + std::vector<FilePath> chromium_locations;
|
| #if defined(OS_WIN)
|
| // Add the App Paths registry key location.
|
| const wchar_t kSubKey[] =
|
| @@ -64,6 +126,7 @@ bool GetDefaultChromeExe(FilePath* browser_exe) {
|
|
|
| // Add the user-level location for Chrome.
|
| FilePath app_from_google(L"Google\\Chrome\\Application");
|
| + 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)) {
|
| @@ -75,6 +138,7 @@ bool GetDefaultChromeExe(FilePath* browser_exe) {
|
| 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.
|
| @@ -82,22 +146,27 @@ bool GetDefaultChromeExe(FilePath* browser_exe) {
|
| if (env->GetVar("ProgramFiles", &program_dir)) {
|
| locations.push_back(FilePath(UTF8ToWide(program_dir))
|
| .Append(app_from_google));
|
| + chromium_locations.push_back(FilePath(UTF8ToWide(program_dir))
|
| + .Append(app_from_chromium));
|
| }
|
| if (env->GetVar("ProgramFiles(x86)", &program_dir)) {
|
| locations.push_back(FilePath(UTF8ToWide(program_dir))
|
| .Append(app_from_google));
|
| + chromium_locations.push_back(FilePath(UTF8ToWide(program_dir))
|
| + .Append(app_from_chromium));
|
| }
|
| #elif defined(OS_MACOSX)
|
| - locations.push_back(FilePath("/Applications"));
|
| + std::vector<FilePath> app_dirs;
|
| + webdriver::GetApplicationDirs(&app_dirs);
|
| + locations.insert(locations.end(), app_dirs.begin(), app_dirs.end());
|
| #elif defined(OS_LINUX)
|
| - // Proxy launcher doesn't check for google-chrome, only chrome.
|
| - FilePath chrome_sym_link("/usr/bin/google-chrome");
|
| - if (file_util::PathExists(chrome_sym_link)) {
|
| - FilePath chrome;
|
| - if (file_util::ReadSymbolicLink(chrome_sym_link, &chrome)) {
|
| - locations.push_back(chrome.DirName());
|
| - }
|
| - }
|
| + locations.push_back(FilePath("/opt/google/chrome"));
|
| + locations.push_back(FilePath("/usr/local/bin"));
|
| + locations.push_back(FilePath("/usr/local/sbin"));
|
| + locations.push_back(FilePath("/usr/bin"));
|
| + locations.push_back(FilePath("/usr/sbin"));
|
| + locations.push_back(FilePath("/bin"));
|
| + locations.push_back(FilePath("/sbin"));
|
| #endif
|
|
|
| // Add the current directory.
|
| @@ -105,15 +174,10 @@ bool GetDefaultChromeExe(FilePath* browser_exe) {
|
| if (file_util::GetCurrentDirectory(¤t_dir))
|
| locations.push_back(current_dir);
|
|
|
| - // Determine the default directory.
|
| - for (size_t i = 0; i < locations.size(); ++i) {
|
| - FilePath path = locations[i].Append(chrome::kBrowserProcessExecutablePath);
|
| - if (file_util::PathExists(path)) {
|
| - *browser_exe = path;
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| + // 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);
|
| }
|
|
|
| } // namespace
|
| @@ -430,6 +494,30 @@ void Automation::NavigateToURL(int tab_id,
|
| *error = new Error(kUnknownError, "Navigation error occurred");
|
| }
|
|
|
| +void Automation::NavigateToURLAsync(int tab_id,
|
| + const std::string& url,
|
| + Error** error) {
|
| + int windex = 0, tab_index = 0;
|
| + *error = GetIndicesForTab(tab_id, &windex, &tab_index);
|
| + if (*error)
|
| + return;
|
| +
|
| + scoped_refptr<BrowserProxy> browser = automation()->GetBrowserWindow(windex);
|
| + if (!browser) {
|
| + *error = new Error(kUnknownError, "Couldn't obtain browser proxy");
|
| + return;
|
| + }
|
| + scoped_refptr<TabProxy> tab = browser->GetTab(tab_index);
|
| + if (!tab) {
|
| + *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(int tab_id, Error** error) {
|
| int windex = 0, tab_index = 0;
|
| *error = GetIndicesForTab(tab_id, &windex, &tab_index);
|
|
|