Index: chrome/browser/chromeos/file_manager/volume_manager.cc |
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.cc b/chrome/browser/chromeos/file_manager/volume_manager.cc |
index a1945b3012424462df7d0faf87832aa0c04f983f..03796335660428afd17ade79fef38ce6e0ba07a0 100644 |
--- a/chrome/browser/chromeos/file_manager/volume_manager.cc |
+++ b/chrome/browser/chromeos/file_manager/volume_manager.cc |
@@ -310,6 +310,9 @@ void VolumeManager::Initialize() { |
// Subscribe to DiskMountManager. |
disk_mount_manager_->AddObserver(this); |
+ disk_mount_manager_->EnsureMountInfoRefreshed( |
+ base::Bind(&VolumeManager::OnDiskMountManagerRefreshed, |
+ weak_ptr_factory_.GetWeakPtr())); |
// Subscribe to FileSystemProviderService and register currently mounted |
// volumes for the profile. |
@@ -326,54 +329,6 @@ void VolumeManager::Initialize() { |
} |
} |
- std::vector<VolumeInfo> archives; |
- |
- const chromeos::disks::DiskMountManager::MountPointMap& mount_points = |
- disk_mount_manager_->mount_points(); |
- for (chromeos::disks::DiskMountManager::MountPointMap::const_iterator it = |
- mount_points.begin(); |
- it != mount_points.end(); |
- ++it) { |
- if (it->second.mount_type == chromeos::MOUNT_TYPE_ARCHIVE) { |
- // Archives are mounted after other type of volumes. See below. |
- archives.push_back(CreateVolumeInfoFromMountPointInfo(it->second, NULL)); |
- continue; |
- } |
- DoMountEvent( |
- chromeos::MOUNT_ERROR_NONE, |
- CreateVolumeInfoFromMountPointInfo( |
- it->second, |
- disk_mount_manager_->FindDiskBySourcePath(it->second.source_path)), |
- kNotRemounting); |
- } |
- |
- // We mount archives only if they are opened from currently mounted volumes. |
- // To check the condition correctly in DoMountEvent, we care the order. |
- std::vector<bool> done(archives.size(), false); |
- for (size_t i = 0; i < archives.size(); ++i) { |
- if (!done[i]) { |
- std::vector<VolumeInfo> chain; |
- done[i] = true; |
- chain.push_back(archives[i]); |
- |
- // If archives[i]'s source_path is in another archive, mount it first. |
- for (size_t parent = 0; parent < archives.size(); ++parent) { |
- if (!done[parent] && |
- archives[parent].mount_path.IsParent(chain.back().source_path)) { |
- done[parent] = true; |
- chain.push_back(archives[parent]); |
- parent = 0; // Search archives[parent]'s parent from the beginning. |
- } |
- } |
- |
- // Mount from the tail of chain. |
- for (size_t i = chain.size(); i > 0; --i) |
- DoMountEvent(chromeos::MOUNT_ERROR_NONE, chain[i - 1], kNotRemounting); |
- } |
- } |
- |
- disk_mount_manager_->RequestMountInfoRefresh(); |
- |
// Subscribe to Profile Preference change. |
pref_change_registrar_.Init(profile_->GetPrefs()); |
pref_change_registrar_.Add( |
@@ -787,6 +742,60 @@ void VolumeManager::OnRemovableStorageDetached( |
} |
} |
+void VolumeManager::OnDiskMountManagerRefreshed(bool success) { |
+ if (!success) { |
+ LOG(ERROR) << "Failed to refresh disk mount manager"; |
+ return; |
+ } |
+ |
+ std::vector<VolumeInfo> archives; |
+ |
+ const chromeos::disks::DiskMountManager::MountPointMap& mount_points = |
+ disk_mount_manager_->mount_points(); |
+ for (chromeos::disks::DiskMountManager::MountPointMap::const_iterator it = |
+ mount_points.begin(); |
+ it != mount_points.end(); |
+ ++it) { |
+ if (it->second.mount_type == chromeos::MOUNT_TYPE_ARCHIVE) { |
+ // Archives are mounted after other types of volume. See below. |
+ archives.push_back(CreateVolumeInfoFromMountPointInfo(it->second, NULL)); |
+ continue; |
+ } |
+ DoMountEvent( |
+ chromeos::MOUNT_ERROR_NONE, |
+ CreateVolumeInfoFromMountPointInfo( |
+ it->second, |
+ disk_mount_manager_->FindDiskBySourcePath(it->second.source_path)), |
+ kNotRemounting); |
+ } |
+ |
+ // We mount archives only if they are opened from currently mounted volumes. |
+ // To check the condition correctly in DoMountEvent, we care about the order. |
+ std::vector<bool> done(archives.size(), false); |
+ for (size_t i = 0; i < archives.size(); ++i) { |
+ if (done[i]) |
+ continue; |
+ |
+ std::vector<VolumeInfo> chain; |
+ done[i] = true; |
+ chain.push_back(archives[i]); |
+ |
+ // If archives[i]'s source_path is in another archive, mount it first. |
+ for (size_t parent = i + 1; parent < archives.size(); ++parent) { |
+ if (!done[parent] && |
+ archives[parent].mount_path.IsParent(chain.back().source_path)) { |
+ done[parent] = true; |
+ chain.push_back(archives[parent]); |
+ parent = i + 1; // Search archives[parent]'s parent from the beginning. |
+ } |
+ } |
+ |
+ // Mount from the tail of chain. |
+ for (size_t i = chain.size(); i > 0; --i) |
+ DoMountEvent(chromeos::MOUNT_ERROR_NONE, chain[i - 1], kNotRemounting); |
+ } |
+} |
+ |
void VolumeManager::OnStorageMonitorInitialized() { |
std::vector<storage_monitor::StorageInfo> storages = |
storage_monitor::StorageMonitor::GetInstance()->GetAllAvailableStorages(); |