| 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" |
| 11 #include "base/threading/sequenced_worker_pool.h" | 11 #include "base/threading/sequenced_worker_pool.h" |
| 12 #include "base/values.h" | 12 #include "base/values.h" |
| 13 #include "chrome/browser/drive/drive_api_service.h" | 13 #include "chrome/browser/drive/drive_api_service.h" |
| 14 #include "chrome/browser/drive/drive_notification_manager.h" | 14 #include "chrome/browser/drive/drive_notification_manager.h" |
| 15 #include "chrome/browser/drive/drive_notification_manager_factory.h" | 15 #include "chrome/browser/drive/drive_notification_manager_factory.h" |
| 16 #include "chrome/browser/drive/drive_service_interface.h" | 16 #include "chrome/browser/drive/drive_service_interface.h" |
| 17 #include "chrome/browser/drive/drive_uploader.h" | 17 #include "chrome/browser/drive/drive_uploader.h" |
| 18 #include "chrome/browser/extensions/extension_service.h" | 18 #include "chrome/browser/extensions/extension_service.h" |
| 19 #include "chrome/browser/profiles/profile.h" | 19 #include "chrome/browser/profiles/profile.h" |
| 20 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 20 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
| 21 #include "chrome/browser/signin/signin_manager_factory.h" | 21 #include "chrome/browser/signin/signin_manager_factory.h" |
| 22 #include "chrome/browser/sync_file_system/drive_backend/callback_helper.h" |
| 22 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h" | 23 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h" |
| 23 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" | 24 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" |
| 24 #include "chrome/browser/sync_file_system/drive_backend/list_changes_task.h" | 25 #include "chrome/browser/sync_file_system/drive_backend/list_changes_task.h" |
| 25 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
" | 26 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
" |
| 26 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 27 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
| 27 #include "chrome/browser/sync_file_system/drive_backend/register_app_task.h" | 28 #include "chrome/browser/sync_file_system/drive_backend/register_app_task.h" |
| 28 #include "chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h
" | 29 #include "chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h
" |
| 29 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" | 30 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" |
| 30 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" | 31 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" |
| 31 #include "chrome/browser/sync_file_system/drive_backend/sync_task.h" | 32 #include "chrome/browser/sync_file_system/drive_backend/sync_task.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 48 namespace sync_file_system { | 49 namespace sync_file_system { |
| 49 | 50 |
| 50 class RemoteChangeProcessor; | 51 class RemoteChangeProcessor; |
| 51 | 52 |
| 52 namespace drive_backend { | 53 namespace drive_backend { |
| 53 | 54 |
| 54 namespace { | 55 namespace { |
| 55 | 56 |
| 56 void EmptyStatusCallback(SyncStatusCode status) {} | 57 void EmptyStatusCallback(SyncStatusCode status) {} |
| 57 | 58 |
| 59 void QueryAppStatusOnUIThread( |
| 60 const base::WeakPtr<ExtensionServiceInterface>& extension_service_ptr, |
| 61 const std::vector<std::string>* app_ids, |
| 62 SyncWorker::AppStatusMap* status, |
| 63 const base::Closure& callback) { |
| 64 ExtensionServiceInterface* extension_service = extension_service_ptr.get(); |
| 65 if (!extension_service) { |
| 66 callback.Run(); |
| 67 return; |
| 68 } |
| 69 |
| 70 for (std::vector<std::string>::const_iterator itr = app_ids->begin(); |
| 71 itr != app_ids->end(); ++itr) { |
| 72 const std::string& app_id = *itr; |
| 73 if (!extension_service->GetInstalledExtension(app_id)) |
| 74 (*status)[app_id] = SyncWorker::APP_STATUS_UNINSTALLED; |
| 75 else if (!extension_service->IsExtensionEnabled(app_id)) |
| 76 (*status)[app_id] = SyncWorker::APP_STATUS_DISABLED; |
| 77 else |
| 78 (*status)[app_id] = SyncWorker::APP_STATUS_ENABLED; |
| 79 } |
| 80 |
| 81 callback.Run(); |
| 82 } |
| 83 |
| 58 } // namespace | 84 } // namespace |
| 59 | 85 |
| 60 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker( | 86 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker( |
| 61 const base::FilePath& base_dir, | 87 const base::FilePath& base_dir, |
| 62 Observer* observer, | 88 Observer* observer, |
| 63 ExtensionServiceInterface* extension_service, | 89 const base::WeakPtr<ExtensionServiceInterface>& extension_service, |
| 64 scoped_ptr<SyncEngineContext> sync_engine_context, | 90 scoped_ptr<SyncEngineContext> sync_engine_context, |
| 65 leveldb::Env* env_override) { | 91 leveldb::Env* env_override) { |
| 66 scoped_ptr<SyncWorker> sync_worker( | 92 scoped_ptr<SyncWorker> sync_worker( |
| 67 new SyncWorker(base_dir, | 93 new SyncWorker(base_dir, |
| 68 extension_service, | 94 extension_service, |
| 69 sync_engine_context.Pass(), | 95 sync_engine_context.Pass(), |
| 70 env_override)); | 96 env_override)); |
| 71 sync_worker->AddObserver(observer); | 97 sync_worker->AddObserver(observer); |
| 72 sync_worker->Initialize(); | 98 sync_worker->Initialize(); |
| 73 | 99 |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 SyncTaskManager* SyncWorker::GetSyncTaskManager() { | 374 SyncTaskManager* SyncWorker::GetSyncTaskManager() { |
| 349 return task_manager_.get(); | 375 return task_manager_.get(); |
| 350 } | 376 } |
| 351 | 377 |
| 352 void SyncWorker::AddObserver(Observer* observer) { | 378 void SyncWorker::AddObserver(Observer* observer) { |
| 353 observers_.AddObserver(observer); | 379 observers_.AddObserver(observer); |
| 354 } | 380 } |
| 355 | 381 |
| 356 SyncWorker::SyncWorker( | 382 SyncWorker::SyncWorker( |
| 357 const base::FilePath& base_dir, | 383 const base::FilePath& base_dir, |
| 358 ExtensionServiceInterface* extension_service, | 384 const base::WeakPtr<ExtensionServiceInterface>& extension_service, |
| 359 scoped_ptr<SyncEngineContext> sync_engine_context, | 385 scoped_ptr<SyncEngineContext> sync_engine_context, |
| 360 leveldb::Env* env_override) | 386 leveldb::Env* env_override) |
| 361 : base_dir_(base_dir), | 387 : base_dir_(base_dir), |
| 362 env_override_(env_override), | 388 env_override_(env_override), |
| 363 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), | 389 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), |
| 364 should_check_conflict_(true), | 390 should_check_conflict_(true), |
| 365 should_check_remote_change_(true), | 391 should_check_remote_change_(true), |
| 366 listing_remote_changes_(false), | 392 listing_remote_changes_(false), |
| 367 sync_enabled_(false), | 393 sync_enabled_(false), |
| 368 default_conflict_resolution_policy_( | 394 default_conflict_resolution_policy_( |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 | 452 |
| 427 scoped_ptr<MetadataDatabase> metadata_database = | 453 scoped_ptr<MetadataDatabase> metadata_database = |
| 428 initializer->PassMetadataDatabase(); | 454 initializer->PassMetadataDatabase(); |
| 429 if (metadata_database) | 455 if (metadata_database) |
| 430 context_->SetMetadataDatabase(metadata_database.Pass()); | 456 context_->SetMetadataDatabase(metadata_database.Pass()); |
| 431 | 457 |
| 432 UpdateRegisteredApp(); | 458 UpdateRegisteredApp(); |
| 433 } | 459 } |
| 434 | 460 |
| 435 void SyncWorker::UpdateRegisteredApp() { | 461 void SyncWorker::UpdateRegisteredApp() { |
| 436 if (extension_service_) | |
| 437 return; | |
| 438 | |
| 439 MetadataDatabase* metadata_db = GetMetadataDatabase(); | 462 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
| 440 DCHECK(metadata_db); | 463 DCHECK(metadata_db); |
| 441 std::vector<std::string> app_ids; | 464 |
| 442 metadata_db->GetRegisteredAppIDs(&app_ids); | 465 scoped_ptr<std::vector<std::string> > app_ids(new std::vector<std::string>); |
| 466 metadata_db->GetRegisteredAppIDs(app_ids.get()); |
| 467 |
| 468 AppStatusMap* app_status = new AppStatusMap; |
| 469 base::Closure callback = |
| 470 base::Bind(&SyncWorker::DidQueryAppStatus, |
| 471 weak_ptr_factory_.GetWeakPtr(), |
| 472 base::Owned(app_status)); |
| 473 |
| 474 context_->GetUITaskRunner()->PostTask( |
| 475 FROM_HERE, |
| 476 base::Bind(&QueryAppStatusOnUIThread, |
| 477 extension_service_, |
| 478 base::Owned(app_ids.release()), |
| 479 app_status, |
| 480 RelayCallbackToTaskRunner( |
| 481 context_->GetWorkerTaskRunner(), |
| 482 FROM_HERE, callback))); |
| 483 } |
| 484 |
| 485 void SyncWorker::DidQueryAppStatus(const AppStatusMap* app_status) { |
| 486 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
| 487 DCHECK(metadata_db); |
| 443 | 488 |
| 444 // Update the status of every origin using status from ExtensionService. | 489 // Update the status of every origin using status from ExtensionService. |
| 445 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); | 490 for (AppStatusMap::const_iterator itr = app_status->begin(); |
| 446 itr != app_ids.end(); ++itr) { | 491 itr != app_status->end(); ++itr) { |
| 447 const std::string& app_id = *itr; | 492 const std::string& app_id = itr->first; |
| 448 GURL origin = | 493 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); |
| 449 extensions::Extension::GetBaseURLFromExtensionId(app_id); | |
| 450 | 494 |
| 451 // TODO(tzik): Switch |extension_service_| to a wrapper and make this | 495 if (itr->second == APP_STATUS_UNINSTALLED) { |
| 452 // call async. | 496 // Extension has been uninstalled. |
| 453 if (!extension_service_->GetInstalledExtension(app_id)) { | 497 // (At this stage we can't know if it was unpacked extension or not, |
| 454 // Extension has been uninstalled. | 498 // so just purge the remote folder.) |
| 455 // (At this stage we can't know if it was unpacked extension or not, | 499 UninstallOrigin(origin, |
| 456 // so just purge the remote folder.) | 500 RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, |
| 457 UninstallOrigin(origin, | 501 base::Bind(&EmptyStatusCallback)); |
| 458 RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, | 502 continue; |
| 459 base::Bind(&EmptyStatusCallback)); | 503 } |
| 460 continue; | |
| 461 } | |
| 462 FileTracker tracker; | |
| 463 if (!metadata_db->FindAppRootTracker(app_id, &tracker)) { | |
| 464 // App will register itself on first run. | |
| 465 continue; | |
| 466 } | |
| 467 | 504 |
| 468 // TODO(tzik): Switch |extension_service_| to a wrapper and make this | 505 FileTracker tracker; |
| 469 // call async. | 506 if (!metadata_db->FindAppRootTracker(app_id, &tracker)) { |
| 470 bool is_app_enabled = extension_service_->IsExtensionEnabled(app_id); | 507 // App will register itself on first run. |
| 471 bool is_app_root_tracker_enabled = | 508 continue; |
| 472 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; | 509 } |
| 473 if (is_app_enabled && !is_app_root_tracker_enabled) | 510 |
| 474 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 511 DCHECK(itr->second == APP_STATUS_ENABLED || |
| 475 else if (!is_app_enabled && is_app_root_tracker_enabled) | 512 itr->second == APP_STATUS_DISABLED); |
| 476 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 513 bool is_app_enabled = (itr->second == APP_STATUS_ENABLED); |
| 514 bool is_app_root_tracker_enabled = |
| 515 (tracker.tracker_kind() == TRACKER_KIND_APP_ROOT); |
| 516 if (is_app_enabled && !is_app_root_tracker_enabled) |
| 517 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 518 else if (!is_app_enabled && is_app_root_tracker_enabled) |
| 519 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 477 } | 520 } |
| 478 } | 521 } |
| 479 | 522 |
| 480 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, | 523 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, |
| 481 const SyncFileCallback& callback, | 524 const SyncFileCallback& callback, |
| 482 SyncStatusCode status) { | 525 SyncStatusCode status) { |
| 483 if (syncer->is_sync_root_deletion()) { | 526 if (syncer->is_sync_root_deletion()) { |
| 484 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); | 527 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); |
| 485 PostInitializeTask(); | 528 PostInitializeTask(); |
| 486 callback.Run(status, syncer->url()); | 529 callback.Run(status, syncer->url()); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 "Service state changed: %d->%d: %s", | 701 "Service state changed: %d->%d: %s", |
| 659 old_state, GetCurrentState(), description.c_str()); | 702 old_state, GetCurrentState(), description.c_str()); |
| 660 | 703 |
| 661 FOR_EACH_OBSERVER( | 704 FOR_EACH_OBSERVER( |
| 662 Observer, observers_, | 705 Observer, observers_, |
| 663 UpdateServiceState(GetCurrentState(), description)); | 706 UpdateServiceState(GetCurrentState(), description)); |
| 664 } | 707 } |
| 665 | 708 |
| 666 } // namespace drive_backend | 709 } // namespace drive_backend |
| 667 } // namespace sync_file_system | 710 } // namespace sync_file_system |
| OLD | NEW |