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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/lazy_instance.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/bundle_locations.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h" 149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/threading/thread_restrictions.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths_internal.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/widevine_cdm_constants.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_paths.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/path_utils.h" 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/base_paths_android.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/mac/foundation_util.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// File name of the internal Flash plugin on different platforms. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kInternalFlashPluginFileName[] = 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("Flash Player Plugin for Chrome.plugin"); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("gcswf32.dll"); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // OS_LINUX, etc. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("libgcflashplayer.so"); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Pepper Flash plugins are in a directory with this name. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kPepperFlashBaseDirectory[] = 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("PepperFlash"); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_WIN) 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst base::FilePath::CharType kPepperFlashDebuggerBaseDirectory[] = 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FILE_PATH_LITERAL("Macromed\\Flash"); 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// File name of the internal PDF plugin on different platforms. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kInternalPDFPluginFileName[] = 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("pdf.dll"); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("PDF.plugin"); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // Linux and Chrome OS 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("libpdf.so"); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kInternalNaClPluginFileName[] = 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FILE_PATH_LITERAL("internal-nacl-plugin"); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const base::FilePath::CharType kEffectsPluginFileName[] = 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FILE_PATH_LITERAL("pepper/libppeffects.dll"); 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#elif defined(OS_MACOSX) 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FILE_PATH_LITERAL("pepper/libppeffects.plugin"); 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else // Linux and Chrome OS 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FILE_PATH_LITERAL("pepper/libppeffects.so"); 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::FilePath::CharType kO1DPluginFileName[] = 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FILE_PATH_LITERAL("pepper/libppo1d.so"); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kGTalkPluginFileName[] = 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("pepper/libppgoogletalk.so"); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) && !defined(OS_MACOSX) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The path to the external extension <id>.json files. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// /usr/share seems like a good choice, see: http://www.pathname.com/fhs/ 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kFilepathSinglePrefExtensions[] = 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("/usr/share/google-chrome/extensions"); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("/usr/share/chromium/extensions"); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(GOOGLE_CHROME_BUILD) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_LINUX) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static base::LazyInstance<base::FilePath> 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_invalid_specified_user_data_dir = LAZY_INSTANCE_INITIALIZER; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the path for internal plugins. 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetInternalPluginsDirectory(base::FilePath* result) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If called from Chrome, get internal plugins from a subdirectory of the 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // framework. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::mac::AmIBundled()) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = chrome::GetFrameworkBundlePath(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!result->empty()); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = result->Append("Internet Plug-Ins"); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In tests, just look in the module directory (below). 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rest of the world expects plugins in the module directory. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PathService::Get(base::DIR_MODULE, result); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace chrome { 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PathProvider(int key, base::FilePath* result) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some keys are just aliases... 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (key) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_APP: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PathService::Get(base::DIR_MODULE, result); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_LOGS: 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NDEBUG 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release builds write to the data dir 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PathService::Get(chrome::DIR_USER_DATA, result); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Debug builds write next to the binary (in the build tree) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_EXE, result)) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::mac::AmIBundled()) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're called from chrome, dump it beside the app (outside the 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // app bundle), if we're called from a unittest, we'll already 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // outside the bundle so use the exe dir. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exe_dir gave us .../Chromium.app/Contents/MacOS/Chromium. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = result->DirName(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = result->DirName(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = result->DirName(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PathService::Get(base::DIR_EXE, result); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_MACOSX) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NDEBUG 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::FILE_RESOURCE_MODULE: 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PathService::Get(base::FILE_MODULE, result); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume that we will not need to create the directory if it does not exist. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This flag can be set to true for the cases where we want to create it. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool create_dir = false; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath cur; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (key) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_USER_DATA: 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetDefaultUserDataDirectory(&cur)) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_dir = true; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_USER_DOCUMENTS: 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetUserDocumentsDirectory(&cur)) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_dir = true; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_USER_MUSIC: 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetUserMusicDirectory(&cur)) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_USER_PICTURES: 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetUserPicturesDirectory(&cur)) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_USER_VIDEOS: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetUserVideosDirectory(&cur)) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_DEFAULT_DOWNLOADS_SAFE: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_LINUX) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetUserDownloadsDirectorySafe(&cur)) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fall through for all other platforms. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_DEFAULT_DOWNLOADS: 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::android::GetDownloadsDirectory(&cur)) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetUserDownloadsDirectory(&cur)) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not create the download directory here, we have done it twice now 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and annoyed a lot of users. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case chrome::DIR_CRASH_DUMPS: 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_CHROMEOS) 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // ChromeOS uses a separate directory. See http://crosbug.com/25089 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cur = base::FilePath("/var/log/chrome"); 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#elif defined(OS_ANDROID) 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!base::android::GetCacheDirectory(&cur)) 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The crash reports are always stored relative to the default user data 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // directory. This avoids the problem of having to re-initialize the 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // exception handler after parsing command line options, which may 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // override the location of the app's profile directory. 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!GetDefaultUserDataDirectory(&cur)) 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cur = cur.Append(FILE_PATH_LITERAL("Crash Reports")); 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch create_dir = true; 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_RESOURCES: 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = base::mac::FrameworkBundlePath(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("Resources")); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_APP, &cur)) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("resources")); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_INSPECTOR: 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_RESOURCES, &cur)) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("inspector")); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_APP_DICTIONARIES: 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can't write into the EXE dir on Linux, so keep dictionaries 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // alongside the safe browsing database in the user data dir. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And we don't want to write into the bundle on the Mac, so push 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it to the user data dir there also. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_EXE, &cur)) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("Dictionaries")); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_dir = true; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_INTERNAL_PLUGINS: 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetInternalPluginsDirectory(&cur)) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_PEPPER_FLASH_PLUGIN: 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetInternalPluginsDirectory(&cur)) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(kPepperFlashBaseDirectory); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_COMPONENT_UPDATED_PEPPER_FLASH_PLUGIN: 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(kPepperFlashBaseDirectory); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case chrome::DIR_PEPPER_FLASH_DEBUGGER_PLUGIN: 2655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_WIN) 2665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!PathService::Get(base::DIR_SYSTEM, &cur)) 2675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 2685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu cur = cur.Append(kPepperFlashDebuggerBaseDirectory); 2695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#elif defined(OS_MACOSX) 2705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(luken): finalize Mac OS directory paths, current consensus is 2715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // around /Library/Internet Plug-Ins/PepperFlashPlayer/ 2725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 2735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#else 2745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif 2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu break; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::FILE_LOCAL_STATE: 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(chrome::kLocalStateFilename); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::FILE_RECORDED_SCRIPT: 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("script.log")); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::FILE_FLASH_PLUGIN: 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetInternalPluginsDirectory(&cur)) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(kInternalFlashPluginFileName); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::FILE_PEPPER_FLASH_PLUGIN: 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_PEPPER_FLASH_PLUGIN, &cur)) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(chrome::kPepperFlashPluginFilename); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::FILE_PDF_PLUGIN: 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetInternalPluginsDirectory(&cur)) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(kInternalPDFPluginFileName); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chrome::FILE_EFFECTS_PLUGIN: 3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!GetInternalPluginsDirectory(&cur)) 3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cur = cur.Append(kEffectsPluginFileName); 3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(teravest): Remove this case once the internal NaCl plugin is gone. 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // We currently need a path here to look up whether the plugin is disabled 3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // and what its permissions are. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::FILE_NACL_PLUGIN: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetInternalPluginsDirectory(&cur)) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(kInternalNaClPluginFileName); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PNaCl is currenly installable via the component updater or by being 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // simply built-in. DIR_PNACL_BASE is used as the base directory for 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // installation via component updater. DIR_PNACL_COMPONENT will be 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the final location of pnacl, which is a subdir of DIR_PNACL_BASE. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_PNACL_BASE: 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("pnacl")); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Where PNaCl files are ultimately located. The default finds the files 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // inside the InternalPluginsDirectory / build directory, as if it 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // was shipped along with chrome. The value can be overridden 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if it is installed via component updater. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_PNACL_COMPONENT: 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PNaCl really belongs in the InternalPluginsDirectory but actually 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // copying it there would result in the files also being shipped, which 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we don't want yet. So for now, just find them in the directory where 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // they get built. 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PathService::Get(base::DIR_EXE, &cur)) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base::mac::AmIBundled()) { 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we're called from chrome, it's beside the app (outside the 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // app bundle), if we're called from a unittest, we'll already be 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // outside the bundle so use the exe dir. 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // exe_dir gave us .../Chromium.app/Contents/MacOS/Chromium. 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = cur.DirName(); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = cur.DirName(); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = cur.DirName(); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GetInternalPluginsDirectory(&cur)) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("pnacl")); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case chrome::FILE_O1D_PLUGIN: 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!PathService::Get(base::DIR_MODULE, &cur)) 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cur = cur.Append(kO1DPluginFileName); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::FILE_GTALK_PLUGIN: 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_MODULE, &cur)) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(kGTalkPluginFileName); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE) && defined(ENABLE_PEPPER_CDMS) 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(WIDEVINE_CDM_IS_COMPONENT) 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case chrome::DIR_COMPONENT_WIDEVINE_CDM: 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cur = cur.Append(kWidevineCdmBaseDirectory); 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(WIDEVINE_CDM_IS_COMPONENT) 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(xhwang): FILE_WIDEVINE_CDM_ADAPTER has different meanings. 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // In the component case, this is the source adapter. Otherwise, it is the 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // actual Pepper module that gets loaded. 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case chrome::FILE_WIDEVINE_CDM_ADAPTER: 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GetInternalPluginsDirectory(&cur)) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 37790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cur = cur.AppendASCII(kWidevineCdmAdapterFileName); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif // defined(WIDEVINE_CDM_AVAILABLE) && defined(ENABLE_PEPPER_CDMS) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::FILE_RESOURCES_PACK: 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::mac::AmIBundled()) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = base::mac::FrameworkBundlePath(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("Resources")) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(FILE_PATH_LITERAL("resources.pak")); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &cur)) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're not bundled on mac or Android, resources.pak should be next 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the binary (e.g., for unit tests). 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_MODULE, &cur)) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("resources.pak")); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_RESOURCES_EXTENSION: 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_MODULE, &cur)) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("resources")) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(FILE_PATH_LITERAL("extension")); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_CHROMEOS_WALLPAPERS: 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("wallpapers")); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS: 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("wallpaper_thumbnails")); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case chrome::DIR_CHROMEOS_CUSTOM_WALLPAPERS: 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("custom_wallpapers")); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 422424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#if defined(OS_LINUX) && defined(ENABLE_MANAGED_USERS) 423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case chrome::DIR_SUPERVISED_USERS_DEFAULT_APPS: 424424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!PathService::Get(chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS, &cur)) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("managed_users")); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following are only valid in the development environment, and 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will fail if executed from an installed executable (because the 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // generated path won't exist). 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_GEN_TEST_DATA: 4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_ANDROID) 4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // On Android, our tests don't have permission to write to DIR_MODULE. 4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // gtest/test_runner.py pushes data to external storage. 4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!PathService::Get(base::DIR_ANDROID_EXTERNAL_STORAGE, &cur)) 4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_MODULE, &cur)) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("test_data")); 4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(cur)) // We don't want to create this. 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_TEST_DATA: 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_SOURCE_ROOT, &cur)) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("chrome")); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("test")); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("data")); 4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(cur)) // We don't want to create this. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_TEST_TOOLS: 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_SOURCE_ROOT, &cur)) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("chrome")); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("tools")); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("test")); 4617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(cur)) // We don't want to create this 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_POLICY_FILES: { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = base::FilePath(FILE_PATH_LITERAL("/etc/opt/chrome/policies")); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = base::FilePath(FILE_PATH_LITERAL("/etc/chromium/policies")); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_MANAGED_PREFS: { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetLocalLibraryDirectory(&cur)) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("Managed Preferences")); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* login = getlogin(); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!login) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.AppendASCII(login); 4837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(cur)) // We don't want to create this. 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case chrome::DIR_USER_LIBRARY: { 488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!GetUserLibraryDirectory(&cur)) 489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!base::PathExists(cur)) // We don't want to create this. 491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case chrome::DIR_USER_APPLICATIONS: { 495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!GetUserApplicationsDirectory(&cur)) 496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!base::PathExists(cur)) // We don't want to create this. 498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) || (defined(OS_MACOSX) && !defined(OS_IOS)) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_USER_EXTERNAL_EXTENSIONS: { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("External Extensions")); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS: { 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cur = base::FilePath(kFilepathSinglePrefExtensions); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_EXTERNAL_EXTENSIONS: 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!chrome::GetGlobalApplicationSupportDirectory(&cur)) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("Google")) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(FILE_PATH_LITERAL("Chrome")) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(FILE_PATH_LITERAL("External Extensions")); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_dir = false; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_MODULE, &cur)) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("extensions")); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_dir = true; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::DIR_DEFAULT_APPS: 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = base::mac::FrameworkBundlePath(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("Default Apps")); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_APP, &cur)) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("default_apps")); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_LINUX) || (defined(OS_MACOSX) && !defined(OS_IOS)) 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::DIR_NATIVE_MESSAGING: 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX) 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cur = base::FilePath(FILE_PATH_LITERAL( 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "/Library/Google/Chrome/NativeMessagingHosts")); 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cur = base::FilePath(FILE_PATH_LITERAL( 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "/Library/Application Support/Chromium/NativeMessagingHosts")); 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else // defined(OS_MACOSX) 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cur = base::FilePath(FILE_PATH_LITERAL( 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "/etc/opt/chrome/native-messaging-hosts")); 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cur = base::FilePath(FILE_PATH_LITERAL( 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "/etc/chromium/native-messaging-hosts")); 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // !defined(OS_MACOSX) 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::DIR_USER_NATIVE_MESSAGING: 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cur = cur.Append(FILE_PATH_LITERAL("NativeMessagingHosts")); 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(OS_LINUX) || (defined(OS_MACOSX) && !defined(OS_IOS)) 57246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if !defined(OS_ANDROID) 57346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case chrome::DIR_GLOBAL_GCM_STORE: 57446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!PathService::Get(chrome::DIR_USER_DATA, &cur)) 57546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 57646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) cur = cur.Append(kGCMStoreDirname); 57746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) break; 57846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif // !defined(OS_ANDROID) 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5849ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // TODO(bauerb): http://crbug.com/259796 5859ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch base::ThreadRestrictions::ScopedAllowIO allow_io; 5867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (create_dir && !base::PathExists(cur) && 587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !base::CreateDirectory(cur)) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = cur; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This cannot be done as a static initializer sadly since Visual Studio will 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// eliminate this object file if there is no direct entry point into it. 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterPathProvider() { 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::RegisterProvider(PathProvider, PATH_START, PATH_END); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SetInvalidSpecifiedUserDataDir(const base::FilePath& user_data_dir) { 601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_invalid_specified_user_data_dir.Get() = user_data_dir; 602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const base::FilePath& GetInvalidSpecifiedUserDataDir() { 605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return g_invalid_specified_user_data_dir.Get(); 606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 609