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

Side by Side Diff: chrome/browser/sync_file_system/drive_file_sync_service.cc

Issue 12744008: SyncFS: store disabled origins in DriveMetadataStore (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 9 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_file_sync_service.h" 5 #include "chrome/browser/sync_file_system/drive_file_sync_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 const GURL& origin, 405 const GURL& origin,
406 const SyncStatusCallback& callback) { 406 const SyncStatusCallback& callback) {
407 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); 407 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, ""));
408 if (!token) { 408 if (!token) {
409 pending_tasks_.push_back(base::Bind( 409 pending_tasks_.push_back(base::Bind(
410 &DriveFileSyncService::UnregisterOriginForTrackingChanges, 410 &DriveFileSyncService::UnregisterOriginForTrackingChanges,
411 AsWeakPtr(), origin, callback)); 411 AsWeakPtr(), origin, callback));
412 return; 412 return;
413 } 413 }
414 414
415 // TODO(nhiroki): Add helper function to forget remote changes for the given
416 // origin like "ForgetRemoteChangesForOrigin(origin)".
417 // http://crbug.com/211600
415 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); 418 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin);
416 if (found != origin_to_changes_map_.end()) { 419 if (found != origin_to_changes_map_.end()) {
417 for (PathToChangeMap::iterator itr = found->second.begin(); 420 for (PathToChangeMap::iterator itr = found->second.begin();
418 itr != found->second.end(); ++itr) 421 itr != found->second.end(); ++itr)
419 pending_changes_.erase(itr->second.position_in_queue); 422 pending_changes_.erase(itr->second.position_in_queue);
420 origin_to_changes_map_.erase(found); 423 origin_to_changes_map_.erase(found);
421 } 424 }
422 pending_batch_sync_origins_.erase(origin); 425 pending_batch_sync_origins_.erase(origin);
423 426
424 metadata_store_->RemoveOrigin(origin, base::Bind( 427 metadata_store_->RemoveOrigin(origin, base::Bind(
425 &DriveFileSyncService::DidRemoveOriginOnMetadataStore, 428 &DriveFileSyncService::DidChangeOriginOnMetadataStore,
426 AsWeakPtr(), base::Passed(&token), callback)); 429 AsWeakPtr(), base::Passed(&token), callback));
427 } 430 }
428 431
432 void DriveFileSyncService::EnableOriginForTrackingChanges(
433 const GURL& origin,
434 const SyncStatusCallback& callback) {
435 if (!metadata_store_->IsOriginDisabled(origin))
436 return;
437
438 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, ""));
439 if (!token) {
440 pending_tasks_.push_back(base::Bind(
441 &DriveFileSyncService::EnableOriginForTrackingChanges,
442 AsWeakPtr(), origin, callback));
443 return;
444 }
445
446 metadata_store_->EnableOrigin(origin, base::Bind(
447 &DriveFileSyncService::DidChangeOriginOnMetadataStore,
448 AsWeakPtr(), base::Passed(&token), callback));
449 pending_batch_sync_origins_.insert(origin);
450 }
451
452 void DriveFileSyncService::DisableOriginForTrackingChanges(
453 const GURL& origin,
454 const SyncStatusCallback& callback) {
455 if (!metadata_store_->IsBatchSyncOrigin(origin) &&
456 !metadata_store_->IsIncrementalSyncOrigin(origin))
457 return;
458
459 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, ""));
460 if (!token) {
461 pending_tasks_.push_back(base::Bind(
462 &DriveFileSyncService::DisableOriginForTrackingChanges,
463 AsWeakPtr(), origin, callback));
464 return;
465 }
466
467 // TODO(nhiroki): Add helper function to forget remote changes for the given
468 // origin like "ForgetRemoteChangesForOrigin(origin)".
469 // http://crbug.com/211600
470 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin);
471 if (found != origin_to_changes_map_.end()) {
472 for (PathToChangeMap::iterator itr = found->second.begin();
473 itr != found->second.end(); ++itr)
474 pending_changes_.erase(itr->second.position_in_queue);
475 origin_to_changes_map_.erase(found);
476 }
477 pending_batch_sync_origins_.erase(origin);
478
479 metadata_store_->DisableOrigin(origin, base::Bind(
480 &DriveFileSyncService::DidChangeOriginOnMetadataStore,
481 AsWeakPtr(), base::Passed(&token), callback));
482 }
483
429 void DriveFileSyncService::DeleteOriginDirectory( 484 void DriveFileSyncService::DeleteOriginDirectory(
430 const GURL& origin, 485 const GURL& origin,
431 const SyncStatusCallback& callback) { 486 const SyncStatusCallback& callback) {
432 scoped_ptr<TaskToken> token(GetToken( 487 scoped_ptr<TaskToken> token(GetToken(
433 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); 488 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory"));
434 if (!token) { 489 if (!token) {
435 pending_tasks_.push_back(base::Bind( 490 pending_tasks_.push_back(base::Bind(
436 &DriveFileSyncService::DeleteOriginDirectory, 491 &DriveFileSyncService::DeleteOriginDirectory,
437 AsWeakPtr(), origin, callback)); 492 AsWeakPtr(), origin, callback));
438 return; 493 return;
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 903
849 void DriveFileSyncService::DidInitializeMetadataStore( 904 void DriveFileSyncService::DidInitializeMetadataStore(
850 scoped_ptr<TaskToken> token, 905 scoped_ptr<TaskToken> token,
851 SyncStatusCode status, 906 SyncStatusCode status,
852 bool created) { 907 bool created) {
853 if (status != SYNC_STATUS_OK) { 908 if (status != SYNC_STATUS_OK) {
854 NotifyTaskDone(status, token.Pass()); 909 NotifyTaskDone(status, token.Pass());
855 return; 910 return;
856 } 911 }
857 912
858 // Remove any origins that are not installed or enabled. 913 UpdateRegisteredOrigins();
859 UnregisterInactiveExtensionsIds();
860 914
861 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); 915 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp();
862 916
863 // Mark all the batch sync origins as 'pending' so that we can start 917 // Mark all the batch sync origins as 'pending' so that we can start
864 // batch sync when we're ready. 918 // batch sync when we're ready.
865 DCHECK(pending_batch_sync_origins_.empty()); 919 DCHECK(pending_batch_sync_origins_.empty());
866 for (std::map<GURL, std::string>::const_iterator itr = 920 for (std::map<GURL, std::string>::const_iterator itr =
867 metadata_store_->batch_sync_origins().begin(); 921 metadata_store_->batch_sync_origins().begin();
868 itr != metadata_store_->batch_sync_origins().end(); 922 itr != metadata_store_->batch_sync_origins().end();
869 ++itr) { 923 ++itr) {
(...skipping 11 matching lines...) Expand all
881 const std::string& resource_id = itr->second; 935 const std::string& resource_id = itr->second;
882 AppendFetchChange(url.origin(), url.path(), resource_id); 936 AppendFetchChange(url.origin(), url.path(), resource_id);
883 } 937 }
884 938
885 // It's ok to fail, so we pass EmptyResourceIdCallback here. 939 // It's ok to fail, so we pass EmptyResourceIdCallback here.
886 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); 940 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback));
887 941
888 RegisterDriveNotifications(); 942 RegisterDriveNotifications();
889 } 943 }
890 944
891 void DriveFileSyncService::UnregisterInactiveExtensionsIds() { 945 void DriveFileSyncService::UpdateRegisteredOrigins() {
892 ExtensionService* extension_service = 946 ExtensionService* extension_service =
893 extensions::ExtensionSystem::Get(profile_)->extension_service(); 947 extensions::ExtensionSystem::Get(profile_)->extension_service();
894 if (!extension_service) 948 if (!extension_service)
895 return; 949 return;
896 std::vector<GURL> tracked_origins;
897 metadata_store_->GetAllOrigins(&tracked_origins);
898 950
899 for (std::vector<GURL>::const_iterator itr = tracked_origins.begin(); 951 // TODO(nhiroki): clean up these loops with similar bodies.
900 itr != tracked_origins.end(); 952 // http://crbug.com/211600
901 ++itr) { 953
902 // Make sure the registered extension is installed and enabled. 954 std::vector<GURL> disabled_origins;
955 metadata_store_->GetDisabledOrigins(&disabled_origins);
956 for (std::vector<GURL>::const_iterator itr = disabled_origins.begin();
957 itr != disabled_origins.end(); ++itr) {
903 std::string extension_id = itr->host(); 958 std::string extension_id = itr->host();
904 const extensions::Extension* installed_extension = 959 GURL origin =
905 extension_service->GetExtensionById(extension_id, 960 extensions::Extension::GetBaseURLFromExtensionId(extension_id);
906 false /* include_disabled */); 961
907 if (installed_extension != NULL) 962 if (!extension_service->GetInstalledExtension(extension_id)) {
963 // Extension is uninstalled. Unregister origin.
964 metadata_store_->RemoveOrigin(
965 origin, base::Bind(&DidRemoveOrigin, origin));
908 continue; 966 continue;
967 }
909 968
910 // Extension is either disabled or uninstalled. Unregister origin. 969 if (extension_service->IsExtensionEnabled(extension_id)) {
911 GURL origin = extensions::Extension::GetBaseURLFromExtensionId( 970 // Extension is enabled. Enable origin.
912 extension_id); 971 metadata_store_->EnableOrigin(
913 metadata_store_->RemoveOrigin(origin, base::Bind(&DidRemoveOrigin, origin)); 972 origin, base::Bind(&EmptyStatusCallback));
973 pending_batch_sync_origins_.insert(origin);
974 continue;
975 }
976
977 // Extension is still disabled.
978 }
979
980 std::vector<GURL> enabled_origins;
981 metadata_store_->GetEnabledOrigins(&enabled_origins);
982 for (std::vector<GURL>::const_iterator itr = enabled_origins.begin();
983 itr != enabled_origins.end(); ++itr) {
984 std::string extension_id = itr->host();
985 GURL origin =
986 extensions::Extension::GetBaseURLFromExtensionId(extension_id);
987
988 if (!extension_service->GetInstalledExtension(extension_id)) {
989 // Extension is uninstalled. Unregister origin.
990 metadata_store_->RemoveOrigin(
991 origin, base::Bind(&DidRemoveOrigin, origin));
992 continue;
993 }
994
995 if (!extension_service->IsExtensionEnabled(extension_id)) {
996 // Extension is disabled. Disable origin.
997 metadata_store_->DisableOrigin(
998 origin, base::Bind(&EmptyStatusCallback));
999 continue;
1000 }
1001
1002 // Extension is still enabled.
914 } 1003 }
915 } 1004 }
916 1005
917 void DriveFileSyncService::GetSyncRootDirectory( 1006 void DriveFileSyncService::GetSyncRootDirectory(
918 scoped_ptr<TaskToken> token, 1007 scoped_ptr<TaskToken> token,
919 const ResourceIdCallback& callback) { 1008 const ResourceIdCallback& callback) {
920 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); 1009 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root");
921 sync_client_->GetDriveDirectoryForSyncRoot( 1010 sync_client_->GetDriveDirectoryForSyncRoot(
922 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, 1011 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory,
923 AsWeakPtr(), base::Passed(&token), callback)); 1012 AsWeakPtr(), base::Passed(&token), callback));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
959 GetDriveDirectoryForOrigin(origin, callback, sync_root_resource_id); 1048 GetDriveDirectoryForOrigin(origin, callback, sync_root_resource_id);
960 } 1049 }
961 1050
962 void DriveFileSyncService::StartBatchSyncForOrigin( 1051 void DriveFileSyncService::StartBatchSyncForOrigin(
963 const GURL& origin, 1052 const GURL& origin,
964 const std::string& resource_id) { 1053 const std::string& resource_id) {
965 scoped_ptr<TaskToken> token( 1054 scoped_ptr<TaskToken> token(
966 GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp")); 1055 GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp"));
967 DCHECK(token); 1056 DCHECK(token);
968 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); 1057 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_);
1058 DCHECK(!metadata_store_->IsOriginDisabled(origin));
969 1059
970 DVLOG(1) << "Start batch sync for:" << origin.spec(); 1060 DVLOG(1) << "Start batch sync for:" << origin.spec();
971 1061
972 sync_client_->GetLargestChangeStamp( 1062 sync_client_->GetLargestChangeStamp(
973 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, 1063 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync,
974 AsWeakPtr(), base::Passed(&token), origin, resource_id)); 1064 AsWeakPtr(), base::Passed(&token), origin, resource_id));
975 1065
976 may_have_unfetched_changes_ = false; 1066 may_have_unfetched_changes_ = false;
977 } 1067 }
978 1068
(...skipping 10 matching lines...) Expand all
989 return; 1079 return;
990 } 1080 }
991 1081
992 if (metadata_store_->IsIncrementalSyncOrigin(origin) || 1082 if (metadata_store_->IsIncrementalSyncOrigin(origin) ||
993 metadata_store_->IsBatchSyncOrigin(origin)) { 1083 metadata_store_->IsBatchSyncOrigin(origin)) {
994 token->ResetTask(FROM_HERE); 1084 token->ResetTask(FROM_HERE);
995 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); 1085 NotifyTaskDone(SYNC_STATUS_OK, token.Pass());
996 callback.Run(SYNC_STATUS_OK); 1086 callback.Run(SYNC_STATUS_OK);
997 return; 1087 return;
998 } 1088 }
1089 DCHECK(!metadata_store_->IsOriginDisabled(origin));
999 1090
1000 DCHECK(!sync_root_resource_id.empty()); 1091 DCHECK(!sync_root_resource_id.empty());
1001 sync_client_->GetDriveDirectoryForOrigin( 1092 sync_client_->GetDriveDirectoryForOrigin(
1002 sync_root_resource_id, origin, 1093 sync_root_resource_id, origin,
1003 base::Bind(&DriveFileSyncService::DidGetDriveDirectoryForOrigin, 1094 base::Bind(&DriveFileSyncService::DidGetDriveDirectoryForOrigin,
1004 AsWeakPtr(), base::Passed(&token), origin, callback)); 1095 AsWeakPtr(), base::Passed(&token), origin, callback));
1005 } 1096 }
1006 1097
1007 void DriveFileSyncService::DidGetDriveDirectoryForOrigin( 1098 void DriveFileSyncService::DidGetDriveDirectoryForOrigin(
1008 scoped_ptr<TaskToken> token, 1099 scoped_ptr<TaskToken> token,
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 // (indicates that we may have longer polling cycle), trigger the first 1195 // (indicates that we may have longer polling cycle), trigger the first
1105 // incremental sync on next task cycle. 1196 // incremental sync on next task cycle.
1106 if (pending_batch_sync_origins_.empty() && 1197 if (pending_batch_sync_origins_.empty() &&
1107 push_notification_enabled_) { 1198 push_notification_enabled_) {
1108 may_have_unfetched_changes_ = true; 1199 may_have_unfetched_changes_ = true;
1109 } 1200 }
1110 1201
1111 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); 1202 NotifyTaskDone(SYNC_STATUS_OK, token.Pass());
1112 } 1203 }
1113 1204
1114 void DriveFileSyncService::DidRemoveOriginOnMetadataStore( 1205 void DriveFileSyncService::DidChangeOriginOnMetadataStore(
1115 scoped_ptr<TaskToken> token, 1206 scoped_ptr<TaskToken> token,
1116 const SyncStatusCallback& callback, 1207 const SyncStatusCallback& callback,
1117 SyncStatusCode status) { 1208 SyncStatusCode status) {
1118 NotifyTaskDone(status, token.Pass()); 1209 NotifyTaskDone(status, token.Pass());
1119 callback.Run(status); 1210 callback.Run(status);
1120 } 1211 }
1121 1212
1122 void DriveFileSyncService::DidGetRemoteFileMetadata( 1213 void DriveFileSyncService::DidGetRemoteFileMetadata(
1123 const SyncFileMetadataCallback& callback, 1214 const SyncFileMetadataCallback& callback,
1124 google_apis::GDataErrorCode error, 1215 google_apis::GDataErrorCode error,
(...skipping 1175 matching lines...) Expand 10 before | Expand all | Expand 10 after
2300 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); 2391 DCHECK_EQ(SYNC_ACTION_NONE, action_taken);
2301 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); 2392 DCHECK_EQ(SYNC_DIRECTION_NONE, direction);
2302 } 2393 }
2303 2394
2304 FOR_EACH_OBSERVER( 2395 FOR_EACH_OBSERVER(
2305 FileStatusObserver, file_status_observers_, 2396 FileStatusObserver, file_status_observers_,
2306 OnFileStatusChanged(url, sync_status, action_taken, direction)); 2397 OnFileStatusChanged(url, sync_status, action_taken, direction));
2307 } 2398 }
2308 2399
2309 } // namespace sync_file_system 2400 } // namespace sync_file_system
OLDNEW
« no previous file with comments | « chrome/browser/sync_file_system/drive_file_sync_service.h ('k') | chrome/browser/sync_file_system/drive_metadata_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698