Chromium Code Reviews| Index: chrome/browser/sync_file_system/drive_file_sync_service.cc |
| diff --git a/chrome/browser/sync_file_system/drive_file_sync_service.cc b/chrome/browser/sync_file_system/drive_file_sync_service.cc |
| index 12c883719a3003e1fedf8c6af7191bb3ff286aab..23bbd194855c8954a93aba471ea3131062d86f81 100644 |
| --- a/chrome/browser/sync_file_system/drive_file_sync_service.cc |
| +++ b/chrome/browser/sync_file_system/drive_file_sync_service.cc |
| @@ -422,7 +422,56 @@ void DriveFileSyncService::UnregisterOriginForTrackingChanges( |
| pending_batch_sync_origins_.erase(origin); |
| metadata_store_->RemoveOrigin(origin, base::Bind( |
| - &DriveFileSyncService::DidRemoveOriginOnMetadataStore, |
| + &DriveFileSyncService::DidChangeOriginOnMetadataStore, |
| + AsWeakPtr(), base::Passed(&token), callback)); |
| +} |
| + |
| +void DriveFileSyncService::EnableOriginForTrackingChanges( |
| + const GURL& origin, |
| + const SyncStatusCallback& callback) { |
| + if (!metadata_store_->IsOriginDisabled(origin)) |
| + return; |
| + |
| + scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); |
| + if (!token) { |
| + pending_tasks_.push_back(base::Bind( |
| + &DriveFileSyncService::EnableOriginForTrackingChanges, |
| + AsWeakPtr(), origin, callback)); |
| + return; |
| + } |
| + |
| + metadata_store_->EnableOrigin(origin, base::Bind( |
| + &DriveFileSyncService::DidChangeOriginOnMetadataStore, |
| + AsWeakPtr(), base::Passed(&token), callback)); |
| + pending_batch_sync_origins_.insert(origin); |
| +} |
| + |
| +void DriveFileSyncService::DisableOriginForTrackingChanges( |
| + const GURL& origin, |
| + const SyncStatusCallback& callback) { |
| + if (!metadata_store_->IsBatchSyncOrigin(origin) && |
| + !metadata_store_->IsIncrementalSyncOrigin(origin)) |
| + return; |
| + |
| + scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); |
| + if (!token) { |
| + pending_tasks_.push_back(base::Bind( |
| + &DriveFileSyncService::DisableOriginForTrackingChanges, |
| + AsWeakPtr(), origin, callback)); |
| + return; |
| + } |
| + |
| + OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); |
| + if (found != origin_to_changes_map_.end()) { |
| + for (PathToChangeMap::iterator itr = found->second.begin(); |
| + itr != found->second.end(); ++itr) |
| + pending_changes_.erase(itr->second.position_in_queue); |
| + origin_to_changes_map_.erase(found); |
| + } |
|
kinuko
2013/03/19 04:01:49
nit: it may look nicer if we define a sub method (
nhiroki
2013/03/19 09:36:13
Added TODO comment.
|
| + pending_batch_sync_origins_.erase(origin); |
| + |
| + metadata_store_->DisableOrigin(origin, base::Bind( |
| + &DriveFileSyncService::DidChangeOriginOnMetadataStore, |
| AsWeakPtr(), base::Passed(&token), callback)); |
| } |
| @@ -855,8 +904,7 @@ void DriveFileSyncService::DidInitializeMetadataStore( |
| return; |
| } |
| - // Remove any origins that are not installed or enabled. |
| - UnregisterInactiveExtensionsIds(); |
| + UpdateRegisteredOrigins(); |
| largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); |
| @@ -888,29 +936,64 @@ void DriveFileSyncService::DidInitializeMetadataStore( |
| RegisterDriveNotifications(); |
| } |
| -void DriveFileSyncService::UnregisterInactiveExtensionsIds() { |
| +void DriveFileSyncService::UpdateRegisteredOrigins() { |
| ExtensionService* extension_service = |
| extensions::ExtensionSystem::Get(profile_)->extension_service(); |
| if (!extension_service) |
| return; |
| - std::vector<GURL> tracked_origins; |
| - metadata_store_->GetAllOrigins(&tracked_origins); |
| - for (std::vector<GURL>::const_iterator itr = tracked_origins.begin(); |
| - itr != tracked_origins.end(); |
| - ++itr) { |
| - // Make sure the registered extension is installed and enabled. |
| + // TODO(nhiroki): clean up these loops with similar bodies. |
| + // http://crbug.com/211600 |
| + |
| + std::vector<GURL> disabled_origins; |
| + metadata_store_->GetDisabledOrigins(&disabled_origins); |
| + for (std::vector<GURL>::const_iterator itr = disabled_origins.begin(); |
| + itr != disabled_origins.end(); ++itr) { |
| std::string extension_id = itr->host(); |
| - const extensions::Extension* installed_extension = |
| - extension_service->GetExtensionById(extension_id, |
| - false /* include_disabled */); |
| - if (installed_extension != NULL) |
| + GURL origin = |
| + extensions::Extension::GetBaseURLFromExtensionId(extension_id); |
| + |
| + if (extension_service->GetInstalledExtension(extension_id) == NULL) { |
| + // Extension is uninstalled. Unregister origin. |
| + metadata_store_->RemoveOrigin( |
| + origin, base::Bind(&DidRemoveOrigin, origin)); |
| continue; |
| + } |
| + |
| + if (extension_service->IsExtensionEnabled(extension_id)) { |
| + // Extension is enabled. Enable origin. |
| + metadata_store_->EnableOrigin( |
| + origin, base::Bind(&EmptyStatusCallback)); |
| + pending_batch_sync_origins_.insert(origin); |
| + continue; |
| + } |
| + |
| + // Extension is still disabled. |
| + } |
| + |
| + std::vector<GURL> enabled_origins; |
| + metadata_store_->GetEnabledOrigins(&enabled_origins); |
| + for (std::vector<GURL>::const_iterator itr = enabled_origins.begin(); |
| + itr != enabled_origins.end(); ++itr) { |
| + std::string extension_id = itr->host(); |
| + GURL origin = |
| + extensions::Extension::GetBaseURLFromExtensionId(extension_id); |
| + |
| + if (extension_service->GetInstalledExtension(extension_id) == NULL) { |
| + // Extension is uninstalled. Unregister origin. |
| + metadata_store_->RemoveOrigin( |
| + origin, base::Bind(&DidRemoveOrigin, origin)); |
| + continue; |
| + } |
| + |
| + if (!extension_service->IsExtensionEnabled(extension_id)) { |
| + // Extension is disabled. Disable origin. |
| + metadata_store_->DisableOrigin( |
| + origin, base::Bind(&EmptyStatusCallback)); |
| + continue; |
| + } |
| - // Extension is either disabled or uninstalled. Unregister origin. |
| - GURL origin = extensions::Extension::GetBaseURLFromExtensionId( |
| - extension_id); |
| - metadata_store_->RemoveOrigin(origin, base::Bind(&DidRemoveOrigin, origin)); |
| + // Extension is still enabled. |
| } |
| } |
| @@ -966,6 +1049,7 @@ void DriveFileSyncService::StartBatchSyncForOrigin( |
| GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp")); |
| DCHECK(token); |
| DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); |
| + DCHECK(!metadata_store_->IsOriginDisabled(origin)); |
| DVLOG(1) << "Start batch sync for:" << origin.spec(); |
| @@ -990,7 +1074,8 @@ void DriveFileSyncService::GetDriveDirectoryForOrigin( |
| } |
| if (metadata_store_->IsIncrementalSyncOrigin(origin) || |
| - metadata_store_->IsBatchSyncOrigin(origin)) { |
| + metadata_store_->IsBatchSyncOrigin(origin) || |
| + metadata_store_->IsOriginDisabled(origin)) { |
| token->ResetTask(FROM_HERE); |
| NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
| callback.Run(SYNC_STATUS_OK); |
| @@ -1111,7 +1196,7 @@ void DriveFileSyncService::DidGetDirectoryContentForBatchSync( |
| NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
| } |
| -void DriveFileSyncService::DidRemoveOriginOnMetadataStore( |
| +void DriveFileSyncService::DidChangeOriginOnMetadataStore( |
| scoped_ptr<TaskToken> token, |
| const SyncStatusCallback& callback, |
| SyncStatusCode status) { |