Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(950)

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/sync_worker.cc

Issue 246163005: [SyncFS] Make ExtensionService usage of SyncWorker asynchronous (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: buildfix Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698