| 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(
|
| + &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);
|
| }
|
| }
|
|
|