summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/extensions/api/sync_file_system/sync_file_system_apitest.cc31
-rw-r--r--chrome/browser/sync_file_system/drive_file_sync_service.cc132
-rw-r--r--chrome/browser/sync_file_system/drive_file_sync_service.h9
-rw-r--r--chrome/browser/sync_file_system/drive_file_sync_service_unittest.cc60
-rw-r--r--chrome/browser/sync_file_system/file_status_observer.h41
-rw-r--r--chrome/browser/sync_file_system/mock_remote_file_sync_service.cc37
-rw-r--r--chrome/browser/sync_file_system/mock_remote_file_sync_service.h23
-rw-r--r--chrome/browser/sync_file_system/remote_file_sync_service.h9
-rw-r--r--chrome/browser/sync_file_system/sync_file_system_service.cc35
-rw-r--r--chrome/browser/sync_file_system/sync_file_system_service.h12
-rw-r--r--chrome/browser/sync_file_system/sync_file_system_service_unittest.cc13
-rw-r--r--chrome/chrome_browser.gypi1
-rw-r--r--webkit/fileapi/syncable/sync_action.h26
-rw-r--r--webkit/fileapi/syncable/sync_callbacks.h5
-rw-r--r--webkit/fileapi/syncable/sync_operation_result.h11
-rw-r--r--webkit/fileapi/webkit_fileapi.gypi1
16 files changed, 320 insertions, 126 deletions
diff --git a/chrome/browser/extensions/api/sync_file_system/sync_file_system_apitest.cc b/chrome/browser/extensions/api/sync_file_system/sync_file_system_apitest.cc
index 6137138..a3de5a4 100644
--- a/chrome/browser/extensions/api/sync_file_system/sync_file_system_apitest.cc
+++ b/chrome/browser/extensions/api/sync_file_system/sync_file_system_apitest.cc
@@ -2,11 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/bind.h"
#include "base/file_util.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "chrome/browser/extensions/event_names.h"
#include "chrome/browser/extensions/extension_apitest.h"
+#include "chrome/browser/sync_file_system/file_status_observer.h"
#include "chrome/browser/sync_file_system/local_change_processor.h"
#include "chrome/browser/sync_file_system/mock_remote_file_sync_service.h"
#include "chrome/browser/sync_file_system/sync_file_system_service.h"
@@ -75,10 +77,12 @@ ACTION_P2(UpdateRemoteChangeQueue, origin, mock_remote_service) {
mock_remote_service->NotifyRemoteChangeQueueUpdated(1);
}
-ACTION_P3(ReturnWithFakeFileAddedStatus,
+ACTION_P5(ReturnWithFakeFileAddedStatus,
origin,
mock_remote_service,
- sync_operation) {
+ sync_direction,
+ sync_file_status,
+ sync_action_taken) {
fileapi::FileSystemURL mock_url = fileapi::CreateSyncableFileSystemURL(
*origin,
"drive",
@@ -87,8 +91,9 @@ ACTION_P3(ReturnWithFakeFileAddedStatus,
base::MessageLoopProxy::current()->PostTask(
FROM_HERE, base::Bind(arg1,
fileapi::SYNC_STATUS_OK,
- mock_url,
- sync_operation));
+ mock_url));
+ mock_remote_service->NotifyFileStatusChanged(
+ mock_url, sync_direction, sync_file_status, sync_action_taken);
}
} // namespace
@@ -119,9 +124,12 @@ IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, OnFileStatusChanged) {
EXPECT_CALL(*mock_remote_service(), RegisterOriginForTrackingChanges(_, _))
.WillOnce(UpdateRemoteChangeQueue(&origin, mock_remote_service()));
EXPECT_CALL(*mock_remote_service(), ProcessRemoteChange(_, _))
- .WillOnce(ReturnWithFakeFileAddedStatus(&origin,
- mock_remote_service(),
- fileapi::SYNC_OPERATION_ADDED));
+ .WillOnce(ReturnWithFakeFileAddedStatus(
+ &origin,
+ mock_remote_service(),
+ sync_file_system::SYNC_DIRECTION_REMOTE_TO_LOCAL,
+ fileapi::SYNC_FILE_STATUS_SYNCED,
+ fileapi::SYNC_ACTION_ADDED));
ASSERT_TRUE(RunPlatformAppTest("sync_file_system/on_file_status_changed"))
<< message_;
}
@@ -132,9 +140,12 @@ IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, OnFileStatusChangedDeleted) {
EXPECT_CALL(*mock_remote_service(), RegisterOriginForTrackingChanges(_, _))
.WillOnce(UpdateRemoteChangeQueue(&origin, mock_remote_service()));
EXPECT_CALL(*mock_remote_service(), ProcessRemoteChange(_, _))
- .WillOnce(ReturnWithFakeFileAddedStatus(&origin,
- mock_remote_service(),
- fileapi::SYNC_OPERATION_DELETED));
+ .WillOnce(ReturnWithFakeFileAddedStatus(
+ &origin,
+ mock_remote_service(),
+ sync_file_system::SYNC_DIRECTION_REMOTE_TO_LOCAL,
+ fileapi::SYNC_FILE_STATUS_SYNCED,
+ fileapi::SYNC_ACTION_DELETED));
ASSERT_TRUE(RunPlatformAppTest(
"sync_file_system/on_file_status_changed_deleted"))
<< message_;
diff --git a/chrome/browser/sync_file_system/drive_file_sync_service.cc b/chrome/browser/sync_file_system/drive_file_sync_service.cc
index 116e5e4..171853a 100644
--- a/chrome/browser/sync_file_system/drive_file_sync_service.cc
+++ b/chrome/browser/sync_file_system/drive_file_sync_service.cc
@@ -24,6 +24,7 @@
#include "chrome/browser/sync_file_system/drive_file_sync_client.h"
#include "chrome/browser/sync_file_system/drive_file_sync_util.h"
#include "chrome/browser/sync_file_system/drive_metadata_store.h"
+#include "chrome/browser/sync_file_system/file_status_observer.h"
#include "chrome/browser/sync_file_system/remote_change_processor.h"
#include "chrome/browser/sync_file_system/sync_file_system.pb.h"
#include "chrome/common/extensions/extension.h"
@@ -33,7 +34,6 @@
#include "webkit/fileapi/file_system_url.h"
#include "webkit/fileapi/syncable/sync_file_metadata.h"
#include "webkit/fileapi/syncable/sync_file_type.h"
-#include "webkit/fileapi/syncable/sync_operation_result.h"
#include "webkit/fileapi/syncable/syncable_file_system_util.h"
namespace sync_file_system {
@@ -193,25 +193,25 @@ struct DriveFileSyncService::ProcessRemoteChangeParam {
scoped_ptr<TaskToken> token;
RemoteChangeProcessor* processor;
RemoteChange remote_change;
- fileapi::SyncOperationCallback callback;
+ fileapi::SyncFileCallback callback;
DriveMetadata drive_metadata;
bool metadata_updated;
FilePath temporary_file_path;
std::string md5_checksum;
- fileapi::SyncOperationResult operation_result;
+ fileapi::SyncAction sync_action;
bool clear_local_changes;
ProcessRemoteChangeParam(scoped_ptr<TaskToken> token,
RemoteChangeProcessor* processor,
const RemoteChange& remote_change,
- const fileapi::SyncOperationCallback& callback)
+ const fileapi::SyncFileCallback& callback)
: token(token.Pass()),
processor(processor),
remote_change(remote_change),
callback(callback),
metadata_updated(false),
- operation_result(fileapi::SYNC_OPERATION_NONE),
+ sync_action(fileapi::SYNC_ACTION_NONE),
clear_local_changes(true) {
}
};
@@ -343,12 +343,13 @@ scoped_ptr<DriveFileSyncService> DriveFileSyncService::CreateForTesting(
profile, base_dir, sync_client.Pass(), metadata_store.Pass()));
}
-void DriveFileSyncService::AddObserver(Observer* observer) {
- observers_.AddObserver(observer);
+void DriveFileSyncService::AddServiceObserver(Observer* observer) {
+ service_observers_.AddObserver(observer);
}
-void DriveFileSyncService::RemoveObserver(Observer* observer) {
- observers_.RemoveObserver(observer);
+void DriveFileSyncService::AddFileStatusObserver(
+ FileStatusObserver* observer) {
+ file_status_observers_.AddObserver(observer);
}
void DriveFileSyncService::RegisterOriginForTrackingChanges(
@@ -422,7 +423,7 @@ void DriveFileSyncService::UnregisterOriginForTrackingChanges(
void DriveFileSyncService::ProcessRemoteChange(
RemoteChangeProcessor* processor,
- const fileapi::SyncOperationCallback& callback) {
+ const fileapi::SyncFileCallback& callback) {
scoped_ptr<TaskToken> token(
GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Process remote change"));
if (!token) {
@@ -435,8 +436,7 @@ void DriveFileSyncService::ProcessRemoteChange(
if (GetCurrentState() == REMOTE_SERVICE_DISABLED) {
token->ResetTask(FROM_HERE);
NotifyTaskDone(last_operation_status_, token.Pass());
- callback.Run(last_operation_status_, fileapi::FileSystemURL(),
- fileapi::SYNC_OPERATION_NONE);
+ callback.Run(last_operation_status_, fileapi::FileSystemURL());
return;
}
@@ -444,8 +444,7 @@ void DriveFileSyncService::ProcessRemoteChange(
token->ResetTask(FROM_HERE);
NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass());
callback.Run(fileapi::SYNC_STATUS_NO_CHANGE_TO_SYNC,
- fileapi::FileSystemURL(),
- fileapi::SYNC_OPERATION_NONE);
+ fileapi::FileSystemURL());
return;
}
@@ -522,7 +521,7 @@ void DriveFileSyncService::SetSyncEnabled(bool enabled) {
const char* status_message = enabled ? "Sync is enabled" : "Sync is disabled";
FOR_EACH_OBSERVER(
- Observer, observers_,
+ Observer, service_observers_,
OnRemoteServiceStateUpdated(GetCurrentState(), status_message));
if (GetCurrentState() == REMOTE_SERVICE_OK) {
@@ -632,6 +631,12 @@ void DriveFileSyncService::ApplyLocalChange(
base::Bind(&DriveFileSyncService::DidApplyLocalChange,
AsWeakPtr(), base::Passed(&token), url,
google_apis::HTTP_CONFLICT, callback));
+ FOR_EACH_OBSERVER(
+ FileStatusObserver, file_status_observers_,
+ OnFileStatusChanged(url,
+ SYNC_DIRECTION_NONE,
+ fileapi::SYNC_FILE_STATUS_CONFLICTING,
+ fileapi::SYNC_ACTION_NONE));
return;
}
case LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE: {
@@ -647,6 +652,8 @@ void DriveFileSyncService::ApplyLocalChange(
base::Bind(&DriveFileSyncService::DidResolveConflictToRemoteChange,
AsWeakPtr(), base::Passed(&token), url,
metadata.resource_id(), callback));
+ // The synced notification will be dispatched when the remote file is
+ // downloaded.
return;
}
case LOCAL_SYNC_OPERATION_FAIL: {
@@ -666,7 +673,7 @@ void DriveFileSyncService::OnAuthenticated() {
if (GetCurrentState() != REMOTE_SERVICE_OK)
return;
FOR_EACH_OBSERVER(
- Observer, observers_,
+ Observer, service_observers_,
OnRemoteServiceStateUpdated(GetCurrentState(), "Authenticated"));
UpdatePollingDelay(kMinimumPollingDelaySeconds);
SchedulePolling();
@@ -680,7 +687,7 @@ void DriveFileSyncService::OnNetworkConnected() {
if (GetCurrentState() != REMOTE_SERVICE_OK)
return;
FOR_EACH_OBSERVER(
- Observer, observers_,
+ Observer, service_observers_,
OnRemoteServiceStateUpdated(GetCurrentState(), "Network connected"));
UpdatePollingDelay(kMinimumPollingDelaySeconds);
SchedulePolling();
@@ -754,7 +761,7 @@ void DriveFileSyncService::NotifyTaskDone(fileapi::SyncStatusCode status,
// Notify remote sync service state if the state has been changed.
if (!token_->description().empty() || old_state != GetCurrentState()) {
FOR_EACH_OBSERVER(
- Observer, observers_,
+ Observer, service_observers_,
OnRemoteServiceStateUpdated(GetCurrentState(),
token_->done_description()));
}
@@ -788,7 +795,7 @@ void DriveFileSyncService::NotifyTaskDone(fileapi::SyncStatusCode status,
}
// Notify observer of the update of |pending_changes_|.
- FOR_EACH_OBSERVER(Observer, observers_,
+ FOR_EACH_OBSERVER(Observer, service_observers_,
OnRemoteChangeQueueUpdated(pending_changes_.size()));
}
@@ -1204,6 +1211,12 @@ void DriveFileSyncService::DidUploadNewFileForLocalSync(
url, metadata,
base::Bind(&DriveFileSyncService::DidApplyLocalChange,
AsWeakPtr(), base::Passed(&token), url, error, callback));
+ FOR_EACH_OBSERVER(
+ FileStatusObserver, file_status_observers_,
+ OnFileStatusChanged(url,
+ SYNC_DIRECTION_LOCAL_TO_REMOTE,
+ fileapi::SYNC_FILE_STATUS_SYNCED,
+ fileapi::SYNC_ACTION_ADDED));
return;
}
FinalizeLocalSync(token.Pass(), callback,
@@ -1228,6 +1241,12 @@ void DriveFileSyncService::DidUploadExistingFileForLocalSync(
url, metadata,
base::Bind(&DriveFileSyncService::DidApplyLocalChange,
AsWeakPtr(), base::Passed(&token), url, error, callback));
+ FOR_EACH_OBSERVER(
+ FileStatusObserver, file_status_observers_,
+ OnFileStatusChanged(url,
+ SYNC_DIRECTION_LOCAL_TO_REMOTE,
+ fileapi::SYNC_FILE_STATUS_SYNCED,
+ fileapi::SYNC_ACTION_UPDATED));
return;
}
case google_apis::HTTP_CONFLICT: {
@@ -1242,6 +1261,12 @@ void DriveFileSyncService::DidUploadExistingFileForLocalSync(
url, metadata,
base::Bind(&DriveFileSyncService::DidApplyLocalChange,
AsWeakPtr(), base::Passed(&token), url, error, callback));
+ FOR_EACH_OBSERVER(
+ FileStatusObserver, file_status_observers_,
+ OnFileStatusChanged(url,
+ SYNC_DIRECTION_NONE,
+ fileapi::SYNC_FILE_STATUS_CONFLICTING,
+ fileapi::SYNC_ACTION_NONE));
return;
}
case google_apis::HTTP_NOT_MODIFIED: {
@@ -1270,6 +1295,12 @@ void DriveFileSyncService::DidDeleteFileForLocalSync(
url,
base::Bind(&DriveFileSyncService::DidApplyLocalChange,
AsWeakPtr(), base::Passed(&token), url, error, callback));
+ FOR_EACH_OBSERVER(
+ FileStatusObserver, file_status_observers_,
+ OnFileStatusChanged(url,
+ SYNC_DIRECTION_LOCAL_TO_REMOTE,
+ fileapi::SYNC_FILE_STATUS_SYNCED,
+ fileapi::SYNC_ACTION_DELETED));
return;
}
case google_apis::HTTP_PRECONDITION:
@@ -1286,6 +1317,12 @@ void DriveFileSyncService::DidDeleteFileForLocalSync(
url, metadata,
base::Bind(&DriveFileSyncService::DidApplyLocalChange,
AsWeakPtr(), base::Passed(&token), url, error, callback));
+ FOR_EACH_OBSERVER(
+ FileStatusObserver, file_status_observers_,
+ OnFileStatusChanged(url,
+ SYNC_DIRECTION_NONE,
+ fileapi::SYNC_FILE_STATUS_CONFLICTING,
+ fileapi::SYNC_ACTION_NONE));
return;
}
default: {
@@ -1343,20 +1380,20 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
metadata_store_->UpdateEntry(
url, drive_metadata, base::Bind(&EmptyStatusCallback));
- param->operation_result = fileapi::SYNC_OPERATION_ADDED;
+ param->sync_action = fileapi::SYNC_ACTION_ADDED;
DownloadForRemoteSync(param.Pass());
return;
}
DCHECK(remote_file_change.IsDelete());
- param->operation_result = fileapi::SYNC_OPERATION_NONE;
+ param->sync_action = fileapi::SYNC_ACTION_NONE;
DeleteMetadataForRemoteSync(param.Pass());
return;
}
DCHECK(!missing_local_file);
if (remote_file_change.IsAddOrUpdate()) {
- param->operation_result = fileapi::SYNC_OPERATION_NONE;
+ param->sync_action = fileapi::SYNC_ACTION_NONE;
param->drive_metadata.set_conflicted(true);
param->drive_metadata.set_to_be_fetched(false);
@@ -1374,7 +1411,7 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
<< " remote_change: " << remote_file_change.DebugString()
<< " ==> operation: ResolveConflictToLocalChange";
- param->operation_result = fileapi::SYNC_OPERATION_NONE;
+ param->sync_action = fileapi::SYNC_ACTION_NONE;
param->clear_local_changes = false;
RemoteChangeProcessor* processor = param->processor;
@@ -1391,20 +1428,19 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
if (remote_file_change.IsAddOrUpdate()) {
if (local_changes.empty()) {
if (missing_local_file) {
- param->operation_result = fileapi::SYNC_OPERATION_ADDED;
+ param->sync_action = fileapi::SYNC_ACTION_ADDED;
DownloadForRemoteSync(param.Pass());
return;
}
DCHECK(!missing_local_file);
- param->operation_result = fileapi::SYNC_OPERATION_UPDATED;
+ param->sync_action = fileapi::SYNC_ACTION_UPDATED;
DownloadForRemoteSync(param.Pass());
return;
}
DCHECK(!local_changes.empty());
if (local_changes.list().back().IsAddOrUpdate()) {
- param->operation_result = fileapi::SYNC_OPERATION_CONFLICTED;
param->drive_metadata.set_conflicted(true);
param->drive_metadata.set_to_be_fetched(false);
@@ -1412,11 +1448,17 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
url, drive_metadata,
base::Bind(&DriveFileSyncService::CompleteRemoteSync, AsWeakPtr(),
base::Passed(&param)));
+ FOR_EACH_OBSERVER(
+ FileStatusObserver, file_status_observers_,
+ OnFileStatusChanged(url,
+ SYNC_DIRECTION_NONE,
+ fileapi::SYNC_FILE_STATUS_CONFLICTING,
+ fileapi::SYNC_ACTION_NONE));
return;
}
DCHECK(local_changes.list().back().IsDelete());
- param->operation_result = fileapi::SYNC_OPERATION_ADDED;
+ param->sync_action = fileapi::SYNC_ACTION_ADDED;
DownloadForRemoteSync(param.Pass());
return;
}
@@ -1424,7 +1466,7 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
DCHECK(remote_file_change.IsDelete());
if (local_changes.empty()) {
if (missing_local_file) {
- param->operation_result = fileapi::SYNC_OPERATION_NONE;
+ param->sync_action = fileapi::SYNC_ACTION_NONE;
if (missing_db_entry)
CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK);
else
@@ -1432,7 +1474,7 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
return;
}
DCHECK(!missing_local_file);
- param->operation_result = fileapi::SYNC_OPERATION_DELETED;
+ param->sync_action = fileapi::SYNC_ACTION_DELETED;
const fileapi::FileChange& file_change = remote_file_change;
param->processor->ApplyRemoteChange(
@@ -1444,13 +1486,13 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
DCHECK(!local_changes.empty());
if (local_changes.list().back().IsAddOrUpdate()) {
- param->operation_result = fileapi::SYNC_OPERATION_NONE;
+ param->sync_action = fileapi::SYNC_ACTION_NONE;
CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK);
return;
}
DCHECK(local_changes.list().back().IsDelete());
- param->operation_result = fileapi::SYNC_OPERATION_NONE;
+ param->sync_action = fileapi::SYNC_ACTION_NONE;
if (missing_db_entry)
CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK);
else
@@ -1514,7 +1556,7 @@ void DriveFileSyncService::DidDownloadFileForRemoteSync(
google_apis::GDataErrorCode error,
const std::string& md5_checksum) {
if (error == google_apis::HTTP_NOT_MODIFIED) {
- param->operation_result = fileapi::SYNC_OPERATION_NONE;
+ param->sync_action = fileapi::SYNC_ACTION_NONE;
CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK);
return;
}
@@ -1632,14 +1674,24 @@ void DriveFileSyncService::FinalizeRemoteSync(
if (!param->temporary_file_path.empty())
DeleteTemporaryFile(param->temporary_file_path);
NotifyTaskDone(status, param->token.Pass());
- if (status == fileapi::SYNC_STATUS_OK ||
- status == fileapi::SYNC_STATUS_HAS_CONFLICT) {
- param->callback.Run(status, param->remote_change.url,
- param->operation_result);
- } else {
- param->callback.Run(status, param->remote_change.url,
- fileapi::SYNC_OPERATION_NONE);
- }
+ if (status == fileapi::SYNC_STATUS_HAS_CONFLICT ||
+ param->drive_metadata.conflicted()) {
+ FOR_EACH_OBSERVER(
+ FileStatusObserver, file_status_observers_,
+ OnFileStatusChanged(param->remote_change.url,
+ SYNC_DIRECTION_NONE,
+ fileapi::SYNC_FILE_STATUS_CONFLICTING,
+ fileapi::SYNC_ACTION_NONE));
+ } else if (status == fileapi::SYNC_STATUS_OK &&
+ param->sync_action != fileapi::SYNC_ACTION_NONE) {
+ FOR_EACH_OBSERVER(
+ FileStatusObserver, file_status_observers_,
+ OnFileStatusChanged(param->remote_change.url,
+ SYNC_DIRECTION_REMOTE_TO_LOCAL,
+ fileapi::SYNC_FILE_STATUS_SYNCED,
+ param->sync_action));
+ }
+ param->callback.Run(status, param->remote_change.url);
}
bool DriveFileSyncService::AppendRemoteChange(
diff --git a/chrome/browser/sync_file_system/drive_file_sync_service.h b/chrome/browser/sync_file_system/drive_file_sync_service.h
index 4443392..de30199 100644
--- a/chrome/browser/sync_file_system/drive_file_sync_service.h
+++ b/chrome/browser/sync_file_system/drive_file_sync_service.h
@@ -60,8 +60,8 @@ class DriveFileSyncService
scoped_ptr<DriveMetadataStore> metadata_store);
// RemoteFileSyncService overrides.
- virtual void AddObserver(Observer* observer) OVERRIDE;
- virtual void RemoveObserver(Observer* observer) OVERRIDE;
+ virtual void AddServiceObserver(Observer* observer) OVERRIDE;
+ virtual void AddFileStatusObserver(FileStatusObserver* observer) OVERRIDE;
virtual void RegisterOriginForTrackingChanges(
const GURL& origin,
const fileapi::SyncStatusCallback& callback) OVERRIDE;
@@ -70,7 +70,7 @@ class DriveFileSyncService
const fileapi::SyncStatusCallback& callback) OVERRIDE;
virtual void ProcessRemoteChange(
RemoteChangeProcessor* processor,
- const fileapi::SyncOperationCallback& callback) OVERRIDE;
+ const fileapi::SyncFileCallback& callback) OVERRIDE;
virtual LocalChangeProcessor* GetLocalChangeProcessor() OVERRIDE;
virtual bool IsConflicting(const fileapi::FileSystemURL& url) OVERRIDE;
virtual void GetRemoteFileMetadata(
@@ -398,7 +398,8 @@ class DriveFileSyncService
// sync. Polling will be disabled while this is true.
bool is_fetching_changes_;
- ObserverList<Observer> observers_;
+ ObserverList<Observer> service_observers_;
+ ObserverList<FileStatusObserver> file_status_observers_;
// Use WeakPtrFactory instead of SupportsWeakPtr to revoke the weak pointer
// in |token_|.
diff --git a/chrome/browser/sync_file_system/drive_file_sync_service_unittest.cc b/chrome/browser/sync_file_system/drive_file_sync_service_unittest.cc
index 6dbf5b9..58f0d95 100644
--- a/chrome/browser/sync_file_system/drive_file_sync_service_unittest.cc
+++ b/chrome/browser/sync_file_system/drive_file_sync_service_unittest.cc
@@ -18,6 +18,7 @@
#include "chrome/browser/google_apis/test_util.h"
#include "chrome/browser/sync_file_system/drive_file_sync_client.h"
#include "chrome/browser/sync_file_system/drive_metadata_store.h"
+#include "chrome/browser/sync_file_system/file_status_observer.h"
#include "chrome/browser/sync_file_system/mock_remote_change_processor.h"
#include "chrome/browser/sync_file_system/sync_file_system.pb.h"
#include "chrome/common/extensions/extension.h"
@@ -190,6 +191,18 @@ class MockRemoteServiceObserver : public RemoteFileSyncService::Observer {
const std::string& description));
};
+class MockFileStatusObserver: public FileStatusObserver {
+ public:
+ MockFileStatusObserver() {}
+ virtual ~MockFileStatusObserver() {}
+
+ MOCK_METHOD4(OnFileStatusChanged,
+ void(const fileapi::FileSystemURL& url,
+ SyncDirection direction,
+ fileapi::SyncFileStatus sync_status,
+ fileapi::SyncAction action_taken));
+};
+
class DriveFileSyncServiceTest : public testing::Test {
public:
DriveFileSyncServiceTest()
@@ -238,7 +251,8 @@ class DriveFileSyncServiceTest : public testing::Test {
sync_service_ = DriveFileSyncService::CreateForTesting(profile_.get(),
base_dir_.path(), sync_client_.Pass(), metadata_store_.Pass()).Pass();
sync_service_->SetSyncEnabled(enabled);
- sync_service_->AddObserver(&mock_remote_observer_);
+ sync_service_->AddServiceObserver(&mock_remote_observer_);
+ sync_service_->AddFileStatusObserver(&mock_file_status_observer_);
message_loop_.RunUntilIdle();
}
@@ -345,6 +359,10 @@ class DriveFileSyncServiceTest : public testing::Test {
return &mock_remote_observer_;
}
+ StrictMock<MockFileStatusObserver>* mock_file_status_observer() {
+ return &mock_file_status_observer_;
+ }
+
StrictMock<MockRemoteChangeProcessor>* mock_remote_processor() {
return &mock_remote_processor_;
}
@@ -368,32 +386,38 @@ class DriveFileSyncServiceTest : public testing::Test {
void ProcessRemoteChange(fileapi::SyncStatusCode expected_status,
const fileapi::FileSystemURL& expected_url,
- fileapi::SyncOperationResult expected_result) {
+ SyncDirection expected_sync_direction,
+ fileapi::SyncFileStatus expected_sync_file_status,
+ fileapi::SyncAction expected_sync_action) {
fileapi::SyncStatusCode actual_status = fileapi::SYNC_STATUS_UNKNOWN;
fileapi::FileSystemURL actual_url;
- fileapi::SyncOperationResult actual_result = fileapi::SYNC_OPERATION_NONE;
+
+ if (expected_sync_file_status != fileapi::SYNC_FILE_STATUS_UNKNOWN) {
+ EXPECT_CALL(*mock_file_status_observer(),
+ OnFileStatusChanged(expected_url,
+ expected_sync_direction,
+ expected_sync_file_status,
+ expected_sync_action))
+ .Times(1);
+ }
sync_service_->ProcessRemoteChange(
mock_remote_processor(),
base::Bind(&DriveFileSyncServiceTest::DidProcessRemoteChange,
base::Unretained(this),
- &actual_status, &actual_url, &actual_result));
+ &actual_status, &actual_url));
message_loop_.RunUntilIdle();
EXPECT_EQ(expected_status, actual_status);
EXPECT_EQ(expected_url, actual_url);
- EXPECT_EQ(expected_result, actual_result);
}
void DidProcessRemoteChange(fileapi::SyncStatusCode* status_out,
fileapi::FileSystemURL* url_out,
- fileapi::SyncOperationResult* result_out,
fileapi::SyncStatusCode status,
- const fileapi::FileSystemURL& url,
- fileapi::SyncOperationResult result) {
+ const fileapi::FileSystemURL& url) {
*status_out = status;
*url_out = url;
- *result_out = result;
}
void AppendIncrementalRemoteChangeByEntry(
@@ -504,7 +528,9 @@ class DriveFileSyncServiceTest : public testing::Test {
// Owned by |sync_client_|.
StrictMock<google_apis::MockDriveService>* mock_drive_service_;
+
StrictMock<MockRemoteServiceObserver> mock_remote_observer_;
+ StrictMock<MockFileStatusObserver> mock_file_status_observer_;
StrictMock<MockRemoteChangeProcessor> mock_remote_processor_;
scoped_ptr<DriveFileSyncClient> sync_client_;
@@ -814,7 +840,9 @@ TEST_F(DriveFileSyncServiceTest, RemoteChange_NoChange) {
ProcessRemoteChange(fileapi::SYNC_STATUS_NO_CHANGE_TO_SYNC,
fileapi::FileSystemURL(),
- fileapi::SYNC_OPERATION_NONE);
+ SYNC_DIRECTION_NONE,
+ fileapi::SYNC_FILE_STATUS_UNKNOWN,
+ fileapi::SYNC_ACTION_NONE);
EXPECT_TRUE(metadata_store()->batch_sync_origins().empty());
EXPECT_TRUE(metadata_store()->incremental_sync_origins().empty());
EXPECT_TRUE(pending_changes().empty());
@@ -852,7 +880,9 @@ TEST_F(DriveFileSyncServiceTest, RemoteChange_Busy) {
ProcessRemoteChange(fileapi::SYNC_STATUS_FILE_BUSY,
CreateURL(kOrigin, kFileName),
- fileapi::SYNC_OPERATION_NONE);
+ SYNC_DIRECTION_NONE,
+ fileapi::SYNC_FILE_STATUS_UNKNOWN,
+ fileapi::SYNC_ACTION_NONE);
}
TEST_F(DriveFileSyncServiceTest, RemoteChange_NewFile) {
@@ -894,7 +924,9 @@ TEST_F(DriveFileSyncServiceTest, RemoteChange_NewFile) {
ProcessRemoteChange(fileapi::SYNC_STATUS_OK,
CreateURL(kOrigin, kFileName),
- fileapi::SYNC_OPERATION_ADDED);
+ SYNC_DIRECTION_REMOTE_TO_LOCAL,
+ fileapi::SYNC_FILE_STATUS_SYNCED,
+ fileapi::SYNC_ACTION_ADDED);
}
TEST_F(DriveFileSyncServiceTest, RemoteChange_UpdateFile) {
@@ -935,7 +967,9 @@ TEST_F(DriveFileSyncServiceTest, RemoteChange_UpdateFile) {
AppendIncrementalRemoteChangeByEntry(kOrigin, *entry, 12345);
ProcessRemoteChange(fileapi::SYNC_STATUS_OK,
CreateURL(kOrigin, kFileName),
- fileapi::SYNC_OPERATION_UPDATED);
+ SYNC_DIRECTION_REMOTE_TO_LOCAL,
+ fileapi::SYNC_FILE_STATUS_SYNCED,
+ fileapi::SYNC_ACTION_UPDATED);
}
TEST_F(DriveFileSyncServiceTest, RegisterOriginWithSyncDisabled) {
diff --git a/chrome/browser/sync_file_system/file_status_observer.h b/chrome/browser/sync_file_system/file_status_observer.h
new file mode 100644
index 0000000..78ebe5c
--- /dev/null
+++ b/chrome/browser/sync_file_system/file_status_observer.h
@@ -0,0 +1,41 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_FILE_STATUS_OBSERVER_H_
+#define CHROME_BROWSER_SYNC_FILE_SYSTEM_FILE_STATUS_OBSERVER_H_
+
+#include "base/basictypes.h"
+#include "webkit/fileapi/syncable/sync_action.h"
+#include "webkit/fileapi/syncable/sync_file_status.h"
+
+namespace fileapi {
+class FileSystemURL;
+}
+
+namespace sync_file_system {
+
+// TODO(kinuko): Cleanup these enums once we finished the migration.
+enum SyncDirection {
+ SYNC_DIRECTION_NONE,
+ SYNC_DIRECTION_LOCAL_TO_REMOTE,
+ SYNC_DIRECTION_REMOTE_TO_LOCAL,
+};
+
+class FileStatusObserver {
+ public:
+ FileStatusObserver() {}
+ virtual ~FileStatusObserver() {}
+
+ virtual void OnFileStatusChanged(const fileapi::FileSystemURL& url,
+ SyncDirection direction,
+ fileapi::SyncFileStatus sync_status,
+ fileapi::SyncAction action_taken) = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FileStatusObserver);
+};
+
+} // namespace sync_file_system
+
+#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_FILE_STATUS_OBSERVER_H_
diff --git a/chrome/browser/sync_file_system/mock_remote_file_sync_service.cc b/chrome/browser/sync_file_system/mock_remote_file_sync_service.cc
index 5de8bd8..b96e7c8 100644
--- a/chrome/browser/sync_file_system/mock_remote_file_sync_service.cc
+++ b/chrome/browser/sync_file_system/mock_remote_file_sync_service.cc
@@ -11,7 +11,6 @@
#include "base/message_loop_proxy.h"
#include "googleurl/src/gurl.h"
#include "webkit/fileapi/file_system_url.h"
-#include "webkit/fileapi/syncable/sync_operation_result.h"
using ::testing::_;
using ::testing::Invoke;
@@ -23,10 +22,10 @@ const char MockRemoteFileSyncService::kServiceName[] = "mock_sync_service";
MockRemoteFileSyncService::MockRemoteFileSyncService() {
typedef MockRemoteFileSyncService self;
- ON_CALL(*this, AddObserver(_))
- .WillByDefault(Invoke(this, &self::AddObserverStub));
- ON_CALL(*this, RemoveObserver(_))
- .WillByDefault(Invoke(this, &self::RemoveObserverStub));
+ ON_CALL(*this, AddServiceObserver(_))
+ .WillByDefault(Invoke(this, &self::AddServiceObserverStub));
+ ON_CALL(*this, AddFileStatusObserver(_))
+ .WillByDefault(Invoke(this, &self::AddFileStatusObserverStub));
ON_CALL(*this, RegisterOriginForTrackingChanges(_, _))
.WillByDefault(Invoke(this, &self::RegisterOriginForTrackingChangesStub));
ON_CALL(*this, UnregisterOriginForTrackingChanges(_, _))
@@ -51,23 +50,34 @@ MockRemoteFileSyncService::~MockRemoteFileSyncService() {
void MockRemoteFileSyncService::NotifyRemoteChangeQueueUpdated(
int64 pending_changes) {
- FOR_EACH_OBSERVER(Observer, observers_,
+ FOR_EACH_OBSERVER(Observer, service_observers_,
OnRemoteChangeQueueUpdated(pending_changes));
}
void MockRemoteFileSyncService::NotifyRemoteServiceStateUpdated(
RemoteServiceState state,
const std::string& description) {
- FOR_EACH_OBSERVER(Observer, observers_,
+ FOR_EACH_OBSERVER(Observer, service_observers_,
OnRemoteServiceStateUpdated(state, description));
}
-void MockRemoteFileSyncService::AddObserverStub(Observer* observer) {
- observers_.AddObserver(observer);
+void MockRemoteFileSyncService::NotifyFileStatusChanged(
+ const fileapi::FileSystemURL& url,
+ SyncDirection direction,
+ fileapi::SyncFileStatus sync_status,
+ fileapi::SyncAction action_taken) {
+ FOR_EACH_OBSERVER(FileStatusObserver, file_status_observers_,
+ OnFileStatusChanged(url, direction,
+ sync_status, action_taken));
+}
+
+void MockRemoteFileSyncService::AddServiceObserverStub(Observer* observer) {
+ service_observers_.AddObserver(observer);
}
-void MockRemoteFileSyncService::RemoveObserverStub(Observer* observer) {
- observers_.RemoveObserver(observer);
+void MockRemoteFileSyncService::AddFileStatusObserverStub(
+ FileStatusObserver* observer) {
+ file_status_observers_.AddObserver(observer);
}
void MockRemoteFileSyncService::RegisterOriginForTrackingChangesStub(
@@ -88,12 +98,11 @@ void MockRemoteFileSyncService::UnregisterOriginForTrackingChangesStub(
void MockRemoteFileSyncService::ProcessRemoteChangeStub(
RemoteChangeProcessor* processor,
- const fileapi::SyncOperationCallback& callback) {
+ const fileapi::SyncFileCallback& callback) {
base::MessageLoopProxy::current()->PostTask(
FROM_HERE,
base::Bind(callback, fileapi::SYNC_STATUS_NO_CHANGE_TO_SYNC,
- fileapi::FileSystemURL(),
- fileapi::SYNC_OPERATION_NONE));
+ fileapi::FileSystemURL()));
}
void MockRemoteFileSyncService::GetRemoteFileMetadataStub(
diff --git a/chrome/browser/sync_file_system/mock_remote_file_sync_service.h b/chrome/browser/sync_file_system/mock_remote_file_sync_service.h
index 379737f..c07e765 100644
--- a/chrome/browser/sync_file_system/mock_remote_file_sync_service.h
+++ b/chrome/browser/sync_file_system/mock_remote_file_sync_service.h
@@ -9,6 +9,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
+#include "chrome/browser/sync_file_system/file_status_observer.h"
#include "chrome/browser/sync_file_system/mock_local_change_processor.h"
#include "chrome/browser/sync_file_system/remote_change_processor.h"
#include "chrome/browser/sync_file_system/remote_file_sync_service.h"
@@ -27,8 +28,10 @@ class MockRemoteFileSyncService : public RemoteFileSyncService {
virtual ~MockRemoteFileSyncService();
// RemoteFileSyncService overrides.
- MOCK_METHOD1(AddObserver, void(RemoteFileSyncService::Observer* observer));
- MOCK_METHOD1(RemoveObserver, void(RemoteFileSyncService::Observer* observer));
+ MOCK_METHOD1(AddServiceObserver,
+ void(RemoteFileSyncService::Observer* observer));
+ MOCK_METHOD1(AddFileStatusObserver,
+ void(FileStatusObserver* observer));
MOCK_METHOD2(RegisterOriginForTrackingChanges,
void(const GURL& origin,
const fileapi::SyncStatusCallback& callback));
@@ -37,7 +40,7 @@ class MockRemoteFileSyncService : public RemoteFileSyncService {
const fileapi::SyncStatusCallback& callback));
MOCK_METHOD2(ProcessRemoteChange,
void(RemoteChangeProcessor* processor,
- const fileapi::SyncOperationCallback& callback));
+ const fileapi::SyncFileCallback& callback));
MOCK_METHOD0(GetLocalChangeProcessor, LocalChangeProcessor*());
MOCK_METHOD1(IsConflicting, bool(const fileapi::FileSystemURL& url));
MOCK_METHOD2(GetRemoteFileMetadata,
@@ -55,6 +58,11 @@ class MockRemoteFileSyncService : public RemoteFileSyncService {
void NotifyRemoteServiceStateUpdated(
RemoteServiceState state,
const std::string& description);
+ void NotifyFileStatusChanged(
+ const fileapi::FileSystemURL& url,
+ SyncDirection direction,
+ fileapi::SyncFileStatus sync_status,
+ fileapi::SyncAction action_taken);
// Sets conflict file information. The information is returned by
// the default action for GetRemoteConflictFileInfo.
@@ -74,8 +82,8 @@ class MockRemoteFileSyncService : public RemoteFileSyncService {
typedef std::map<fileapi::FileSystemURL, fileapi::SyncFileMetadata,
fileapi::FileSystemURL::Comparator> FileMetadataMap;
- void AddObserverStub(Observer* observer);
- void RemoveObserverStub(Observer* observer);
+ void AddServiceObserverStub(Observer* observer);
+ void AddFileStatusObserverStub(FileStatusObserver* observer);
void RegisterOriginForTrackingChangesStub(
const GURL& origin,
const fileapi::SyncStatusCallback& callback);
@@ -84,7 +92,7 @@ class MockRemoteFileSyncService : public RemoteFileSyncService {
const fileapi::SyncStatusCallback& callback);
void ProcessRemoteChangeStub(
RemoteChangeProcessor* processor,
- const fileapi::SyncOperationCallback& callback);
+ const fileapi::SyncFileCallback& callback);
void GetRemoteFileMetadataStub(
const fileapi::FileSystemURL& url,
const fileapi::SyncFileMetadataCallback& callback);
@@ -95,7 +103,8 @@ class MockRemoteFileSyncService : public RemoteFileSyncService {
// For default implementation.
MockLocalChangeProcessor mock_local_change_processor_;
- ObserverList<Observer> observers_;
+ ObserverList<Observer> service_observers_;
+ ObserverList<FileStatusObserver> file_status_observers_;
DISALLOW_COPY_AND_ASSIGN(MockRemoteFileSyncService);
};
diff --git a/chrome/browser/sync_file_system/remote_file_sync_service.h b/chrome/browser/sync_file_system/remote_file_sync_service.h
index 06bda93..85faff5 100644
--- a/chrome/browser/sync_file_system/remote_file_sync_service.h
+++ b/chrome/browser/sync_file_system/remote_file_sync_service.h
@@ -15,8 +15,9 @@ class GURL;
namespace sync_file_system {
-class RemoteChangeProcessor;
+class FileStatusObserver;
class LocalChangeProcessor;
+class RemoteChangeProcessor;
enum RemoteServiceState {
// Remote service is up and running, or has not seen any errors yet.
@@ -77,8 +78,8 @@ class RemoteFileSyncService {
virtual ~RemoteFileSyncService() {}
// Adds and removes observers.
- virtual void AddObserver(Observer* observer) = 0;
- virtual void RemoveObserver(Observer* observer) = 0;
+ virtual void AddServiceObserver(Observer* observer) = 0;
+ virtual void AddFileStatusObserver(FileStatusObserver* observer) = 0;
// Registers |origin| to track remote side changes for the |origin|.
// Upon completion, invokes |callback|.
@@ -103,7 +104,7 @@ class RemoteFileSyncService {
// the control to the sync engine).
virtual void ProcessRemoteChange(
RemoteChangeProcessor* processor,
- const fileapi::SyncOperationCallback& callback) = 0;
+ const fileapi::SyncFileCallback& callback) = 0;
// Returns a LocalChangeProcessor that applies a local change to the remote
// storage backed by this service.
diff --git a/chrome/browser/sync_file_system/sync_file_system_service.cc b/chrome/browser/sync_file_system/sync_file_system_service.cc
index 7b871bd..50afbee 100644
--- a/chrome/browser/sync_file_system/sync_file_system_service.cc
+++ b/chrome/browser/sync_file_system/sync_file_system_service.cc
@@ -26,6 +26,7 @@
#include "googleurl/src/gurl.h"
#include "webkit/fileapi/file_system_context.h"
#include "webkit/fileapi/syncable/sync_file_metadata.h"
+#include "webkit/fileapi/syncable/sync_operation_result.h"
#include "webkit/fileapi/syncable/sync_status_code.h"
using content::BrowserThread;
@@ -237,7 +238,9 @@ void SyncFileSystemService::Initialize(
remote_file_service_ = remote_file_service.Pass();
local_file_service_->AddChangeObserver(this);
- remote_file_service_->AddObserver(this);
+
+ remote_file_service_->AddServiceObserver(this);
+ remote_file_service_->AddFileStatusObserver(this);
ProfileSyncServiceBase* profile_sync_service =
ProfileSyncServiceFactory::GetForProfile(profile_);
@@ -352,13 +355,11 @@ void SyncFileSystemService::MaybeStartLocalSync() {
void SyncFileSystemService::DidProcessRemoteChange(
fileapi::SyncStatusCode status,
- const FileSystemURL& url,
- fileapi::SyncOperationResult result) {
+ const FileSystemURL& url) {
DVLOG(1) << "DidProcessRemoteChange: "
<< " status=" << status
<< " (" << SyncStatusCodeToString(status) << ")"
- << " url=" << url.DebugString()
- << " operation_result=" << result;
+ << " url=" << url.DebugString();
DCHECK(remote_sync_running_);
remote_sync_running_ = false;
@@ -381,13 +382,6 @@ void SyncFileSystemService::DidProcessRemoteChange(
return;
}
- if ((status == fileapi::SYNC_STATUS_OK ||
- status == fileapi::SYNC_STATUS_HAS_CONFLICT) &&
- result != fileapi::SYNC_OPERATION_NONE) {
- // Notify observers of the changes made for a remote sync.
- FOR_EACH_OBSERVER(SyncEventObserver, observers_,
- OnFileSynced(url, result));
- }
base::MessageLoopProxy::current()->PostTask(
FROM_HERE, base::Bind(&SyncFileSystemService::MaybeStartSync,
AsWeakPtr()));
@@ -410,11 +404,6 @@ void SyncFileSystemService::DidProcessLocalChange(
DCHECK(url.is_valid());
local_file_service_->ClearSyncFlagForURL(url);
- if (status == fileapi::SYNC_STATUS_HAS_CONFLICT) {
- FOR_EACH_OBSERVER(SyncEventObserver, observers_,
- OnFileSynced(url, fileapi::SYNC_OPERATION_CONFLICTED));
- }
-
base::MessageLoopProxy::current()->PostTask(
FROM_HERE, base::Bind(&SyncFileSystemService::MaybeStartSync,
AsWeakPtr()));
@@ -512,6 +501,18 @@ void SyncFileSystemService::OnStateChanged() {
UpdateSyncEnabledStatus(profile_sync_service);
}
+void SyncFileSystemService::OnFileStatusChanged(
+ const FileSystemURL& url,
+ SyncDirection direction,
+ fileapi::SyncFileStatus sync_status,
+ fileapi::SyncAction action_taken) {
+ // TODO(kinuko,calvinlo): Update this line.
+ FOR_EACH_OBSERVER(
+ SyncEventObserver, observers_,
+ OnFileSynced(url,
+ static_cast<fileapi::SyncOperationResult>(action_taken)));
+}
+
void SyncFileSystemService::UpdateSyncEnabledStatus(
ProfileSyncServiceBase* profile_sync_service) {
if (!profile_sync_service->HasSyncSetupCompleted())
diff --git a/chrome/browser/sync_file_system/sync_file_system_service.h b/chrome/browser/sync_file_system/sync_file_system_service.h
index 4c6c65d1..2fbf74b 100644
--- a/chrome/browser/sync_file_system/sync_file_system_service.h
+++ b/chrome/browser/sync_file_system/sync_file_system_service.h
@@ -17,6 +17,7 @@
#include "chrome/browser/api/sync/profile_sync_service_observer.h"
#include "chrome/browser/profiles/profile_keyed_service.h"
#include "chrome/browser/profiles/profile_keyed_service_factory.h"
+#include "chrome/browser/sync_file_system/file_status_observer.h"
#include "chrome/browser/sync_file_system/local_file_sync_service.h"
#include "chrome/browser/sync_file_system/remote_file_sync_service.h"
#include "content/public/browser/notification_observer.h"
@@ -39,6 +40,7 @@ class SyncFileSystemService
public ProfileSyncServiceObserver,
public LocalFileSyncService::Observer,
public RemoteFileSyncService::Observer,
+ public FileStatusObserver,
public content::NotificationObserver,
public base::SupportsWeakPtr<SyncFileSystemService> {
public:
@@ -99,8 +101,7 @@ class SyncFileSystemService
// Callbacks for remote/local sync.
void DidProcessRemoteChange(fileapi::SyncStatusCode status,
- const fileapi::FileSystemURL& url,
- fileapi::SyncOperationResult result);
+ const fileapi::FileSystemURL& url);
void DidProcessLocalChange(fileapi::SyncStatusCode status,
const fileapi::FileSystemURL& url);
@@ -126,6 +127,13 @@ class SyncFileSystemService
// ProfileSyncServiceObserver:
virtual void OnStateChanged() OVERRIDE;
+ // SyncFileStatusObserver:
+ virtual void OnFileStatusChanged(
+ const fileapi::FileSystemURL& url,
+ SyncDirection direction,
+ fileapi::SyncFileStatus sync_status,
+ fileapi::SyncAction action_taken) OVERRIDE;
+
// Check the profile's sync preference settings and call
// remote_file_service_->SetSyncEnabled() to update the status.
// |profile_sync_service| must be non-null.
diff --git a/chrome/browser/sync_file_system/sync_file_system_service_unittest.cc b/chrome/browser/sync_file_system/sync_file_system_service_unittest.cc
index 6323adf..6cb80ff 100644
--- a/chrome/browser/sync_file_system/sync_file_system_service_unittest.cc
+++ b/chrome/browser/sync_file_system/sync_file_system_service_unittest.cc
@@ -108,9 +108,9 @@ ACTION_P(MockStatusCallback, status) {
FROM_HERE, base::Bind(arg3, status));
}
-ACTION_P3(MockSyncOperationCallback, status, url, operation_type) {
+ACTION_P2(MockSyncFileCallback, status, url) {
base::MessageLoopProxy::current()->PostTask(
- FROM_HERE, base::Bind(arg1, status, url, operation_type));
+ FROM_HERE, base::Bind(arg1, status, url));
}
class SyncFileSystemServiceTest : public testing::Test {
@@ -131,7 +131,9 @@ class SyncFileSystemServiceTest : public testing::Test {
sync_service_.reset(new SyncFileSystemService(&profile_));
EXPECT_CALL(*mock_remote_service(),
- AddObserver(sync_service_.get())).Times(1);
+ AddServiceObserver(sync_service_.get())).Times(1);
+ EXPECT_CALL(*mock_remote_service(),
+ AddFileStatusObserver(sync_service_.get())).Times(1);
sync_service_->Initialize(
make_scoped_ptr(local_service_),
@@ -378,9 +380,8 @@ TEST_F(SyncFileSystemServiceTest, SimpleSyncFlowWithFileBusy) {
// Return with SYNC_STATUS_FILE_BUSY once.
EXPECT_CALL(*mock_remote_service(), ProcessRemoteChange(_, _))
- .WillOnce(MockSyncOperationCallback(fileapi::SYNC_STATUS_FILE_BUSY,
- kFile,
- fileapi::SYNC_OPERATION_NONE));
+ .WillOnce(MockSyncFileCallback(fileapi::SYNC_STATUS_FILE_BUSY,
+ kFile));
// ProcessRemoteChange should be called again when the becomes
// not busy.
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index a4ee93b..0d7de8b 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -2051,6 +2051,7 @@
'browser/sync_file_system/drive_file_sync_util.h',
'browser/sync_file_system/drive_metadata_store.cc',
'browser/sync_file_system/drive_metadata_store.h',
+ 'browser/sync_file_system/file_status_observer.h',
'browser/sync_file_system/local_change_processor.h',
'browser/sync_file_system/local_file_sync_service.cc',
'browser/sync_file_system/local_file_sync_service.h',
diff --git a/webkit/fileapi/syncable/sync_action.h b/webkit/fileapi/syncable/sync_action.h
new file mode 100644
index 0000000..5f93b45
--- /dev/null
+++ b/webkit/fileapi/syncable/sync_action.h
@@ -0,0 +1,26 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBKIT_FILEAPI_SYNCABLE_SYNC_ACTION_H_
+#define WEBKIT_FILEAPI_SYNCABLE_SYNC_ACTION_H_
+
+namespace fileapi {
+
+enum SyncAction {
+ // Indicates no action has been made.
+ SYNC_ACTION_NONE,
+
+ // Indicates a new file or directory has been added.
+ SYNC_ACTION_ADDED,
+
+ // Indicates an existing file or directory has been updated.
+ SYNC_ACTION_UPDATED,
+
+ // Indicates a file or directory has been deleted.
+ SYNC_ACTION_DELETED,
+};
+
+} // namespace fileapi
+
+#endif // WEBKIT_FILEAPI_SYNCABLE_SYNC_ACTION_H_
diff --git a/webkit/fileapi/syncable/sync_callbacks.h b/webkit/fileapi/syncable/sync_callbacks.h
index 443ec61..6d725aa 100644
--- a/webkit/fileapi/syncable/sync_callbacks.h
+++ b/webkit/fileapi/syncable/sync_callbacks.h
@@ -37,11 +37,6 @@ typedef base::Callback<void(fileapi::SyncStatusCode status,
ConflictFileInfoCallback;
typedef base::Callback<void(SyncStatusCode status,
- const FileSystemURL& url,
- SyncOperationResult result)>
- SyncOperationCallback;
-
-typedef base::Callback<void(SyncStatusCode status,
SyncFileStatus sync_file_status)>
SyncFileStatusCallback;
diff --git a/webkit/fileapi/syncable/sync_operation_result.h b/webkit/fileapi/syncable/sync_operation_result.h
index d999a47..3c7b208 100644
--- a/webkit/fileapi/syncable/sync_operation_result.h
+++ b/webkit/fileapi/syncable/sync_operation_result.h
@@ -5,20 +5,23 @@
#ifndef WEBKIT_FILEAPI_SYNCABLE_SYNC_OPERATION_RESULT_H_
#define WEBKIT_FILEAPI_SYNCABLE_SYNC_OPERATION_RESULT_H_
+#include "webkit/fileapi/syncable/sync_action.h"
+
namespace fileapi {
+// TODO(kinuko): Deprecate this.
enum SyncOperationResult {
// Indicates no operation has been made.
- SYNC_OPERATION_NONE,
+ SYNC_OPERATION_NONE = SYNC_ACTION_NONE,
// Indicates a new file or directory has been added.
- SYNC_OPERATION_ADDED,
+ SYNC_OPERATION_ADDED = SYNC_ACTION_ADDED,
// Indicates an existing file or directory has been updated.
- SYNC_OPERATION_UPDATED,
+ SYNC_OPERATION_UPDATED = SYNC_ACTION_UPDATED,
// Indicates a file or directory has been deleted.
- SYNC_OPERATION_DELETED,
+ SYNC_OPERATION_DELETED = SYNC_ACTION_DELETED,
// Indicates a file or directory has conflicting changes.
SYNC_OPERATION_CONFLICTED,
diff --git a/webkit/fileapi/webkit_fileapi.gypi b/webkit/fileapi/webkit_fileapi.gypi
index 471f415..41e5305 100644
--- a/webkit/fileapi/webkit_fileapi.gypi
+++ b/webkit/fileapi/webkit_fileapi.gypi
@@ -107,6 +107,7 @@
'../fileapi/syncable/sync_file_status.h',
'../fileapi/syncable/sync_file_type.h',
'../fileapi/syncable/sync_operation_result.h',
+ '../fileapi/syncable/sync_action.h',
'../fileapi/syncable/sync_status_code.cc',
'../fileapi/syncable/sync_status_code.h',
'../fileapi/syncable/syncable_file_operation_runner.cc',