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

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: unit tests and review fix 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 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); 413 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin);
414 if (found != origin_to_changes_map_.end()) { 414 if (found != origin_to_changes_map_.end()) {
415 for (PathToChangeMap::iterator itr = found->second.begin(); 415 for (PathToChangeMap::iterator itr = found->second.begin();
416 itr != found->second.end(); ++itr) 416 itr != found->second.end(); ++itr)
417 pending_changes_.erase(itr->second.position_in_queue); 417 pending_changes_.erase(itr->second.position_in_queue);
418 origin_to_changes_map_.erase(found); 418 origin_to_changes_map_.erase(found);
419 } 419 }
420 pending_batch_sync_origins_.erase(origin); 420 pending_batch_sync_origins_.erase(origin);
421 421
422 metadata_store_->RemoveOrigin(origin, base::Bind( 422 metadata_store_->RemoveOrigin(origin, base::Bind(
423 &DriveFileSyncService::DidRemoveOriginOnMetadataStore, 423 &DriveFileSyncService::DidChangeOriginOnMetadataStore,
424 AsWeakPtr(), base::Passed(&token), callback)); 424 AsWeakPtr(), base::Passed(&token), callback));
425 } 425 }
426 426
427 void DriveFileSyncService::EnableOriginForTrackingChanges(
428 const GURL& origin,
429 const SyncStatusCallback& callback) {
430 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, ""));
431 if (!token) {
432 pending_tasks_.push_back(base::Bind(
433 &DriveFileSyncService::EnableOriginForTrackingChanges,
434 AsWeakPtr(), origin, callback));
435 return;
436 }
437
438 metadata_store_->EnableOriginSync(origin, base::Bind(
439 &DriveFileSyncService::DidChangeOriginOnMetadataStore,
440 AsWeakPtr(), base::Passed(&token), callback));
441 pending_batch_sync_origins_.insert(origin);
442 }
443
444 void DriveFileSyncService::DisableOriginForTrackingChanges(
445 const GURL& origin,
446 const SyncStatusCallback& callback) {
447 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, ""));
448 if (!token) {
449 pending_tasks_.push_back(base::Bind(
450 &DriveFileSyncService::DisableOriginForTrackingChanges,
451 AsWeakPtr(), origin, callback));
452 return;
453 }
454
455 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin);
456 if (found != origin_to_changes_map_.end()) {
457 for (PathToChangeMap::iterator itr = found->second.begin();
458 itr != found->second.end(); ++itr)
459 origin_to_changes_map_.erase(found);
kinuko 2013/03/16 23:16:51 I'm afraid I'm lost here... do we call origin_to_c
nhiroki 2013/03/18 09:40:18 Thanks for pointing out! I mean to erase pending c
460 }
461 pending_batch_sync_origins_.erase(origin);
462
463 metadata_store_->DisableOriginSync(origin, base::Bind(
464 &DriveFileSyncService::DidChangeOriginOnMetadataStore,
465 AsWeakPtr(), base::Passed(&token), callback));
466 }
467
427 void DriveFileSyncService::DeleteOriginDirectory( 468 void DriveFileSyncService::DeleteOriginDirectory(
428 const GURL& origin, 469 const GURL& origin,
429 const SyncStatusCallback& callback) { 470 const SyncStatusCallback& callback) {
430 scoped_ptr<TaskToken> token(GetToken( 471 scoped_ptr<TaskToken> token(GetToken(
431 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); 472 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory"));
432 if (!token) { 473 if (!token) {
433 pending_tasks_.push_back(base::Bind( 474 pending_tasks_.push_back(base::Bind(
434 &DriveFileSyncService::DeleteOriginDirectory, 475 &DriveFileSyncService::DeleteOriginDirectory,
435 AsWeakPtr(), origin, callback)); 476 AsWeakPtr(), origin, callback));
436 return; 477 return;
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 887
847 void DriveFileSyncService::DidInitializeMetadataStore( 888 void DriveFileSyncService::DidInitializeMetadataStore(
848 scoped_ptr<TaskToken> token, 889 scoped_ptr<TaskToken> token,
849 SyncStatusCode status, 890 SyncStatusCode status,
850 bool created) { 891 bool created) {
851 if (status != SYNC_STATUS_OK) { 892 if (status != SYNC_STATUS_OK) {
852 NotifyTaskDone(status, token.Pass()); 893 NotifyTaskDone(status, token.Pass());
853 return; 894 return;
854 } 895 }
855 896
856 // Remove any origins that are not installed or enabled. 897 UpdateRegisteredOrigins();
857 UnregisterInactiveExtensionsIds();
858 898
859 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); 899 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp();
860 900
861 // Mark all the batch sync origins as 'pending' so that we can start 901 // Mark all the batch sync origins as 'pending' so that we can start
862 // batch sync when we're ready. 902 // batch sync when we're ready.
863 DCHECK(pending_batch_sync_origins_.empty()); 903 DCHECK(pending_batch_sync_origins_.empty());
864 for (std::map<GURL, std::string>::const_iterator itr = 904 for (std::map<GURL, std::string>::const_iterator itr =
865 metadata_store_->batch_sync_origins().begin(); 905 metadata_store_->batch_sync_origins().begin();
866 itr != metadata_store_->batch_sync_origins().end(); 906 itr != metadata_store_->batch_sync_origins().end();
867 ++itr) { 907 ++itr) {
(...skipping 11 matching lines...) Expand all
879 const std::string& resource_id = itr->second; 919 const std::string& resource_id = itr->second;
880 AppendFetchChange(url.origin(), url.path(), resource_id); 920 AppendFetchChange(url.origin(), url.path(), resource_id);
881 } 921 }
882 922
883 // It's ok to fail, so we pass EmptyResourceIdCallback here. 923 // It's ok to fail, so we pass EmptyResourceIdCallback here.
884 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); 924 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback));
885 925
886 RegisterDriveNotifications(); 926 RegisterDriveNotifications();
887 } 927 }
888 928
889 void DriveFileSyncService::UnregisterInactiveExtensionsIds() { 929 void DriveFileSyncService::UpdateRegisteredOrigins() {
890 ExtensionService* extension_service = 930 ExtensionService* extension_service =
891 extensions::ExtensionSystem::Get(profile_)->extension_service(); 931 extensions::ExtensionSystem::Get(profile_)->extension_service();
892 if (!extension_service) 932 if (!extension_service)
893 return; 933 return;
894 std::vector<GURL> tracked_origins;
895 metadata_store_->GetAllOrigins(&tracked_origins);
896 934
897 for (std::vector<GURL>::const_iterator itr = tracked_origins.begin(); 935 std::vector<GURL> disabled_origins;
898 itr != tracked_origins.end(); 936 metadata_store_->GetDisabledOrigins(&disabled_origins);
899 ++itr) { 937 for (std::vector<GURL>::const_iterator itr = disabled_origins.begin();
900 // Make sure the registered extension is installed and enabled. 938 itr != disabled_origins.end(); ++itr) {
901 std::string extension_id = itr->host(); 939 std::string extension_id = itr->host();
902 const extensions::Extension* installed_extension = 940 GURL origin =
903 extension_service->GetExtensionById(extension_id, 941 extensions::Extension::GetBaseURLFromExtensionId(extension_id);
904 false /* include_disabled */); 942
905 if (installed_extension != NULL) 943 if (extension_service->GetInstalledExtension(extension_id) == NULL) {
944 // Extension is uninstalled. Unregister origin.
945 metadata_store_->RemoveOrigin(
946 origin, base::Bind(&DidRemoveOrigin, origin));
906 continue; 947 continue;
948 }
907 949
908 // Extension is either disabled or uninstalled. Unregister origin. 950 if (extension_service->IsExtensionEnabled(extension_id)) {
909 GURL origin = extensions::Extension::GetBaseURLFromExtensionId( 951 // Extension is enabled. Enable origin.
910 extension_id); 952 metadata_store_->EnableOriginSync(
911 metadata_store_->RemoveOrigin(origin, base::Bind(&DidRemoveOrigin, origin)); 953 origin, base::Bind(&EmptyStatusCallback));
954 pending_batch_sync_origins_.insert(origin);
955 continue;
956 }
957
958 // Extension is still disabled.
959 }
960
961 std::vector<GURL> enabled_origins;
962 metadata_store_->GetEnabledOrigins(&enabled_origins);
963 for (std::vector<GURL>::const_iterator itr = enabled_origins.begin();
964 itr != enabled_origins.end(); ++itr) {
965 std::string extension_id = itr->host();
966 GURL origin =
967 extensions::Extension::GetBaseURLFromExtensionId(extension_id);
968
969 if (extension_service->GetInstalledExtension(extension_id) == NULL) {
970 // Extension is uninstalled. Unregister origin.
971 metadata_store_->RemoveOrigin(
972 origin, base::Bind(&DidRemoveOrigin, origin));
973 continue;
974 }
975
976 if (!extension_service->IsExtensionEnabled(extension_id)) {
977 // Extension is disabled. Disable origin.
978 metadata_store_->DisableOriginSync(
979 origin, base::Bind(&EmptyStatusCallback));
980 continue;
981 }
982
983 // Extension is still enabled.
912 } 984 }
913 } 985 }
914 986
915 void DriveFileSyncService::GetSyncRootDirectory( 987 void DriveFileSyncService::GetSyncRootDirectory(
916 scoped_ptr<TaskToken> token, 988 scoped_ptr<TaskToken> token,
917 const ResourceIdCallback& callback) { 989 const ResourceIdCallback& callback) {
918 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); 990 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root");
919 sync_client_->GetDriveDirectoryForSyncRoot( 991 sync_client_->GetDriveDirectoryForSyncRoot(
920 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, 992 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory,
921 AsWeakPtr(), base::Passed(&token), callback)); 993 AsWeakPtr(), base::Passed(&token), callback));
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1010 const std::string& resource_id) { 1082 const std::string& resource_id) {
1011 if (error != google_apis::HTTP_SUCCESS && 1083 if (error != google_apis::HTTP_SUCCESS &&
1012 error != google_apis::HTTP_CREATED) { 1084 error != google_apis::HTTP_CREATED) {
1013 SyncStatusCode status = 1085 SyncStatusCode status =
1014 GDataErrorCodeToSyncStatusCodeWrapper(error); 1086 GDataErrorCodeToSyncStatusCodeWrapper(error);
1015 NotifyTaskDone(status, token.Pass()); 1087 NotifyTaskDone(status, token.Pass());
1016 callback.Run(status); 1088 callback.Run(status);
1017 return; 1089 return;
1018 } 1090 }
1019 1091
1020 metadata_store_->AddBatchSyncOrigin(origin, resource_id); 1092 if (!metadata_store_->IsDisabledSyncOrigin(origin)) {
1021 pending_batch_sync_origins_.insert(origin); 1093 metadata_store_->AddBatchSyncOrigin(origin, resource_id);
1094 pending_batch_sync_origins_.insert(origin);
1095 }
1022 1096
1023 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); 1097 NotifyTaskDone(SYNC_STATUS_OK, token.Pass());
1024 callback.Run(SYNC_STATUS_OK); 1098 callback.Run(SYNC_STATUS_OK);
1025 } 1099 }
1026 1100
1027 void DriveFileSyncService::DidDeleteOriginDirectory( 1101 void DriveFileSyncService::DidDeleteOriginDirectory(
1028 scoped_ptr<TaskToken> token, 1102 scoped_ptr<TaskToken> token,
1029 const SyncStatusCallback& callback, 1103 const SyncStatusCallback& callback,
1030 google_apis::GDataErrorCode error) { 1104 google_apis::GDataErrorCode error) {
1031 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); 1105 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 // (indicates that we may have longer polling cycle), trigger the first 1176 // (indicates that we may have longer polling cycle), trigger the first
1103 // incremental sync on next task cycle. 1177 // incremental sync on next task cycle.
1104 if (pending_batch_sync_origins_.empty() && 1178 if (pending_batch_sync_origins_.empty() &&
1105 push_notification_enabled_) { 1179 push_notification_enabled_) {
1106 may_have_unfetched_changes_ = true; 1180 may_have_unfetched_changes_ = true;
1107 } 1181 }
1108 1182
1109 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); 1183 NotifyTaskDone(SYNC_STATUS_OK, token.Pass());
1110 } 1184 }
1111 1185
1112 void DriveFileSyncService::DidRemoveOriginOnMetadataStore( 1186 void DriveFileSyncService::DidChangeOriginOnMetadataStore(
1113 scoped_ptr<TaskToken> token, 1187 scoped_ptr<TaskToken> token,
1114 const SyncStatusCallback& callback, 1188 const SyncStatusCallback& callback,
1115 SyncStatusCode status) { 1189 SyncStatusCode status) {
1116 NotifyTaskDone(status, token.Pass()); 1190 NotifyTaskDone(status, token.Pass());
1117 callback.Run(status); 1191 callback.Run(status);
1118 } 1192 }
1119 1193
1120 void DriveFileSyncService::DidGetRemoteFileMetadata( 1194 void DriveFileSyncService::DidGetRemoteFileMetadata(
1121 const SyncFileMetadataCallback& callback, 1195 const SyncFileMetadataCallback& callback,
1122 google_apis::GDataErrorCode error, 1196 google_apis::GDataErrorCode error,
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after
2277 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); 2351 DCHECK_EQ(SYNC_ACTION_NONE, action_taken);
2278 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); 2352 DCHECK_EQ(SYNC_DIRECTION_NONE, direction);
2279 } 2353 }
2280 2354
2281 FOR_EACH_OBSERVER( 2355 FOR_EACH_OBSERVER(
2282 FileStatusObserver, file_status_observers_, 2356 FileStatusObserver, file_status_observers_,
2283 OnFileStatusChanged(url, sync_status, action_taken, direction)); 2357 OnFileStatusChanged(url, sync_status, action_taken, direction));
2284 } 2358 }
2285 2359
2286 } // namespace sync_file_system 2360 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698