Index: chrome/browser/media_gallery/media_file_system_registry.cc |
diff --git a/chrome/browser/media_gallery/media_file_system_registry.cc b/chrome/browser/media_gallery/media_file_system_registry.cc |
index 797ee05b011c98df42df0a6d0e5707b9d82e3890..f4361a4a080193fa9632f90d9d9d32c6530d8933 100644 |
--- a/chrome/browser/media_gallery/media_file_system_registry.cc |
+++ b/chrome/browser/media_gallery/media_file_system_registry.cc |
@@ -130,18 +130,15 @@ MediaFileSystemInfo::MediaFileSystemInfo(const std::string& fs_name, |
MediaFileSystemInfo::MediaFileSystemInfo() {} |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- |
ScopedMTPDeviceMapEntry::ScopedMTPDeviceMapEntry( |
- const FilePath::StringType& device_location, |
- const base::Closure& no_references_callback) |
- : device_location_(device_location), |
- delegate_(new MTPDeviceDelegateImpl(device_location)), |
- no_references_callback_(no_references_callback) { |
+ const FilePath::StringType& device_location) |
+ : device_location_(device_location) { |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
Bind(&MTPDeviceMapService::AddDelegate, |
base::Unretained(MTPDeviceMapService::GetInstance()), |
- device_location_, make_scoped_refptr(delegate_))); |
+ device_location_, |
+ new MTPDeviceDelegateImpl(device_location))); |
} |
ScopedMTPDeviceMapEntry::~ScopedMTPDeviceMapEntry() { |
@@ -150,10 +147,8 @@ ScopedMTPDeviceMapEntry::~ScopedMTPDeviceMapEntry() { |
Bind(&MTPDeviceMapService::RemoveDelegate, |
base::Unretained(MTPDeviceMapService::GetInstance()), |
device_location_)); |
- no_references_callback_.Run(); |
} |
- |
-#endif // defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
+#endif |
// The main owner of this class is |
// |MediaFileSystemRegistry::extension_hosts_map_|, but a callback may |
@@ -223,10 +218,19 @@ class ExtensionGalleriesHost |
pref_id_map_.erase(gallery); |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- MediaDeviceEntryReferencesMap::iterator mtp_device_host = |
- media_device_map_references_.find(id); |
- if (mtp_device_host != media_device_map_references_.end()) |
- media_device_map_references_.erase(mtp_device_host); |
+ for (MTPDeviceGalleryReferencesMap::iterator it = |
+ mtp_device_gallery_references_.begin(); |
+ it != mtp_device_gallery_references_.end(); ++it) { |
+ MediaGalleryPrefIdSet::iterator found = it->second.find(id); |
+ if (found == it->second.end()) |
+ continue; |
+ it->second.erase(id); |
+ if (it->second.empty()) { |
+ file_system_context_->RemoveMTPDeviceReferenceForHost(it->first, this); |
+ mtp_device_gallery_references_.erase(it); |
+ } |
+ break; |
+ } |
#endif |
if (pref_id_map_.empty()) { |
@@ -262,9 +266,8 @@ class ExtensionGalleriesHost |
typedef std::map<MediaGalleryPrefId, MediaFileSystemInfo> |
PrefIdFsInfoMap; |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- typedef std::map<MediaGalleryPrefId, |
- scoped_refptr<ScopedMTPDeviceMapEntry> > |
- MediaDeviceEntryReferencesMap; |
+ typedef std::map<const FilePath::StringType, MediaGalleryPrefIdSet> |
+ MTPDeviceGalleryReferencesMap; |
#endif |
typedef std::map<const RenderProcessHost*, std::set<const WebContents*> > |
RenderProcessHostRefCount; |
@@ -277,7 +280,7 @@ class ExtensionGalleriesHost |
DCHECK(pref_id_map_.empty()); |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- DCHECK(media_device_map_references_.empty()); |
+ DCHECK(mtp_device_gallery_references_.empty()); |
#endif |
} |
@@ -346,11 +349,9 @@ class ExtensionGalleriesHost |
device_id, path); |
} else { |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- scoped_refptr<ScopedMTPDeviceMapEntry> mtp_device_host; |
fsid = file_system_context_->RegisterFileSystemForMTPDevice( |
- device_id, path, &mtp_device_host); |
- DCHECK(mtp_device_host.get()); |
- media_device_map_references_[pref_id] = mtp_device_host; |
+ device_id, path, this); |
+ mtp_device_gallery_references_[path.value()].insert(pref_id); |
#else |
NOTIMPLEMENTED(); |
continue; |
@@ -426,11 +427,14 @@ class ExtensionGalleriesHost |
pref_id_map_.clear(); |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- media_device_map_references_.clear(); |
+ for (MTPDeviceGalleryReferencesMap::iterator it = |
+ mtp_device_gallery_references_.begin(); |
+ it != mtp_device_gallery_references_.end(); ++it) { |
+ file_system_context_->RemoveMTPDeviceReferenceForHost(it->first, this); |
+ } |
+ mtp_device_gallery_references_.clear(); |
#endif |
- |
registrar_.RemoveAll(); |
- |
no_references_callback_.Run(); |
} |
@@ -445,9 +449,9 @@ class ExtensionGalleriesHost |
PrefIdFsInfoMap pref_id_map_; |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- // A map from the gallery preferences id to the corresponding media device |
- // host object. |
- MediaDeviceEntryReferencesMap media_device_map_references_; |
+ // A map from the MTP device id to a set of media galleries that references to |
+ // that device. |
+ MTPDeviceGalleryReferencesMap mtp_device_gallery_references_; |
#endif |
// The set of render processes and web contents that may have references to |
@@ -540,7 +544,6 @@ void MediaFileSystemRegistry::OnRemovableStorageAttached( |
const std::string& id, const string16& name, |
const FilePath::StringType& location) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
if (!MediaStorageUtil::IsMediaDevice(id)) |
return; |
@@ -560,7 +563,6 @@ size_t MediaFileSystemRegistry::GetExtensionHostCountForTests() const { |
void MediaFileSystemRegistry::OnRemovableStorageDetached( |
const std::string& id) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
// Since revoking a gallery in the ExtensionGalleriesHost may cause it |
// to be removed from the map and therefore invalidate any iterator pointing |
// to it, this code first copies all the invalid gallery ids and the |
@@ -637,7 +639,7 @@ class MediaFileSystemRegistry::MediaFileSystemContextImpl |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
virtual std::string RegisterFileSystemForMTPDevice( |
const std::string& device_id, const FilePath& path, |
- scoped_refptr<ScopedMTPDeviceMapEntry>* entry) { |
+ const ExtensionGalleriesHost* galleries_host) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!MediaStorageUtil::IsMassStorageDevice(device_id)); |
@@ -649,10 +651,17 @@ class MediaFileSystemRegistry::MediaFileSystemContextImpl |
IsolatedContext::GetInstance()->RegisterFileSystemForPath( |
fileapi::kFileSystemTypeDeviceMedia, path, &fs_name); |
CHECK(!fsid.empty()); |
- DCHECK(entry); |
- *entry = registry_->GetOrCreateScopedMTPDeviceMapEntry(path.value()); |
+ registry_->AddGalleriesHostReferenceForMTPDevice(path.value(), |
+ galleries_host); |
return fsid; |
} |
+ |
+ virtual void RemoveMTPDeviceReferenceForHost( |
+ const FilePath::StringType& device_location, |
+ const ExtensionGalleriesHost* galleries_host) { |
+ registry_->RemoveGalleriesHostReferenceForMTPDevice(device_location, |
+ galleries_host); |
+ } |
#endif |
virtual void RevokeFileSystem(const std::string& fsid) { |
@@ -678,6 +687,8 @@ MediaFileSystemRegistry::~MediaFileSystemRegistry() { |
SystemMonitor* system_monitor = SystemMonitor::Get(); |
if (system_monitor) |
system_monitor->RemoveDevicesChangedObserver(this); |
+ DCHECK(mtp_device_delegate_map_.empty()); |
+ DCHECK(mtp_device_references_map_.empty()); |
} |
void MediaFileSystemRegistry::OnMediaGalleriesRememberedGalleriesChanged( |
@@ -717,27 +728,31 @@ void MediaFileSystemRegistry::OnMediaGalleriesRememberedGalleriesChanged( |
} |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
-ScopedMTPDeviceMapEntry* |
-MediaFileSystemRegistry::GetOrCreateScopedMTPDeviceMapEntry( |
- const FilePath::StringType& device_location) { |
+void MediaFileSystemRegistry::AddGalleriesHostReferenceForMTPDevice( |
+ const FilePath::StringType& device_location, |
+ const ExtensionGalleriesHost* galleries_host) { |
MTPDeviceDelegateMap::iterator delegate_it = |
- mtp_delegate_map_.find(device_location); |
- if (delegate_it != mtp_delegate_map_.end() && delegate_it->second.get()) |
- return delegate_it->second; |
- ScopedMTPDeviceMapEntry* mtp_device_host = new ScopedMTPDeviceMapEntry( |
- device_location, base::Bind( |
- &MediaFileSystemRegistry::RemoveScopedMTPDeviceMapEntry, |
- base::Unretained(this), device_location)); |
- mtp_delegate_map_[device_location] = mtp_device_host->AsWeakPtr(); |
- return mtp_device_host; |
+ mtp_device_delegate_map_.find(device_location); |
+ if (delegate_it == mtp_device_delegate_map_.end()) { |
+ mtp_device_delegate_map_[device_location] = |
+ new ScopedMTPDeviceMapEntry(device_location); |
+ } |
+ mtp_device_references_map_[device_location].insert(galleries_host); |
} |
-void MediaFileSystemRegistry::RemoveScopedMTPDeviceMapEntry( |
- const FilePath::StringType& device_location) { |
- MTPDeviceDelegateMap::iterator delegate_it = |
- mtp_delegate_map_.find(device_location); |
- DCHECK(delegate_it != mtp_delegate_map_.end()); |
- mtp_delegate_map_.erase(delegate_it); |
+void MediaFileSystemRegistry::RemoveGalleriesHostReferenceForMTPDevice( |
+ const FilePath::StringType& device_location, |
+ const ExtensionGalleriesHost* galleries_host) { |
+ MTPDeviceReferencesMap::iterator hosts_it = |
+ mtp_device_references_map_.find(device_location); |
+ DCHECK(hosts_it != mtp_device_references_map_.end()); |
+ DCHECK(hosts_it->second.find(galleries_host) != hosts_it->second.end()); |
+ hosts_it->second.erase(galleries_host); |
+ if (hosts_it->second.empty()) { |
+ delete mtp_device_delegate_map_[device_location]; |
+ mtp_device_delegate_map_.erase(device_location); |
+ mtp_device_references_map_.erase(hosts_it); |
+ } |
} |
#endif |