diff options
author | tommycli@chromium.org <tommycli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-29 20:21:59 +0000 |
---|---|---|
committer | tommycli@chromium.org <tommycli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-29 20:21:59 +0000 |
commit | 6034e46442251ee158c51b27e0cde087fe253b4c (patch) | |
tree | c69d4f5c262ce68cbd7048817532e0bbbcc0f8f3 | |
parent | f4d56d16feb0e39aa9ca39e75425b404aeaf3914 (diff) | |
download | chromium_src-6034e46442251ee158c51b27e0cde087fe253b4c.zip chromium_src-6034e46442251ee158c51b27e0cde087fe253b4c.tar.gz chromium_src-6034e46442251ee158c51b27e0cde087fe253b4c.tar.bz2 |
Media Galleries API Picasa: Mac Custom Database Locations
Mac code copied from vandebo's CL here: https://codereview.chromium.org/25779002/
BUG=151701
Review URL: https://codereview.chromium.org/26064002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@231627 0039d316-1c4b-4281-b951-d872f2087c98
7 files changed, 150 insertions, 54 deletions
diff --git a/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc b/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc index 1d6f6a7..916f007 100644 --- a/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc +++ b/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc @@ -161,11 +161,11 @@ class MediaGalleriesPlatformAppBrowserTest : public PlatformAppBrowserTest { } #if defined(OS_WIN) || defined(OS_MACOSX) - void PopulatePicasaTestData(const base::FilePath& metadata_root) { + void PopulatePicasaTestData(const base::FilePath& picasa_app_data_root) { base::FilePath picasa_database_path = - metadata_root.AppendASCII(picasa::kPicasaDatabaseDirName); + picasa::MakePicasaDatabasePath(picasa_app_data_root); base::FilePath picasa_temp_dir_path = - metadata_root.AppendASCII(picasa::kPicasaTempDirName); + picasa_database_path.DirName().AppendASCII(picasa::kPicasaTempDirName); ASSERT_TRUE(file_util::CreateDirectory(picasa_database_path)); ASSERT_TRUE(file_util::CreateDirectory(picasa_temp_dir_path)); @@ -277,27 +277,22 @@ IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, PicasaDefaultLocation) { #if defined(OS_WIN) - base::FilePath metadata_root = ensure_media_directories_exists()-> - GetFakeLocalAppDataPath().AppendASCII("Google").AppendASCII("Picasa2"); + PopulatePicasaTestData( + ensure_media_directories_exists()->GetFakeLocalAppDataPath()); #elif defined(OS_MACOSX) - base::FilePath metadata_root = ensure_media_directories_exists()-> - GetFakeAppDataPath().AppendASCII("Google").AppendASCII("Picasa3"); + PopulatePicasaTestData( + ensure_media_directories_exists()->GetFakeAppDataPath()); #endif - PopulatePicasaTestData(metadata_root); ASSERT_TRUE(RunMediaGalleriesTest("picasa")) << message_; } -#endif // defined(OS_WIN) || defined(OS_MACOSX) -#if defined(OS_WIN) IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, PicasaCustomLocation) { - base::ScopedTempDir fake_alternate_app_data_dir; - ASSERT_TRUE(fake_alternate_app_data_dir.CreateUniqueTempDir()); - ensure_media_directories_exists()->WriteCustomPicasaAppDataPathToRegistry( - fake_alternate_app_data_dir.path()); - base::FilePath metadata_root = fake_alternate_app_data_dir.path() - .AppendASCII("Google").AppendASCII("Picasa2"); - PopulatePicasaTestData(metadata_root); + base::ScopedTempDir custom_picasa_app_data_root; + ASSERT_TRUE(custom_picasa_app_data_root.CreateUniqueTempDir()); + ensure_media_directories_exists()->SetCustomPicasaAppDataPath( + custom_picasa_app_data_root.path()); + PopulatePicasaTestData(custom_picasa_app_data_root.path()); ASSERT_TRUE(RunMediaGalleriesTest("picasa")) << message_; } -#endif // defined(OS_WIN) +#endif // defined(OS_WIN) || defined(OS_MACOSX) diff --git a/chrome/browser/media_galleries/fileapi/picasa_finder.cc b/chrome/browser/media_galleries/fileapi/picasa_finder.cc index ef58e90..87ec630 100644 --- a/chrome/browser/media_galleries/fileapi/picasa_finder.cc +++ b/chrome/browser/media_galleries/fileapi/picasa_finder.cc @@ -11,7 +11,6 @@ #include "base/base_paths.h" #include "base/bind.h" #include "base/file_util.h" -#include "base/files/file_path.h" #include "base/path_service.h" #include "base/strings/string16.h" #include "chrome/browser/storage_monitor/storage_info.h" @@ -27,13 +26,13 @@ namespace picasa { #if defined(OS_WIN) const wchar_t kPicasaRegistryPath[] = L"Software\\Google\\Picasa\\Picasa2\\Preferences"; -const wchar_t kPicasaRegistryAppDataKey[] = L"AppLocalDataPath"; +const wchar_t kPicasaRegistryAppDataPathKey[] = L"AppLocalDataPath"; #endif namespace { #if defined(OS_WIN) -base::FilePath GetCustomPicasaRoot() { +base::FilePath GetCustomPicasaAppDataPathFromWinRegistry() { base::win::RegKey key; if (key.Open(HKEY_CURRENT_USER, kPicasaRegistryPath, KEY_READ) != ERROR_SUCCESS || !key.Valid()) { @@ -41,7 +40,7 @@ base::FilePath GetCustomPicasaRoot() { } string16 value; - if (key.ReadValue(kPicasaRegistryAppDataKey, &value) != ERROR_SUCCESS) + if (key.ReadValue(kPicasaRegistryAppDataPathKey, &value) != ERROR_SUCCESS) return base::FilePath(); if (value.empty()) return base::FilePath(); @@ -49,45 +48,38 @@ base::FilePath GetCustomPicasaRoot() { return base::FilePath(value); } -base::FilePath GetPicasaDatabasePathWin() { - base::FilePath path = GetCustomPicasaRoot(); +base::FilePath GetPicasaDatabasePath() { + base::FilePath path = GetCustomPicasaAppDataPathFromWinRegistry(); if (path.empty() && !PathService::Get(base::DIR_LOCAL_APP_DATA, &path)) return base::FilePath(); - - return path.AppendASCII("Google").AppendASCII("Picasa2").AppendASCII( - kPicasaDatabaseDirName); + return MakePicasaDatabasePath(path); } -#endif +#endif // OS_WIN -#if defined (OS_MACOSX) -base::FilePath GetPicasaDatabasePathMac() { - // TODO(tommycli): Support Picasa Mac's custom path. - base::FilePath path; - if (!PathService::Get(base::DIR_APP_DATA, &path)) +#if defined(OS_MACOSX) +base::FilePath GetPicasaDatabasePath() { + base::FilePath path = GetCustomPicasaAppDataPathFromMacPreferences(); + if (path.empty() && !PathService::Get(base::DIR_APP_DATA, &path)) return base::FilePath(); - - // On Mac, the database is in "Picasa3", not "Picasa2". - return path.AppendASCII("Google").AppendASCII("Picasa3").AppendASCII( - kPicasaDatabaseDirName); + return MakePicasaDatabasePath(path); } -#endif +#endif // OS_MACOSX // Returns path of Picasa's DB3 database directory. May only be called on // threads that allow for disk IO, like the FILE thread or MediaTaskRunner. base::FilePath FindPicasaDatabaseOnFileThread() { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); - base::FilePath path; - #if defined(OS_WIN) - path = GetPicasaDatabasePathWin(); - #elif defined(OS_MACOSX) - path = GetPicasaDatabasePathMac(); - #endif - - // Verify actual existence - if (!base::DirectoryExists(path)) - path.clear(); - - return path; + +#if defined(OS_WIN) || defined(OS_MACOSX) + base::FilePath path = GetPicasaDatabasePath(); + // Verify actual existence + if (!base::DirectoryExists(path)) + path.clear(); + + return path; +#else + return base::FilePath(); +#endif } void FinishOnOriginalThread(const DeviceIDCallback& callback, @@ -110,4 +102,17 @@ void FindPicasaDatabase(const DeviceIDCallback& callback) { base::Bind(&FinishOnOriginalThread, callback)); } +base::FilePath MakePicasaDatabasePath( + const base::FilePath& picasa_app_data_path) { +#if defined(OS_WIN) + return picasa_app_data_path.AppendASCII("Google").AppendASCII("Picasa2") + .AppendASCII(kPicasaDatabaseDirName); +#elif defined(OS_MACOSX) + return picasa_app_data_path.AppendASCII("Google").AppendASCII("Picasa3") + .AppendASCII(kPicasaDatabaseDirName); +#else + return base::FilePath(); +#endif +} + } // namespace picasa diff --git a/chrome/browser/media_galleries/fileapi/picasa_finder.h b/chrome/browser/media_galleries/fileapi/picasa_finder.h index 1c64273..109c90d 100644 --- a/chrome/browser/media_galleries/fileapi/picasa_finder.h +++ b/chrome/browser/media_galleries/fileapi/picasa_finder.h @@ -8,12 +8,28 @@ #include <string> #include "base/callback.h" +#include "base/files/file_path.h" + +#if defined(OS_MACOSX) + +class MacPreferences; +#if defined(__OBJC__) +@class NSString; +#else // __OBJC__ +class NSString; +#endif // __OBJC__ + +#endif // OS_MACOSX namespace picasa { #if defined(OS_WIN) extern const wchar_t kPicasaRegistryPath[]; -extern const wchar_t kPicasaRegistryAppDataKey[]; +extern const wchar_t kPicasaRegistryAppDataPathKey[]; +#endif + +#if defined(OS_MACOSX) +extern NSString* const kPicasaAppDataPathMacPreferencesKey; #endif typedef base::Callback<void(const std::string&)> DeviceIDCallback; @@ -24,6 +40,21 @@ typedef base::Callback<void(const std::string&)> DeviceIDCallback; // with an empty string. void FindPicasaDatabase(const DeviceIDCallback& callback); +// Builds the OS-dependent Picasa database path from the app-data path. +// Used internally and by tests to construct an test environments. +base::FilePath MakePicasaDatabasePath( + const base::FilePath& picasa_app_data_path); + +#if defined(OS_MACOSX) +// Set the mac preferences to use for testing. The caller continues to own +// |preferences| and should call this function again with NULL before freeing +// it. +void SetMacPreferencesForTesting(MacPreferences* preferences); + +// Used internally only. +base::FilePath GetCustomPicasaAppDataPathFromMacPreferences(); +#endif // OS_MACOSX + } // namespace picasa #endif // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_PICASA_FINDER_H_ diff --git a/chrome/browser/media_galleries/fileapi/picasa_finder_mac.mm b/chrome/browser/media_galleries/fileapi/picasa_finder_mac.mm new file mode 100644 index 0000000..1a3dead --- /dev/null +++ b/chrome/browser/media_galleries/fileapi/picasa_finder_mac.mm @@ -0,0 +1,52 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/media_galleries/fileapi/picasa_finder.h" + +#include "base/files/file_path.h" +#import "base/mac/foundation_util.h" +#import "base/mac/scoped_nsobject.h" +#include "chrome/browser/policy/preferences_mac.h" +#include "content/public/browser/browser_thread.h" + +using base::mac::CFCast; +using base::mac::CFToNSCast; +using base::mac::NSToCFCast; + +namespace picasa { + +namespace { + +static MacPreferences* g_test_mac_preferences = NULL; + +} // namespace + +NSString* const kPicasaAppDataPathMacPreferencesKey = @"AppLocalDataPath"; + +void SetMacPreferencesForTesting(MacPreferences* preferences) { + g_test_mac_preferences = preferences; +} + +base::FilePath GetCustomPicasaAppDataPathFromMacPreferences() { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); + + scoped_ptr<MacPreferences> real_preferences; + MacPreferences* prefs = g_test_mac_preferences; + if (!prefs) { + real_preferences.reset(new MacPreferences()); + prefs = real_preferences.get(); + } + + CFStringRef picasa_app_id = CFSTR("com.google.picasa"); + base::scoped_nsobject<NSString> database_path( + CFToNSCast(CFCast<CFStringRef>(prefs->CopyAppValue( + NSToCFCast(kPicasaAppDataPathMacPreferencesKey), picasa_app_id)))); + + if (database_path == NULL) + return base::FilePath(); + + return base::mac::NSStringToFilePath(database_path.get()); +} + +} // namespace picasa diff --git a/chrome/browser/media_galleries/media_galleries_test_util.cc b/chrome/browser/media_galleries/media_galleries_test_util.cc index ce58b66..d2f32a5 100644 --- a/chrome/browser/media_galleries/media_galleries_test_util.cc +++ b/chrome/browser/media_galleries/media_galleries_test_util.cc @@ -92,6 +92,7 @@ EnsureMediaDirectoriesExists::EnsureMediaDirectoriesExists() EnsureMediaDirectoriesExists::~EnsureMediaDirectoriesExists() { #if defined(OS_MACOSX) iapps::SetMacPreferencesForTesting(NULL); + picasa::SetMacPreferencesForTesting(NULL); #endif // OS_MACOSX } @@ -106,14 +107,24 @@ base::FilePath EnsureMediaDirectoriesExists::GetFakeLocalAppDataPath() const { return fake_dir_.path().AppendASCII("localappdata"); } -void EnsureMediaDirectoriesExists::WriteCustomPicasaAppDataPathToRegistry( +void EnsureMediaDirectoriesExists::SetCustomPicasaAppDataPath( const base::FilePath& path) { base::win::RegKey key(HKEY_CURRENT_USER, picasa::kPicasaRegistryPath, KEY_SET_VALUE); - key.WriteValue(picasa::kPicasaRegistryAppDataKey, path.value().c_str()); + key.WriteValue(picasa::kPicasaRegistryAppDataPathKey, path.value().c_str()); } #endif // OS_WIN +#if defined(OS_MACOSX) +void EnsureMediaDirectoriesExists::SetCustomPicasaAppDataPath( + const base::FilePath& path) { + mac_preferences_->AddTestItem( + base::mac::NSToCFCast(picasa::kPicasaAppDataPathMacPreferencesKey), + base::SysUTF8ToNSString(path.value()), + false); +} +#endif // OS_MACOSX + #if defined(OS_WIN) || defined(OS_MACOSX) base::FilePath EnsureMediaDirectoriesExists::GetFakePicasaFoldersRootPath() const { @@ -147,6 +158,7 @@ void EnsureMediaDirectoriesExists::Init() { #if defined(OS_MACOSX) mac_preferences_.reset(new MockPreferences); iapps::SetMacPreferencesForTesting(mac_preferences_.get()); + picasa::SetMacPreferencesForTesting(mac_preferences_.get()); // iTunes override. mac_preferences_->AddTestItem( diff --git a/chrome/browser/media_galleries/media_galleries_test_util.h b/chrome/browser/media_galleries/media_galleries_test_util.h index 81e7de7..be22818 100644 --- a/chrome/browser/media_galleries/media_galleries_test_util.h +++ b/chrome/browser/media_galleries/media_galleries_test_util.h @@ -44,9 +44,9 @@ class EnsureMediaDirectoriesExists { base::FilePath GetFakeAppDataPath() const; #if defined(OS_WIN) base::FilePath GetFakeLocalAppDataPath() const; - void WriteCustomPicasaAppDataPathToRegistry(const base::FilePath& path); #endif #if defined(OS_WIN) || defined(OS_MACOSX) + void SetCustomPicasaAppDataPath(const base::FilePath& path); base::FilePath GetFakePicasaFoldersRootPath() const; #endif diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 31f3803..1599d6b 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1080,6 +1080,7 @@ 'browser/media_galleries/fileapi/native_media_file_util.h', 'browser/media_galleries/fileapi/picasa_finder.cc', 'browser/media_galleries/fileapi/picasa_finder.h', + 'browser/media_galleries/fileapi/picasa_finder_mac.mm', 'browser/media_galleries/fileapi/safe_audio_video_checker.cc', 'browser/media_galleries/fileapi/safe_audio_video_checker.h', 'browser/media_galleries/fileapi/supported_audio_video_checker.cc', |