| Index: chrome/browser/sync_file_system/drive_backend/sync_worker.cc
|
| diff --git a/chrome/browser/sync_file_system/drive_backend/sync_worker.cc b/chrome/browser/sync_file_system/drive_backend/sync_worker.cc
|
| index 286f6268a27e0b34126acb2e852c45b71d690d68..7afb9d4d74a9e01e0125d5002b0327784dd23594 100644
|
| --- a/chrome/browser/sync_file_system/drive_backend/sync_worker.cc
|
| +++ b/chrome/browser/sync_file_system/drive_backend/sync_worker.cc
|
| @@ -19,6 +19,7 @@
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
|
| #include "chrome/browser/signin/signin_manager_factory.h"
|
| +#include "chrome/browser/sync_file_system/drive_backend/callback_helper.h"
|
| #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h"
|
| #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
|
| #include "chrome/browser/sync_file_system/drive_backend/list_changes_task.h"
|
| @@ -55,12 +56,37 @@ namespace {
|
|
|
| void EmptyStatusCallback(SyncStatusCode status) {}
|
|
|
| +void QueryAppStatusOnUIThread(
|
| + const base::WeakPtr<ExtensionServiceInterface>& extension_service_ptr,
|
| + const std::vector<std::string>* app_ids,
|
| + SyncWorker::AppStatusMap* status,
|
| + const base::Closure& callback) {
|
| + ExtensionServiceInterface* extension_service = extension_service_ptr.get();
|
| + if (!extension_service) {
|
| + callback.Run();
|
| + return;
|
| + }
|
| +
|
| + for (std::vector<std::string>::const_iterator itr = app_ids->begin();
|
| + itr != app_ids->end(); ++itr) {
|
| + const std::string& app_id = *itr;
|
| + if (!extension_service->GetInstalledExtension(app_id))
|
| + (*status)[app_id] = SyncWorker::APP_STATUS_UNINSTALLED;
|
| + else if (!extension_service->IsExtensionEnabled(app_id))
|
| + (*status)[app_id] = SyncWorker::APP_STATUS_DISABLED;
|
| + else
|
| + (*status)[app_id] = SyncWorker::APP_STATUS_ENABLED;
|
| + }
|
| +
|
| + callback.Run();
|
| +}
|
| +
|
| } // namespace
|
|
|
| scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker(
|
| const base::FilePath& base_dir,
|
| Observer* observer,
|
| - ExtensionServiceInterface* extension_service,
|
| + const base::WeakPtr<ExtensionServiceInterface>& extension_service,
|
| scoped_ptr<SyncEngineContext> sync_engine_context,
|
| leveldb::Env* env_override) {
|
| scoped_ptr<SyncWorker> sync_worker(
|
| @@ -355,7 +381,7 @@ void SyncWorker::AddObserver(Observer* observer) {
|
|
|
| SyncWorker::SyncWorker(
|
| const base::FilePath& base_dir,
|
| - ExtensionServiceInterface* extension_service,
|
| + const base::WeakPtr<ExtensionServiceInterface>& extension_service,
|
| scoped_ptr<SyncEngineContext> sync_engine_context,
|
| leveldb::Env* env_override)
|
| : base_dir_(base_dir),
|
| @@ -433,47 +459,64 @@ void SyncWorker::DidInitialize(SyncEngineInitializer* initializer,
|
| }
|
|
|
| void SyncWorker::UpdateRegisteredApp() {
|
| - if (extension_service_)
|
| - return;
|
| + MetadataDatabase* metadata_db = GetMetadataDatabase();
|
| + DCHECK(metadata_db);
|
| +
|
| + scoped_ptr<std::vector<std::string> > app_ids(new std::vector<std::string>);
|
| + metadata_db->GetRegisteredAppIDs(app_ids.get());
|
|
|
| + AppStatusMap* app_status = new AppStatusMap;
|
| + base::Closure callback =
|
| + base::Bind(&SyncWorker::DidQueryAppStatus,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Owned(app_status));
|
| +
|
| + context_->GetUITaskRunner()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&QueryAppStatusOnUIThread,
|
| + extension_service_,
|
| + base::Owned(app_ids.release()),
|
| + app_status,
|
| + RelayCallbackToTaskRunner(
|
| + context_->GetWorkerTaskRunner(),
|
| + FROM_HERE, callback)));
|
| +}
|
| +
|
| +void SyncWorker::DidQueryAppStatus(const AppStatusMap* app_status) {
|
| MetadataDatabase* metadata_db = GetMetadataDatabase();
|
| DCHECK(metadata_db);
|
| - std::vector<std::string> app_ids;
|
| - metadata_db->GetRegisteredAppIDs(&app_ids);
|
|
|
| // Update the status of every origin using status from ExtensionService.
|
| - for (std::vector<std::string>::const_iterator itr = app_ids.begin();
|
| - itr != app_ids.end(); ++itr) {
|
| - const std::string& app_id = *itr;
|
| - GURL origin =
|
| - extensions::Extension::GetBaseURLFromExtensionId(app_id);
|
| -
|
| - // TODO(tzik): Switch |extension_service_| to a wrapper and make this
|
| - // call async.
|
| - if (!extension_service_->GetInstalledExtension(app_id)) {
|
| - // Extension has been uninstalled.
|
| - // (At this stage we can't know if it was unpacked extension or not,
|
| - // so just purge the remote folder.)
|
| - UninstallOrigin(origin,
|
| - RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE,
|
| - base::Bind(&EmptyStatusCallback));
|
| - continue;
|
| - }
|
| - FileTracker tracker;
|
| - if (!metadata_db->FindAppRootTracker(app_id, &tracker)) {
|
| - // App will register itself on first run.
|
| - continue;
|
| - }
|
| -
|
| - // TODO(tzik): Switch |extension_service_| to a wrapper and make this
|
| - // call async.
|
| - bool is_app_enabled = extension_service_->IsExtensionEnabled(app_id);
|
| - bool is_app_root_tracker_enabled =
|
| - tracker.tracker_kind() == TRACKER_KIND_APP_ROOT;
|
| - if (is_app_enabled && !is_app_root_tracker_enabled)
|
| - EnableOrigin(origin, base::Bind(&EmptyStatusCallback));
|
| - else if (!is_app_enabled && is_app_root_tracker_enabled)
|
| - DisableOrigin(origin, base::Bind(&EmptyStatusCallback));
|
| + for (AppStatusMap::const_iterator itr = app_status->begin();
|
| + itr != app_status->end(); ++itr) {
|
| + const std::string& app_id = itr->first;
|
| + GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id);
|
| +
|
| + if (itr->second == APP_STATUS_UNINSTALLED) {
|
| + // Extension has been uninstalled.
|
| + // (At this stage we can't know if it was unpacked extension or not,
|
| + // so just purge the remote folder.)
|
| + UninstallOrigin(origin,
|
| + RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE,
|
| + base::Bind(&EmptyStatusCallback));
|
| + continue;
|
| + }
|
| +
|
| + FileTracker tracker;
|
| + if (!metadata_db->FindAppRootTracker(app_id, &tracker)) {
|
| + // App will register itself on first run.
|
| + continue;
|
| + }
|
| +
|
| + DCHECK(itr->second == APP_STATUS_ENABLED ||
|
| + itr->second == APP_STATUS_DISABLED);
|
| + bool is_app_enabled = (itr->second == APP_STATUS_ENABLED);
|
| + bool is_app_root_tracker_enabled =
|
| + (tracker.tracker_kind() == TRACKER_KIND_APP_ROOT);
|
| + if (is_app_enabled && !is_app_root_tracker_enabled)
|
| + EnableOrigin(origin, base::Bind(&EmptyStatusCallback));
|
| + else if (!is_app_enabled && is_app_root_tracker_enabled)
|
| + DisableOrigin(origin, base::Bind(&EmptyStatusCallback));
|
| }
|
| }
|
|
|
|
|