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