| Index: chrome/browser/profile.cc | 
| diff --git a/chrome/browser/profile.cc b/chrome/browser/profile.cc | 
| index 10cb6a1defee24262dfb9cb7d306bb8ef45f0b5f..c3eea76ef2c0b1e2d22f3d07b8a13a5f0ab9df36 100644 | 
| --- a/chrome/browser/profile.cc | 
| +++ b/chrome/browser/profile.cc | 
| @@ -6,6 +6,7 @@ | 
|  | 
| #include "base/command_line.h" | 
| #include "base/file_path.h" | 
| +#include "base/file_util.h" | 
| #include "base/path_service.h" | 
| #include "base/scoped_ptr.h" | 
| #include "base/string_util.h" | 
| @@ -104,6 +105,19 @@ void GetCacheParameters(ContextType type, FilePath* cache_path, | 
| } | 
| } | 
|  | 
| +FilePath GetCachePath(const FilePath& base) { | 
| +  return base.Append(chrome::kCacheDirname); | 
| +} | 
| + | 
| +FilePath GetMediaCachePath(const FilePath& base) { | 
| +  return base.Append(chrome::kMediaCacheDirname); | 
| +} | 
| + | 
| +bool HasACacheSubdir(const FilePath &dir) { | 
| +  return file_util::PathExists(GetCachePath(dir)) || | 
| +         file_util::PathExists(GetMediaCachePath(dir)); | 
| +} | 
| + | 
| }  // namespace | 
|  | 
| // A pointer to the request context for the default profile.  See comments on | 
| @@ -585,8 +599,28 @@ ProfileImpl::ProfileImpl(const FilePath& path) | 
| blacklist_ = new Blacklist(path); | 
| } | 
|  | 
| +#if defined(OS_MACOSX) | 
| +  // If the profile directory doesn't already have a cache directory and it | 
| +  // is under ~/Library/Application Support, use a suitable cache directory | 
| +  // under ~/Library/Caches.  For example, a profile directory of | 
| +  // ~/Library/Application Support/Google/Chrome/MyProfileName that doesn't | 
| +  // have a "Cache" or "MediaCache" subdirectory would use the cache directory | 
| +  // ~/Library/Caches/Google/Chrome/MyProfileName. | 
| +  // | 
| +  // TODO(akalin): Come up with unit tests for this. | 
| +  // TODO(akalin): Use for Linux, too? | 
| +  if (!HasACacheSubdir(path_)) { | 
| +    FilePath app_data_path, user_cache_path; | 
| +    if (PathService::Get(base::DIR_APP_DATA, &app_data_path) && | 
| +        PathService::Get(base::DIR_CACHE, &user_cache_path) && | 
| +        app_data_path.AppendRelativePath(path_, &user_cache_path)) { | 
| +      base_cache_path_ = user_cache_path; | 
| +    } | 
| +  } | 
| +#else | 
| if (!PathService::IsOverridden(chrome::DIR_USER_DATA)) | 
| PathService::Get(chrome::DIR_USER_CACHE, &base_cache_path_); | 
| +#endif | 
| if (base_cache_path_.empty()) | 
| base_cache_path_ = path_; | 
|  | 
| @@ -890,7 +924,7 @@ URLRequestContext* ProfileImpl::GetRequestContext() { | 
| int max_size; | 
| GetCacheParameters(kNormalContext, &cache_path, &max_size); | 
|  | 
| -    cache_path = cache_path.Append(chrome::kCacheDirname); | 
| +    cache_path = GetCachePath(cache_path); | 
| request_context_ = ChromeURLRequestContext::CreateOriginal( | 
| this, cookie_path, cache_path, max_size); | 
| request_context_->AddRef(); | 
| @@ -921,7 +955,7 @@ URLRequestContext* ProfileImpl::GetRequestContextForMedia() { | 
| int max_size; | 
| GetCacheParameters(kMediaContext, &cache_path, &max_size); | 
|  | 
| -    cache_path = cache_path.Append(chrome::kMediaCacheDirname); | 
| +    cache_path = GetMediaCachePath(cache_path); | 
| media_request_context_ = ChromeURLRequestContext::CreateOriginalForMedia( | 
| this, cache_path, max_size); | 
| media_request_context_->AddRef(); | 
|  |