Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1492)

Unified Diff: chrome/browser/chromeos/drive/change_list_loader.cc

Issue 118993002: drive: Move FileSystem::LoadDirectoryIfNeeded to ChangeListLoader (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review fix Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/drive/change_list_loader.cc
diff --git a/chrome/browser/chromeos/drive/change_list_loader.cc b/chrome/browser/chromeos/drive/change_list_loader.cc
index ae18ccd05a73851d32a16c68f72db5cbaa9b649d..4b670479cb5243ae85f31c5f71b6c44bf65b8b76 100644
--- a/chrome/browser/chromeos/drive/change_list_loader.cc
+++ b/chrome/browser/chromeos/drive/change_list_loader.cc
@@ -360,24 +360,40 @@ void ChangeListLoader::CheckForUpdates(const FileOperationCallback& callback) {
}
}
-void ChangeListLoader::LoadIfNeeded(
- const DirectoryFetchInfo& directory_fetch_info,
+void ChangeListLoader::LoadDirectoryIfNeeded(
+ const base::FilePath& directory_path,
const FileOperationCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
- // If the resource metadata has been already loaded, for normal change list
- // fetch (= empty directory_fetch_info), we have nothing to do. For "fast
- // fetch", we need to schedule a fetching if a refresh is currently
- // running, because we don't want to wait a possibly large delta change
- // list to arrive.
- if (loaded_ && (directory_fetch_info.empty() || !IsRefreshing())) {
- base::MessageLoopProxy::current()->PostTask(
- FROM_HERE,
- base::Bind(callback, FILE_ERROR_OK));
+ // If the resource metadata has been already loaded and not refreshing, it
+ // means the local metadata is up to date.
+ if (loaded_ && !IsRefreshing()) {
+ callback.Run(FILE_ERROR_OK);
return;
}
- Load(directory_fetch_info, callback);
+
+ ResourceEntry* entry = new ResourceEntry;
+ base::PostTaskAndReplyWithResult(
+ blocking_task_runner_.get(),
+ FROM_HERE,
+ base::Bind(&ResourceMetadata::GetResourceEntryByPath,
+ base::Unretained(resource_metadata_),
+ directory_path,
+ entry),
+ base::Bind(&ChangeListLoader::LoadDirectoryIfNeededAfterGetEntry,
+ weak_ptr_factory_.GetWeakPtr(),
+ directory_path,
+ callback,
+ true, // should_try_loading_parent
+ base::Owned(entry)));
+}
+
+void ChangeListLoader::LoadForTesting(const FileOperationCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!callback.is_null());
+
+ Load(DirectoryFetchInfo(), callback);
}
void ChangeListLoader::GetAboutResource(
@@ -398,6 +414,76 @@ void ChangeListLoader::GetAboutResource(
}
}
+void ChangeListLoader::LoadDirectoryIfNeededAfterGetEntry(
+ const base::FilePath& directory_path,
+ const FileOperationCallback& callback,
+ bool should_try_loading_parent,
+ const ResourceEntry* entry,
+ FileError error) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!callback.is_null());
+
+ if (error == FILE_ERROR_NOT_FOUND &&
+ should_try_loading_parent &&
+ util::GetDriveGrandRootPath().IsParent(directory_path)) {
+ // This entry may be found after loading the parent.
+ LoadDirectoryIfNeeded(
+ directory_path.DirName(),
+ base::Bind(&ChangeListLoader::LoadDirectoryIfNeededAfterLoadParent,
+ weak_ptr_factory_.GetWeakPtr(),
+ directory_path,
+ callback));
+ return;
+ }
+ if (error != FILE_ERROR_OK) {
+ callback.Run(error);
+ return;
+ }
+
+ if (!entry->file_info().is_directory()) {
+ callback.Run(FILE_ERROR_NOT_A_DIRECTORY);
+ return;
+ }
+
+ // drive/other does not exist on the server.
+ if (entry->local_id() == util::kDriveOtherDirLocalId) {
+ callback.Run(FILE_ERROR_OK);
+ return;
+ }
+
+ Load(DirectoryFetchInfo(entry->resource_id(),
+ entry->directory_specific_info().changestamp()),
+ callback);
+}
+
+void ChangeListLoader::LoadDirectoryIfNeededAfterLoadParent(
+ const base::FilePath& directory_path,
+ const FileOperationCallback& callback,
+ FileError error) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!callback.is_null());
+
+ if (error != FILE_ERROR_OK) {
+ callback.Run(error);
+ return;
+ }
+
+ ResourceEntry* entry = new ResourceEntry;
+ base::PostTaskAndReplyWithResult(
+ blocking_task_runner_.get(),
+ FROM_HERE,
+ base::Bind(&ResourceMetadata::GetResourceEntryByPath,
+ base::Unretained(resource_metadata_),
+ directory_path,
+ entry),
+ base::Bind(&ChangeListLoader::LoadDirectoryIfNeededAfterGetEntry,
+ weak_ptr_factory_.GetWeakPtr(),
+ directory_path,
+ callback,
+ false, // should_try_loading_parent
+ base::Owned(entry)));
+}
+
void ChangeListLoader::Load(const DirectoryFetchInfo& directory_fetch_info,
const FileOperationCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
« no previous file with comments | « chrome/browser/chromeos/drive/change_list_loader.h ('k') | chrome/browser/chromeos/drive/change_list_loader_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698