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 "components/browser_sync/browser/profile_sync_service.h" | 5 #include "components/browser_sync/profile_sync_service.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <cstddef> | 9 #include <cstddef> |
10 #include <map> | 10 #include <map> |
11 #include <utility> | 11 #include <utility> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "base/bind.h" | 14 #include "base/bind.h" |
15 #include "base/bind_helpers.h" | 15 #include "base/bind_helpers.h" |
16 #include "base/callback.h" | 16 #include "base/callback.h" |
17 #include "base/command_line.h" | 17 #include "base/command_line.h" |
18 #include "base/compiler_specific.h" | 18 #include "base/compiler_specific.h" |
19 #include "base/feature_list.h" | 19 #include "base/feature_list.h" |
20 #include "base/files/file_util.h" | 20 #include "base/files/file_util.h" |
21 #include "base/logging.h" | 21 #include "base/logging.h" |
22 #include "base/macros.h" | 22 #include "base/macros.h" |
23 #include "base/memory/ptr_util.h" | 23 #include "base/memory/ptr_util.h" |
24 #include "base/memory/ref_counted.h" | 24 #include "base/memory/ref_counted.h" |
25 #include "base/metrics/histogram.h" | 25 #include "base/metrics/histogram.h" |
26 #include "base/profiler/scoped_tracker.h" | 26 #include "base/profiler/scoped_tracker.h" |
27 #include "base/single_thread_task_runner.h" | 27 #include "base/single_thread_task_runner.h" |
28 #include "base/strings/string16.h" | 28 #include "base/strings/string16.h" |
29 #include "base/strings/stringprintf.h" | 29 #include "base/strings/stringprintf.h" |
30 #include "base/threading/thread_restrictions.h" | 30 #include "base/threading/thread_restrictions.h" |
31 #include "base/threading/thread_task_runner_handle.h" | 31 #include "base/threading/thread_task_runner_handle.h" |
32 #include "base/time/time.h" | 32 #include "base/time/time.h" |
33 #include "build/build_config.h" | 33 #include "build/build_config.h" |
34 #include "components/autofill/core/common/autofill_pref_names.h" | 34 #include "components/autofill/core/common/autofill_pref_names.h" |
35 #include "components/browser_sync/common/browser_sync_switches.h" | 35 #include "components/browser_sync/browser_sync_switches.h" |
36 #include "components/history/core/browser/typed_url_data_type_controller.h" | 36 #include "components/history/core/browser/typed_url_data_type_controller.h" |
37 #include "components/invalidation/impl/invalidation_prefs.h" | 37 #include "components/invalidation/impl/invalidation_prefs.h" |
38 #include "components/invalidation/public/invalidation_service.h" | 38 #include "components/invalidation/public/invalidation_service.h" |
39 #include "components/pref_registry/pref_registry_syncable.h" | 39 #include "components/pref_registry/pref_registry_syncable.h" |
40 #include "components/prefs/json_pref_store.h" | 40 #include "components/prefs/json_pref_store.h" |
41 #include "components/signin/core/browser/about_signin_internals.h" | 41 #include "components/signin/core/browser/about_signin_internals.h" |
42 #include "components/signin/core/browser/profile_oauth2_token_service.h" | 42 #include "components/signin/core/browser/profile_oauth2_token_service.h" |
43 #include "components/signin/core/browser/signin_manager.h" | 43 #include "components/signin/core/browser/signin_manager.h" |
44 #include "components/signin/core/browser/signin_metrics.h" | 44 #include "components/signin/core/browser/signin_metrics.h" |
45 #include "components/strings/grit/components_strings.h" | 45 #include "components/strings/grit/components_strings.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
116 using syncer::JsEventHandler; | 116 using syncer::JsEventHandler; |
117 using syncer::ModelSafeRoutingInfo; | 117 using syncer::ModelSafeRoutingInfo; |
118 using syncer::SyncCredentials; | 118 using syncer::SyncCredentials; |
119 using syncer::SyncProtocolError; | 119 using syncer::SyncProtocolError; |
120 using syncer::WeakHandle; | 120 using syncer::WeakHandle; |
121 using syncer_v2::ModelTypeStore; | 121 using syncer_v2::ModelTypeStore; |
122 using syncer_v2::SharedModelTypeProcessor; | 122 using syncer_v2::SharedModelTypeProcessor; |
123 | 123 |
124 typedef GoogleServiceAuthError AuthError; | 124 typedef GoogleServiceAuthError AuthError; |
125 | 125 |
126 const char kSyncUnrecoverableErrorHistogram[] = | 126 const char kSyncUnrecoverableErrorHistogram[] = "Sync.UnrecoverableErrors"; |
127 "Sync.UnrecoverableErrors"; | |
128 | 127 |
129 const net::BackoffEntry::Policy kRequestAccessTokenBackoffPolicy = { | 128 const net::BackoffEntry::Policy kRequestAccessTokenBackoffPolicy = { |
130 // Number of initial errors (in sequence) to ignore before applying | 129 // Number of initial errors (in sequence) to ignore before applying |
131 // exponential back-off rules. | 130 // exponential back-off rules. |
132 0, | 131 0, |
133 | 132 |
134 // Initial delay for exponential back-off in ms. | 133 // Initial delay for exponential back-off in ms. |
135 2000, | 134 2000, |
136 | 135 |
137 // Factor by which the waiting time will be multiplied. | 136 // Factor by which the waiting time will be multiplied. |
(...skipping 27 matching lines...) Expand all Loading... | |
165 // This should only be called on the sync thread. | 164 // This should only be called on the sync thread. |
166 void DeleteSyncDataFolder(const base::FilePath& directory_path) { | 165 void DeleteSyncDataFolder(const base::FilePath& directory_path) { |
167 if (base::DirectoryExists(directory_path)) { | 166 if (base::DirectoryExists(directory_path)) { |
168 if (!base::DeleteFile(directory_path, true)) | 167 if (!base::DeleteFile(directory_path, true)) |
169 LOG(DFATAL) << "Could not delete the Sync Data folder."; | 168 LOG(DFATAL) << "Could not delete the Sync Data folder."; |
170 } | 169 } |
171 } | 170 } |
172 | 171 |
173 } // namespace | 172 } // namespace |
174 | 173 |
175 bool ShouldShowActionOnUI( | 174 bool ShouldShowActionOnUI(const syncer::SyncProtocolError& error) { |
176 const syncer::SyncProtocolError& error) { | |
177 return (error.action != syncer::UNKNOWN_ACTION && | 175 return (error.action != syncer::UNKNOWN_ACTION && |
178 error.action != syncer::DISABLE_SYNC_ON_CLIENT && | 176 error.action != syncer::DISABLE_SYNC_ON_CLIENT && |
179 error.action != syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT && | 177 error.action != syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT && |
180 error.action != syncer::RESET_LOCAL_SYNC_DATA); | 178 error.action != syncer::RESET_LOCAL_SYNC_DATA); |
181 } | 179 } |
182 | 180 |
183 ProfileSyncService::InitParams::InitParams() = default; | 181 ProfileSyncService::InitParams::InitParams() = default; |
184 ProfileSyncService::InitParams::~InitParams() = default; | 182 ProfileSyncService::InitParams::~InitParams() = default; |
185 ProfileSyncService::InitParams::InitParams(InitParams&& other) // NOLINT | 183 ProfileSyncService::InitParams::InitParams(InitParams&& other) // NOLINT |
186 : sync_client(std::move(other.sync_client)), | 184 : sync_client(std::move(other.sync_client)), |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
459 return device_info_sync_service_.get(); | 457 return device_info_sync_service_.get(); |
460 } | 458 } |
461 } | 459 } |
462 | 460 |
463 sync_driver::LocalDeviceInfoProvider* | 461 sync_driver::LocalDeviceInfoProvider* |
464 ProfileSyncService::GetLocalDeviceInfoProvider() const { | 462 ProfileSyncService::GetLocalDeviceInfoProvider() const { |
465 return local_device_.get(); | 463 return local_device_.get(); |
466 } | 464 } |
467 | 465 |
468 void ProfileSyncService::GetDataTypeControllerStates( | 466 void ProfileSyncService::GetDataTypeControllerStates( |
469 DataTypeController::StateMap* state_map) const { | 467 DataTypeController::StateMap* state_map) const { |
470 for (DataTypeController::TypeMap::const_iterator iter = | 468 for (DataTypeController::TypeMap::const_iterator iter = |
471 data_type_controllers_.begin(); | 469 data_type_controllers_.begin(); |
472 iter != data_type_controllers_.end(); ++iter) | 470 iter != data_type_controllers_.end(); ++iter) |
473 (*state_map)[iter->first] = iter->second.get()->state(); | 471 (*state_map)[iter->first] = iter->second.get()->state(); |
474 } | 472 } |
475 | 473 |
476 void ProfileSyncService::OnSessionRestoreComplete() { | 474 void ProfileSyncService::OnSessionRestoreComplete() { |
477 DataTypeController::TypeMap::const_iterator iter = | 475 DataTypeController::TypeMap::const_iterator iter = |
478 data_type_controllers_.find(syncer::SESSIONS); | 476 data_type_controllers_.find(syncer::SESSIONS); |
479 if (iter == data_type_controllers_.end()) { | 477 if (iter == data_type_controllers_.end()) { |
480 return; | 478 return; |
481 } | 479 } |
482 DCHECK(iter->second); | 480 DCHECK(iter->second); |
483 | 481 |
(...skipping 28 matching lines...) Expand all Loading... | |
512 | 510 |
513 SyncCredentials credentials = GetCredentials(); | 511 SyncCredentials credentials = GetCredentials(); |
514 | 512 |
515 if (delete_stale_data) | 513 if (delete_stale_data) |
516 ClearStaleErrors(); | 514 ClearStaleErrors(); |
517 | 515 |
518 SyncBackendHost::HttpPostProviderFactoryGetter | 516 SyncBackendHost::HttpPostProviderFactoryGetter |
519 http_post_provider_factory_getter = | 517 http_post_provider_factory_getter = |
520 base::Bind(&syncer::NetworkResources::GetHttpPostProviderFactory, | 518 base::Bind(&syncer::NetworkResources::GetHttpPostProviderFactory, |
521 base::Unretained(network_resources_.get()), | 519 base::Unretained(network_resources_.get()), |
522 url_request_context_, | 520 url_request_context_, network_time_update_callback_); |
523 network_time_update_callback_); | |
524 | 521 |
525 backend_->Initialize( | 522 backend_->Initialize( |
526 this, std::move(sync_thread_), db_thread_, file_thread_, | 523 this, std::move(sync_thread_), db_thread_, file_thread_, |
527 GetJsEventHandler(), sync_service_url_, local_device_->GetSyncUserAgent(), | 524 GetJsEventHandler(), sync_service_url_, local_device_->GetSyncUserAgent(), |
528 credentials, delete_stale_data, | 525 credentials, delete_stale_data, |
529 std::unique_ptr<syncer::SyncManagerFactory>( | 526 std::unique_ptr<syncer::SyncManagerFactory>( |
530 new syncer::SyncManagerFactory()), | 527 new syncer::SyncManagerFactory()), |
531 MakeWeakHandle(sync_enabled_weak_factory_.GetWeakPtr()), | 528 MakeWeakHandle(sync_enabled_weak_factory_.GetWeakPtr()), |
532 base::Bind(browser_sync::ChromeReportUnrecoverableError, channel_), | 529 base::Bind(browser_sync::ChromeReportUnrecoverableError, channel_), |
533 http_post_provider_factory_getter, std::move(saved_nigori_state_)); | 530 http_post_provider_factory_getter, std::move(saved_nigori_state_)); |
534 } | 531 } |
535 | 532 |
536 bool ProfileSyncService::IsEncryptedDatatypeEnabled() const { | 533 bool ProfileSyncService::IsEncryptedDatatypeEnabled() const { |
537 if (encryption_pending()) | 534 if (encryption_pending()) |
538 return true; | 535 return true; |
539 const syncer::ModelTypeSet preferred_types = GetPreferredDataTypes(); | 536 const syncer::ModelTypeSet preferred_types = GetPreferredDataTypes(); |
540 const syncer::ModelTypeSet encrypted_types = GetEncryptedDataTypes(); | 537 const syncer::ModelTypeSet encrypted_types = GetEncryptedDataTypes(); |
541 DCHECK(encrypted_types.Has(syncer::PASSWORDS)); | 538 DCHECK(encrypted_types.Has(syncer::PASSWORDS)); |
542 return !Intersection(preferred_types, encrypted_types).Empty(); | 539 return !Intersection(preferred_types, encrypted_types).Empty(); |
543 } | 540 } |
544 | 541 |
545 void ProfileSyncService::OnProtocolEvent( | 542 void ProfileSyncService::OnProtocolEvent(const syncer::ProtocolEvent& event) { |
546 const syncer::ProtocolEvent& event) { | |
547 FOR_EACH_OBSERVER(browser_sync::ProtocolEventObserver, | 543 FOR_EACH_OBSERVER(browser_sync::ProtocolEventObserver, |
548 protocol_event_observers_, | 544 protocol_event_observers_, OnProtocolEvent(event)); |
549 OnProtocolEvent(event)); | |
550 } | 545 } |
551 | 546 |
552 void ProfileSyncService::OnDirectoryTypeCommitCounterUpdated( | 547 void ProfileSyncService::OnDirectoryTypeCommitCounterUpdated( |
553 syncer::ModelType type, | 548 syncer::ModelType type, |
554 const syncer::CommitCounters& counters) { | 549 const syncer::CommitCounters& counters) { |
555 FOR_EACH_OBSERVER(syncer::TypeDebugInfoObserver, | 550 FOR_EACH_OBSERVER(syncer::TypeDebugInfoObserver, type_debug_info_observers_, |
556 type_debug_info_observers_, | |
557 OnCommitCountersUpdated(type, counters)); | 551 OnCommitCountersUpdated(type, counters)); |
558 } | 552 } |
559 | 553 |
560 void ProfileSyncService::OnDirectoryTypeUpdateCounterUpdated( | 554 void ProfileSyncService::OnDirectoryTypeUpdateCounterUpdated( |
561 syncer::ModelType type, | 555 syncer::ModelType type, |
562 const syncer::UpdateCounters& counters) { | 556 const syncer::UpdateCounters& counters) { |
563 FOR_EACH_OBSERVER(syncer::TypeDebugInfoObserver, | 557 FOR_EACH_OBSERVER(syncer::TypeDebugInfoObserver, type_debug_info_observers_, |
564 type_debug_info_observers_, | |
565 OnUpdateCountersUpdated(type, counters)); | 558 OnUpdateCountersUpdated(type, counters)); |
566 } | 559 } |
567 | 560 |
568 void ProfileSyncService::OnDirectoryTypeStatusCounterUpdated( | 561 void ProfileSyncService::OnDirectoryTypeStatusCounterUpdated( |
569 syncer::ModelType type, | 562 syncer::ModelType type, |
570 const syncer::StatusCounters& counters) { | 563 const syncer::StatusCounters& counters) { |
571 FOR_EACH_OBSERVER(syncer::TypeDebugInfoObserver, | 564 FOR_EACH_OBSERVER(syncer::TypeDebugInfoObserver, type_debug_info_observers_, |
572 type_debug_info_observers_, | |
573 OnStatusCountersUpdated(type, counters)); | 565 OnStatusCountersUpdated(type, counters)); |
574 } | 566 } |
575 | 567 |
576 void ProfileSyncService::OnDataTypeRequestsSyncStartup( | 568 void ProfileSyncService::OnDataTypeRequestsSyncStartup(syncer::ModelType type) { |
577 syncer::ModelType type) { | |
578 DCHECK(syncer::UserTypes().Has(type)); | 569 DCHECK(syncer::UserTypes().Has(type)); |
579 | 570 |
580 if (!GetPreferredDataTypes().Has(type)) { | 571 if (!GetPreferredDataTypes().Has(type)) { |
581 // We can get here as datatype SyncableServices are typically wired up | 572 // We can get here as datatype SyncableServices are typically wired up |
582 // to the native datatype even if sync isn't enabled. | 573 // to the native datatype even if sync isn't enabled. |
583 DVLOG(1) << "Dropping sync startup request because type " | 574 DVLOG(1) << "Dropping sync startup request because type " |
584 << syncer::ModelTypeToString(type) << "not enabled."; | 575 << syncer::ModelTypeToString(type) << "not enabled."; |
585 return; | 576 return; |
586 } | 577 } |
587 | 578 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
650 DCHECK_NE(error.state(), GoogleServiceAuthError::NONE); | 641 DCHECK_NE(error.state(), GoogleServiceAuthError::NONE); |
651 access_token_request_.reset(); | 642 access_token_request_.reset(); |
652 last_get_token_error_ = error; | 643 last_get_token_error_ = error; |
653 switch (error.state()) { | 644 switch (error.state()) { |
654 case GoogleServiceAuthError::CONNECTION_FAILED: | 645 case GoogleServiceAuthError::CONNECTION_FAILED: |
655 case GoogleServiceAuthError::REQUEST_CANCELED: | 646 case GoogleServiceAuthError::REQUEST_CANCELED: |
656 case GoogleServiceAuthError::SERVICE_ERROR: | 647 case GoogleServiceAuthError::SERVICE_ERROR: |
657 case GoogleServiceAuthError::SERVICE_UNAVAILABLE: { | 648 case GoogleServiceAuthError::SERVICE_UNAVAILABLE: { |
658 // Transient error. Retry after some time. | 649 // Transient error. Retry after some time. |
659 request_access_token_backoff_.InformOfRequest(false); | 650 request_access_token_backoff_.InformOfRequest(false); |
660 next_token_request_time_ = base::Time::Now() + | 651 next_token_request_time_ = |
652 base::Time::Now() + | |
661 request_access_token_backoff_.GetTimeUntilRelease(); | 653 request_access_token_backoff_.GetTimeUntilRelease(); |
662 request_access_token_retry_timer_.Start( | 654 request_access_token_retry_timer_.Start( |
663 FROM_HERE, request_access_token_backoff_.GetTimeUntilRelease(), | 655 FROM_HERE, request_access_token_backoff_.GetTimeUntilRelease(), |
664 base::Bind(&ProfileSyncService::RequestAccessToken, | 656 base::Bind(&ProfileSyncService::RequestAccessToken, |
665 sync_enabled_weak_factory_.GetWeakPtr())); | 657 sync_enabled_weak_factory_.GetWeakPtr())); |
666 NotifyObservers(); | 658 NotifyObservers(); |
667 break; | 659 break; |
668 } | 660 } |
669 case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: { | 661 case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: { |
670 if (!sync_prefs_.SyncHasAuthError()) { | 662 if (!sync_prefs_.SyncHasAuthError()) { |
671 sync_prefs_.SetSyncAuthError(true); | 663 sync_prefs_.SetSyncAuthError(true); |
672 UMA_HISTOGRAM_ENUMERATION("Sync.SyncAuthError", | 664 UMA_HISTOGRAM_ENUMERATION("Sync.SyncAuthError", AUTH_ERROR_ENCOUNTERED, |
673 AUTH_ERROR_ENCOUNTERED, | |
674 AUTH_ERROR_LIMIT); | 665 AUTH_ERROR_LIMIT); |
675 } | 666 } |
676 // Fallthrough. | 667 // Fallthrough. |
677 } | 668 } |
678 default: { | 669 default: { |
679 if (error.state() != GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS) { | 670 if (error.state() != GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS) { |
680 LOG(ERROR) << "Unexpected persistent error: " << error.ToString(); | 671 LOG(ERROR) << "Unexpected persistent error: " << error.ToString(); |
681 } | 672 } |
682 // Show error to user. | 673 // Show error to user. |
683 UpdateAuthErrorState(error); | 674 UpdateAuthErrorState(error); |
684 } | 675 } |
685 } | 676 } |
686 } | 677 } |
687 | 678 |
688 void ProfileSyncService::OnRefreshTokenAvailable( | 679 void ProfileSyncService::OnRefreshTokenAvailable( |
689 const std::string& account_id) { | 680 const std::string& account_id) { |
690 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is | 681 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is |
691 // fixed. | 682 // fixed. |
692 tracked_objects::ScopedTracker tracking_profile( | 683 tracked_objects::ScopedTracker tracking_profile( |
693 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 684 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
694 "422460 ProfileSyncService::OnRefreshTokenAvailable")); | 685 "422460 ProfileSyncService::OnRefreshTokenAvailable")); |
695 | 686 |
696 if (account_id == signin_->GetAccountIdToUse()) | 687 if (account_id == signin_->GetAccountIdToUse()) |
697 OnRefreshTokensLoaded(); | 688 OnRefreshTokensLoaded(); |
698 } | 689 } |
699 | 690 |
700 void ProfileSyncService::OnRefreshTokenRevoked( | 691 void ProfileSyncService::OnRefreshTokenRevoked(const std::string& account_id) { |
701 const std::string& account_id) { | |
702 if (account_id == signin_->GetAccountIdToUse()) { | 692 if (account_id == signin_->GetAccountIdToUse()) { |
703 access_token_.clear(); | 693 access_token_.clear(); |
704 UpdateAuthErrorState( | 694 UpdateAuthErrorState( |
705 GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED)); | 695 GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED)); |
706 } | 696 } |
707 } | 697 } |
708 | 698 |
709 void ProfileSyncService::OnRefreshTokensLoaded() { | 699 void ProfileSyncService::OnRefreshTokensLoaded() { |
710 // This notification gets fired when OAuth2TokenService loads the tokens | 700 // This notification gets fired when OAuth2TokenService loads the tokens |
711 // from storage. | 701 // from storage. |
(...skipping 25 matching lines...) Expand all Loading... | |
737 if (!backend_) { | 727 if (!backend_) { |
738 if (reason == syncer::ShutdownReason::DISABLE_SYNC && sync_thread_) { | 728 if (reason == syncer::ShutdownReason::DISABLE_SYNC && sync_thread_) { |
739 // If the backend is already shut down when a DISABLE_SYNC happens, | 729 // If the backend is already shut down when a DISABLE_SYNC happens, |
740 // the data directory needs to be cleaned up here. | 730 // the data directory needs to be cleaned up here. |
741 sync_thread_->task_runner()->PostTask( | 731 sync_thread_->task_runner()->PostTask( |
742 FROM_HERE, base::Bind(&DeleteSyncDataFolder, directory_path_)); | 732 FROM_HERE, base::Bind(&DeleteSyncDataFolder, directory_path_)); |
743 } | 733 } |
744 return; | 734 return; |
745 } | 735 } |
746 | 736 |
747 if (reason == syncer::ShutdownReason::STOP_SYNC | 737 if (reason == syncer::ShutdownReason::STOP_SYNC || |
748 || reason == syncer::ShutdownReason::DISABLE_SYNC) { | 738 reason == syncer::ShutdownReason::DISABLE_SYNC) { |
749 RemoveClientFromServer(); | 739 RemoveClientFromServer(); |
750 } | 740 } |
751 | 741 |
752 // First, we spin down the backend to stop change processing as soon as | 742 // First, we spin down the backend to stop change processing as soon as |
753 // possible. | 743 // possible. |
754 base::Time shutdown_start_time = base::Time::Now(); | 744 base::Time shutdown_start_time = base::Time::Now(); |
755 backend_->StopSyncingForShutdown(); | 745 backend_->StopSyncingForShutdown(); |
756 | 746 |
757 // Stop all data type controllers, if needed. Note that until Stop | 747 // Stop all data type controllers, if needed. Note that until Stop |
758 // completes, it is possible in theory to have a ChangeProcessor apply a | 748 // completes, it is possible in theory to have a ChangeProcessor apply a |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
893 | 883 |
894 void ProfileSyncService::OnUnrecoverableErrorImpl( | 884 void ProfileSyncService::OnUnrecoverableErrorImpl( |
895 const tracked_objects::Location& from_here, | 885 const tracked_objects::Location& from_here, |
896 const std::string& message, | 886 const std::string& message, |
897 bool delete_sync_database) { | 887 bool delete_sync_database) { |
898 DCHECK(HasUnrecoverableError()); | 888 DCHECK(HasUnrecoverableError()); |
899 unrecoverable_error_message_ = message; | 889 unrecoverable_error_message_ = message; |
900 unrecoverable_error_location_ = from_here; | 890 unrecoverable_error_location_ = from_here; |
901 | 891 |
902 UMA_HISTOGRAM_ENUMERATION(kSyncUnrecoverableErrorHistogram, | 892 UMA_HISTOGRAM_ENUMERATION(kSyncUnrecoverableErrorHistogram, |
903 unrecoverable_error_reason_, | 893 unrecoverable_error_reason_, ERROR_REASON_LIMIT); |
904 ERROR_REASON_LIMIT); | |
905 std::string location; | 894 std::string location; |
906 from_here.Write(true, true, &location); | 895 from_here.Write(true, true, &location); |
907 LOG(ERROR) | 896 LOG(ERROR) << "Unrecoverable error detected at " << location |
908 << "Unrecoverable error detected at " << location | 897 << " -- ProfileSyncService unusable: " << message; |
909 << " -- ProfileSyncService unusable: " << message; | |
910 | 898 |
911 // Shut all data types down. | 899 // Shut all data types down. |
912 base::ThreadTaskRunnerHandle::Get()->PostTask( | 900 base::ThreadTaskRunnerHandle::Get()->PostTask( |
913 FROM_HERE, base::Bind(&ProfileSyncService::ShutdownImpl, | 901 FROM_HERE, base::Bind(&ProfileSyncService::ShutdownImpl, |
914 sync_enabled_weak_factory_.GetWeakPtr(), | 902 sync_enabled_weak_factory_.GetWeakPtr(), |
915 delete_sync_database ? syncer::DISABLE_SYNC | 903 delete_sync_database ? syncer::DISABLE_SYNC |
916 : syncer::STOP_SYNC)); | 904 : syncer::STOP_SYNC)); |
917 } | 905 } |
918 | 906 |
919 void ProfileSyncService::ReenableDatatype(syncer::ModelType type) { | 907 void ProfileSyncService::ReenableDatatype(syncer::ModelType type) { |
920 if (!backend_initialized_ || !data_type_manager_) | 908 if (!backend_initialized_ || !data_type_manager_) |
921 return; | 909 return; |
922 data_type_manager_->ReenableType(type); | 910 data_type_manager_->ReenableType(type); |
923 } | 911 } |
924 | 912 |
925 void ProfileSyncService::UpdateBackendInitUMA(bool success) { | 913 void ProfileSyncService::UpdateBackendInitUMA(bool success) { |
926 is_first_time_sync_configure_ = !IsFirstSetupComplete(); | 914 is_first_time_sync_configure_ = !IsFirstSetupComplete(); |
927 | 915 |
928 if (is_first_time_sync_configure_) { | 916 if (is_first_time_sync_configure_) { |
929 UMA_HISTOGRAM_BOOLEAN("Sync.BackendInitializeFirstTimeSuccess", success); | 917 UMA_HISTOGRAM_BOOLEAN("Sync.BackendInitializeFirstTimeSuccess", success); |
930 } else { | 918 } else { |
931 UMA_HISTOGRAM_BOOLEAN("Sync.BackendInitializeRestoreSuccess", success); | 919 UMA_HISTOGRAM_BOOLEAN("Sync.BackendInitializeRestoreSuccess", success); |
932 } | 920 } |
933 | 921 |
934 base::Time on_backend_initialized_time = base::Time::Now(); | 922 base::Time on_backend_initialized_time = base::Time::Now(); |
935 base::TimeDelta delta = on_backend_initialized_time - | 923 base::TimeDelta delta = |
936 startup_controller_->start_backend_time(); | 924 on_backend_initialized_time - startup_controller_->start_backend_time(); |
937 if (is_first_time_sync_configure_) { | 925 if (is_first_time_sync_configure_) { |
938 UMA_HISTOGRAM_LONG_TIMES("Sync.BackendInitializeFirstTime", delta); | 926 UMA_HISTOGRAM_LONG_TIMES("Sync.BackendInitializeFirstTime", delta); |
939 } else { | 927 } else { |
940 UMA_HISTOGRAM_LONG_TIMES("Sync.BackendInitializeRestoreTime", delta); | 928 UMA_HISTOGRAM_LONG_TIMES("Sync.BackendInitializeRestoreTime", delta); |
941 } | 929 } |
942 } | 930 } |
943 | 931 |
944 void ProfileSyncService::PostBackendInitialization() { | 932 void ProfileSyncService::PostBackendInitialization() { |
945 if (protocol_event_observers_.might_have_observers()) { | 933 if (protocol_event_observers_.might_have_observers()) { |
946 backend_->RequestBufferedProtocolEventsAndEnableForwarding(); | 934 backend_->RequestBufferedProtocolEventsAndEnableForwarding(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
997 // Keep the directory around for now so that on restart we will retry | 985 // Keep the directory around for now so that on restart we will retry |
998 // again and potentially succeed in presence of transient file IO failures | 986 // again and potentially succeed in presence of transient file IO failures |
999 // or permissions issues, etc. | 987 // or permissions issues, etc. |
1000 // | 988 // |
1001 // TODO(rlarocque): Consider making this UnrecoverableError less special. | 989 // TODO(rlarocque): Consider making this UnrecoverableError less special. |
1002 // Unlike every other UnrecoverableError, it does not delete our sync data. | 990 // Unlike every other UnrecoverableError, it does not delete our sync data. |
1003 // This exception made sense at the time it was implemented, but our new | 991 // This exception made sense at the time it was implemented, but our new |
1004 // directory corruption recovery mechanism makes it obsolete. By the time | 992 // directory corruption recovery mechanism makes it obsolete. By the time |
1005 // we get here, we will have already tried and failed to delete the | 993 // we get here, we will have already tried and failed to delete the |
1006 // directory. It would be no big deal if we tried to delete it again. | 994 // directory. It would be no big deal if we tried to delete it again. |
1007 OnInternalUnrecoverableError(FROM_HERE, | 995 OnInternalUnrecoverableError(FROM_HERE, "BackendInitialize failure", false, |
1008 "BackendInitialize failure", | |
1009 false, | |
1010 ERROR_REASON_BACKEND_INIT_FAILURE); | 996 ERROR_REASON_BACKEND_INIT_FAILURE); |
1011 return; | 997 return; |
1012 } | 998 } |
1013 | 999 |
1014 backend_initialized_ = true; | 1000 backend_initialized_ = true; |
1015 | 1001 |
1016 sync_js_controller_.AttachJsBackend(js_backend); | 1002 sync_js_controller_.AttachJsBackend(js_backend); |
1017 debug_info_listener_ = debug_info_listener; | 1003 debug_info_listener_ = debug_info_listener; |
1018 | 1004 |
1019 SigninClient* signin_client = signin_->GetOriginal()->signin_client(); | 1005 SigninClient* signin_client = signin_->GetOriginal()->signin_client(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1059 | 1045 |
1060 void ProfileSyncService::UpdateAuthErrorState(const AuthError& error) { | 1046 void ProfileSyncService::UpdateAuthErrorState(const AuthError& error) { |
1061 is_auth_in_progress_ = false; | 1047 is_auth_in_progress_ = false; |
1062 last_auth_error_ = error; | 1048 last_auth_error_ = error; |
1063 | 1049 |
1064 NotifyObservers(); | 1050 NotifyObservers(); |
1065 } | 1051 } |
1066 | 1052 |
1067 namespace { | 1053 namespace { |
1068 | 1054 |
1069 AuthError ConnectionStatusToAuthError( | 1055 AuthError ConnectionStatusToAuthError(syncer::ConnectionStatus status) { |
1070 syncer::ConnectionStatus status) { | |
1071 switch (status) { | 1056 switch (status) { |
1072 case syncer::CONNECTION_OK: | 1057 case syncer::CONNECTION_OK: |
1073 return AuthError::AuthErrorNone(); | 1058 return AuthError::AuthErrorNone(); |
1074 break; | 1059 break; |
1075 case syncer::CONNECTION_AUTH_ERROR: | 1060 case syncer::CONNECTION_AUTH_ERROR: |
1076 return AuthError(AuthError::INVALID_GAIA_CREDENTIALS); | 1061 return AuthError(AuthError::INVALID_GAIA_CREDENTIALS); |
1077 break; | 1062 break; |
1078 case syncer::CONNECTION_SERVER_ERROR: | 1063 case syncer::CONNECTION_SERVER_ERROR: |
1079 return AuthError(AuthError::CONNECTION_FAILED); | 1064 return AuthError(AuthError::CONNECTION_FAILED); |
1080 break; | 1065 break; |
(...skipping 30 matching lines...) Expand all Loading... | |
1111 // schedule request if this happens. | 1096 // schedule request if this happens. |
1112 if (request_access_token_retry_timer_.IsRunning()) { | 1097 if (request_access_token_retry_timer_.IsRunning()) { |
1113 // The timer to perform a request later is already running; nothing | 1098 // The timer to perform a request later is already running; nothing |
1114 // further needs to be done at this point. | 1099 // further needs to be done at this point. |
1115 } else if (request_access_token_backoff_.failure_count() == 0) { | 1100 } else if (request_access_token_backoff_.failure_count() == 0) { |
1116 // First time request without delay. Currently invalid token is used | 1101 // First time request without delay. Currently invalid token is used |
1117 // to initialize sync backend and we'll always end up here. We don't | 1102 // to initialize sync backend and we'll always end up here. We don't |
1118 // want to delay initialization. | 1103 // want to delay initialization. |
1119 request_access_token_backoff_.InformOfRequest(false); | 1104 request_access_token_backoff_.InformOfRequest(false); |
1120 RequestAccessToken(); | 1105 RequestAccessToken(); |
1121 } else { | 1106 } else { |
1122 request_access_token_backoff_.InformOfRequest(false); | 1107 request_access_token_backoff_.InformOfRequest(false); |
1123 request_access_token_retry_timer_.Start( | 1108 request_access_token_retry_timer_.Start( |
1124 FROM_HERE, request_access_token_backoff_.GetTimeUntilRelease(), | 1109 FROM_HERE, request_access_token_backoff_.GetTimeUntilRelease(), |
1125 base::Bind(&ProfileSyncService::RequestAccessToken, | 1110 base::Bind(&ProfileSyncService::RequestAccessToken, |
1126 sync_enabled_weak_factory_.GetWeakPtr())); | 1111 sync_enabled_weak_factory_.GetWeakPtr())); |
1127 } | 1112 } |
1128 } else { | 1113 } else { |
1129 // Reset backoff time after successful connection. | 1114 // Reset backoff time after successful connection. |
1130 if (status == syncer::CONNECTION_OK) { | 1115 if (status == syncer::CONNECTION_OK) { |
1131 // Request shouldn't be scheduled at this time. But if it is, it's | 1116 // Request shouldn't be scheduled at this time. But if it is, it's |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1217 void ProfileSyncService::OnEncryptionComplete() { | 1202 void ProfileSyncService::OnEncryptionComplete() { |
1218 DVLOG(1) << "Encryption complete"; | 1203 DVLOG(1) << "Encryption complete"; |
1219 if (encryption_pending_ && encrypt_everything_) { | 1204 if (encryption_pending_ && encrypt_everything_) { |
1220 encryption_pending_ = false; | 1205 encryption_pending_ = false; |
1221 // This is to nudge the integration tests when encryption is | 1206 // This is to nudge the integration tests when encryption is |
1222 // finished. | 1207 // finished. |
1223 NotifyObservers(); | 1208 NotifyObservers(); |
1224 } | 1209 } |
1225 } | 1210 } |
1226 | 1211 |
1227 void ProfileSyncService::OnMigrationNeededForTypes( | 1212 void ProfileSyncService::OnMigrationNeededForTypes(syncer::ModelTypeSet types) { |
1228 syncer::ModelTypeSet types) { | |
1229 DCHECK(backend_initialized_); | 1213 DCHECK(backend_initialized_); |
1230 DCHECK(data_type_manager_.get()); | 1214 DCHECK(data_type_manager_.get()); |
1231 | 1215 |
1232 // Migrator must be valid, because we don't sync until it is created and this | 1216 // Migrator must be valid, because we don't sync until it is created and this |
1233 // callback originates from a sync cycle. | 1217 // callback originates from a sync cycle. |
1234 migrator_->MigrateTypes(types); | 1218 migrator_->MigrateTypes(types); |
1235 } | 1219 } |
1236 | 1220 |
1237 void ProfileSyncService::OnActionableError(const SyncProtocolError& error) { | 1221 void ProfileSyncService::OnActionableError(const SyncProtocolError& error) { |
1238 last_actionable_error_ = error; | 1222 last_actionable_error_ = error; |
1239 DCHECK_NE(last_actionable_error_.action, | 1223 DCHECK_NE(last_actionable_error_.action, syncer::UNKNOWN_ACTION); |
1240 syncer::UNKNOWN_ACTION); | |
1241 switch (error.action) { | 1224 switch (error.action) { |
1242 case syncer::UPGRADE_CLIENT: | 1225 case syncer::UPGRADE_CLIENT: |
1243 case syncer::CLEAR_USER_DATA_AND_RESYNC: | 1226 case syncer::CLEAR_USER_DATA_AND_RESYNC: |
1244 case syncer::ENABLE_SYNC_ON_ACCOUNT: | 1227 case syncer::ENABLE_SYNC_ON_ACCOUNT: |
1245 case syncer::STOP_AND_RESTART_SYNC: | 1228 case syncer::STOP_AND_RESTART_SYNC: |
1246 // TODO(lipalani) : if setup in progress we want to display these | 1229 // TODO(lipalani) : if setup in progress we want to display these |
1247 // actions in the popup. The current experience might not be optimal for | 1230 // actions in the popup. The current experience might not be optimal for |
1248 // the user. We just dismiss the dialog. | 1231 // the user. We just dismiss the dialog. |
1249 if (startup_controller_->IsSetupInProgress()) { | 1232 if (startup_controller_->IsSetupInProgress()) { |
1250 RequestStop(CLEAR_DATA); | 1233 RequestStop(CLEAR_DATA); |
1251 expect_sync_configuration_aborted_ = true; | 1234 expect_sync_configuration_aborted_ = true; |
1252 } | 1235 } |
1253 // Trigger an unrecoverable error to stop syncing. | 1236 // Trigger an unrecoverable error to stop syncing. |
1254 OnInternalUnrecoverableError(FROM_HERE, | 1237 OnInternalUnrecoverableError(FROM_HERE, |
1255 last_actionable_error_.error_description, | 1238 last_actionable_error_.error_description, |
1256 true, | 1239 true, ERROR_REASON_ACTIONABLE_ERROR); |
1257 ERROR_REASON_ACTIONABLE_ERROR); | |
1258 break; | 1240 break; |
1259 case syncer::DISABLE_SYNC_ON_CLIENT: | 1241 case syncer::DISABLE_SYNC_ON_CLIENT: |
1260 if (error.error_type == syncer::NOT_MY_BIRTHDAY) { | 1242 if (error.error_type == syncer::NOT_MY_BIRTHDAY) { |
1261 UMA_HISTOGRAM_ENUMERATION("Sync.StopSource", syncer::BIRTHDAY_ERROR, | 1243 UMA_HISTOGRAM_ENUMERATION("Sync.StopSource", syncer::BIRTHDAY_ERROR, |
1262 syncer::STOP_SOURCE_LIMIT); | 1244 syncer::STOP_SOURCE_LIMIT); |
1263 } | 1245 } |
1264 RequestStop(CLEAR_DATA); | 1246 RequestStop(CLEAR_DATA); |
1265 #if !defined(OS_CHROMEOS) | 1247 #if !defined(OS_CHROMEOS) |
1266 // On every platform except ChromeOS, sign out the user after a dashboard | 1248 // On every platform except ChromeOS, sign out the user after a dashboard |
1267 // clear. | 1249 // clear. |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1338 configure_status_ = result.status; | 1320 configure_status_ = result.status; |
1339 data_type_status_table_ = result.data_type_status_table; | 1321 data_type_status_table_ = result.data_type_status_table; |
1340 | 1322 |
1341 // We should have cleared our cached passphrase before we get here (in | 1323 // We should have cleared our cached passphrase before we get here (in |
1342 // OnBackendInitialized()). | 1324 // OnBackendInitialized()). |
1343 DCHECK(cached_passphrase_.empty()); | 1325 DCHECK(cached_passphrase_.empty()); |
1344 | 1326 |
1345 if (!sync_configure_start_time_.is_null()) { | 1327 if (!sync_configure_start_time_.is_null()) { |
1346 if (result.status == DataTypeManager::OK) { | 1328 if (result.status == DataTypeManager::OK) { |
1347 base::Time sync_configure_stop_time = base::Time::Now(); | 1329 base::Time sync_configure_stop_time = base::Time::Now(); |
1348 base::TimeDelta delta = sync_configure_stop_time - | 1330 base::TimeDelta delta = |
1349 sync_configure_start_time_; | 1331 sync_configure_stop_time - sync_configure_start_time_; |
1350 if (is_first_time_sync_configure_) { | 1332 if (is_first_time_sync_configure_) { |
1351 UMA_HISTOGRAM_LONG_TIMES("Sync.ServiceInitialConfigureTime", delta); | 1333 UMA_HISTOGRAM_LONG_TIMES("Sync.ServiceInitialConfigureTime", delta); |
1352 } else { | 1334 } else { |
1353 UMA_HISTOGRAM_LONG_TIMES("Sync.ServiceSubsequentConfigureTime", | 1335 UMA_HISTOGRAM_LONG_TIMES("Sync.ServiceSubsequentConfigureTime", delta); |
1354 delta); | |
1355 } | 1336 } |
1356 } | 1337 } |
1357 sync_configure_start_time_ = base::Time(); | 1338 sync_configure_start_time_ = base::Time(); |
1358 } | 1339 } |
1359 | 1340 |
1360 // Notify listeners that configuration is done. | 1341 // Notify listeners that configuration is done. |
1361 FOR_EACH_OBSERVER(sync_driver::SyncServiceObserver, observers_, | 1342 FOR_EACH_OBSERVER(sync_driver::SyncServiceObserver, observers_, |
1362 OnSyncConfigurationCompleted()); | 1343 OnSyncConfigurationCompleted()); |
1363 | 1344 |
1364 DVLOG(1) << "PSS OnConfigureDone called with status: " << configure_status_; | 1345 DVLOG(1) << "PSS OnConfigureDone called with status: " << configure_status_; |
1365 // The possible status values: | 1346 // The possible status values: |
1366 // ABORT - Configuration was aborted. This is not an error, if | 1347 // ABORT - Configuration was aborted. This is not an error, if |
1367 // initiated by user. | 1348 // initiated by user. |
1368 // OK - Some or all types succeeded. | 1349 // OK - Some or all types succeeded. |
1369 // Everything else is an UnrecoverableError. So treat it as such. | 1350 // Everything else is an UnrecoverableError. So treat it as such. |
1370 | 1351 |
1371 // First handle the abort case. | 1352 // First handle the abort case. |
1372 if (configure_status_ == DataTypeManager::ABORTED && | 1353 if (configure_status_ == DataTypeManager::ABORTED && |
1373 expect_sync_configuration_aborted_) { | 1354 expect_sync_configuration_aborted_) { |
1374 DVLOG(0) << "ProfileSyncService::Observe Sync Configure aborted"; | 1355 DVLOG(0) << "ProfileSyncService::Observe Sync Configure aborted"; |
1375 expect_sync_configuration_aborted_ = false; | 1356 expect_sync_configuration_aborted_ = false; |
1376 return; | 1357 return; |
1377 } | 1358 } |
1378 | 1359 |
1379 // Handle unrecoverable error. | 1360 // Handle unrecoverable error. |
1380 if (configure_status_ != DataTypeManager::OK) { | 1361 if (configure_status_ != DataTypeManager::OK) { |
1381 // Something catastrophic had happened. We should only have one | 1362 // Something catastrophic had happened. We should only have one |
1382 // error representing it. | 1363 // error representing it. |
1383 syncer::SyncError error = | 1364 syncer::SyncError error = data_type_status_table_.GetUnrecoverableError(); |
1384 data_type_status_table_.GetUnrecoverableError(); | |
1385 DCHECK(error.IsSet()); | 1365 DCHECK(error.IsSet()); |
1386 std::string message = | 1366 std::string message = |
1387 "Sync configuration failed with status " + | 1367 "Sync configuration failed with status " + |
1388 DataTypeManager::ConfigureStatusToString(configure_status_) + | 1368 DataTypeManager::ConfigureStatusToString(configure_status_) + |
1389 " caused by " + | 1369 " caused by " + |
1390 syncer::ModelTypeSetToString( | 1370 syncer::ModelTypeSetToString( |
1391 data_type_status_table_.GetUnrecoverableErrorTypes()) + | 1371 data_type_status_table_.GetUnrecoverableErrorTypes()) + |
1392 ": " + error.message(); | 1372 ": " + error.message(); |
1393 LOG(ERROR) << "ProfileSyncService error: " << message; | 1373 LOG(ERROR) << "ProfileSyncService error: " << message; |
1394 OnInternalUnrecoverableError(error.location(), | 1374 OnInternalUnrecoverableError(error.location(), message, true, |
1395 message, | |
1396 true, | |
1397 ERROR_REASON_CONFIGURATION_FAILURE); | 1375 ERROR_REASON_CONFIGURATION_FAILURE); |
1398 return; | 1376 return; |
1399 } | 1377 } |
1400 | 1378 |
1401 DCHECK_EQ(DataTypeManager::OK, configure_status_); | 1379 DCHECK_EQ(DataTypeManager::OK, configure_status_); |
1402 | 1380 |
1403 // We should never get in a state where we have no encrypted datatypes | 1381 // We should never get in a state where we have no encrypted datatypes |
1404 // enabled, and yet we still think we require a passphrase for decryption. | 1382 // enabled, and yet we still think we require a passphrase for decryption. |
1405 DCHECK(!(IsPassphraseRequiredForDecryption() && | 1383 DCHECK( |
1406 !IsEncryptedDatatypeEnabled())); | 1384 !(IsPassphraseRequiredForDecryption() && !IsEncryptedDatatypeEnabled())); |
1407 | 1385 |
1408 // This must be done before we start syncing with the server to avoid | 1386 // This must be done before we start syncing with the server to avoid |
1409 // sending unencrypted data up on a first time sync. | 1387 // sending unencrypted data up on a first time sync. |
1410 if (encryption_pending_) | 1388 if (encryption_pending_) |
1411 backend_->EnableEncryptEverything(); | 1389 backend_->EnableEncryptEverything(); |
1412 NotifyObservers(); | 1390 NotifyObservers(); |
1413 | 1391 |
1414 if (migrator_.get() && | 1392 if (migrator_.get() && |
1415 migrator_->state() != browser_sync::BackendMigrator::IDLE) { | 1393 migrator_->state() != browser_sync::BackendMigrator::IDLE) { |
1416 // Migration in progress. Let the migrator know we just finished | 1394 // Migration in progress. Let the migrator know we just finished |
(...skipping 11 matching lines...) Expand all Loading... | |
1428 | 1406 |
1429 StartSyncingWithServer(); | 1407 StartSyncingWithServer(); |
1430 } | 1408 } |
1431 | 1409 |
1432 void ProfileSyncService::OnConfigureStart() { | 1410 void ProfileSyncService::OnConfigureStart() { |
1433 sync_configure_start_time_ = base::Time::Now(); | 1411 sync_configure_start_time_ = base::Time::Now(); |
1434 NotifyObservers(); | 1412 NotifyObservers(); |
1435 } | 1413 } |
1436 | 1414 |
1437 ProfileSyncService::SyncStatusSummary | 1415 ProfileSyncService::SyncStatusSummary |
1438 ProfileSyncService::QuerySyncStatusSummary() { | 1416 ProfileSyncService::QuerySyncStatusSummary() { |
1439 if (HasUnrecoverableError()) { | 1417 if (HasUnrecoverableError()) { |
1440 return UNRECOVERABLE_ERROR; | 1418 return UNRECOVERABLE_ERROR; |
1441 } else if (!backend_) { | 1419 } else if (!backend_) { |
1442 return NOT_ENABLED; | 1420 return NOT_ENABLED; |
1443 } else if (backend_.get() && !IsFirstSetupComplete()) { | 1421 } else if (backend_.get() && !IsFirstSetupComplete()) { |
1444 return SETUP_INCOMPLETE; | 1422 return SETUP_INCOMPLETE; |
1445 } else if (backend_ && IsFirstSetupComplete() && data_type_manager_ && | 1423 } else if (backend_ && IsFirstSetupComplete() && data_type_manager_ && |
1446 data_type_manager_->state() == DataTypeManager::STOPPED) { | 1424 data_type_manager_->state() == DataTypeManager::STOPPED) { |
1447 return DATATYPES_NOT_INITIALIZED; | 1425 return DATATYPES_NOT_INITIALIZED; |
1448 } else if (IsSyncActive()) { | 1426 } else if (IsSyncActive()) { |
1449 return INITIALIZED; | 1427 return INITIALIZED; |
1450 } | 1428 } |
1451 return UNKNOWN_ERROR; | 1429 return UNKNOWN_ERROR; |
1452 } | 1430 } |
1453 | 1431 |
1454 std::string ProfileSyncService::QuerySyncStatusSummaryString() { | 1432 std::string ProfileSyncService::QuerySyncStatusSummaryString() { |
1455 SyncStatusSummary status = QuerySyncStatusSummary(); | 1433 SyncStatusSummary status = QuerySyncStatusSummary(); |
1456 | 1434 |
1457 std::string config_status_str = | 1435 std::string config_status_str = |
1458 configure_status_ != DataTypeManager::UNKNOWN ? | 1436 configure_status_ != DataTypeManager::UNKNOWN |
1459 DataTypeManager::ConfigureStatusToString(configure_status_) : ""; | 1437 ? DataTypeManager::ConfigureStatusToString(configure_status_) |
1438 : ""; | |
1460 | 1439 |
1461 switch (status) { | 1440 switch (status) { |
1462 case UNRECOVERABLE_ERROR: | 1441 case UNRECOVERABLE_ERROR: |
1463 return "Unrecoverable error detected"; | 1442 return "Unrecoverable error detected"; |
1464 case NOT_ENABLED: | 1443 case NOT_ENABLED: |
1465 return "Syncing not enabled"; | 1444 return "Syncing not enabled"; |
1466 case SETUP_INCOMPLETE: | 1445 case SETUP_INCOMPLETE: |
1467 return "First time sync setup incomplete"; | 1446 return "First time sync setup incomplete"; |
1468 case DATATYPES_NOT_INITIALIZED: | 1447 case DATATYPES_NOT_INITIALIZED: |
1469 return "Datatypes not fully initialized"; | 1448 return "Datatypes not fully initialized"; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1562 | 1541 |
1563 const syncer::Experiments& ProfileSyncService::current_experiments() const { | 1542 const syncer::Experiments& ProfileSyncService::current_experiments() const { |
1564 return current_experiments_; | 1543 return current_experiments_; |
1565 } | 1544 } |
1566 | 1545 |
1567 bool ProfileSyncService::HasUnrecoverableError() const { | 1546 bool ProfileSyncService::HasUnrecoverableError() const { |
1568 return unrecoverable_error_reason_ != ERROR_REASON_UNSET; | 1547 return unrecoverable_error_reason_ != ERROR_REASON_UNSET; |
1569 } | 1548 } |
1570 | 1549 |
1571 bool ProfileSyncService::IsPassphraseRequired() const { | 1550 bool ProfileSyncService::IsPassphraseRequired() const { |
1572 return passphrase_required_reason_ != | 1551 return passphrase_required_reason_ != syncer::REASON_PASSPHRASE_NOT_REQUIRED; |
1573 syncer::REASON_PASSPHRASE_NOT_REQUIRED; | |
1574 } | 1552 } |
1575 | 1553 |
1576 bool ProfileSyncService::IsPassphraseRequiredForDecryption() const { | 1554 bool ProfileSyncService::IsPassphraseRequiredForDecryption() const { |
1577 // If there is an encrypted datatype enabled and we don't have the proper | 1555 // If there is an encrypted datatype enabled and we don't have the proper |
1578 // passphrase, we must prompt the user for a passphrase. The only way for the | 1556 // passphrase, we must prompt the user for a passphrase. The only way for the |
1579 // user to avoid entering their passphrase is to disable the encrypted types. | 1557 // user to avoid entering their passphrase is to disable the encrypted types. |
1580 return IsEncryptedDatatypeEnabled() && IsPassphraseRequired(); | 1558 return IsEncryptedDatatypeEnabled() && IsPassphraseRequired(); |
1581 } | 1559 } |
1582 | 1560 |
1583 base::string16 ProfileSyncService::GetLastSyncedTimeString() const { | 1561 base::string16 ProfileSyncService::GetLastSyncedTimeString() const { |
1584 const base::Time last_synced_time = sync_prefs_.GetLastSyncedTime(); | 1562 const base::Time last_synced_time = sync_prefs_.GetLastSyncedTime(); |
1585 if (last_synced_time.is_null()) | 1563 if (last_synced_time.is_null()) |
1586 return l10n_util::GetStringUTF16(IDS_SYNC_TIME_NEVER); | 1564 return l10n_util::GetStringUTF16(IDS_SYNC_TIME_NEVER); |
1587 | 1565 |
1588 base::TimeDelta time_since_last_sync = base::Time::Now() - last_synced_time; | 1566 base::TimeDelta time_since_last_sync = base::Time::Now() - last_synced_time; |
1589 | 1567 |
1590 if (time_since_last_sync < base::TimeDelta::FromMinutes(1)) | 1568 if (time_since_last_sync < base::TimeDelta::FromMinutes(1)) |
1591 return l10n_util::GetStringUTF16(IDS_SYNC_TIME_JUST_NOW); | 1569 return l10n_util::GetStringUTF16(IDS_SYNC_TIME_JUST_NOW); |
1592 | 1570 |
1593 return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_ELAPSED, | 1571 return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_ELAPSED, |
1594 ui::TimeFormat::LENGTH_SHORT, | 1572 ui::TimeFormat::LENGTH_SHORT, |
1595 time_since_last_sync); | 1573 time_since_last_sync); |
1596 } | 1574 } |
1597 | 1575 |
1598 void ProfileSyncService::UpdateSelectedTypesHistogram( | 1576 void ProfileSyncService::UpdateSelectedTypesHistogram( |
1599 bool sync_everything, const syncer::ModelTypeSet chosen_types) const { | 1577 bool sync_everything, |
1578 const syncer::ModelTypeSet chosen_types) const { | |
1600 if (!IsFirstSetupComplete() || | 1579 if (!IsFirstSetupComplete() || |
1601 sync_everything != sync_prefs_.HasKeepEverythingSynced()) { | 1580 sync_everything != sync_prefs_.HasKeepEverythingSynced()) { |
1602 UMA_HISTOGRAM_BOOLEAN("Sync.SyncEverything", sync_everything); | 1581 UMA_HISTOGRAM_BOOLEAN("Sync.SyncEverything", sync_everything); |
1603 } | 1582 } |
1604 | 1583 |
1605 // Only log the data types that are shown in the sync settings ui. | 1584 // Only log the data types that are shown in the sync settings ui. |
1606 // Note: the order of these types must match the ordering of | 1585 // Note: the order of these types must match the ordering of |
1607 // the respective types in ModelType | 1586 // the respective types in ModelType |
1608 const sync_driver::user_selectable_type::UserSelectableSyncType | 1587 const sync_driver::user_selectable_type::UserSelectableSyncType |
1609 user_selectable_types[] = { | 1588 user_selectable_types[] = { |
1610 sync_driver::user_selectable_type::BOOKMARKS, | 1589 sync_driver::user_selectable_type::BOOKMARKS, |
1611 sync_driver::user_selectable_type::PREFERENCES, | 1590 sync_driver::user_selectable_type::PREFERENCES, |
1612 sync_driver::user_selectable_type::PASSWORDS, | 1591 sync_driver::user_selectable_type::PASSWORDS, |
1613 sync_driver::user_selectable_type::AUTOFILL, | 1592 sync_driver::user_selectable_type::AUTOFILL, |
1614 sync_driver::user_selectable_type::THEMES, | 1593 sync_driver::user_selectable_type::THEMES, |
1615 sync_driver::user_selectable_type::TYPED_URLS, | 1594 sync_driver::user_selectable_type::TYPED_URLS, |
1616 sync_driver::user_selectable_type::EXTENSIONS, | 1595 sync_driver::user_selectable_type::EXTENSIONS, |
1617 sync_driver::user_selectable_type::APPS, | 1596 sync_driver::user_selectable_type::APPS, |
1618 sync_driver::user_selectable_type::PROXY_TABS, | 1597 sync_driver::user_selectable_type::PROXY_TABS, |
1619 }; | 1598 }; |
1620 | 1599 |
1621 static_assert(38 == syncer::MODEL_TYPE_COUNT, | 1600 static_assert(38 == syncer::MODEL_TYPE_COUNT, |
1622 "custom config histogram must be updated"); | 1601 "custom config histogram must be updated"); |
1623 | 1602 |
1624 if (!sync_everything) { | 1603 if (!sync_everything) { |
1625 const syncer::ModelTypeSet current_types = GetPreferredDataTypes(); | 1604 const syncer::ModelTypeSet current_types = GetPreferredDataTypes(); |
1626 | 1605 |
1627 syncer::ModelTypeSet type_set = syncer::UserSelectableTypes(); | 1606 syncer::ModelTypeSet type_set = syncer::UserSelectableTypes(); |
1628 syncer::ModelTypeSet::Iterator it = type_set.First(); | 1607 syncer::ModelTypeSet::Iterator it = type_set.First(); |
1629 | 1608 |
1630 DCHECK_EQ(arraysize(user_selectable_types), type_set.Size()); | 1609 DCHECK_EQ(arraysize(user_selectable_types), type_set.Size()); |
1631 | 1610 |
1632 for (size_t i = 0; i < arraysize(user_selectable_types) && it.Good(); | 1611 for (size_t i = 0; i < arraysize(user_selectable_types) && it.Good(); |
1633 ++i, it.Inc()) { | 1612 ++i, it.Inc()) { |
1634 const syncer::ModelType type = it.Get(); | 1613 const syncer::ModelType type = it.Get(); |
1635 if (chosen_types.Has(type) && | 1614 if (chosen_types.Has(type) && |
1636 (!IsFirstSetupComplete() || !current_types.Has(type))) { | 1615 (!IsFirstSetupComplete() || !current_types.Has(type))) { |
1637 // Selected type has changed - log it. | 1616 // Selected type has changed - log it. |
1638 UMA_HISTOGRAM_ENUMERATION( | 1617 UMA_HISTOGRAM_ENUMERATION( |
1639 "Sync.CustomSync", | 1618 "Sync.CustomSync", user_selectable_types[i], |
1640 user_selectable_types[i], | |
1641 sync_driver::user_selectable_type::SELECTABLE_DATATYPE_COUNT + 1); | 1619 sync_driver::user_selectable_type::SELECTABLE_DATATYPE_COUNT + 1); |
1642 } | 1620 } |
1643 } | 1621 } |
1644 } | 1622 } |
1645 } | 1623 } |
1646 | 1624 |
1647 #if defined(OS_CHROMEOS) | 1625 #if defined(OS_CHROMEOS) |
1648 void ProfileSyncService::RefreshSpareBootstrapToken( | 1626 void ProfileSyncService::RefreshSpareBootstrapToken( |
1649 const std::string& passphrase) { | 1627 const std::string& passphrase) { |
1650 sync_driver::SystemEncryptor encryptor; | 1628 sync_driver::SystemEncryptor encryptor; |
(...skipping 23 matching lines...) Expand all Loading... | |
1674 UpdateSelectedTypesHistogram(sync_everything, chosen_types); | 1652 UpdateSelectedTypesHistogram(sync_everything, chosen_types); |
1675 sync_prefs_.SetKeepEverythingSynced(sync_everything); | 1653 sync_prefs_.SetKeepEverythingSynced(sync_everything); |
1676 | 1654 |
1677 if (data_type_manager_) | 1655 if (data_type_manager_) |
1678 data_type_manager_->ResetDataTypeErrors(); | 1656 data_type_manager_->ResetDataTypeErrors(); |
1679 ChangePreferredDataTypes(chosen_types); | 1657 ChangePreferredDataTypes(chosen_types); |
1680 } | 1658 } |
1681 | 1659 |
1682 void ProfileSyncService::ChangePreferredDataTypes( | 1660 void ProfileSyncService::ChangePreferredDataTypes( |
1683 syncer::ModelTypeSet preferred_types) { | 1661 syncer::ModelTypeSet preferred_types) { |
1684 | |
1685 DVLOG(1) << "ChangePreferredDataTypes invoked"; | 1662 DVLOG(1) << "ChangePreferredDataTypes invoked"; |
1686 const syncer::ModelTypeSet registered_types = GetRegisteredDataTypes(); | 1663 const syncer::ModelTypeSet registered_types = GetRegisteredDataTypes(); |
1687 // Will only enable those types that are registered and preferred. | 1664 // Will only enable those types that are registered and preferred. |
1688 sync_prefs_.SetPreferredDataTypes(registered_types, preferred_types); | 1665 sync_prefs_.SetPreferredDataTypes(registered_types, preferred_types); |
1689 | 1666 |
1690 // Now reconfigure the DTM. | 1667 // Now reconfigure the DTM. |
1691 ReconfigureDatatypeManager(); | 1668 ReconfigureDatatypeManager(); |
1692 } | 1669 } |
1693 | 1670 |
1694 syncer::ModelTypeSet ProfileSyncService::GetActiveDataTypes() const { | 1671 syncer::ModelTypeSet ProfileSyncService::GetActiveDataTypes() const { |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1826 } | 1803 } |
1827 | 1804 |
1828 bool ProfileSyncService::HasUnsyncedItems() const { | 1805 bool ProfileSyncService::HasUnsyncedItems() const { |
1829 if (HasSyncingBackend() && backend_initialized_) { | 1806 if (HasSyncingBackend() && backend_initialized_) { |
1830 return backend_->HasUnsyncedItems(); | 1807 return backend_->HasUnsyncedItems(); |
1831 } | 1808 } |
1832 NOTREACHED(); | 1809 NOTREACHED(); |
1833 return false; | 1810 return false; |
1834 } | 1811 } |
1835 | 1812 |
1836 browser_sync::BackendMigrator* | 1813 browser_sync::BackendMigrator* ProfileSyncService::GetBackendMigratorForTest() { |
1837 ProfileSyncService::GetBackendMigratorForTest() { | |
1838 return migrator_.get(); | 1814 return migrator_.get(); |
1839 } | 1815 } |
1840 | 1816 |
1841 void ProfileSyncService::GetModelSafeRoutingInfo( | 1817 void ProfileSyncService::GetModelSafeRoutingInfo( |
1842 syncer::ModelSafeRoutingInfo* out) const { | 1818 syncer::ModelSafeRoutingInfo* out) const { |
1843 if (backend_.get() && backend_initialized_) { | 1819 if (backend_.get() && backend_initialized_) { |
1844 backend_->GetModelSafeRoutingInfo(out); | 1820 backend_->GetModelSafeRoutingInfo(out); |
1845 } else { | 1821 } else { |
1846 NOTREACHED(); | 1822 NOTREACHED(); |
1847 } | 1823 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1883 result->Append(std::move(type_status_header)); | 1859 result->Append(std::move(type_status_header)); |
1884 | 1860 |
1885 std::unique_ptr<base::DictionaryValue> type_status; | 1861 std::unique_ptr<base::DictionaryValue> type_status; |
1886 for (ModelTypeSet::Iterator it = registered.First(); it.Good(); it.Inc()) { | 1862 for (ModelTypeSet::Iterator it = registered.First(); it.Good(); it.Inc()) { |
1887 ModelType type = it.Get(); | 1863 ModelType type = it.Get(); |
1888 | 1864 |
1889 type_status.reset(new base::DictionaryValue()); | 1865 type_status.reset(new base::DictionaryValue()); |
1890 type_status->SetString("name", ModelTypeToString(type)); | 1866 type_status->SetString("name", ModelTypeToString(type)); |
1891 | 1867 |
1892 if (error_map.find(type) != error_map.end()) { | 1868 if (error_map.find(type) != error_map.end()) { |
1893 const syncer::SyncError &error = error_map.find(type)->second; | 1869 const syncer::SyncError& error = error_map.find(type)->second; |
1894 DCHECK(error.IsSet()); | 1870 DCHECK(error.IsSet()); |
1895 switch (error.GetSeverity()) { | 1871 switch (error.GetSeverity()) { |
1896 case syncer::SyncError::SYNC_ERROR_SEVERITY_ERROR: { | 1872 case syncer::SyncError::SYNC_ERROR_SEVERITY_ERROR: { |
1897 std::string error_text = "Error: " + error.location().ToString() + | 1873 std::string error_text = "Error: " + error.location().ToString() + |
1898 ", " + error.GetMessagePrefix() + error.message(); | 1874 ", " + error.GetMessagePrefix() + |
1899 type_status->SetString("status", "error"); | 1875 error.message(); |
1900 type_status->SetString("value", error_text); | 1876 type_status->SetString("status", "error"); |
1901 } | 1877 type_status->SetString("value", error_text); |
1902 break; | 1878 } break; |
skym
2016/09/16 18:33:09
Whaaaat? This is bizarre, and why is cl format put
maxbogue
2016/09/16 19:13:28
I've removed the braces and just done the error te
| |
1903 case syncer::SyncError::SYNC_ERROR_SEVERITY_INFO: | 1879 case syncer::SyncError::SYNC_ERROR_SEVERITY_INFO: |
1904 type_status->SetString("status", "disabled"); | 1880 type_status->SetString("status", "disabled"); |
1905 type_status->SetString("value", error.message()); | 1881 type_status->SetString("value", error.message()); |
1906 break; | 1882 break; |
1907 default: | 1883 default: |
1908 NOTREACHED() << "Unexpected error severity."; | 1884 NOTREACHED() << "Unexpected error severity."; |
1909 break; | 1885 break; |
1910 } | 1886 } |
1911 } else if (syncer::IsProxyType(type) && passive_types.Has(type)) { | 1887 } else if (syncer::IsProxyType(type) && passive_types.Has(type)) { |
1912 // Show a proxy type in "ok" state unless it is disabled by user. | 1888 // Show a proxy type in "ok" state unless it is disabled by user. |
1913 DCHECK(!throttled_types.Has(type)); | 1889 DCHECK(!throttled_types.Has(type)); |
1914 type_status->SetString("status", "ok"); | 1890 type_status->SetString("status", "ok"); |
1915 type_status->SetString("value", "Passive"); | 1891 type_status->SetString("value", "Passive"); |
1916 } else if (throttled_types.Has(type) && passive_types.Has(type)) { | 1892 } else if (throttled_types.Has(type) && passive_types.Has(type)) { |
1917 type_status->SetString("status", "warning"); | 1893 type_status->SetString("status", "warning"); |
1918 type_status->SetString("value", "Passive, Throttled"); | 1894 type_status->SetString("value", "Passive, Throttled"); |
1919 } else if (passive_types.Has(type)) { | 1895 } else if (passive_types.Has(type)) { |
1920 type_status->SetString("status", "warning"); | 1896 type_status->SetString("status", "warning"); |
1921 type_status->SetString("value", "Passive"); | 1897 type_status->SetString("value", "Passive"); |
1922 } else if (throttled_types.Has(type)) { | 1898 } else if (throttled_types.Has(type)) { |
1923 type_status->SetString("status", "warning"); | 1899 type_status->SetString("status", "warning"); |
1924 type_status->SetString("value", "Throttled"); | 1900 type_status->SetString("value", "Throttled"); |
1925 } else if (active_types.Has(type)) { | 1901 } else if (active_types.Has(type)) { |
1926 type_status->SetString("status", "ok"); | 1902 type_status->SetString("status", "ok"); |
1927 type_status->SetString("value", "Active: " + | 1903 type_status->SetString( |
1928 ModelSafeGroupToString(routing_info[type])); | 1904 "value", "Active: " + ModelSafeGroupToString(routing_info[type])); |
1929 } else { | 1905 } else { |
1930 type_status->SetString("status", "warning"); | 1906 type_status->SetString("status", "warning"); |
1931 type_status->SetString("value", "Disabled by User"); | 1907 type_status->SetString("value", "Disabled by User"); |
1932 } | 1908 } |
1933 | 1909 |
1934 int live_count = detailed_status.num_entries_by_type[type] - | 1910 int live_count = detailed_status.num_entries_by_type[type] - |
1935 detailed_status.num_to_delete_entries_by_type[type]; | 1911 detailed_status.num_to_delete_entries_by_type[type]; |
1936 type_status->SetInteger("num_entries", | 1912 type_status->SetInteger("num_entries", |
1937 detailed_status.num_entries_by_type[type]); | 1913 detailed_status.num_entries_by_type[type]); |
1938 type_status->SetInteger("num_live", live_count); | 1914 type_status->SetInteger("num_live", live_count); |
1939 | 1915 |
1940 result->Append(std::move(type_status)); | 1916 result->Append(std::move(type_status)); |
1941 } | 1917 } |
1942 return result.release(); | 1918 return result.release(); |
1943 } | 1919 } |
1944 | 1920 |
1945 void ProfileSyncService::ConsumeCachedPassphraseIfPossible() { | 1921 void ProfileSyncService::ConsumeCachedPassphraseIfPossible() { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1990 token_receive_time_ = base::Time(); | 1966 token_receive_time_ = base::Time(); |
1991 next_token_request_time_ = base::Time(); | 1967 next_token_request_time_ = base::Time(); |
1992 access_token_request_ = | 1968 access_token_request_ = |
1993 oauth2_token_service_->StartRequest(account_id, oauth2_scopes, this); | 1969 oauth2_token_service_->StartRequest(account_id, oauth2_scopes, this); |
1994 } | 1970 } |
1995 | 1971 |
1996 void ProfileSyncService::SetEncryptionPassphrase(const std::string& passphrase, | 1972 void ProfileSyncService::SetEncryptionPassphrase(const std::string& passphrase, |
1997 PassphraseType type) { | 1973 PassphraseType type) { |
1998 // This should only be called when the backend has been initialized. | 1974 // This should only be called when the backend has been initialized. |
1999 DCHECK(IsBackendInitialized()); | 1975 DCHECK(IsBackendInitialized()); |
2000 DCHECK(!(type == IMPLICIT && IsUsingSecondaryPassphrase())) << | 1976 DCHECK(!(type == IMPLICIT && IsUsingSecondaryPassphrase())) |
2001 "Data is already encrypted using an explicit passphrase"; | 1977 << "Data is already encrypted using an explicit passphrase"; |
2002 DCHECK(!(type == EXPLICIT && | 1978 DCHECK(!(type == EXPLICIT && |
2003 passphrase_required_reason_ == syncer::REASON_DECRYPTION)) << | 1979 passphrase_required_reason_ == syncer::REASON_DECRYPTION)) |
2004 "Can not set explicit passphrase when decryption is needed."; | 1980 << "Can not set explicit passphrase when decryption is needed."; |
2005 | 1981 |
2006 DVLOG(1) << "Setting " << (type == EXPLICIT ? "explicit" : "implicit") | 1982 DVLOG(1) << "Setting " << (type == EXPLICIT ? "explicit" : "implicit") |
2007 << " passphrase for encryption."; | 1983 << " passphrase for encryption."; |
2008 if (passphrase_required_reason_ == syncer::REASON_ENCRYPTION) { | 1984 if (passphrase_required_reason_ == syncer::REASON_ENCRYPTION) { |
2009 // REASON_ENCRYPTION implies that the cryptographer does not have pending | 1985 // REASON_ENCRYPTION implies that the cryptographer does not have pending |
2010 // keys. Hence, as long as we're not trying to do an invalid passphrase | 1986 // keys. Hence, as long as we're not trying to do an invalid passphrase |
2011 // change (e.g. explicit -> explicit or explicit -> implicit), we know this | 1987 // change (e.g. explicit -> explicit or explicit -> implicit), we know this |
2012 // will succeed. If for some reason a new encryption key arrives via | 1988 // will succeed. If for some reason a new encryption key arrives via |
2013 // sync later, the SBH will trigger another OnPassphraseRequired(). | 1989 // sync later, the SBH will trigger another OnPassphraseRequired(). |
2014 passphrase_required_reason_ = syncer::REASON_PASSPHRASE_NOT_REQUIRED; | 1990 passphrase_required_reason_ = syncer::REASON_PASSPHRASE_NOT_REQUIRED; |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2359 DVLOG(0) << "ConfigureDataTypeManager not invoked because backend is not " | 2335 DVLOG(0) << "ConfigureDataTypeManager not invoked because backend is not " |
2360 << "initialized"; | 2336 << "initialized"; |
2361 } | 2337 } |
2362 } | 2338 } |
2363 | 2339 |
2364 syncer::ModelTypeSet ProfileSyncService::GetDataTypesFromPreferenceProviders() | 2340 syncer::ModelTypeSet ProfileSyncService::GetDataTypesFromPreferenceProviders() |
2365 const { | 2341 const { |
2366 syncer::ModelTypeSet types; | 2342 syncer::ModelTypeSet types; |
2367 for (std::set<SyncTypePreferenceProvider*>::const_iterator it = | 2343 for (std::set<SyncTypePreferenceProvider*>::const_iterator it = |
2368 preference_providers_.begin(); | 2344 preference_providers_.begin(); |
2369 it != preference_providers_.end(); | 2345 it != preference_providers_.end(); ++it) { |
2370 ++it) { | |
2371 types.PutAll((*it)->GetPreferredDataTypes()); | 2346 types.PutAll((*it)->GetPreferredDataTypes()); |
2372 } | 2347 } |
2373 return types; | 2348 return types; |
2374 } | 2349 } |
2375 | 2350 |
2376 const DataTypeStatusTable& ProfileSyncService::data_type_status_table() | 2351 const DataTypeStatusTable& ProfileSyncService::data_type_status_table() const { |
2377 const { | |
2378 return data_type_status_table_; | 2352 return data_type_status_table_; |
2379 } | 2353 } |
2380 | 2354 |
2381 void ProfileSyncService::OnInternalUnrecoverableError( | 2355 void ProfileSyncService::OnInternalUnrecoverableError( |
2382 const tracked_objects::Location& from_here, | 2356 const tracked_objects::Location& from_here, |
2383 const std::string& message, | 2357 const std::string& message, |
2384 bool delete_sync_database, | 2358 bool delete_sync_database, |
2385 UnrecoverableErrorReason reason) { | 2359 UnrecoverableErrorReason reason) { |
2386 DCHECK(!HasUnrecoverableError()); | 2360 DCHECK(!HasUnrecoverableError()); |
2387 unrecoverable_error_reason_ = reason; | 2361 unrecoverable_error_reason_ = reason; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2463 return NULL; | 2437 return NULL; |
2464 } | 2438 } |
2465 } | 2439 } |
2466 | 2440 |
2467 void ProfileSyncService::RefreshTypesForTest(syncer::ModelTypeSet types) { | 2441 void ProfileSyncService::RefreshTypesForTest(syncer::ModelTypeSet types) { |
2468 if (backend_initialized_) | 2442 if (backend_initialized_) |
2469 backend_->RefreshTypesForTest(types); | 2443 backend_->RefreshTypesForTest(types); |
2470 } | 2444 } |
2471 | 2445 |
2472 void ProfileSyncService::RemoveClientFromServer() const { | 2446 void ProfileSyncService::RemoveClientFromServer() const { |
2473 if (!backend_initialized_) return; | 2447 if (!backend_initialized_) |
2448 return; | |
2474 const std::string cache_guid = local_device_->GetLocalSyncCacheGUID(); | 2449 const std::string cache_guid = local_device_->GetLocalSyncCacheGUID(); |
2475 std::string birthday; | 2450 std::string birthday; |
2476 syncer::UserShare* user_share = GetUserShare(); | 2451 syncer::UserShare* user_share = GetUserShare(); |
2477 if (user_share && user_share->directory.get()) { | 2452 if (user_share && user_share->directory.get()) { |
2478 birthday = user_share->directory->store_birthday(); | 2453 birthday = user_share->directory->store_birthday(); |
2479 } | 2454 } |
2480 if (!access_token_.empty() && !cache_guid.empty() && !birthday.empty()) { | 2455 if (!access_token_.empty() && !cache_guid.empty() && !birthday.empty()) { |
2481 sync_stopped_reporter_->ReportSyncStopped( | 2456 sync_stopped_reporter_->ReportSyncStopped(access_token_, cache_guid, |
2482 access_token_, cache_guid, birthday); | 2457 birthday); |
2483 } | 2458 } |
2484 } | 2459 } |
2485 | 2460 |
2486 void ProfileSyncService::OnMemoryPressure( | 2461 void ProfileSyncService::OnMemoryPressure( |
2487 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { | 2462 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { |
2488 if (memory_pressure_level == | 2463 if (memory_pressure_level == |
2489 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) { | 2464 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) { |
2490 sync_prefs_.SetMemoryPressureWarningCount( | 2465 sync_prefs_.SetMemoryPressureWarningCount( |
2491 sync_prefs_.GetMemoryPressureWarningCount() + 1); | 2466 sync_prefs_.GetMemoryPressureWarningCount() + 1); |
2492 } | 2467 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2531 if (--outstanding_setup_in_progress_handles_ != 0) | 2506 if (--outstanding_setup_in_progress_handles_ != 0) |
2532 return; | 2507 return; |
2533 | 2508 |
2534 DCHECK(startup_controller_->IsSetupInProgress()); | 2509 DCHECK(startup_controller_->IsSetupInProgress()); |
2535 startup_controller_->SetSetupInProgress(false); | 2510 startup_controller_->SetSetupInProgress(false); |
2536 | 2511 |
2537 if (IsBackendInitialized()) | 2512 if (IsBackendInitialized()) |
2538 ReconfigureDatatypeManager(); | 2513 ReconfigureDatatypeManager(); |
2539 NotifyObservers(); | 2514 NotifyObservers(); |
2540 } | 2515 } |
OLD | NEW |