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 571213726c2da11e2d10c033acc25f65c7eaa28e..cd4d316d01a89a8f0c27c7abf962ee8c91057229 100644 |
--- a/chrome/browser/chromeos/drive/change_list_loader.cc |
+++ b/chrome/browser/chromeos/drive/change_list_loader.cc |
@@ -207,8 +207,9 @@ void ChangeListLoader::CompareChangestampsAndLoadIfNeeded( |
int64 start_changestamp = local_changestamp > 0 ? local_changestamp + 1 : 0; |
if (start_changestamp == 0 && !about_resource.get()) { |
// Full update needs AboutResource. If this is a full update, we should just |
- // give up. |
- callback.Run(DRIVE_FILE_ERROR_FAILED); |
+ // give up. Note that to exit from the feed loading, we always have to flush |
+ // the pending callback tasks via OnChangeListLoadComplete. |
+ OnChangeListLoadComplete(callback, DRIVE_FILE_ERROR_FAILED); |
return; |
} |
@@ -235,8 +236,14 @@ void ChangeListLoader::CompareChangestampsAndLoadIfNeeded( |
start_changestamp, |
callback)); |
} else { |
- // The directory is up-to-date, hence there is no need to load. |
- OnChangeListLoadComplete(callback, DRIVE_FILE_OK); |
+ // The directory is up-to-date, but not the case for other parts. |
+ // Proceed to change list loading. StartLoadChangeListFromServer will |
+ // run |callback| for notifying the directory is ready before feed load. |
+ StartLoadChangeListFromServer(directory_fetch_info, |
+ about_resource.Pass(), |
+ start_changestamp, |
+ callback, |
+ DRIVE_FILE_OK); |
} |
} |
@@ -270,7 +277,7 @@ void ChangeListLoader::StartLoadChangeListFromServer( |
DCHECK(refreshing_); |
if (error == DRIVE_FILE_OK) { |
- callback.Run(DRIVE_FILE_OK); |
+ OnDirectoryLoadComplete(directory_fetch_info, callback, DRIVE_FILE_OK); |
DVLOG(1) << "Fast-fetch was successful: " << directory_fetch_info.ToString() |
<< "; Start loading the change list"; |
// Stop passing |callback| as it's just consumed. |
@@ -288,7 +295,7 @@ void ChangeListLoader::StartLoadChangeListFromServer( |
} |
void ChangeListLoader::OnGetAppList(google_apis::GDataErrorCode status, |
- scoped_ptr<google_apis::AppList> app_list) { |
+ scoped_ptr<google_apis::AppList> app_list) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DriveFileError error = util::GDataToDriveFileError(status); |
@@ -414,7 +421,7 @@ void ChangeListLoader::DoLoadDirectoryFromServerAfterRefresh( |
DCHECK(!callback.is_null()); |
DVLOG(1) << "Directory loaded: " << directory_fetch_info.ToString(); |
- OnDirectoryLoadComplete(directory_fetch_info, callback, error); |
+ callback.Run(error); |
// Also notify the observers. |
if (error == DRIVE_FILE_OK) { |
FOR_EACH_OBSERVER(ChangeListLoaderObserver, observers_, |
@@ -740,11 +747,16 @@ void ChangeListLoader::ScheduleRun( |
return; |
} |
- // The directory should be fetched. Add the callback to the pending list. The |
- // callback will be run after the directory is loaded. |
- pending_load_callback_[resource_id].push_back(callback); |
- DoLoadDirectoryFromServer(directory_fetch_info, |
- base::Bind(&util::EmptyFileOperationCallback)); |
+ // The directory should be fetched. Add a dummy task to so ScheduleRun() |
+ // can check that the directory is being fetched. |
+ pending_load_callback_[resource_id].push_back( |
+ base::Bind(&util::EmptyFileOperationCallback)); |
+ DoLoadDirectoryFromServer( |
+ directory_fetch_info, |
+ base::Bind(&ChangeListLoader::OnDirectoryLoadComplete, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ directory_fetch_info, |
+ callback)); |
} |
void ChangeListLoader::NotifyDirectoryChangedAfterApplyFeed( |