Index: chrome/browser/sync_file_system/drive_backend/sync_engine.cc |
diff --git a/chrome/browser/sync_file_system/drive_backend/sync_engine.cc b/chrome/browser/sync_file_system/drive_backend/sync_engine.cc |
index 57753254b4456b2f7b3010fe50fa23256b975ebc..4f4bf7b3e0aacbb72291af926b51718a6bceaa41 100644 |
--- a/chrome/browser/sync_file_system/drive_backend/sync_engine.cc |
+++ b/chrome/browser/sync_file_system/drive_backend/sync_engine.cc |
@@ -170,8 +170,8 @@ void DeleteSoon(const tracked_objects::Location& from_here, |
scoped_ptr<SyncEngine> SyncEngine::CreateForBrowserContext( |
content::BrowserContext* context, |
TaskLogger* task_logger) { |
- scoped_refptr<base::SequencedWorkerPool> worker_pool( |
- content::BrowserThread::GetBlockingPool()); |
+ scoped_refptr<base::SequencedWorkerPool> worker_pool = |
+ content::BrowserThread::GetBlockingPool(); |
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner = |
base::MessageLoopProxy::current(); |
@@ -229,14 +229,17 @@ void SyncEngine::AppendDependsOnFactories( |
SyncEngine::~SyncEngine() { |
Reset(); |
-} |
-void SyncEngine::Reset() { |
+ net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); |
+ if (signin_manager_) |
+ signin_manager_->RemoveObserver(this); |
if (notification_manager_) |
notification_manager_->RemoveObserver(this); |
+} |
+ |
+void SyncEngine::Reset() { |
if (drive_service_) |
drive_service_->RemoveObserver(this); |
- net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); |
DeleteSoon(FROM_HERE, worker_task_runner_, worker_observer_.Pass()); |
DeleteSoon(FROM_HERE, worker_task_runner_, sync_worker_.Pass()); |
@@ -254,6 +257,10 @@ void SyncEngine::Reset() { |
void SyncEngine::Initialize() { |
Reset(); |
+ if (!signin_manager_ || |
+ signin_manager_->GetAuthenticatedAccountId().empty()) |
+ return; |
+ |
scoped_ptr<drive::DriveServiceInterface> drive_service( |
new drive::DriveAPIService( |
token_service_, |
@@ -334,10 +341,7 @@ void SyncEngine::InitializeInternal( |
base::Bind(&SyncWorkerInterface::Initialize, |
base::Unretained(sync_worker_.get()))); |
- if (notification_manager_) |
- notification_manager_->AddObserver(this); |
drive_service_->AddObserver(this); |
- net::NetworkChangeNotifier::AddNetworkChangeObserver(this); |
service_state_ = REMOTE_SERVICE_TEMPORARY_UNAVAILABLE; |
SetSyncEnabled(sync_enabled_); |
@@ -354,6 +358,17 @@ void SyncEngine::AddFileStatusObserver(FileStatusObserver* observer) { |
void SyncEngine::RegisterOrigin(const GURL& origin, |
const SyncStatusCallback& callback) { |
+ if (!sync_worker_) { |
+ // TODO(tzik): Record |origin| and retry the registration after late |
+ // sign-in. Then, return SYNC_STATUS_OK. |
+ if (!signin_manager_ || |
+ signin_manager_->GetAuthenticatedAccountId().empty()) |
+ callback.Run(SYNC_STATUS_AUTHENTICATION_FAILED); |
+ else |
+ callback.Run(SYNC_STATUS_ABORT); |
+ return; |
+ } |
+ |
SyncStatusCallback relayed_callback = RelayCallbackToCurrentThread( |
FROM_HERE, base::Bind(&DidRegisterOrigin, base::TimeTicks::Now(), |
TrackCallback(callback))); |
@@ -367,6 +382,13 @@ void SyncEngine::RegisterOrigin(const GURL& origin, |
void SyncEngine::EnableOrigin( |
const GURL& origin, const SyncStatusCallback& callback) { |
+ if (!sync_worker_) { |
+ // It's safe to return OK immediately since this is also checked in |
+ // SyncWorker initialization. |
+ callback.Run(SYNC_STATUS_OK); |
+ return; |
+ } |
+ |
SyncStatusCallback relayed_callback = RelayCallbackToCurrentThread( |
FROM_HERE, TrackCallback(callback)); |
@@ -379,6 +401,13 @@ void SyncEngine::EnableOrigin( |
void SyncEngine::DisableOrigin( |
const GURL& origin, const SyncStatusCallback& callback) { |
+ if (!sync_worker_) { |
+ // It's safe to return OK immediately since this is also checked in |
+ // SyncWorker initialization. |
+ callback.Run(SYNC_STATUS_OK); |
+ return; |
+ } |
+ |
SyncStatusCallback relayed_callback = RelayCallbackToCurrentThread( |
FROM_HERE, TrackCallback(callback)); |
@@ -394,6 +423,13 @@ void SyncEngine::UninstallOrigin( |
const GURL& origin, |
UninstallFlag flag, |
const SyncStatusCallback& callback) { |
+ if (!sync_worker_) { |
+ // It's safe to return OK immediately since this is also checked in |
+ // SyncWorker initialization. |
+ callback.Run(SYNC_STATUS_OK); |
+ return; |
+ } |
+ |
SyncStatusCallback relayed_callback = RelayCallbackToCurrentThread( |
FROM_HERE, TrackCallback(callback)); |
worker_task_runner_->PostTask( |
@@ -404,9 +440,16 @@ void SyncEngine::UninstallOrigin( |
} |
void SyncEngine::ProcessRemoteChange(const SyncFileCallback& callback) { |
+ base::Closure abort_closure = |
+ base::Bind(callback, SYNC_STATUS_ABORT, fileapi::FileSystemURL()); |
+ |
+ if (!sync_worker_) { |
+ abort_closure.Run(); |
+ return; |
+ } |
+ |
SyncFileCallback tracked_callback = callback_tracker_.Register( |
- base::Bind(callback, SYNC_STATUS_ABORT, fileapi::FileSystemURL()), |
- callback); |
+ abort_closure, callback); |
SyncFileCallback relayed_callback = RelayCallbackToCurrentThread( |
FROM_HERE, tracked_callback); |
worker_task_runner_->PostTask( |
@@ -418,6 +461,10 @@ void SyncEngine::ProcessRemoteChange(const SyncFileCallback& callback) { |
void SyncEngine::SetRemoteChangeProcessor(RemoteChangeProcessor* processor) { |
remote_change_processor_ = processor; |
+ |
+ if (!sync_worker_) |
+ return; |
+ |
remote_change_processor_wrapper_.reset( |
new RemoteChangeProcessorWrapper(processor)); |
@@ -441,11 +488,16 @@ RemoteServiceState SyncEngine::GetCurrentState() const { |
} |
void SyncEngine::GetOriginStatusMap(const StatusMapCallback& callback) { |
- StatusMapCallback tracked_callback = |
- callback_tracker_.Register( |
- base::Bind(callback, base::Passed(scoped_ptr<OriginStatusMap>())), |
- callback); |
+ base::Closure abort_closure = |
+ base::Bind(callback, base::Passed(scoped_ptr<OriginStatusMap>())); |
+ if (!sync_worker_) { |
+ abort_closure.Run(); |
+ return; |
+ } |
+ |
+ StatusMapCallback tracked_callback = |
+ callback_tracker_.Register(abort_closure, callback); |
StatusMapCallback relayed_callback = |
RelayCallbackToCurrentThread(FROM_HERE, tracked_callback); |
@@ -458,10 +510,16 @@ void SyncEngine::GetOriginStatusMap(const StatusMapCallback& callback) { |
void SyncEngine::DumpFiles(const GURL& origin, |
const ListCallback& callback) { |
+ base::Closure abort_closure = |
+ base::Bind(callback, base::Passed(scoped_ptr<base::ListValue>())); |
+ |
+ if (!sync_worker_) { |
+ abort_closure.Run(); |
+ return; |
+ } |
+ |
ListCallback tracked_callback = |
- callback_tracker_.Register( |
- base::Bind(callback, base::Passed(scoped_ptr<base::ListValue>())), |
- callback); |
+ callback_tracker_.Register(abort_closure, callback); |
PostTaskAndReplyWithResult( |
worker_task_runner_, |
@@ -473,10 +531,16 @@ void SyncEngine::DumpFiles(const GURL& origin, |
} |
void SyncEngine::DumpDatabase(const ListCallback& callback) { |
+ base::Closure abort_closure = |
+ base::Bind(callback, base::Passed(scoped_ptr<base::ListValue>())); |
+ |
+ if (!sync_worker_) { |
+ abort_closure.Run(); |
+ return; |
+ } |
+ |
ListCallback tracked_callback = |
- callback_tracker_.Register( |
- base::Bind(callback, base::Passed(scoped_ptr<base::ListValue>())), |
- callback); |
+ callback_tracker_.Register(abort_closure, callback); |
PostTaskAndReplyWithResult( |
worker_task_runner_, |
@@ -488,6 +552,10 @@ void SyncEngine::DumpDatabase(const ListCallback& callback) { |
void SyncEngine::SetSyncEnabled(bool sync_enabled) { |
sync_enabled_ = sync_enabled; |
+ |
+ if (!sync_worker_) |
+ return; |
+ |
worker_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&SyncWorkerInterface::SetSyncEnabled, |
@@ -496,6 +564,9 @@ void SyncEngine::SetSyncEnabled(bool sync_enabled) { |
} |
void SyncEngine::PromoteDemotedChanges() { |
+ if (!sync_worker_) |
+ return; |
+ |
worker_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&SyncWorkerInterface::PromoteDemotedChanges, |
@@ -508,6 +579,11 @@ void SyncEngine::ApplyLocalChange( |
const SyncFileMetadata& local_metadata, |
const fileapi::FileSystemURL& url, |
const SyncStatusCallback& callback) { |
+ if (!sync_worker_) { |
+ callback.Run(SYNC_STATUS_ABORT); |
+ return; |
+ } |
+ |
SyncStatusCallback relayed_callback = RelayCallbackToCurrentThread( |
FROM_HERE, TrackCallback(callback)); |
worker_task_runner_->PostTask( |
@@ -522,6 +598,9 @@ void SyncEngine::ApplyLocalChange( |
} |
void SyncEngine::OnNotificationReceived() { |
+ if (!sync_worker_) |
+ return; |
+ |
worker_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&SyncWorkerInterface::OnNotificationReceived, |
@@ -531,19 +610,19 @@ void SyncEngine::OnNotificationReceived() { |
void SyncEngine::OnPushNotificationEnabled(bool) {} |
void SyncEngine::OnReadyToSendRequests() { |
- // TODO(tzik): Drop current Syncworker and replace with new one. |
- |
- const std::string account_id = |
- signin_manager_ ? signin_manager_->GetAuthenticatedAccountId() : ""; |
+ if (!sync_worker_) |
+ return; |
worker_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&SyncWorkerInterface::OnReadyToSendRequests, |
- base::Unretained(sync_worker_.get()), |
- account_id)); |
+ base::Unretained(sync_worker_.get()))); |
} |
void SyncEngine::OnRefreshTokenInvalid() { |
+ if (!sync_worker_) |
+ return; |
+ |
worker_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&SyncWorkerInterface::OnRefreshTokenInvalid, |
@@ -552,6 +631,9 @@ void SyncEngine::OnRefreshTokenInvalid() { |
void SyncEngine::OnNetworkChanged( |
net::NetworkChangeNotifier::ConnectionType type) { |
+ if (!sync_worker_) |
+ return; |
+ |
worker_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&SyncWorkerInterface::OnNetworkChanged, |
@@ -559,6 +641,23 @@ void SyncEngine::OnNetworkChanged( |
type)); |
} |
+void SyncEngine::GoogleSigninFailed(const GoogleServiceAuthError& error) { |
+ Reset(); |
+ UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, |
+ "Failed to sign in."); |
+} |
+ |
+void SyncEngine::GoogleSigninSucceeded(const std::string& username, |
+ const std::string& password) { |
+ Initialize(); |
+} |
+ |
+void SyncEngine::GoogleSignedOut(const std::string& username) { |
+ Reset(); |
+ UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, |
+ "User signed out."); |
+} |
+ |
SyncEngine::SyncEngine( |
base::SingleThreadTaskRunner* ui_task_runner, |
base::SequencedTaskRunner* worker_task_runner, |
@@ -589,11 +688,16 @@ SyncEngine::SyncEngine( |
env_override_(env_override), |
weak_ptr_factory_(this) { |
DCHECK(sync_file_system_dir_.IsAbsolute()); |
+ if (notification_manager_) |
+ notification_manager_->AddObserver(this); |
+ if (signin_manager_) |
+ signin_manager_->AddObserver(this); |
+ net::NetworkChangeNotifier::AddNetworkChangeObserver(this); |
} |
void SyncEngine::OnPendingFileListUpdated(int item_count) { |
FOR_EACH_OBSERVER( |
- Observer, |
+ SyncServiceObserver, |
service_observers_, |
OnRemoteChangeQueueUpdated(item_count)); |
} |
@@ -613,7 +717,7 @@ void SyncEngine::UpdateServiceState(RemoteServiceState state, |
service_state_ = state; |
FOR_EACH_OBSERVER( |
- Observer, service_observers_, |
+ SyncServiceObserver, service_observers_, |
OnRemoteServiceStateUpdated(state, description)); |
} |