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 8686f8b7c2fe830f2016bd5f18483fa74df33169..89a460c2c633f0092026021c71c33f00bc00227c 100644 |
--- a/chrome/browser/chromeos/drive/change_list_loader.cc |
+++ b/chrome/browser/chromeos/drive/change_list_loader.cc |
@@ -28,7 +28,6 @@ ChangeListLoader::ChangeListLoader(DriveResourceMetadata* resource_metadata, |
: resource_metadata_(resource_metadata), |
scheduler_(scheduler), |
webapps_registry_(webapps_registry), |
- refreshing_(false), |
last_known_remote_changestamp_(0), |
loaded_(false), |
ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { |
@@ -37,6 +36,13 @@ ChangeListLoader::ChangeListLoader(DriveResourceMetadata* resource_metadata, |
ChangeListLoader::~ChangeListLoader() { |
} |
+bool ChangeListLoader::refreshing() const { |
+ // Callback for change list loading is stored in pending_load_callback_[""]. |
+ // It is non-empty if and only if there is an in-flight loading operation. |
+ LoadCallbackMap::const_iterator iter = pending_load_callback_.find(""); |
+ return iter != pending_load_callback_.end() && !iter->second.empty(); |
hashimoto
2013/04/17 08:15:37
nit: Is there any chance for iter->second to retur
kinaba
2013/04/17 08:46:23
no. done.
|
+} |
+ |
void ChangeListLoader::AddObserver(ChangeListLoaderObserver* observer) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
observers_.AddObserver(observer); |
@@ -49,15 +55,8 @@ void ChangeListLoader::RemoveObserver(ChangeListLoaderObserver* observer) { |
void ChangeListLoader::LoadFromServerIfNeeded( |
const DirectoryFetchInfo& directory_fetch_info, |
- const FileOperationCallback& callback) { |
+ int64 local_changestamp) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- |
- // Sets the refreshing flag, so that the caller does not send refresh requests |
- // in parallel (see DriveFileSystem::CheckForUpdates). Corresponding |
- // "refresh_ = false" is in OnGetAboutResource when the cached feed is up to |
- // date, or in OnFeedFromServerLoaded called back from LoadFromServer(). |
- refreshing_ = true; |
// Drive v2 needs a separate application list fetch operation. |
// On GData WAPI, it is not necessary in theory, because the response |
@@ -82,17 +81,15 @@ void ChangeListLoader::LoadFromServerIfNeeded( |
base::Bind(&ChangeListLoader::LoadFromServerIfNeededAfterGetAbout, |
weak_ptr_factory_.GetWeakPtr(), |
directory_fetch_info, |
- callback)); |
+ local_changestamp)); |
} |
void ChangeListLoader::LoadFromServerIfNeededAfterGetAbout( |
const DirectoryFetchInfo& directory_fetch_info, |
- const FileOperationCallback& callback, |
+ int64 local_changestamp, |
google_apis::GDataErrorCode status, |
scoped_ptr<google_apis::AboutResource> about_resource) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- DCHECK(refreshing_); |
DCHECK_EQ(util::GDataToDriveFileError(status) == DRIVE_FILE_OK, |
about_resource.get() != NULL); |
@@ -101,23 +98,6 @@ void ChangeListLoader::LoadFromServerIfNeededAfterGetAbout( |
last_known_remote_changestamp_ = about_resource->largest_change_id(); |
} |
- resource_metadata_->GetLargestChangestamp( |
- base::Bind(&ChangeListLoader::CompareChangestampsAndLoadIfNeeded, |
- weak_ptr_factory_.GetWeakPtr(), |
- directory_fetch_info, |
- callback, |
- base::Passed(&about_resource))); |
-} |
- |
-void ChangeListLoader::CompareChangestampsAndLoadIfNeeded( |
- const DirectoryFetchInfo& directory_fetch_info, |
- const FileOperationCallback& callback, |
- scoped_ptr<google_apis::AboutResource> about_resource, |
- int64 local_changestamp) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- DCHECK(refreshing_); |
- |
int64 remote_changestamp = |
about_resource ? about_resource->largest_change_id() : 0; |
if (remote_changestamp > 0 && local_changestamp >= remote_changestamp) { |
@@ -129,7 +109,7 @@ void ChangeListLoader::CompareChangestampsAndLoadIfNeeded( |
} |
// No changes detected, tell the client that the loading was successful. |
- OnChangeListLoadComplete(callback, DRIVE_FILE_OK); |
+ OnChangeListLoadComplete(DRIVE_FILE_OK); |
return; |
} |
@@ -138,60 +118,40 @@ void ChangeListLoader::CompareChangestampsAndLoadIfNeeded( |
// Full update needs AboutResource. If this is a full update, we should just |
// 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); |
+ OnChangeListLoadComplete(DRIVE_FILE_ERROR_FAILED); |
return; |
} |
if (directory_fetch_info.empty()) { |
// If the caller is not interested in a particular directory, just start |
// loading the change list. |
- LoadChangeListFromServer(about_resource.Pass(), |
- start_changestamp, |
- callback); |
- } else if (directory_fetch_info.changestamp() < remote_changestamp) { |
- // If the caller is interested in a particular directory, and the |
- // directory changestamp is older than server's, start loading the |
- // directory first. Skip special entries as they are not meaningful in the |
- // server. |
- DVLOG(1) << "Fast-fetching directory: " << directory_fetch_info.ToString() |
- << "; remote_changestamp: " << remote_changestamp; |
- const DirectoryFetchInfo new_directory_fetch_info( |
- directory_fetch_info.resource_id(), remote_changestamp); |
- DoLoadDirectoryFromServer( |
- new_directory_fetch_info, |
- base::Bind(&ChangeListLoader::StartLoadChangeListFromServer, |
- weak_ptr_factory_.GetWeakPtr(), |
- directory_fetch_info, |
- base::Passed(&about_resource), |
- start_changestamp, |
- callback)); |
+ LoadChangeListFromServer(about_resource.Pass(), start_changestamp); |
} else { |
- // 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); |
+ // If the caller is interested in a particular directory, start loading the |
+ // directory first. |
+ CheckChangestampAndLoadDirectoryIfNeeed( |
+ directory_fetch_info, |
+ local_changestamp, |
+ base::Bind( |
+ &ChangeListLoader::LoadChangeListFromServerAfterLoadDirectory, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ directory_fetch_info, |
+ base::Passed(&about_resource), |
+ start_changestamp)); |
} |
} |
void ChangeListLoader::LoadChangeListFromServer( |
scoped_ptr<google_apis::AboutResource> about_resource, |
- int64 start_changestamp, |
- const FileOperationCallback& callback) { |
+ int64 start_changestamp) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- DCHECK(refreshing_); |
bool is_delta_feed = start_changestamp != 0; |
const LoadFeedListCallback& completion_callback = |
base::Bind(&ChangeListLoader::UpdateMetadataFromFeedAfterLoadFromServer, |
weak_ptr_factory_.GetWeakPtr(), |
base::Passed(&about_resource), |
- is_delta_feed, |
- callback); |
+ is_delta_feed); |
base::TimeTicks start_time = base::TimeTicks::Now(); |
if (is_delta_feed) { |
scheduler_->GetChangeList( |
@@ -212,32 +172,20 @@ void ChangeListLoader::LoadChangeListFromServer( |
} |
} |
-void ChangeListLoader::StartLoadChangeListFromServer( |
+void ChangeListLoader::LoadChangeListFromServerAfterLoadDirectory( |
const DirectoryFetchInfo& directory_fetch_info, |
scoped_ptr<google_apis::AboutResource> about_resource, |
int64 start_changestamp, |
- const FileOperationCallback& callback, |
DriveFileError error) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- DCHECK(refreshing_); |
if (error == 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. |
- LoadChangeListFromServer( |
- about_resource.Pass(), |
- start_changestamp, |
- base::Bind(&util::EmptyFileOperationCallback)); |
- } else { |
- // The directory fast-fetch failed, but the change list loading may |
- // succeed. Keep passing |callback| so it's run after the change list |
- // loading is complete. |
- LoadChangeListFromServer( |
- about_resource.Pass(), start_changestamp, callback); |
+ // The directory fast-fetch succeeded. Runs the callbacks waiting for the |
+ // directory loading. If failed, do not flush so they're run after the |
+ // change list loading is complete. |
+ OnDirectoryLoadComplete(directory_fetch_info, DRIVE_FILE_OK); |
} |
+ LoadChangeListFromServer(about_resource.Pass(), start_changestamp); |
} |
void ChangeListLoader::SearchFromServerAfterGetResourceList( |
@@ -345,15 +293,14 @@ void ChangeListLoader::LoadDirectoryFromServerAfterGetAbout( |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
- int64 remote_changestamp = 0; |
if (util::GDataToDriveFileError(status) == DRIVE_FILE_OK) { |
DCHECK(about_resource); |
- remote_changestamp = about_resource->largest_change_id(); |
- last_known_remote_changestamp_ = remote_changestamp; |
+ last_known_remote_changestamp_ = about_resource->largest_change_id(); |
} |
- const DirectoryFetchInfo directory_fetch_info(directory_resource_id, |
- remote_changestamp); |
+ const DirectoryFetchInfo directory_fetch_info( |
+ directory_resource_id, |
+ last_known_remote_changestamp_); |
DoLoadDirectoryFromServer(directory_fetch_info, callback); |
} |
@@ -537,15 +484,12 @@ void ChangeListLoader::SearchFromServer( |
void ChangeListLoader::UpdateMetadataFromFeedAfterLoadFromServer( |
scoped_ptr<google_apis::AboutResource> about_resource, |
bool is_delta_feed, |
- const FileOperationCallback& callback, |
ScopedVector<ChangeList> change_lists, |
DriveFileError error) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- DCHECK(refreshing_); |
if (error != DRIVE_FILE_OK) { |
- OnChangeListLoadComplete(callback, error); |
+ OnChangeListLoadComplete(error); |
return; |
} |
@@ -553,9 +497,7 @@ void ChangeListLoader::UpdateMetadataFromFeedAfterLoadFromServer( |
change_lists.Pass(), |
is_delta_feed, |
base::Bind(&ChangeListLoader::OnUpdateFromFeed, |
- weak_ptr_factory_.GetWeakPtr(), |
- !loaded(), // is_initial_load |
- callback)); |
+ weak_ptr_factory_.GetWeakPtr())); |
} |
void ChangeListLoader::LoadIfNeeded( |
@@ -574,85 +516,96 @@ void ChangeListLoader::LoadIfNeeded( |
base::Bind(callback, DRIVE_FILE_OK)); |
return; |
} |
+ Load(directory_fetch_info, callback); |
+} |
+ |
+void ChangeListLoader::Load(const DirectoryFetchInfo& directory_fetch_info, |
+ const FileOperationCallback& callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(!callback.is_null()); |
+ |
+ // Check if this is the first time this ChangeListLoader do loading. |
+ // Note: refreshing() depends on pending_load_callback_ so check in advance. |
+ const bool is_initial_load = (!loaded_ && !refreshing()); |
+ |
+ // Register the callback function to be called when it is loaded. |
+ const std::string& resource_id = directory_fetch_info.resource_id(); |
+ pending_load_callback_[resource_id].push_back(callback); |
- // At this point, it is either !loaded() or refreshing(). |
- // If the change list loading is in progress, schedule the callback to |
- // run when it's ready (i.e. when the entire resource list is loaded, or |
- // the directory contents are available per "fast fetch"). |
- if (refreshing()) { |
- ScheduleRun(directory_fetch_info, callback); |
+ // If loading task for |resource_id| is already running, do nothing. |
+ if (pending_load_callback_[resource_id].size() > 1) |
return; |
- } |
- if (!directory_fetch_info.empty()) { |
- // Add a dummy task to so ScheduleRun() can check that the directory is |
- // being fetched. This will be cleared either in |
- // ProcessPendingLoadCallbackForDirectory() or FlushPendingLoadCallback(). |
- pending_load_callback_[directory_fetch_info.resource_id()].push_back( |
+ // For initial loading, even for directory fetching, we do load the full |
+ // feed from the server to sync up. So we register a dummy callback to |
+ // indicate that update for full hierarchy is running. |
+ if (is_initial_load && !resource_id.empty()) { |
+ pending_load_callback_[""].push_back( |
base::Bind(&util::EmptyFileOperationCallback)); |
} |
- // First check if the local data is usable or not. |
- CheckLocalChangestamp(base::Bind( |
- &ChangeListLoader::LoadAfterCheckLocalChangestamp, |
- weak_ptr_factory_.GetWeakPtr(), |
- directory_fetch_info, |
- callback)); |
+ // Check the current status of local metadata, and start loading if needed. |
+ resource_metadata_->GetLargestChangestamp( |
+ base::Bind(is_initial_load ? &ChangeListLoader::DoInitialLoad |
+ : &ChangeListLoader::DoUpdateLoad, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ directory_fetch_info)); |
} |
-void ChangeListLoader::LoadAfterCheckLocalChangestamp( |
+void ChangeListLoader::DoInitialLoad( |
const DirectoryFetchInfo& directory_fetch_info, |
- const FileOperationCallback& callback, |
int64 local_changestamp) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
if (local_changestamp > 0) { |
- loaded_ = true; |
+ // The local data is usable. Flush callbacks to tell loading was successful. |
+ OnChangeListLoadComplete(DRIVE_FILE_OK); |
- // The local data is usable. Change the refreshing state and tell the |
- // callback that the loading was successful. |
- OnChangeListLoadComplete(callback, DRIVE_FILE_OK); |
- FOR_EACH_OBSERVER(ChangeListLoaderObserver, |
- observers_, |
- OnInitialFeedLoaded()); |
- |
- // Load from server if needed (i.e. the cache is old). Note that we |
- // should still propagate |directory_fetch_info| though the directory is |
- // loaded first. This way, the UI can get notified via a directory change |
- // event as soon as the current directory contents are fetched. |
- LoadFromServerIfNeeded(directory_fetch_info, |
- base::Bind(&util::EmptyFileOperationCallback)); |
- } else { |
- // The local data is not usable. Start loading from the server. Though the |
- // function name ends with "IfNeeded", this function should always start |
- // loading as the local changestamp is zero now. |
- LoadFromServerIfNeeded(directory_fetch_info, callback); |
+ // Continues to load from server in background. |
+ // Put dummy callbacks to indicate that fetching is still continuing. |
+ pending_load_callback_[directory_fetch_info.resource_id()].push_back( |
+ base::Bind(&util::EmptyFileOperationCallback)); |
+ if (!directory_fetch_info.empty()) { |
+ pending_load_callback_[""].push_back( |
+ base::Bind(&util::EmptyFileOperationCallback)); |
+ } |
} |
+ LoadFromServerIfNeeded(directory_fetch_info, local_changestamp); |
} |
-void ChangeListLoader::CheckLocalChangestamp( |
- const GetChangestampCallback& callback) { |
+void ChangeListLoader::DoUpdateLoad( |
+ const DirectoryFetchInfo& directory_fetch_info, |
+ int64 local_changestamp) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- DCHECK(!loaded_); |
- |
- // Sets the refreshing flag, so that the caller does not send refresh requests |
- // in parallel (see DriveFileSystem::LoadFeedIfNeeded). |
- // |
- // The flag will be unset when loading completes. |
- refreshing_ = true; |
- resource_metadata_->GetLargestChangestamp(callback); |
+ if (directory_fetch_info.empty()) { |
+ LoadFromServerIfNeeded(directory_fetch_info, local_changestamp); |
+ } else { |
+ // Note: CheckChangestampAndLoadDirectoryIfNeeded regards |
+ // last_know_remote_changestamp_ as the remote changestamp. To be precise, |
+ // we need to call GetAboutResource() here, as we do in other places like |
+ // LoadFromServerIfNeeded or LoadFromDirectory. However, |
+ // - It is costly to do GetAboutResource HTTP request every time. |
+ // - The chance using an old value is small; it only happens when |
+ // LoadIfNeeded is called during one GetAboutResource roundtrip time |
+ // of a feed fetching. |
+ // - Even if the value is old, it just marks the directory as older. It may |
+ // trigger one future unnecessary re-fetch, but it'll never lose data. |
+ CheckChangestampAndLoadDirectoryIfNeeed( |
+ directory_fetch_info, |
+ local_changestamp, |
+ base::Bind(&ChangeListLoader::OnDirectoryLoadComplete, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ directory_fetch_info)); |
+ } |
} |
- |
void ChangeListLoader::CheckForUpdates(const FileOperationCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
if (loaded() && !refreshing()) |
- LoadFromServerIfNeeded(DirectoryFetchInfo(), callback); |
+ Load(DirectoryFetchInfo(), callback); |
} |
void ChangeListLoader::UpdateFromFeed( |
@@ -679,65 +632,32 @@ void ChangeListLoader::UpdateFromFeed( |
update_finished_callback)); |
} |
-void ChangeListLoader::ScheduleRun( |
+void ChangeListLoader::CheckChangestampAndLoadDirectoryIfNeeed( |
const DirectoryFetchInfo& directory_fetch_info, |
+ int64 local_changestamp, |
const FileOperationCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- DCHECK(refreshing_); |
- |
- if (directory_fetch_info.empty()) { |
- // If the caller is not interested in a particular directory, just add the |
- // callback to the pending list and return. |
- pending_load_callback_[""].push_back(callback); |
- return; |
- } |
+ DCHECK(!directory_fetch_info.empty()); |
- const std::string& resource_id = directory_fetch_info.resource_id(); |
- |
- // If the directory of interest is already scheduled to be fetched, add the |
- // callback to the pending list and return. |
- LoadCallbackMap::iterator it = pending_load_callback_.find(resource_id); |
- if (it != pending_load_callback_.end()) { |
- it->second.push_back(callback); |
- return; |
- } |
+ int64 directory_changestamp = std::max(directory_fetch_info.changestamp(), |
+ local_changestamp); |
// If the directory's changestamp is up-to-date, just schedule to run the |
// callback, as there is no need to fetch the directory. |
// Note that |last_known_remote_changestamp_| is 0 when it is not received |
// yet. In that case we conservatively assume that we need to fetch. |
if (last_known_remote_changestamp_ > 0 && |
- directory_fetch_info.changestamp() >= last_known_remote_changestamp_) { |
- base::MessageLoopProxy::current()->PostTask( |
- FROM_HERE, |
- base::Bind(callback, DRIVE_FILE_OK)); |
+ directory_changestamp >= last_known_remote_changestamp_) { |
+ callback.Run(DRIVE_FILE_OK); |
return; |
} |
- // 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)); |
- |
// Start fetching the directory content, and mark it with the changestamp |
- // |last_known_remote_changestamp_|. To be precise, instead we need to call |
- // GetAboutResource() to get the latest changestamp. However, |
- // - It is costly to do GetAboutResource HTTP request every time. |
- // - The chance using an old value is small; it only happens when LoadIfNeeded |
- // is called during one GetAboutResource roundtrip time of a feed fetching. |
- // - Even if the value is old, it just marks the directory as older. It may |
- // trigger one future unnecessary re-fetch, but it'll never lose data, etc. |
+ // |last_known_remote_changestamp_|. |
DirectoryFetchInfo new_directory_fetch_info( |
directory_fetch_info.resource_id(), |
- std::max(directory_fetch_info.changestamp(), |
- last_known_remote_changestamp_)); |
- DoLoadDirectoryFromServer( |
- new_directory_fetch_info, |
- base::Bind(&ChangeListLoader::OnDirectoryLoadComplete, |
- weak_ptr_factory_.GetWeakPtr(), |
- directory_fetch_info, |
- callback)); |
+ std::max(directory_changestamp, last_known_remote_changestamp_)); |
+ DoLoadDirectoryFromServer(new_directory_fetch_info, callback); |
} |
void ChangeListLoader::NotifyDirectoryChangedAfterApplyFeed( |
@@ -747,8 +667,6 @@ void ChangeListLoader::NotifyDirectoryChangedAfterApplyFeed( |
DCHECK(change_list_processor_.get()); |
DCHECK(!update_finished_callback.is_null()); |
- loaded_ = true; |
- |
if (should_notify_changed_directories) { |
for (std::set<base::FilePath>::iterator dir_iter = |
change_list_processor_->changed_dirs().begin(); |
@@ -765,50 +683,25 @@ void ChangeListLoader::NotifyDirectoryChangedAfterApplyFeed( |
// on_complete_callback_, which is owned by change_list_processor_. |
} |
-void ChangeListLoader::OnUpdateFromFeed( |
- bool is_inital_load, |
- const FileOperationCallback& callback) { |
+void ChangeListLoader::OnUpdateFromFeed() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- OnChangeListLoadComplete(callback, DRIVE_FILE_OK); |
- if (is_inital_load) { |
- FOR_EACH_OBSERVER(ChangeListLoaderObserver, |
- observers_, |
- OnInitialFeedLoaded()); |
- } |
+ OnChangeListLoadComplete(DRIVE_FILE_OK); |
FOR_EACH_OBSERVER(ChangeListLoaderObserver, |
observers_, |
OnFeedFromServerLoaded()); |
} |
-void ChangeListLoader::OnChangeListLoadComplete( |
- const FileOperationCallback& callback, |
- DriveFileError error) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- |
- refreshing_ = false; |
- callback.Run(error); |
- FlushPendingLoadCallback(error); |
-} |
- |
-void ChangeListLoader::OnDirectoryLoadComplete( |
- const DirectoryFetchInfo& directory_fetch_info, |
- const FileOperationCallback& callback, |
- DriveFileError error) { |
+void ChangeListLoader::OnChangeListLoadComplete(DriveFileError error) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
- callback.Run(error); |
- ProcessPendingLoadCallbackForDirectory(directory_fetch_info.resource_id(), |
- error); |
-} |
- |
-void ChangeListLoader::FlushPendingLoadCallback(DriveFileError error) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!refreshing_); |
+ if (!loaded_ && error == DRIVE_FILE_OK) { |
+ loaded_ = true; |
+ FOR_EACH_OBSERVER(ChangeListLoaderObserver, |
+ observers_, |
+ OnInitialFeedLoaded()); |
+ } |
for (LoadCallbackMap::iterator it = pending_load_callback_.begin(); |
it != pending_load_callback_.end(); ++it) { |
@@ -822,11 +715,17 @@ void ChangeListLoader::FlushPendingLoadCallback(DriveFileError error) { |
pending_load_callback_.clear(); |
} |
-void ChangeListLoader::ProcessPendingLoadCallbackForDirectory( |
- const std::string& resource_id, |
+void ChangeListLoader::OnDirectoryLoadComplete( |
+ const DirectoryFetchInfo& directory_fetch_info, |
DriveFileError error) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (error == DRIVE_FILE_OK) { |
+ DVLOG(1) << "Fast-fetch was successful: " |
hashimoto
2013/04/17 08:15:37
nit: How about using DVLOG_IF?
kinaba
2013/04/17 08:46:23
Done.
|
+ << directory_fetch_info.ToString(); |
+ } |
+ |
+ const std::string& resource_id = directory_fetch_info.resource_id(); |
LoadCallbackMap::iterator it = pending_load_callback_.find(resource_id); |
if (it != pending_load_callback_.end()) { |
DVLOG(1) << "Running callback for " << resource_id; |