| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_engine.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/threading/sequenced_worker_pool.h" | 10 #include "base/threading/sequenced_worker_pool.h" |
| 11 #include "base/values.h" | 11 #include "base/values.h" |
| 12 #include "chrome/browser/drive/drive_api_service.h" | 12 #include "chrome/browser/drive/drive_api_service.h" |
| 13 #include "chrome/browser/drive/drive_notification_manager.h" | 13 #include "chrome/browser/drive/drive_notification_manager.h" |
| 14 #include "chrome/browser/drive/drive_notification_manager_factory.h" | 14 #include "chrome/browser/drive/drive_notification_manager_factory.h" |
| 15 #include "chrome/browser/drive/drive_service_interface.h" | 15 #include "chrome/browser/drive/drive_service_interface.h" |
| 16 #include "chrome/browser/drive/drive_uploader.h" | 16 #include "chrome/browser/drive/drive_uploader.h" |
| 17 #include "chrome/browser/extensions/extension_service.h" | 17 #include "chrome/browser/extensions/extension_service.h" |
| 18 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
| 19 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 19 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
| 20 #include "chrome/browser/signin/signin_manager.h" | 20 #include "chrome/browser/signin/signin_manager.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/conflict_resolver.h" | 22 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h" |
| 23 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" | 23 #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" | 24 #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
" | 25 #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" | 26 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
| 27 #include "chrome/browser/sync_file_system/drive_backend/register_app_task.h" | 27 #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
" | 28 #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" |
| 29 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" | 30 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" |
| 30 #include "chrome/browser/sync_file_system/drive_backend/sync_task.h" | 31 #include "chrome/browser/sync_file_system/drive_backend/sync_task.h" |
| 31 #include "chrome/browser/sync_file_system/drive_backend/uninstall_app_task.h" | 32 #include "chrome/browser/sync_file_system/drive_backend/uninstall_app_task.h" |
| 32 #include "chrome/browser/sync_file_system/file_status_observer.h" | 33 #include "chrome/browser/sync_file_system/file_status_observer.h" |
| 33 #include "chrome/browser/sync_file_system/logger.h" | 34 #include "chrome/browser/sync_file_system/logger.h" |
| 35 #include "chrome/browser/sync_file_system/remote_change_processor.h" |
| 34 #include "chrome/browser/sync_file_system/syncable_file_system_util.h" | 36 #include "chrome/browser/sync_file_system/syncable_file_system_util.h" |
| 35 #include "components/signin/core/profile_oauth2_token_service.h" | 37 #include "components/signin/core/profile_oauth2_token_service.h" |
| 36 #include "content/public/browser/browser_thread.h" | 38 #include "content/public/browser/browser_thread.h" |
| 37 #include "extensions/browser/extension_system.h" | 39 #include "extensions/browser/extension_system.h" |
| 38 #include "extensions/browser/extension_system_provider.h" | 40 #include "extensions/browser/extension_system_provider.h" |
| 39 #include "extensions/browser/extensions_browser_client.h" | 41 #include "extensions/browser/extensions_browser_client.h" |
| 40 #include "extensions/common/extension.h" | 42 #include "extensions/common/extension.h" |
| 41 #include "google_apis/drive/drive_api_url_generator.h" | 43 #include "google_apis/drive/drive_api_url_generator.h" |
| 42 #include "google_apis/drive/gdata_wapi_url_generator.h" | 44 #include "google_apis/drive/gdata_wapi_url_generator.h" |
| 43 #include "webkit/common/blob/scoped_file.h" | 45 #include "webkit/common/blob/scoped_file.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 std::set<BrowserContextKeyedServiceFactory*>* factories) { | 116 std::set<BrowserContextKeyedServiceFactory*>* factories) { |
| 115 DCHECK(factories); | 117 DCHECK(factories); |
| 116 factories->insert(drive::DriveNotificationManagerFactory::GetInstance()); | 118 factories->insert(drive::DriveNotificationManagerFactory::GetInstance()); |
| 117 factories->insert(SigninManagerFactory::GetInstance()); | 119 factories->insert(SigninManagerFactory::GetInstance()); |
| 118 factories->insert( | 120 factories->insert( |
| 119 extensions::ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); | 121 extensions::ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); |
| 120 } | 122 } |
| 121 | 123 |
| 122 SyncEngine::~SyncEngine() { | 124 SyncEngine::~SyncEngine() { |
| 123 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); | 125 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); |
| 124 drive_service_->RemoveObserver(this); | 126 context_->GetDriveService()->RemoveObserver(this); |
| 125 if (notification_manager_) | 127 if (notification_manager_) |
| 126 notification_manager_->RemoveObserver(this); | 128 notification_manager_->RemoveObserver(this); |
| 127 } | 129 } |
| 128 | 130 |
| 129 void SyncEngine::Initialize() { | 131 void SyncEngine::Initialize() { |
| 130 DCHECK(!task_manager_); | 132 DCHECK(!task_manager_); |
| 131 task_manager_.reset(new SyncTaskManager(weak_ptr_factory_.GetWeakPtr())); | 133 task_manager_.reset(new SyncTaskManager(weak_ptr_factory_.GetWeakPtr())); |
| 132 task_manager_->Initialize(SYNC_STATUS_OK); | 134 task_manager_->Initialize(SYNC_STATUS_OK); |
| 133 | 135 |
| 134 PostInitializeTask(); | 136 PostInitializeTask(); |
| 135 | 137 |
| 136 if (notification_manager_) | 138 if (notification_manager_) |
| 137 notification_manager_->AddObserver(this); | 139 notification_manager_->AddObserver(this); |
| 138 drive_service_->AddObserver(this); | 140 context_->GetDriveService()->AddObserver(this); |
| 139 net::NetworkChangeNotifier::AddNetworkChangeObserver(this); | 141 net::NetworkChangeNotifier::AddNetworkChangeObserver(this); |
| 140 | 142 |
| 141 net::NetworkChangeNotifier::ConnectionType type = | 143 net::NetworkChangeNotifier::ConnectionType type = |
| 142 net::NetworkChangeNotifier::GetConnectionType(); | 144 net::NetworkChangeNotifier::GetConnectionType(); |
| 143 network_available_ = | 145 network_available_ = |
| 144 type != net::NetworkChangeNotifier::CONNECTION_NONE; | 146 type != net::NetworkChangeNotifier::CONNECTION_NONE; |
| 145 } | 147 } |
| 146 | 148 |
| 147 void SyncEngine::AddServiceObserver(SyncServiceObserver* observer) { | 149 void SyncEngine::AddServiceObserver(SyncServiceObserver* observer) { |
| 148 service_observers_.AddObserver(observer); | 150 service_observers_.AddObserver(observer); |
| 149 } | 151 } |
| 150 | 152 |
| 151 void SyncEngine::AddFileStatusObserver(FileStatusObserver* observer) { | 153 void SyncEngine::AddFileStatusObserver(FileStatusObserver* observer) { |
| 152 file_status_observers_.AddObserver(observer); | 154 file_status_observers_.AddObserver(observer); |
| 153 } | 155 } |
| 154 | 156 |
| 155 void SyncEngine::RegisterOrigin( | 157 void SyncEngine::RegisterOrigin( |
| 156 const GURL& origin, | 158 const GURL& origin, |
| 157 const SyncStatusCallback& callback) { | 159 const SyncStatusCallback& callback) { |
| 158 if (!metadata_database_ && drive_service_->HasRefreshToken()) | 160 if (!context_->GetMetadataDatabase() && |
| 161 context_->GetDriveService()->HasRefreshToken()) |
| 159 PostInitializeTask(); | 162 PostInitializeTask(); |
| 160 | 163 |
| 161 scoped_ptr<RegisterAppTask> task(new RegisterAppTask(this, origin.host())); | 164 scoped_ptr<RegisterAppTask> task( |
| 165 new RegisterAppTask(context_.get(), origin.host())); |
| 162 if (task->CanFinishImmediately()) { | 166 if (task->CanFinishImmediately()) { |
| 163 callback.Run(SYNC_STATUS_OK); | 167 callback.Run(SYNC_STATUS_OK); |
| 164 return; | 168 return; |
| 165 } | 169 } |
| 166 | 170 |
| 167 task_manager_->ScheduleSyncTask( | 171 task_manager_->ScheduleSyncTask( |
| 168 FROM_HERE, | 172 FROM_HERE, |
| 169 task.PassAs<SyncTask>(), | 173 task.PassAs<SyncTask>(), |
| 170 SyncTaskManager::PRIORITY_HIGH, | 174 SyncTaskManager::PRIORITY_HIGH, |
| 171 callback); | 175 callback); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 194 SyncTaskManager::PRIORITY_HIGH, | 198 SyncTaskManager::PRIORITY_HIGH, |
| 195 callback); | 199 callback); |
| 196 } | 200 } |
| 197 | 201 |
| 198 void SyncEngine::UninstallOrigin( | 202 void SyncEngine::UninstallOrigin( |
| 199 const GURL& origin, | 203 const GURL& origin, |
| 200 UninstallFlag flag, | 204 UninstallFlag flag, |
| 201 const SyncStatusCallback& callback) { | 205 const SyncStatusCallback& callback) { |
| 202 task_manager_->ScheduleSyncTask( | 206 task_manager_->ScheduleSyncTask( |
| 203 FROM_HERE, | 207 FROM_HERE, |
| 204 scoped_ptr<SyncTask>(new UninstallAppTask(this, origin.host(), flag)), | 208 scoped_ptr<SyncTask>( |
| 209 new UninstallAppTask(context_.get(), origin.host(), flag)), |
| 205 SyncTaskManager::PRIORITY_HIGH, | 210 SyncTaskManager::PRIORITY_HIGH, |
| 206 callback); | 211 callback); |
| 207 } | 212 } |
| 208 | 213 |
| 209 void SyncEngine::ProcessRemoteChange( | 214 void SyncEngine::ProcessRemoteChange( |
| 210 const SyncFileCallback& callback) { | 215 const SyncFileCallback& callback) { |
| 211 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(this); | 216 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(context_.get()); |
| 212 task_manager_->ScheduleSyncTask( | 217 task_manager_->ScheduleSyncTask( |
| 213 FROM_HERE, | 218 FROM_HERE, |
| 214 scoped_ptr<SyncTask>(syncer), | 219 scoped_ptr<SyncTask>(syncer), |
| 215 SyncTaskManager::PRIORITY_MED, | 220 SyncTaskManager::PRIORITY_MED, |
| 216 base::Bind(&SyncEngine::DidProcessRemoteChange, | 221 base::Bind(&SyncEngine::DidProcessRemoteChange, |
| 217 weak_ptr_factory_.GetWeakPtr(), | 222 weak_ptr_factory_.GetWeakPtr(), |
| 218 syncer, callback)); | 223 syncer, callback)); |
| 219 } | 224 } |
| 220 | 225 |
| 221 void SyncEngine::SetRemoteChangeProcessor( | 226 void SyncEngine::SetRemoteChangeProcessor( |
| 222 RemoteChangeProcessor* processor) { | 227 RemoteChangeProcessor* processor) { |
| 223 remote_change_processor_ = processor; | 228 context_->SetRemoteChangeProcessor(processor); |
| 224 } | 229 } |
| 225 | 230 |
| 226 LocalChangeProcessor* SyncEngine::GetLocalChangeProcessor() { | 231 LocalChangeProcessor* SyncEngine::GetLocalChangeProcessor() { |
| 227 return this; | 232 return this; |
| 228 } | 233 } |
| 229 | 234 |
| 230 bool SyncEngine::IsConflicting(const fileapi::FileSystemURL& url) { | 235 bool SyncEngine::IsConflicting(const fileapi::FileSystemURL& url) { |
| 231 // TODO(tzik): Implement this before we support manual conflict resolution. | 236 // TODO(tzik): Implement this before we support manual conflict resolution. |
| 232 return false; | 237 return false; |
| 233 } | 238 } |
| 234 | 239 |
| 235 RemoteServiceState SyncEngine::GetCurrentState() const { | 240 RemoteServiceState SyncEngine::GetCurrentState() const { |
| 236 if (!sync_enabled_) | 241 if (!sync_enabled_) |
| 237 return REMOTE_SERVICE_DISABLED; | 242 return REMOTE_SERVICE_DISABLED; |
| 238 return service_state_; | 243 return service_state_; |
| 239 } | 244 } |
| 240 | 245 |
| 241 void SyncEngine::GetOriginStatusMap(OriginStatusMap* status_map) { | 246 void SyncEngine::GetOriginStatusMap(OriginStatusMap* status_map) { |
| 242 DCHECK(status_map); | 247 DCHECK(status_map); |
| 243 if (!extension_service_ || !metadata_database_) | 248 if (!extension_service_ || !context_->GetMetadataDatabase()) |
| 244 return; | 249 return; |
| 245 | 250 |
| 246 std::vector<std::string> app_ids; | 251 std::vector<std::string> app_ids; |
| 247 metadata_database_->GetRegisteredAppIDs(&app_ids); | 252 context_->GetMetadataDatabase()->GetRegisteredAppIDs(&app_ids); |
| 248 | 253 |
| 249 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); | 254 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); |
| 250 itr != app_ids.end(); ++itr) { | 255 itr != app_ids.end(); ++itr) { |
| 251 const std::string& app_id = *itr; | 256 const std::string& app_id = *itr; |
| 252 GURL origin = | 257 GURL origin = |
| 253 extensions::Extension::GetBaseURLFromExtensionId(app_id); | 258 extensions::Extension::GetBaseURLFromExtensionId(app_id); |
| 254 (*status_map)[origin] = | 259 (*status_map)[origin] = |
| 255 metadata_database_->IsAppEnabled(app_id) ? "Enabled" : "Disabled"; | 260 context_->GetMetadataDatabase()->IsAppEnabled(app_id) ? |
| 261 "Enabled" : "Disabled"; |
| 256 } | 262 } |
| 257 } | 263 } |
| 258 | 264 |
| 259 scoped_ptr<base::ListValue> SyncEngine::DumpFiles(const GURL& origin) { | 265 scoped_ptr<base::ListValue> SyncEngine::DumpFiles(const GURL& origin) { |
| 260 if (!metadata_database_) | 266 if (!context_->GetMetadataDatabase()) |
| 261 return scoped_ptr<base::ListValue>(); | 267 return scoped_ptr<base::ListValue>(); |
| 262 return metadata_database_->DumpFiles(origin.host()); | 268 return context_->GetMetadataDatabase()->DumpFiles(origin.host()); |
| 263 } | 269 } |
| 264 | 270 |
| 265 scoped_ptr<base::ListValue> SyncEngine::DumpDatabase() { | 271 scoped_ptr<base::ListValue> SyncEngine::DumpDatabase() { |
| 266 if (!metadata_database_) | 272 if (!context_->GetMetadataDatabase()) |
| 267 return scoped_ptr<base::ListValue>(); | 273 return scoped_ptr<base::ListValue>(); |
| 268 return metadata_database_->DumpDatabase(); | 274 return context_->GetMetadataDatabase()->DumpDatabase(); |
| 269 } | 275 } |
| 270 | 276 |
| 271 void SyncEngine::SetSyncEnabled(bool enabled) { | 277 void SyncEngine::SetSyncEnabled(bool enabled) { |
| 272 if (sync_enabled_ == enabled) | 278 if (sync_enabled_ == enabled) |
| 273 return; | 279 return; |
| 274 | 280 |
| 275 RemoteServiceState old_state = GetCurrentState(); | 281 RemoteServiceState old_state = GetCurrentState(); |
| 276 sync_enabled_ = enabled; | 282 sync_enabled_ = enabled; |
| 277 if (old_state == GetCurrentState()) | 283 if (old_state == GetCurrentState()) |
| 278 return; | 284 return; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 | 323 |
| 318 void SyncEngine::DownloadRemoteVersion( | 324 void SyncEngine::DownloadRemoteVersion( |
| 319 const fileapi::FileSystemURL& url, | 325 const fileapi::FileSystemURL& url, |
| 320 const std::string& version_id, | 326 const std::string& version_id, |
| 321 const DownloadVersionCallback& callback) { | 327 const DownloadVersionCallback& callback) { |
| 322 // TODO(tzik): Implement this before we support manual conflict resolution. | 328 // TODO(tzik): Implement this before we support manual conflict resolution. |
| 323 callback.Run(SYNC_STATUS_FAILED, webkit_blob::ScopedFile()); | 329 callback.Run(SYNC_STATUS_FAILED, webkit_blob::ScopedFile()); |
| 324 } | 330 } |
| 325 | 331 |
| 326 void SyncEngine::PromoteDemotedChanges() { | 332 void SyncEngine::PromoteDemotedChanges() { |
| 327 if (metadata_database_ && metadata_database_->HasLowPriorityDirtyTracker()) { | 333 if (context_->GetMetadataDatabase() && |
| 328 metadata_database_->PromoteLowerPriorityTrackersToNormal(); | 334 context_->GetMetadataDatabase()->HasLowPriorityDirtyTracker()) { |
| 335 context_->GetMetadataDatabase()->PromoteLowerPriorityTrackersToNormal(); |
| 329 FOR_EACH_OBSERVER( | 336 FOR_EACH_OBSERVER( |
| 330 Observer, | 337 Observer, |
| 331 service_observers_, | 338 service_observers_, |
| 332 OnRemoteChangeQueueUpdated( | 339 OnRemoteChangeQueueUpdated( |
| 333 metadata_database_->CountDirtyTracker())); | 340 context_->GetMetadataDatabase()->CountDirtyTracker())); |
| 334 } | 341 } |
| 335 } | 342 } |
| 336 | 343 |
| 337 void SyncEngine::ApplyLocalChange( | 344 void SyncEngine::ApplyLocalChange( |
| 338 const FileChange& local_change, | 345 const FileChange& local_change, |
| 339 const base::FilePath& local_path, | 346 const base::FilePath& local_path, |
| 340 const SyncFileMetadata& local_metadata, | 347 const SyncFileMetadata& local_metadata, |
| 341 const fileapi::FileSystemURL& url, | 348 const fileapi::FileSystemURL& url, |
| 342 const SyncStatusCallback& callback) { | 349 const SyncStatusCallback& callback) { |
| 343 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( | 350 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( |
| 344 this, local_metadata, local_change, local_path, url); | 351 context_.get(), local_metadata, local_change, local_path, url); |
| 345 task_manager_->ScheduleSyncTask( | 352 task_manager_->ScheduleSyncTask( |
| 346 FROM_HERE, | 353 FROM_HERE, |
| 347 scoped_ptr<SyncTask>(syncer), | 354 scoped_ptr<SyncTask>(syncer), |
| 348 SyncTaskManager::PRIORITY_MED, | 355 SyncTaskManager::PRIORITY_MED, |
| 349 base::Bind(&SyncEngine::DidApplyLocalChange, | 356 base::Bind(&SyncEngine::DidApplyLocalChange, |
| 350 weak_ptr_factory_.GetWeakPtr(), | 357 weak_ptr_factory_.GetWeakPtr(), |
| 351 syncer, callback)); | 358 syncer, callback)); |
| 352 } | 359 } |
| 353 | 360 |
| 354 void SyncEngine::MaybeScheduleNextTask() { | 361 void SyncEngine::MaybeScheduleNextTask() { |
| 355 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 362 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
| 356 return; | 363 return; |
| 357 | 364 |
| 358 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. | 365 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. |
| 359 // TODO(tzik): Add an interface to get the number of dirty trackers to | 366 // TODO(tzik): Add an interface to get the number of dirty trackers to |
| 360 // MetadataDatabase. | 367 // MetadataDatabase. |
| 361 | 368 |
| 362 MaybeStartFetchChanges(); | 369 MaybeStartFetchChanges(); |
| 363 } | 370 } |
| 364 | 371 |
| 365 void SyncEngine::NotifyLastOperationStatus( | 372 void SyncEngine::NotifyLastOperationStatus( |
| 366 SyncStatusCode sync_status, | 373 SyncStatusCode sync_status, |
| 367 bool used_network) { | 374 bool used_network) { |
| 368 UpdateServiceStateFromSyncStatusCode(sync_status, used_network); | 375 UpdateServiceStateFromSyncStatusCode(sync_status, used_network); |
| 369 if (metadata_database_) { | 376 if (context_->GetMetadataDatabase()) { |
| 370 FOR_EACH_OBSERVER( | 377 FOR_EACH_OBSERVER( |
| 371 Observer, | 378 Observer, |
| 372 service_observers_, | 379 service_observers_, |
| 373 OnRemoteChangeQueueUpdated( | 380 OnRemoteChangeQueueUpdated( |
| 374 metadata_database_->CountDirtyTracker())); | 381 context_->GetMetadataDatabase()->CountDirtyTracker())); |
| 375 } | 382 } |
| 376 } | 383 } |
| 377 | 384 |
| 378 void SyncEngine::OnNotificationReceived() { | 385 void SyncEngine::OnNotificationReceived() { |
| 379 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) | 386 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) |
| 380 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive."); | 387 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive."); |
| 381 | 388 |
| 382 should_check_remote_change_ = true; | 389 should_check_remote_change_ = true; |
| 383 MaybeScheduleNextTask(); | 390 MaybeScheduleNextTask(); |
| 384 } | 391 } |
| 385 | 392 |
| 386 void SyncEngine::OnPushNotificationEnabled(bool enabled) {} | 393 void SyncEngine::OnPushNotificationEnabled(bool enabled) {} |
| 387 | 394 |
| 388 void SyncEngine::OnReadyToSendRequests() { | 395 void SyncEngine::OnReadyToSendRequests() { |
| 389 if (service_state_ == REMOTE_SERVICE_OK) | 396 if (service_state_ == REMOTE_SERVICE_OK) |
| 390 return; | 397 return; |
| 391 UpdateServiceState(REMOTE_SERVICE_OK, "Authenticated"); | 398 UpdateServiceState(REMOTE_SERVICE_OK, "Authenticated"); |
| 392 | 399 |
| 393 if (!metadata_database_ && signin_manager_) { | 400 if (!context_->GetMetadataDatabase() && signin_manager_) { |
| 394 drive_service_->Initialize(signin_manager_->GetAuthenticatedAccountId()); | 401 context_->GetDriveService()->Initialize( |
| 402 signin_manager_->GetAuthenticatedAccountId()); |
| 395 PostInitializeTask(); | 403 PostInitializeTask(); |
| 396 return; | 404 return; |
| 397 } | 405 } |
| 398 | 406 |
| 399 should_check_remote_change_ = true; | 407 should_check_remote_change_ = true; |
| 400 MaybeScheduleNextTask(); | 408 MaybeScheduleNextTask(); |
| 401 } | 409 } |
| 402 | 410 |
| 403 void SyncEngine::OnRefreshTokenInvalid() { | 411 void SyncEngine::OnRefreshTokenInvalid() { |
| 404 UpdateServiceState( | 412 UpdateServiceState( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 415 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, "Disconnected"); | 423 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, "Disconnected"); |
| 416 } else if (!network_available_ && new_network_availability) { | 424 } else if (!network_available_ && new_network_availability) { |
| 417 UpdateServiceState(REMOTE_SERVICE_OK, "Connected"); | 425 UpdateServiceState(REMOTE_SERVICE_OK, "Connected"); |
| 418 should_check_remote_change_ = true; | 426 should_check_remote_change_ = true; |
| 419 MaybeStartFetchChanges(); | 427 MaybeStartFetchChanges(); |
| 420 } | 428 } |
| 421 network_available_ = new_network_availability; | 429 network_available_ = new_network_availability; |
| 422 } | 430 } |
| 423 | 431 |
| 424 drive::DriveServiceInterface* SyncEngine::GetDriveService() { | 432 drive::DriveServiceInterface* SyncEngine::GetDriveService() { |
| 425 return drive_service_.get(); | 433 return context_->GetDriveService(); |
| 426 } | 434 } |
| 427 | 435 |
| 428 drive::DriveUploaderInterface* SyncEngine::GetDriveUploader() { | 436 drive::DriveUploaderInterface* SyncEngine::GetDriveUploader() { |
| 429 return drive_uploader_.get(); | 437 return context_->GetDriveUploader(); |
| 430 } | 438 } |
| 431 | 439 |
| 432 MetadataDatabase* SyncEngine::GetMetadataDatabase() { | 440 MetadataDatabase* SyncEngine::GetMetadataDatabase() { |
| 433 return metadata_database_.get(); | 441 return context_->GetMetadataDatabase(); |
| 434 } | 442 } |
| 435 | 443 |
| 436 RemoteChangeProcessor* SyncEngine::GetRemoteChangeProcessor() { | 444 RemoteChangeProcessor* SyncEngine::GetRemoteChangeProcessor() { |
| 437 return remote_change_processor_; | 445 return context_->GetRemoteChangeProcessor(); |
| 438 } | 446 } |
| 439 | 447 |
| 440 base::SequencedTaskRunner* SyncEngine::GetBlockingTaskRunner() { | 448 base::SequencedTaskRunner* SyncEngine::GetBlockingTaskRunner() { |
| 441 return task_runner_.get(); | 449 return context_->GetBlockingTaskRunner(); |
| 442 } | 450 } |
| 443 | 451 |
| 444 SyncEngine::SyncEngine(const base::FilePath& base_dir, | 452 SyncEngine::SyncEngine(const base::FilePath& base_dir, |
| 445 base::SequencedTaskRunner* task_runner, | 453 base::SequencedTaskRunner* task_runner, |
| 446 scoped_ptr<drive::DriveServiceInterface> drive_service, | 454 scoped_ptr<drive::DriveServiceInterface> drive_service, |
| 447 scoped_ptr<drive::DriveUploaderInterface> drive_uploader, | 455 scoped_ptr<drive::DriveUploaderInterface> drive_uploader, |
| 448 drive::DriveNotificationManager* notification_manager, | 456 drive::DriveNotificationManager* notification_manager, |
| 449 ExtensionServiceInterface* extension_service, | 457 ExtensionServiceInterface* extension_service, |
| 450 SigninManagerBase* signin_manager, | 458 SigninManagerBase* signin_manager, |
| 451 leveldb::Env* env_override) | 459 leveldb::Env* env_override) |
| 452 : base_dir_(base_dir), | 460 : base_dir_(base_dir), |
| 453 task_runner_(task_runner), | |
| 454 env_override_(env_override), | 461 env_override_(env_override), |
| 455 drive_service_(drive_service.Pass()), | |
| 456 drive_uploader_(drive_uploader.Pass()), | |
| 457 notification_manager_(notification_manager), | 462 notification_manager_(notification_manager), |
| 458 extension_service_(extension_service), | 463 extension_service_(extension_service), |
| 459 signin_manager_(signin_manager), | 464 signin_manager_(signin_manager), |
| 460 remote_change_processor_(NULL), | |
| 461 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), | 465 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), |
| 462 should_check_conflict_(true), | 466 should_check_conflict_(true), |
| 463 should_check_remote_change_(true), | 467 should_check_remote_change_(true), |
| 464 listing_remote_changes_(false), | 468 listing_remote_changes_(false), |
| 465 sync_enabled_(false), | 469 sync_enabled_(false), |
| 466 default_conflict_resolution_policy_( | 470 default_conflict_resolution_policy_( |
| 467 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), | 471 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), |
| 468 network_available_(false), | 472 network_available_(false), |
| 469 weak_ptr_factory_(this) {} | 473 context_(new SyncEngineContext(drive_service.Pass(), |
| 474 drive_uploader.Pass(), |
| 475 task_runner)), |
| 476 weak_ptr_factory_(this) { |
| 477 } |
| 470 | 478 |
| 471 void SyncEngine::DoDisableApp(const std::string& app_id, | 479 void SyncEngine::DoDisableApp(const std::string& app_id, |
| 472 const SyncStatusCallback& callback) { | 480 const SyncStatusCallback& callback) { |
| 473 if (metadata_database_) | 481 if (context_->GetMetadataDatabase()) |
| 474 metadata_database_->DisableApp(app_id, callback); | 482 context_->GetMetadataDatabase()->DisableApp(app_id, callback); |
| 475 else | 483 else |
| 476 callback.Run(SYNC_STATUS_OK); | 484 callback.Run(SYNC_STATUS_OK); |
| 477 } | 485 } |
| 478 | 486 |
| 479 void SyncEngine::DoEnableApp(const std::string& app_id, | 487 void SyncEngine::DoEnableApp(const std::string& app_id, |
| 480 const SyncStatusCallback& callback) { | 488 const SyncStatusCallback& callback) { |
| 481 if (metadata_database_) | 489 if (context_->GetMetadataDatabase()) |
| 482 metadata_database_->EnableApp(app_id, callback); | 490 context_->GetMetadataDatabase()->EnableApp(app_id, callback); |
| 483 else | 491 else |
| 484 callback.Run(SYNC_STATUS_OK); | 492 callback.Run(SYNC_STATUS_OK); |
| 485 } | 493 } |
| 486 | 494 |
| 487 void SyncEngine::PostInitializeTask() { | 495 void SyncEngine::PostInitializeTask() { |
| 488 DCHECK(!metadata_database_); | 496 DCHECK(!context_->GetMetadataDatabase()); |
| 489 | 497 |
| 490 // This initializer task may not run if metadata_database_ is already | 498 // This initializer task may not run if MetadataDatabase in context_ is |
| 491 // initialized when it runs. | 499 // already initialized when it runs. |
| 492 SyncEngineInitializer* initializer = | 500 SyncEngineInitializer* initializer = |
| 493 new SyncEngineInitializer(this, | 501 new SyncEngineInitializer(context_.get(), |
| 494 task_runner_.get(), | 502 context_->GetBlockingTaskRunner(), |
| 495 drive_service_.get(), | 503 context_->GetDriveService(), |
| 496 base_dir_.Append(kDatabaseName), | 504 base_dir_.Append(kDatabaseName), |
| 497 env_override_); | 505 env_override_); |
| 498 task_manager_->ScheduleSyncTask( | 506 task_manager_->ScheduleSyncTask( |
| 499 FROM_HERE, | 507 FROM_HERE, |
| 500 scoped_ptr<SyncTask>(initializer), | 508 scoped_ptr<SyncTask>(initializer), |
| 501 SyncTaskManager::PRIORITY_HIGH, | 509 SyncTaskManager::PRIORITY_HIGH, |
| 502 base::Bind(&SyncEngine::DidInitialize, weak_ptr_factory_.GetWeakPtr(), | 510 base::Bind(&SyncEngine::DidInitialize, weak_ptr_factory_.GetWeakPtr(), |
| 503 initializer)); | 511 initializer)); |
| 504 } | 512 } |
| 505 | 513 |
| 506 void SyncEngine::DidInitialize(SyncEngineInitializer* initializer, | 514 void SyncEngine::DidInitialize(SyncEngineInitializer* initializer, |
| 507 SyncStatusCode status) { | 515 SyncStatusCode status) { |
| 508 if (status != SYNC_STATUS_OK) { | 516 if (status != SYNC_STATUS_OK) { |
| 509 if (drive_service_->HasRefreshToken()) { | 517 if (context_->GetDriveService()->HasRefreshToken()) { |
| 510 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, | 518 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, |
| 511 "Could not initialize remote service"); | 519 "Could not initialize remote service"); |
| 512 } else { | 520 } else { |
| 513 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, | 521 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, |
| 514 "Authentication required."); | 522 "Authentication required."); |
| 515 } | 523 } |
| 516 return; | 524 return; |
| 517 } | 525 } |
| 518 | 526 |
| 519 scoped_ptr<MetadataDatabase> metadata_database = | 527 scoped_ptr<MetadataDatabase> metadata_database = |
| 520 initializer->PassMetadataDatabase(); | 528 initializer->PassMetadataDatabase(); |
| 521 if (metadata_database) | 529 if (metadata_database) |
| 522 metadata_database_ = metadata_database.Pass(); | 530 context_->SetMetadataDatabase(metadata_database.Pass()); |
| 523 | 531 |
| 524 DCHECK(metadata_database_); | |
| 525 UpdateRegisteredApps(); | 532 UpdateRegisteredApps(); |
| 526 } | 533 } |
| 527 | 534 |
| 528 void SyncEngine::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, | 535 void SyncEngine::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, |
| 529 const SyncFileCallback& callback, | 536 const SyncFileCallback& callback, |
| 530 SyncStatusCode status) { | 537 SyncStatusCode status) { |
| 531 if (syncer->is_sync_root_deletion()) { | 538 if (syncer->is_sync_root_deletion()) { |
| 532 MetadataDatabase::ClearDatabase(metadata_database_.Pass()); | 539 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); |
| 533 PostInitializeTask(); | 540 PostInitializeTask(); |
| 534 callback.Run(status, syncer->url()); | 541 callback.Run(status, syncer->url()); |
| 535 return; | 542 return; |
| 536 } | 543 } |
| 537 | 544 |
| 538 if (status == SYNC_STATUS_OK) { | 545 if (status == SYNC_STATUS_OK) { |
| 539 if (syncer->sync_action() != SYNC_ACTION_NONE && | 546 if (syncer->sync_action() != SYNC_ACTION_NONE && |
| 540 syncer->url().is_valid()) { | 547 syncer->url().is_valid()) { |
| 541 FOR_EACH_OBSERVER(FileStatusObserver, | 548 FOR_EACH_OBSERVER(FileStatusObserver, |
| 542 file_status_observers_, | 549 file_status_observers_, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 | 584 |
| 578 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) { | 585 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) { |
| 579 RegisterOrigin(syncer->url().origin(), | 586 RegisterOrigin(syncer->url().origin(), |
| 580 base::Bind(&EmptyStatusCallback)); | 587 base::Bind(&EmptyStatusCallback)); |
| 581 } | 588 } |
| 582 | 589 |
| 583 if (syncer->needs_remote_change_listing() && | 590 if (syncer->needs_remote_change_listing() && |
| 584 !listing_remote_changes_) { | 591 !listing_remote_changes_) { |
| 585 task_manager_->ScheduleSyncTask( | 592 task_manager_->ScheduleSyncTask( |
| 586 FROM_HERE, | 593 FROM_HERE, |
| 587 scoped_ptr<SyncTask>(new ListChangesTask(this)), | 594 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), |
| 588 SyncTaskManager::PRIORITY_HIGH, | 595 SyncTaskManager::PRIORITY_HIGH, |
| 589 base::Bind(&SyncEngine::DidFetchChanges, | 596 base::Bind(&SyncEngine::DidFetchChanges, |
| 590 weak_ptr_factory_.GetWeakPtr())); | 597 weak_ptr_factory_.GetWeakPtr())); |
| 591 should_check_remote_change_ = false; | 598 should_check_remote_change_ = false; |
| 592 listing_remote_changes_ = true; | 599 listing_remote_changes_ = true; |
| 593 time_to_check_changes_ = | 600 time_to_check_changes_ = |
| 594 base::TimeTicks::Now() + | 601 base::TimeTicks::Now() + |
| 595 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 602 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
| 596 } | 603 } |
| 597 | 604 |
| 598 if (status != SYNC_STATUS_OK && | 605 if (status != SYNC_STATUS_OK && |
| 599 status != SYNC_STATUS_NO_CHANGE_TO_SYNC) { | 606 status != SYNC_STATUS_NO_CHANGE_TO_SYNC) { |
| 600 callback.Run(status); | 607 callback.Run(status); |
| 601 return; | 608 return; |
| 602 } | 609 } |
| 603 | 610 |
| 604 if (status == SYNC_STATUS_OK) | 611 if (status == SYNC_STATUS_OK) |
| 605 should_check_conflict_ = true; | 612 should_check_conflict_ = true; |
| 606 | 613 |
| 607 callback.Run(status); | 614 callback.Run(status); |
| 608 } | 615 } |
| 609 | 616 |
| 610 void SyncEngine::MaybeStartFetchChanges() { | 617 void SyncEngine::MaybeStartFetchChanges() { |
| 611 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 618 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
| 612 return; | 619 return; |
| 613 | 620 |
| 614 if (!metadata_database_) | 621 if (!context_->GetMetadataDatabase()) |
| 615 return; | 622 return; |
| 616 | 623 |
| 617 if (listing_remote_changes_) | 624 if (listing_remote_changes_) |
| 618 return; | 625 return; |
| 619 | 626 |
| 620 base::TimeTicks now = base::TimeTicks::Now(); | 627 base::TimeTicks now = base::TimeTicks::Now(); |
| 621 if (!should_check_remote_change_ && now < time_to_check_changes_) { | 628 if (!should_check_remote_change_ && now < time_to_check_changes_) { |
| 622 if (!metadata_database_->HasDirtyTracker() && should_check_conflict_) { | 629 if (!context_->GetMetadataDatabase()->HasDirtyTracker() && |
| 630 should_check_conflict_) { |
| 623 should_check_conflict_ = false; | 631 should_check_conflict_ = false; |
| 624 task_manager_->ScheduleSyncTaskIfIdle( | 632 task_manager_->ScheduleSyncTaskIfIdle( |
| 625 FROM_HERE, | 633 FROM_HERE, |
| 626 scoped_ptr<SyncTask>(new ConflictResolver(this)), | 634 scoped_ptr<SyncTask>(new ConflictResolver(context_.get())), |
| 627 base::Bind(&SyncEngine::DidResolveConflict, | 635 base::Bind(&SyncEngine::DidResolveConflict, |
| 628 weak_ptr_factory_.GetWeakPtr())); | 636 weak_ptr_factory_.GetWeakPtr())); |
| 629 } | 637 } |
| 630 return; | 638 return; |
| 631 } | 639 } |
| 632 | 640 |
| 633 if (task_manager_->ScheduleSyncTaskIfIdle( | 641 if (task_manager_->ScheduleSyncTaskIfIdle( |
| 634 FROM_HERE, | 642 FROM_HERE, |
| 635 scoped_ptr<SyncTask>(new ListChangesTask(this)), | 643 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), |
| 636 base::Bind(&SyncEngine::DidFetchChanges, | 644 base::Bind(&SyncEngine::DidFetchChanges, |
| 637 weak_ptr_factory_.GetWeakPtr()))) { | 645 weak_ptr_factory_.GetWeakPtr()))) { |
| 638 should_check_remote_change_ = false; | 646 should_check_remote_change_ = false; |
| 639 listing_remote_changes_ = true; | 647 listing_remote_changes_ = true; |
| 640 time_to_check_changes_ = | 648 time_to_check_changes_ = |
| 641 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 649 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
| 642 } | 650 } |
| 643 } | 651 } |
| 644 | 652 |
| 645 void SyncEngine::DidResolveConflict(SyncStatusCode status) { | 653 void SyncEngine::DidResolveConflict(SyncStatusCode status) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 672 case SYNC_STATUS_ACCESS_FORBIDDEN: | 680 case SYNC_STATUS_ACCESS_FORBIDDEN: |
| 673 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, | 681 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, |
| 674 "Access forbidden"); | 682 "Access forbidden"); |
| 675 break; | 683 break; |
| 676 | 684 |
| 677 // Errors which could make the service temporarily unavailable. | 685 // Errors which could make the service temporarily unavailable. |
| 678 case SYNC_STATUS_SERVICE_TEMPORARILY_UNAVAILABLE: | 686 case SYNC_STATUS_SERVICE_TEMPORARILY_UNAVAILABLE: |
| 679 case SYNC_STATUS_NETWORK_ERROR: | 687 case SYNC_STATUS_NETWORK_ERROR: |
| 680 case SYNC_STATUS_ABORT: | 688 case SYNC_STATUS_ABORT: |
| 681 case SYNC_STATUS_FAILED: | 689 case SYNC_STATUS_FAILED: |
| 682 if (drive_service_->HasRefreshToken()) { | 690 if (context_->GetDriveService()->HasRefreshToken()) { |
| 683 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, | 691 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, |
| 684 "Network or temporary service error."); | 692 "Network or temporary service error."); |
| 685 } else { | 693 } else { |
| 686 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, | 694 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, |
| 687 "Authentication required"); | 695 "Authentication required"); |
| 688 } | 696 } |
| 689 break; | 697 break; |
| 690 | 698 |
| 691 // Errors which would require manual user intervention to resolve. | 699 // Errors which would require manual user intervention to resolve. |
| 692 case SYNC_DATABASE_ERROR_CORRUPTION: | 700 case SYNC_DATABASE_ERROR_CORRUPTION: |
| (...skipping 22 matching lines...) Expand all Loading... |
| 715 old_state, GetCurrentState(), description.c_str()); | 723 old_state, GetCurrentState(), description.c_str()); |
| 716 FOR_EACH_OBSERVER( | 724 FOR_EACH_OBSERVER( |
| 717 Observer, service_observers_, | 725 Observer, service_observers_, |
| 718 OnRemoteServiceStateUpdated(GetCurrentState(), description)); | 726 OnRemoteServiceStateUpdated(GetCurrentState(), description)); |
| 719 } | 727 } |
| 720 | 728 |
| 721 void SyncEngine::UpdateRegisteredApps() { | 729 void SyncEngine::UpdateRegisteredApps() { |
| 722 if (!extension_service_) | 730 if (!extension_service_) |
| 723 return; | 731 return; |
| 724 | 732 |
| 725 DCHECK(metadata_database_); | 733 DCHECK(context_->GetMetadataDatabase()); |
| 726 std::vector<std::string> app_ids; | 734 std::vector<std::string> app_ids; |
| 727 metadata_database_->GetRegisteredAppIDs(&app_ids); | 735 context_->GetMetadataDatabase()->GetRegisteredAppIDs(&app_ids); |
| 728 | 736 |
| 729 // Update the status of every origin using status from ExtensionService. | 737 // Update the status of every origin using status from ExtensionService. |
| 730 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); | 738 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); |
| 731 itr != app_ids.end(); ++itr) { | 739 itr != app_ids.end(); ++itr) { |
| 732 const std::string& app_id = *itr; | 740 const std::string& app_id = *itr; |
| 733 GURL origin = | 741 GURL origin = |
| 734 extensions::Extension::GetBaseURLFromExtensionId(app_id); | 742 extensions::Extension::GetBaseURLFromExtensionId(app_id); |
| 735 if (!extension_service_->GetInstalledExtension(app_id)) { | 743 if (!extension_service_->GetInstalledExtension(app_id)) { |
| 736 // Extension has been uninstalled. | 744 // Extension has been uninstalled. |
| 737 // (At this stage we can't know if it was unpacked extension or not, | 745 // (At this stage we can't know if it was unpacked extension or not, |
| 738 // so just purge the remote folder.) | 746 // so just purge the remote folder.) |
| 739 UninstallOrigin(origin, | 747 UninstallOrigin(origin, |
| 740 RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, | 748 RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, |
| 741 base::Bind(&EmptyStatusCallback)); | 749 base::Bind(&EmptyStatusCallback)); |
| 742 continue; | 750 continue; |
| 743 } | 751 } |
| 744 FileTracker tracker; | 752 FileTracker tracker; |
| 745 if (!metadata_database_->FindAppRootTracker(app_id, &tracker)) { | 753 if (!context_->GetMetadataDatabase()->FindAppRootTracker(app_id, |
| 754 &tracker)) { |
| 746 // App will register itself on first run. | 755 // App will register itself on first run. |
| 747 continue; | 756 continue; |
| 748 } | 757 } |
| 749 bool is_app_enabled = extension_service_->IsExtensionEnabled(app_id); | 758 bool is_app_enabled = extension_service_->IsExtensionEnabled(app_id); |
| 750 bool is_app_root_tracker_enabled = | 759 bool is_app_root_tracker_enabled = |
| 751 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; | 760 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; |
| 752 if (is_app_enabled && !is_app_root_tracker_enabled) | 761 if (is_app_enabled && !is_app_root_tracker_enabled) |
| 753 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 762 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 754 else if (!is_app_enabled && is_app_root_tracker_enabled) | 763 else if (!is_app_enabled && is_app_root_tracker_enabled) |
| 755 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 764 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 756 } | 765 } |
| 757 } | 766 } |
| 758 | 767 |
| 759 } // namespace drive_backend | 768 } // namespace drive_backend |
| 760 } // namespace sync_file_system | 769 } // namespace sync_file_system |
| OLD | NEW |