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 |