Chromium Code Reviews| Index: chrome/browser/media_galleries/media_file_system_registry.cc |
| diff --git a/chrome/browser/media_galleries/media_file_system_registry.cc b/chrome/browser/media_galleries/media_file_system_registry.cc |
| index 25004bdcccc58c920f4d2d0643edb4d6a1b2edb9..d446fa538f302ad3eca2add397227b3fce5c573e 100644 |
| --- a/chrome/browser/media_galleries/media_file_system_registry.cc |
| +++ b/chrome/browser/media_galleries/media_file_system_registry.cc |
| @@ -438,64 +438,21 @@ void MediaFileSystemRegistry::GetMediaFileSystemsForExtension( |
| Profile* profile = |
| Profile::FromBrowserContext(rvh->GetProcess()->GetBrowserContext()); |
| MediaGalleriesPreferences* preferences = GetPreferences(profile); |
| - MediaGalleryPrefIdSet galleries = |
| - preferences->GalleriesForExtension(*extension); |
| - |
| - if (galleries.empty()) { |
| - callback.Run(std::vector<MediaFileSystemInfo>()); |
| - return; |
| - } |
| - |
| - ExtensionGalleriesHostMap::iterator extension_hosts = |
| - extension_hosts_map_.find(profile); |
| - if (extension_hosts->second.empty()) |
| - preferences->AddGalleryChangeObserver(this); |
| - |
| - ExtensionGalleriesHost* extension_host = |
| - extension_hosts->second[extension->id()].get(); |
| - if (!extension_host) { |
| - extension_host = new ExtensionGalleriesHost( |
| - file_system_context_.get(), |
| - base::Bind(&MediaFileSystemRegistry::OnExtensionGalleriesHostEmpty, |
| - base::Unretained(this), profile, extension->id())); |
| - extension_hosts_map_[profile][extension->id()] = extension_host; |
| - } |
| - extension_host->ReferenceFromRVH(rvh); |
| - |
| - extension_host->GetMediaFileSystems(galleries, preferences->known_galleries(), |
| - callback); |
| + preferences->EnsureInitialized(base::Bind( |
|
vandebo (ex-Chrome)
2013/09/21 01:20:59
Are we not already sure that preferences have been
tommycli
2013/09/23 20:39:12
I made this assume it was already initialized, and
|
| + &MediaFileSystemRegistry::FinishGetMediaFileSystemsForExtension, |
| + weak_factory_.GetWeakPtr(), |
| + rvh, |
| + extension, |
| + callback)); |
| } |
| MediaGalleriesPreferences* MediaFileSystemRegistry::GetPreferences( |
| Profile* profile) { |
| - MediaGalleriesPreferences* preferences = |
| - MediaGalleriesPreferencesFactory::GetForProfile(profile); |
| - if (ContainsKey(extension_hosts_map_, profile)) |
| - return preferences; |
| - |
| - // Create an empty entry so the initialization code below only gets called |
| - // once per profile. |
| - extension_hosts_map_[profile] = ExtensionHostMap(); |
| - |
| - // TODO(gbillock): Move this stanza to MediaGalleriesPreferences init code. |
| - StorageMonitor* monitor = StorageMonitor::GetInstance(); |
| - DCHECK(monitor->IsInitialized()); |
| - std::vector<StorageInfo> existing_devices = |
| - monitor->GetAllAvailableStorages(); |
| - for (size_t i = 0; i < existing_devices.size(); i++) { |
| - if (!(StorageInfo::IsMediaDevice(existing_devices[i].device_id()) && |
| - StorageInfo::IsRemovableDevice(existing_devices[i].device_id()))) |
| - continue; |
| - preferences->AddGallery(existing_devices[i].device_id(), |
| - base::FilePath(), |
| - false, |
| - existing_devices[i].storage_label(), |
| - existing_devices[i].vendor_name(), |
| - existing_devices[i].model_name(), |
| - existing_devices[i].total_size_in_bytes(), |
| - base::Time::Now()); |
| - } |
| - return preferences; |
| + // Create an empty ExtensionHostMap for this profile on first initialization. |
| + if (!ContainsKey(extension_hosts_map_, profile)) |
| + extension_hosts_map_[profile] = ExtensionHostMap(); |
| + |
| + return MediaGalleriesPreferencesFactory::GetForProfile(profile); |
| } |
| void MediaFileSystemRegistry::OnRemovableStorageDetached( |
| @@ -514,6 +471,10 @@ void MediaFileSystemRegistry::OnRemovableStorageDetached( |
| profile_it != extension_hosts_map_.end(); |
| ++profile_it) { |
| MediaGalleriesPreferences* preferences = GetPreferences(profile_it->first); |
| + // If |preferences| is not yet initialized, it won't contain any galleries. |
| + if (!preferences->IsInitialized()) |
| + continue; |
| + |
| InvalidatedGalleriesInfo invalid_galleries_in_profile; |
| invalid_galleries_in_profile.pref_ids = |
| preferences->LookUpGalleriesByDeviceId(info.device_id()); |
| @@ -619,8 +580,10 @@ class MediaFileSystemRegistry::MediaFileSystemContextImpl |
| DISALLOW_COPY_AND_ASSIGN(MediaFileSystemContextImpl); |
| }; |
| +// Constructor in 'private' section because depends on private class definition. |
| MediaFileSystemRegistry::MediaFileSystemRegistry() |
| - : file_system_context_(new MediaFileSystemContextImpl(this)) { |
| + : weak_factory_(this), |
| + file_system_context_(new MediaFileSystemContextImpl(this)) { |
| StorageMonitor::GetInstance()->AddObserver(this); |
| } |
| @@ -633,6 +596,44 @@ MediaFileSystemRegistry::~MediaFileSystemRegistry() { |
| DCHECK(mtp_device_delegate_map_.empty()); |
| } |
| +void MediaFileSystemRegistry::FinishGetMediaFileSystemsForExtension( |
| + const content::RenderViewHost* rvh, |
| + const extensions::Extension* extension, |
| + const MediaFileSystemsCallback& callback) { |
| + Profile* profile = |
| + Profile::FromBrowserContext(rvh->GetProcess()->GetBrowserContext()); |
| + MediaGalleriesPreferences* preferences = GetPreferences(profile); |
| + DCHECK(preferences->IsInitialized()); |
| + MediaGalleryPrefIdSet galleries = |
| + preferences->GalleriesForExtension(*extension); |
| + |
| + if (galleries.empty()) { |
| + callback.Run(std::vector<MediaFileSystemInfo>()); |
| + return; |
| + } |
| + |
| + ExtensionGalleriesHostMap::iterator extension_hosts = |
| + extension_hosts_map_.find(profile); |
| + if (extension_hosts->second.empty()) |
| + preferences->AddGalleryChangeObserver(this); |
| + |
| + ExtensionGalleriesHost* extension_host = |
| + extension_hosts->second[extension->id()].get(); |
| + if (!extension_host) { |
| + extension_host = new ExtensionGalleriesHost( |
| + file_system_context_.get(), |
| + base::Bind(&MediaFileSystemRegistry::OnExtensionGalleriesHostEmpty, |
| + base::Unretained(this), |
| + profile, |
| + extension->id())); |
| + extension_hosts_map_[profile][extension->id()] = extension_host; |
| + } |
| + extension_host->ReferenceFromRVH(rvh); |
| + |
| + extension_host->GetMediaFileSystems( |
| + galleries, preferences->known_galleries(), callback); |
| +} |
| + |
| void MediaFileSystemRegistry::OnPermissionRemoved( |
| MediaGalleriesPreferences* prefs, |
| const std::string& extension_id, |
| @@ -733,6 +734,7 @@ void MediaFileSystemRegistry::OnExtensionGalleriesHostEmpty( |
| // |extension_hosts| entry alone, since it indicates the profile has been |
| // previously used. |
| MediaGalleriesPreferences* preferences = GetPreferences(profile); |
| + DCHECK(preferences->IsInitialized()); |
| preferences->RemoveGalleryChangeObserver(this); |
| } |
| } |