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" |
| 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 21 matching lines...) Expand all Loading... | |
| 53 | 54 |
| 54 namespace { | 55 namespace { |
| 55 | 56 |
| 56 void EmptyStatusCallback(SyncStatusCode status) {} | 57 void EmptyStatusCallback(SyncStatusCode status) {} |
| 57 | 58 |
| 58 } // namespace | 59 } // namespace |
| 59 | 60 |
| 60 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker( | 61 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker( |
| 61 const base::FilePath& base_dir, | 62 const base::FilePath& base_dir, |
| 62 Observer* observer, | 63 Observer* observer, |
| 63 ExtensionServiceInterface* extension_service, | 64 const base::WeakPtr<ExtensionServiceInterface>& extension_service, |
| 64 scoped_ptr<SyncEngineContext> sync_engine_context, | 65 scoped_ptr<SyncEngineContext> sync_engine_context, |
| 65 leveldb::Env* env_override) { | 66 leveldb::Env* env_override) { |
| 66 scoped_ptr<SyncWorker> sync_worker( | 67 scoped_ptr<SyncWorker> sync_worker( |
| 67 new SyncWorker(base_dir, | 68 new SyncWorker(base_dir, |
| 68 extension_service, | 69 extension_service, |
| 69 sync_engine_context.Pass(), | 70 sync_engine_context.Pass(), |
| 70 env_override)); | 71 env_override)); |
| 71 sync_worker->AddObserver(observer); | 72 sync_worker->AddObserver(observer); |
| 72 sync_worker->Initialize(); | 73 sync_worker->Initialize(); |
| 73 | 74 |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 348 SyncTaskManager* SyncWorker::GetSyncTaskManager() { | 349 SyncTaskManager* SyncWorker::GetSyncTaskManager() { |
| 349 return task_manager_.get(); | 350 return task_manager_.get(); |
| 350 } | 351 } |
| 351 | 352 |
| 352 void SyncWorker::AddObserver(Observer* observer) { | 353 void SyncWorker::AddObserver(Observer* observer) { |
| 353 observers_.AddObserver(observer); | 354 observers_.AddObserver(observer); |
| 354 } | 355 } |
| 355 | 356 |
| 356 SyncWorker::SyncWorker( | 357 SyncWorker::SyncWorker( |
| 357 const base::FilePath& base_dir, | 358 const base::FilePath& base_dir, |
| 358 ExtensionServiceInterface* extension_service, | 359 const base::WeakPtr<ExtensionServiceInterface>& extension_service, |
| 359 scoped_ptr<SyncEngineContext> sync_engine_context, | 360 scoped_ptr<SyncEngineContext> sync_engine_context, |
| 360 leveldb::Env* env_override) | 361 leveldb::Env* env_override) |
| 361 : base_dir_(base_dir), | 362 : base_dir_(base_dir), |
| 362 env_override_(env_override), | 363 env_override_(env_override), |
| 363 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), | 364 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), |
| 364 should_check_conflict_(true), | 365 should_check_conflict_(true), |
| 365 should_check_remote_change_(true), | 366 should_check_remote_change_(true), |
| 366 listing_remote_changes_(false), | 367 listing_remote_changes_(false), |
| 367 sync_enabled_(false), | 368 sync_enabled_(false), |
| 368 default_conflict_resolution_policy_( | 369 default_conflict_resolution_policy_( |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 426 | 427 |
| 427 scoped_ptr<MetadataDatabase> metadata_database = | 428 scoped_ptr<MetadataDatabase> metadata_database = |
| 428 initializer->PassMetadataDatabase(); | 429 initializer->PassMetadataDatabase(); |
| 429 if (metadata_database) | 430 if (metadata_database) |
| 430 context_->SetMetadataDatabase(metadata_database.Pass()); | 431 context_->SetMetadataDatabase(metadata_database.Pass()); |
| 431 | 432 |
| 432 UpdateRegisteredApp(); | 433 UpdateRegisteredApp(); |
| 433 } | 434 } |
| 434 | 435 |
| 435 void SyncWorker::UpdateRegisteredApp() { | 436 void SyncWorker::UpdateRegisteredApp() { |
| 436 if (extension_service_) | 437 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
| 438 DCHECK(metadata_db); | |
| 439 | |
|
peria
2014/04/24 02:38:21
Could you add checking |extension_service_|'s avai
tzik
2014/04/24 06:56:55
To do that, we need to hop to UI thread, which cos
| |
| 440 scoped_ptr<std::vector<std::string> > app_ids(new std::vector<std::string>); | |
| 441 metadata_db->GetRegisteredAppIDs(app_ids.get()); | |
| 442 | |
| 443 AppStatusMap* app_status = new AppStatusMap; | |
| 444 base::Closure callback = | |
| 445 base::Bind(&SyncWorker::DidQueryAppStatus, | |
| 446 weak_ptr_factory_.GetWeakPtr(), | |
| 447 base::Owned(app_status)); | |
| 448 | |
| 449 context_->GetUiTaskRunner()->PostTask( | |
| 450 FROM_HERE, | |
| 451 base::Bind(&SyncWorker::QueryAppStatusOnUIThread, | |
| 452 extension_service_, | |
| 453 base::Owned(app_ids.release()), | |
| 454 app_status, | |
| 455 CreateRelayedCallback(callback))); | |
| 456 | |
|
nhiroki
2014/04/24 01:39:52
nit: an extra blank line.
tzik
2014/04/24 06:56:55
Done.
| |
| 457 } | |
| 458 | |
| 459 // static | |
| 460 void SyncWorker::QueryAppStatusOnUIThread( | |
|
nhiroki
2014/04/24 01:39:52
(optional) How about moving this into anon namespa
tzik
2014/04/24 06:56:55
Done.
nhiroki
2014/04/24 07:09:07
Hmm... sorry, I missed QueryAppStatusOnUIThread()
| |
| 461 const base::WeakPtr<ExtensionServiceInterface>& extension_service_ptr, | |
| 462 const std::vector<std::string>* apps, | |
|
peria
2014/04/24 02:38:21
(optional) keep its name |app_ids| for consistency
tzik
2014/04/24 06:56:55
Done.
| |
| 463 AppStatusMap* status, | |
| 464 const base::Closure& callback) { | |
| 465 ExtensionServiceInterface* extension_service = extension_service_ptr.get(); | |
| 466 if (!extension_service) | |
|
nhiroki
2014/04/24 01:39:52
In this case you don't need to run a callback, rig
tzik
2014/04/24 06:56:55
Ah, I completely forgot about calling the callback
| |
| 437 return; | 467 return; |
| 438 | 468 |
| 439 MetadataDatabase* metadata_db = GetMetadataDatabase(); | 469 for (std::vector<std::string>::const_iterator itr = apps->begin(); |
| 440 DCHECK(metadata_db); | 470 itr != apps->end(); ++itr) { |
| 441 std::vector<std::string> app_ids; | |
| 442 metadata_db->GetRegisteredAppIDs(&app_ids); | |
| 443 | |
| 444 // Update the status of every origin using status from ExtensionService. | |
| 445 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); | |
| 446 itr != app_ids.end(); ++itr) { | |
| 447 const std::string& app_id = *itr; | 471 const std::string& app_id = *itr; |
| 448 GURL origin = | 472 if (!extension_service->GetInstalledExtension(app_id)) |
| 449 extensions::Extension::GetBaseURLFromExtensionId(app_id); | 473 (*status)[app_id] = APP_STATUS_UNINSTALLED; |
| 450 | 474 else if (!extension_service->IsExtensionEnabled(app_id)) |
| 451 // TODO(tzik): Switch |extension_service_| to a wrapper and make this | 475 (*status)[app_id] = APP_STATUS_DISABLED; |
| 452 // call async. | 476 else |
| 453 if (!extension_service_->GetInstalledExtension(app_id)) { | 477 (*status)[app_id] = APP_STATUS_ENABLED; |
| 454 // Extension has been uninstalled. | |
| 455 // (At this stage we can't know if it was unpacked extension or not, | |
| 456 // so just purge the remote folder.) | |
| 457 UninstallOrigin(origin, | |
| 458 RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, | |
| 459 base::Bind(&EmptyStatusCallback)); | |
| 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 | |
| 468 // TODO(tzik): Switch |extension_service_| to a wrapper and make this | |
| 469 // call async. | |
| 470 bool is_app_enabled = extension_service_->IsExtensionEnabled(app_id); | |
| 471 bool is_app_root_tracker_enabled = | |
| 472 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; | |
| 473 if (is_app_enabled && !is_app_root_tracker_enabled) | |
| 474 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | |
| 475 else if (!is_app_enabled && is_app_root_tracker_enabled) | |
| 476 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | |
| 477 } | 478 } |
|
nhiroki
2014/04/24 01:39:52
You need to run |callback| here.
tzik
2014/04/24 06:56:55
Done.
| |
| 478 } | 479 } |
| 479 | 480 |
| 481 void SyncWorker::DidQueryAppStatus(const AppStatusMap* app_status) { | |
| 482 MetadataDatabase* metadata_db = GetMetadataDatabase(); | |
| 483 DCHECK(metadata_db); | |
| 484 | |
| 485 // Update the status of every origin using status from ExtensionService. | |
| 486 for (AppStatusMap::const_iterator itr = app_status->begin(); | |
| 487 itr != app_status->end(); ++itr) { | |
| 488 const std::string& app_id = itr->first; | |
| 489 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); | |
| 490 | |
| 491 if (itr->second == APP_STATUS_UNINSTALLED) { | |
| 492 // Extension has been uninstalled. | |
| 493 // (At this stage we can't know if it was unpacked extension or not, | |
| 494 // so just purge the remote folder.) | |
| 495 UninstallOrigin(origin, | |
| 496 RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, | |
| 497 base::Bind(&EmptyStatusCallback)); | |
| 498 continue; | |
| 499 } | |
| 500 | |
| 501 FileTracker tracker; | |
| 502 if (!metadata_db->FindAppRootTracker(app_id, &tracker)) { | |
| 503 // App will register itself on first run. | |
| 504 continue; | |
| 505 } | |
| 506 | |
| 507 DCHECK(itr->second == APP_STATUS_ENABLED || | |
| 508 itr->second == APP_STATUS_DISABLED); | |
| 509 bool is_app_enabled = itr->second == APP_STATUS_ENABLED; | |
|
peria
2014/04/24 02:38:21
nit: a = (b == c);
tzik
2014/04/24 06:56:55
Done.
| |
| 510 bool is_app_root_tracker_enabled = | |
| 511 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; | |
|
peria
2014/04/24 02:38:21
diito
tzik
2014/04/24 06:56:55
Done.
| |
| 512 if (is_app_enabled && !is_app_root_tracker_enabled) | |
| 513 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | |
| 514 else if (!is_app_enabled && is_app_root_tracker_enabled) | |
| 515 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | |
| 516 } | |
| 517 } | |
| 518 | |
| 480 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, | 519 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, |
| 481 const SyncFileCallback& callback, | 520 const SyncFileCallback& callback, |
| 482 SyncStatusCode status) { | 521 SyncStatusCode status) { |
| 483 if (syncer->is_sync_root_deletion()) { | 522 if (syncer->is_sync_root_deletion()) { |
| 484 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); | 523 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); |
| 485 PostInitializeTask(); | 524 PostInitializeTask(); |
| 486 callback.Run(status, syncer->url()); | 525 callback.Run(status, syncer->url()); |
| 487 return; | 526 return; |
| 488 } | 527 } |
| 489 | 528 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 658 "Service state changed: %d->%d: %s", | 697 "Service state changed: %d->%d: %s", |
| 659 old_state, GetCurrentState(), description.c_str()); | 698 old_state, GetCurrentState(), description.c_str()); |
| 660 | 699 |
| 661 FOR_EACH_OBSERVER( | 700 FOR_EACH_OBSERVER( |
| 662 Observer, observers_, | 701 Observer, observers_, |
| 663 UpdateServiceState(GetCurrentState(), description)); | 702 UpdateServiceState(GetCurrentState(), description)); |
| 664 } | 703 } |
| 665 | 704 |
| 666 } // namespace drive_backend | 705 } // namespace drive_backend |
| 667 } // namespace sync_file_system | 706 } // namespace sync_file_system |
| OLD | NEW |