profile_sync_service.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstddef> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/file_util.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/bookmarks/enhanced_bookmarks_features.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h" 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h" 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h" 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/invalidation/invalidation_service_factory.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_cookie_notification_details.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/services/gcm/gcm_profile_service.h" 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/services/gcm/gcm_profile_service_factory.h" 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/about_signin_internals_factory.h" 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/backend_migrator.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/chrome_report_unrecoverable_error.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/glue/device_info.h" 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/favicon_cache.h" 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/sync_backend_host.h" 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/sync_backend_host_impl.h" 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/sync/glue/sync_start_util.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/glue/synced_device_tracker.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/typed_url_data_type_controller.h" 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/sync/managed_user_signin_manager_wrapper.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_impl.h" 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/sync/sessions/notification_service_sessions_router.h" 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/sync/sessions/sessions_sync_manager.h" 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/sync/sync_error_controller.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service_factory.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/gcm_driver.h" 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/invalidation/invalidation_service.h" 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/about_signin_internals.h" 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h" 69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/sync_driver/change_processor.h" 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_controller.h" 7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/sync_driver/pref_names.h" 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/system_encryptor.h" 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/user_selectable_sync_type.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/url_request/url_request_context_getter.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/configure_reason.h" 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "sync/internal_api/public/http_bridge_network_resources.h" 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "sync/internal_api/public/network_resources.h" 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "sync/internal_api/public/sessions/type_debug_info_observer.h" 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "sync/internal_api/public/sync_core_proxy.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/sync_encryption_handler.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/experiments.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/sync_string_conversions.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/js/js_event_details.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/util/cryptographer.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 93bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "ui/base/l10n/time_format.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/internal_api/public/read_transaction.h" 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::ChangeProcessor; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::DataTypeController; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::DataTypeManager; 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using browser_sync::FailedDataTypesHandler; 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using browser_sync::NotificationServiceSessionsRouter; 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using browser_sync::ProfileSyncServiceStartBehavior; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::SyncBackendHost; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::ModelType; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::ModelTypeSet; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::JsBackend; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::JsController; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::JsEventDetails; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::JsEventHandler; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::ModelSafeRoutingInfo; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncCredentials; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncProtocolError; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::WeakHandle; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef GoogleServiceAuthError AuthError; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* ProfileSyncService::kSyncServerUrl = 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "https://clients4.google.com/chrome-sync"; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* ProfileSyncService::kDevServerUrl = 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "https://clients4.google.com/chrome-sync/dev"; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kSyncUnrecoverableErrorHistogram[] = 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Sync.UnrecoverableErrors"; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const net::BackoffEntry::Policy kRequestAccessTokenBackoffPolicy = { 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Number of initial errors (in sequence) to ignore before applying 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // exponential back-off rules. 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Initial delay for exponential back-off in ms. 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2000, 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Factor by which the waiting time will be multiplied. 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2, 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Fuzzing percentage. ex: 10% will spread requests randomly 1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // between 90%-100% of the calculated time. 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0.2, // 20% 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Maximum amount of time we are willing to delay our request in ms. 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(pavely): crbug.com/246686 ProfileSyncService should retry 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // RequestAccessToken on connection state change after backoff 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1000 * 3600 * 4, // 4 hours. 1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Time to keep an entry from being discarded even when it 1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // has no significant state, -1 to never discard. 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) -1, 1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Don't use initial delay unless the last request was an error. 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) false, 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static const base::FilePath::CharType kSyncDataFolderName[] = 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FILE_PATH_LITERAL("Sync Data"); 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static const base::FilePath::CharType kSyncBackupDataFolderName[] = 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FILE_PATH_LITERAL("Sync Data Backup"); 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Default delay in seconds to start backup/rollback backend. 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kBackupStartDelay = 10; 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace { 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ClearBrowsingData(Profile* profile, base::Time start, base::Time end) { 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // BrowsingDataRemover deletes itself when it's done. 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowsingDataRemover* remover = BrowsingDataRemover::CreateForRange( 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) profile, start, end); 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) remover->Remove(BrowsingDataRemover::REMOVE_ALL, 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowsingDataHelper::ALL); 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // anonymous namespace 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ShouldShowActionOnUI( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::SyncProtocolError& error) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (error.action != syncer::UNKNOWN_ACTION && 180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) error.action != syncer::DISABLE_SYNC_ON_CLIENT && 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) error.action != syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ProfileSyncService::ProfileSyncService( 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncComponentsFactory* factory, 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile, 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ManagedUserSigninManagerWrapper* signin_wrapper, 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileOAuth2TokenService* oauth2_token_service, 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ProfileSyncServiceStartBehavior start_behavior) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : OAuth2TokenService::Consumer("sync"), 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_auth_error_(AuthError::AuthErrorNone()), 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) passphrase_required_reason_(syncer::REASON_PASSPHRASE_NOT_REQUIRED), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory_(factory), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(profile), 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_prefs_(profile_->GetPrefs()), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_service_url_(kDevServerUrl), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_first_time_sync_configure_(false), 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_initialized_(false), 199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) sync_disabled_by_admin_(false), 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_auth_in_progress_(false), 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_(signin_wrapper), 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unrecoverable_error_reason_(ERROR_REASON_UNSET), 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expect_sync_configuration_aborted_(false), 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_types_(syncer::SyncEncryptionHandler::SensitiveTypes()), 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypt_everything_(false), 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encryption_pending_(false), 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) configure_status_(DataTypeManager::UNKNOWN), 20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_token_service_(oauth2_token_service), 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) request_access_token_backoff_(&kRequestAccessTokenBackoffPolicy), 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_factory_(this), 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_weak_factory_(this), 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) connection_status_(syncer::CONNECTION_NOT_ATTEMPTED), 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) last_get_token_error_(GoogleServiceAuthError::AuthErrorNone()), 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) network_resources_(new syncer::HttpBridgeNetworkResources), 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_( 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) start_behavior, 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) oauth2_token_service, 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &sync_prefs_, 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin_wrapper, 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&ProfileSyncService::StartUpSlowBackendComponents, 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) startup_controller_weak_factory_.GetWeakPtr(), 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SYNC)), 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backup_rollback_controller_( 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &sync_prefs_, signin_wrapper, 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&ProfileSyncService::StartUpSlowBackendComponents, 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) startup_controller_weak_factory_.GetWeakPtr(), 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BACKUP), 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&ProfileSyncService::StartUpSlowBackendComponents, 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) startup_controller_weak_factory_.GetWeakPtr(), 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ROLLBACK)), 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backend_mode_(IDLE), 23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) backup_start_delay_(base::TimeDelta::FromSeconds(kBackupStartDelay)), 23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) clear_browsing_data_(base::Bind(&ClearBrowsingData)) { 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(profile); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // By default, dev, canary, and unbranded Chromium users will go to the 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // development servers. Development servers have more features than standard 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sync servers. Users with officially-branded Chrome stable and beta builds 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will go to the standard sync servers. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetChannel hits the registry on Windows. See http://crbug.com/70380. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::ScopedAllowIO allow_io; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (channel == chrome::VersionInfo::CHANNEL_STABLE || 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel == chrome::VersionInfo::CHANNEL_BETA) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_service_url_ = GURL(kSyncServerUrl); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch syncer::SyncableService::StartSyncFlare flare( 2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch sync_start_util::GetFlareForSyncableService(profile->GetPath())); 2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<browser_sync::LocalSessionEventRouter> router( 2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new NotificationServiceSessionsRouter(profile, flare)); 2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch sessions_sync_manager_.reset( 2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new SessionsSyncManager(profile, this, router.Pass())); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProfileSyncService::~ProfileSyncService() { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.RemoveSyncPrefObserver(this); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shutdown() should have been called before destruction. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!backend_initialized_); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::IsSyncEnabledAndLoggedIn() { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exit if sync is disabled. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsManaged() || sync_prefs_.IsStartSuppressed()) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Sync is logged in if there is a non-empty effective username. 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !signin_->GetEffectiveUsername().empty(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool ProfileSyncService::IsOAuthRefreshTokenAvailable() { 2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!oauth2_token_service_) 2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return oauth2_token_service_->RefreshTokenIsAvailable( 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_->GetAccountIdToUse()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::Initialize() { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitSettings(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We clear this here (vs Shutdown) because we want to remember that an error 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happened on shutdown so we can display details (message, location) about it 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in about:sync. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearStaleErrors(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.AddSyncPrefObserver(this); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For now, the only thing we can do through policy is to turn sync off. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsManaged()) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableForUser(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterAuthNotifications(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!HasSyncSetupCompleted() || signin_->GetEffectiveUsername().empty()) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up in case of previous crash / setup abort / signout. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableForUser(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrySyncDatatypePrefRecovery(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_synced_time_ = sync_prefs_.GetLastSyncedTime(); 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string bootstrap_token = sync_prefs_.GetEncryptionBootstrapToken(); 308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (bootstrap_token.empty()) { 309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch sync_prefs_.SetEncryptionBootstrapToken( 310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch sync_prefs_.GetSpareBootstrapToken()); 311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_ANDROID) 315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(sync_error_controller_ == NULL) 316effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch << "Initialize() called more than once."; 317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch sync_error_controller_.reset(new SyncErrorController(this)); 318effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddObserver(sync_error_controller_.get()); 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_.Reset(GetRegisteredDataTypes()); 322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_.TryStart(); 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backup_rollback_controller_.Start(backup_start_delay_); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::TrySyncDatatypePrefRecovery() { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!sync_initialized()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!HasSyncSetupCompleted()) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There was a bug where OnUserChoseDatatypes was not properly called on 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // configuration (see crbug.com/154940). We detect this by checking whether 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kSyncKeepEverythingSynced has a default value. If so, and sync setup has 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completed, it means sync was not properly configured, so we manually 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // set kSyncKeepEverythingSynced. 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* const pref_service = profile_->GetPrefs(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pref_service) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (GetPreferredDataTypes().Size() > 1) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrefService::Preference* keep_everything_synced = 34423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) pref_service->FindPreference( 34523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) sync_driver::prefs::kSyncKeepEverythingSynced); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will be false if the preference was properly set or if it's controlled 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by policy. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!keep_everything_synced->IsDefaultValue()) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kSyncKeepEverythingSynced was not properly set. Set it and the preferred 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // types now, before we configure. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Sync.DatatypePrefRecovery", 1); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetKeepEverythingSynced(true); 355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) syncer::ModelTypeSet registered_types = GetRegisteredDataTypes(); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetPreferredDataTypes(registered_types, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_types); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::StartSyncingWithServer() { 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (backend_) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->StartSyncingWithServer(); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::RegisterAuthNotifications() { 36668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_token_service_->AddObserver(this); 367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (signin()) 368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch signin()->AddObserver(this); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 371ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid ProfileSyncService::UnregisterAuthNotifications() { 372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (signin()) 373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch signin()->RemoveObserver(this); 37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_token_service_->RemoveObserver(this); 375ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 376ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::RegisterDataTypeController( 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DataTypeController* data_type_controller) { 3795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK_EQ( 3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_controllers_.count(data_type_controller->type()), 3815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 0U); 382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(!GetRegisteredNonBlockingDataTypes().Has( 383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch data_type_controller->type())); 3845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_controllers_[data_type_controller->type()] = 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_type_controller; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ProfileSyncService::RegisterNonBlockingType(syncer::ModelType type) { 3895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK_EQ(directory_data_type_controllers_.count(type), 0U) 3905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu << "Duplicate registration of type " << ModelTypeToString(type); 3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(rlarocque): Set the enable flag properly when crbug.com/368834 is 3935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // fixed and we have some way of telling whether or not this type should be 3945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // enabled. 3955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu non_blocking_data_type_manager_.RegisterType(type, false); 3965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 3975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid ProfileSyncService::InitializeNonBlockingType( 3995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::ModelType type, 4005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<base::SequencedTaskRunner> task_runner, 4015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::WeakPtr<syncer::NonBlockingTypeProcessor> processor) { 4025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu non_blocking_data_type_manager_.InitializeTypeProcessor( 4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type, 4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu task_runner, 4055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu processor); 406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool ProfileSyncService::IsSessionsDataTypeControllerRunning() const { 4095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return directory_data_type_controllers_.find(syncer::SESSIONS) != 4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_controllers_.end() && 4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu (directory_data_type_controllers_.find(syncer::SESSIONS)-> 4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu second->state() == DataTypeController::RUNNING); 413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)browser_sync::OpenTabsUIDelegate* ProfileSyncService::GetOpenTabsUIDelegate() { 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!IsSessionsDataTypeControllerRunning()) 417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return NULL; 4180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return sessions_sync_manager_.get(); 419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)browser_sync::FaviconCache* ProfileSyncService::GetFaviconCache() { 4220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return sessions_sync_manager_->GetFaviconCache(); 423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<browser_sync::DeviceInfo> 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ProfileSyncService::GetLocalDeviceInfo() const { 427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend()) { 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_sync::SyncedDeviceTracker* device_tracker = 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) backend_->GetSyncedDeviceTracker(); 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (device_tracker) 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return device_tracker->ReadLocalDeviceInfo(); 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<browser_sync::DeviceInfo>(); 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<browser_sync::DeviceInfo> 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfileSyncService::GetDeviceInfo(const std::string& client_id) const { 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend()) { 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_sync::SyncedDeviceTracker* device_tracker = 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) backend_->GetSyncedDeviceTracker(); 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (device_tracker) 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return device_tracker->ReadDeviceInfo(client_id); 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<browser_sync::DeviceInfo>(); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 447a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ScopedVector<browser_sync::DeviceInfo> 44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ProfileSyncService::GetAllSignedInDevices() const { 449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ScopedVector<browser_sync::DeviceInfo> devices; 450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend()) { 451a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) browser_sync::SyncedDeviceTracker* device_tracker = 452a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) backend_->GetSyncedDeviceTracker(); 453a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (device_tracker) { 454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(lipalani) - Make device tracker return a scoped vector. 455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) device_tracker->GetAllSyncedDeviceInfo(&devices); 456a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 457a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 458a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return devices.Pass(); 459a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 460a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)std::string ProfileSyncService::GetLocalSyncCacheGUID() const { 462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend()) { 4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) browser_sync::SyncedDeviceTracker* device_tracker = 4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) backend_->GetSyncedDeviceTracker(); 4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (device_tracker) { 4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return device_tracker->cache_guid(); 4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return std::string(); 4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 472424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Notifies the observer of any device info changes. 473424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void ProfileSyncService::AddObserverForDeviceInfoChange( 474424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) browser_sync::SyncedDeviceTracker::Observer* observer) { 475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend()) { 476424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) browser_sync::SyncedDeviceTracker* device_tracker = 477424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) backend_->GetSyncedDeviceTracker(); 478424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (device_tracker) { 479424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) device_tracker->AddObserver(observer); 480424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 481424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 482424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 483424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 484424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Removes the observer from device info change notification. 485424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void ProfileSyncService::RemoveObserverForDeviceInfoChange( 486424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) browser_sync::SyncedDeviceTracker::Observer* observer) { 487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend()) { 488424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) browser_sync::SyncedDeviceTracker* device_tracker = 489424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) backend_->GetSyncedDeviceTracker(); 490424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (device_tracker) { 491424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) device_tracker->RemoveObserver(observer); 492424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 493424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 494424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 495424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::GetDataTypeControllerStates( 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_sync::DataTypeController::StateMap* state_map) const { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (browser_sync::DataTypeController::TypeMap::const_iterator iter = 4995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_controllers_.begin(); 5005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu iter != directory_data_type_controllers_.end(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++iter) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*state_map)[iter->first] = iter->second.get()->state(); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::InitSettings() { 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override the sync server URL from the command-line, if sync server 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // command-line argument exists. 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kSyncServiceURL)) { 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value(command_line.GetSwitchValueASCII( 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kSyncServiceURL)); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value.empty()) { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL custom_sync_url(value); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (custom_sync_url.is_valid()) { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_service_url_ = custom_sync_url; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "The following sync URL specified at the command-line " 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "is invalid: " << value; 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncCredentials ProfileSyncService::GetCredentials() { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncCredentials credentials; 527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (backend_mode_ == SYNC) { 528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) credentials.email = signin_->GetEffectiveUsername(); 529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(!credentials.email.empty()); 530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) credentials.sync_token = access_token_; 531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (credentials.sync_token.empty()) 533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) credentials.sync_token = "credentials_lost"; 534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 5357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return credentials; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ProfileSyncService::ShouldDeleteSyncFolder() { 540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (backend_mode_ == SYNC) 541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return !HasSyncSetupCompleted(); 54246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 54346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Start fresh if it's the first time backup after user stopped syncing. 54446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // This is needed because backup DB may contain items deleted by user during 54546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // sync period and can cause back-from-dead issues. 54646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (backend_mode_ == BACKUP && !sync_prefs_.GetFirstSyncTime().is_null()) 54746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 54846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::InitializeBackend(bool delete_stale_data) { 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!backend_) { 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncCredentials credentials = GetCredentials(); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context_getter( 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetRequestContext()); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete_stale_data) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearStaleErrors(); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<syncer::UnrecoverableErrorHandler> 567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) backend_unrecoverable_error_handler( 568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new browser_sync::BackendUnrecoverableErrorHandler( 569a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MakeWeakHandle(weak_factory_.GetWeakPtr()))); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Initialize( 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) sync_thread_.Pass(), 574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetJsEventHandler(), 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_service_url_, 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) credentials, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_stale_data, 578a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<syncer::SyncManagerFactory>( 579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new syncer::SyncManagerFactory(GetManagerType())).Pass(), 580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) backend_unrecoverable_error_handler.Pass(), 581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &browser_sync::ChromeReportUnrecoverableError, 582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) network_resources_.get()); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::IsEncryptedDatatypeEnabled() const { 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (encryption_pending()) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::ModelTypeSet preferred_types = GetPreferredDataTypes(); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::ModelTypeSet encrypted_types = GetEncryptedDataTypes(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(encrypted_types.Has(syncer::PASSWORDS)); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !Intersection(preferred_types, encrypted_types).Empty(); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnSyncConfigureRetry() { 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note: in order to handle auth failures that arise before the backend is 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // initialized (e.g. from invalidation notifier, or downloading new control 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // types), we have to gracefully handle configuration retries at all times. 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // At this point an auth error badge should be shown, which once resolved 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will trigger a new sync cycle. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 603effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfileSyncService::OnProtocolEvent( 604effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const syncer::ProtocolEvent& event) { 605effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FOR_EACH_OBSERVER(browser_sync::ProtocolEventObserver, 606effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch protocol_event_observers_, 607effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch OnProtocolEvent(event)); 608effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 609effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ProfileSyncService::OnDirectoryTypeCommitCounterUpdated( 611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) syncer::ModelType type, 612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const syncer::CommitCounters& counters) { 613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(syncer::TypeDebugInfoObserver, 614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type_debug_info_observers_, 615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnCommitCountersUpdated(type, counters)); 616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ProfileSyncService::OnDirectoryTypeUpdateCounterUpdated( 619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) syncer::ModelType type, 620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const syncer::UpdateCounters& counters) { 621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(syncer::TypeDebugInfoObserver, 622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type_debug_info_observers_, 623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnUpdateCountersUpdated(type, counters)); 624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ProfileSyncService::OnDirectoryTypeStatusCounterUpdated( 627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) syncer::ModelType type, 628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const syncer::StatusCounters& counters) { 629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(syncer::TypeDebugInfoObserver, 630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type_debug_info_observers_, 631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnStatusCountersUpdated(type, counters)); 632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSyncService::OnDataTypeRequestsSyncStartup( 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) syncer::ModelType type) { 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(syncer::UserTypes().Has(type)); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (backend_.get()) { 638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DVLOG(1) << "A data type requested sync startup, but it looks like " 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "something else beat it to the punch."; 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 643a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!GetPreferredDataTypes().Has(type)) { 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We can get here as datatype SyncableServices are typically wired up 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to the native datatype even if sync isn't enabled. 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DVLOG(1) << "Dropping sync startup request because type " 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << syncer::ModelTypeToString(type) << "not enabled."; 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_.OnDataTypeRequestsSyncStartup(type); 652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProfileSyncService::StartUpSlowBackendComponents( 655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProfileSyncService::BackendMode mode) { 656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_NE(IDLE, mode); 657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (backend_mode_ == mode) { 658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DVLOG(1) << "Start backend mode: " << mode; 662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (backend_) 664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShutdownImpl(browser_sync::SyncBackendHost::STOP_AND_CLAIM_THREAD); 665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backend_mode_ = mode; 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 66846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (backend_mode_ == ROLLBACK) 66946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ClearBrowsingDataSinceFirstSync(); 67046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath sync_folder = backend_mode_ == SYNC ? 672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath(kSyncDataFolderName) : 673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath(kSyncBackupDataFolderName); 674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) invalidation::InvalidationService* invalidator = backend_mode_ == SYNC ? 676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) invalidation::InvalidationServiceFactory::GetForProfile(profile_) : 677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL; 678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) backend_.reset( 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) factory_->CreateSyncBackendHost( 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_->GetDebugName(), 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_, 683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) invalidator, 684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sync_prefs_.AsWeakPtr(), 685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sync_folder)); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the backend. Every time we start up a new SyncBackendHost, 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we'll want to start from a fresh SyncDB, so delete any old one that might 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be there. 690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeBackend(ShouldDeleteSyncFolder()); 69146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 69246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) UpdateFirstSyncTimePref(); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ProfileSyncService::OnGetTokenSuccess( 6967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const OAuth2TokenService::Request* request, 6977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& access_token, 6987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Time& expiration_time) { 6997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK_EQ(access_token_request_, request); 7007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) access_token_request_.reset(); 7017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) access_token_ = access_token; 702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) token_receive_time_ = base::Time::Now(); 703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) last_get_token_error_ = GoogleServiceAuthError::AuthErrorNone(); 704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (sync_prefs_.SyncHasAuthError()) { 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_prefs_.SetSyncAuthError(false); 707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Sync.SyncAuthError", 708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AUTH_ERROR_FIXED, 709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AUTH_ERROR_LIMIT); 710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend()) 7137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) backend_->UpdateCredentials(GetCredentials()); 7147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else 715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_.TryStart(); 7167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 7177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ProfileSyncService::OnGetTokenFailure( 7197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const OAuth2TokenService::Request* request, 7207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const GoogleServiceAuthError& error) { 7217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK_EQ(access_token_request_, request); 7227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK_NE(error.state(), GoogleServiceAuthError::NONE); 7237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) access_token_request_.reset(); 724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) last_get_token_error_ = error; 7257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch (error.state()) { 7267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case GoogleServiceAuthError::CONNECTION_FAILED: 7277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case GoogleServiceAuthError::SERVICE_UNAVAILABLE: { 7287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Transient error. Retry after some time. 7297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request_access_token_backoff_.InformOfRequest(false); 730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) next_token_request_time_ = base::Time::Now() + 731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request_access_token_backoff_.GetTimeUntilRelease(); 7327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request_access_token_retry_timer_.Start( 7337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FROM_HERE, 7347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request_access_token_backoff_.GetTimeUntilRelease(), 7357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&ProfileSyncService::RequestAccessToken, 7367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) weak_factory_.GetWeakPtr())); 737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NotifyObservers(); 7387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 7397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case GoogleServiceAuthError::SERVICE_ERROR: 7417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: { 742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!sync_prefs_.SyncHasAuthError()) { 743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_prefs_.SetSyncAuthError(true); 744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Sync.SyncAuthError", 745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AUTH_ERROR_ENCOUNTERED, 746f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AUTH_ERROR_LIMIT); 747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 7487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Fallthrough. 7497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 7507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) default: { 7517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Show error to user. 7527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UpdateAuthErrorState(error); 7537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 7547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 7557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 7567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 757ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid ProfileSyncService::OnRefreshTokenAvailable( 758ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& account_id) { 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (account_id == signin_->GetAccountIdToUse()) 76068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnRefreshTokensLoaded(); 761ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 762ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 763ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid ProfileSyncService::OnRefreshTokenRevoked( 7643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& account_id) { 765ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!IsOAuthRefreshTokenAvailable()) { 76668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) access_token_.clear(); 767ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // The additional check around IsOAuthRefreshTokenAvailable() above 768ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // prevents us sounding the alarm if we actually have a valid token but 769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // a refresh attempt failed for any variety of reasons 770ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // (e.g. flaky network). It's possible the token we do have is also 771ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // invalid, but in that case we should already have (or can expect) an 772ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // auth error sent from the sync backend. 7733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UpdateAuthErrorState( 7743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED)); 775ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 776ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 777ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 778ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid ProfileSyncService::OnRefreshTokensLoaded() { 779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This notification gets fired when OAuth2TokenService loads the tokens 780ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // from storage. 781ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Initialize the backend if sync is enabled. If the sync token was 782ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // not loaded, GetCredentials() will generate invalid credentials to 783ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // cause the backend to generate an auth error (crbug.com/121755). 784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend()) { 785ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RequestAccessToken(); 786ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } else { 787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_.TryStart(); 788ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 789ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 790ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::Shutdown() { 792ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UnregisterAuthNotifications(); 793ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 794a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ShutdownImpl(browser_sync::SyncBackendHost::STOP); 795effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (sync_error_controller_) { 796effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Destroy the SyncErrorController when the service shuts down for good. 797effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RemoveObserver(sync_error_controller_.get()); 798effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch sync_error_controller_.reset(); 799effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (sync_thread_) 802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) sync_thread_->Stop(); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ProfileSyncService::ShutdownImpl( 806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) browser_sync::SyncBackendHost::ShutdownOption option) { 807a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!backend_) 808a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 809a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 8105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu non_blocking_data_type_manager_.DisconnectSyncBackend(); 8115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 812a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // First, we spin down the backend to stop change processing as soon as 813a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // possible. 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time shutdown_start_time = base::Time::Now(); 815a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) backend_->StopSyncingForShutdown(); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop all data type controllers, if needed. Note that until Stop 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completes, it is possible in theory to have a ChangeProcessor apply a 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // change from a native model. In that case, it will get applied to the sync 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // database (which doesn't get destroyed until we destroy the backend below) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as an unsynced change. That will be persisted, and committed on restart. 8225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (directory_data_type_manager_) { 8235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (directory_data_type_manager_->state() != DataTypeManager::STOPPED) { 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When aborting as part of shutdown, we should expect an aborted sync 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // configure result, else we'll dcheck when we try to read the sync error. 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expect_sync_configuration_aborted_ = true; 8275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_manager_->Stop(); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_manager_.reset(); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shutdown the migrator before the backend to ensure it doesn't pull a null 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // snapshot. 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) migrator_.reset(); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_js_controller_.AttachJsBackend(WeakHandle<syncer::JsBackend>()); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move aside the backend so nobody else tries to use it while we are 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shutting it down. 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SyncBackendHost> doomed_backend(backend_.release()); 840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (doomed_backend) { 841a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) sync_thread_ = doomed_backend->Shutdown(option); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doomed_backend.reset(); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta shutdown_time = base::Time::Now() - shutdown_start_time; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("Sync.Shutdown.BackendDestroyedTime", shutdown_time); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.InvalidateWeakPtrs(); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (backend_mode_ == SYNC) 850cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) startup_controller_.Reset(GetRegisteredDataTypes()); 851a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear various flags. 853cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backend_mode_ = IDLE; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expect_sync_configuration_aborted_ = false; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_auth_in_progress_ = false; 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_initialized_ = false; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_passphrase_.clear(); 8584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) access_token_.clear(); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encryption_pending_ = false; 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypt_everything_ = false; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_types_ = syncer::SyncEncryptionHandler::SensitiveTypes(); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) passphrase_required_reason_ = syncer::REASON_PASSPHRASE_NOT_REQUIRED; 8637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request_access_token_retry_timer_.Stop(); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Revert to "no auth error". 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_auth_error_.state() != GoogleServiceAuthError::NONE) 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateAuthErrorState(GoogleServiceAuthError::AuthErrorNone()); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NotifyObservers(); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::DisableForUser() { 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear prefs (including SyncSetupHasCompleted) before shutting down so 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PSS clients don't think we're set up while we're shutting down. 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.ClearPreferences(); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearUnrecoverableError(); 876a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ShutdownImpl(browser_sync::SyncBackendHost::DISABLE_AND_CLAIM_THREAD); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::HasSyncSetupCompleted() const { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sync_prefs_.HasSyncSetupCompleted(); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::SetSyncSetupCompleted() { 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetSyncSetupCompleted(); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::UpdateLastSyncedTime() { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_synced_time_ = base::Time::Now(); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetLastSyncedTime(last_synced_time_); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::NotifyObservers() { 893ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FOR_EACH_OBSERVER(ProfileSyncServiceBase::Observer, observers_, 894ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch OnStateChanged()); 895eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 896eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 897eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ProfileSyncService::NotifySyncCycleCompleted() { 898ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FOR_EACH_OBSERVER(ProfileSyncServiceBase::Observer, observers_, 899ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch OnSyncCycleCompleted()); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::ClearStaleErrors() { 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearUnrecoverableError(); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_actionable_error_ = SyncProtocolError(); 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Clear the data type errors as well. 906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) failed_data_types_handler_.Reset(); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::ClearUnrecoverableError() { 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unrecoverable_error_reason_ = ERROR_REASON_UNSET; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unrecoverable_error_message_.clear(); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unrecoverable_error_location_ = tracked_objects::Location(); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::RegisterNewDataType(syncer::ModelType data_type) { 9165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (directory_data_type_controllers_.count(data_type) > 0) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An invariant has been violated. Transition to an error state where we try 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to do as little work as possible, to avoid further corruption or crashes. 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnUnrecoverableError( 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message) { 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unrecoverable errors that arrive via the syncer::UnrecoverableErrorHandler 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interface are assumed to originate within the syncer. 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unrecoverable_error_reason_ = ERROR_REASON_SYNCER; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUnrecoverableErrorImpl(from_here, message, true); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnUnrecoverableErrorImpl( 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message, 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool delete_sync_database) { 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(HasUnrecoverableError()); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unrecoverable_error_message_ = message; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unrecoverable_error_location_ = from_here; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION(kSyncUnrecoverableErrorHistogram, 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unrecoverable_error_reason_, 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ERROR_REASON_LIMIT); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string location; 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from_here.Write(true, true, &location); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Unrecoverable error detected at " << location 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " -- ProfileSyncService unusable: " << message; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shut all data types down. 95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 952a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&ProfileSyncService::ShutdownImpl, 953a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) weak_factory_.GetWeakPtr(), 954a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) delete_sync_database ? 955a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) browser_sync::SyncBackendHost::DISABLE_AND_CLAIM_THREAD : 956a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) browser_sync::SyncBackendHost::STOP_AND_CLAIM_THREAD)); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(zea): Move this logic into the DataTypeController/DataTypeManager. 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::DisableBrokenDatatype( 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelType type, 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string message) { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First deactivate the type so that no further server changes are 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passed onto the change processor. 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeactivateDataType(type); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch syncer::SyncError error(from_here, 969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch syncer::SyncError::DATATYPE_ERROR, 970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message, 971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch type); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 973868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::map<syncer::ModelType, syncer::SyncError> errors; 974868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) errors[type] = error; 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update this before posting a task. So if a configure happens before 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the task that we are going to post, this type would still be disabled. 978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch failed_data_types_handler_.UpdateFailedDataTypes(errors); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ProfileSyncService::ReconfigureDatatypeManager, 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr())); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProfileSyncService::UpdateBackendInitUMA(bool success) { 986cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (backend_mode_ != SYNC) 987cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 988cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_first_time_sync_configure_ = !HasSyncSetupCompleted(); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_first_time_sync_configure_) { 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Sync.BackendInitializeFirstTimeSuccess", success); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Sync.BackendInitializeRestoreSuccess", success); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time on_backend_initialized_time = base::Time::Now(); 998a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta delta = on_backend_initialized_time - 999a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_.start_backend_time(); 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_first_time_sync_configure_) { 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES("Sync.BackendInitializeFirstTime", delta); 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES("Sync.BackendInitializeRestoreTime", delta); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1007cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProfileSyncService::PostBackendInitialization() { 1008cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (backend_mode_ == BACKUP || backend_mode_ == ROLLBACK) { 1009cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ConfigureDataTypeManager(); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1013effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (protocol_event_observers_.might_have_observers()) { 1014e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch backend_->RequestBufferedProtocolEventsAndEnableForwarding(); 1015effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1016effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu non_blocking_data_type_manager_.ConnectSyncBackend( 10185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu backend_->GetSyncCoreProxy()); 10195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1020010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (type_debug_info_observers_.might_have_observers()) { 1021010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) backend_->EnableDirectoryTypeDebugInfoForwarding(); 1022010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1023010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a cached passphrase use it to decrypt/encrypt data now that the 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // backend is initialized. We want to call this before notifying observers in 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case this operation affects the "passphrase required" status. 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConsumeCachedPassphraseIfPossible(); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The very first time the backend initializes is effectively the first time 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we can say we successfully "synced". last_synced_time_ will only be null 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in this case, because the pref wasn't restored on StartUp. 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_synced_time_.is_null()) { 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateLastSyncedTime(); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1036a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (startup_controller_.auto_start_enabled() && !FirstSetupInProgress()) { 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Backend is initialized but we're not in sync setup, so this must be an 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // autostart - mark our sync setup as completed and we'll start syncing 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // below. 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSyncSetupCompleted(); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1043a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Check HasSyncSetupCompleted() before NotifyObservers() to avoid spurious 1044a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // data type configuration because observer may flag setup as complete and 1045a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // trigger data type configuration. 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasSyncSetupCompleted()) { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypeManager(); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(FirstSetupInProgress()); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1051a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1052a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NotifyObservers(); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProfileSyncService::OnBackendInitialized( 1056cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const syncer::WeakHandle<syncer::JsBackend>& js_backend, 1057cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& 1058cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) debug_info_listener, 1059cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool success) { 1060cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateBackendInitUMA(success); 1061cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1062cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!success) { 1063cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Something went unexpectedly wrong. Play it safe: stop syncing at once 1064cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // and surface error UI to alert the user sync has stopped. 1065cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Keep the directory around for now so that on restart we will retry 1066cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // again and potentially succeed in presence of transient file IO failures 1067cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // or permissions issues, etc. 1068cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 1069cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(rlarocque): Consider making this UnrecoverableError less special. 1070cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Unlike every other UnrecoverableError, it does not delete our sync data. 1071cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This exception made sense at the time it was implemented, but our new 1072cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // directory corruption recovery mechanism makes it obsolete. By the time 1073cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // we get here, we will have already tried and failed to delete the 1074cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // directory. It would be no big deal if we tried to delete it again. 1075cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnInternalUnrecoverableError(FROM_HERE, 1076cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "BackendInitialize failure", 1077cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false, 1078cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERROR_REASON_BACKEND_INIT_FAILURE); 1079cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1080cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1081cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1082cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backend_initialized_ = true; 1083cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1084cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sync_js_controller_.AttachJsBackend(js_backend); 1085cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) debug_info_listener_ = debug_info_listener; 1086cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1087cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PostBackendInitialization(); 1088cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1089cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnSyncCycleCompleted() { 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateLastSyncedTime(); 1092a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (IsSessionsDataTypeControllerRunning()) { 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger garbage collection of old sessions now that we've downloaded 1094a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // any new session data. 10950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 10960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &browser_sync::SessionsSyncManager::DoGarbageCollection, 10970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::AsWeakPtr(sessions_sync_manager_.get()))); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "Notifying observers sync cycle completed"; 1100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NotifySyncCycleCompleted(); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnExperimentsChanged( 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::Experiments& experiments) { 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_experiments_.Matches(experiments)) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_experiments_ = experiments; 11095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Handle preference-backed experiments first. 1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (experiments.gcm_channel_state == syncer::Experiments::SUPPRESSED) { 1112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile()->GetPrefs()->SetBoolean(prefs::kGCMChannelEnabled, false); 1113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gcm::GCMProfileServiceFactory::GetForProfile(profile())->driver() 1114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ->Disable(); 1115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 1116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) profile()->GetPrefs()->ClearPref(prefs::kGCMChannelEnabled); 1117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gcm::GCMProfileServiceFactory::GetForProfile(profile())->driver() 1118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ->Enable(); 1119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile()->GetPrefs()->SetBoolean(prefs::kInvalidationServiceUseGCMChannel, 1122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch experiments.gcm_invalidations_enabled); 1123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (experiments.enhanced_bookmarks_enabled) { 112523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) profile_->GetPrefs()->SetString( 112623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) sync_driver::prefs::kEnhancedBookmarksExtensionId, 112723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) experiments.enhanced_bookmarks_ext_id); 1128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 1129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile_->GetPrefs()->ClearPref( 1130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sync_driver::prefs::kEnhancedBookmarksExtensionId); 11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateBookmarksExperimentState( 1133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile_->GetPrefs(), g_browser_process->local_state(), true, 113446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) experiments.enhanced_bookmarks_enabled ? BOOKMARKS_EXPERIMENT_ENABLED : 113546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BOOKMARKS_EXPERIMENT_NONE); 11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a first time sync for a client, this will be called before 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnBackendInitialized() to ensure the new datatypes are available at sync 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setup. As a result, the migrator won't exist yet. This is fine because for 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // first time sync cases we're only concerned with making the datatype 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // available. 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (migrator_.get() && 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) migrator_->state() != browser_sync::BackendMigrator::IDLE) { 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Dropping OnExperimentsChanged due to migrator busy."; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::ModelTypeSet registered_types = GetRegisteredDataTypes(); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet to_add; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::ModelTypeSet to_register = 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(to_add, registered_types); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "OnExperimentsChanged called with types: " 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << syncer::ModelTypeSetToString(to_add); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "Enabling types: " << syncer::ModelTypeSetToString(to_register); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (syncer::ModelTypeSet::Iterator it = to_register.First(); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it.Good(); it.Inc()) { 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Received notice to enable experimental type. Check if the type is 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // registered, and if not register a new datatype controller. 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterNewDataType(it.Get()); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the user has "Keep Everything Synced" enabled. If so, we want 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to turn on all experimental types if they're not already on. Otherwise we 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // leave them off. 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: if any types are already registered, we don't turn them on. This 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // covers the case where we're already in the process of reconfiguring 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to turn an experimental type on. 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sync_prefs_.HasKeepEverythingSynced()) { 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mark all data types as preferred. 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetPreferredDataTypes(registered_types, registered_types); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only automatically turn on types if we have already finished set up. 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, just leave the experimental types on by default. 1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!to_register.Empty() && HasSyncSetupCompleted() && migrator_) { 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Dynamically enabling new datatypes: " 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << syncer::ModelTypeSetToString(to_register); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMigrationNeededForTypes(to_register); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::UpdateAuthErrorState(const AuthError& error) { 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_auth_in_progress_ = false; 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_auth_error_ = error; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AuthError ConnectionStatusToAuthError( 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ConnectionStatus status) { 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case syncer::CONNECTION_OK: 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AuthError::AuthErrorNone(); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case syncer::CONNECTION_AUTH_ERROR: 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AuthError(AuthError::INVALID_GAIA_CREDENTIALS); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case syncer::CONNECTION_SERVER_ERROR: 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AuthError(AuthError::CONNECTION_FAILED); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AuthError(AuthError::CONNECTION_FAILED); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnConnectionStatusChange( 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ConnectionStatus status) { 1214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) connection_status_update_time_ = base::Time::Now(); 1215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) connection_status_ = status; 12161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status == syncer::CONNECTION_AUTH_ERROR) { 1217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Sync server returned error indicating that access token is invalid. It 1218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // could be either expired or access is revoked. Let's request another 1219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // access token and if access is revoked then request for token will fail 1220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // with corresponding error. If access token is repeatedly reported 1221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // invalid, there may be some issues with server, e.g. authentication 1222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // state is inconsistent on sync and token server. In that case, we 1223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // backoff token requests exponentially to avoid hammering token server 1224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // too much and to avoid getting same token due to token server's caching 1225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // policy. |request_access_token_retry_timer_| is used to backoff request 1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // triggered by both auth error and failure talking to GAIA server. 1227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Therefore, we're likely to reach the backoff ceiling more quickly than 1228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // you would expect from looking at the BackoffPolicy if both types of 1229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // errors happen. We shouldn't receive two errors back-to-back without 1230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // attempting a token/sync request in between, thus crank up request delay 1231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // unnecessary. This is because we won't make a sync request if we hit an 1232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // error until GAIA succeeds at sending a new token, and we won't request 1233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // a new token unless sync reports a token failure. But to be safe, don't 1234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // schedule request if this happens. 1235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (request_access_token_retry_timer_.IsRunning()) { 1236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 1237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else if (request_access_token_backoff_.failure_count() == 0) { 1238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // First time request without delay. Currently invalid token is used 1239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // to initialize sync backend and we'll always end up here. We don't 1240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // want to delay initialization. 1241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request_access_token_backoff_.InformOfRequest(false); 1242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RequestAccessToken(); 1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 1244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request_access_token_backoff_.InformOfRequest(false); 1245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request_access_token_retry_timer_.Start( 1246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FROM_HERE, 1247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request_access_token_backoff_.GetTimeUntilRelease(), 1248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&ProfileSyncService::RequestAccessToken, 1249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_factory_.GetWeakPtr())); 1250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 12517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else { 1252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Reset backoff time after successful connection. 1253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (status == syncer::CONNECTION_OK) { 1254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Request shouldn't be scheduled at this time. But if it is, it's 1255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // possible that sync flips between OK and auth error states rapidly, 1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // thus hammers token server. To be safe, only reset backoff delay when 1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // no scheduled request. 1258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (request_access_token_retry_timer_.IsRunning()) { 1259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 1260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 1261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request_access_token_backoff_.Reset(); 1262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const GoogleServiceAuthError auth_error = 12667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ConnectionStatusToAuthError(status); 12677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DVLOG(1) << "Connection status change: " << auth_error.ToString(); 12687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UpdateAuthErrorState(auth_error); 12697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ProfileSyncService::StopSyncingPermanently() { 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetStartSuppressed(true); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableForUser(); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnPassphraseRequired( 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::PassphraseRequiredReason reason, 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::EncryptedData& pending_keys) { 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(backend_.get()); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(backend_->IsNigoriEnabled()); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(lipalani) : add this check to other locations as well. 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasUnrecoverableError()) { 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When unrecoverable error is detected we post a task to shutdown the 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // backend. The task might not have executed yet. 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Passphrase required with reason: " 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << syncer::PassphraseRequiredReasonToString(reason); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) passphrase_required_reason_ = reason; 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const syncer::ModelTypeSet types = GetPreferredDirectoryDataTypes(); 12955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (directory_data_type_manager_) { 1296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Reconfigure without the encrypted types (excluded implicitly via the 1297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // failed datatypes handler). 12985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_manager_->Configure(types, 12995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::CONFIGURE_REASON_CRYPTO); 1300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(rlarocque): Support non-blocking types. http://crbug.com/351005. 1303c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers that the passphrase status may have changed. 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnPassphraseAccepted() { 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Received OnPassphraseAccepted."; 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the pending keys were resolved via keystore, it's possible we never 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // consumed our cached passphrase. Clear it now. 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!cached_passphrase_.empty()) 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cached_passphrase_.clear(); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset passphrase_required_reason_ since we know we no longer require the 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passphrase. We do this here rather than down in ResolvePassphraseRequired() 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because that can be called by OnPassphraseRequired() if no encrypted data 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // types are enabled, and we don't want to clobber the true passphrase error. 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) passphrase_required_reason_ = syncer::REASON_PASSPHRASE_NOT_REQUIRED; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the data types that depend on the passphrase are started at 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this time. 1324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const syncer::ModelTypeSet types = GetPreferredDirectoryDataTypes(); 13255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (directory_data_type_manager_) { 1326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Re-enable any encrypted types if necessary. 13275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_manager_->Configure(types, 13285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::CONFIGURE_REASON_CRYPTO); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(rlarocque): Support non-blocking types. http://crbug.com/351005. 1332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnEncryptedTypesChanged( 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet encrypted_types, 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool encrypt_everything) { 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_types_ = encrypted_types; 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypt_everything_ = encrypt_everything; 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Encrypted types changed to " 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << syncer::ModelTypeSetToString(encrypted_types_) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " (encrypt everything is set to " 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << (encrypt_everything_ ? "true" : "false") << ")"; 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(encrypted_types_.Has(syncer::PASSWORDS)); 1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If sessions are encrypted, full history sync is not possible, and 1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // delete directives are unnecessary. 1349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (GetActiveDataTypes().Has(syncer::HISTORY_DELETE_DIRECTIVES) && 1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) encrypted_types_.Has(syncer::SESSIONS)) { 1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DisableBrokenDatatype(syncer::HISTORY_DELETE_DIRECTIVES, 1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, 1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Delete directives not supported with encryption."); 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnEncryptionComplete() { 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Encryption complete"; 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (encryption_pending_ && encrypt_everything_) { 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encryption_pending_ = false; 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is to nudge the integration tests when encryption is 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finished. 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnMigrationNeededForTypes( 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet types) { 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(backend_initialized_); 13705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(directory_data_type_manager_.get()); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Migrator must be valid, because we don't sync until it is created and this 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback originates from a sync cycle. 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) migrator_->MigrateTypes(types); 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnActionableError(const SyncProtocolError& error) { 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_actionable_error_ = error; 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(last_actionable_error_.action, 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::UNKNOWN_ACTION); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (error.action) { 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case syncer::UPGRADE_CLIENT: 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case syncer::CLEAR_USER_DATA_AND_RESYNC: 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case syncer::ENABLE_SYNC_ON_ACCOUNT: 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case syncer::STOP_AND_RESTART_SYNC: 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(lipalani) : if setup in progress we want to display these 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // actions in the popup. The current experience might not be optimal for 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the user. We just dismiss the dialog. 1389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (startup_controller_.setup_in_progress()) { 13905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StopSyncingPermanently(); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expect_sync_configuration_aborted_ = true; 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger an unrecoverable error to stop syncing. 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInternalUnrecoverableError(FROM_HERE, 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_actionable_error_.error_description, 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ERROR_REASON_ACTIONABLE_ERROR); 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case syncer::DISABLE_SYNC_AND_ROLLBACK: 1400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backup_rollback_controller_.OnRollbackReceived(); 1401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Fall through to shutdown backend and sign user out. 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case syncer::DISABLE_SYNC_ON_CLIENT: 14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StopSyncingPermanently(); 1404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_CHROMEOS) 1405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // On desktop Chrome, sign out the user after a dashboard clear. 1406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Skip sign out on ChromeOS/Android. 1407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!startup_controller_.auto_start_enabled()) 1408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SigninManagerFactory::GetForProfile(profile_)->SignOut(); 1409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case syncer::ROLLBACK_DONE: 1412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backup_rollback_controller_.OnRollbackDone(); 1413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 1414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT: 1415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Sync disabled by domain admin. we should stop syncing until next 1416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // restart. 1417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) sync_disabled_by_admin_ = true; 1418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ShutdownImpl(browser_sync::SyncBackendHost::DISABLE_AND_CLAIM_THREAD); 1419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 1424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backup_rollback_controller_.Start(base::TimeDelta()); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnConfigureDone( 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const browser_sync::DataTypeManager::ConfigureResult& result) { 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have cleared our cached passphrase before we get here (in 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnBackendInitialized()). 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(cached_passphrase_.empty()); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) configure_status_ = result.status; 1435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (backend_mode_ != SYNC) { 1437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (configure_status_ == DataTypeManager::OK || 1438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) configure_status_ == DataTypeManager::PARTIAL_SUCCESS) { 1439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) StartSyncingWithServer(); 1440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 1441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DVLOG(1) << "Backup/rollback backend failed to configure."; 1442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShutdownImpl(browser_sync::SyncBackendHost::STOP_AND_CLAIM_THREAD); 1443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sync_configure_start_time_.is_null()) { 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result.status == DataTypeManager::OK || 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.status == DataTypeManager::PARTIAL_SUCCESS) { 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time sync_configure_stop_time = base::Time::Now(); 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delta = sync_configure_stop_time - 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_configure_start_time_; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_first_time_sync_configure_) { 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES("Sync.ServiceInitialConfigureTime", delta); 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES("Sync.ServiceSubsequentConfigureTime", 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta); 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_configure_start_time_ = base::Time(); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify listeners that configuration is done. 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_SYNC_CONFIGURE_DONE, 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<ProfileSyncService>(this), 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "PSS OnConfigureDone called with status: " << configure_status_; 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The possible status values: 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ABORT - Configuration was aborted. This is not an error, if 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiated by user. 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OK - Everything succeeded. 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PARTIAL_SUCCESS - Some datatypes failed to start. 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Everything else is an UnrecoverableError. So treat it as such. 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First handle the abort case. 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (configure_status_ == DataTypeManager::ABORTED && 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expect_sync_configuration_aborted_) { 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(0) << "ProfileSyncService::Observe Sync Configure aborted"; 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expect_sync_configuration_aborted_ = false; 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle unrecoverable error. 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (configure_status_ != DataTypeManager::OK && 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) configure_status_ != DataTypeManager::PARTIAL_SUCCESS) { 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Something catastrophic had happened. We should only have one 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error representing it. 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(result.failed_data_types.size(), 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<unsigned int>(1)); 1493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) syncer::SyncError error = result.failed_data_types.begin()->second; 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(error.IsSet()); 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string message = 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Sync configuration failed with status " + 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DataTypeManager::ConfigureStatusToString(configure_status_) + 1498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " during " + syncer::ModelTypeToString(error.model_type()) + 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ": " + error.message(); 1500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LOG(ERROR) << "ProfileSyncService error: " << message; 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInternalUnrecoverableError(error.location(), 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ERROR_REASON_CONFIGURATION_FAILURE); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should never get in a state where we have no encrypted datatypes 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enabled, and yet we still think we require a passphrase for decryption. 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!(IsPassphraseRequiredForDecryption() && 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !IsEncryptedDatatypeEnabled())); 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This must be done before we start syncing with the server to avoid 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sending unencrypted data up on a first time sync. 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (encryption_pending_) 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->EnableEncryptEverything(); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (migrator_.get() && 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) migrator_->state() != browser_sync::BackendMigrator::IDLE) { 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Migration in progress. Let the migrator know we just finished 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // configuring something. It will be up to the migrator to call 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // StartSyncingWithServer() if migration is now finished. 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) migrator_->OnConfigureDone(result); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncingWithServer(); 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnConfigureRetry() { 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have cleared our cached passphrase before we get here (in 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnBackendInitialized()). 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(cached_passphrase_.empty()); 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSyncConfigureRetry(); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnConfigureStart() { 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_configure_start_time_ = base::Time::Now(); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ProfileSyncService::SyncStatusSummary 1544d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ProfileSyncService::QuerySyncStatusSummary() { 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasUnrecoverableError()) { 1546d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return UNRECOVERABLE_ERROR; 1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (!backend_) { 1548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return NOT_ENABLED; 1549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (backend_mode_ == BACKUP) { 1550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return BACKUP_USER_DATA; 1551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (backend_mode_ == ROLLBACK) { 1552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ROLLBACK_USER_DATA; 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (backend_.get() && !HasSyncSetupCompleted()) { 1554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return SETUP_INCOMPLETE; 15555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if ( 15565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu backend_.get() && HasSyncSetupCompleted() && 15575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_manager_.get() && 15585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_manager_->state() != DataTypeManager::CONFIGURED) { 1559d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return DATATYPES_NOT_INITIALIZED; 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ShouldPushChanges()) { 1561d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return INITIALIZED; 1562d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1563d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return UNKNOWN_ERROR; 1564d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 1565d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1566d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)std::string ProfileSyncService::QuerySyncStatusSummaryString() { 1567d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SyncStatusSummary status = QuerySyncStatusSummary(); 1568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string config_status_str = 1570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) configure_status_ != DataTypeManager::UNKNOWN ? 1571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DataTypeManager::ConfigureStatusToString(configure_status_) : ""; 1572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1573d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) switch (status) { 1574d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case UNRECOVERABLE_ERROR: 1575d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return "Unrecoverable error detected"; 1576d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case NOT_ENABLED: 1577d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return "Syncing not enabled"; 1578d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case SETUP_INCOMPLETE: 1579d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return "First time sync setup incomplete"; 1580d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case DATATYPES_NOT_INITIALIZED: 1581d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return "Datatypes not fully initialized"; 1582d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case INITIALIZED: 1583d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return "Sync service initialized"; 1584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case BACKUP_USER_DATA: 1585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "Backing-up user data. Status: " + config_status_str; 1586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ROLLBACK_USER_DATA: 1587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "Restoring user data. Status: " + config_status_str; 1588d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) default: 1589d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return "Status unknown: Internal error?"; 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string ProfileSyncService::GetBackendInitializationStateString() const { 1594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return startup_controller_.GetBackendInitializationStateString(); 1595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ProfileSyncService::auto_start_enabled() const { 1598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return startup_controller_.auto_start_enabled(); 1599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ProfileSyncService::setup_in_progress() const { 1602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return startup_controller_.setup_in_progress(); 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::QueryDetailedSyncStatus( 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncBackendHost::Status* result) { 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (backend_.get() && backend_initialized_) { 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = backend_->GetDetailedStatus(); 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncBackendHost::Status status; 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status.sync_protocol_error = last_actionable_error_; 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = status; 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const AuthError& ProfileSyncService::GetAuthError() const { 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_auth_error_; 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::FirstSetupInProgress() const { 1623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return !HasSyncSetupCompleted() && startup_controller_.setup_in_progress(); 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::SetSetupInProgress(bool setup_in_progress) { 1627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This method is a no-op if |setup_in_progress_| remains unchanged. 1628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (startup_controller_.setup_in_progress() == setup_in_progress) 1629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_.set_setup_in_progress(setup_in_progress); 1632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!setup_in_progress && sync_initialized()) 1633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReconfigureDatatypeManager(); 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyObservers(); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::sync_initialized() const { 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backend_initialized_; 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::waiting_for_auth() const { 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_auth_in_progress_; 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const syncer::Experiments& ProfileSyncService::current_experiments() const { 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return current_experiments_; 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::HasUnrecoverableError() const { 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unrecoverable_error_reason_ != ERROR_REASON_UNSET; 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::IsPassphraseRequired() const { 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return passphrase_required_reason_ != 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::REASON_PASSPHRASE_NOT_REQUIRED; 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::IsPassphraseRequiredForDecryption() const { 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is an encrypted datatype enabled and we don't have the proper 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passphrase, we must prompt the user for a passphrase. The only way for the 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user to avoid entering their passphrase is to disable the encrypted types. 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsEncryptedDatatypeEnabled() && IsPassphraseRequired(); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ProfileSyncService::GetLastSyncedTimeString() const { 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_synced_time_.is_null()) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_SYNC_TIME_NEVER); 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta last_synced = base::Time::Now() - last_synced_time_; 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_synced < base::TimeDelta::FromMinutes(1)) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_SYNC_TIME_JUST_NOW); 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_ELAPSED, 1675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::TimeFormat::LENGTH_SHORT, last_synced); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::UpdateSelectedTypesHistogram( 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool sync_everything, const syncer::ModelTypeSet chosen_types) const { 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!HasSyncSetupCompleted() || 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_everything != sync_prefs_.HasKeepEverythingSynced()) { 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Sync.SyncEverything", sync_everything); 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only log the data types that are shown in the sync settings ui. 16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note: the order of these types must match the ordering of 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the respective types in ModelType 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const browser_sync::user_selectable_type::UserSelectableSyncType 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_selectable_types[] = { 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_sync::user_selectable_type::BOOKMARKS, 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_sync::user_selectable_type::PREFERENCES, 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_sync::user_selectable_type::PASSWORDS, 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_sync::user_selectable_type::AUTOFILL, 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_sync::user_selectable_type::THEMES, 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_sync::user_selectable_type::TYPED_URLS, 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_sync::user_selectable_type::EXTENSIONS, 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_sync::user_selectable_type::APPS, 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_sync::user_selectable_type::PROXY_TABS 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) COMPILE_ASSERT(32 == syncer::MODEL_TYPE_COUNT, UpdateCustomConfigHistogram); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sync_everything) { 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::ModelTypeSet current_types = GetPreferredDataTypes(); 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::ModelTypeSet type_set = syncer::UserSelectableTypes(); 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::ModelTypeSet::Iterator it = type_set.First(); 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(arraysize(user_selectable_types), type_set.Size()); 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(user_selectable_types) && it.Good(); 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++i, it.Inc()) { 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const syncer::ModelType type = it.Get(); 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chosen_types.Has(type) && 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!HasSyncSetupCompleted() || !current_types.Has(type))) { 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Selected type has changed - log it. 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Sync.CustomSync", 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_selectable_types[i], 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_sync::user_selectable_type::SELECTABLE_DATATYPE_COUNT + 1); 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::RefreshSpareBootstrapToken( 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& passphrase) { 17295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_sync::SystemEncryptor encryptor; 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::Cryptographer temp_cryptographer(&encryptor); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first 2 params (hostname and username) doesn't have any effect here. 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::KeyParams key_params = {"localhost", "dummy", passphrase}; 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string bootstrap_token; 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!temp_cryptographer.AddKey(key_params)) { 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Failed to add key to cryptographer."; 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_cryptographer.GetBootstrapToken(&bootstrap_token); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetSpareBootstrapToken(bootstrap_token); 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileSyncService::OnUserChoseDatatypes( 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool sync_everything, 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet chosen_types) { 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!backend_.get() && !HasUnrecoverableError()) { 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateSelectedTypesHistogram(sync_everything, chosen_types); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetKeepEverythingSynced(sync_everything); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) failed_data_types_handler_.Reset(); 1755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (GetActiveDataTypes().Has(syncer::HISTORY_DELETE_DIRECTIVES) && 1756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) encrypted_types_.Has(syncer::SESSIONS)) { 1757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DisableBrokenDatatype(syncer::HISTORY_DELETE_DIRECTIVES, 1758868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FROM_HERE, 1759868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Delete directives not supported with encryption."); 1760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChangePreferredDataTypes(chosen_types); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AcknowledgeSyncedTypes(); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::ChangePreferredDataTypes( 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet preferred_types) { 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "ChangePreferredDataTypes invoked"; 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::ModelTypeSet registered_types = GetRegisteredDataTypes(); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::ModelTypeSet registered_preferred_types = 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Intersection(registered_types, preferred_types); 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetPreferredDataTypes(registered_types, 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_preferred_types); 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now reconfigure the DTM. 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReconfigureDatatypeManager(); 17785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 17795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(rlarocque): Reconfigure the NonBlockingDataTypeManager, too. Blocked 17805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // on crbug.com/368834. Until that bug is fixed, it's difficult to tell 17815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // which types should be enabled and when. 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)syncer::ModelTypeSet ProfileSyncService::GetActiveDataTypes() const { 1785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const syncer::ModelTypeSet preferred_types = GetPreferredDataTypes(); 1786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const syncer::ModelTypeSet failed_types = 1787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) failed_data_types_handler_.GetFailedTypes(); 1788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return Difference(preferred_types, failed_types); 1789868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelTypeSet ProfileSyncService::GetPreferredDataTypes() const { 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::ModelTypeSet registered_types = GetRegisteredDataTypes(); 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::ModelTypeSet preferred_types = 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.GetPreferredDataTypes(registered_types); 1795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return preferred_types; 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1798c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochsyncer::ModelTypeSet 1799c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochProfileSyncService::GetPreferredDirectoryDataTypes() const { 1800c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const syncer::ModelTypeSet registered_directory_types = 1801c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetRegisteredDirectoryDataTypes(); 1802c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const syncer::ModelTypeSet preferred_types = 1803c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_prefs_.GetPreferredDataTypes(registered_directory_types); 1804c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return preferred_types; 1805c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1806c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1807c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochsyncer::ModelTypeSet 1808c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochProfileSyncService::GetPreferredNonBlockingDataTypes() const { 1809c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return sync_prefs_.GetPreferredDataTypes(GetRegisteredNonBlockingDataTypes()); 1810c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1811c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelTypeSet ProfileSyncService::GetRegisteredDataTypes() const { 1813c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return Union(GetRegisteredDirectoryDataTypes(), 1814c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetRegisteredNonBlockingDataTypes()); 1815c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1816c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1817c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochsyncer::ModelTypeSet 1818c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochProfileSyncService::GetRegisteredDirectoryDataTypes() const { 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet registered_types; 18205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The directory_data_type_controllers_ are determined by command-line flags; 18215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // that's effectively what controls the values returned here. 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DataTypeController::TypeMap::const_iterator it = 18235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_controllers_.begin(); 18245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu it != directory_data_type_controllers_.end(); ++it) { 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_types.Put(it->first); 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return registered_types; 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1830c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochsyncer::ModelTypeSet 1831c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochProfileSyncService::GetRegisteredNonBlockingDataTypes() const { 18325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return non_blocking_data_type_manager_.GetRegisteredTypes(); 1833c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1834c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::IsUsingSecondaryPassphrase() const { 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::PassphraseType passphrase_type = GetPassphraseType(); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return passphrase_type == syncer::FROZEN_IMPLICIT_PASSPHRASE || 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) passphrase_type == syncer::CUSTOM_PASSPHRASE; 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::PassphraseType ProfileSyncService::GetPassphraseType() const { 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backend_->GetPassphraseType(); 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Time ProfileSyncService::GetExplicitPassphraseTime() const { 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backend_->GetExplicitPassphraseTime(); 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::IsCryptographerReady( 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::BaseTransaction* trans) const { 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backend_.get() && backend_->IsCryptographerReady(trans); 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSyncService::ConfigurePriorityDataTypes() { 1855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const syncer::ModelTypeSet priority_types = 1856c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Intersection(GetPreferredDirectoryDataTypes(), 1857c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::PriorityUserTypes()); 1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!priority_types.Empty()) { 1859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const syncer::ConfigureReason reason = HasSyncSetupCompleted() ? 1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) syncer::CONFIGURE_REASON_RECONFIGURATION : 1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) syncer::CONFIGURE_REASON_NEW_CLIENT; 18625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_manager_->Configure(priority_types, reason); 1863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::ConfigureDataTypeManager() { 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't configure datatypes if the setup UI is still on the screen - this 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is to help multi-screen setting UIs (like iOS) where they don't want to 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // start syncing data until the user is done configuring encryption options, 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // etc. ReconfigureDatatypeManager() will get called again once the UI calls 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetSetupInProgress(false). 1872a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (startup_controller_.setup_in_progress()) 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restart = false; 18765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!directory_data_type_manager_) { 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) restart = true; 18785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_manager_.reset( 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory_->CreateDataTypeManager(debug_info_listener_, 18805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &directory_data_type_controllers_, 18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 1882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backend_.get(), 1883868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) this, 1884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &failed_data_types_handler_)); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We create the migrator at the same time. 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) migrator_.reset( 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new browser_sync::BackendMigrator( 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetDebugName(), GetUserShare(), 18905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this, directory_data_type_manager_.get(), 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ProfileSyncService::StartSyncingWithServer, 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)))); 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) syncer::ModelTypeSet types; 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ConfigureReason reason = syncer::CONFIGURE_REASON_UNKNOWN; 1897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (backend_mode_ == BACKUP || backend_mode_ == ROLLBACK) { 1898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) types = syncer::BackupTypes(); 1899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reason = syncer::CONFIGURE_REASON_BACKUP_ROLLBACK; 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) types = GetPreferredDirectoryDataTypes(); 1902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!HasSyncSetupCompleted()) { 1903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reason = syncer::CONFIGURE_REASON_NEW_CLIENT; 1904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (restart) { 1905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Datatype downloads on restart are generally due to newly supported 1906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // datatypes (although it's also possible we're picking up where a failed 1907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // previous configuration left off). 1908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(sync): consider detecting configuration recovery and setting 1909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the reason here appropriately. 1910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reason = syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE; 1911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 1912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The user initiated a reconfiguration (either to add or remove types). 1913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reason = syncer::CONFIGURE_REASON_RECONFIGURATION; 1914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_data_type_manager_->Configure(types, reason); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::UserShare* ProfileSyncService::GetUserShare() const { 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (backend_.get() && backend_initialized_) { 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backend_->GetUserShare(); 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::sessions::SyncSessionSnapshot 1929cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ProfileSyncService::GetLastSessionSnapshot() const { 1930cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend() && backend_initialized_) { 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backend_->GetLastSessionSnapshot(); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return syncer::sessions::SyncSessionSnapshot(); 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::HasUnsyncedItems() const { 1937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend() && backend_initialized_) { 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backend_->HasUnsyncedItems(); 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)browser_sync::BackendMigrator* 1945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ProfileSyncService::GetBackendMigratorForTest() { 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return migrator_.get(); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::GetModelSafeRoutingInfo( 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelSafeRoutingInfo* out) const { 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (backend_.get() && backend_initialized_) { 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->GetModelSafeRoutingInfo(out); 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::Value* ProfileSyncService::GetTypeStatusMap() const { 19595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::ListValue> result(new base::ListValue()); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!backend_.get() || !backend_initialized_) { 19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result.release(); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FailedDataTypesHandler::TypeErrorMap error_map = 1966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) failed_data_types_handler_.GetAllErrors(); 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeSet active_types; 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeSet passive_types; 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelSafeRoutingInfo routing_info; 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->GetModelSafeRoutingInfo(&routing_info); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ModelSafeRoutingInfo::const_iterator it = routing_info.begin(); 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != routing_info.end(); ++it) { 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->second == syncer::GROUP_PASSIVE) { 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) passive_types.Put(it->first); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_types.Put(it->first); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncBackendHost::Status detailed_status = backend_->GetDetailedStatus(); 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeSet &throttled_types(detailed_status.throttled_types); 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeSet registered = GetRegisteredDataTypes(); 19845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> type_status_header( 19855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::DictionaryValue()); 19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_status_header->SetString("name", "Model Type"); 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_status_header->SetString("status", "header"); 19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_status_header->SetString("value", "Group Type"); 19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_status_header->SetString("num_entries", "Total Entries"); 19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_status_header->SetString("num_live", "Live Entries"); 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result->Append(type_status_header.release()); 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> type_status; 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ModelTypeSet::Iterator it = registered.First(); it.Good(); it.Inc()) { 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType type = it.Get(); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) type_status.reset(new base::DictionaryValue()); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("name", ModelTypeToString(type)); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error_map.find(type) != error_map.end()) { 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::SyncError &error = error_map.find(type)->second; 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(error.IsSet()); 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error_text = "Error: " + error.location().ToString() + 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ", " + error.message(); 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("status", "error"); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("value", error_text); 200846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else if (syncer::IsProxyType(type) && passive_types.Has(type)) { 200946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Show a proxy type in "ok" state unless it is disabled by user. 201046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(!throttled_types.Has(type)); 201146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) type_status->SetString("status", "ok"); 201246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) type_status->SetString("value", "Passive"); 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (throttled_types.Has(type) && passive_types.Has(type)) { 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("status", "warning"); 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("value", "Passive, Throttled"); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (passive_types.Has(type)) { 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("status", "warning"); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("value", "Passive"); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (throttled_types.Has(type)) { 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("status", "warning"); 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("value", "Throttled"); 2022c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else if (GetRegisteredNonBlockingDataTypes().Has(type)) { 2023c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch type_status->SetString("status", "ok"); 2024c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch type_status->SetString("value", "Non-Blocking"); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (active_types.Has(type)) { 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("status", "ok"); 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("value", "Active: " + 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelSafeGroupToString(routing_info[type])); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("status", "warning"); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_status->SetString("value", "Disabled by User"); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int live_count = detailed_status.num_entries_by_type[type] - 20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_status.num_to_delete_entries_by_type[type]; 20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_status->SetInteger("num_entries", 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_status.num_entries_by_type[type]); 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_status->SetInteger("num_live", live_count); 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result->Append(type_status.release()); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result.release(); 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::DeactivateDataType(syncer::ModelType type) { 2046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!backend_) 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeactivateDataType(type); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::ConsumeCachedPassphraseIfPossible() { 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If no cached passphrase, or sync backend hasn't started up yet, just exit. 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the backend isn't running yet, OnBackendInitialized() will call this 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // method again after the backend starts up. 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cached_passphrase_.empty() || !sync_initialized()) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Backend is up and running, so we can consume the cached passphrase. 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string passphrase = cached_passphrase_; 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_passphrase_.clear(); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we need a passphrase to decrypt data, try the cached passphrase. 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (passphrase_required_reason() == syncer::REASON_DECRYPTION) { 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (SetDecryptionPassphrase(passphrase)) { 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Cached passphrase successfully decrypted pending keys"; 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we get here, we don't have pending keys (or at least, the passphrase 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // doesn't decrypt them) - just try to re-encrypt using the encryption 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passphrase. 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsUsingSecondaryPassphrase()) 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncryptionPassphrase(passphrase, IMPLICIT); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ProfileSyncService::RequestAccessToken() { 20787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Only one active request at a time. 20797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (access_token_request_ != NULL) 20807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 20817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request_access_token_retry_timer_.Stop(); 20827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OAuth2TokenService::ScopeSet oauth2_scopes; 2083cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) oauth2_scopes.insert(signin_->GetSyncScopeToUse()); 2084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 20857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Invalidate previous token, otherwise token service will return the same 20867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // token again. 20875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id = signin_->GetAccountIdToUse(); 208868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!access_token_.empty()) { 208968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_token_service_->InvalidateToken( 209068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id, oauth2_scopes, access_token_); 209168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 209268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) access_token_.clear(); 2094f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2095f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) token_request_time_ = base::Time::Now(); 2096f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) token_receive_time_ = base::Time(); 2097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) next_token_request_time_ = base::Time(); 209868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) access_token_request_ = 209968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_token_service_->StartRequest(account_id, oauth2_scopes, this); 21007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 21017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::SetEncryptionPassphrase(const std::string& passphrase, 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PassphraseType type) { 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should only be called when the backend has been initialized. 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(sync_initialized()); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!(type == IMPLICIT && IsUsingSecondaryPassphrase())) << 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Data is already encrypted using an explicit passphrase"; 21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!(type == EXPLICIT && 21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) passphrase_required_reason_ == syncer::REASON_DECRYPTION)) << 21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Can not set explicit passphrase when decryption is needed."; 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Setting " << (type == EXPLICIT ? "explicit" : "implicit") 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " passphrase for encryption."; 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (passphrase_required_reason_ == syncer::REASON_ENCRYPTION) { 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // REASON_ENCRYPTION implies that the cryptographer does not have pending 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keys. Hence, as long as we're not trying to do an invalid passphrase 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // change (e.g. explicit -> explicit or explicit -> implicit), we know this 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will succeed. If for some reason a new encryption key arrives via 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sync later, the SBH will trigger another OnPassphraseRequired(). 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) passphrase_required_reason_ = syncer::REASON_PASSPHRASE_NOT_REQUIRED; 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->SetEncryptionPassphrase(passphrase, type == EXPLICIT); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::SetDecryptionPassphrase( 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& passphrase) { 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsPassphraseRequired()) { 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Setting passphrase for decryption."; 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backend_->SetDecryptionPassphrase(passphrase); 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "SetDecryptionPassphrase must not be called when " 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "IsPassphraseRequired() is false."; 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::EnableEncryptEverything() { 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests override sync_initialized() to always return true, so we 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must check that instead of |backend_initialized_|. 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(akalin): Fix the above. :/ 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(sync_initialized()); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(atwilson): Persist the encryption_pending_ flag to address the various 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // problems around cancelling encryption in the background (crbug.com/119649). 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!encrypt_everything_) 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encryption_pending_ = true; 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::encryption_pending() const { 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may be called during the setup process before we're 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialized (via IsEncryptedDatatypeEnabled and 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IsPassphraseRequiredForDecryption). 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return encryption_pending_; 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::EncryptEverythingEnabled() const { 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(backend_initialized_); 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return encrypt_everything_ || encryption_pending_; 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelTypeSet ProfileSyncService::GetEncryptedDataTypes() const { 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(encrypted_types_.Has(syncer::PASSWORDS)); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may be called during the setup process before we're 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialized. In this case, we default to the sensitive types. 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return encrypted_types_; 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnSyncManagedPrefChange(bool is_sync_managed) { 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_sync_managed) { 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableForUser(); 21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sync is no longer disabled by policy. Try starting it up if appropriate. 2174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_.TryStart(); 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfileSyncService::GoogleSigninSucceeded(const std::string& username, 2179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& password) { 2180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!sync_prefs_.IsStartSuppressed() && !password.empty()) { 2181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch cached_passphrase_ = password; 2182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Try to consume the passphrase we just cached. If the sync backend 2183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // is not running yet, the passphrase will remain cached until the 2184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // backend starts up. 2185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ConsumeCachedPassphraseIfPossible(); 2186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 2188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RefreshSpareBootstrapToken(password); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!sync_initialized() || GetAuthError().state() != AuthError::NONE) { 2191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Track the fact that we're still waiting for auth to complete. 2192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch is_auth_in_progress_ = true; 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfileSyncService::GoogleSignedOut(const std::string& username) { 2197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch sync_disabled_by_admin_ = false; 2198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DisableForUser(); 2199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backup_rollback_controller_.Start(base::TimeDelta()); 2201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 2202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid ProfileSyncService::AddObserver( 2204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ProfileSyncServiceBase::Observer* observer) { 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2208ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid ProfileSyncService::RemoveObserver( 2209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ProfileSyncServiceBase::Observer* observer) { 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfileSyncService::AddProtocolEventObserver( 2214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch browser_sync::ProtocolEventObserver* observer) { 2215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch protocol_event_observers_.AddObserver(observer); 2216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend()) { 2217e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch backend_->RequestBufferedProtocolEventsAndEnableForwarding(); 2218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 2219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 2220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfileSyncService::RemoveProtocolEventObserver( 2222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch browser_sync::ProtocolEventObserver* observer) { 2223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch protocol_event_observers_.RemoveObserver(observer); 2224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend() && 2225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !protocol_event_observers_.might_have_observers()) { 2226e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch backend_->DisableProtocolEventForwarding(); 2227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 2228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 2229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ProfileSyncService::AddTypeDebugInfoObserver( 2231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) syncer::TypeDebugInfoObserver* type_debug_info_observer) { 2232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type_debug_info_observers_.AddObserver(type_debug_info_observer); 2233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (type_debug_info_observers_.might_have_observers() && backend_) { 2234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) backend_->EnableDirectoryTypeDebugInfoForwarding(); 2235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 2236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ProfileSyncService::RemoveTypeDebugInfoObserver( 2239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) syncer::TypeDebugInfoObserver* type_debug_info_observer) { 2240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type_debug_info_observers_.RemoveObserver(type_debug_info_observer); 2241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!type_debug_info_observers_.might_have_observers() && backend_) { 2242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) backend_->DisableDirectoryTypeDebugInfoForwarding(); 2243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 2244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace { 2247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass GetAllNodesRequestHelper 2249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : public base::RefCountedThreadSafe<GetAllNodesRequestHelper> { 2250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 2251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetAllNodesRequestHelper( 2252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::ModelTypeSet requested_types, 2253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::Callback<void(scoped_ptr<base::ListValue>)>& callback); 2254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void OnReceivedNodesForTypes( 2256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::vector<syncer::ModelType>& types, 2257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ScopedVector<base::ListValue> scoped_node_lists); 2258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 2260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch friend class base::RefCountedThreadSafe<GetAllNodesRequestHelper>; 2261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~GetAllNodesRequestHelper(); 2262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<base::ListValue> result_accumulator_; 2264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2265c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::ModelTypeSet awaiting_types_; 2266c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Callback<void(scoped_ptr<base::ListValue>)> callback_; 2267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 2268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochGetAllNodesRequestHelper::GetAllNodesRequestHelper( 2270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::ModelTypeSet requested_types, 2271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::Callback<void(scoped_ptr<base::ListValue>)>& callback) 2272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : result_accumulator_(new base::ListValue()), 2273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch awaiting_types_(requested_types), 2274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch callback_(callback) {} 2275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochGetAllNodesRequestHelper::~GetAllNodesRequestHelper() { 2277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!awaiting_types_.Empty()) { 2278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DLOG(WARNING) 2279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch << "GetAllNodesRequest deleted before request was fulfilled. " 2280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch << "Missing types are: " << ModelTypeSetToString(awaiting_types_); 2281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Called when the set of nodes for a type or set of types has been returned. 2285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// 2286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// The nodes for several types can be returned at the same time by specifying 2287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// their types in the |types| array, and putting their results at the 2288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// correspnding indices in the |scoped_node_lists|. 2289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid GetAllNodesRequestHelper::OnReceivedNodesForTypes( 2290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::vector<syncer::ModelType>& types, 2291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ScopedVector<base::ListValue> scoped_node_lists) { 2292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK_EQ(types.size(), scoped_node_lists.size()); 2293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Take unsafe ownership of the node list. 2295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<base::ListValue*> node_lists; 2296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_node_lists.release(&node_lists); 2297c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (size_t i = 0; i < node_lists.size() && i < types.size(); ++i) { 2299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const ModelType type = types[i]; 2300c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::ListValue* node_list = node_lists[i]; 2301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Add these results to our list. 2303c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<base::DictionaryValue> type_dict(new base::DictionaryValue()); 2304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch type_dict->SetString("type", ModelTypeToString(type)); 2305c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch type_dict->Set("nodes", node_list); 2306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result_accumulator_->Append(type_dict.release()); 2307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Remember that this part of the request is satisfied. 2309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch awaiting_types_.Remove(type); 2310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (awaiting_types_.Empty()) { 2313c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch callback_.Run(result_accumulator_.Pass()); 2314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch callback_.Reset(); 2315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace 2319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ProfileSyncService::GetAllNodes( 2321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::Callback<void(scoped_ptr<base::ListValue>)>& callback) { 23225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ModelTypeSet directory_types = GetRegisteredDirectoryDataTypes(); 23235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu directory_types.PutAll(syncer::ControlTypes()); 2324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<GetAllNodesRequestHelper> helper = 2325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new GetAllNodesRequestHelper(directory_types, callback); 2326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!backend_initialized_) { 2328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If there's no backend available to fulfill the request, handle it here. 2329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ScopedVector<base::ListValue> empty_results; 2330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<ModelType> type_vector; 2331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (ModelTypeSet::Iterator it = directory_types.First(); 2332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch it.Good(); it.Inc()) { 2333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch type_vector.push_back(it.Get()); 2334c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch empty_results.push_back(new base::ListValue()); 2335c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2336c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch helper->OnReceivedNodesForTypes(type_vector, empty_results.Pass()); 2337c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else { 2338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch backend_->GetAllNodesForTypes( 2339c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch directory_types, 2340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&GetAllNodesRequestHelper::OnReceivedNodesForTypes, helper)); 2341c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2343c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2344ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool ProfileSyncService::HasObserver( 2345ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ProfileSyncServiceBase::Observer* observer) const { 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return observers_.HasObserver(observer); 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::WeakPtr<syncer::JsController> ProfileSyncService::GetJsController() { 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sync_js_controller_.AsWeakPtr(); 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::SyncEvent(SyncEventCodes code) { 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Sync.EventCodes", code, MAX_SYNC_EVENT_CODE); 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::IsSyncEnabled() { 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have switches::kEnableSync just in case we need to change back to 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sync-disabled-by-default on a platform. 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableSync); 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::IsManaged() const { 2365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return sync_prefs_.IsManaged() || sync_disabled_by_admin_; 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProfileSyncService::ShouldPushChanges() { 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True only after all bootstrapping has succeeded: the sync backend 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is initialized, all enabled data types are consistent with one 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another, and no unrecoverable error has transpired. 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasUnrecoverableError()) 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!directory_data_type_manager_) 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return directory_data_type_manager_->state() == DataTypeManager::CONFIGURED; 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::StopAndSuppress() { 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetStartSuppressed(true); 2383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HasSyncingBackend()) { 2384ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch backend_->UnregisterInvalidationIds(); 2385ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 2386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ShutdownImpl(browser_sync::SyncBackendHost::STOP_AND_CLAIM_THREAD); 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ProfileSyncService::IsStartSuppressed() const { 23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return sync_prefs_.IsStartSuppressed(); 23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SigninManagerBase* ProfileSyncService::signin() const { 2394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!signin_) 2395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return NULL; 23965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return signin_->GetOriginal(); 23975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::UnsuppressAndStart() { 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(profile_); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.SetStartSuppressed(false); 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set username in SigninManager, as SigninManager::OnGetUserInfoSuccess 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is never called for some clients. 24045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (signin_.get() && 24055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_->GetOriginal()->GetAuthenticatedUsername().empty()) { 24065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_->GetOriginal()->SetAuthenticatedUsername( 240723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) profile_->GetPrefs()->GetString(prefs::kGoogleServicesUsername)); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_controller_.TryStart(); 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::AcknowledgeSyncedTypes() { 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.AcknowledgeSyncedTypes(GetRegisteredDataTypes()); 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::ReconfigureDatatypeManager() { 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we haven't initialized yet, don't configure the DTM as it could cause 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // association to start before a Directory has even been created. 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (backend_initialized_) { 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(backend_.get()); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypeManager(); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (HasUnrecoverableError()) { 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is nothing more to configure. So inform the listeners, 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(); 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "ConfigureDataTypeManager not invoked because of an " 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Unrecoverable error."; 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(0) << "ConfigureDataTypeManager not invoked because backend is not " 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "initialized"; 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const FailedDataTypesHandler& ProfileSyncService::failed_data_types_handler() 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const { 2436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return failed_data_types_handler_; 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncService::OnInternalUnrecoverableError( 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message, 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool delete_sync_database, 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnrecoverableErrorReason reason) { 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!HasUnrecoverableError()); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unrecoverable_error_reason_ = reason; 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUnrecoverableErrorImpl(from_here, message, delete_sync_database); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)syncer::SyncManagerFactory::MANAGER_TYPE 2450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ProfileSyncService::GetManagerType() const { 2451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (backend_mode_) { 2452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case SYNC: 2453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return syncer::SyncManagerFactory::NORMAL; 2454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case BACKUP: 2455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return syncer::SyncManagerFactory::BACKUP; 2456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ROLLBACK: 2457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return syncer::SyncManagerFactory::ROLLBACK; 2458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case IDLE: 2459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 2460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return syncer::SyncManagerFactory::NORMAL; 2462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ProfileSyncService::IsRetryingAccessTokenFetchForTest() const { 2465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return request_access_token_retry_timer_.IsRunning(); 2466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)std::string ProfileSyncService::GetAccessTokenForTest() const { 2469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return access_token_; 2470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2472a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)WeakHandle<syncer::JsEventHandler> ProfileSyncService::GetJsEventHandler() { 2473a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return MakeWeakHandle(sync_js_controller_.AsWeakPtr()); 2474a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)syncer::SyncableService* ProfileSyncService::GetSessionsSyncableService() { 2477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return sessions_sync_manager_.get(); 2478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ProfileSyncService::SyncTokenStatus::SyncTokenStatus() 2481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : connection_status(syncer::CONNECTION_NOT_ATTEMPTED), 2482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) last_get_token_error(GoogleServiceAuthError::AuthErrorNone()) {} 2483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ProfileSyncService::SyncTokenStatus::~SyncTokenStatus() {} 2484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ProfileSyncService::SyncTokenStatus 2486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ProfileSyncService::GetSyncTokenStatus() const { 2487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SyncTokenStatus status; 2488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) status.connection_status_update_time = connection_status_update_time_; 2489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) status.connection_status = connection_status_; 2490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) status.token_request_time = token_request_time_; 2491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) status.token_receive_time = token_receive_time_; 2492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) status.last_get_token_error = last_get_token_error_; 2493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (request_access_token_retry_timer_.IsRunning()) 2494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) status.next_token_request_time = next_token_request_time_; 2495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return status; 2496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ProfileSyncService::OverrideNetworkResourcesForTest( 2499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<syncer::NetworkResources> network_resources) { 2500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) network_resources_ = network_resources.Pass(); 2501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ProfileSyncService::HasSyncingBackend() const { 2504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return backend_mode_ != SYNC ? false : backend_ != NULL; 2505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProfileSyncService::SetBackupStartDelayForTest(base::TimeDelta delay) { 2508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backup_start_delay_ = delay; 2509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 251046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 251146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ProfileSyncService::UpdateFirstSyncTimePref() { 251246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (signin_->GetEffectiveUsername().empty()) { 251346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Clear if user's not signed in and rollback is done. 251446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (backend_mode_ == BACKUP) 251546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) sync_prefs_.ClearFirstSyncTime(); 251646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else if (sync_prefs_.GetFirstSyncTime().is_null()) { 251746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Set if user is signed in and time was not set before. 251846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) sync_prefs_.SetFirstSyncTime(base::Time::Now()); 251946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 252046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 252146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 252246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ProfileSyncService::ClearBrowsingDataSinceFirstSync() { 252346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time first_sync_time = sync_prefs_.GetFirstSyncTime(); 252446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (first_sync_time.is_null()) 252546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 252646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 252746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) clear_browsing_data_.Run(profile_, first_sync_time, base::Time::Now()); 252846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 252946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 253046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ProfileSyncService::SetClearingBrowseringDataForTesting( 253146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Callback<void(Profile*, base::Time, base::Time)> c) { 253246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) clear_browsing_data_ = c; 253346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2534