summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorachuith@chromium.org <achuith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-16 05:31:51 +0000
committerachuith@chromium.org <achuith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-16 05:31:51 +0000
commitfbbddb41c2365add19335b9d1d25900ae80e54c7 (patch)
treee723bd1db5c76dc86925fa4703134bbd0007a56f
parent7b8852c25003b07434ba027122ff2d3bb3c325f3 (diff)
downloadchromium_src-fbbddb41c2365add19335b9d1d25900ae80e54c7.zip
chromium_src-fbbddb41c2365add19335b9d1d25900ae80e54c7.tar.gz
chromium_src-fbbddb41c2365add19335b9d1d25900ae80e54c7.tar.bz2
Make largest_changestamp setter/getter asynchronous.
BUG=147299 TEST=unit tests Review URL: https://chromiumcodereview.appspot.com/11876002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@177091 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chromeos/drive/drive_feed_loader.cc20
-rw-r--r--chrome/browser/chromeos/drive/drive_feed_loader.h8
-rw-r--r--chrome/browser/chromeos/drive/drive_feed_processor.cc21
-rw-r--r--chrome/browser/chromeos/drive/drive_file_system.cc23
-rw-r--r--chrome/browser/chromeos/drive/drive_file_system.h3
-rw-r--r--chrome/browser/chromeos/drive/drive_file_system_interface.h9
-rw-r--r--chrome/browser/chromeos/drive/drive_resource_metadata.cc14
-rw-r--r--chrome/browser/chromeos/drive/drive_resource_metadata.h13
-rw-r--r--chrome/browser/chromeos/drive/drive_resource_metadata_unittest.cc27
-rw-r--r--chrome/browser/chromeos/drive/mock_drive_file_system.h3
-rw-r--r--chrome/browser/ui/webui/chromeos/drive_internals_ui.cc34
11 files changed, 150 insertions, 25 deletions
diff --git a/chrome/browser/chromeos/drive/drive_feed_loader.cc b/chrome/browser/chromeos/drive/drive_feed_loader.cc
index 8c73be6..b428eee 100644
--- a/chrome/browser/chromeos/drive/drive_feed_loader.cc
+++ b/chrome/browser/chromeos/drive/drive_feed_loader.cc
@@ -256,9 +256,6 @@ void DriveFeedLoader::ReloadFromServerIfNeeded(
const FileOperationCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
- DVLOG(1) << "ReloadFromServerIfNeeded local_changestamp="
- << resource_metadata_->largest_changestamp()
- << ", loaded=" << resource_metadata_->loaded();
// Sets the refreshing flag, so that the caller does not send refresh requests
// in parallel (see DriveFileSystem::CheckForUpdates). Corresponding
@@ -291,9 +288,7 @@ void DriveFeedLoader::OnGetAccountMetadata(
DCHECK(!callback.is_null());
DCHECK(refreshing_);
- int64 local_changestamp = resource_metadata_->largest_changestamp();
int64 remote_changestamp = 0;
-
// When account metadata successfully fetched, parse the latest changestamp.
if (util::GDataToDriveFileError(status) == DRIVE_FILE_OK) {
DCHECK(account_metadata);
@@ -301,6 +296,21 @@ void DriveFeedLoader::OnGetAccountMetadata(
remote_changestamp = account_metadata->largest_changestamp();
}
+ resource_metadata_->GetLargestChangestamp(
+ base::Bind(&DriveFeedLoader::CompareChangestampsAndLoadIfNeeded,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback,
+ remote_changestamp));
+}
+
+void DriveFeedLoader::CompareChangestampsAndLoadIfNeeded(
+ const FileOperationCallback& callback,
+ int64 remote_changestamp,
+ int64 local_changestamp) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!callback.is_null());
+ DCHECK(refreshing_);
+
if (remote_changestamp > 0 && local_changestamp >= remote_changestamp) {
if (local_changestamp > remote_changestamp) {
LOG(WARNING) << "Cached client feed is fresher than server, client = "
diff --git a/chrome/browser/chromeos/drive/drive_feed_loader.h b/chrome/browser/chromeos/drive/drive_feed_loader.h
index 95d986a..9292f07 100644
--- a/chrome/browser/chromeos/drive/drive_feed_loader.h
+++ b/chrome/browser/chromeos/drive/drive_feed_loader.h
@@ -119,6 +119,14 @@ class DriveFeedLoader {
google_apis::GDataErrorCode status,
scoped_ptr<google_apis::AccountMetadataFeed> account_metadata);
+ // Callback for DriveResourceMetadata::GetLargestChangestamp.
+ // Compares |remote_changestamp| and |local_changestamp| and triggers
+ // LoadFromServer if necessary.
+ void CompareChangestampsAndLoadIfNeeded(
+ const FileOperationCallback& callback,
+ int64 remote_changestamp,
+ int64 local_changestamp);
+
// Callback for handling response from |DriveAPIService::GetApplicationInfo|.
// If the application list is successfully parsed, passes the list to
// Drive webapps registry.
diff --git a/chrome/browser/chromeos/drive/drive_feed_processor.cc b/chrome/browser/chromeos/drive/drive_feed_processor.cc
index b2c2915..22746ea 100644
--- a/chrome/browser/chromeos/drive/drive_feed_processor.cc
+++ b/chrome/browser/chromeos/drive/drive_feed_processor.cc
@@ -17,6 +17,21 @@ using content::BrowserThread;
namespace drive {
+namespace {
+
+// Callback for DriveResourceMetadata::SetLargestChangestamp.
+// Runs |on_complete_callback|. |on_complete_callback| must not be null.
+void RunOnCompleteCallback(const base::Closure& on_complete_callback,
+ DriveFileError error) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!on_complete_callback.is_null());
+ DCHECK_EQ(DRIVE_FILE_OK, error);
+
+ on_complete_callback.Run();
+}
+
+} // namespace
+
class DriveFeedProcessor::FeedToEntryProtoMapUMAStats {
public:
FeedToEntryProtoMapUMAStats()
@@ -382,11 +397,11 @@ void DriveFeedProcessor::OnUpdateRootUploadUrl(
void DriveFeedProcessor::OnComplete() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK(!on_complete_callback_.is_null());
resource_metadata_->set_loaded(true);
- resource_metadata_->set_largest_changestamp(largest_changestamp_);
- on_complete_callback_.Run();
+ resource_metadata_->SetLargestChangestamp(
+ largest_changestamp_,
+ base::Bind(&RunOnCompleteCallback, on_complete_callback_));
}
void DriveFeedProcessor::Clear() {
diff --git a/chrome/browser/chromeos/drive/drive_file_system.cc b/chrome/browser/chromeos/drive/drive_file_system.cc
index 4e4b6d4..a7953da 100644
--- a/chrome/browser/chromeos/drive/drive_file_system.cc
+++ b/chrome/browser/chromeos/drive/drive_file_system.cc
@@ -153,6 +153,19 @@ void RunGetEntryInfoWithFilePathCallback(
callback.Run(error, path, entry_proto.Pass());
}
+// Callback for DriveResourceMetadata::GetLargestChangestamp.
+// |callback| must not be null.
+void OnGetLargestChangestamp(
+ DriveFileSystemMetadata metadata, // Will be modified.
+ const GetFilesystemMetadataCallback& callback,
+ int64 largest_changestamp) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!callback.is_null());
+
+ metadata.largest_changestamp = largest_changestamp;
+ callback.Run(metadata);
+}
+
} // namespace
// DriveFileSystem::FindFirstMissingParentDirectoryParams implementation.
@@ -1781,9 +1794,12 @@ void DriveFileSystem::AddUploadedFileToCache(
params.callback);
}
-DriveFileSystemMetadata DriveFileSystem::GetMetadata() const {
+void DriveFileSystem::GetMetadata(
+ const GetFilesystemMetadataCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!callback.is_null());
+
DriveFileSystemMetadata metadata;
- metadata.largest_changestamp = resource_metadata_->largest_changestamp();
metadata.loaded = resource_metadata_->loaded();
metadata.refreshing = feed_loader_->refreshing();
@@ -1793,7 +1809,8 @@ DriveFileSystemMetadata DriveFileSystem::GetMetadata() const {
metadata.last_update_check_time = last_update_check_time_;
metadata.last_update_check_error = last_update_check_error_;
- return metadata;
+ resource_metadata_->GetLargestChangestamp(
+ base::Bind(&OnGetLargestChangestamp, metadata, callback));
}
void DriveFileSystem::OnDisableDriveHostedFilesChanged() {
diff --git a/chrome/browser/chromeos/drive/drive_file_system.h b/chrome/browser/chromeos/drive/drive_file_system.h
index 6aa48c0..987931f 100644
--- a/chrome/browser/chromeos/drive/drive_file_system.h
+++ b/chrome/browser/chromeos/drive/drive_file_system.h
@@ -134,7 +134,8 @@ class DriveFileSystem : public DriveFileSystemInterface,
scoped_ptr<google_apis::ResourceEntry> doc_entry,
const FilePath& file_content_path,
const FileOperationCallback& callback) OVERRIDE;
- virtual DriveFileSystemMetadata GetMetadata() const OVERRIDE;
+ virtual void GetMetadata(
+ const GetFilesystemMetadataCallback& callback) OVERRIDE;
virtual void Reload() OVERRIDE;
// file_system::OperationObserver overrides.
diff --git a/chrome/browser/chromeos/drive/drive_file_system_interface.h b/chrome/browser/chromeos/drive/drive_file_system_interface.h
index 1d494ff..0a34a81 100644
--- a/chrome/browser/chromeos/drive/drive_file_system_interface.h
+++ b/chrome/browser/chromeos/drive/drive_file_system_interface.h
@@ -72,6 +72,10 @@ typedef base::Callback<void(DriveFileError error,
int64 bytes_total,
int64 bytes_used)> GetAvailableSpaceCallback;
+// Used to get drive filesystem metadata.
+typedef base::Callback<void(const DriveFileSystemMetadata&)>
+ GetFilesystemMetadataCallback;
+
// Drive file system abstraction layer.
// The interface is defined to make DriveFileSystem mockable.
class DriveFileSystemInterface {
@@ -341,8 +345,9 @@ class DriveFileSystemInterface {
const FileOperationCallback& callback) = 0;
// Returns miscellaneous metadata of the file system like the largest
- // timestamp. Used in chrome:drive-internals.
- virtual DriveFileSystemMetadata GetMetadata() const = 0;
+ // timestamp. Used in chrome:drive-internals. |callback| must not be null.
+ virtual void GetMetadata(
+ const GetFilesystemMetadataCallback& callback) = 0;
// Reloads the file system feeds from the server.
virtual void Reload() = 0;
diff --git a/chrome/browser/chromeos/drive/drive_resource_metadata.cc b/chrome/browser/chromeos/drive/drive_resource_metadata.cc
index c5ca213..2fbc048 100644
--- a/chrome/browser/chromeos/drive/drive_resource_metadata.cc
+++ b/chrome/browser/chromeos/drive/drive_resource_metadata.cc
@@ -230,6 +230,20 @@ void DriveResourceMetadata::ClearRoot() {
root_.reset();
}
+void DriveResourceMetadata::GetLargestChangestamp(
+ const GetChangestampCallback& callback) {
+ base::MessageLoopProxy::current()->PostTask(
+ FROM_HERE, base::Bind(callback, largest_changestamp_));
+}
+
+void DriveResourceMetadata::SetLargestChangestamp(
+ int64 value,
+ const FileOperationCallback& callback) {
+ largest_changestamp_ = value;
+ base::MessageLoopProxy::current()->PostTask(
+ FROM_HERE, base::Bind(callback, DRIVE_FILE_OK));
+}
+
void DriveResourceMetadata::AddEntryToDirectory(
const FilePath& directory_path,
scoped_ptr<google_apis::ResourceEntry> entry,
diff --git a/chrome/browser/chromeos/drive/drive_resource_metadata.h b/chrome/browser/chromeos/drive/drive_resource_metadata.h
index 052c45d..3ee5cad 100644
--- a/chrome/browser/chromeos/drive/drive_resource_metadata.h
+++ b/chrome/browser/chromeos/drive/drive_resource_metadata.h
@@ -90,6 +90,8 @@ typedef base::Callback<void(DriveFileError error,
typedef base::Callback<void(const std::set<FilePath>&)>
GetChildDirectoriesCallback;
+typedef base::Callback<void(int64)> GetChangestampCallback;
+
// This is a part of EntryInfoPairResult.
struct EntryInfoResult {
EntryInfoResult();
@@ -132,15 +134,16 @@ class DriveResourceMetadata {
size_t serialized_size() const { return serialized_size_; }
void set_serialized_size(size_t size) { serialized_size_ = size; }
- // Largest change timestamp that was the source of content for the current
- // state of the root directory.
- int64 largest_changestamp() const { return largest_changestamp_; }
- void set_largest_changestamp(int64 value) { largest_changestamp_ = value; }
-
// True if the file system feed is loaded from the cache or from the server.
bool loaded() const { return loaded_; }
void set_loaded(bool loaded) { loaded_ = loaded; }
+ // Largest change timestamp that was the source of content for the current
+ // state of the root directory.
+ void GetLargestChangestamp(const GetChangestampCallback& callback);
+ void SetLargestChangestamp(int64 value,
+ const FileOperationCallback& callback);
+
// Add |entry| to directory with path |directory_path| and invoke the
// callback asynchronously.
// |callback| must not be null.
diff --git a/chrome/browser/chromeos/drive/drive_resource_metadata_unittest.cc b/chrome/browser/chromeos/drive/drive_resource_metadata_unittest.cc
index 3459c1e..5ccce25 100644
--- a/chrome/browser/chromeos/drive/drive_resource_metadata_unittest.cc
+++ b/chrome/browser/chromeos/drive/drive_resource_metadata_unittest.cc
@@ -34,12 +34,19 @@ void CopyResultsFromInitFromDBCallback(DriveFileError* expected_error,
*expected_error = actual_error;
}
+// Copies result from GetChildDirectoriesCallback.
void CopyResultFromGetChildDirectoriesCallback(
std::set<FilePath>* out_child_directories,
const std::set<FilePath>& in_child_directories) {
*out_child_directories = in_child_directories;
}
+// Copies result from GetChangestampCallback.
+void CopyResultFromGetChangestampCallback(
+ int64* out_changestamp, int64 in_changestamp) {
+ *out_changestamp = in_changestamp;
+}
+
} // namespace
class DriveResourceMetadataTest : public testing::Test {
@@ -180,6 +187,26 @@ TEST_F(DriveResourceMetadataTest, VersionCheck) {
ASSERT_FALSE(resource_metadata.ParseFromString(serialized_proto));
}
+TEST_F(DriveResourceMetadataTest, LargestChangestamp) {
+ DriveResourceMetadata resource_metadata;
+
+ int64 in_changestamp = 123456;
+ DriveFileError error = DRIVE_FILE_ERROR_FAILED;
+ resource_metadata.SetLargestChangestamp(
+ in_changestamp,
+ base::Bind(&test_util::CopyErrorCodeFromFileOperationCallback,
+ &error));
+ google_apis::test_util::RunBlockingPoolTask();
+ EXPECT_EQ(DRIVE_FILE_OK, error);
+
+ int64 out_changestamp = 0;
+ resource_metadata.GetLargestChangestamp(
+ base::Bind(&CopyResultFromGetChangestampCallback,
+ &out_changestamp));
+ google_apis::test_util::RunBlockingPoolTask();
+ DCHECK_EQ(in_changestamp, out_changestamp);
+}
+
TEST_F(DriveResourceMetadataTest, GetEntryByResourceId_RootDirectory) {
DriveResourceMetadata resource_metadata;
diff --git a/chrome/browser/chromeos/drive/mock_drive_file_system.h b/chrome/browser/chromeos/drive/mock_drive_file_system.h
index 44a3800..2f116eb 100644
--- a/chrome/browser/chromeos/drive/mock_drive_file_system.h
+++ b/chrome/browser/chromeos/drive/mock_drive_file_system.h
@@ -97,7 +97,8 @@ class MockDriveFileSystem : public DriveFileSystemInterface {
const FilePath& file_content_path,
const FileOperationCallback& callback) OVERRIDE {
}
- MOCK_CONST_METHOD0(GetMetadata, DriveFileSystemMetadata());
+ MOCK_METHOD1(GetMetadata,
+ void(const GetFilesystemMetadataCallback& callback));
MOCK_METHOD0(Reload, void());
};
diff --git a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
index ce44f40..508dcee 100644
--- a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
@@ -235,6 +235,14 @@ class DriveInternalsWebUIHandler : public content::WebUIMessageHandler {
google_apis::GDataErrorCode status,
scoped_ptr<google_apis::AccountMetadataFeed> account_metadata);
+ // Callback for DriveFilesystem::GetMetadata for local update.
+ void OnGetFilesystemMetadataForLocal(
+ const drive::DriveFileSystemMetadata& metadata);
+
+ // Callback for DriveFilesystem::GetMetadata for local update.
+ void OnGetFilesystemMetadataForDeltaUpdate(
+ const drive::DriveFileSystemMetadata& metadata);
+
// Called when the page requests periodic update.
void OnPeriodicUpdate(const base::ListValue* args);
@@ -401,11 +409,18 @@ void DriveInternalsWebUIHandler::UpdateAccountMetadataSection(
void DriveInternalsWebUIHandler::UpdateLocalMetadataSection(
google_apis::DriveServiceInterface* drive_service) {
- DCHECK(drive_service);
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ GetSystemService()->file_system()->GetMetadata(
+ base::Bind(&DriveInternalsWebUIHandler::OnGetFilesystemMetadataForLocal,
+ weak_ptr_factory_.GetWeakPtr()));
+}
+
+void DriveInternalsWebUIHandler::OnGetFilesystemMetadataForLocal(
+ const drive::DriveFileSystemMetadata& metadata) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
base::DictionaryValue local_metadata;
- const drive::DriveFileSystemMetadata metadata =
- GetSystemService()->file_system()->GetMetadata();
local_metadata.SetDouble("account-largest-changestamp-local",
metadata.largest_changestamp);
local_metadata.SetBoolean("account-metadata-loaded", metadata.loaded);
@@ -414,8 +429,17 @@ void DriveInternalsWebUIHandler::UpdateLocalMetadataSection(
}
void DriveInternalsWebUIHandler::UpdateDeltaUpdateStatusSection() {
- const drive::DriveFileSystemMetadata metadata =
- GetSystemService()->file_system()->GetMetadata();
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ GetSystemService()->file_system()->GetMetadata(
+ base::Bind(
+ &DriveInternalsWebUIHandler::OnGetFilesystemMetadataForDeltaUpdate,
+ weak_ptr_factory_.GetWeakPtr()));
+}
+
+void DriveInternalsWebUIHandler::OnGetFilesystemMetadataForDeltaUpdate(
+ const drive::DriveFileSystemMetadata& metadata) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
base::DictionaryValue delta_update_status;
delta_update_status.SetBoolean("push-notification-enabled",