15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/chrome_finder.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/base_paths_win.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetApplicationDirs(std::vector<base::FilePath>* locations) {
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<base::FilePath> installation_locations;
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath local_app_data, program_files, program_files_x86;
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (PathService::Get(base::DIR_LOCAL_APP_DATA, &local_app_data))
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    installation_locations.push_back(local_app_data);
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (PathService::Get(base::DIR_PROGRAM_FILES, &program_files))
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    installation_locations.push_back(program_files);
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (PathService::Get(base::DIR_PROGRAM_FILESX86, &program_files_x86))
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    installation_locations.push_back(program_files_x86);
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < installation_locations.size(); ++i) {
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    locations->push_back(
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        installation_locations[i].Append(L"Google\\Chrome\\Application"));
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < installation_locations.size(); ++i) {
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    locations->push_back(
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        installation_locations[i].Append(L"Chromium\\Application"));
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetApplicationDirs(std::vector<base::FilePath>* locations) {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  locations->push_back(base::FilePath("/opt/google/chrome"));
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  locations->push_back(base::FilePath("/usr/local/bin"));
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  locations->push_back(base::FilePath("/usr/local/sbin"));
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  locations->push_back(base::FilePath("/usr/bin"));
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  locations->push_back(base::FilePath("/usr/sbin"));
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  locations->push_back(base::FilePath("/bin"));
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  locations->push_back(base::FilePath("/sbin"));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FindExe(
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Callback<bool(const base::FilePath&)>& exists_func,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<base::FilePath>& rel_paths,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<base::FilePath>& locations,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath* out_path) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < rel_paths.size(); ++i) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t j = 0; j < locations.size(); ++j) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath path = locations[j].Append(rel_paths[i]);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (exists_func.Run(path)) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *out_path = path;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetApplicationDirs(std::vector<base::FilePath>* locations);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool FindChrome(base::FilePath* browser_exe) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath browser_exes_array[] = {
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(L"chrome.exe")
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath browser_exes_array[] = {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath("Google Chrome.app/Contents/MacOS/Google Chrome"),
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath("Chromium.app/Contents/MacOS/Chromium")
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath browser_exes_array[] = {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath("google-chrome"),
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath("chrome"),
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath("chromium"),
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath("chromium-browser")
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::FilePath> browser_exes(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_exes_array, browser_exes_array + arraysize(browser_exes_array));
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::FilePath module_dir;
105424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (PathService::Get(base::DIR_MODULE, &module_dir)) {
106424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for (size_t i = 0; i < browser_exes.size(); ++i) {
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::FilePath path = module_dir.Append(browser_exes[i]);
108424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      if (base::PathExists(path)) {
109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        *browser_exe = path;
110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        return true;
111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::vector<base::FilePath> locations;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetApplicationDirs(&locations);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return internal::FindExe(
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&base::PathExists),
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_exes,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      locations,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_exe);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
123