Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Unified Diff: chrome/browser/media_galleries/media_file_system_registry.cc

Issue 24269007: Media Galleries API: Fix MediaGalleriesPreferences finders race. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}
}

Powered by Google App Engine
This is Rietveld 408576698