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