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

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: 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 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); 415 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin);
416 if (found != origin_to_changes_map_.end()) { 416 if (found != origin_to_changes_map_.end()) {
417 for (PathToChangeMap::iterator itr = found->second.begin(); 417 for (PathToChangeMap::iterator itr = found->second.begin();
418 itr != found->second.end(); ++itr) 418 itr != found->second.end(); ++itr)
419 pending_changes_.erase(itr->second.position_in_queue); 419 pending_changes_.erase(itr->second.position_in_queue);
420 origin_to_changes_map_.erase(found); 420 origin_to_changes_map_.erase(found);
421 } 421 }
422 pending_batch_sync_origins_.erase(origin); 422 pending_batch_sync_origins_.erase(origin);
423 423
424 metadata_store_->RemoveOrigin(origin, base::Bind( 424 metadata_store_->RemoveOrigin(origin, base::Bind(
425 &DriveFileSyncService::DidRemoveOriginOnMetadataStore, 425 &DriveFileSyncService::DidChangeOriginOnMetadataStore,
426 AsWeakPtr(), base::Passed(&token), callback)); 426 AsWeakPtr(), base::Passed(&token), callback));
427 } 427 }
428 428
429 void DriveFileSyncService::EnableOriginForTrackingChanges(
430 const GURL& origin,
431 const SyncStatusCallback& callback) {
432 if (!metadata_store_->IsOriginDisabled(origin))
433 return;
434
435 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, ""));
436 if (!token) {
437 pending_tasks_.push_back(base::Bind(
438 &DriveFileSyncService::EnableOriginForTrackingChanges,
439 AsWeakPtr(), origin, callback));
440 return;
441 }
442
443 metadata_store_->EnableOrigin(origin, base::Bind(
444 &DriveFileSyncService::DidChangeOriginOnMetadataStore,
445 AsWeakPtr(), base::Passed(&token), callback));
446 pending_batch_sync_origins_.insert(origin);
447 }
448
449 void DriveFileSyncService::DisableOriginForTrackingChanges(
450 const GURL& origin,
451 const SyncStatusCallback& callback) {
452 if (!metadata_store_->IsBatchSyncOrigin(origin) &&
453 !metadata_store_->IsIncrementalSyncOrigin(origin))
454 return;
455
456 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, ""));
457 if (!token) {
458 pending_tasks_.push_back(base::Bind(
459 &DriveFileSyncService::DisableOriginForTrackingChanges,
460 AsWeakPtr(), origin, callback));
461 return;
462 }
463
464 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin);
465 if (found != origin_to_changes_map_.end()) {
466 for (PathToChangeMap::iterator itr = found->second.begin();
467 itr != found->second.end(); ++itr)
468 pending_changes_.erase(itr->second.position_in_queue);
469 origin_to_changes_map_.erase(found);
470 }
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.
471 pending_batch_sync_origins_.erase(origin);
472
473 metadata_store_->DisableOrigin(origin, base::Bind(
474 &DriveFileSyncService::DidChangeOriginOnMetadataStore,
475 AsWeakPtr(), base::Passed(&token), callback));
476 }
477
429 void DriveFileSyncService::DeleteOriginDirectory( 478 void DriveFileSyncService::DeleteOriginDirectory(
430 const GURL& origin, 479 const GURL& origin,
431 const SyncStatusCallback& callback) { 480 const SyncStatusCallback& callback) {
432 scoped_ptr<TaskToken> token(GetToken( 481 scoped_ptr<TaskToken> token(GetToken(
433 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); 482 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory"));
434 if (!token) { 483 if (!token) {
435 pending_tasks_.push_back(base::Bind( 484 pending_tasks_.push_back(base::Bind(
436 &DriveFileSyncService::DeleteOriginDirectory, 485 &DriveFileSyncService::DeleteOriginDirectory,
437 AsWeakPtr(), origin, callback)); 486 AsWeakPtr(), origin, callback));
438 return; 487 return;
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 897
849 void DriveFileSyncService::DidInitializeMetadataStore( 898 void DriveFileSyncService::DidInitializeMetadataStore(
850 scoped_ptr<TaskToken> token, 899 scoped_ptr<TaskToken> token,
851 SyncStatusCode status, 900 SyncStatusCode status,
852 bool created) { 901 bool created) {
853 if (status != SYNC_STATUS_OK) { 902 if (status != SYNC_STATUS_OK) {
854 NotifyTaskDone(status, token.Pass()); 903 NotifyTaskDone(status, token.Pass());
855 return; 904 return;
856 } 905 }
857 906
858 // Remove any origins that are not installed or enabled. 907 UpdateRegisteredOrigins();
859 UnregisterInactiveExtensionsIds();
860 908
861 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); 909 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp();
862 910
863 // Mark all the batch sync origins as 'pending' so that we can start 911 // Mark all the batch sync origins as 'pending' so that we can start
864 // batch sync when we're ready. 912 // batch sync when we're ready.
865 DCHECK(pending_batch_sync_origins_.empty()); 913 DCHECK(pending_batch_sync_origins_.empty());
866 for (std::map<GURL, std::string>::const_iterator itr = 914 for (std::map<GURL, std::string>::const_iterator itr =
867 metadata_store_->batch_sync_origins().begin(); 915 metadata_store_->batch_sync_origins().begin();
868 itr != metadata_store_->batch_sync_origins().end(); 916 itr != metadata_store_->batch_sync_origins().end();
869 ++itr) { 917 ++itr) {
(...skipping 11 matching lines...) Expand all
881 const std::string& resource_id = itr->second; 929 const std::string& resource_id = itr->second;
882 AppendFetchChange(url.origin(), url.path(), resource_id); 930 AppendFetchChange(url.origin(), url.path(), resource_id);
883 } 931 }
884 932
885 // It's ok to fail, so we pass EmptyResourceIdCallback here. 933 // It's ok to fail, so we pass EmptyResourceIdCallback here.
886 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); 934 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback));
887 935
888 RegisterDriveNotifications(); 936 RegisterDriveNotifications();
889 } 937 }
890 938
891 void DriveFileSyncService::UnregisterInactiveExtensionsIds() { 939 void DriveFileSyncService::UpdateRegisteredOrigins() {
892 ExtensionService* extension_service = 940 ExtensionService* extension_service =
893 extensions::ExtensionSystem::Get(profile_)->extension_service(); 941 extensions::ExtensionSystem::Get(profile_)->extension_service();
894 if (!extension_service) 942 if (!extension_service)
895 return; 943 return;
896 std::vector<GURL> tracked_origins;
897 metadata_store_->GetAllOrigins(&tracked_origins);
898 944
899 for (std::vector<GURL>::const_iterator itr = tracked_origins.begin(); 945 // TODO(nhiroki): clean up these loops with similar bodies.
900 itr != tracked_origins.end(); 946 // http://crbug.com/211600
901 ++itr) { 947
902 // Make sure the registered extension is installed and enabled. 948 std::vector<GURL> disabled_origins;
949 metadata_store_->GetDisabledOrigins(&disabled_origins);
950 for (std::vector<GURL>::const_iterator itr = disabled_origins.begin();
951 itr != disabled_origins.end(); ++itr) {
903 std::string extension_id = itr->host(); 952 std::string extension_id = itr->host();
904 const extensions::Extension* installed_extension = 953 GURL origin =
905 extension_service->GetExtensionById(extension_id, 954 extensions::Extension::GetBaseURLFromExtensionId(extension_id);
906 false /* include_disabled */); 955
907 if (installed_extension != NULL) 956 if (extension_service->GetInstalledExtension(extension_id) == NULL) {
957 // Extension is uninstalled. Unregister origin.
958 metadata_store_->RemoveOrigin(
959 origin, base::Bind(&DidRemoveOrigin, origin));
908 continue; 960 continue;
961 }
909 962
910 // Extension is either disabled or uninstalled. Unregister origin. 963 if (extension_service->IsExtensionEnabled(extension_id)) {
911 GURL origin = extensions::Extension::GetBaseURLFromExtensionId( 964 // Extension is enabled. Enable origin.
912 extension_id); 965 metadata_store_->EnableOrigin(
913 metadata_store_->RemoveOrigin(origin, base::Bind(&DidRemoveOrigin, origin)); 966 origin, base::Bind(&EmptyStatusCallback));
967 pending_batch_sync_origins_.insert(origin);
968 continue;
969 }
970
971 // Extension is still disabled.
972 }
973
974 std::vector<GURL> enabled_origins;
975 metadata_store_->GetEnabledOrigins(&enabled_origins);
976 for (std::vector<GURL>::const_iterator itr = enabled_origins.begin();
977 itr != enabled_origins.end(); ++itr) {
978 std::string extension_id = itr->host();
979 GURL origin =
980 extensions::Extension::GetBaseURLFromExtensionId(extension_id);
981
982 if (extension_service->GetInstalledExtension(extension_id) == NULL) {
983 // Extension is uninstalled. Unregister origin.
984 metadata_store_->RemoveOrigin(
985 origin, base::Bind(&DidRemoveOrigin, origin));
986 continue;
987 }
988
989 if (!extension_service->IsExtensionEnabled(extension_id)) {
990 // Extension is disabled. Disable origin.
991 metadata_store_->DisableOrigin(
992 origin, base::Bind(&EmptyStatusCallback));
993 continue;
994 }
995
996 // Extension is still enabled.
914 } 997 }
915 } 998 }
916 999
917 void DriveFileSyncService::GetSyncRootDirectory( 1000 void DriveFileSyncService::GetSyncRootDirectory(
918 scoped_ptr<TaskToken> token, 1001 scoped_ptr<TaskToken> token,
919 const ResourceIdCallback& callback) { 1002 const ResourceIdCallback& callback) {
920 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); 1003 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root");
921 sync_client_->GetDriveDirectoryForSyncRoot( 1004 sync_client_->GetDriveDirectoryForSyncRoot(
922 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, 1005 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory,
923 AsWeakPtr(), base::Passed(&token), callback)); 1006 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); 1042 GetDriveDirectoryForOrigin(origin, callback, sync_root_resource_id);
960 } 1043 }
961 1044
962 void DriveFileSyncService::StartBatchSyncForOrigin( 1045 void DriveFileSyncService::StartBatchSyncForOrigin(
963 const GURL& origin, 1046 const GURL& origin,
964 const std::string& resource_id) { 1047 const std::string& resource_id) {
965 scoped_ptr<TaskToken> token( 1048 scoped_ptr<TaskToken> token(
966 GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp")); 1049 GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp"));
967 DCHECK(token); 1050 DCHECK(token);
968 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); 1051 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_);
1052 DCHECK(!metadata_store_->IsOriginDisabled(origin));
969 1053
970 DVLOG(1) << "Start batch sync for:" << origin.spec(); 1054 DVLOG(1) << "Start batch sync for:" << origin.spec();
971 1055
972 sync_client_->GetLargestChangeStamp( 1056 sync_client_->GetLargestChangeStamp(
973 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, 1057 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync,
974 AsWeakPtr(), base::Passed(&token), origin, resource_id)); 1058 AsWeakPtr(), base::Passed(&token), origin, resource_id));
975 1059
976 may_have_unfetched_changes_ = false; 1060 may_have_unfetched_changes_ = false;
977 } 1061 }
978 1062
979 void DriveFileSyncService::GetDriveDirectoryForOrigin( 1063 void DriveFileSyncService::GetDriveDirectoryForOrigin(
980 const GURL& origin, 1064 const GURL& origin,
981 const SyncStatusCallback& callback, 1065 const SyncStatusCallback& callback,
982 const std::string& sync_root_resource_id) { 1066 const std::string& sync_root_resource_id) {
983 scoped_ptr<TaskToken> token(GetToken( 1067 scoped_ptr<TaskToken> token(GetToken(
984 FROM_HERE, TASK_TYPE_DRIVE, "Retrieving origin metadata")); 1068 FROM_HERE, TASK_TYPE_DRIVE, "Retrieving origin metadata"));
985 if (!token) { 1069 if (!token) {
986 pending_tasks_.push_back(base::Bind( 1070 pending_tasks_.push_back(base::Bind(
987 &DriveFileSyncService::GetDriveDirectoryForOrigin, 1071 &DriveFileSyncService::GetDriveDirectoryForOrigin,
988 AsWeakPtr(), origin, callback, sync_root_resource_id)); 1072 AsWeakPtr(), origin, callback, sync_root_resource_id));
989 return; 1073 return;
990 } 1074 }
991 1075
992 if (metadata_store_->IsIncrementalSyncOrigin(origin) || 1076 if (metadata_store_->IsIncrementalSyncOrigin(origin) ||
993 metadata_store_->IsBatchSyncOrigin(origin)) { 1077 metadata_store_->IsBatchSyncOrigin(origin) ||
1078 metadata_store_->IsOriginDisabled(origin)) {
994 token->ResetTask(FROM_HERE); 1079 token->ResetTask(FROM_HERE);
995 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); 1080 NotifyTaskDone(SYNC_STATUS_OK, token.Pass());
996 callback.Run(SYNC_STATUS_OK); 1081 callback.Run(SYNC_STATUS_OK);
997 return; 1082 return;
998 } 1083 }
999 1084
1000 DCHECK(!sync_root_resource_id.empty()); 1085 DCHECK(!sync_root_resource_id.empty());
1001 sync_client_->GetDriveDirectoryForOrigin( 1086 sync_client_->GetDriveDirectoryForOrigin(
1002 sync_root_resource_id, origin, 1087 sync_root_resource_id, origin,
1003 base::Bind(&DriveFileSyncService::DidGetDriveDirectoryForOrigin, 1088 base::Bind(&DriveFileSyncService::DidGetDriveDirectoryForOrigin,
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 // (indicates that we may have longer polling cycle), trigger the first 1189 // (indicates that we may have longer polling cycle), trigger the first
1105 // incremental sync on next task cycle. 1190 // incremental sync on next task cycle.
1106 if (pending_batch_sync_origins_.empty() && 1191 if (pending_batch_sync_origins_.empty() &&
1107 push_notification_enabled_) { 1192 push_notification_enabled_) {
1108 may_have_unfetched_changes_ = true; 1193 may_have_unfetched_changes_ = true;
1109 } 1194 }
1110 1195
1111 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); 1196 NotifyTaskDone(SYNC_STATUS_OK, token.Pass());
1112 } 1197 }
1113 1198
1114 void DriveFileSyncService::DidRemoveOriginOnMetadataStore( 1199 void DriveFileSyncService::DidChangeOriginOnMetadataStore(
1115 scoped_ptr<TaskToken> token, 1200 scoped_ptr<TaskToken> token,
1116 const SyncStatusCallback& callback, 1201 const SyncStatusCallback& callback,
1117 SyncStatusCode status) { 1202 SyncStatusCode status) {
1118 NotifyTaskDone(status, token.Pass()); 1203 NotifyTaskDone(status, token.Pass());
1119 callback.Run(status); 1204 callback.Run(status);
1120 } 1205 }
1121 1206
1122 void DriveFileSyncService::DidGetRemoteFileMetadata( 1207 void DriveFileSyncService::DidGetRemoteFileMetadata(
1123 const SyncFileMetadataCallback& callback, 1208 const SyncFileMetadataCallback& callback,
1124 google_apis::GDataErrorCode error, 1209 google_apis::GDataErrorCode error,
(...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after
2280 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); 2365 DCHECK_EQ(SYNC_ACTION_NONE, action_taken);
2281 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); 2366 DCHECK_EQ(SYNC_DIRECTION_NONE, direction);
2282 } 2367 }
2283 2368
2284 FOR_EACH_OBSERVER( 2369 FOR_EACH_OBSERVER(
2285 FileStatusObserver, file_status_observers_, 2370 FileStatusObserver, file_status_observers_,
2286 OnFileStatusChanged(url, sync_status, action_taken, direction)); 2371 OnFileStatusChanged(url, sync_status, action_taken, direction));
2287 } 2372 }
2288 2373
2289 } // namespace sync_file_system 2374 } // 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