| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/internal_api/sync_manager.h" | 5 #include "chrome/browser/sync/internal_api/sync_manager.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/callback.h" | 11 #include "base/callback.h" |
| 12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 13 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
| 14 #include "base/json/json_writer.h" | 14 #include "base/json/json_writer.h" |
| 15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
| 16 #include "base/observer_list.h" | 16 #include "base/observer_list.h" |
| 17 #include "base/string_number_conversions.h" | 17 #include "base/string_number_conversions.h" |
| 18 #include "base/values.h" | 18 #include "base/values.h" |
| 19 #include "chrome/browser/sync/engine/all_status.h" | 19 #include "chrome/browser/sync/engine/all_status.h" |
| 20 #include "chrome/browser/sync/engine/net/server_connection_manager.h" | 20 #include "chrome/browser/sync/engine/net/server_connection_manager.h" |
| 21 #include "chrome/browser/sync/engine/nigori_util.h" | 21 #include "chrome/browser/sync/engine/nigori_util.h" |
| 22 #include "chrome/browser/sync/engine/polling_constants.h" |
| 22 #include "chrome/browser/sync/engine/syncapi_internal.h" | 23 #include "chrome/browser/sync/engine/syncapi_internal.h" |
| 23 #include "chrome/browser/sync/engine/syncer_types.h" | 24 #include "chrome/browser/sync/engine/syncer_types.h" |
| 24 #include "chrome/browser/sync/engine/sync_scheduler.h" | 25 #include "chrome/browser/sync/engine/sync_scheduler.h" |
| 25 #include "chrome/browser/sync/internal_api/base_node.h" | 26 #include "chrome/browser/sync/internal_api/base_node.h" |
| 26 #include "chrome/browser/sync/internal_api/change_reorder_buffer.h" | 27 #include "chrome/browser/sync/internal_api/change_reorder_buffer.h" |
| 27 #include "chrome/browser/sync/internal_api/configure_reason.h" | 28 #include "chrome/browser/sync/internal_api/configure_reason.h" |
| 28 #include "chrome/browser/sync/internal_api/debug_info_event_listener.h" | 29 #include "chrome/browser/sync/internal_api/debug_info_event_listener.h" |
| 29 #include "chrome/browser/sync/internal_api/read_node.h" | 30 #include "chrome/browser/sync/internal_api/read_node.h" |
| 30 #include "chrome/browser/sync/internal_api/read_transaction.h" | 31 #include "chrome/browser/sync/internal_api/read_transaction.h" |
| 31 #include "chrome/browser/sync/internal_api/syncapi_server_connection_manager.h" | 32 #include "chrome/browser/sync/internal_api/syncapi_server_connection_manager.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 NOTREACHED(); | 114 NOTREACHED(); |
| 114 } | 115 } |
| 115 | 116 |
| 116 return GetUpdatesCallerInfo::UNKNOWN; | 117 return GetUpdatesCallerInfo::UNKNOWN; |
| 117 } | 118 } |
| 118 | 119 |
| 119 } // namespace | 120 } // namespace |
| 120 | 121 |
| 121 namespace sync_api { | 122 namespace sync_api { |
| 122 | 123 |
| 124 const int SyncManager::kDefaultNudgeDelayMilliseconds = 200; |
| 125 const int SyncManager::kPreferencesNudgeDelayMilliseconds = 2000; |
| 126 |
| 123 ////////////////////////////////////////////////////////////////////////// | 127 ////////////////////////////////////////////////////////////////////////// |
| 124 // SyncManager's implementation: SyncManager::SyncInternal | 128 // SyncManager's implementation: SyncManager::SyncInternal |
| 125 class SyncManager::SyncInternal | 129 class SyncManager::SyncInternal |
| 126 : public net::NetworkChangeNotifier::IPAddressObserver, | 130 : public net::NetworkChangeNotifier::IPAddressObserver, |
| 127 public browser_sync::Cryptographer::Observer, | 131 public browser_sync::Cryptographer::Observer, |
| 128 public sync_notifier::SyncNotifierObserver, | 132 public sync_notifier::SyncNotifierObserver, |
| 129 public JsBackend, | 133 public JsBackend, |
| 130 public SyncEngineEventListener, | 134 public SyncEngineEventListener, |
| 131 public ServerConnectionEventListener, | 135 public ServerConnectionEventListener, |
| 132 public syncable::DirectoryChangeDelegate { | 136 public syncable::DirectoryChangeDelegate { |
| 133 static const int kDefaultNudgeDelayMilliseconds; | |
| 134 static const int kPreferencesNudgeDelayMilliseconds; | |
| 135 public: | 137 public: |
| 136 explicit SyncInternal(const std::string& name) | 138 explicit SyncInternal(const std::string& name) |
| 137 : name_(name), | 139 : name_(name), |
| 138 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 140 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
| 139 registrar_(NULL), | 141 registrar_(NULL), |
| 140 change_delegate_(NULL), | 142 change_delegate_(NULL), |
| 141 initialized_(false), | 143 initialized_(false), |
| 142 setup_for_test_mode_(false), | 144 setup_for_test_mode_(false), |
| 143 observing_ip_address_changes_(false), | 145 observing_ip_address_changes_(false), |
| 144 created_on_loop_(MessageLoop::current()) { | 146 created_on_loop_(MessageLoop::current()) { |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 virtual void StoreState(const std::string& cookie) OVERRIDE; | 286 virtual void StoreState(const std::string& cookie) OVERRIDE; |
| 285 | 287 |
| 286 void AddObserver(SyncManager::Observer* observer); | 288 void AddObserver(SyncManager::Observer* observer); |
| 287 void RemoveObserver(SyncManager::Observer* observer); | 289 void RemoveObserver(SyncManager::Observer* observer); |
| 288 | 290 |
| 289 // Accessors for the private members. | 291 // Accessors for the private members. |
| 290 DirectoryManager* dir_manager() { return share_.dir_manager.get(); } | 292 DirectoryManager* dir_manager() { return share_.dir_manager.get(); } |
| 291 SyncAPIServerConnectionManager* connection_manager() { | 293 SyncAPIServerConnectionManager* connection_manager() { |
| 292 return connection_manager_.get(); | 294 return connection_manager_.get(); |
| 293 } | 295 } |
| 294 SyncScheduler* scheduler() { return scheduler_.get(); } | 296 SyncScheduler* scheduler() const { return scheduler_.get(); } |
| 295 UserShare* GetUserShare() { | 297 UserShare* GetUserShare() { |
| 296 DCHECK(initialized_); | 298 DCHECK(initialized_); |
| 297 return &share_; | 299 return &share_; |
| 298 } | 300 } |
| 299 | 301 |
| 300 // Return the currently active (validated) username for use with syncable | 302 // Return the currently active (validated) username for use with syncable |
| 301 // types. | 303 // types. |
| 302 const std::string& username_for_share() const { | 304 const std::string& username_for_share() const { |
| 303 return share_.name; | 305 return share_.name; |
| 304 } | 306 } |
| 305 | 307 |
| 306 Status GetStatus(); | 308 Status GetStatus(); |
| 307 | 309 |
| 308 void RequestNudge(const tracked_objects::Location& nudge_location); | 310 void RequestNudge(const tracked_objects::Location& nudge_location); |
| 309 | 311 |
| 310 void RequestNudgeForDataType( | 312 void RequestNudgeForDataType( |
| 311 const tracked_objects::Location& nudge_location, | 313 const tracked_objects::Location& nudge_location, |
| 312 const ModelType& type); | 314 const ModelType& type); |
| 313 | 315 |
| 316 TimeDelta GetNudgeDelayTimeDelta(const ModelType& model_type); |
| 317 |
| 314 // See SyncManager::Shutdown* for information. | 318 // See SyncManager::Shutdown* for information. |
| 315 void StopSyncingForShutdown(const base::Closure& callback); | 319 void StopSyncingForShutdown(const base::Closure& callback); |
| 316 void ShutdownOnSyncThread(); | 320 void ShutdownOnSyncThread(); |
| 317 | 321 |
| 318 // If this is a deletion for a password, sets the legacy | 322 // If this is a deletion for a password, sets the legacy |
| 319 // ExtraPasswordChangeRecordData field of |buffer|. Otherwise sets | 323 // ExtraPasswordChangeRecordData field of |buffer|. Otherwise sets |
| 320 // |buffer|'s specifics field to contain the unencrypted data. | 324 // |buffer|'s specifics field to contain the unencrypted data. |
| 321 void SetExtraChangeRecordData(int64 id, | 325 void SetExtraChangeRecordData(int64 id, |
| 322 syncable::ModelType type, | 326 syncable::ModelType type, |
| 323 ChangeReorderBuffer* buffer, | 327 ChangeReorderBuffer* buffer, |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 JsMessageHandlerMap js_message_handlers_; | 560 JsMessageHandlerMap js_message_handlers_; |
| 557 WeakHandle<JsEventHandler> js_event_handler_; | 561 WeakHandle<JsEventHandler> js_event_handler_; |
| 558 JsSyncManagerObserver js_sync_manager_observer_; | 562 JsSyncManagerObserver js_sync_manager_observer_; |
| 559 JsMutationEventObserver js_mutation_event_observer_; | 563 JsMutationEventObserver js_mutation_event_observer_; |
| 560 | 564 |
| 561 // This is for keeping track of client events to send to the server. | 565 // This is for keeping track of client events to send to the server. |
| 562 DebugInfoEventListener debug_info_event_listener_; | 566 DebugInfoEventListener debug_info_event_listener_; |
| 563 | 567 |
| 564 MessageLoop* const created_on_loop_; | 568 MessageLoop* const created_on_loop_; |
| 565 }; | 569 }; |
| 566 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200; | 570 |
| 567 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000; | 571 // A class to calculate nudge delays for types. |
| 572 class NudgeStrategy { |
| 573 public: |
| 574 static TimeDelta GetNudgeDelayTimeDelta(const ModelType& model_type, |
| 575 SyncManager::SyncInternal* core) { |
| 576 NudgeDelayStrategy delay_type = GetNudgeDelayStrategy(model_type); |
| 577 return GetNudgeDelayTimeDeltaFromType(delay_type, |
| 578 model_type, |
| 579 core); |
| 580 } |
| 581 |
| 582 private: |
| 583 // Possible types of nudge delay for datatypes. |
| 584 // Note: These are just hints. If a sync happens then all dirty entries |
| 585 // would be committed as part of the sync. |
| 586 enum NudgeDelayStrategy { |
| 587 // Sync right away. |
| 588 IMMEDIATE, |
| 589 |
| 590 // Sync this change while syncing another change. |
| 591 ACCOMPANY_ONLY, |
| 592 |
| 593 // The datatype does not use one of the predefined wait times but defines |
| 594 // its own wait time logic for nudge. |
| 595 CUSTOM, |
| 596 }; |
| 597 |
| 598 static NudgeDelayStrategy GetNudgeDelayStrategy(const ModelType& type) { |
| 599 switch (type) { |
| 600 case syncable::AUTOFILL: |
| 601 case syncable::AUTOFILL_PROFILE: |
| 602 return ACCOMPANY_ONLY; |
| 603 case syncable::PREFERENCES: |
| 604 case syncable::SESSIONS: |
| 605 return CUSTOM; |
| 606 default: |
| 607 return IMMEDIATE; |
| 608 } |
| 609 } |
| 610 |
| 611 static TimeDelta GetNudgeDelayTimeDeltaFromType( |
| 612 const NudgeDelayStrategy& delay_type, const ModelType& model_type, |
| 613 const SyncManager::SyncInternal* core) { |
| 614 CHECK(core); |
| 615 TimeDelta delay = TimeDelta::FromMilliseconds( |
| 616 SyncManager::kDefaultNudgeDelayMilliseconds); |
| 617 switch (delay_type) { |
| 618 case IMMEDIATE: |
| 619 delay = TimeDelta::FromMilliseconds( |
| 620 SyncManager::kDefaultNudgeDelayMilliseconds); |
| 621 break; |
| 622 case ACCOMPANY_ONLY: |
| 623 delay = TimeDelta::FromSeconds( |
| 624 browser_sync::kDefaultShortPollIntervalSeconds); |
| 625 break; |
| 626 case CUSTOM: |
| 627 switch (model_type) { |
| 628 case syncable::PREFERENCES: |
| 629 delay = TimeDelta::FromMilliseconds( |
| 630 SyncManager::kPreferencesNudgeDelayMilliseconds); |
| 631 break; |
| 632 case syncable::SESSIONS: |
| 633 delay = core->scheduler()->sessions_commit_delay(); |
| 634 break; |
| 635 default: |
| 636 NOTREACHED(); |
| 637 } |
| 638 break; |
| 639 default: |
| 640 NOTREACHED(); |
| 641 } |
| 642 return delay; |
| 643 } |
| 644 }; |
| 568 | 645 |
| 569 SyncManager::ChangeDelegate::~ChangeDelegate() {} | 646 SyncManager::ChangeDelegate::~ChangeDelegate() {} |
| 570 | 647 |
| 571 SyncManager::ChangeObserver::~ChangeObserver() {} | 648 SyncManager::ChangeObserver::~ChangeObserver() {} |
| 572 | 649 |
| 573 SyncManager::Observer::~Observer() {} | 650 SyncManager::Observer::~Observer() {} |
| 574 | 651 |
| 575 SyncManager::SyncManager(const std::string& name) | 652 SyncManager::SyncManager(const std::string& name) |
| 576 : data_(new SyncInternal(name)) {} | 653 : data_(new SyncInternal(name)) {} |
| 577 | 654 |
| (...skipping 1036 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1614 } | 1691 } |
| 1615 | 1692 |
| 1616 void SyncManager::SyncInternal::RequestNudge( | 1693 void SyncManager::SyncInternal::RequestNudge( |
| 1617 const tracked_objects::Location& location) { | 1694 const tracked_objects::Location& location) { |
| 1618 if (scheduler()) | 1695 if (scheduler()) |
| 1619 scheduler()->ScheduleNudge( | 1696 scheduler()->ScheduleNudge( |
| 1620 TimeDelta::FromMilliseconds(0), browser_sync::NUDGE_SOURCE_LOCAL, | 1697 TimeDelta::FromMilliseconds(0), browser_sync::NUDGE_SOURCE_LOCAL, |
| 1621 ModelTypeSet(), location); | 1698 ModelTypeSet(), location); |
| 1622 } | 1699 } |
| 1623 | 1700 |
| 1701 TimeDelta SyncManager::SyncInternal::GetNudgeDelayTimeDelta( |
| 1702 const ModelType& model_type) { |
| 1703 return NudgeStrategy::GetNudgeDelayTimeDelta(model_type, this); |
| 1704 } |
| 1705 |
| 1624 void SyncManager::SyncInternal::RequestNudgeForDataType( | 1706 void SyncManager::SyncInternal::RequestNudgeForDataType( |
| 1625 const tracked_objects::Location& nudge_location, | 1707 const tracked_objects::Location& nudge_location, |
| 1626 const ModelType& type) { | 1708 const ModelType& type) { |
| 1627 if (!scheduler()) { | 1709 if (!scheduler()) { |
| 1628 NOTREACHED(); | 1710 NOTREACHED(); |
| 1629 return; | 1711 return; |
| 1630 } | 1712 } |
| 1631 base::TimeDelta nudge_delay; | 1713 |
| 1632 switch (type) { | 1714 base::TimeDelta nudge_delay = NudgeStrategy::GetNudgeDelayTimeDelta(type, |
| 1633 case syncable::PREFERENCES: | 1715 this); |
| 1634 nudge_delay = | 1716 syncable::ModelTypeSet types(type); |
| 1635 TimeDelta::FromMilliseconds(kPreferencesNudgeDelayMilliseconds); | |
| 1636 break; | |
| 1637 case syncable::SESSIONS: | |
| 1638 nudge_delay = scheduler()->sessions_commit_delay(); | |
| 1639 break; | |
| 1640 default: | |
| 1641 nudge_delay = | |
| 1642 TimeDelta::FromMilliseconds(kDefaultNudgeDelayMilliseconds); | |
| 1643 break; | |
| 1644 } | |
| 1645 scheduler()->ScheduleNudge(nudge_delay, | 1717 scheduler()->ScheduleNudge(nudge_delay, |
| 1646 browser_sync::NUDGE_SOURCE_LOCAL, | 1718 browser_sync::NUDGE_SOURCE_LOCAL, |
| 1647 ModelTypeSet(type), | 1719 ModelTypeSet(type), |
| 1648 nudge_location); | 1720 nudge_location); |
| 1649 } | 1721 } |
| 1650 | 1722 |
| 1651 void SyncManager::SyncInternal::OnSyncEngineEvent( | 1723 void SyncManager::SyncInternal::OnSyncEngineEvent( |
| 1652 const SyncEngineEvent& event) { | 1724 const SyncEngineEvent& event) { |
| 1653 DCHECK(thread_checker_.CalledOnValidThread()); | 1725 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1654 // Only send an event if this is due to a cycle ending and this cycle | 1726 // Only send an event if this is due to a cycle ending and this cycle |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2065 done_callback)); | 2137 done_callback)); |
| 2066 } | 2138 } |
| 2067 | 2139 |
| 2068 void SyncManager::DoneRefreshNigori(const base::Closure& done_callback, | 2140 void SyncManager::DoneRefreshNigori(const base::Closure& done_callback, |
| 2069 bool is_ready) { | 2141 bool is_ready) { |
| 2070 if (is_ready) | 2142 if (is_ready) |
| 2071 data_->RefreshEncryption(); | 2143 data_->RefreshEncryption(); |
| 2072 done_callback.Run(); | 2144 done_callback.Run(); |
| 2073 } | 2145 } |
| 2074 | 2146 |
| 2147 TimeDelta SyncManager::GetNudgeDelayTimeDelta( |
| 2148 const ModelType& model_type) { |
| 2149 return data_->GetNudgeDelayTimeDelta(model_type); |
| 2150 } |
| 2151 |
| 2075 syncable::ModelTypeSet SyncManager::GetEncryptedDataTypesForTest() const { | 2152 syncable::ModelTypeSet SyncManager::GetEncryptedDataTypesForTest() const { |
| 2076 ReadTransaction trans(FROM_HERE, GetUserShare()); | 2153 ReadTransaction trans(FROM_HERE, GetUserShare()); |
| 2077 return GetEncryptedTypes(&trans); | 2154 return GetEncryptedTypes(&trans); |
| 2078 } | 2155 } |
| 2079 | 2156 |
| 2080 bool SyncManager::ReceivedExperimentalTypes(syncable::ModelTypeSet* to_add) | 2157 bool SyncManager::ReceivedExperimentalTypes(syncable::ModelTypeSet* to_add) |
| 2081 const { | 2158 const { |
| 2082 ReadTransaction trans(FROM_HERE, GetUserShare()); | 2159 ReadTransaction trans(FROM_HERE, GetUserShare()); |
| 2083 ReadNode node(&trans); | 2160 ReadNode node(&trans); |
| 2084 if (!node.InitByTagLookup(kNigoriTag)) { | 2161 if (!node.InitByTagLookup(kNigoriTag)) { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2167 lookup->GetDownloadProgress(i.Get(), &marker); | 2244 lookup->GetDownloadProgress(i.Get(), &marker); |
| 2168 | 2245 |
| 2169 if (marker.token().empty()) | 2246 if (marker.token().empty()) |
| 2170 result.Put(i.Get()); | 2247 result.Put(i.Get()); |
| 2171 | 2248 |
| 2172 } | 2249 } |
| 2173 return result; | 2250 return result; |
| 2174 } | 2251 } |
| 2175 | 2252 |
| 2176 } // namespace sync_api | 2253 } // namespace sync_api |
| OLD | NEW |