| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // MediaFileSystemRegistry implementation. | 5 // MediaFileSystemRegistry implementation. |
| 6 | 6 |
| 7 #include "chrome/browser/media_gallery/media_file_system_registry.h" | 7 #include "chrome/browser/media_gallery/media_file_system_registry.h" |
| 8 | 8 |
| 9 #include <set> | 9 #include <set> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 const FilePath& fs_path, | 123 const FilePath& fs_path, |
| 124 const std::string& filesystem_id) | 124 const std::string& filesystem_id) |
| 125 : name(fs_name), | 125 : name(fs_name), |
| 126 path(fs_path), | 126 path(fs_path), |
| 127 fsid(filesystem_id) { | 127 fsid(filesystem_id) { |
| 128 } | 128 } |
| 129 | 129 |
| 130 MediaFileSystemInfo::MediaFileSystemInfo() {} | 130 MediaFileSystemInfo::MediaFileSystemInfo() {} |
| 131 | 131 |
| 132 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) | 132 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
| 133 | |
| 134 ScopedMTPDeviceMapEntry::ScopedMTPDeviceMapEntry( | 133 ScopedMTPDeviceMapEntry::ScopedMTPDeviceMapEntry( |
| 135 const FilePath::StringType& device_location, | 134 const FilePath::StringType& device_location) |
| 136 const base::Closure& no_references_callback) | 135 : device_location_(device_location) { |
| 137 : device_location_(device_location), | |
| 138 delegate_(new MTPDeviceDelegateImpl(device_location)), | |
| 139 no_references_callback_(no_references_callback) { | |
| 140 BrowserThread::PostTask( | 136 BrowserThread::PostTask( |
| 141 BrowserThread::IO, FROM_HERE, | 137 BrowserThread::IO, FROM_HERE, |
| 142 Bind(&MTPDeviceMapService::AddDelegate, | 138 Bind(&MTPDeviceMapService::AddDelegate, |
| 143 base::Unretained(MTPDeviceMapService::GetInstance()), | 139 base::Unretained(MTPDeviceMapService::GetInstance()), |
| 144 device_location_, make_scoped_refptr(delegate_))); | 140 device_location_, |
| 141 new MTPDeviceDelegateImpl(device_location))); |
| 145 } | 142 } |
| 146 | 143 |
| 147 ScopedMTPDeviceMapEntry::~ScopedMTPDeviceMapEntry() { | 144 ScopedMTPDeviceMapEntry::~ScopedMTPDeviceMapEntry() { |
| 148 BrowserThread::PostTask( | 145 BrowserThread::PostTask( |
| 149 BrowserThread::IO, FROM_HERE, | 146 BrowserThread::IO, FROM_HERE, |
| 150 Bind(&MTPDeviceMapService::RemoveDelegate, | 147 Bind(&MTPDeviceMapService::RemoveDelegate, |
| 151 base::Unretained(MTPDeviceMapService::GetInstance()), | 148 base::Unretained(MTPDeviceMapService::GetInstance()), |
| 152 device_location_)); | 149 device_location_)); |
| 153 no_references_callback_.Run(); | |
| 154 } | 150 } |
| 155 | 151 #endif |
| 156 #endif // defined(SUPPORT_MTP_DEVICE_FILESYSTEM) | |
| 157 | 152 |
| 158 // The main owner of this class is | 153 // The main owner of this class is |
| 159 // |MediaFileSystemRegistry::extension_hosts_map_|, but a callback may | 154 // |MediaFileSystemRegistry::extension_hosts_map_|, but a callback may |
| 160 // temporarily hold a reference. | 155 // temporarily hold a reference. |
| 161 class ExtensionGalleriesHost | 156 class ExtensionGalleriesHost |
| 162 : public base::RefCountedThreadSafe<ExtensionGalleriesHost>, | 157 : public base::RefCountedThreadSafe<ExtensionGalleriesHost>, |
| 163 public content::NotificationObserver { | 158 public content::NotificationObserver { |
| 164 public: | 159 public: |
| 165 // |no_references_callback| is called when the last RenderViewHost reference | 160 // |no_references_callback| is called when the last RenderViewHost reference |
| 166 // goes away. RenderViewHost references are added through ReferenceFromRVH(). | 161 // goes away. RenderViewHost references are added through ReferenceFromRVH(). |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 // Revoke the file system for |id| if this extension has created one for |id|. | 211 // Revoke the file system for |id| if this extension has created one for |id|. |
| 217 void RevokeGalleryByPrefId(MediaGalleryPrefId id) { | 212 void RevokeGalleryByPrefId(MediaGalleryPrefId id) { |
| 218 PrefIdFsInfoMap::iterator gallery = pref_id_map_.find(id); | 213 PrefIdFsInfoMap::iterator gallery = pref_id_map_.find(id); |
| 219 if (gallery == pref_id_map_.end()) | 214 if (gallery == pref_id_map_.end()) |
| 220 return; | 215 return; |
| 221 | 216 |
| 222 file_system_context_->RevokeFileSystem(gallery->second.fsid); | 217 file_system_context_->RevokeFileSystem(gallery->second.fsid); |
| 223 pref_id_map_.erase(gallery); | 218 pref_id_map_.erase(gallery); |
| 224 | 219 |
| 225 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) | 220 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
| 226 MediaDeviceEntryReferencesMap::iterator mtp_device_host = | 221 for (MTPDeviceGalleryReferencesMap::iterator it = |
| 227 media_device_map_references_.find(id); | 222 mtp_device_gallery_references_.begin(); |
| 228 if (mtp_device_host != media_device_map_references_.end()) | 223 it != mtp_device_gallery_references_.end(); ++it) { |
| 229 media_device_map_references_.erase(mtp_device_host); | 224 MediaGalleryPrefIdSet::iterator found = it->second.find(id); |
| 225 if (found == it->second.end()) |
| 226 continue; |
| 227 it->second.erase(id); |
| 228 if (it->second.empty()) { |
| 229 file_system_context_->RemoveMTPDeviceReferenceForHost(it->first, this); |
| 230 mtp_device_gallery_references_.erase(it); |
| 231 } |
| 232 break; |
| 233 } |
| 230 #endif | 234 #endif |
| 231 | 235 |
| 232 if (pref_id_map_.empty()) { | 236 if (pref_id_map_.empty()) { |
| 233 rph_refs_.clear(); | 237 rph_refs_.clear(); |
| 234 CleanUp(); | 238 CleanUp(); |
| 235 } | 239 } |
| 236 } | 240 } |
| 237 | 241 |
| 238 // Indicate that the passed |rvh| will reference the file system ids created | 242 // Indicate that the passed |rvh| will reference the file system ids created |
| 239 // by this class. It is safe to call this multiple times with the same RVH. | 243 // by this class. It is safe to call this multiple times with the same RVH. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 255 if (rph_refs_[rph].size() == 1) { | 259 if (rph_refs_[rph].size() == 1) { |
| 256 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, | 260 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, |
| 257 content::Source<RenderProcessHost>(rph)); | 261 content::Source<RenderProcessHost>(rph)); |
| 258 } | 262 } |
| 259 } | 263 } |
| 260 | 264 |
| 261 private: | 265 private: |
| 262 typedef std::map<MediaGalleryPrefId, MediaFileSystemInfo> | 266 typedef std::map<MediaGalleryPrefId, MediaFileSystemInfo> |
| 263 PrefIdFsInfoMap; | 267 PrefIdFsInfoMap; |
| 264 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) | 268 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
| 265 typedef std::map<MediaGalleryPrefId, | 269 typedef std::map<const FilePath::StringType, MediaGalleryPrefIdSet> |
| 266 scoped_refptr<ScopedMTPDeviceMapEntry> > | 270 MTPDeviceGalleryReferencesMap; |
| 267 MediaDeviceEntryReferencesMap; | |
| 268 #endif | 271 #endif |
| 269 typedef std::map<const RenderProcessHost*, std::set<const WebContents*> > | 272 typedef std::map<const RenderProcessHost*, std::set<const WebContents*> > |
| 270 RenderProcessHostRefCount; | 273 RenderProcessHostRefCount; |
| 271 | 274 |
| 272 // Private destructor and friend declaration for ref counted implementation. | 275 // Private destructor and friend declaration for ref counted implementation. |
| 273 friend class base::RefCountedThreadSafe<ExtensionGalleriesHost>; | 276 friend class base::RefCountedThreadSafe<ExtensionGalleriesHost>; |
| 274 | 277 |
| 275 virtual ~ExtensionGalleriesHost() { | 278 virtual ~ExtensionGalleriesHost() { |
| 276 DCHECK(rph_refs_.empty()); | 279 DCHECK(rph_refs_.empty()); |
| 277 DCHECK(pref_id_map_.empty()); | 280 DCHECK(pref_id_map_.empty()); |
| 278 | 281 |
| 279 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) | 282 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
| 280 DCHECK(media_device_map_references_.empty()); | 283 DCHECK(mtp_device_gallery_references_.empty()); |
| 281 #endif | 284 #endif |
| 282 } | 285 } |
| 283 | 286 |
| 284 // NotificationObserver implementation. | 287 // NotificationObserver implementation. |
| 285 virtual void Observe(int type, | 288 virtual void Observe(int type, |
| 286 const content::NotificationSource& source, | 289 const content::NotificationSource& source, |
| 287 const content::NotificationDetails& details) OVERRIDE { | 290 const content::NotificationDetails& details) OVERRIDE { |
| 288 switch (type) { | 291 switch (type) { |
| 289 case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: { | 292 case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: { |
| 290 OnRendererProcessTerminated( | 293 OnRendererProcessTerminated( |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 FilePath path = gallery_info.AbsolutePath(); | 342 FilePath path = gallery_info.AbsolutePath(); |
| 340 if (!path.IsAbsolute()) | 343 if (!path.IsAbsolute()) |
| 341 continue; | 344 continue; |
| 342 | 345 |
| 343 std::string fsid; | 346 std::string fsid; |
| 344 if (MediaStorageUtil::IsMassStorageDevice(device_id)) { | 347 if (MediaStorageUtil::IsMassStorageDevice(device_id)) { |
| 345 fsid = file_system_context_->RegisterFileSystemForMassStorage( | 348 fsid = file_system_context_->RegisterFileSystemForMassStorage( |
| 346 device_id, path); | 349 device_id, path); |
| 347 } else { | 350 } else { |
| 348 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) | 351 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
| 349 scoped_refptr<ScopedMTPDeviceMapEntry> mtp_device_host; | |
| 350 fsid = file_system_context_->RegisterFileSystemForMTPDevice( | 352 fsid = file_system_context_->RegisterFileSystemForMTPDevice( |
| 351 device_id, path, &mtp_device_host); | 353 device_id, path, this); |
| 352 DCHECK(mtp_device_host.get()); | 354 mtp_device_gallery_references_[path.value()].insert(pref_id); |
| 353 media_device_map_references_[pref_id] = mtp_device_host; | |
| 354 #else | 355 #else |
| 355 NOTIMPLEMENTED(); | 356 NOTIMPLEMENTED(); |
| 356 continue; | 357 continue; |
| 357 #endif | 358 #endif |
| 358 } | 359 } |
| 359 DCHECK(!fsid.empty()); | 360 DCHECK(!fsid.empty()); |
| 360 | 361 |
| 361 MediaFileSystemInfo new_entry( | 362 MediaFileSystemInfo new_entry( |
| 362 MakeJSONFileSystemName(gallery_info.display_name, | 363 MakeJSONFileSystemName(gallery_info.display_name, |
| 363 pref_id, | 364 pref_id, |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 void CleanUp() { | 420 void CleanUp() { |
| 420 DCHECK(rph_refs_.empty()); | 421 DCHECK(rph_refs_.empty()); |
| 421 for (PrefIdFsInfoMap::const_iterator it = pref_id_map_.begin(); | 422 for (PrefIdFsInfoMap::const_iterator it = pref_id_map_.begin(); |
| 422 it != pref_id_map_.end(); | 423 it != pref_id_map_.end(); |
| 423 ++it) { | 424 ++it) { |
| 424 file_system_context_->RevokeFileSystem(it->second.fsid); | 425 file_system_context_->RevokeFileSystem(it->second.fsid); |
| 425 } | 426 } |
| 426 pref_id_map_.clear(); | 427 pref_id_map_.clear(); |
| 427 | 428 |
| 428 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) | 429 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
| 429 media_device_map_references_.clear(); | 430 for (MTPDeviceGalleryReferencesMap::iterator it = |
| 431 mtp_device_gallery_references_.begin(); |
| 432 it != mtp_device_gallery_references_.end(); ++it) { |
| 433 file_system_context_->RemoveMTPDeviceReferenceForHost(it->first, this); |
| 434 } |
| 435 mtp_device_gallery_references_.clear(); |
| 430 #endif | 436 #endif |
| 431 | |
| 432 registrar_.RemoveAll(); | 437 registrar_.RemoveAll(); |
| 433 | |
| 434 no_references_callback_.Run(); | 438 no_references_callback_.Run(); |
| 435 } | 439 } |
| 436 | 440 |
| 437 // MediaFileSystemRegistry owns |this| and |file_system_context_|, so it's | 441 // MediaFileSystemRegistry owns |this| and |file_system_context_|, so it's |
| 438 // safe to store a raw pointer. | 442 // safe to store a raw pointer. |
| 439 MediaFileSystemContext* file_system_context_; | 443 MediaFileSystemContext* file_system_context_; |
| 440 | 444 |
| 441 // A callback to call when the last RVH reference goes away. | 445 // A callback to call when the last RVH reference goes away. |
| 442 base::Closure no_references_callback_; | 446 base::Closure no_references_callback_; |
| 443 | 447 |
| 444 // A map from the gallery preferences id to the file system information. | 448 // A map from the gallery preferences id to the file system information. |
| 445 PrefIdFsInfoMap pref_id_map_; | 449 PrefIdFsInfoMap pref_id_map_; |
| 446 | 450 |
| 447 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) | 451 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
| 448 // A map from the gallery preferences id to the corresponding media device | 452 // A map from the MTP device id to a set of media galleries that references to |
| 449 // host object. | 453 // that device. |
| 450 MediaDeviceEntryReferencesMap media_device_map_references_; | 454 MTPDeviceGalleryReferencesMap mtp_device_gallery_references_; |
| 451 #endif | 455 #endif |
| 452 | 456 |
| 453 // The set of render processes and web contents that may have references to | 457 // The set of render processes and web contents that may have references to |
| 454 // the file system ids this instance manages. | 458 // the file system ids this instance manages. |
| 455 RenderProcessHostRefCount rph_refs_; | 459 RenderProcessHostRefCount rph_refs_; |
| 456 | 460 |
| 457 // A registrar for listening notifications. | 461 // A registrar for listening notifications. |
| 458 content::NotificationRegistrar registrar_; | 462 content::NotificationRegistrar registrar_; |
| 459 | 463 |
| 460 DISALLOW_COPY_AND_ASSIGN(ExtensionGalleriesHost); | 464 DISALLOW_COPY_AND_ASSIGN(ExtensionGalleriesHost); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 existing_devices[i].name, FilePath(), | 537 existing_devices[i].name, FilePath(), |
| 534 false /*not user added*/); | 538 false /*not user added*/); |
| 535 } | 539 } |
| 536 return preferences; | 540 return preferences; |
| 537 } | 541 } |
| 538 | 542 |
| 539 void MediaFileSystemRegistry::OnRemovableStorageAttached( | 543 void MediaFileSystemRegistry::OnRemovableStorageAttached( |
| 540 const std::string& id, const string16& name, | 544 const std::string& id, const string16& name, |
| 541 const FilePath::StringType& location) { | 545 const FilePath::StringType& location) { |
| 542 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 546 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 543 | |
| 544 if (!MediaStorageUtil::IsMediaDevice(id)) | 547 if (!MediaStorageUtil::IsMediaDevice(id)) |
| 545 return; | 548 return; |
| 546 | 549 |
| 547 for (ExtensionGalleriesHostMap::iterator profile_it = | 550 for (ExtensionGalleriesHostMap::iterator profile_it = |
| 548 extension_hosts_map_.begin(); | 551 extension_hosts_map_.begin(); |
| 549 profile_it != extension_hosts_map_.end(); | 552 profile_it != extension_hosts_map_.end(); |
| 550 ++profile_it) { | 553 ++profile_it) { |
| 551 MediaGalleriesPreferences* preferences = GetPreferences(profile_it->first); | 554 MediaGalleriesPreferences* preferences = GetPreferences(profile_it->first); |
| 552 preferences->AddGallery(id, name, FilePath(), false /*not user added*/); | 555 preferences->AddGallery(id, name, FilePath(), false /*not user added*/); |
| 553 } | 556 } |
| 554 } | 557 } |
| 555 | 558 |
| 556 size_t MediaFileSystemRegistry::GetExtensionHostCountForTests() const { | 559 size_t MediaFileSystemRegistry::GetExtensionHostCountForTests() const { |
| 557 return extension_hosts_map_.size(); | 560 return extension_hosts_map_.size(); |
| 558 } | 561 } |
| 559 | 562 |
| 560 void MediaFileSystemRegistry::OnRemovableStorageDetached( | 563 void MediaFileSystemRegistry::OnRemovableStorageDetached( |
| 561 const std::string& id) { | 564 const std::string& id) { |
| 562 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 565 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 563 | |
| 564 // Since revoking a gallery in the ExtensionGalleriesHost may cause it | 566 // Since revoking a gallery in the ExtensionGalleriesHost may cause it |
| 565 // to be removed from the map and therefore invalidate any iterator pointing | 567 // to be removed from the map and therefore invalidate any iterator pointing |
| 566 // to it, this code first copies all the invalid gallery ids and the | 568 // to it, this code first copies all the invalid gallery ids and the |
| 567 // extension hosts in which they may appear (per profile) and revoked it in | 569 // extension hosts in which they may appear (per profile) and revoked it in |
| 568 // a second step. | 570 // a second step. |
| 569 std::vector<InvalidatedGalleriesInfo> invalid_galleries_info; | 571 std::vector<InvalidatedGalleriesInfo> invalid_galleries_info; |
| 570 | 572 |
| 571 for (ExtensionGalleriesHostMap::iterator profile_it = | 573 for (ExtensionGalleriesHostMap::iterator profile_it = |
| 572 extension_hosts_map_.begin(); | 574 extension_hosts_map_.begin(); |
| 573 profile_it != extension_hosts_map_.end(); | 575 profile_it != extension_hosts_map_.end(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 const std::string fsid = | 632 const std::string fsid = |
| 631 IsolatedContext::GetInstance()->RegisterFileSystemForPath( | 633 IsolatedContext::GetInstance()->RegisterFileSystemForPath( |
| 632 fileapi::kFileSystemTypeNativeMedia, path, &fs_name); | 634 fileapi::kFileSystemTypeNativeMedia, path, &fs_name); |
| 633 CHECK(!fsid.empty()); | 635 CHECK(!fsid.empty()); |
| 634 return fsid; | 636 return fsid; |
| 635 } | 637 } |
| 636 | 638 |
| 637 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) | 639 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
| 638 virtual std::string RegisterFileSystemForMTPDevice( | 640 virtual std::string RegisterFileSystemForMTPDevice( |
| 639 const std::string& device_id, const FilePath& path, | 641 const std::string& device_id, const FilePath& path, |
| 640 scoped_refptr<ScopedMTPDeviceMapEntry>* entry) { | 642 const ExtensionGalleriesHost* galleries_host) { |
| 641 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 643 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 642 DCHECK(!MediaStorageUtil::IsMassStorageDevice(device_id)); | 644 DCHECK(!MediaStorageUtil::IsMassStorageDevice(device_id)); |
| 643 | 645 |
| 644 // Sanity checks for |path|. | 646 // Sanity checks for |path|. |
| 645 CHECK(path.IsAbsolute()); | 647 CHECK(path.IsAbsolute()); |
| 646 CHECK(!path.ReferencesParent()); | 648 CHECK(!path.ReferencesParent()); |
| 647 std::string fs_name(extension_misc::kMediaFileSystemPathPart); | 649 std::string fs_name(extension_misc::kMediaFileSystemPathPart); |
| 648 const std::string fsid = | 650 const std::string fsid = |
| 649 IsolatedContext::GetInstance()->RegisterFileSystemForPath( | 651 IsolatedContext::GetInstance()->RegisterFileSystemForPath( |
| 650 fileapi::kFileSystemTypeDeviceMedia, path, &fs_name); | 652 fileapi::kFileSystemTypeDeviceMedia, path, &fs_name); |
| 651 CHECK(!fsid.empty()); | 653 CHECK(!fsid.empty()); |
| 652 DCHECK(entry); | 654 registry_->AddGalleriesHostReferenceForMTPDevice(path.value(), |
| 653 *entry = registry_->GetOrCreateScopedMTPDeviceMapEntry(path.value()); | 655 galleries_host); |
| 654 return fsid; | 656 return fsid; |
| 655 } | 657 } |
| 658 |
| 659 virtual void RemoveMTPDeviceReferenceForHost( |
| 660 const FilePath::StringType& device_location, |
| 661 const ExtensionGalleriesHost* galleries_host) { |
| 662 registry_->RemoveGalleriesHostReferenceForMTPDevice(device_location, |
| 663 galleries_host); |
| 664 } |
| 656 #endif | 665 #endif |
| 657 | 666 |
| 658 virtual void RevokeFileSystem(const std::string& fsid) { | 667 virtual void RevokeFileSystem(const std::string& fsid) { |
| 659 IsolatedContext::GetInstance()->RevokeFileSystem(fsid); | 668 IsolatedContext::GetInstance()->RevokeFileSystem(fsid); |
| 660 } | 669 } |
| 661 | 670 |
| 662 private: | 671 private: |
| 663 MediaFileSystemRegistry* registry_; | 672 MediaFileSystemRegistry* registry_; |
| 664 | 673 |
| 665 DISALLOW_COPY_AND_ASSIGN(MediaFileSystemContextImpl); | 674 DISALLOW_COPY_AND_ASSIGN(MediaFileSystemContextImpl); |
| 666 }; | 675 }; |
| 667 | 676 |
| 668 MediaFileSystemRegistry::MediaFileSystemRegistry() | 677 MediaFileSystemRegistry::MediaFileSystemRegistry() |
| 669 : file_system_context_(new MediaFileSystemContextImpl(this)) { | 678 : file_system_context_(new MediaFileSystemContextImpl(this)) { |
| 670 // SystemMonitor may be NULL in unit tests. | 679 // SystemMonitor may be NULL in unit tests. |
| 671 SystemMonitor* system_monitor = SystemMonitor::Get(); | 680 SystemMonitor* system_monitor = SystemMonitor::Get(); |
| 672 if (system_monitor) | 681 if (system_monitor) |
| 673 system_monitor->AddDevicesChangedObserver(this); | 682 system_monitor->AddDevicesChangedObserver(this); |
| 674 } | 683 } |
| 675 | 684 |
| 676 MediaFileSystemRegistry::~MediaFileSystemRegistry() { | 685 MediaFileSystemRegistry::~MediaFileSystemRegistry() { |
| 677 // SystemMonitor may be NULL in unit tests. | 686 // SystemMonitor may be NULL in unit tests. |
| 678 SystemMonitor* system_monitor = SystemMonitor::Get(); | 687 SystemMonitor* system_monitor = SystemMonitor::Get(); |
| 679 if (system_monitor) | 688 if (system_monitor) |
| 680 system_monitor->RemoveDevicesChangedObserver(this); | 689 system_monitor->RemoveDevicesChangedObserver(this); |
| 690 DCHECK(mtp_device_delegate_map_.empty()); |
| 691 DCHECK(mtp_device_references_map_.empty()); |
| 681 } | 692 } |
| 682 | 693 |
| 683 void MediaFileSystemRegistry::OnMediaGalleriesRememberedGalleriesChanged( | 694 void MediaFileSystemRegistry::OnMediaGalleriesRememberedGalleriesChanged( |
| 684 PrefServiceBase* prefs) { | 695 PrefServiceBase* prefs) { |
| 685 // Find the Profile that contains the source PrefService. | 696 // Find the Profile that contains the source PrefService. |
| 686 PrefChangeRegistrarMap::iterator pref_change_it = | 697 PrefChangeRegistrarMap::iterator pref_change_it = |
| 687 pref_change_registrar_map_.begin(); | 698 pref_change_registrar_map_.begin(); |
| 688 for (; pref_change_it != pref_change_registrar_map_.end(); ++pref_change_it) { | 699 for (; pref_change_it != pref_change_registrar_map_.end(); ++pref_change_it) { |
| 689 if (pref_change_it->first->GetPrefs() == prefs) | 700 if (pref_change_it->first->GetPrefs() == prefs) |
| 690 break; | 701 break; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 710 gallery_host_it != extension_host_map.end(); | 721 gallery_host_it != extension_host_map.end(); |
| 711 ++gallery_host_it) { | 722 ++gallery_host_it) { |
| 712 const extensions::Extension* extension = | 723 const extensions::Extension* extension = |
| 713 extensions_set->GetByID(gallery_host_it->first); | 724 extensions_set->GetByID(gallery_host_it->first); |
| 714 gallery_host_it->second->RevokeOldGalleries( | 725 gallery_host_it->second->RevokeOldGalleries( |
| 715 preferences->GalleriesForExtension(*extension)); | 726 preferences->GalleriesForExtension(*extension)); |
| 716 } | 727 } |
| 717 } | 728 } |
| 718 | 729 |
| 719 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) | 730 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
| 720 ScopedMTPDeviceMapEntry* | 731 void MediaFileSystemRegistry::AddGalleriesHostReferenceForMTPDevice( |
| 721 MediaFileSystemRegistry::GetOrCreateScopedMTPDeviceMapEntry( | 732 const FilePath::StringType& device_location, |
| 722 const FilePath::StringType& device_location) { | 733 const ExtensionGalleriesHost* galleries_host) { |
| 723 MTPDeviceDelegateMap::iterator delegate_it = | 734 MTPDeviceDelegateMap::iterator delegate_it = |
| 724 mtp_delegate_map_.find(device_location); | 735 mtp_device_delegate_map_.find(device_location); |
| 725 if (delegate_it != mtp_delegate_map_.end() && delegate_it->second.get()) | 736 if (delegate_it == mtp_device_delegate_map_.end()) { |
| 726 return delegate_it->second; | 737 mtp_device_delegate_map_[device_location] = |
| 727 ScopedMTPDeviceMapEntry* mtp_device_host = new ScopedMTPDeviceMapEntry( | 738 new ScopedMTPDeviceMapEntry(device_location); |
| 728 device_location, base::Bind( | 739 } |
| 729 &MediaFileSystemRegistry::RemoveScopedMTPDeviceMapEntry, | 740 mtp_device_references_map_[device_location].insert(galleries_host); |
| 730 base::Unretained(this), device_location)); | |
| 731 mtp_delegate_map_[device_location] = mtp_device_host->AsWeakPtr(); | |
| 732 return mtp_device_host; | |
| 733 } | 741 } |
| 734 | 742 |
| 735 void MediaFileSystemRegistry::RemoveScopedMTPDeviceMapEntry( | 743 void MediaFileSystemRegistry::RemoveGalleriesHostReferenceForMTPDevice( |
| 736 const FilePath::StringType& device_location) { | 744 const FilePath::StringType& device_location, |
| 737 MTPDeviceDelegateMap::iterator delegate_it = | 745 const ExtensionGalleriesHost* galleries_host) { |
| 738 mtp_delegate_map_.find(device_location); | 746 MTPDeviceReferencesMap::iterator hosts_it = |
| 739 DCHECK(delegate_it != mtp_delegate_map_.end()); | 747 mtp_device_references_map_.find(device_location); |
| 740 mtp_delegate_map_.erase(delegate_it); | 748 DCHECK(hosts_it != mtp_device_references_map_.end()); |
| 749 DCHECK(hosts_it->second.find(galleries_host) != hosts_it->second.end()); |
| 750 hosts_it->second.erase(galleries_host); |
| 751 if (hosts_it->second.empty()) { |
| 752 delete mtp_device_delegate_map_[device_location]; |
| 753 mtp_device_delegate_map_.erase(device_location); |
| 754 mtp_device_references_map_.erase(hosts_it); |
| 755 } |
| 741 } | 756 } |
| 742 #endif | 757 #endif |
| 743 | 758 |
| 744 void MediaFileSystemRegistry::OnExtensionGalleriesHostEmpty( | 759 void MediaFileSystemRegistry::OnExtensionGalleriesHostEmpty( |
| 745 Profile* profile, const std::string& extension_id) { | 760 Profile* profile, const std::string& extension_id) { |
| 746 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 761 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 747 | 762 |
| 748 ExtensionGalleriesHostMap::iterator extension_hosts = | 763 ExtensionGalleriesHostMap::iterator extension_hosts = |
| 749 extension_hosts_map_.find(profile); | 764 extension_hosts_map_.find(profile); |
| 750 DCHECK(extension_hosts != extension_hosts_map_.end()); | 765 DCHECK(extension_hosts != extension_hosts_map_.end()); |
| 751 ExtensionHostMap::size_type erase_count = | 766 ExtensionHostMap::size_type erase_count = |
| 752 extension_hosts->second.erase(extension_id); | 767 extension_hosts->second.erase(extension_id); |
| 753 DCHECK_EQ(1U, erase_count); | 768 DCHECK_EQ(1U, erase_count); |
| 754 if (extension_hosts->second.empty()) { | 769 if (extension_hosts->second.empty()) { |
| 755 extension_hosts_map_.erase(extension_hosts); | 770 extension_hosts_map_.erase(extension_hosts); |
| 756 | 771 |
| 757 PrefChangeRegistrarMap::iterator pref_it = | 772 PrefChangeRegistrarMap::iterator pref_it = |
| 758 pref_change_registrar_map_.find(profile); | 773 pref_change_registrar_map_.find(profile); |
| 759 DCHECK(pref_it != pref_change_registrar_map_.end()); | 774 DCHECK(pref_it != pref_change_registrar_map_.end()); |
| 760 delete pref_it->second; | 775 delete pref_it->second; |
| 761 pref_change_registrar_map_.erase(pref_it); | 776 pref_change_registrar_map_.erase(pref_it); |
| 762 } | 777 } |
| 763 } | 778 } |
| 764 | 779 |
| 765 } // namespace chrome | 780 } // namespace chrome |
| OLD | NEW |