Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync_file_system/drive_backend/sync_worker.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/sync_worker.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 92 | 92 |
| 93 void SyncWorker::RegisterOrigin( | 93 void SyncWorker::RegisterOrigin( |
| 94 const GURL& origin, | 94 const GURL& origin, |
| 95 const SyncStatusCallback& callback) { | 95 const SyncStatusCallback& callback) { |
| 96 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken()) | 96 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken()) |
| 97 PostInitializeTask(); | 97 PostInitializeTask(); |
| 98 | 98 |
| 99 scoped_ptr<RegisterAppTask> task( | 99 scoped_ptr<RegisterAppTask> task( |
| 100 new RegisterAppTask(context_.get(), origin.host())); | 100 new RegisterAppTask(context_.get(), origin.host())); |
| 101 if (task->CanFinishImmediately()) { | 101 if (task->CanFinishImmediately()) { |
| 102 callback.Run(SYNC_STATUS_OK); | 102 context_->GetUiTaskRunner()->PostTask( |
| 103 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); | |
| 103 return; | 104 return; |
| 104 } | 105 } |
| 105 | 106 |
| 107 // TODO(peria): Forward |callback| to UI thread. | |
| 106 task_manager_->ScheduleSyncTask( | 108 task_manager_->ScheduleSyncTask( |
| 107 FROM_HERE, | 109 FROM_HERE, |
| 108 task.PassAs<SyncTask>(), | 110 task.PassAs<SyncTask>(), |
| 109 SyncTaskManager::PRIORITY_HIGH, | 111 SyncTaskManager::PRIORITY_HIGH, |
| 110 callback); | 112 callback); |
| 111 } | 113 } |
| 112 | 114 |
| 113 void SyncWorker::EnableOrigin( | 115 void SyncWorker::EnableOrigin( |
| 114 const GURL& origin, | 116 const GURL& origin, |
| 115 const SyncStatusCallback& callback) { | 117 const SyncStatusCallback& callback) { |
| 118 // TODO(peria): Forward |callback| to UI thread. | |
| 116 task_manager_->ScheduleTask( | 119 task_manager_->ScheduleTask( |
| 117 FROM_HERE, | 120 FROM_HERE, |
| 118 base::Bind(&SyncWorker::DoEnableApp, | 121 base::Bind(&SyncWorker::DoEnableApp, |
| 119 weak_ptr_factory_.GetWeakPtr(), | 122 weak_ptr_factory_.GetWeakPtr(), |
| 120 origin.host()), | 123 origin.host()), |
| 121 SyncTaskManager::PRIORITY_HIGH, | 124 SyncTaskManager::PRIORITY_HIGH, |
| 122 callback); | 125 callback); |
| 123 } | 126 } |
| 124 | 127 |
| 125 void SyncWorker::DisableOrigin( | 128 void SyncWorker::DisableOrigin( |
| 126 const GURL& origin, | 129 const GURL& origin, |
| 127 const SyncStatusCallback& callback) { | 130 const SyncStatusCallback& callback) { |
| 131 // TODO(peria): Forward |callback| to UI thread. | |
| 128 task_manager_->ScheduleTask( | 132 task_manager_->ScheduleTask( |
| 129 FROM_HERE, | 133 FROM_HERE, |
| 130 base::Bind(&SyncWorker::DoDisableApp, | 134 base::Bind(&SyncWorker::DoDisableApp, |
| 131 weak_ptr_factory_.GetWeakPtr(), | 135 weak_ptr_factory_.GetWeakPtr(), |
| 132 origin.host()), | 136 origin.host()), |
| 133 SyncTaskManager::PRIORITY_HIGH, | 137 SyncTaskManager::PRIORITY_HIGH, |
| 134 callback); | 138 callback); |
| 135 } | 139 } |
| 136 | 140 |
| 137 void SyncWorker::UninstallOrigin( | 141 void SyncWorker::UninstallOrigin( |
| 138 const GURL& origin, | 142 const GURL& origin, |
| 139 RemoteFileSyncService::UninstallFlag flag, | 143 RemoteFileSyncService::UninstallFlag flag, |
| 140 const SyncStatusCallback& callback) { | 144 const SyncStatusCallback& callback) { |
| 145 // TODO(peria): Forward |callback| to UI thread. | |
| 141 task_manager_->ScheduleSyncTask( | 146 task_manager_->ScheduleSyncTask( |
| 142 FROM_HERE, | 147 FROM_HERE, |
| 143 scoped_ptr<SyncTask>( | 148 scoped_ptr<SyncTask>( |
| 144 new UninstallAppTask(context_.get(), origin.host(), flag)), | 149 new UninstallAppTask(context_.get(), origin.host(), flag)), |
| 145 SyncTaskManager::PRIORITY_HIGH, | 150 SyncTaskManager::PRIORITY_HIGH, |
| 146 callback); | 151 callback); |
| 147 } | 152 } |
| 148 | 153 |
| 149 void SyncWorker::ProcessRemoteChange( | 154 void SyncWorker::ProcessRemoteChange( |
| 150 const SyncFileCallback& callback) { | 155 const SyncFileCallback& callback) { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 204 | 209 |
| 205 void SyncWorker::SetSyncEnabled(bool enabled) { | 210 void SyncWorker::SetSyncEnabled(bool enabled) { |
| 206 if (sync_enabled_ == enabled) | 211 if (sync_enabled_ == enabled) |
| 207 return; | 212 return; |
| 208 | 213 |
| 209 RemoteServiceState old_state = GetCurrentState(); | 214 RemoteServiceState old_state = GetCurrentState(); |
| 210 sync_enabled_ = enabled; | 215 sync_enabled_ = enabled; |
| 211 if (old_state == GetCurrentState()) | 216 if (old_state == GetCurrentState()) |
| 212 return; | 217 return; |
| 213 | 218 |
| 214 // TODO(peria): PostTask() | 219 context_->GetUiTaskRunner()->PostTask( |
| 215 sync_engine_->UpdateSyncEnabled(enabled); | 220 FROM_HERE, |
| 221 base::Bind(&SyncEngine::UpdateSyncEnabled, sync_engine_, enabled)); | |
| 216 } | 222 } |
| 217 | 223 |
| 218 SyncStatusCode SyncWorker::SetDefaultConflictResolutionPolicy( | 224 SyncStatusCode SyncWorker::SetDefaultConflictResolutionPolicy( |
| 219 ConflictResolutionPolicy policy) { | 225 ConflictResolutionPolicy policy) { |
| 220 default_conflict_resolution_policy_ = policy; | 226 default_conflict_resolution_policy_ = policy; |
| 221 return SYNC_STATUS_OK; | 227 return SYNC_STATUS_OK; |
| 222 } | 228 } |
| 223 | 229 |
| 224 SyncStatusCode SyncWorker::SetConflictResolutionPolicy( | 230 SyncStatusCode SyncWorker::SetConflictResolutionPolicy( |
| 225 const GURL& origin, | 231 const GURL& origin, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 267 | 273 |
| 268 MaybeStartFetchChanges(); | 274 MaybeStartFetchChanges(); |
| 269 } | 275 } |
| 270 | 276 |
| 271 void SyncWorker::NotifyLastOperationStatus( | 277 void SyncWorker::NotifyLastOperationStatus( |
| 272 SyncStatusCode status, | 278 SyncStatusCode status, |
| 273 bool used_network) { | 279 bool used_network) { |
| 274 UpdateServiceStateFromSyncStatusCode(status, used_network); | 280 UpdateServiceStateFromSyncStatusCode(status, used_network); |
| 275 | 281 |
| 276 if (GetMetadataDatabase()) { | 282 if (GetMetadataDatabase()) { |
| 277 // TODO(peria): Post task | 283 context_->GetUiTaskRunner()->PostTask( |
| 278 sync_engine_->NotifyLastOperationStatus(); | 284 FROM_HERE, |
| 285 base::Bind(&SyncEngine::NotifyLastOperationStatus, sync_engine_)); | |
| 279 } | 286 } |
| 280 } | 287 } |
| 281 | 288 |
| 282 void SyncWorker::OnNotificationReceived() { | 289 void SyncWorker::OnNotificationReceived() { |
| 283 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) | 290 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) |
| 284 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive."); | 291 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive."); |
| 285 | 292 |
| 286 should_check_remote_change_ = true; | 293 should_check_remote_change_ = true; |
| 287 MaybeScheduleNextTask(); | 294 MaybeScheduleNextTask(); |
| 288 } | 295 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 353 sync_enabled_(false), | 360 sync_enabled_(false), |
| 354 default_conflict_resolution_policy_( | 361 default_conflict_resolution_policy_( |
| 355 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), | 362 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), |
| 356 network_available_(false), | 363 network_available_(false), |
| 357 context_(sync_engine_context.Pass()), | 364 context_(sync_engine_context.Pass()), |
| 358 sync_engine_(sync_engine), | 365 sync_engine_(sync_engine), |
| 359 weak_ptr_factory_(this) {} | 366 weak_ptr_factory_(this) {} |
| 360 | 367 |
| 361 void SyncWorker::DoDisableApp(const std::string& app_id, | 368 void SyncWorker::DoDisableApp(const std::string& app_id, |
| 362 const SyncStatusCallback& callback) { | 369 const SyncStatusCallback& callback) { |
| 363 if (GetMetadataDatabase()) | 370 if (GetMetadataDatabase()) { |
| 364 GetMetadataDatabase()->DisableApp(app_id, callback); | 371 GetMetadataDatabase()->DisableApp(app_id, callback); |
| 365 else | 372 } else { |
| 366 callback.Run(SYNC_STATUS_OK); | 373 context_->GetUiTaskRunner()->PostTask( |
| 374 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); | |
| 375 } | |
| 367 } | 376 } |
| 368 | 377 |
| 369 void SyncWorker::DoEnableApp(const std::string& app_id, | 378 void SyncWorker::DoEnableApp(const std::string& app_id, |
| 370 const SyncStatusCallback& callback) { | 379 const SyncStatusCallback& callback) { |
| 371 if (GetMetadataDatabase()) | 380 if (GetMetadataDatabase()) { |
| 372 GetMetadataDatabase()->EnableApp(app_id, callback); | 381 GetMetadataDatabase()->EnableApp(app_id, callback); |
| 373 else | 382 } else { |
| 374 callback.Run(SYNC_STATUS_OK); | 383 context_->GetUiTaskRunner()->PostTask( |
| 384 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); | |
| 385 } | |
| 375 } | 386 } |
| 376 | 387 |
| 377 void SyncWorker::PostInitializeTask() { | 388 void SyncWorker::PostInitializeTask() { |
| 378 DCHECK(!GetMetadataDatabase()); | 389 DCHECK(!GetMetadataDatabase()); |
| 379 | 390 |
| 380 // This initializer task may not run if MetadataDatabase in context_ is | 391 // This initializer task may not run if MetadataDatabase in context_ is |
| 381 // already initialized when it runs. | 392 // already initialized when it runs. |
| 382 SyncEngineInitializer* initializer = | 393 SyncEngineInitializer* initializer = |
| 383 new SyncEngineInitializer(context_.get(), | 394 new SyncEngineInitializer(context_.get(), |
| 384 context_->GetBlockingTaskRunner(), | 395 context_->GetFileTaskRunner(), |
| 385 base_dir_.Append(kDatabaseName), | 396 base_dir_.Append(kDatabaseName), |
| 386 env_override_); | 397 env_override_); |
| 387 task_manager_->ScheduleSyncTask( | 398 task_manager_->ScheduleSyncTask( |
| 388 FROM_HERE, | 399 FROM_HERE, |
| 389 scoped_ptr<SyncTask>(initializer), | 400 scoped_ptr<SyncTask>(initializer), |
| 390 SyncTaskManager::PRIORITY_HIGH, | 401 SyncTaskManager::PRIORITY_HIGH, |
| 391 base::Bind(&SyncWorker::DidInitialize, weak_ptr_factory_.GetWeakPtr(), | 402 base::Bind(&SyncWorker::DidInitialize, |
| 403 weak_ptr_factory_.GetWeakPtr(), | |
| 392 initializer)); | 404 initializer)); |
| 393 } | 405 } |
| 394 | 406 |
| 395 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, | 407 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, |
| 396 SyncStatusCode status) { | 408 SyncStatusCode status) { |
| 397 if (status != SYNC_STATUS_OK) { | 409 if (status != SYNC_STATUS_OK) { |
| 398 if (GetDriveService()->HasRefreshToken()) { | 410 if (GetDriveService()->HasRefreshToken()) { |
| 399 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, | 411 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, |
| 400 "Could not initialize remote service"); | 412 "Could not initialize remote service"); |
| 401 } else { | 413 } else { |
| 402 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, | 414 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, |
| 403 "Authentication required."); | 415 "Authentication required."); |
| 404 } | 416 } |
| 405 return; | 417 return; |
| 406 } | 418 } |
| 407 | 419 |
| 408 scoped_ptr<MetadataDatabase> metadata_database = | 420 scoped_ptr<MetadataDatabase> metadata_database = |
| 409 initializer->PassMetadataDatabase(); | 421 initializer->PassMetadataDatabase(); |
| 410 if (metadata_database) | 422 if (metadata_database) |
| 411 context_->SetMetadataDatabase(metadata_database.Pass()); | 423 context_->SetMetadataDatabase(metadata_database.Pass()); |
| 412 | 424 |
| 413 // TODO(peria): Post task | 425 context_->GetUiTaskRunner()->PostTask( |
| 414 sync_engine_->UpdateRegisteredApps(); | 426 FROM_HERE, |
| 427 base::Bind(&SyncEngine::UpdateRegisteredApps, sync_engine_)); | |
| 415 } | 428 } |
| 416 | 429 |
| 417 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, | 430 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, |
| 418 const SyncFileCallback& callback, | 431 const SyncFileCallback& callback, |
| 419 SyncStatusCode status) { | 432 SyncStatusCode status) { |
| 420 if (syncer->is_sync_root_deletion()) { | 433 if (syncer->is_sync_root_deletion()) { |
| 421 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); | 434 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); |
| 422 PostInitializeTask(); | 435 PostInitializeTask(); |
| 423 callback.Run(status, syncer->url()); | 436 context_->GetUiTaskRunner()->PostTask( |
| 437 FROM_HERE, base::Bind(callback, status, syncer->url())); | |
| 424 return; | 438 return; |
| 425 } | 439 } |
| 426 | 440 |
| 427 if (status == SYNC_STATUS_OK) { | 441 if (status == SYNC_STATUS_OK) { |
| 428 // TODO(peria): Post task | 442 context_->GetUiTaskRunner()->PostTask( |
| 429 sync_engine_->DidProcessRemoteChange(syncer); | 443 FROM_HERE, |
| 444 base::Bind(&SyncEngine::DidProcessRemoteChange, sync_engine_, syncer)); | |
| 430 | 445 |
| 431 if (syncer->sync_action() == SYNC_ACTION_DELETED && | 446 if (syncer->sync_action() == SYNC_ACTION_DELETED && |
| 432 syncer->url().is_valid() && | 447 syncer->url().is_valid() && |
| 433 fileapi::VirtualPath::IsRootPath(syncer->url().path())) { | 448 fileapi::VirtualPath::IsRootPath(syncer->url().path())) { |
| 434 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback)); | 449 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback)); |
| 435 } | 450 } |
| 436 should_check_conflict_ = true; | 451 should_check_conflict_ = true; |
| 437 } | 452 } |
| 438 callback.Run(status, syncer->url()); | 453 |
| 454 context_->GetUiTaskRunner()->PostTask( | |
| 455 FROM_HERE, | |
| 456 base::Bind(callback, status, syncer->url())); | |
| 439 } | 457 } |
| 440 | 458 |
| 441 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer, | 459 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer, |
| 442 const SyncStatusCallback& callback, | 460 const SyncStatusCallback& callback, |
| 443 SyncStatusCode status) { | 461 SyncStatusCode status) { |
| 444 // TODO(peria): Post task | 462 // TODO(peria): PostTask (Simple replace fails DriveBackendSync* tests) |
| 445 sync_engine_->DidApplyLocalChange(syncer, status); | 463 sync_engine_->DidApplyLocalChange(syncer, status); |
| 446 | 464 |
| 447 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) { | 465 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) { |
| 448 RegisterOrigin(syncer->url().origin(), | 466 RegisterOrigin(syncer->url().origin(), |
| 449 base::Bind(&EmptyStatusCallback)); | 467 base::Bind(&EmptyStatusCallback)); |
| 450 } | 468 } |
| 451 | 469 |
| 452 if (syncer->needs_remote_change_listing() && | 470 if (syncer->needs_remote_change_listing() && |
| 453 !listing_remote_changes_) { | 471 !listing_remote_changes_) { |
| 454 task_manager_->ScheduleSyncTask( | 472 task_manager_->ScheduleSyncTask( |
| 455 FROM_HERE, | 473 FROM_HERE, |
| 456 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), | 474 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), |
| 457 SyncTaskManager::PRIORITY_HIGH, | 475 SyncTaskManager::PRIORITY_HIGH, |
| 458 base::Bind(&SyncWorker::DidFetchChanges, | 476 base::Bind(&SyncWorker::DidFetchChanges, |
| 459 weak_ptr_factory_.GetWeakPtr())); | 477 weak_ptr_factory_.GetWeakPtr())); |
| 460 should_check_remote_change_ = false; | 478 should_check_remote_change_ = false; |
| 461 listing_remote_changes_ = true; | 479 listing_remote_changes_ = true; |
| 462 time_to_check_changes_ = | 480 time_to_check_changes_ = |
| 463 base::TimeTicks::Now() + | 481 base::TimeTicks::Now() + |
| 464 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 482 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
| 465 } | 483 } |
| 466 | 484 |
| 467 if (status != SYNC_STATUS_OK && | |
| 468 status != SYNC_STATUS_NO_CHANGE_TO_SYNC) { | |
| 469 callback.Run(status); | |
| 470 return; | |
| 471 } | |
|
tzik
2014/04/21 04:09:10
Doesn't this change break anything?
peria
2014/04/21 04:50:06
No.
If |status| is SYNC_STATUS_OK, |should_check_c
| |
| 472 | |
| 473 if (status == SYNC_STATUS_OK) | 485 if (status == SYNC_STATUS_OK) |
| 474 should_check_conflict_ = true; | 486 should_check_conflict_ = true; |
| 475 | 487 |
| 476 callback.Run(status); | 488 context_->GetUiTaskRunner()->PostTask( |
| 489 FROM_HERE, base::Bind(callback, status)); | |
| 477 } | 490 } |
| 478 | 491 |
| 479 void SyncWorker::MaybeStartFetchChanges() { | 492 void SyncWorker::MaybeStartFetchChanges() { |
| 480 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 493 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
| 481 return; | 494 return; |
| 482 | 495 |
| 483 if (!GetMetadataDatabase()) | 496 if (!GetMetadataDatabase()) |
| 484 return; | 497 return; |
| 485 | 498 |
| 486 if (listing_remote_changes_) | 499 if (listing_remote_changes_) |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 576 const std::string& description) { | 589 const std::string& description) { |
| 577 RemoteServiceState old_state = GetCurrentState(); | 590 RemoteServiceState old_state = GetCurrentState(); |
| 578 service_state_ = state; | 591 service_state_ = state; |
| 579 | 592 |
| 580 if (old_state == GetCurrentState()) | 593 if (old_state == GetCurrentState()) |
| 581 return; | 594 return; |
| 582 | 595 |
| 583 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 596 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 584 "Service state changed: %d->%d: %s", | 597 "Service state changed: %d->%d: %s", |
| 585 old_state, GetCurrentState(), description.c_str()); | 598 old_state, GetCurrentState(), description.c_str()); |
| 586 // TODO(peria): Post task | 599 |
| 587 sync_engine_->UpdateServiceState(description); | 600 context_->GetUiTaskRunner()->PostTask( |
| 601 FROM_HERE, | |
| 602 base::Bind(&SyncEngine::UpdateServiceState, sync_engine_, description)); | |
| 588 } | 603 } |
| 589 | 604 |
| 590 } // namespace drive_backend | 605 } // namespace drive_backend |
| 591 } // namespace sync_file_system | 606 } // namespace sync_file_system |
| OLD | NEW |