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 534a6971dd0a9b8951ed8cce52978b8163c8d1cf..e173dfb9ea3a6674365c34ac38e466194f7be2f7 100644 |
--- a/chrome/browser/media_galleries/media_file_system_registry.cc |
+++ b/chrome/browser/media_galleries/media_file_system_registry.cc |
@@ -148,7 +148,14 @@ class RPHReferenceManager : public content::NotificationObserver { |
void OnRendererProcessTerminated(const RenderProcessHost* rph) { |
RPHRefCount::iterator rph_info = refs_.find(rph); |
- DCHECK(rph_info != refs_.end()); |
+ // This could be a potential problem if the RPH is navigated to |
+ // a page on the same renderer (triggering OWCDON()) and then |
+ // the renderer crashes. |
+ if (rph_info == refs_.end()) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
delete rph_info->second; |
refs_.erase(rph_info); |
if (refs_.empty()) |
@@ -287,7 +294,6 @@ class ExtensionGalleriesHost |
virtual ~ExtensionGalleriesHost() { |
DCHECK(rph_refs_.empty()); |
DCHECK(pref_id_map_.empty()); |
- |
} |
void GetMediaFileSystemsForAttachedDevices( |
@@ -296,6 +302,15 @@ class ExtensionGalleriesHost |
const MediaGalleriesPrefInfoMap& galleries_info, |
const MediaFileSystemsCallback& callback) { |
std::vector<MediaFileSystemInfo> result; |
+ |
+ if (rph_refs_.empty()) { |
+ // We're actually in the middle of shutdown, and Filter...() lagging |
+ // which can invoke this method interleaved in the destruction callback |
+ // sequence and re-populate pref_id_map_. |
+ callback.Run(result); |
+ return; |
+ } |
+ |
MediaGalleryPrefIdSet new_galleries; |
for (std::set<MediaGalleryPrefId>::const_iterator pref_id_it = |
galleries.begin(); |
@@ -421,6 +436,8 @@ void MediaFileSystemRegistry::GetMediaFileSystemsForExtension( |
extension->id())); |
extension_hosts_map_[profile][extension->id()] = extension_host; |
} |
+ // This must come before the GetMediaFileSystems call to make sure the |
+ // RVH of the context is referenced before the filesystems are retrieved. |
extension_host->ReferenceFromRVH(rvh); |
extension_host->GetMediaFileSystems(galleries, preferences->known_galleries(), |