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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 #include "chrome/common/time_format.h" | 54 #include "chrome/common/time_format.h" |
55 #include "chrome/common/url_constants.h" | 55 #include "chrome/common/url_constants.h" |
56 #include "content/public/browser/notification_details.h" | 56 #include "content/public/browser/notification_details.h" |
57 #include "content/public/browser/notification_source.h" | 57 #include "content/public/browser/notification_source.h" |
58 #include "grit/generated_resources.h" | 58 #include "grit/generated_resources.h" |
59 #include "net/cookies/cookie_monster.h" | 59 #include "net/cookies/cookie_monster.h" |
60 #include "sync/internal_api/configure_reason.h" | 60 #include "sync/internal_api/configure_reason.h" |
61 #include "sync/js/js_arg_list.h" | 61 #include "sync/js/js_arg_list.h" |
62 #include "sync/js/js_event_details.h" | 62 #include "sync/js/js_event_details.h" |
63 #include "sync/util/cryptographer.h" | 63 #include "sync/util/cryptographer.h" |
| 64 #include "sync/util/experiments.h" |
64 #include "ui/base/l10n/l10n_util.h" | 65 #include "ui/base/l10n/l10n_util.h" |
65 | 66 |
66 using browser_sync::ChangeProcessor; | 67 using browser_sync::ChangeProcessor; |
67 using browser_sync::DataTypeController; | 68 using browser_sync::DataTypeController; |
68 using browser_sync::DataTypeManager; | 69 using browser_sync::DataTypeManager; |
69 using browser_sync::JsBackend; | 70 using browser_sync::JsBackend; |
70 using browser_sync::JsController; | 71 using browser_sync::JsController; |
71 using browser_sync::JsEventDetails; | 72 using browser_sync::JsEventDetails; |
72 using browser_sync::JsEventHandler; | 73 using browser_sync::JsEventHandler; |
73 using browser_sync::SyncBackendHost; | 74 using browser_sync::SyncBackendHost; |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 // server time as last reported by CheckServerReachable, so we don't have to | 701 // server time as last reported by CheckServerReachable, so we don't have to |
701 // rely on the local clock, which may be off significantly. | 702 // rely on the local clock, which may be off significantly. |
702 MessageLoop::current()->PostTask(FROM_HERE, | 703 MessageLoop::current()->PostTask(FROM_HERE, |
703 base::Bind(&browser_sync::SessionModelAssociator::DeleteStaleSessions, | 704 base::Bind(&browser_sync::SessionModelAssociator::DeleteStaleSessions, |
704 GetSessionModelAssociator()->AsWeakPtr())); | 705 GetSessionModelAssociator()->AsWeakPtr())); |
705 } | 706 } |
706 DVLOG(2) << "Notifying observers sync cycle completed"; | 707 DVLOG(2) << "Notifying observers sync cycle completed"; |
707 NotifyObservers(); | 708 NotifyObservers(); |
708 } | 709 } |
709 | 710 |
710 // TODO(sync): eventually support removing datatypes too. | 711 void ProfileSyncService::OnExperimentsChanged( |
711 void ProfileSyncService::OnDataTypesChanged( | 712 const browser_sync::Experiments& experiments) { |
712 syncable::ModelTypeSet to_add) { | 713 if (current_experiments.Matches(experiments)) |
| 714 return; |
| 715 |
713 // If this is a first time sync for a client, this will be called before | 716 // If this is a first time sync for a client, this will be called before |
714 // OnBackendInitialized() to ensure the new datatypes are available at sync | 717 // OnBackendInitialized() to ensure the new datatypes are available at sync |
715 // setup. As a result, the migrator won't exist yet. This is fine because for | 718 // setup. As a result, the migrator won't exist yet. This is fine because for |
716 // first time sync cases we're only concerned with making the datatype | 719 // first time sync cases we're only concerned with making the datatype |
717 // available. | 720 // available. |
718 if (migrator_.get() && | 721 if (migrator_.get() && |
719 migrator_->state() != browser_sync::BackendMigrator::IDLE) { | 722 migrator_->state() != browser_sync::BackendMigrator::IDLE) { |
720 DVLOG(1) << "Dropping OnDataTypesChanged due to migrator busy."; | 723 DVLOG(1) << "Dropping OnExperimentsChanged due to migrator busy."; |
721 return; | 724 return; |
722 } | 725 } |
723 | 726 |
724 DVLOG(2) << "OnDataTypesChanged called with types: " | |
725 << syncable::ModelTypeSetToString(to_add); | |
726 | |
727 const syncable::ModelTypeSet registered_types = GetRegisteredDataTypes(); | 727 const syncable::ModelTypeSet registered_types = GetRegisteredDataTypes(); |
728 | 728 syncable::ModelTypeSet to_add; |
| 729 if (experiments.sync_tabs) |
| 730 to_add.Put(syncable::SESSIONS); |
729 const syncable::ModelTypeSet to_register = | 731 const syncable::ModelTypeSet to_register = |
730 Difference(to_add, registered_types); | 732 Difference(to_add, registered_types); |
731 | 733 DVLOG(2) << "OnExperimentsChanged called with types: " |
| 734 << syncable::ModelTypeSetToString(to_add); |
732 DVLOG(2) << "Enabling types: " << syncable::ModelTypeSetToString(to_register); | 735 DVLOG(2) << "Enabling types: " << syncable::ModelTypeSetToString(to_register); |
733 | 736 |
734 for (syncable::ModelTypeSet::Iterator it = to_register.First(); | 737 for (syncable::ModelTypeSet::Iterator it = to_register.First(); |
735 it.Good(); it.Inc()) { | 738 it.Good(); it.Inc()) { |
736 // Received notice to enable experimental type. Check if the type is | 739 // Received notice to enable experimental type. Check if the type is |
737 // registered, and if not register a new datatype controller. | 740 // registered, and if not register a new datatype controller. |
738 RegisterNewDataType(it.Get()); | 741 RegisterNewDataType(it.Get()); |
739 #if !defined(OS_ANDROID) | 742 #if !defined(OS_ANDROID) |
740 // Enable the about:flags switch for the experimental type so we don't have | 743 // Enable the about:flags switch for the experimental type so we don't have |
741 // to always perform this reconfiguration. Once we set this, the type will | 744 // to always perform this reconfiguration. Once we set this, the type will |
(...skipping 19 matching lines...) Expand all Loading... |
761 sync_prefs_.SetPreferredDataTypes(registered_types, registered_types); | 764 sync_prefs_.SetPreferredDataTypes(registered_types, registered_types); |
762 | 765 |
763 // Only automatically turn on types if we have already finished set up. | 766 // Only automatically turn on types if we have already finished set up. |
764 // Otherwise, just leave the experimental types on by default. | 767 // Otherwise, just leave the experimental types on by default. |
765 if (!to_register.Empty() && HasSyncSetupCompleted() && migrator_.get()) { | 768 if (!to_register.Empty() && HasSyncSetupCompleted() && migrator_.get()) { |
766 DVLOG(1) << "Dynamically enabling new datatypes: " | 769 DVLOG(1) << "Dynamically enabling new datatypes: " |
767 << syncable::ModelTypeSetToString(to_register); | 770 << syncable::ModelTypeSetToString(to_register); |
768 OnMigrationNeededForTypes(to_register); | 771 OnMigrationNeededForTypes(to_register); |
769 } | 772 } |
770 } | 773 } |
| 774 |
| 775 // Now enable any non-datatype features. |
| 776 if (experiments.sync_tab_favicons) { |
| 777 DVLOG(1) << "Enabling syncing of tab favicons."; |
| 778 about_flags::SetExperimentEnabled(g_browser_process->local_state(), |
| 779 "sync-tab-favicons", |
| 780 true); |
| 781 } |
| 782 |
| 783 current_experiments = experiments; |
771 } | 784 } |
772 | 785 |
773 void ProfileSyncService::UpdateAuthErrorState( | 786 void ProfileSyncService::UpdateAuthErrorState( |
774 const GoogleServiceAuthError& error) { | 787 const GoogleServiceAuthError& error) { |
775 is_auth_in_progress_ = false; | 788 is_auth_in_progress_ = false; |
776 last_auth_error_ = error; | 789 last_auth_error_ = error; |
777 | 790 |
778 // Fan the notification out to interested UI-thread components. | 791 // Fan the notification out to interested UI-thread components. |
779 NotifyObservers(); | 792 NotifyObservers(); |
780 } | 793 } |
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1642 // See http://stackoverflow.com/questions/6224121/is-new-this-myclass-undefine
d-behaviour-after-directly-calling-the-destru. | 1655 // See http://stackoverflow.com/questions/6224121/is-new-this-myclass-undefine
d-behaviour-after-directly-calling-the-destru. |
1643 ProfileSyncService* old_this = this; | 1656 ProfileSyncService* old_this = this; |
1644 this->~ProfileSyncService(); | 1657 this->~ProfileSyncService(); |
1645 new(old_this) ProfileSyncService( | 1658 new(old_this) ProfileSyncService( |
1646 new ProfileSyncComponentsFactoryImpl(profile, | 1659 new ProfileSyncComponentsFactoryImpl(profile, |
1647 CommandLine::ForCurrentProcess()), | 1660 CommandLine::ForCurrentProcess()), |
1648 profile, | 1661 profile, |
1649 signin, | 1662 signin, |
1650 behavior); | 1663 behavior); |
1651 } | 1664 } |
OLD | NEW |