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

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: testfix 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
« no previous file with comments | « chrome/browser/sync_file_system/drive_backend/sync_worker.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 16 matching lines...) Expand all
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/sync_file_system/drive_backend/sync_worker.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698