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 0ba027de81b532b6572ed9637690cdfa1c399877..43ccbc9858c34ab0e5d7fe3568fc01217c960794 100644 |
--- a/chrome/browser/chromeos/drive/change_list_loader.cc |
+++ b/chrome/browser/chromeos/drive/change_list_loader.cc |
@@ -178,9 +178,11 @@ class DeltaFeedFetcher : public ChangeListLoader::FeedFetcher { |
class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher { |
public: |
FastFetchFeedFetcher(JobScheduler* scheduler, |
- const std::string& directory_resource_id) |
+ const std::string& directory_resource_id, |
+ const std::string& root_folder_id) |
: scheduler_(scheduler), |
directory_resource_id_(directory_resource_id), |
+ root_folder_id_(root_folder_id), |
weak_ptr_factory_(this) { |
} |
@@ -188,13 +190,59 @@ class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher { |
} |
virtual void Run(const FeedFetcherCallback& callback) OVERRIDE { |
- scheduler_->GetResourceListInDirectory( |
- directory_resource_id_, |
+ if (util::IsDriveV2ApiEnabled() && root_folder_id_.empty()) { |
+ // The root folder id is not available yet. Fetch from the server. |
+ scheduler_->GetAboutResource( |
+ base::Bind(&FastFetchFeedFetcher::RunAfterGetAboutResource, |
+ weak_ptr_factory_.GetWeakPtr(), callback)); |
+ return; |
+ } |
+ |
+ StartGetResourceListInDirectory(callback); |
+ } |
+ |
+ private: |
+ void RunAfterGetAboutResource( |
+ const FeedFetcherCallback& callback, |
+ google_apis::GDataErrorCode status, |
+ scoped_ptr<google_apis::AboutResource> about_resource) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(!callback.is_null()); |
+ |
+ FileError error = GDataToFileError(status); |
+ if (error != FILE_ERROR_OK) { |
+ callback.Run(error, ScopedVector<ChangeList>()); |
+ return; |
+ } |
+ |
+ root_folder_id_ = about_resource->root_folder_id(); |
+ StartGetResourceListInDirectory(callback); |
+ } |
+ |
+ void StartGetResourceListInDirectory(const FeedFetcherCallback& callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(!callback.is_null()); |
+ DCHECK(!directory_resource_id_.empty()); |
+ DCHECK(!util::IsDriveV2ApiEnabled() || !root_folder_id_.empty()); |
+ |
+ // We use WAPI's GetResourceListInDirectory even if Drive API v2 is |
+ // enabled. This is the short term work around of the performance |
+ // regression. |
+ |
+ std::string resource_id = directory_resource_id_; |
+ if (util::IsDriveV2ApiEnabled() && |
+ directory_resource_id_ == root_folder_id_) { |
+ // GData WAPI doesn't accept the root directory id which is used in Drive |
+ // API v2. So it is necessary to translate it here. |
+ resource_id = util::kWapiRootDirectoryResourceId; |
+ } |
+ |
+ scheduler_->GetResourceListInDirectoryByWapi( |
+ resource_id, |
base::Bind(&FastFetchFeedFetcher::OnFileListFetched, |
weak_ptr_factory_.GetWeakPtr(), callback)); |
} |
- private: |
void OnFileListFetched( |
const FeedFetcherCallback& callback, |
google_apis::GDataErrorCode status, |
@@ -210,7 +258,10 @@ class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher { |
// Add the current change list to the list of collected lists. |
DCHECK(resource_list); |
- change_lists_.push_back(new ChangeList(*resource_list)); |
+ ChangeList* change_list = new ChangeList(*resource_list); |
+ if (util::IsDriveV2ApiEnabled()) |
+ FixResourceIdInChangeList(change_list); |
+ change_lists_.push_back(change_list); |
GURL next_url; |
if (resource_list->GetNextFeedURL(&next_url) && !next_url.is_empty()) { |
@@ -228,8 +279,34 @@ class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher { |
callback.Run(FILE_ERROR_OK, change_lists_.Pass()); |
} |
+ void FixResourceIdInChangeList(ChangeList* change_list) { |
+ std::vector<ResourceEntry>* entries = change_list->mutable_entries(); |
+ for (size_t i = 0; i < entries->size(); ++i) { |
+ ResourceEntry* entry = &(*entries)[i]; |
+ if (entry->has_resource_id()) { |
+ entry->set_resource_id(UpgradeResourceIdFromGDataWapiToDriveApiV2( |
+ entry->resource_id())); |
+ } |
+ |
+ // Currently parent local id is the parent's resource id. |
+ // It will be replaced by actual local id. (crbug.com/260514). |
+ if (entry->has_parent_local_id()) { |
+ entry->set_parent_local_id(UpgradeResourceIdFromGDataWapiToDriveApiV2( |
+ entry->parent_local_id())); |
+ } |
+ } |
+ } |
+ |
+ std::string UpgradeResourceIdFromGDataWapiToDriveApiV2( |
+ const std::string& resource_id) { |
+ if (resource_id == util::kWapiRootDirectoryResourceId) |
+ return root_folder_id_; |
+ return drive::util::CanonicalizeResourceId(resource_id); |
+ } |
+ |
JobScheduler* scheduler_; |
std::string directory_resource_id_; |
+ std::string root_folder_id_; |
ScopedVector<ChangeList> change_lists_; |
base::WeakPtrFactory<FastFetchFeedFetcher> weak_ptr_factory_; |
DISALLOW_COPY_AND_ASSIGN(FastFetchFeedFetcher); |
@@ -481,6 +558,7 @@ void ChangeListLoader::LoadFromServerIfNeededAfterGetAbout( |
if (GDataToFileError(status) == FILE_ERROR_OK) { |
DCHECK(about_resource); |
last_known_remote_changestamp_ = about_resource->largest_change_id(); |
+ root_folder_id_ = about_resource->root_folder_id(); |
} |
int64 remote_changestamp = |
@@ -607,8 +685,11 @@ void ChangeListLoader::LoadDirectoryFromServerAfterGetAbout( |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
- if (GDataToFileError(status) == FILE_ERROR_OK) |
+ if (GDataToFileError(status) == FILE_ERROR_OK) { |
+ DCHECK(about_resource); |
last_known_remote_changestamp_ = about_resource->largest_change_id(); |
+ root_folder_id_ = about_resource->root_folder_id(); |
+ } |
DoLoadDirectoryFromServer( |
DirectoryFetchInfo(directory_resource_id, last_known_remote_changestamp_), |
@@ -688,7 +769,8 @@ void ChangeListLoader::DoLoadDirectoryFromServer( |
FastFetchFeedFetcher* fetcher = new FastFetchFeedFetcher( |
scheduler_, |
- directory_fetch_info.resource_id()); |
+ directory_fetch_info.resource_id(), |
+ root_folder_id_); |
fast_fetch_feed_fetcher_set_.insert(fetcher); |
fetcher->Run( |
base::Bind(&ChangeListLoader::DoLoadDirectoryFromServerAfterLoad, |