OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync/profile_sync_service.h" | 5 #include "chrome/browser/sync/profile_sync_service.h" |
6 | 6 |
7 #include <cstddef> | 7 #include <cstddef> |
8 #include <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 #include <utility> | 10 #include <utility> |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 #include "chrome/common/pref_names.h" | 56 #include "chrome/common/pref_names.h" |
57 #include "chrome/common/time_format.h" | 57 #include "chrome/common/time_format.h" |
58 #include "chrome/common/url_constants.h" | 58 #include "chrome/common/url_constants.h" |
59 #include "components/user_prefs/pref_registry_syncable.h" | 59 #include "components/user_prefs/pref_registry_syncable.h" |
60 #include "content/public/browser/notification_details.h" | 60 #include "content/public/browser/notification_details.h" |
61 #include "content/public/browser/notification_service.h" | 61 #include "content/public/browser/notification_service.h" |
62 #include "content/public/browser/notification_source.h" | 62 #include "content/public/browser/notification_source.h" |
63 #include "google_apis/gaia/gaia_constants.h" | 63 #include "google_apis/gaia/gaia_constants.h" |
64 #include "grit/generated_resources.h" | 64 #include "grit/generated_resources.h" |
65 #include "net/cookies/cookie_monster.h" | 65 #include "net/cookies/cookie_monster.h" |
| 66 #include "net/url_request/url_request_context_getter.h" |
66 #include "sync/api/sync_error.h" | 67 #include "sync/api/sync_error.h" |
67 #include "sync/internal_api/public/configure_reason.h" | 68 #include "sync/internal_api/public/configure_reason.h" |
68 #include "sync/internal_api/public/sync_encryption_handler.h" | 69 #include "sync/internal_api/public/sync_encryption_handler.h" |
69 #include "sync/internal_api/public/util/experiments.h" | 70 #include "sync/internal_api/public/util/experiments.h" |
70 #include "sync/internal_api/public/util/sync_string_conversions.h" | 71 #include "sync/internal_api/public/util/sync_string_conversions.h" |
71 #include "sync/js/js_arg_list.h" | 72 #include "sync/js/js_arg_list.h" |
72 #include "sync/js/js_event_details.h" | 73 #include "sync/js/js_event_details.h" |
73 #include "sync/notifier/invalidator_registrar.h" | |
74 #include "sync/notifier/invalidator_state.h" | |
75 #include "sync/util/cryptographer.h" | 74 #include "sync/util/cryptographer.h" |
76 #include "ui/base/l10n/l10n_util.h" | 75 #include "ui/base/l10n/l10n_util.h" |
77 | 76 |
78 #if defined(OS_ANDROID) | 77 #if defined(OS_ANDROID) |
79 #include "sync/internal_api/public/read_transaction.h" | 78 #include "sync/internal_api/public/read_transaction.h" |
80 #endif | 79 #endif |
81 | 80 |
82 using browser_sync::ChangeProcessor; | 81 using browser_sync::ChangeProcessor; |
83 using browser_sync::DataTypeController; | 82 using browser_sync::DataTypeController; |
84 using browser_sync::DataTypeManager; | 83 using browser_sync::DataTypeManager; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 ProfileSyncService::ProfileSyncService(ProfileSyncComponentsFactory* factory, | 130 ProfileSyncService::ProfileSyncService(ProfileSyncComponentsFactory* factory, |
132 Profile* profile, | 131 Profile* profile, |
133 SigninManager* signin_manager, | 132 SigninManager* signin_manager, |
134 StartBehavior start_behavior) | 133 StartBehavior start_behavior) |
135 : last_auth_error_(AuthError::AuthErrorNone()), | 134 : last_auth_error_(AuthError::AuthErrorNone()), |
136 passphrase_required_reason_(syncer::REASON_PASSPHRASE_NOT_REQUIRED), | 135 passphrase_required_reason_(syncer::REASON_PASSPHRASE_NOT_REQUIRED), |
137 factory_(factory), | 136 factory_(factory), |
138 profile_(profile), | 137 profile_(profile), |
139 // |profile| may be NULL in unit tests. | 138 // |profile| may be NULL in unit tests. |
140 sync_prefs_(profile_ ? profile_->GetPrefs() : NULL), | 139 sync_prefs_(profile_ ? profile_->GetPrefs() : NULL), |
141 invalidator_storage_(profile_ ? profile_->GetPrefs(): NULL), | |
142 sync_service_url_(kDevServerUrl), | 140 sync_service_url_(kDevServerUrl), |
143 is_first_time_sync_configure_(false), | 141 is_first_time_sync_configure_(false), |
144 backend_initialized_(false), | 142 backend_initialized_(false), |
145 is_auth_in_progress_(false), | 143 is_auth_in_progress_(false), |
146 signin_(signin_manager), | 144 signin_(signin_manager), |
147 unrecoverable_error_reason_(ERROR_REASON_UNSET), | 145 unrecoverable_error_reason_(ERROR_REASON_UNSET), |
148 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 146 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
149 expect_sync_configuration_aborted_(false), | 147 expect_sync_configuration_aborted_(false), |
150 encrypted_types_(syncer::SyncEncryptionHandler::SensitiveTypes()), | 148 encrypted_types_(syncer::SyncEncryptionHandler::SensitiveTypes()), |
151 encrypt_everything_(false), | 149 encrypt_everything_(false), |
152 encryption_pending_(false), | 150 encryption_pending_(false), |
153 auto_start_enabled_(start_behavior == AUTO_START), | 151 auto_start_enabled_(start_behavior == AUTO_START), |
154 failed_datatypes_handler_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 152 failed_datatypes_handler_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
155 configure_status_(DataTypeManager::UNKNOWN), | 153 configure_status_(DataTypeManager::UNKNOWN), |
156 setup_in_progress_(false), | 154 setup_in_progress_(false) { |
157 invalidator_state_(syncer::DEFAULT_INVALIDATION_ERROR) { | |
158 // By default, dev, canary, and unbranded Chromium users will go to the | 155 // By default, dev, canary, and unbranded Chromium users will go to the |
159 // development servers. Development servers have more features than standard | 156 // development servers. Development servers have more features than standard |
160 // sync servers. Users with officially-branded Chrome stable and beta builds | 157 // sync servers. Users with officially-branded Chrome stable and beta builds |
161 // will go to the standard sync servers. | 158 // will go to the standard sync servers. |
162 // | 159 // |
163 // GetChannel hits the registry on Windows. See http://crbug.com/70380. | 160 // GetChannel hits the registry on Windows. See http://crbug.com/70380. |
164 base::ThreadRestrictions::ScopedAllowIO allow_io; | 161 base::ThreadRestrictions::ScopedAllowIO allow_io; |
165 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); | 162 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
166 if (channel == chrome::VersionInfo::CHANNEL_STABLE || | 163 if (channel == chrome::VersionInfo::CHANNEL_STABLE || |
167 channel == chrome::VersionInfo::CHANNEL_BETA) { | 164 channel == chrome::VersionInfo::CHANNEL_BETA) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 if (!preferred_types.Has(syncer::PASSWORDS)) | 197 if (!preferred_types.Has(syncer::PASSWORDS)) |
201 return false; | 198 return false; |
202 // On Android we do not want to prompt user to enter a passphrase. If | 199 // On Android we do not want to prompt user to enter a passphrase. If |
203 // passwords cannot be decrypted we just disable them. | 200 // passwords cannot be decrypted we just disable them. |
204 syncer::ReadTransaction trans(FROM_HERE, GetUserShare()); | 201 syncer::ReadTransaction trans(FROM_HERE, GetUserShare()); |
205 return IsCryptographerReady(&trans); | 202 return IsCryptographerReady(&trans); |
206 } | 203 } |
207 #endif | 204 #endif |
208 | 205 |
209 void ProfileSyncService::Initialize() { | 206 void ProfileSyncService::Initialize() { |
210 DCHECK(!invalidator_registrar_.get()); | |
211 invalidator_registrar_.reset(new syncer::InvalidatorRegistrar()); | |
212 | |
213 InitSettings(); | 207 InitSettings(); |
214 | 208 |
215 // We clear this here (vs Shutdown) because we want to remember that an error | 209 // We clear this here (vs Shutdown) because we want to remember that an error |
216 // happened on shutdown so we can display details (message, location) about it | 210 // happened on shutdown so we can display details (message, location) about it |
217 // in about:sync. | 211 // in about:sync. |
218 ClearStaleErrors(); | 212 ClearStaleErrors(); |
219 | 213 |
220 sync_prefs_.AddSyncPrefObserver(this); | 214 sync_prefs_.AddSyncPrefObserver(this); |
221 | 215 |
222 // For now, the only thing we can do through policy is to turn sync off. | 216 // For now, the only thing we can do through policy is to turn sync off. |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 credentials, | 429 credentials, |
436 delete_stale_data, | 430 delete_stale_data, |
437 &sync_manager_factory_, | 431 &sync_manager_factory_, |
438 backend_unrecoverable_error_handler_.get(), | 432 backend_unrecoverable_error_handler_.get(), |
439 &browser_sync::ChromeReportUnrecoverableError); | 433 &browser_sync::ChromeReportUnrecoverableError); |
440 } | 434 } |
441 | 435 |
442 void ProfileSyncService::CreateBackend() { | 436 void ProfileSyncService::CreateBackend() { |
443 backend_.reset( | 437 backend_.reset( |
444 new SyncBackendHost(profile_->GetDebugName(), | 438 new SyncBackendHost(profile_->GetDebugName(), |
445 profile_, sync_prefs_.AsWeakPtr(), | 439 profile_, sync_prefs_.AsWeakPtr())); |
446 invalidator_storage_.AsWeakPtr())); | |
447 } | 440 } |
448 | 441 |
449 bool ProfileSyncService::IsEncryptedDatatypeEnabled() const { | 442 bool ProfileSyncService::IsEncryptedDatatypeEnabled() const { |
450 if (encryption_pending()) | 443 if (encryption_pending()) |
451 return true; | 444 return true; |
452 const syncer::ModelTypeSet preferred_types = GetPreferredDataTypes(); | 445 const syncer::ModelTypeSet preferred_types = GetPreferredDataTypes(); |
453 const syncer::ModelTypeSet encrypted_types = GetEncryptedDataTypes(); | 446 const syncer::ModelTypeSet encrypted_types = GetEncryptedDataTypes(); |
454 DCHECK(encrypted_types.Has(syncer::PASSWORDS)); | 447 DCHECK(encrypted_types.Has(syncer::PASSWORDS)); |
455 return !Intersection(preferred_types, encrypted_types).Empty(); | 448 return !Intersection(preferred_types, encrypted_types).Empty(); |
456 } | 449 } |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 UMA_HISTOGRAM_TIMES("Sync.Startup.TimeDeferred", time_deferred); | 519 UMA_HISTOGRAM_TIMES("Sync.Startup.TimeDeferred", time_deferred); |
527 } | 520 } |
528 | 521 |
529 DCHECK(IsSyncEnabledAndLoggedIn()); | 522 DCHECK(IsSyncEnabledAndLoggedIn()); |
530 CreateBackend(); | 523 CreateBackend(); |
531 | 524 |
532 // Initialize the backend. Every time we start up a new SyncBackendHost, | 525 // Initialize the backend. Every time we start up a new SyncBackendHost, |
533 // we'll want to start from a fresh SyncDB, so delete any old one that might | 526 // we'll want to start from a fresh SyncDB, so delete any old one that might |
534 // be there. | 527 // be there. |
535 InitializeBackend(!HasSyncSetupCompleted()); | 528 InitializeBackend(!HasSyncSetupCompleted()); |
536 | |
537 // |backend_| may end up being NULL here in tests (in synchronous | |
538 // initialization mode). | |
539 // | |
540 // TODO(akalin): Fix this horribly non-intuitive behavior (see | |
541 // http://crbug.com/140354). | |
542 if (backend_.get()) { | |
543 backend_->UpdateRegisteredInvalidationIds( | |
544 invalidator_registrar_->GetAllRegisteredIds()); | |
545 for (AckHandleReplayQueue::const_iterator it = ack_replay_queue_.begin(); | |
546 it != ack_replay_queue_.end(); ++it) { | |
547 backend_->AcknowledgeInvalidation(it->first, it->second); | |
548 } | |
549 ack_replay_queue_.clear(); | |
550 } | |
551 } | |
552 | |
553 void ProfileSyncService::RegisterInvalidationHandler( | |
554 syncer::InvalidationHandler* handler) { | |
555 invalidator_registrar_->RegisterHandler(handler); | |
556 } | |
557 | |
558 void ProfileSyncService::UpdateRegisteredInvalidationIds( | |
559 syncer::InvalidationHandler* handler, | |
560 const syncer::ObjectIdSet& ids) { | |
561 invalidator_registrar_->UpdateRegisteredIds(handler, ids); | |
562 | |
563 // If |backend_| is NULL, its registered IDs will be updated when | |
564 // it's created and initialized. | |
565 if (backend_.get()) { | |
566 backend_->UpdateRegisteredInvalidationIds( | |
567 invalidator_registrar_->GetAllRegisteredIds()); | |
568 } | |
569 } | |
570 | |
571 void ProfileSyncService::UnregisterInvalidationHandler( | |
572 syncer::InvalidationHandler* handler) { | |
573 invalidator_registrar_->UnregisterHandler(handler); | |
574 } | |
575 | |
576 void ProfileSyncService::AcknowledgeInvalidation( | |
577 const invalidation::ObjectId& id, | |
578 const syncer::AckHandle& ack_handle) { | |
579 if (backend_.get()) { | |
580 backend_->AcknowledgeInvalidation(id, ack_handle); | |
581 } else { | |
582 // If |backend_| is NULL, save the acknowledgements to replay when | |
583 // it's created and initialized. | |
584 ack_replay_queue_.push_back(std::make_pair(id, ack_handle)); | |
585 } | |
586 } | |
587 | |
588 syncer::InvalidatorState ProfileSyncService::GetInvalidatorState() const { | |
589 return invalidator_registrar_->GetInvalidatorState(); | |
590 } | |
591 | |
592 void ProfileSyncService::EmitInvalidationForTest( | |
593 const invalidation::ObjectId& id, | |
594 const std::string& payload) { | |
595 syncer::ObjectIdSet notify_ids; | |
596 notify_ids.insert(id); | |
597 | |
598 const syncer::ObjectIdInvalidationMap& invalidation_map = | |
599 ObjectIdSetToInvalidationMap(notify_ids, payload); | |
600 OnIncomingInvalidation(invalidation_map); | |
601 } | 529 } |
602 | 530 |
603 void ProfileSyncService::Shutdown() { | 531 void ProfileSyncService::Shutdown() { |
604 DCHECK(invalidator_registrar_.get()); | |
605 // Reset |invalidator_registrar_| first so that ShutdownImpl cannot | |
606 // use it. | |
607 invalidator_registrar_.reset(); | |
608 | |
609 if (signin_) | 532 if (signin_) |
610 signin_->signin_global_error()->RemoveProvider(this); | 533 signin_->signin_global_error()->RemoveProvider(this); |
611 | 534 |
612 ShutdownImpl(false); | 535 ShutdownImpl(false); |
613 } | 536 } |
614 | 537 |
615 void ProfileSyncService::ShutdownImpl(bool sync_disabled) { | 538 void ProfileSyncService::ShutdownImpl(bool sync_disabled) { |
616 // First, we spin down the backend and wait for it to stop syncing completely | 539 // First, we spin down the backend and wait for it to stop syncing completely |
617 // before we Stop the data type manager. This is to avoid a late sync cycle | 540 // before we Stop the data type manager. This is to avoid a late sync cycle |
618 // applying changes to the sync db that wouldn't get applied via | 541 // applying changes to the sync db that wouldn't get applied via |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 } | 575 } |
653 base::TimeDelta shutdown_time = base::Time::Now() - shutdown_start_time; | 576 base::TimeDelta shutdown_time = base::Time::Now() - shutdown_start_time; |
654 UMA_HISTOGRAM_TIMES("Sync.Shutdown.BackendDestroyedTime", shutdown_time); | 577 UMA_HISTOGRAM_TIMES("Sync.Shutdown.BackendDestroyedTime", shutdown_time); |
655 | 578 |
656 weak_factory_.InvalidateWeakPtrs(); | 579 weak_factory_.InvalidateWeakPtrs(); |
657 | 580 |
658 // Clear various flags. | 581 // Clear various flags. |
659 expect_sync_configuration_aborted_ = false; | 582 expect_sync_configuration_aborted_ = false; |
660 is_auth_in_progress_ = false; | 583 is_auth_in_progress_ = false; |
661 backend_initialized_ = false; | 584 backend_initialized_ = false; |
662 // NULL if we're called from Shutdown(). | 585 |
663 if (invalidator_registrar_.get()) | |
664 UpdateInvalidatorRegistrarState(); | |
665 cached_passphrase_.clear(); | 586 cached_passphrase_.clear(); |
666 encryption_pending_ = false; | 587 encryption_pending_ = false; |
667 encrypt_everything_ = false; | 588 encrypt_everything_ = false; |
668 encrypted_types_ = syncer::SyncEncryptionHandler::SensitiveTypes(); | 589 encrypted_types_ = syncer::SyncEncryptionHandler::SensitiveTypes(); |
669 passphrase_required_reason_ = syncer::REASON_PASSPHRASE_NOT_REQUIRED; | 590 passphrase_required_reason_ = syncer::REASON_PASSPHRASE_NOT_REQUIRED; |
670 // Revert to "no auth error". | 591 // Revert to "no auth error". |
671 if (last_auth_error_.state() != GoogleServiceAuthError::NONE) | 592 if (last_auth_error_.state() != GoogleServiceAuthError::NONE) |
672 UpdateAuthErrorState(GoogleServiceAuthError::AuthErrorNone()); | 593 UpdateAuthErrorState(GoogleServiceAuthError::AuthErrorNone()); |
673 | 594 |
674 if (sync_global_error_.get()) { | 595 if (sync_global_error_.get()) { |
675 GlobalErrorServiceFactory::GetForProfile(profile_)->RemoveGlobalError( | 596 GlobalErrorServiceFactory::GetForProfile(profile_)->RemoveGlobalError( |
676 sync_global_error_.get()); | 597 sync_global_error_.get()); |
677 RemoveObserver(sync_global_error_.get()); | 598 RemoveObserver(sync_global_error_.get()); |
678 sync_global_error_.reset(NULL); | 599 sync_global_error_.reset(NULL); |
679 } | 600 } |
680 } | 601 } |
681 | 602 |
682 void ProfileSyncService::DisableForUser() { | 603 void ProfileSyncService::DisableForUser() { |
683 // Clear prefs (including SyncSetupHasCompleted) before shutting down so | 604 // Clear prefs (including SyncSetupHasCompleted) before shutting down so |
684 // PSS clients don't think we're set up while we're shutting down. | 605 // PSS clients don't think we're set up while we're shutting down. |
685 sync_prefs_.ClearPreferences(); | 606 sync_prefs_.ClearPreferences(); |
686 invalidator_storage_.Clear(); | |
687 ClearUnrecoverableError(); | 607 ClearUnrecoverableError(); |
688 ShutdownImpl(true); | 608 ShutdownImpl(true); |
689 NotifyObservers(); | 609 NotifyObservers(); |
690 } | 610 } |
691 | 611 |
692 bool ProfileSyncService::HasSyncSetupCompleted() const { | 612 bool ProfileSyncService::HasSyncSetupCompleted() const { |
693 return sync_prefs_.HasSyncSetupCompleted(); | 613 return sync_prefs_.HasSyncSetupCompleted(); |
694 } | 614 } |
695 | 615 |
696 void ProfileSyncService::SetSyncSetupCompleted() { | 616 void ProfileSyncService::SetSyncSetupCompleted() { |
697 sync_prefs_.SetSyncSetupCompleted(); | 617 sync_prefs_.SetSyncSetupCompleted(); |
698 } | 618 } |
699 | 619 |
700 void ProfileSyncService::UpdateLastSyncedTime() { | 620 void ProfileSyncService::UpdateLastSyncedTime() { |
701 last_synced_time_ = base::Time::Now(); | 621 last_synced_time_ = base::Time::Now(); |
702 sync_prefs_.SetLastSyncedTime(last_synced_time_); | 622 sync_prefs_.SetLastSyncedTime(last_synced_time_); |
703 } | 623 } |
704 | 624 |
705 void ProfileSyncService::NotifyObservers() { | 625 void ProfileSyncService::NotifyObservers() { |
706 FOR_EACH_OBSERVER(Observer, observers_, OnStateChanged()); | 626 FOR_EACH_OBSERVER(Observer, observers_, OnStateChanged()); |
707 // TODO(akalin): Make an Observer subclass that listens and does the | 627 // TODO(akalin): Make an Observer subclass that listens and does the |
708 // event routing. | 628 // event routing. |
709 sync_js_controller_.HandleJsEvent( | 629 sync_js_controller_.HandleJsEvent( |
710 "onServiceStateChanged", JsEventDetails()); | 630 "onServiceStateChanged", JsEventDetails()); |
711 } | 631 } |
712 | 632 |
| 633 void ProfileSyncService::NotifySyncCycleCompleted() { |
| 634 FOR_EACH_OBSERVER(Observer, observers_, OnSyncCycleCompleted()); |
| 635 sync_js_controller_.HandleJsEvent( |
| 636 "onServiceStateChanged", JsEventDetails()); |
| 637 } |
| 638 |
713 void ProfileSyncService::ClearStaleErrors() { | 639 void ProfileSyncService::ClearStaleErrors() { |
714 ClearUnrecoverableError(); | 640 ClearUnrecoverableError(); |
715 last_actionable_error_ = SyncProtocolError(); | 641 last_actionable_error_ = SyncProtocolError(); |
716 } | 642 } |
717 | 643 |
718 void ProfileSyncService::ClearUnrecoverableError() { | 644 void ProfileSyncService::ClearUnrecoverableError() { |
719 unrecoverable_error_reason_ = ERROR_REASON_UNSET; | 645 unrecoverable_error_reason_ = ERROR_REASON_UNSET; |
720 unrecoverable_error_message_.clear(); | 646 unrecoverable_error_message_.clear(); |
721 unrecoverable_error_location_ = tracked_objects::Location(); | 647 unrecoverable_error_location_ = tracked_objects::Location(); |
722 } | 648 } |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 // Update this before posting a task. So if a configure happens before | 712 // Update this before posting a task. So if a configure happens before |
787 // the task that we are going to post, this type would still be disabled. | 713 // the task that we are going to post, this type would still be disabled. |
788 failed_datatypes_handler_.UpdateFailedDatatypes(errors, | 714 failed_datatypes_handler_.UpdateFailedDatatypes(errors, |
789 FailedDatatypesHandler::RUNTIME); | 715 FailedDatatypesHandler::RUNTIME); |
790 | 716 |
791 MessageLoop::current()->PostTask(FROM_HERE, | 717 MessageLoop::current()->PostTask(FROM_HERE, |
792 base::Bind(&ProfileSyncService::ReconfigureDatatypeManager, | 718 base::Bind(&ProfileSyncService::ReconfigureDatatypeManager, |
793 weak_factory_.GetWeakPtr())); | 719 weak_factory_.GetWeakPtr())); |
794 } | 720 } |
795 | 721 |
796 void ProfileSyncService::OnInvalidatorStateChange( | |
797 syncer::InvalidatorState state) { | |
798 invalidator_state_ = state; | |
799 UpdateInvalidatorRegistrarState(); | |
800 } | |
801 | |
802 void ProfileSyncService::OnIncomingInvalidation( | |
803 const syncer::ObjectIdInvalidationMap& invalidation_map) { | |
804 invalidator_registrar_->DispatchInvalidationsToHandlers(invalidation_map); | |
805 } | |
806 | |
807 void ProfileSyncService::OnBackendInitialized( | 722 void ProfileSyncService::OnBackendInitialized( |
808 const syncer::WeakHandle<syncer::JsBackend>& js_backend, | 723 const syncer::WeakHandle<syncer::JsBackend>& js_backend, |
809 const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& | 724 const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& |
810 debug_info_listener, | 725 debug_info_listener, |
811 bool success) { | 726 bool success) { |
812 is_first_time_sync_configure_ = !HasSyncSetupCompleted(); | 727 is_first_time_sync_configure_ = !HasSyncSetupCompleted(); |
813 | 728 |
814 if (is_first_time_sync_configure_) { | 729 if (is_first_time_sync_configure_) { |
815 UMA_HISTOGRAM_BOOLEAN("Sync.BackendInitializeFirstTimeSuccess", success); | 730 UMA_HISTOGRAM_BOOLEAN("Sync.BackendInitializeFirstTimeSuccess", success); |
816 } else { | 731 } else { |
(...skipping 24 matching lines...) Expand all Loading... |
841 // we get here, we will have already tried and failed to delete the | 756 // we get here, we will have already tried and failed to delete the |
842 // directory. It would be no big deal if we tried to delete it again. | 757 // directory. It would be no big deal if we tried to delete it again. |
843 OnInternalUnrecoverableError(FROM_HERE, | 758 OnInternalUnrecoverableError(FROM_HERE, |
844 "BackendInitialize failure", | 759 "BackendInitialize failure", |
845 false, | 760 false, |
846 ERROR_REASON_BACKEND_INIT_FAILURE); | 761 ERROR_REASON_BACKEND_INIT_FAILURE); |
847 return; | 762 return; |
848 } | 763 } |
849 | 764 |
850 backend_initialized_ = true; | 765 backend_initialized_ = true; |
851 UpdateInvalidatorRegistrarState(); | |
852 | 766 |
853 sync_js_controller_.AttachJsBackend(js_backend); | 767 sync_js_controller_.AttachJsBackend(js_backend); |
854 debug_info_listener_ = debug_info_listener; | 768 debug_info_listener_ = debug_info_listener; |
855 | 769 |
856 // If we have a cached passphrase use it to decrypt/encrypt data now that the | 770 // If we have a cached passphrase use it to decrypt/encrypt data now that the |
857 // backend is initialized. We want to call this before notifying observers in | 771 // backend is initialized. We want to call this before notifying observers in |
858 // case this operation affects the "passphrase required" status. | 772 // case this operation affects the "passphrase required" status. |
859 ConsumeCachedPassphraseIfPossible(); | 773 ConsumeCachedPassphraseIfPossible(); |
860 | 774 |
861 // The very first time the backend initializes is effectively the first time | 775 // The very first time the backend initializes is effectively the first time |
(...skipping 25 matching lines...) Expand all Loading... |
887 // Trigger garbage collection of old sessions now that we've downloaded | 801 // Trigger garbage collection of old sessions now that we've downloaded |
888 // any new session data. TODO(zea): Have this be a notification the session | 802 // any new session data. TODO(zea): Have this be a notification the session |
889 // model associator listens too. Also consider somehow plumbing the current | 803 // model associator listens too. Also consider somehow plumbing the current |
890 // server time as last reported by CheckServerReachable, so we don't have to | 804 // server time as last reported by CheckServerReachable, so we don't have to |
891 // rely on the local clock, which may be off significantly. | 805 // rely on the local clock, which may be off significantly. |
892 MessageLoop::current()->PostTask(FROM_HERE, | 806 MessageLoop::current()->PostTask(FROM_HERE, |
893 base::Bind(&browser_sync::SessionModelAssociator::DeleteStaleSessions, | 807 base::Bind(&browser_sync::SessionModelAssociator::DeleteStaleSessions, |
894 GetSessionModelAssociator()->AsWeakPtr())); | 808 GetSessionModelAssociator()->AsWeakPtr())); |
895 } | 809 } |
896 DVLOG(2) << "Notifying observers sync cycle completed"; | 810 DVLOG(2) << "Notifying observers sync cycle completed"; |
897 NotifyObservers(); | 811 NotifySyncCycleCompleted(); |
898 } | 812 } |
899 | 813 |
900 void ProfileSyncService::OnExperimentsChanged( | 814 void ProfileSyncService::OnExperimentsChanged( |
901 const syncer::Experiments& experiments) { | 815 const syncer::Experiments& experiments) { |
902 if (current_experiments_.Matches(experiments)) | 816 if (current_experiments_.Matches(experiments)) |
903 return; | 817 return; |
904 | 818 |
905 // If this is a first time sync for a client, this will be called before | 819 // If this is a first time sync for a client, this will be called before |
906 // OnBackendInitialized() to ensure the new datatypes are available at sync | 820 // OnBackendInitialized() to ensure the new datatypes are available at sync |
907 // setup. As a result, the migrator won't exist yet. This is fine because for | 821 // setup. As a result, the migrator won't exist yet. This is fine because for |
(...skipping 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1996 void ProfileSyncService::OnInternalUnrecoverableError( | 1910 void ProfileSyncService::OnInternalUnrecoverableError( |
1997 const tracked_objects::Location& from_here, | 1911 const tracked_objects::Location& from_here, |
1998 const std::string& message, | 1912 const std::string& message, |
1999 bool delete_sync_database, | 1913 bool delete_sync_database, |
2000 UnrecoverableErrorReason reason) { | 1914 UnrecoverableErrorReason reason) { |
2001 DCHECK(!HasUnrecoverableError()); | 1915 DCHECK(!HasUnrecoverableError()); |
2002 unrecoverable_error_reason_ = reason; | 1916 unrecoverable_error_reason_ = reason; |
2003 OnUnrecoverableErrorImpl(from_here, message, delete_sync_database); | 1917 OnUnrecoverableErrorImpl(from_here, message, delete_sync_database); |
2004 } | 1918 } |
2005 | 1919 |
2006 void ProfileSyncService::UpdateInvalidatorRegistrarState() { | |
2007 const syncer::InvalidatorState effective_state = | |
2008 backend_initialized_ ? | |
2009 invalidator_state_ : syncer::TRANSIENT_INVALIDATION_ERROR; | |
2010 DVLOG(1) << "New invalidator state: " | |
2011 << syncer::InvalidatorStateToString(invalidator_state_) | |
2012 << ", effective state: " | |
2013 << syncer::InvalidatorStateToString(effective_state); | |
2014 invalidator_registrar_->UpdateInvalidatorState(effective_state); | |
2015 } | |
2016 | |
2017 void ProfileSyncService::ResetForTest() { | 1920 void ProfileSyncService::ResetForTest() { |
2018 Profile* profile = profile_; | 1921 Profile* profile = profile_; |
2019 SigninManager* signin = SigninManagerFactory::GetForProfile(profile); | 1922 SigninManager* signin = SigninManagerFactory::GetForProfile(profile); |
2020 ProfileSyncService::StartBehavior behavior = | 1923 ProfileSyncService::StartBehavior behavior = |
2021 browser_defaults::kSyncAutoStarts ? ProfileSyncService::AUTO_START | 1924 browser_defaults::kSyncAutoStarts ? ProfileSyncService::AUTO_START |
2022 : ProfileSyncService::MANUAL_START; | 1925 : ProfileSyncService::MANUAL_START; |
2023 | 1926 |
2024 // We call the destructor and placement new here because we want to explicitly | 1927 // We call the destructor and placement new here because we want to explicitly |
2025 // recreate a new ProfileSyncService instance at the same memory location as | 1928 // recreate a new ProfileSyncService instance at the same memory location as |
2026 // the old one. Doing so is fine because this code is run only from within | 1929 // the old one. Doing so is fine because this code is run only from within |
2027 // integration tests, and the message loop is not running at this point. | 1930 // integration tests, and the message loop is not running at this point. |
2028 // See http://stackoverflow.com/questions/6224121/is-new-this-myclass-undefine
d-behaviour-after-directly-calling-the-destru. | 1931 // See http://stackoverflow.com/questions/6224121/is-new-this-myclass-undefine
d-behaviour-after-directly-calling-the-destru. |
2029 ProfileSyncService* old_this = this; | 1932 ProfileSyncService* old_this = this; |
2030 this->~ProfileSyncService(); | 1933 this->~ProfileSyncService(); |
2031 new(old_this) ProfileSyncService( | 1934 new(old_this) ProfileSyncService( |
2032 new ProfileSyncComponentsFactoryImpl(profile, | 1935 new ProfileSyncComponentsFactoryImpl(profile, |
2033 CommandLine::ForCurrentProcess()), | 1936 CommandLine::ForCurrentProcess()), |
2034 profile, | 1937 profile, |
2035 signin, | 1938 signin, |
2036 behavior); | 1939 behavior); |
2037 } | 1940 } |
OLD | NEW |