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 c97943dafa9d555e3807737842e9be7424b3c8fa..3b0b9e11cf1341b8203580a2ce184abfe7308fd3 100644 |
--- a/chrome/browser/media_gallery/media_file_system_registry.cc |
+++ b/chrome/browser/media_gallery/media_file_system_registry.cc |
@@ -106,11 +106,15 @@ std::string MakeJSONFileSystemName(const string16& name, |
} |
std::string GetTransientIdForRemovableDeviceId(const std::string& device_id) { |
+#if defined(OS_ANDROID) |
+ return std::string(); |
+#else |
using extensions::MediaGalleriesPrivateEventRouter; |
if (!MediaStorageUtil::IsRemovableDevice(device_id)) |
return std::string(); |
return MediaGalleriesPrivateEventRouter::GetTransientIdForDeviceId(device_id); |
+#endif // OS_ANDROID |
} |
} // namespace |
@@ -126,51 +130,30 @@ MediaFileSystemInfo::MediaFileSystemInfo(const std::string& fs_name, |
MediaFileSystemInfo::MediaFileSystemInfo() {} |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
-// Class to manage MTPDeviceDelegateImpl object for the attached MTP device. |
-// Refcounted to reuse the same MTP device delegate entry across extensions. |
-// This class supports WeakPtr (extends SupportsWeakPtr) to expose itself as |
-// a weak pointer to MediaFileSystemRegistry. |
-class ScopedMTPDeviceMapEntry |
- : public base::RefCounted<ScopedMTPDeviceMapEntry>, |
- public base::SupportsWeakPtr<ScopedMTPDeviceMapEntry> { |
- public: |
- // |no_references_callback| is called when the last ScopedMTPDeviceMapEntry |
- // reference goes away. |
- ScopedMTPDeviceMapEntry(const FilePath::StringType& device_location, |
- const base::Closure& no_references_callback) |
- : device_location_(device_location), |
- no_references_callback_(no_references_callback) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- Bind(&MTPDeviceMapService::AddDelegate, |
- base::Unretained(MTPDeviceMapService::GetInstance()), |
- device_location_, |
- make_scoped_refptr(new MTPDeviceDelegateImpl(device_location)))); |
- } |
- |
- private: |
- // Friend declaration for ref counted implementation. |
- friend class base::RefCounted<ScopedMTPDeviceMapEntry>; |
- |
- // Private because this class is ref-counted. |
- ~ScopedMTPDeviceMapEntry() { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- Bind(&MTPDeviceMapService::RemoveDelegate, |
- base::Unretained(MTPDeviceMapService::GetInstance()), |
- device_location_)); |
- no_references_callback_.Run(); |
- } |
- // Store the MTP or PTP device location. |
- const FilePath::StringType device_location_; |
+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) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ Bind(&MTPDeviceMapService::AddDelegate, |
+ base::Unretained(MTPDeviceMapService::GetInstance()), |
+ device_location_, make_scoped_refptr(delegate_))); |
+} |
- // A callback to call when the last reference of this object goes away. |
- base::Closure no_references_callback_; |
+ScopedMTPDeviceMapEntry::~ScopedMTPDeviceMapEntry() { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ Bind(&MTPDeviceMapService::RemoveDelegate, |
+ base::Unretained(MTPDeviceMapService::GetInstance()), |
+ device_location_)); |
+ no_references_callback_.Run(); |
+} |
- DISALLOW_COPY_AND_ASSIGN(ScopedMTPDeviceMapEntry); |
-}; |
-#endif |
+#endif // defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
// The main owner of this class is |
// |MediaFileSystemRegistry::extension_hosts_map_|, but a callback may |
@@ -245,6 +228,11 @@ class ExtensionGalleriesHost |
if (mtp_device_host != media_device_map_references_.end()) |
media_device_map_references_.erase(mtp_device_host); |
#endif |
+ |
+ if (pref_id_map_.empty()) { |
+ rph_refs_.clear(); |
+ CleanUp(); |
+ } |
} |
// Indicate that the passed |rvh| will reference the file system ids created |
@@ -265,7 +253,7 @@ class ExtensionGalleriesHost |
RenderProcessHost* rph = contents->GetRenderProcessHost(); |
rph_refs_[rph].insert(contents); |
if (rph_refs_[rph].size() == 1) { |
- registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
+ registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, |
content::Source<RenderProcessHost>(rph)); |
} |
} |
@@ -298,8 +286,8 @@ class ExtensionGalleriesHost |
const content::NotificationSource& source, |
const content::NotificationDetails& details) OVERRIDE { |
switch (type) { |
- case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { |
- OnRendererProcessClosed( |
+ case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: { |
+ OnRendererProcessTerminated( |
content::Source<RenderProcessHost>(source).ptr()); |
break; |
} |
@@ -381,12 +369,17 @@ class ExtensionGalleriesHost |
pref_id_map_[pref_id] = new_entry; |
} |
- RevokeOldGalleries(new_galleries); |
+ if (result.size() == 0) { |
+ rph_refs_.clear(); |
+ CleanUp(); |
+ } else { |
+ RevokeOldGalleries(new_galleries); |
+ } |
callback.Run(result); |
} |
- void OnRendererProcessClosed(const RenderProcessHost* rph) { |
+ void OnRendererProcessTerminated(const RenderProcessHost* rph) { |
RenderProcessHostRefCount::const_iterator rph_info = rph_refs_.find(rph); |
DCHECK(rph_info != rph_refs_.end()); |
// We're going to remove everything from the set, so we make a copy |
@@ -414,25 +407,31 @@ class ExtensionGalleriesHost |
DCHECK(process_refs != rph_refs_.end()); |
process_refs->second.erase(contents); |
if (process_refs->second.empty()) { |
- registrar_.Remove(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
+ registrar_.Remove(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, |
content::Source<RenderProcessHost>(rph)); |
rph_refs_.erase(process_refs); |
} |
- if (rph_refs_.empty()) { |
- for (PrefIdFsInfoMap::const_iterator it = pref_id_map_.begin(); |
- it != pref_id_map_.end(); |
- ++it) { |
- file_system_context_->RevokeFileSystem(it->second.fsid); |
- } |
- pref_id_map_.clear(); |
+ if (rph_refs_.empty()) |
+ CleanUp(); |
+ } |
+ |
+ void CleanUp() { |
+ DCHECK(rph_refs_.empty()); |
+ for (PrefIdFsInfoMap::const_iterator it = pref_id_map_.begin(); |
+ it != pref_id_map_.end(); |
+ ++it) { |
+ file_system_context_->RevokeFileSystem(it->second.fsid); |
+ } |
+ pref_id_map_.clear(); |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- media_device_map_references_.clear(); |
+ media_device_map_references_.clear(); |
#endif |
- no_references_callback_.Run(); |
- } |
+ registrar_.RemoveAll(); |
+ |
+ no_references_callback_.Run(); |
} |
// MediaFileSystemRegistry owns |this| and |file_system_context_|, so it's |
@@ -549,6 +548,10 @@ void MediaFileSystemRegistry::OnRemovableStorageAttached( |
} |
} |
+size_t MediaFileSystemRegistry::GetExtensionHostCountForTests() const { |
+ return extension_hosts_map_.size(); |
+} |
+ |
void MediaFileSystemRegistry::OnRemovableStorageDetached( |
const std::string& id) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |