Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: sync/internal_api/sync_manager_impl.cc

Issue 10704214: [Sync] Refactor sync manager into interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Self review Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "sync/internal_api/public/sync_manager.h" 5 #include "sync/internal_api/sync_manager_impl.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/metrics/histogram.h" 16 #include "base/metrics/histogram.h"
17 #include "base/observer_list.h" 17 #include "base/observer_list.h"
18 #include "base/string_number_conversions.h" 18 #include "base/string_number_conversions.h"
19 #include "base/values.h" 19 #include "base/values.h"
20 #include "net/base/network_change_notifier.h" 20 #include "net/base/network_change_notifier.h"
21 #include "sync/engine/all_status.h" 21 #include "sync/engine/all_status.h"
22 #include "sync/engine/net/server_connection_manager.h" 22 #include "sync/engine/net/server_connection_manager.h"
23 #include "sync/engine/sync_scheduler.h" 23 #include "sync/engine/sync_scheduler.h"
24 #include "sync/engine/syncer_types.h" 24 #include "sync/engine/syncer_types.h"
25 #include "sync/engine/throttled_data_type_tracker.h" 25 #include "sync/engine/throttled_data_type_tracker.h"
26 #include "sync/internal_api/change_reorder_buffer.h" 26 #include "sync/internal_api/change_reorder_buffer.h"
27 #include "sync/internal_api/debug_info_event_listener.h" 27 #include "sync/internal_api/debug_info_event_listener.h"
28 #include "sync/internal_api/js_mutation_event_observer.h" 28 #include "sync/internal_api/js_mutation_event_observer.h"
29 #include "sync/internal_api/js_sync_manager_observer.h" 29 #include "sync/internal_api/js_sync_manager_observer.h"
30 #include "sync/internal_api/public/base/model_type.h" 30 #include "sync/internal_api/public/base/model_type.h"
31 #include "sync/internal_api/public/base/model_type_payload_map.h" 31 #include "sync/internal_api/public/base/model_type_payload_map.h"
32 #include "sync/internal_api/public/base_node.h" 32 #include "sync/internal_api/public/base_node.h"
33 #include "sync/internal_api/public/configure_reason.h" 33 #include "sync/internal_api/public/configure_reason.h"
34 #include "sync/internal_api/public/engine/polling_constants.h" 34 #include "sync/internal_api/public/engine/polling_constants.h"
35 #include "sync/internal_api/public/http_post_provider_factory.h"
35 #include "sync/internal_api/public/read_node.h" 36 #include "sync/internal_api/public/read_node.h"
36 #include "sync/internal_api/public/read_transaction.h" 37 #include "sync/internal_api/public/read_transaction.h"
37 #include "sync/internal_api/public/user_share.h" 38 #include "sync/internal_api/public/user_share.h"
38 #include "sync/internal_api/public/util/experiments.h" 39 #include "sync/internal_api/public/util/experiments.h"
39 #include "sync/internal_api/public/write_node.h" 40 #include "sync/internal_api/public/write_node.h"
40 #include "sync/internal_api/public/write_transaction.h" 41 #include "sync/internal_api/public/write_transaction.h"
41 #include "sync/internal_api/syncapi_internal.h" 42 #include "sync/internal_api/syncapi_internal.h"
42 #include "sync/internal_api/syncapi_server_connection_manager.h" 43 #include "sync/internal_api/syncapi_server_connection_manager.h"
43 #include "sync/js/js_arg_list.h" 44 #include "sync/js/js_arg_list.h"
44 #include "sync/js/js_backend.h" 45 #include "sync/js/js_backend.h"
(...skipping 15 matching lines...) Expand all
60 #include "sync/util/cryptographer.h" 61 #include "sync/util/cryptographer.h"
61 #include "sync/util/get_session_name.h" 62 #include "sync/util/get_session_name.h"
62 #include "sync/util/time.h" 63 #include "sync/util/time.h"
63 64
64 using base::TimeDelta; 65 using base::TimeDelta;
65 using sync_pb::GetUpdatesCallerInfo; 66 using sync_pb::GetUpdatesCallerInfo;
66 67
67 namespace { 68 namespace {
68 69
69 // Delays for syncer nudges. 70 // Delays for syncer nudges.
71 static const int kDefaultNudgeDelayMilliseconds = 200;
72 static const int kPreferencesNudgeDelayMilliseconds = 2000;
70 static const int kSyncRefreshDelayMsec = 500; 73 static const int kSyncRefreshDelayMsec = 500;
71 static const int kSyncSchedulerDelayMsec = 250; 74 static const int kSyncSchedulerDelayMsec = 250;
72 75
73 GetUpdatesCallerInfo::GetUpdatesSource GetSourceFromReason( 76 GetUpdatesCallerInfo::GetUpdatesSource GetSourceFromReason(
74 syncer::ConfigureReason reason) { 77 syncer::ConfigureReason reason) {
75 switch (reason) { 78 switch (reason) {
76 case syncer::CONFIGURE_REASON_RECONFIGURATION: 79 case syncer::CONFIGURE_REASON_RECONFIGURATION:
77 return GetUpdatesCallerInfo::RECONFIGURATION; 80 return GetUpdatesCallerInfo::RECONFIGURATION;
78 case syncer::CONFIGURE_REASON_MIGRATION: 81 case syncer::CONFIGURE_REASON_MIGRATION:
79 return GetUpdatesCallerInfo::MIGRATION; 82 return GetUpdatesCallerInfo::MIGRATION;
(...skipping 13 matching lines...) Expand all
93 static const int kNigoriOverwriteLimit = 10; 96 static const int kNigoriOverwriteLimit = 10;
94 97
95 } // namespace 98 } // namespace
96 99
97 namespace syncer { 100 namespace syncer {
98 101
99 using sessions::SyncSessionContext; 102 using sessions::SyncSessionContext;
100 using syncable::ImmutableWriteTransactionInfo; 103 using syncable::ImmutableWriteTransactionInfo;
101 using syncable::SPECIFICS; 104 using syncable::SPECIFICS;
102 105
103 const int SyncManager::kDefaultNudgeDelayMilliseconds = 200;
104 const int SyncManager::kPreferencesNudgeDelayMilliseconds = 2000;
105
106 // Maximum count and size for traffic recorder. 106 // Maximum count and size for traffic recorder.
107 const unsigned int kMaxMessagesToRecord = 10; 107 const unsigned int kMaxMessagesToRecord = 10;
108 const unsigned int kMaxMessageSizeToRecord = 5 * 1024; 108 const unsigned int kMaxMessageSizeToRecord = 5 * 1024;
109 109
110 ////////////////////////////////////////////////////////////////////////// 110 //////////////////////////////////////////////////////////////////////////
111 // SyncManager's implementation: SyncManager::SyncInternal 111 // SyncManager's implementation: SyncManagerImpl::SyncInternal
112 class SyncManager::SyncInternal 112 class SyncManagerImpl::SyncInternal
113 : public net::NetworkChangeNotifier::IPAddressObserver, 113 : public net::NetworkChangeNotifier::IPAddressObserver,
114 public syncer::Cryptographer::Observer, 114 public syncer::Cryptographer::Observer,
115 public syncer::SyncNotifierObserver, 115 public syncer::SyncNotifierObserver,
116 public JsBackend, 116 public JsBackend,
117 public SyncEngineEventListener, 117 public SyncEngineEventListener,
118 public ServerConnectionEventListener, 118 public ServerConnectionEventListener,
119 public syncable::DirectoryChangeDelegate { 119 public syncable::DirectoryChangeDelegate {
120 public: 120 public:
121 explicit SyncInternal(const std::string& name) 121 explicit SyncInternal(const std::string& name)
122 : name_(name), 122 : name_(name),
(...skipping 12 matching lines...) Expand all
135 // Pre-fill |notification_info_map_|. 135 // Pre-fill |notification_info_map_|.
136 for (int i = syncer::FIRST_REAL_MODEL_TYPE; 136 for (int i = syncer::FIRST_REAL_MODEL_TYPE;
137 i < syncer::MODEL_TYPE_COUNT; ++i) { 137 i < syncer::MODEL_TYPE_COUNT; ++i) {
138 notification_info_map_.insert( 138 notification_info_map_.insert(
139 std::make_pair(syncer::ModelTypeFromInt(i), NotificationInfo())); 139 std::make_pair(syncer::ModelTypeFromInt(i), NotificationInfo()));
140 } 140 }
141 141
142 // Bind message handlers. 142 // Bind message handlers.
143 BindJsMessageHandler( 143 BindJsMessageHandler(
144 "getNotificationState", 144 "getNotificationState",
145 &SyncManager::SyncInternal::GetNotificationState); 145 &SyncManagerImpl::SyncInternal::GetNotificationState);
146 BindJsMessageHandler( 146 BindJsMessageHandler(
147 "getNotificationInfo", 147 "getNotificationInfo",
148 &SyncManager::SyncInternal::GetNotificationInfo); 148 &SyncManagerImpl::SyncInternal::GetNotificationInfo);
149 BindJsMessageHandler( 149 BindJsMessageHandler(
150 "getRootNodeDetails", 150 "getRootNodeDetails",
151 &SyncManager::SyncInternal::GetRootNodeDetails); 151 &SyncManagerImpl::SyncInternal::GetRootNodeDetails);
152 BindJsMessageHandler( 152 BindJsMessageHandler(
153 "getNodeSummariesById", 153 "getNodeSummariesById",
154 &SyncManager::SyncInternal::GetNodeSummariesById); 154 &SyncManagerImpl::SyncInternal::GetNodeSummariesById);
155 BindJsMessageHandler( 155 BindJsMessageHandler(
156 "getNodeDetailsById", 156 "getNodeDetailsById",
157 &SyncManager::SyncInternal::GetNodeDetailsById); 157 &SyncManagerImpl::SyncInternal::GetNodeDetailsById);
158 BindJsMessageHandler( 158 BindJsMessageHandler(
159 "getAllNodes", 159 "getAllNodes",
160 &SyncManager::SyncInternal::GetAllNodes); 160 &SyncManagerImpl::SyncInternal::GetAllNodes);
161 BindJsMessageHandler( 161 BindJsMessageHandler(
162 "getChildNodeIds", 162 "getChildNodeIds",
163 &SyncManager::SyncInternal::GetChildNodeIds); 163 &SyncManagerImpl::SyncInternal::GetChildNodeIds);
164 BindJsMessageHandler( 164 BindJsMessageHandler(
165 "getClientServerTraffic", 165 "getClientServerTraffic",
166 &SyncManager::SyncInternal::GetClientServerTraffic); 166 &SyncManagerImpl::SyncInternal::GetClientServerTraffic);
167 } 167 }
168 168
169 virtual ~SyncInternal() { 169 virtual ~SyncInternal() {
170 CHECK(!initialized_); 170 CHECK(!initialized_);
171 } 171 }
172 172
173 bool Init(const FilePath& database_location, 173 bool Init(const FilePath& database_location,
174 const WeakHandle<JsEventHandler>& event_handler, 174 const WeakHandle<JsEventHandler>& event_handler,
175 const std::string& sync_server_and_path, 175 const std::string& sync_server_and_path,
176 int port, 176 int port,
177 bool use_ssl, 177 bool use_ssl,
178 const scoped_refptr<base::TaskRunner>& blocking_task_runner, 178 const scoped_refptr<base::TaskRunner>& blocking_task_runner,
179 HttpPostProviderFactory* post_factory, 179 scoped_ptr<HttpPostProviderFactory> post_factory,
180 const syncer::ModelSafeRoutingInfo& model_safe_routing_info, 180 const syncer::ModelSafeRoutingInfo& model_safe_routing_info,
181 const std::vector<syncer::ModelSafeWorker*>& workers, 181 const std::vector<syncer::ModelSafeWorker*>& workers,
182 syncer::ExtensionsActivityMonitor* 182 syncer::ExtensionsActivityMonitor*
183 extensions_activity_monitor, 183 extensions_activity_monitor,
184 ChangeDelegate* change_delegate, 184 ChangeDelegate* change_delegate,
185 const SyncCredentials& credentials, 185 const SyncCredentials& credentials,
186 syncer::SyncNotifier* sync_notifier, 186 scoped_ptr<syncer::SyncNotifier> sync_notifier,
187 const std::string& restored_key_for_bootstrapping, 187 const std::string& restored_key_for_bootstrapping,
188 TestingMode testing_mode, 188 TestingMode testing_mode,
189 Encryptor* encryptor, 189 Encryptor* encryptor,
190 UnrecoverableErrorHandler* unrecoverable_error_handler, 190 UnrecoverableErrorHandler* unrecoverable_error_handler,
191 ReportUnrecoverableErrorFunction 191 ReportUnrecoverableErrorFunction
192 report_unrecoverable_error_function); 192 report_unrecoverable_error_function);
193 193
194 // Sign into sync with given credentials. 194 // Sign into sync with given credentials.
195 // We do not verify the tokens given. After this call, the tokens are set 195 // We do not verify the tokens given. After this call, the tokens are set
196 // and the sync DB is open. True if successful, false if something 196 // and the sync DB is open. True if successful, false if something
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 bool encrypt_everything) OVERRIDE; 304 bool encrypt_everything) OVERRIDE;
305 305
306 // SyncNotifierObserver implementation. 306 // SyncNotifierObserver implementation.
307 virtual void OnNotificationsEnabled() OVERRIDE; 307 virtual void OnNotificationsEnabled() OVERRIDE;
308 virtual void OnNotificationsDisabled( 308 virtual void OnNotificationsDisabled(
309 syncer::NotificationsDisabledReason reason) OVERRIDE; 309 syncer::NotificationsDisabledReason reason) OVERRIDE;
310 virtual void OnIncomingNotification( 310 virtual void OnIncomingNotification(
311 const syncer::ModelTypePayloadMap& type_payloads, 311 const syncer::ModelTypePayloadMap& type_payloads,
312 syncer::IncomingNotificationSource source) OVERRIDE; 312 syncer::IncomingNotificationSource source) OVERRIDE;
313 313
314 void AddObserver(SyncManager::Observer* observer); 314 void AddObserver(SyncManagerImpl::Observer* observer);
tim (not reviewing) 2012/07/16 21:25:30 SyncManager::Observer is still correct (here and a
Nicolas Zea 2012/07/16 21:54:23 Done.
315 void RemoveObserver(SyncManager::Observer* observer); 315 void RemoveObserver(SyncManagerImpl::Observer* observer);
316 316
317 // Accessors for the private members. 317 // Accessors for the private members.
318 syncable::Directory* directory() { return share_.directory.get(); } 318 syncable::Directory* directory() { return share_.directory.get(); }
319 SyncAPIServerConnectionManager* connection_manager() { 319 SyncAPIServerConnectionManager* connection_manager() {
320 return connection_manager_.get(); 320 return connection_manager_.get();
321 } 321 }
322 SyncSessionContext* session_context() { return session_context_.get(); } 322 SyncSessionContext* session_context() { return session_context_.get(); }
323 SyncScheduler* scheduler() const { return scheduler_.get(); } 323 SyncScheduler* scheduler() const { return scheduler_.get(); }
324 UserShare* GetUserShare() { 324 UserShare* GetUserShare() {
325 DCHECK(initialized_); 325 DCHECK(initialized_);
(...skipping 11 matching lines...) Expand all
337 void RequestNudge(const tracked_objects::Location& nudge_location); 337 void RequestNudge(const tracked_objects::Location& nudge_location);
338 338
339 void RequestNudgeForDataTypes( 339 void RequestNudgeForDataTypes(
340 const tracked_objects::Location& nudge_location, 340 const tracked_objects::Location& nudge_location,
341 ModelTypeSet type); 341 ModelTypeSet type);
342 342
343 TimeDelta GetNudgeDelayTimeDelta(const ModelType& model_type); 343 TimeDelta GetNudgeDelayTimeDelta(const ModelType& model_type);
344 344
345 void NotifyCryptographerState(Cryptographer* cryptographer); 345 void NotifyCryptographerState(Cryptographer* cryptographer);
346 346
347 // See SyncManager::Shutdown* for information. 347 // See SyncManagerImpl::Shutdown* for information.
tim (not reviewing) 2012/07/16 21:25:30 The comments are actually @ SyncManager::Shutdown.
Nicolas Zea 2012/07/16 21:54:23 Done.
348 void StopSyncingForShutdown(const base::Closure& callback); 348 void StopSyncingForShutdown(const base::Closure& callback);
349 void ShutdownOnSyncThread(); 349 void ShutdownOnSyncThread();
350 350
351 // If this is a deletion for a password, sets the legacy 351 // If this is a deletion for a password, sets the legacy
352 // ExtraPasswordChangeRecordData field of |buffer|. Otherwise sets 352 // ExtraPasswordChangeRecordData field of |buffer|. Otherwise sets
353 // |buffer|'s specifics field to contain the unencrypted data. 353 // |buffer|'s specifics field to contain the unencrypted data.
354 void SetExtraChangeRecordData(int64 id, 354 void SetExtraChangeRecordData(int64 id,
355 syncer::ModelType type, 355 syncer::ModelType type,
356 ChangeReorderBuffer* buffer, 356 ChangeReorderBuffer* buffer,
357 Cryptographer* cryptographer, 357 Cryptographer* cryptographer,
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 DictionaryValue* ToValue() const { 411 DictionaryValue* ToValue() const {
412 DictionaryValue* value = new DictionaryValue(); 412 DictionaryValue* value = new DictionaryValue();
413 value->SetInteger("totalCount", total_count); 413 value->SetInteger("totalCount", total_count);
414 value->SetString("payload", payload); 414 value->SetString("payload", payload);
415 return value; 415 return value;
416 } 416 }
417 }; 417 };
418 418
419 typedef std::map<syncer::ModelType, NotificationInfo> NotificationInfoMap; 419 typedef std::map<syncer::ModelType, NotificationInfo> NotificationInfoMap;
420 typedef JsArgList 420 typedef JsArgList
421 (SyncManager::SyncInternal::*UnboundJsMessageHandler)(const JsArgList&); 421 (SyncManagerImpl::SyncInternal::*UnboundJsMessageHandler)(
422 const JsArgList&);
422 typedef base::Callback<JsArgList(const JsArgList&)> JsMessageHandler; 423 typedef base::Callback<JsArgList(const JsArgList&)> JsMessageHandler;
423 typedef std::map<std::string, JsMessageHandler> JsMessageHandlerMap; 424 typedef std::map<std::string, JsMessageHandler> JsMessageHandlerMap;
424 425
425 // Internal callback of UpdateCryptographerAndNigoriCallback. 426 // Internal callback of UpdateCryptographerAndNigoriCallback.
426 void UpdateCryptographerAndNigoriCallback( 427 void UpdateCryptographerAndNigoriCallback(
427 const std::string& chrome_version, 428 const std::string& chrome_version,
428 const base::Closure& done_callback, 429 const base::Closure& done_callback,
429 const std::string& session_name); 430 const std::string& session_name);
430 431
431 // Determine if the parents or predecessors differ between the old and new 432 // Determine if the parents or predecessors differ between the old and new
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 // |blocking_task_runner| is a TaskRunner to be used for tasks that 545 // |blocking_task_runner| is a TaskRunner to be used for tasks that
545 // may block on disk I/O. 546 // may block on disk I/O.
546 scoped_refptr<base::TaskRunner> blocking_task_runner_; 547 scoped_refptr<base::TaskRunner> blocking_task_runner_;
547 548
548 // We give a handle to share_ to clients of the API for use when constructing 549 // We give a handle to share_ to clients of the API for use when constructing
549 // any transaction type. 550 // any transaction type.
550 UserShare share_; 551 UserShare share_;
551 552
552 // This can be called from any thread, but only between calls to 553 // This can be called from any thread, but only between calls to
553 // OpenDirectory() and ShutdownOnSyncThread(). 554 // OpenDirectory() and ShutdownOnSyncThread().
554 syncer::WeakHandle<SyncManager::ChangeObserver> change_observer_; 555 syncer::WeakHandle<SyncManagerImpl::ChangeObserver> change_observer_;
tim (not reviewing) 2012/07/16 21:25:30 SyncManager::ChangeObserver is still correct (here
Nicolas Zea 2012/07/16 21:54:23 Done.
555 556
556 ObserverList<SyncManager::Observer> observers_; 557 ObserverList<SyncManagerImpl::Observer> observers_;
557 558
558 // The ServerConnectionManager used to abstract communication between the 559 // The ServerConnectionManager used to abstract communication between the
559 // client (the Syncer) and the sync server. 560 // client (the Syncer) and the sync server.
560 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; 561 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_;
561 562
562 // A container of various bits of information used by the SyncScheduler to 563 // A container of various bits of information used by the SyncScheduler to
563 // create SyncSessions. Must outlive the SyncScheduler. 564 // create SyncSessions. Must outlive the SyncScheduler.
564 scoped_ptr<SyncSessionContext> session_context_; 565 scoped_ptr<SyncSessionContext> session_context_;
565 566
566 // The scheduler that runs the Syncer. Needs to be explicitly 567 // The scheduler that runs the Syncer. Needs to be explicitly
567 // Start()ed. 568 // Start()ed.
568 scoped_ptr<SyncScheduler> scheduler_; 569 scoped_ptr<SyncScheduler> scheduler_;
569 570
570 // The SyncNotifier which notifies us when updates need to be downloaded. 571 // The SyncNotifier which notifies us when updates need to be downloaded.
571 scoped_ptr<syncer::SyncNotifier> sync_notifier_; 572 scoped_ptr<syncer::SyncNotifier> sync_notifier_;
572 573
573 // A multi-purpose status watch object that aggregates stats from various 574 // A multi-purpose status watch object that aggregates stats from various
574 // sync components. 575 // sync components.
575 AllStatus allstatus_; 576 AllStatus allstatus_;
576 577
577 // Each element of this array is a store of change records produced by 578 // Each element of this array is a store of change records produced by
578 // HandleChangeEvent during the CALCULATE_CHANGES step. The changes are 579 // HandleChangeEvent during the CALCULATE_CHANGES step. The changes are
579 // segregated by model type, and are stored here to be processed and 580 // segregated by model type, and are stored here to be processed and
580 // forwarded to the observer slightly later, at the TRANSACTION_ENDING 581 // forwarded to the observer slightly later, at the TRANSACTION_ENDING
581 // step by HandleTransactionEndingChangeEvent. The list is cleared in the 582 // step by HandleTransactionEndingChangeEvent. The list is cleared in the
582 // TRANSACTION_COMPLETE step by HandleTransactionCompleteChangeEvent. 583 // TRANSACTION_COMPLETE step by HandleTransactionCompleteChangeEvent.
583 ChangeReorderBuffer change_buffers_[syncer::MODEL_TYPE_COUNT]; 584 ChangeReorderBuffer change_buffers_[syncer::MODEL_TYPE_COUNT];
584 585
585 SyncManager::ChangeDelegate* change_delegate_; 586 SyncManagerImpl::ChangeDelegate* change_delegate_;
586 587
587 // Set to true once Init has been called. 588 // Set to true once Init has been called.
588 bool initialized_; 589 bool initialized_;
589 590
590 // Controls the disabling of certain SyncManager features. 591 // Controls the disabling of certain SyncManager features.
591 // Can be used to disable communication with the server and the use of an 592 // Can be used to disable communication with the server and the use of an
592 // on-disk file for maintaining syncer state. 593 // on-disk file for maintaining syncer state.
593 // TODO(117836): Clean up implementation of SyncManager unit tests. 594 // TODO(117836): Clean up implementation of SyncManager unit tests.
594 TestingMode testing_mode_; 595 TestingMode testing_mode_;
595 596
(...skipping 25 matching lines...) Expand all
621 // The number of times we've automatically (i.e. not via SetPassphrase or 622 // The number of times we've automatically (i.e. not via SetPassphrase or
622 // conflict resolver) updated the nigori's encryption keys in this chrome 623 // conflict resolver) updated the nigori's encryption keys in this chrome
623 // instantiation. 624 // instantiation.
624 int nigori_overwrite_count_; 625 int nigori_overwrite_count_;
625 }; 626 };
626 627
627 // A class to calculate nudge delays for types. 628 // A class to calculate nudge delays for types.
628 class NudgeStrategy { 629 class NudgeStrategy {
629 public: 630 public:
630 static TimeDelta GetNudgeDelayTimeDelta(const ModelType& model_type, 631 static TimeDelta GetNudgeDelayTimeDelta(const ModelType& model_type,
631 SyncManager::SyncInternal* core) { 632 SyncManagerImpl::SyncInternal* core) {
632 NudgeDelayStrategy delay_type = GetNudgeDelayStrategy(model_type); 633 NudgeDelayStrategy delay_type = GetNudgeDelayStrategy(model_type);
633 return GetNudgeDelayTimeDeltaFromType(delay_type, 634 return GetNudgeDelayTimeDeltaFromType(delay_type,
634 model_type, 635 model_type,
635 core); 636 core);
636 } 637 }
637 638
638 private: 639 private:
639 // Possible types of nudge delay for datatypes. 640 // Possible types of nudge delay for datatypes.
640 // Note: These are just hints. If a sync happens then all dirty entries 641 // Note: These are just hints. If a sync happens then all dirty entries
641 // would be committed as part of the sync. 642 // would be committed as part of the sync.
(...skipping 16 matching lines...) Expand all
658 case syncer::PREFERENCES: 659 case syncer::PREFERENCES:
659 case syncer::SESSIONS: 660 case syncer::SESSIONS:
660 return CUSTOM; 661 return CUSTOM;
661 default: 662 default:
662 return IMMEDIATE; 663 return IMMEDIATE;
663 } 664 }
664 } 665 }
665 666
666 static TimeDelta GetNudgeDelayTimeDeltaFromType( 667 static TimeDelta GetNudgeDelayTimeDeltaFromType(
667 const NudgeDelayStrategy& delay_type, const ModelType& model_type, 668 const NudgeDelayStrategy& delay_type, const ModelType& model_type,
668 const SyncManager::SyncInternal* core) { 669 const SyncManagerImpl::SyncInternal* core) {
669 CHECK(core); 670 CHECK(core);
670 TimeDelta delay = TimeDelta::FromMilliseconds( 671 TimeDelta delay = TimeDelta::FromMilliseconds(
671 SyncManager::kDefaultNudgeDelayMilliseconds); 672 kDefaultNudgeDelayMilliseconds);
672 switch (delay_type) { 673 switch (delay_type) {
673 case IMMEDIATE: 674 case IMMEDIATE:
674 delay = TimeDelta::FromMilliseconds( 675 delay = TimeDelta::FromMilliseconds(
675 SyncManager::kDefaultNudgeDelayMilliseconds); 676 kDefaultNudgeDelayMilliseconds);
676 break; 677 break;
677 case ACCOMPANY_ONLY: 678 case ACCOMPANY_ONLY:
678 delay = TimeDelta::FromSeconds( 679 delay = TimeDelta::FromSeconds(
679 syncer::kDefaultShortPollIntervalSeconds); 680 syncer::kDefaultShortPollIntervalSeconds);
680 break; 681 break;
681 case CUSTOM: 682 case CUSTOM:
682 switch (model_type) { 683 switch (model_type) {
683 case syncer::PREFERENCES: 684 case syncer::PREFERENCES:
684 delay = TimeDelta::FromMilliseconds( 685 delay = TimeDelta::FromMilliseconds(
685 SyncManager::kPreferencesNudgeDelayMilliseconds); 686 kPreferencesNudgeDelayMilliseconds);
686 break; 687 break;
687 case syncer::SESSIONS: 688 case syncer::SESSIONS:
688 delay = core->scheduler()->sessions_commit_delay(); 689 delay = core->scheduler()->sessions_commit_delay();
689 break; 690 break;
690 default: 691 default:
691 NOTREACHED(); 692 NOTREACHED();
692 } 693 }
693 break; 694 break;
694 default: 695 default:
695 NOTREACHED(); 696 NOTREACHED();
696 } 697 }
697 return delay; 698 return delay;
698 } 699 }
699 }; 700 };
700 701
701 SyncManager::ChangeDelegate::~ChangeDelegate() {} 702 SyncManagerImpl::SyncManagerImpl(const std::string& name)
702
703 SyncManager::ChangeObserver::~ChangeObserver() {}
704
705 SyncManager::Observer::~Observer() {}
706
707 SyncManager::SyncManager(const std::string& name)
708 : data_(new SyncInternal(name)) {} 703 : data_(new SyncInternal(name)) {}
709 704
710 bool SyncManager::Init( 705 bool SyncManagerImpl::Init(
711 const FilePath& database_location, 706 const FilePath& database_location,
712 const WeakHandle<JsEventHandler>& event_handler, 707 const WeakHandle<JsEventHandler>& event_handler,
713 const std::string& sync_server_and_path, 708 const std::string& sync_server_and_path,
714 int sync_server_port, 709 int sync_server_port,
715 bool use_ssl, 710 bool use_ssl,
716 const scoped_refptr<base::TaskRunner>& blocking_task_runner, 711 const scoped_refptr<base::TaskRunner>& blocking_task_runner,
717 HttpPostProviderFactory* post_factory, 712 scoped_ptr<HttpPostProviderFactory> post_factory,
718 const syncer::ModelSafeRoutingInfo& model_safe_routing_info, 713 const syncer::ModelSafeRoutingInfo& model_safe_routing_info,
719 const std::vector<syncer::ModelSafeWorker*>& workers, 714 const std::vector<syncer::ModelSafeWorker*>& workers,
720 syncer::ExtensionsActivityMonitor* extensions_activity_monitor, 715 syncer::ExtensionsActivityMonitor* extensions_activity_monitor,
721 ChangeDelegate* change_delegate, 716 ChangeDelegate* change_delegate,
722 const SyncCredentials& credentials, 717 const SyncCredentials& credentials,
723 syncer::SyncNotifier* sync_notifier, 718 scoped_ptr<syncer::SyncNotifier> sync_notifier,
724 const std::string& restored_key_for_bootstrapping, 719 const std::string& restored_key_for_bootstrapping,
725 TestingMode testing_mode, 720 TestingMode testing_mode,
726 Encryptor* encryptor, 721 Encryptor* encryptor,
727 UnrecoverableErrorHandler* unrecoverable_error_handler, 722 UnrecoverableErrorHandler* unrecoverable_error_handler,
728 ReportUnrecoverableErrorFunction report_unrecoverable_error_function) { 723 ReportUnrecoverableErrorFunction report_unrecoverable_error_function) {
729 DCHECK(thread_checker_.CalledOnValidThread()); 724 DCHECK(thread_checker_.CalledOnValidThread());
730 DCHECK(post_factory); 725 DCHECK(post_factory.get());
731 DVLOG(1) << "SyncManager starting Init..."; 726 DVLOG(1) << "SyncManager starting Init...";
732 std::string server_string(sync_server_and_path); 727 std::string server_string(sync_server_and_path);
733 return data_->Init(database_location, 728 return data_->Init(database_location,
734 event_handler, 729 event_handler,
735 server_string, 730 server_string,
736 sync_server_port, 731 sync_server_port,
737 use_ssl, 732 use_ssl,
738 blocking_task_runner, 733 blocking_task_runner,
739 post_factory, 734 post_factory.Pass(),
740 model_safe_routing_info, 735 model_safe_routing_info,
741 workers, 736 workers,
742 extensions_activity_monitor, 737 extensions_activity_monitor,
743 change_delegate, 738 change_delegate,
744 credentials, 739 credentials,
745 sync_notifier, 740 sync_notifier.Pass(),
746 restored_key_for_bootstrapping, 741 restored_key_for_bootstrapping,
747 testing_mode, 742 testing_mode,
748 encryptor, 743 encryptor,
749 unrecoverable_error_handler, 744 unrecoverable_error_handler,
750 report_unrecoverable_error_function); 745 report_unrecoverable_error_function);
751 } 746 }
752 747
753 void SyncManager::UpdateCredentials(const SyncCredentials& credentials) { 748 void SyncManagerImpl::UpdateCredentials(const SyncCredentials& credentials) {
754 DCHECK(thread_checker_.CalledOnValidThread()); 749 DCHECK(thread_checker_.CalledOnValidThread());
755 data_->UpdateCredentials(credentials); 750 data_->UpdateCredentials(credentials);
756 } 751 }
757 752
758 void SyncManager::UpdateEnabledTypes(const ModelTypeSet& enabled_types) { 753 void SyncManagerImpl::UpdateEnabledTypes(const ModelTypeSet& enabled_types) {
759 DCHECK(thread_checker_.CalledOnValidThread()); 754 DCHECK(thread_checker_.CalledOnValidThread());
760 data_->UpdateEnabledTypes(enabled_types); 755 data_->UpdateEnabledTypes(enabled_types);
761 } 756 }
762 757
763 void SyncManager::ThrowUnrecoverableError() { 758 void SyncManagerImpl::ThrowUnrecoverableError() {
764 DCHECK(thread_checker_.CalledOnValidThread()); 759 DCHECK(thread_checker_.CalledOnValidThread());
765 ReadTransaction trans(FROM_HERE, GetUserShare()); 760 ReadTransaction trans(FROM_HERE, GetUserShare());
766 trans.GetWrappedTrans()->OnUnrecoverableError( 761 trans.GetWrappedTrans()->OnUnrecoverableError(
767 FROM_HERE, "Simulating unrecoverable error for testing purposes."); 762 FROM_HERE, "Simulating unrecoverable error for testing purposes.");
768 } 763 }
769 764
770 syncer::ModelTypeSet SyncManager::InitialSyncEndedTypes() { 765 syncer::ModelTypeSet SyncManagerImpl::InitialSyncEndedTypes() {
771 return data_->InitialSyncEndedTypes(); 766 return data_->InitialSyncEndedTypes();
772 } 767 }
773 768
774 syncer::ModelTypeSet SyncManager::GetTypesWithEmptyProgressMarkerToken( 769 syncer::ModelTypeSet SyncManagerImpl::GetTypesWithEmptyProgressMarkerToken(
775 syncer::ModelTypeSet types) { 770 syncer::ModelTypeSet types) {
776 return data_->GetTypesWithEmptyProgressMarkerToken(types); 771 return data_->GetTypesWithEmptyProgressMarkerToken(types);
777 } 772 }
778 773
779 bool SyncManager::PurgePartiallySyncedTypes() { 774 bool SyncManagerImpl::PurgePartiallySyncedTypes() {
780 return data_->PurgePartiallySyncedTypes(); 775 return data_->PurgePartiallySyncedTypes();
781 } 776 }
782 777
783 void SyncManager::StartSyncingNormally( 778 void SyncManagerImpl::StartSyncingNormally(
784 const syncer::ModelSafeRoutingInfo& routing_info) { 779 const syncer::ModelSafeRoutingInfo& routing_info) {
785 DCHECK(thread_checker_.CalledOnValidThread()); 780 DCHECK(thread_checker_.CalledOnValidThread());
786 data_->StartSyncingNormally(routing_info); 781 data_->StartSyncingNormally(routing_info);
787 } 782 }
788 783
789 void SyncManager::SetEncryptionPassphrase(const std::string& passphrase, 784 void SyncManagerImpl::SetEncryptionPassphrase(const std::string& passphrase,
790 bool is_explicit) { 785 bool is_explicit) {
791 DCHECK(thread_checker_.CalledOnValidThread()); 786 DCHECK(thread_checker_.CalledOnValidThread());
792 data_->SetEncryptionPassphrase(passphrase, is_explicit); 787 data_->SetEncryptionPassphrase(passphrase, is_explicit);
793 } 788 }
794 789
795 void SyncManager::SetDecryptionPassphrase(const std::string& passphrase) { 790 void SyncManagerImpl::SetDecryptionPassphrase(const std::string& passphrase) {
796 DCHECK(thread_checker_.CalledOnValidThread()); 791 DCHECK(thread_checker_.CalledOnValidThread());
797 data_->SetDecryptionPassphrase(passphrase); 792 data_->SetDecryptionPassphrase(passphrase);
798 } 793 }
799 794
800 void SyncManager::EnableEncryptEverything() { 795 void SyncManagerImpl::EnableEncryptEverything() {
801 DCHECK(thread_checker_.CalledOnValidThread()); 796 DCHECK(thread_checker_.CalledOnValidThread());
802 { 797 {
803 // Update the cryptographer to know we're now encrypting everything. 798 // Update the cryptographer to know we're now encrypting everything.
804 WriteTransaction trans(FROM_HERE, GetUserShare()); 799 WriteTransaction trans(FROM_HERE, GetUserShare());
805 Cryptographer* cryptographer = trans.GetCryptographer(); 800 Cryptographer* cryptographer = trans.GetCryptographer();
806 // Only set encrypt everything if we know we can encrypt. This allows the 801 // Only set encrypt everything if we know we can encrypt. This allows the
807 // user to cancel encryption if they have forgotten their passphrase. 802 // user to cancel encryption if they have forgotten their passphrase.
808 if (cryptographer->is_ready()) 803 if (cryptographer->is_ready())
809 cryptographer->set_encrypt_everything(); 804 cryptographer->set_encrypt_everything();
810 } 805 }
811 806
812 // Reads from cryptographer so will automatically encrypt all 807 // Reads from cryptographer so will automatically encrypt all
813 // datatypes and update the nigori node as necessary. Will trigger 808 // datatypes and update the nigori node as necessary. Will trigger
814 // OnPassphraseRequired if necessary. 809 // OnPassphraseRequired if necessary.
815 data_->RefreshEncryption(); 810 data_->RefreshEncryption();
816 } 811 }
817 812
818 bool SyncManager::EncryptEverythingEnabledForTest() const { 813 bool SyncManagerImpl::EncryptEverythingEnabledForTest() const {
819 ReadTransaction trans(FROM_HERE, GetUserShare()); 814 ReadTransaction trans(FROM_HERE, GetUserShare());
820 return trans.GetCryptographer()->encrypt_everything(); 815 return trans.GetCryptographer()->encrypt_everything();
821 } 816 }
822 817
823 bool SyncManager::IsUsingExplicitPassphrase() { 818 bool SyncManagerImpl::IsUsingExplicitPassphrase() {
824 return data_ && data_->IsUsingExplicitPassphrase(); 819 return data_ && data_->IsUsingExplicitPassphrase();
825 } 820 }
826 821
827 void SyncManager::ConfigureSyncer( 822 void SyncManagerImpl::ConfigureSyncer(
828 ConfigureReason reason, 823 ConfigureReason reason,
829 const syncer::ModelTypeSet& types_to_config, 824 const syncer::ModelTypeSet& types_to_config,
830 const syncer::ModelSafeRoutingInfo& new_routing_info, 825 const syncer::ModelSafeRoutingInfo& new_routing_info,
831 const base::Closure& ready_task, 826 const base::Closure& ready_task,
832 const base::Closure& retry_task) { 827 const base::Closure& retry_task) {
833 DCHECK(thread_checker_.CalledOnValidThread()); 828 DCHECK(thread_checker_.CalledOnValidThread());
834 DCHECK(!ready_task.is_null()); 829 DCHECK(!ready_task.is_null());
835 DCHECK(!retry_task.is_null()); 830 DCHECK(!retry_task.is_null());
836 831
837 // TODO(zea): set this based on whether cryptographer has keystore 832 // TODO(zea): set this based on whether cryptographer has keystore
838 // encryption key or not (requires opening a transaction). crbug.com/129665. 833 // encryption key or not (requires opening a transaction). crbug.com/129665.
839 ConfigurationParams::KeystoreKeyStatus keystore_key_status = 834 ConfigurationParams::KeystoreKeyStatus keystore_key_status =
840 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY; 835 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY;
841 836
842 ConfigurationParams params(GetSourceFromReason(reason), 837 ConfigurationParams params(GetSourceFromReason(reason),
843 types_to_config, 838 types_to_config,
844 new_routing_info, 839 new_routing_info,
845 keystore_key_status, 840 keystore_key_status,
846 ready_task); 841 ready_task);
847 842
848 if (!data_->scheduler()) { 843 if (!data_->scheduler()) {
849 LOG(INFO) 844 LOG(INFO)
850 << "SyncManager::ConfigureSyncer: could not configure because " 845 << "SyncManagerImpl::ConfigureSyncer: could not configure because "
851 << "scheduler is null"; 846 << "scheduler is null";
852 params.ready_task.Run(); 847 params.ready_task.Run();
853 return; 848 return;
854 } 849 }
855 850
856 data_->scheduler()->Start(syncer::SyncScheduler::CONFIGURATION_MODE); 851 data_->scheduler()->Start(syncer::SyncScheduler::CONFIGURATION_MODE);
857 if (!data_->scheduler()->ScheduleConfiguration(params)) 852 if (!data_->scheduler()->ScheduleConfiguration(params))
858 retry_task.Run(); 853 retry_task.Run();
859 854
860 } 855 }
861 856
862 bool SyncManager::SyncInternal::Init( 857 bool SyncManagerImpl::SyncInternal::Init(
863 const FilePath& database_location, 858 const FilePath& database_location,
864 const WeakHandle<JsEventHandler>& event_handler, 859 const WeakHandle<JsEventHandler>& event_handler,
865 const std::string& sync_server_and_path, 860 const std::string& sync_server_and_path,
866 int port, 861 int port,
867 bool use_ssl, 862 bool use_ssl,
868 const scoped_refptr<base::TaskRunner>& blocking_task_runner, 863 const scoped_refptr<base::TaskRunner>& blocking_task_runner,
869 HttpPostProviderFactory* post_factory, 864 scoped_ptr<HttpPostProviderFactory> post_factory,
870 const syncer::ModelSafeRoutingInfo& model_safe_routing_info, 865 const syncer::ModelSafeRoutingInfo& model_safe_routing_info,
871 const std::vector<syncer::ModelSafeWorker*>& workers, 866 const std::vector<syncer::ModelSafeWorker*>& workers,
872 syncer::ExtensionsActivityMonitor* extensions_activity_monitor, 867 syncer::ExtensionsActivityMonitor* extensions_activity_monitor,
873 ChangeDelegate* change_delegate, 868 ChangeDelegate* change_delegate,
874 const SyncCredentials& credentials, 869 const SyncCredentials& credentials,
875 syncer::SyncNotifier* sync_notifier, 870 scoped_ptr<syncer::SyncNotifier> sync_notifier,
876 const std::string& restored_key_for_bootstrapping, 871 const std::string& restored_key_for_bootstrapping,
877 TestingMode testing_mode, 872 TestingMode testing_mode,
878 Encryptor* encryptor, 873 Encryptor* encryptor,
879 UnrecoverableErrorHandler* unrecoverable_error_handler, 874 UnrecoverableErrorHandler* unrecoverable_error_handler,
880 ReportUnrecoverableErrorFunction report_unrecoverable_error_function) { 875 ReportUnrecoverableErrorFunction report_unrecoverable_error_function) {
881 CHECK(!initialized_); 876 CHECK(!initialized_);
882 877
883 DCHECK(thread_checker_.CalledOnValidThread()); 878 DCHECK(thread_checker_.CalledOnValidThread());
884 879
885 DVLOG(1) << "Starting SyncInternal initialization."; 880 DVLOG(1) << "Starting SyncInternal initialization.";
886 881
887 weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()); 882 weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr());
888 883
889 blocking_task_runner_ = blocking_task_runner; 884 blocking_task_runner_ = blocking_task_runner;
890 885
891 change_delegate_ = change_delegate; 886 change_delegate_ = change_delegate;
892 testing_mode_ = testing_mode; 887 testing_mode_ = testing_mode;
893 888
894 sync_notifier_.reset(sync_notifier); 889 sync_notifier_ = sync_notifier.Pass();
895 890
896 AddObserver(&js_sync_manager_observer_); 891 AddObserver(&js_sync_manager_observer_);
897 SetJsEventHandler(event_handler); 892 SetJsEventHandler(event_handler);
898 893
899 AddObserver(&debug_info_event_listener_); 894 AddObserver(&debug_info_event_listener_);
900 895
901 database_path_ = database_location.Append( 896 database_path_ = database_location.Append(
902 syncable::Directory::kSyncDatabaseFilename); 897 syncable::Directory::kSyncDatabaseFilename);
903 encryptor_ = encryptor; 898 encryptor_ = encryptor;
904 unrecoverable_error_handler_ = unrecoverable_error_handler; 899 unrecoverable_error_handler_ = unrecoverable_error_handler;
(...skipping 13 matching lines...) Expand all
918 } 913 }
919 914
920 DCHECK(backing_store); 915 DCHECK(backing_store);
921 share_.directory.reset( 916 share_.directory.reset(
922 new syncable::Directory(encryptor_, 917 new syncable::Directory(encryptor_,
923 unrecoverable_error_handler_, 918 unrecoverable_error_handler_,
924 report_unrecoverable_error_function_, 919 report_unrecoverable_error_function_,
925 backing_store)); 920 backing_store));
926 921
927 connection_manager_.reset(new SyncAPIServerConnectionManager( 922 connection_manager_.reset(new SyncAPIServerConnectionManager(
928 sync_server_and_path, port, use_ssl, post_factory)); 923 sync_server_and_path, port, use_ssl, post_factory.release()));
929 924
930 net::NetworkChangeNotifier::AddIPAddressObserver(this); 925 net::NetworkChangeNotifier::AddIPAddressObserver(this);
931 observing_ip_address_changes_ = true; 926 observing_ip_address_changes_ = true;
932 927
933 connection_manager()->AddListener(this); 928 connection_manager()->AddListener(this);
934 929
935 // Test mode does not use a syncer context or syncer thread. 930 // Test mode does not use a syncer context or syncer thread.
936 if (testing_mode_ == NON_TEST) { 931 if (testing_mode_ == NON_TEST) {
937 // Build a SyncSessionContext and store the worker in it. 932 // Build a SyncSessionContext and store the worker in it.
938 DVLOG(1) << "Sync is bringing up SyncSessionContext."; 933 DVLOG(1) << "Sync is bringing up SyncSessionContext.";
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
983 ReadTransaction trans(FROM_HERE, GetUserShare()); 978 ReadTransaction trans(FROM_HERE, GetUserShare());
984 trans.GetCryptographer()->Bootstrap(restored_key_for_bootstrapping); 979 trans.GetCryptographer()->Bootstrap(restored_key_for_bootstrapping);
985 trans.GetCryptographer()->AddObserver(this); 980 trans.GetCryptographer()->AddObserver(this);
986 } 981 }
987 982
988 // Notify that initialization is complete. Note: This should be the last to 983 // Notify that initialization is complete. Note: This should be the last to
989 // execute if |signed_in| is false. Reason being in that case we would 984 // execute if |signed_in| is false. Reason being in that case we would
990 // post a task to shutdown sync. But if this function posts any other tasks 985 // post a task to shutdown sync. But if this function posts any other tasks
991 // on the UI thread and if shutdown wins then that tasks would execute on 986 // on the UI thread and if shutdown wins then that tasks would execute on
992 // a freed pointer. This is because UI thread is not shut down. 987 // a freed pointer. This is because UI thread is not shut down.
993 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 988 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
994 OnInitializationComplete( 989 OnInitializationComplete(
995 MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()), 990 MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()),
996 success)); 991 success));
997 992
998 if (!success && testing_mode_ == NON_TEST) 993 if (!success && testing_mode_ == NON_TEST)
999 return false; 994 return false;
1000 995
1001 sync_notifier_->AddObserver(this); 996 sync_notifier_->AddObserver(this);
1002 997
1003 return success; 998 return success;
1004 } 999 }
1005 1000
1006 void SyncManager::SyncInternal::UpdateCryptographerAndNigori( 1001 void SyncManagerImpl::SyncInternal::UpdateCryptographerAndNigori(
1007 const std::string& chrome_version, 1002 const std::string& chrome_version,
1008 const base::Closure& done_callback) { 1003 const base::Closure& done_callback) {
1009 DCHECK(initialized_); 1004 DCHECK(initialized_);
1010 syncer::GetSessionName( 1005 syncer::GetSessionName(
1011 blocking_task_runner_, 1006 blocking_task_runner_,
1012 base::Bind( 1007 base::Bind(
1013 &SyncManager::SyncInternal::UpdateCryptographerAndNigoriCallback, 1008 &SyncManagerImpl::SyncInternal::UpdateCryptographerAndNigoriCallback,
1014 weak_ptr_factory_.GetWeakPtr(), 1009 weak_ptr_factory_.GetWeakPtr(),
1015 chrome_version, 1010 chrome_version,
1016 done_callback)); 1011 done_callback));
1017 } 1012 }
1018 1013
1019 void SyncManager::SyncInternal::UpdateNigoriEncryptionState( 1014 void SyncManagerImpl::SyncInternal::UpdateNigoriEncryptionState(
1020 Cryptographer* cryptographer, 1015 Cryptographer* cryptographer,
1021 WriteNode* nigori_node) { 1016 WriteNode* nigori_node) {
1022 DCHECK(nigori_node); 1017 DCHECK(nigori_node);
1023 sync_pb::NigoriSpecifics nigori = nigori_node->GetNigoriSpecifics(); 1018 sync_pb::NigoriSpecifics nigori = nigori_node->GetNigoriSpecifics();
1024 1019
1025 if (cryptographer->is_ready() && 1020 if (cryptographer->is_ready() &&
1026 nigori_overwrite_count_ < kNigoriOverwriteLimit) { 1021 nigori_overwrite_count_ < kNigoriOverwriteLimit) {
1027 // Does not modify the encrypted blob if the unencrypted data already 1022 // Does not modify the encrypted blob if the unencrypted data already
1028 // matches what is about to be written. 1023 // matches what is about to be written.
1029 sync_pb::EncryptedData original_keys = nigori.encrypted(); 1024 sync_pb::EncryptedData original_keys = nigori.encrypted();
(...skipping 13 matching lines...) Expand all
1043 // Note: we don't try to set using_explicit_passphrase here since if that 1038 // Note: we don't try to set using_explicit_passphrase here since if that
1044 // is lost the user can always set it again. The main point is to preserve 1039 // is lost the user can always set it again. The main point is to preserve
1045 // the encryption keys so all data remains decryptable. 1040 // the encryption keys so all data remains decryptable.
1046 } 1041 }
1047 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); 1042 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori);
1048 1043
1049 // If nothing has changed, this is a no-op. 1044 // If nothing has changed, this is a no-op.
1050 nigori_node->SetNigoriSpecifics(nigori); 1045 nigori_node->SetNigoriSpecifics(nigori);
1051 } 1046 }
1052 1047
1053 void SyncManager::SyncInternal::UpdateCryptographerAndNigoriCallback( 1048 void SyncManagerImpl::SyncInternal::UpdateCryptographerAndNigoriCallback(
1054 const std::string& chrome_version, 1049 const std::string& chrome_version,
1055 const base::Closure& done_callback, 1050 const base::Closure& done_callback,
1056 const std::string& session_name) { 1051 const std::string& session_name) {
1057 if (!directory()->initial_sync_ended_for_type(syncer::NIGORI)) { 1052 if (!directory()->initial_sync_ended_for_type(syncer::NIGORI)) {
1058 done_callback.Run(); // Should only happen during first time sync. 1053 done_callback.Run(); // Should only happen during first time sync.
1059 return; 1054 return;
1060 } 1055 }
1061 1056
1062 bool success = false; 1057 bool success = false;
1063 { 1058 {
1064 WriteTransaction trans(FROM_HERE, GetUserShare()); 1059 WriteTransaction trans(FROM_HERE, GetUserShare());
1065 Cryptographer* cryptographer = trans.GetCryptographer(); 1060 Cryptographer* cryptographer = trans.GetCryptographer();
1066 WriteNode node(&trans); 1061 WriteNode node(&trans);
1067 1062
1068 if (node.InitByTagLookup(kNigoriTag) == syncer::BaseNode::INIT_OK) { 1063 if (node.InitByTagLookup(kNigoriTag) == syncer::BaseNode::INIT_OK) {
1069 sync_pb::NigoriSpecifics nigori(node.GetNigoriSpecifics()); 1064 sync_pb::NigoriSpecifics nigori(node.GetNigoriSpecifics());
1070 Cryptographer::UpdateResult result = cryptographer->Update(nigori); 1065 Cryptographer::UpdateResult result = cryptographer->Update(nigori);
1071 if (result == Cryptographer::NEEDS_PASSPHRASE) { 1066 if (result == Cryptographer::NEEDS_PASSPHRASE) {
1072 sync_pb::EncryptedData pending_keys; 1067 sync_pb::EncryptedData pending_keys;
1073 if (cryptographer->has_pending_keys()) 1068 if (cryptographer->has_pending_keys())
1074 pending_keys = cryptographer->GetPendingKeys(); 1069 pending_keys = cryptographer->GetPendingKeys();
1075 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1070 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
tim (not reviewing) 2012/07/16 21:25:30 SyncManager::Observer is still correct.
Nicolas Zea 2012/07/16 21:54:23 Done.
1076 OnPassphraseRequired(syncer::REASON_DECRYPTION, 1071 OnPassphraseRequired(syncer::REASON_DECRYPTION,
1077 pending_keys)); 1072 pending_keys));
1078 } 1073 }
1079 1074
1080 1075
1081 // Add or update device information. 1076 // Add or update device information.
1082 bool contains_this_device = false; 1077 bool contains_this_device = false;
1083 for (int i = 0; i < nigori.device_information_size(); ++i) { 1078 for (int i = 0; i < nigori.device_information_size(); ++i) {
1084 const sync_pb::DeviceInformation& device_information = 1079 const sync_pb::DeviceInformation& device_information =
1085 nigori.device_information(i); 1080 nigori.device_information(i);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 } else { 1119 } else {
1125 NOTREACHED(); 1120 NOTREACHED();
1126 } 1121 }
1127 } 1122 }
1128 1123
1129 if (success) 1124 if (success)
1130 RefreshEncryption(); 1125 RefreshEncryption();
1131 done_callback.Run(); 1126 done_callback.Run();
1132 } 1127 }
1133 1128
1134 void SyncManager::SyncInternal::NotifyCryptographerState( 1129 void SyncManagerImpl::SyncInternal::NotifyCryptographerState(
1135 Cryptographer * cryptographer) { 1130 Cryptographer * cryptographer) {
1136 // TODO(lipalani): Explore the possibility of hooking this up to 1131 // TODO(lipalani): Explore the possibility of hooking this up to
1137 // SyncManager::Observer and making |AllStatus| a listener for that. 1132 // SyncManagerImpl::Observer and making |AllStatus| a listener for that.
1138 allstatus_.SetCryptographerReady(cryptographer->is_ready()); 1133 allstatus_.SetCryptographerReady(cryptographer->is_ready());
1139 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); 1134 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys());
1140 debug_info_event_listener_.SetCryptographerReady(cryptographer->is_ready()); 1135 debug_info_event_listener_.SetCryptographerReady(cryptographer->is_ready());
1141 debug_info_event_listener_.SetCrytographerHasPendingKeys( 1136 debug_info_event_listener_.SetCrytographerHasPendingKeys(
1142 cryptographer->has_pending_keys()); 1137 cryptographer->has_pending_keys());
1143 } 1138 }
1144 1139
1145 void SyncManager::SyncInternal::StartSyncingNormally( 1140 void SyncManagerImpl::SyncInternal::StartSyncingNormally(
1146 const syncer::ModelSafeRoutingInfo& routing_info) { 1141 const syncer::ModelSafeRoutingInfo& routing_info) {
1147 // Start the sync scheduler. 1142 // Start the sync scheduler.
1148 if (scheduler()) { // NULL during certain unittests. 1143 if (scheduler()) { // NULL during certain unittests.
1149 // TODO(sync): We always want the newest set of routes when we switch back 1144 // TODO(sync): We always want the newest set of routes when we switch back
1150 // to normal mode. Figure out how to enforce set_routing_info is always 1145 // to normal mode. Figure out how to enforce set_routing_info is always
1151 // appropriately set and that it's only modified when switching to normal 1146 // appropriately set and that it's only modified when switching to normal
1152 // mode. 1147 // mode.
1153 session_context()->set_routing_info(routing_info); 1148 session_context()->set_routing_info(routing_info);
1154 scheduler()->Start(SyncScheduler::NORMAL_MODE); 1149 scheduler()->Start(SyncScheduler::NORMAL_MODE);
1155 } 1150 }
1156 } 1151 }
1157 1152
1158 bool SyncManager::SyncInternal::OpenDirectory() { 1153 bool SyncManagerImpl::SyncInternal::OpenDirectory() {
1159 DCHECK(!initialized_) << "Should only happen once"; 1154 DCHECK(!initialized_) << "Should only happen once";
1160 1155
1161 // Set before Open(). 1156 // Set before Open().
1162 change_observer_ = 1157 change_observer_ =
1163 syncer::MakeWeakHandle(js_mutation_event_observer_.AsWeakPtr()); 1158 syncer::MakeWeakHandle(js_mutation_event_observer_.AsWeakPtr());
1164 WeakHandle<syncable::TransactionObserver> transaction_observer( 1159 WeakHandle<syncable::TransactionObserver> transaction_observer(
1165 syncer::MakeWeakHandle(js_mutation_event_observer_.AsWeakPtr())); 1160 syncer::MakeWeakHandle(js_mutation_event_observer_.AsWeakPtr()));
1166 1161
1167 syncable::DirOpenResult open_result = syncable::NOT_INITIALIZED; 1162 syncable::DirOpenResult open_result = syncable::NOT_INITIALIZED;
1168 open_result = directory()->Open(username_for_share(), this, 1163 open_result = directory()->Open(username_for_share(), this,
1169 transaction_observer); 1164 transaction_observer);
1170 if (open_result != syncable::OPENED) { 1165 if (open_result != syncable::OPENED) {
1171 LOG(ERROR) << "Could not open share for:" << username_for_share(); 1166 LOG(ERROR) << "Could not open share for:" << username_for_share();
1172 return false; 1167 return false;
1173 } 1168 }
1174 1169
1175 connection_manager()->set_client_id(directory()->cache_guid()); 1170 connection_manager()->set_client_id(directory()->cache_guid());
1176 return true; 1171 return true;
1177 } 1172 }
1178 1173
1179 bool SyncManager::SyncInternal::SignIn(const SyncCredentials& credentials) { 1174 bool SyncManagerImpl::SyncInternal::SignIn(const SyncCredentials& credentials) {
1180 DCHECK(thread_checker_.CalledOnValidThread()); 1175 DCHECK(thread_checker_.CalledOnValidThread());
1181 DCHECK(share_.name.empty()); 1176 DCHECK(share_.name.empty());
1182 share_.name = credentials.email; 1177 share_.name = credentials.email;
1183 1178
1184 DVLOG(1) << "Signing in user: " << username_for_share(); 1179 DVLOG(1) << "Signing in user: " << username_for_share();
1185 if (!OpenDirectory()) 1180 if (!OpenDirectory())
1186 return false; 1181 return false;
1187 1182
1188 // Retrieve and set the sync notifier state. This should be done 1183 // Retrieve and set the sync notifier state. This should be done
1189 // only after OpenDirectory is called. 1184 // only after OpenDirectory is called.
1190 std::string unique_id = directory()->cache_guid(); 1185 std::string unique_id = directory()->cache_guid();
1191 std::string state = directory()->GetNotificationState(); 1186 std::string state = directory()->GetNotificationState();
1192 DVLOG(1) << "Read notification unique ID: " << unique_id; 1187 DVLOG(1) << "Read notification unique ID: " << unique_id;
1193 if (VLOG_IS_ON(1)) { 1188 if (VLOG_IS_ON(1)) {
1194 std::string encoded_state; 1189 std::string encoded_state;
1195 base::Base64Encode(state, &encoded_state); 1190 base::Base64Encode(state, &encoded_state);
1196 DVLOG(1) << "Read notification state: " << encoded_state; 1191 DVLOG(1) << "Read notification state: " << encoded_state;
1197 } 1192 }
1198 allstatus_.SetUniqueId(unique_id); 1193 allstatus_.SetUniqueId(unique_id);
1199 sync_notifier_->SetUniqueId(unique_id); 1194 sync_notifier_->SetUniqueId(unique_id);
1200 // TODO(tim): Remove once invalidation state has been migrated to new 1195 // TODO(tim): Remove once invalidation state has been migrated to new
1201 // InvalidationStateTracker store. Bug 124140. 1196 // InvalidationStateTracker store. Bug 124140.
1202 sync_notifier_->SetStateDeprecated(state); 1197 sync_notifier_->SetStateDeprecated(state);
1203 1198
1204 UpdateCredentials(credentials); 1199 UpdateCredentials(credentials);
1205 return true; 1200 return true;
1206 } 1201 }
1207 1202
1208 bool SyncManager::SyncInternal::PurgePartiallySyncedTypes() { 1203 bool SyncManagerImpl::SyncInternal::PurgePartiallySyncedTypes() {
1209 syncer::ModelTypeSet partially_synced_types = 1204 syncer::ModelTypeSet partially_synced_types =
1210 syncer::ModelTypeSet::All(); 1205 syncer::ModelTypeSet::All();
1211 partially_synced_types.RemoveAll(InitialSyncEndedTypes()); 1206 partially_synced_types.RemoveAll(InitialSyncEndedTypes());
1212 partially_synced_types.RemoveAll(GetTypesWithEmptyProgressMarkerToken( 1207 partially_synced_types.RemoveAll(GetTypesWithEmptyProgressMarkerToken(
1213 syncer::ModelTypeSet::All())); 1208 syncer::ModelTypeSet::All()));
1214 1209
1215 UMA_HISTOGRAM_COUNTS("Sync.PartiallySyncedTypes", 1210 UMA_HISTOGRAM_COUNTS("Sync.PartiallySyncedTypes",
1216 partially_synced_types.Size()); 1211 partially_synced_types.Size());
1217 if (partially_synced_types.Empty()) 1212 if (partially_synced_types.Empty())
1218 return true; 1213 return true;
1219 return directory()->PurgeEntriesWithTypeIn(partially_synced_types); 1214 return directory()->PurgeEntriesWithTypeIn(partially_synced_types);
1220 } 1215 }
1221 1216
1222 void SyncManager::SyncInternal::UpdateCredentials( 1217 void SyncManagerImpl::SyncInternal::UpdateCredentials(
1223 const SyncCredentials& credentials) { 1218 const SyncCredentials& credentials) {
1224 DCHECK(thread_checker_.CalledOnValidThread()); 1219 DCHECK(thread_checker_.CalledOnValidThread());
1225 DCHECK_EQ(credentials.email, share_.name); 1220 DCHECK_EQ(credentials.email, share_.name);
1226 DCHECK(!credentials.email.empty()); 1221 DCHECK(!credentials.email.empty());
1227 DCHECK(!credentials.sync_token.empty()); 1222 DCHECK(!credentials.sync_token.empty());
1228 1223
1229 observing_ip_address_changes_ = true; 1224 observing_ip_address_changes_ = true;
1230 if (connection_manager()->set_auth_token(credentials.sync_token)) { 1225 if (connection_manager()->set_auth_token(credentials.sync_token)) {
1231 sync_notifier_->UpdateCredentials( 1226 sync_notifier_->UpdateCredentials(
1232 credentials.email, credentials.sync_token); 1227 credentials.email, credentials.sync_token);
1233 if (initialized_ && scheduler()) { 1228 if (initialized_ && scheduler()) {
1234 scheduler()->OnCredentialsUpdated(); 1229 scheduler()->OnCredentialsUpdated();
1235 } 1230 }
1236 } 1231 }
1237 } 1232 }
1238 1233
1239 void SyncManager::SyncInternal::UpdateEnabledTypes( 1234 void SyncManagerImpl::SyncInternal::UpdateEnabledTypes(
1240 const ModelTypeSet& enabled_types) { 1235 const ModelTypeSet& enabled_types) {
1241 DCHECK(thread_checker_.CalledOnValidThread()); 1236 DCHECK(thread_checker_.CalledOnValidThread());
1242 sync_notifier_->UpdateEnabledTypes(enabled_types); 1237 sync_notifier_->UpdateEnabledTypes(enabled_types);
1243 } 1238 }
1244 1239
1245 void SyncManager::SyncInternal::SetEncryptionPassphrase( 1240 void SyncManagerImpl::SyncInternal::SetEncryptionPassphrase(
1246 const std::string& passphrase, 1241 const std::string& passphrase,
1247 bool is_explicit) { 1242 bool is_explicit) {
1248 // We do not accept empty passphrases. 1243 // We do not accept empty passphrases.
1249 if (passphrase.empty()) { 1244 if (passphrase.empty()) {
1250 NOTREACHED() << "Cannot encrypt with an empty passphrase."; 1245 NOTREACHED() << "Cannot encrypt with an empty passphrase.";
1251 return; 1246 return;
1252 } 1247 }
1253 1248
1254 // All accesses to the cryptographer are protected by a transaction. 1249 // All accesses to the cryptographer are protected by a transaction.
1255 WriteTransaction trans(FROM_HERE, GetUserShare()); 1250 WriteTransaction trans(FROM_HERE, GetUserShare());
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 DVLOG_IF(1, !success) 1345 DVLOG_IF(1, !success)
1351 << "Failure in SetEncryptionPassphrase; notifying and returning."; 1346 << "Failure in SetEncryptionPassphrase; notifying and returning.";
1352 DVLOG_IF(1, success) 1347 DVLOG_IF(1, success)
1353 << "Successfully set encryption passphrase; updating nigori and " 1348 << "Successfully set encryption passphrase; updating nigori and "
1354 "reencrypting."; 1349 "reencrypting.";
1355 1350
1356 FinishSetPassphrase( 1351 FinishSetPassphrase(
1357 success, bootstrap_token, is_explicit, &trans, &node); 1352 success, bootstrap_token, is_explicit, &trans, &node);
1358 } 1353 }
1359 1354
1360 void SyncManager::SyncInternal::SetDecryptionPassphrase( 1355 void SyncManagerImpl::SyncInternal::SetDecryptionPassphrase(
1361 const std::string& passphrase) { 1356 const std::string& passphrase) {
1362 // We do not accept empty passphrases. 1357 // We do not accept empty passphrases.
1363 if (passphrase.empty()) { 1358 if (passphrase.empty()) {
1364 NOTREACHED() << "Cannot decrypt with an empty passphrase."; 1359 NOTREACHED() << "Cannot decrypt with an empty passphrase.";
1365 return; 1360 return;
1366 } 1361 }
1367 1362
1368 // All accesses to the cryptographer are protected by a transaction. 1363 // All accesses to the cryptographer are protected by a transaction.
1369 WriteTransaction trans(FROM_HERE, GetUserShare()); 1364 WriteTransaction trans(FROM_HERE, GetUserShare());
1370 Cryptographer* cryptographer = trans.GetCryptographer(); 1365 Cryptographer* cryptographer = trans.GetCryptographer();
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1492 << "Successfully set decryption passphrase; updating nigori and " 1487 << "Successfully set decryption passphrase; updating nigori and "
1493 "reencrypting."; 1488 "reencrypting.";
1494 1489
1495 FinishSetPassphrase(success, 1490 FinishSetPassphrase(success,
1496 bootstrap_token, 1491 bootstrap_token,
1497 nigori_has_explicit_passphrase, 1492 nigori_has_explicit_passphrase,
1498 &trans, 1493 &trans,
1499 &node); 1494 &node);
1500 } 1495 }
1501 1496
1502 void SyncManager::SyncInternal::FinishSetPassphrase( 1497 void SyncManagerImpl::SyncInternal::FinishSetPassphrase(
1503 bool success, 1498 bool success,
1504 const std::string& bootstrap_token, 1499 const std::string& bootstrap_token,
1505 bool is_explicit, 1500 bool is_explicit,
1506 WriteTransaction* trans, 1501 WriteTransaction* trans,
1507 WriteNode* nigori_node) { 1502 WriteNode* nigori_node) {
1508 Cryptographer* cryptographer = trans->GetCryptographer(); 1503 Cryptographer* cryptographer = trans->GetCryptographer();
1509 NotifyCryptographerState(cryptographer); 1504 NotifyCryptographerState(cryptographer);
1510 1505
1511 // It's possible we need to change the bootstrap token even if we failed to 1506 // It's possible we need to change the bootstrap token even if we failed to
1512 // set the passphrase (for example if we need to preserve the new GAIA 1507 // set the passphrase (for example if we need to preserve the new GAIA
1513 // passphrase). 1508 // passphrase).
1514 if (!bootstrap_token.empty()) { 1509 if (!bootstrap_token.empty()) {
1515 DVLOG(1) << "Bootstrap token updated."; 1510 DVLOG(1) << "Bootstrap token updated.";
1516 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1511 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
1517 OnBootstrapTokenUpdated(bootstrap_token)); 1512 OnBootstrapTokenUpdated(bootstrap_token));
1518 } 1513 }
1519 1514
1520 if (!success) { 1515 if (!success) {
1521 if (cryptographer->is_ready()) { 1516 if (cryptographer->is_ready()) {
1522 LOG(ERROR) << "Attempt to change passphrase failed while cryptographer " 1517 LOG(ERROR) << "Attempt to change passphrase failed while cryptographer "
1523 << "was ready."; 1518 << "was ready.";
1524 } else if (cryptographer->has_pending_keys()) { 1519 } else if (cryptographer->has_pending_keys()) {
1525 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1520 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
1526 OnPassphraseRequired(syncer::REASON_DECRYPTION, 1521 OnPassphraseRequired(syncer::REASON_DECRYPTION,
1527 cryptographer->GetPendingKeys())); 1522 cryptographer->GetPendingKeys()));
1528 } else { 1523 } else {
1529 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1524 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
1530 OnPassphraseRequired(syncer::REASON_ENCRYPTION, 1525 OnPassphraseRequired(syncer::REASON_ENCRYPTION,
1531 sync_pb::EncryptedData())); 1526 sync_pb::EncryptedData()));
1532 } 1527 }
1533 return; 1528 return;
1534 } 1529 }
1535 1530
1536 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1531 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
1537 OnPassphraseAccepted()); 1532 OnPassphraseAccepted());
1538 DCHECK(cryptographer->is_ready()); 1533 DCHECK(cryptographer->is_ready());
1539 1534
1540 // TODO(tim): Bug 58231. It would be nice if setting a passphrase didn't 1535 // TODO(tim): Bug 58231. It would be nice if setting a passphrase didn't
1541 // require messing with the Nigori node, because we can't set a passphrase 1536 // require messing with the Nigori node, because we can't set a passphrase
1542 // until download conditions are met vs Cryptographer init. It seems like 1537 // until download conditions are met vs Cryptographer init. It seems like
1543 // it's safe to defer this work. 1538 // it's safe to defer this work.
1544 sync_pb::NigoriSpecifics specifics(nigori_node->GetNigoriSpecifics()); 1539 sync_pb::NigoriSpecifics specifics(nigori_node->GetNigoriSpecifics());
1545 // Does not modify specifics.encrypted() if the original decrypted data was 1540 // Does not modify specifics.encrypted() if the original decrypted data was
1546 // the same. 1541 // the same.
1547 if (!cryptographer->GetKeys(specifics.mutable_encrypted())) { 1542 if (!cryptographer->GetKeys(specifics.mutable_encrypted())) {
1548 NOTREACHED(); 1543 NOTREACHED();
1549 return; 1544 return;
1550 } 1545 }
1551 specifics.set_using_explicit_passphrase(is_explicit); 1546 specifics.set_using_explicit_passphrase(is_explicit);
1552 nigori_node->SetNigoriSpecifics(specifics); 1547 nigori_node->SetNigoriSpecifics(specifics);
1553 1548
1554 // Does nothing if everything is already encrypted or the cryptographer has 1549 // Does nothing if everything is already encrypted or the cryptographer has
1555 // pending keys. 1550 // pending keys.
1556 ReEncryptEverything(trans); 1551 ReEncryptEverything(trans);
1557 } 1552 }
1558 1553
1559 bool SyncManager::SyncInternal::IsUsingExplicitPassphrase() { 1554 bool SyncManagerImpl::SyncInternal::IsUsingExplicitPassphrase() {
1560 ReadTransaction trans(FROM_HERE, &share_); 1555 ReadTransaction trans(FROM_HERE, &share_);
1561 ReadNode node(&trans); 1556 ReadNode node(&trans);
1562 if (node.InitByTagLookup(kNigoriTag) != syncer::BaseNode::INIT_OK) { 1557 if (node.InitByTagLookup(kNigoriTag) != syncer::BaseNode::INIT_OK) {
1563 // TODO(albertb): Plumb an UnrecoverableError all the way back to the PSS. 1558 // TODO(albertb): Plumb an UnrecoverableError all the way back to the PSS.
1564 NOTREACHED(); 1559 NOTREACHED();
1565 return false; 1560 return false;
1566 } 1561 }
1567 1562
1568 return node.GetNigoriSpecifics().using_explicit_passphrase(); 1563 return node.GetNigoriSpecifics().using_explicit_passphrase();
1569 } 1564 }
1570 1565
1571 void SyncManager::SyncInternal::RefreshEncryption() { 1566 void SyncManagerImpl::SyncInternal::RefreshEncryption() {
1572 DCHECK(initialized_); 1567 DCHECK(initialized_);
1573 1568
1574 WriteTransaction trans(FROM_HERE, GetUserShare()); 1569 WriteTransaction trans(FROM_HERE, GetUserShare());
1575 WriteNode node(&trans); 1570 WriteNode node(&trans);
1576 if (node.InitByTagLookup(kNigoriTag) != syncer::BaseNode::INIT_OK) { 1571 if (node.InitByTagLookup(kNigoriTag) != syncer::BaseNode::INIT_OK) {
1577 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not " 1572 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not "
1578 << "found."; 1573 << "found.";
1579 return; 1574 return;
1580 } 1575 }
1581 1576
1582 Cryptographer* cryptographer = trans.GetCryptographer(); 1577 Cryptographer* cryptographer = trans.GetCryptographer();
1583 1578
1584 if (!cryptographer->is_ready()) { 1579 if (!cryptographer->is_ready()) {
1585 DVLOG(1) << "Attempting to encrypt datatypes when cryptographer not " 1580 DVLOG(1) << "Attempting to encrypt datatypes when cryptographer not "
1586 << "initialized, prompting for passphrase."; 1581 << "initialized, prompting for passphrase.";
1587 // TODO(zea): this isn't really decryption, but that's the only way we have 1582 // TODO(zea): this isn't really decryption, but that's the only way we have
1588 // to prompt the user for a passsphrase. See http://crbug.com/91379. 1583 // to prompt the user for a passsphrase. See http://crbug.com/91379.
1589 sync_pb::EncryptedData pending_keys; 1584 sync_pb::EncryptedData pending_keys;
1590 if (cryptographer->has_pending_keys()) 1585 if (cryptographer->has_pending_keys())
1591 pending_keys = cryptographer->GetPendingKeys(); 1586 pending_keys = cryptographer->GetPendingKeys();
1592 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1587 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
1593 OnPassphraseRequired(syncer::REASON_DECRYPTION, 1588 OnPassphraseRequired(syncer::REASON_DECRYPTION,
1594 pending_keys)); 1589 pending_keys));
1595 return; 1590 return;
1596 } 1591 }
1597 1592
1598 UpdateNigoriEncryptionState(cryptographer, &node); 1593 UpdateNigoriEncryptionState(cryptographer, &node);
1599 1594
1600 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); 1595 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes());
1601 1596
1602 // We reencrypt everything regardless of whether the set of encrypted 1597 // We reencrypt everything regardless of whether the set of encrypted
1603 // types changed to ensure that any stray unencrypted entries are overwritten. 1598 // types changed to ensure that any stray unencrypted entries are overwritten.
1604 ReEncryptEverything(&trans); 1599 ReEncryptEverything(&trans);
1605 } 1600 }
1606 1601
1607 // This function iterates over all encrypted types. There are many scenarios in 1602 // This function iterates over all encrypted types. There are many scenarios in
1608 // which data for some or all types is not currently available. In that case, 1603 // which data for some or all types is not currently available. In that case,
1609 // the lookup of the root node will fail and we will skip encryption for that 1604 // the lookup of the root node will fail and we will skip encryption for that
1610 // type. 1605 // type.
1611 void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) { 1606 void SyncManagerImpl::SyncInternal::ReEncryptEverything(
1607 WriteTransaction* trans) {
1612 Cryptographer* cryptographer = trans->GetCryptographer(); 1608 Cryptographer* cryptographer = trans->GetCryptographer();
1613 if (!cryptographer || !cryptographer->is_ready()) 1609 if (!cryptographer || !cryptographer->is_ready())
1614 return; 1610 return;
1615 syncer::ModelTypeSet encrypted_types = GetEncryptedTypes(trans); 1611 syncer::ModelTypeSet encrypted_types = GetEncryptedTypes(trans);
1616 for (syncer::ModelTypeSet::Iterator iter = encrypted_types.First(); 1612 for (syncer::ModelTypeSet::Iterator iter = encrypted_types.First();
1617 iter.Good(); iter.Inc()) { 1613 iter.Good(); iter.Inc()) {
1618 if (iter.Get() == syncer::PASSWORDS || iter.Get() == syncer::NIGORI) 1614 if (iter.Get() == syncer::PASSWORDS || iter.Get() == syncer::NIGORI)
1619 continue; // These types handle encryption differently. 1615 continue; // These types handle encryption differently.
1620 1616
1621 ReadNode type_root(trans); 1617 ReadNode type_root(trans);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1662 if (child.InitByIdLookup(child_id) != syncer::BaseNode::INIT_OK) { 1658 if (child.InitByIdLookup(child_id) != syncer::BaseNode::INIT_OK) {
1663 NOTREACHED(); 1659 NOTREACHED();
1664 return; 1660 return;
1665 } 1661 }
1666 child.SetPasswordSpecifics(child.GetPasswordSpecifics()); 1662 child.SetPasswordSpecifics(child.GetPasswordSpecifics());
1667 child_id = child.GetSuccessorId(); 1663 child_id = child.GetSuccessorId();
1668 } 1664 }
1669 } 1665 }
1670 1666
1671 // NOTE: We notify from within a transaction. 1667 // NOTE: We notify from within a transaction.
1672 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, OnEncryptionComplete()); 1668 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
1669 OnEncryptionComplete());
1673 } 1670 }
1674 1671
1675 SyncManager::~SyncManager() { 1672 SyncManagerImpl::~SyncManagerImpl() {
1676 DCHECK(thread_checker_.CalledOnValidThread()); 1673 DCHECK(thread_checker_.CalledOnValidThread());
1677 delete data_; 1674 delete data_;
1678 } 1675 }
1679 1676
1680 void SyncManager::AddObserver(Observer* observer) { 1677 void SyncManagerImpl::AddObserver(Observer* observer) {
1681 DCHECK(thread_checker_.CalledOnValidThread()); 1678 DCHECK(thread_checker_.CalledOnValidThread());
1682 data_->AddObserver(observer); 1679 data_->AddObserver(observer);
1683 } 1680 }
1684 1681
1685 void SyncManager::RemoveObserver(Observer* observer) { 1682 void SyncManagerImpl::RemoveObserver(Observer* observer) {
1686 DCHECK(thread_checker_.CalledOnValidThread()); 1683 DCHECK(thread_checker_.CalledOnValidThread());
1687 data_->RemoveObserver(observer); 1684 data_->RemoveObserver(observer);
1688 } 1685 }
1689 1686
1690 void SyncManager::StopSyncingForShutdown(const base::Closure& callback) { 1687 void SyncManagerImpl::StopSyncingForShutdown(const base::Closure& callback) {
1691 data_->StopSyncingForShutdown(callback); 1688 data_->StopSyncingForShutdown(callback);
1692 } 1689 }
1693 1690
1694 void SyncManager::SyncInternal::StopSyncingForShutdown( 1691 void SyncManagerImpl::SyncInternal::StopSyncingForShutdown(
1695 const base::Closure& callback) { 1692 const base::Closure& callback) {
1696 DVLOG(2) << "StopSyncingForShutdown"; 1693 DVLOG(2) << "StopSyncingForShutdown";
1697 if (scheduler()) // May be null in tests. 1694 if (scheduler()) // May be null in tests.
1698 scheduler()->RequestStop(callback); 1695 scheduler()->RequestStop(callback);
1699 else 1696 else
1700 created_on_loop_->PostTask(FROM_HERE, callback); 1697 created_on_loop_->PostTask(FROM_HERE, callback);
1701 1698
1702 if (connection_manager_.get()) 1699 if (connection_manager_.get())
1703 connection_manager_->TerminateAllIO(); 1700 connection_manager_->TerminateAllIO();
1704 } 1701 }
1705 1702
1706 void SyncManager::ShutdownOnSyncThread() { 1703 void SyncManagerImpl::ShutdownOnSyncThread() {
1707 DCHECK(thread_checker_.CalledOnValidThread()); 1704 DCHECK(thread_checker_.CalledOnValidThread());
1708 data_->ShutdownOnSyncThread(); 1705 data_->ShutdownOnSyncThread();
1709 } 1706 }
1710 1707
1711 void SyncManager::SyncInternal::ShutdownOnSyncThread() { 1708 void SyncManagerImpl::SyncInternal::ShutdownOnSyncThread() {
1712 DCHECK(thread_checker_.CalledOnValidThread()); 1709 DCHECK(thread_checker_.CalledOnValidThread());
1713 1710
1714 // Prevent any in-flight method calls from running. Also 1711 // Prevent any in-flight method calls from running. Also
1715 // invalidates |weak_handle_this_| and |change_observer_|. 1712 // invalidates |weak_handle_this_| and |change_observer_|.
1716 weak_ptr_factory_.InvalidateWeakPtrs(); 1713 weak_ptr_factory_.InvalidateWeakPtrs();
1717 js_mutation_event_observer_.InvalidateWeakPtrs(); 1714 js_mutation_event_observer_.InvalidateWeakPtrs();
1718 1715
1719 scheduler_.reset(); 1716 scheduler_.reset();
1720 session_context_.reset(); 1717 session_context_.reset();
1721 1718
(...skipping 30 matching lines...) Expand all
1752 change_delegate_ = NULL; 1749 change_delegate_ = NULL;
1753 1750
1754 initialized_ = false; 1751 initialized_ = false;
1755 1752
1756 // We reset these here, since only now we know they will not be 1753 // We reset these here, since only now we know they will not be
1757 // accessed from other threads (since we shut down everything). 1754 // accessed from other threads (since we shut down everything).
1758 change_observer_.Reset(); 1755 change_observer_.Reset();
1759 weak_handle_this_.Reset(); 1756 weak_handle_this_.Reset();
1760 } 1757 }
1761 1758
1762 void SyncManager::SyncInternal::OnIPAddressChanged() { 1759 void SyncManagerImpl::SyncInternal::OnIPAddressChanged() {
1763 DVLOG(1) << "IP address change detected"; 1760 DVLOG(1) << "IP address change detected";
1764 if (!observing_ip_address_changes_) { 1761 if (!observing_ip_address_changes_) {
1765 DVLOG(1) << "IP address change dropped."; 1762 DVLOG(1) << "IP address change dropped.";
1766 return; 1763 return;
1767 } 1764 }
1768 1765
1769 OnIPAddressChangedImpl(); 1766 OnIPAddressChangedImpl();
1770 } 1767 }
1771 1768
1772 void SyncManager::SyncInternal::OnIPAddressChangedImpl() { 1769 void SyncManagerImpl::SyncInternal::OnIPAddressChangedImpl() {
1773 DCHECK(thread_checker_.CalledOnValidThread()); 1770 DCHECK(thread_checker_.CalledOnValidThread());
1774 if (scheduler()) 1771 if (scheduler())
1775 scheduler()->OnConnectionStatusChange(); 1772 scheduler()->OnConnectionStatusChange();
1776 } 1773 }
1777 1774
1778 void SyncManager::SyncInternal::OnServerConnectionEvent( 1775 void SyncManagerImpl::SyncInternal::OnServerConnectionEvent(
1779 const ServerConnectionEvent& event) { 1776 const ServerConnectionEvent& event) {
1780 DCHECK(thread_checker_.CalledOnValidThread()); 1777 DCHECK(thread_checker_.CalledOnValidThread());
1781 if (event.connection_code == 1778 if (event.connection_code ==
1782 syncer::HttpResponse::SERVER_CONNECTION_OK) { 1779 syncer::HttpResponse::SERVER_CONNECTION_OK) {
1783 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1780 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
1784 OnConnectionStatusChange(CONNECTION_OK)); 1781 OnConnectionStatusChange(CONNECTION_OK));
1785 } 1782 }
1786 1783
1787 if (event.connection_code == syncer::HttpResponse::SYNC_AUTH_ERROR) { 1784 if (event.connection_code == syncer::HttpResponse::SYNC_AUTH_ERROR) {
1788 observing_ip_address_changes_ = false; 1785 observing_ip_address_changes_ = false;
1789 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1786 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
1790 OnConnectionStatusChange(CONNECTION_AUTH_ERROR)); 1787 OnConnectionStatusChange(CONNECTION_AUTH_ERROR));
1791 } 1788 }
1792 1789
1793 if (event.connection_code == 1790 if (event.connection_code ==
1794 syncer::HttpResponse::SYNC_SERVER_ERROR) { 1791 syncer::HttpResponse::SYNC_SERVER_ERROR) {
1795 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1792 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
1796 OnConnectionStatusChange(CONNECTION_SERVER_ERROR)); 1793 OnConnectionStatusChange(CONNECTION_SERVER_ERROR));
1797 } 1794 }
1798 } 1795 }
1799 1796
1800 void SyncManager::SyncInternal::HandleTransactionCompleteChangeEvent( 1797 void SyncManagerImpl::SyncInternal::HandleTransactionCompleteChangeEvent(
1801 ModelTypeSet models_with_changes) { 1798 ModelTypeSet models_with_changes) {
1802 // This notification happens immediately after the transaction mutex is 1799 // This notification happens immediately after the transaction mutex is
1803 // released. This allows work to be performed without blocking other threads 1800 // released. This allows work to be performed without blocking other threads
1804 // from acquiring a transaction. 1801 // from acquiring a transaction.
1805 if (!change_delegate_) 1802 if (!change_delegate_)
1806 return; 1803 return;
1807 1804
1808 // Call commit. 1805 // Call commit.
1809 for (ModelTypeSet::Iterator it = models_with_changes.First(); 1806 for (ModelTypeSet::Iterator it = models_with_changes.First();
1810 it.Good(); it.Inc()) { 1807 it.Good(); it.Inc()) {
1811 change_delegate_->OnChangesComplete(it.Get()); 1808 change_delegate_->OnChangesComplete(it.Get());
1812 change_observer_.Call( 1809 change_observer_.Call(
1813 FROM_HERE, &SyncManager::ChangeObserver::OnChangesComplete, it.Get()); 1810 FROM_HERE,
1811 &SyncManagerImpl::ChangeObserver::OnChangesComplete,
1812 it.Get());
1814 } 1813 }
1815 } 1814 }
1816 1815
1817 ModelTypeSet 1816 ModelTypeSet
1818 SyncManager::SyncInternal::HandleTransactionEndingChangeEvent( 1817 SyncManagerImpl::SyncInternal::HandleTransactionEndingChangeEvent(
1819 const ImmutableWriteTransactionInfo& write_transaction_info, 1818 const ImmutableWriteTransactionInfo& write_transaction_info,
1820 syncable::BaseTransaction* trans) { 1819 syncable::BaseTransaction* trans) {
1821 // This notification happens immediately before a syncable WriteTransaction 1820 // This notification happens immediately before a syncable WriteTransaction
1822 // falls out of scope. It happens while the channel mutex is still held, 1821 // falls out of scope. It happens while the channel mutex is still held,
1823 // and while the transaction mutex is held, so it cannot be re-entrant. 1822 // and while the transaction mutex is held, so it cannot be re-entrant.
1824 if (!change_delegate_ || ChangeBuffersAreEmpty()) 1823 if (!change_delegate_ || ChangeBuffersAreEmpty())
1825 return ModelTypeSet(); 1824 return ModelTypeSet();
1826 1825
1827 // This will continue the WriteTransaction using a read only wrapper. 1826 // This will continue the WriteTransaction using a read only wrapper.
1828 // This is the last chance for read to occur in the WriteTransaction 1827 // This is the last chance for read to occur in the WriteTransaction
(...skipping 10 matching lines...) Expand all
1839 1838
1840 ImmutableChangeRecordList ordered_changes; 1839 ImmutableChangeRecordList ordered_changes;
1841 // TODO(akalin): Propagate up the error further (see 1840 // TODO(akalin): Propagate up the error further (see
1842 // http://crbug.com/100907). 1841 // http://crbug.com/100907).
1843 CHECK(change_buffers_[type].GetAllChangesInTreeOrder(&read_trans, 1842 CHECK(change_buffers_[type].GetAllChangesInTreeOrder(&read_trans,
1844 &ordered_changes)); 1843 &ordered_changes));
1845 if (!ordered_changes.Get().empty()) { 1844 if (!ordered_changes.Get().empty()) {
1846 change_delegate_-> 1845 change_delegate_->
1847 OnChangesApplied(type, &read_trans, ordered_changes); 1846 OnChangesApplied(type, &read_trans, ordered_changes);
1848 change_observer_.Call(FROM_HERE, 1847 change_observer_.Call(FROM_HERE,
1849 &SyncManager::ChangeObserver::OnChangesApplied, 1848 &SyncManagerImpl::ChangeObserver::OnChangesApplied,
1850 type, write_transaction_info.Get().id, ordered_changes); 1849 type, write_transaction_info.Get().id, ordered_changes);
1851 models_with_changes.Put(type); 1850 models_with_changes.Put(type);
1852 } 1851 }
1853 change_buffers_[i].Clear(); 1852 change_buffers_[i].Clear();
1854 } 1853 }
1855 return models_with_changes; 1854 return models_with_changes;
1856 } 1855 }
1857 1856
1858 void SyncManager::SyncInternal::HandleCalculateChangesChangeEventFromSyncApi( 1857 void SyncManagerImpl::SyncInternal::
1858 HandleCalculateChangesChangeEventFromSyncApi(
1859 const ImmutableWriteTransactionInfo& write_transaction_info, 1859 const ImmutableWriteTransactionInfo& write_transaction_info,
1860 syncable::BaseTransaction* trans) { 1860 syncable::BaseTransaction* trans) {
1861 if (!scheduler()) { 1861 if (!scheduler()) {
1862 return; 1862 return;
1863 } 1863 }
1864 1864
1865 // We have been notified about a user action changing a sync model. 1865 // We have been notified about a user action changing a sync model.
1866 LOG_IF(WARNING, !ChangeBuffersAreEmpty()) << 1866 LOG_IF(WARNING, !ChangeBuffersAreEmpty()) <<
1867 "CALCULATE_CHANGES called with unapplied old changes."; 1867 "CALCULATE_CHANGES called with unapplied old changes.";
1868 1868
(...skipping 28 matching lines...) Expand all
1897 weak_handle_this_.Call(FROM_HERE, 1897 weak_handle_this_.Call(FROM_HERE,
1898 &SyncInternal::RequestNudgeForDataTypes, 1898 &SyncInternal::RequestNudgeForDataTypes,
1899 FROM_HERE, 1899 FROM_HERE,
1900 mutated_model_types); 1900 mutated_model_types);
1901 } else { 1901 } else {
1902 NOTREACHED(); 1902 NOTREACHED();
1903 } 1903 }
1904 } 1904 }
1905 } 1905 }
1906 1906
1907 void SyncManager::SyncInternal::SetExtraChangeRecordData(int64 id, 1907 void SyncManagerImpl::SyncInternal::SetExtraChangeRecordData(int64 id,
1908 syncer::ModelType type, ChangeReorderBuffer* buffer, 1908 syncer::ModelType type, ChangeReorderBuffer* buffer,
1909 Cryptographer* cryptographer, const syncable::EntryKernel& original, 1909 Cryptographer* cryptographer, const syncable::EntryKernel& original,
1910 bool existed_before, bool exists_now) { 1910 bool existed_before, bool exists_now) {
1911 // If this is a deletion and the datatype was encrypted, we need to decrypt it 1911 // If this is a deletion and the datatype was encrypted, we need to decrypt it
1912 // and attach it to the buffer. 1912 // and attach it to the buffer.
1913 if (!exists_now && existed_before) { 1913 if (!exists_now && existed_before) {
1914 sync_pb::EntitySpecifics original_specifics(original.ref(SPECIFICS)); 1914 sync_pb::EntitySpecifics original_specifics(original.ref(SPECIFICS));
1915 if (type == syncer::PASSWORDS) { 1915 if (type == syncer::PASSWORDS) {
1916 // Passwords must use their own legacy ExtraPasswordChangeRecordData. 1916 // Passwords must use their own legacy ExtraPasswordChangeRecordData.
1917 scoped_ptr<sync_pb::PasswordSpecificsData> data( 1917 scoped_ptr<sync_pb::PasswordSpecificsData> data(
1918 DecryptPasswordSpecifics(original_specifics, cryptographer)); 1918 DecryptPasswordSpecifics(original_specifics, cryptographer));
1919 if (!data.get()) { 1919 if (!data.get()) {
1920 NOTREACHED(); 1920 NOTREACHED();
1921 return; 1921 return;
1922 } 1922 }
1923 buffer->SetExtraDataForId(id, new ExtraPasswordChangeRecordData(*data)); 1923 buffer->SetExtraDataForId(id, new ExtraPasswordChangeRecordData(*data));
1924 } else if (original_specifics.has_encrypted()) { 1924 } else if (original_specifics.has_encrypted()) {
1925 // All other datatypes can just create a new unencrypted specifics and 1925 // All other datatypes can just create a new unencrypted specifics and
1926 // attach it. 1926 // attach it.
1927 const sync_pb::EncryptedData& encrypted = original_specifics.encrypted(); 1927 const sync_pb::EncryptedData& encrypted = original_specifics.encrypted();
1928 if (!cryptographer->Decrypt(encrypted, &original_specifics)) { 1928 if (!cryptographer->Decrypt(encrypted, &original_specifics)) {
1929 NOTREACHED(); 1929 NOTREACHED();
1930 return; 1930 return;
1931 } 1931 }
1932 } 1932 }
1933 buffer->SetSpecificsForId(id, original_specifics); 1933 buffer->SetSpecificsForId(id, original_specifics);
1934 } 1934 }
1935 } 1935 }
1936 1936
1937 void SyncManager::SyncInternal::HandleCalculateChangesChangeEventFromSyncer( 1937 void SyncManagerImpl::SyncInternal::HandleCalculateChangesChangeEventFromSyncer(
1938 const ImmutableWriteTransactionInfo& write_transaction_info, 1938 const ImmutableWriteTransactionInfo& write_transaction_info,
1939 syncable::BaseTransaction* trans) { 1939 syncable::BaseTransaction* trans) {
1940 // We only expect one notification per sync step, so change_buffers_ should 1940 // We only expect one notification per sync step, so change_buffers_ should
1941 // contain no pending entries. 1941 // contain no pending entries.
1942 LOG_IF(WARNING, !ChangeBuffersAreEmpty()) << 1942 LOG_IF(WARNING, !ChangeBuffersAreEmpty()) <<
1943 "CALCULATE_CHANGES called with unapplied old changes."; 1943 "CALCULATE_CHANGES called with unapplied old changes.";
1944 1944
1945 Cryptographer* crypto = directory()->GetCryptographer(trans); 1945 Cryptographer* crypto = directory()->GetCryptographer(trans);
1946 const syncable::ImmutableEntryKernelMutationMap& mutations = 1946 const syncable::ImmutableEntryKernelMutationMap& mutations =
1947 write_transaction_info.Get().mutations; 1947 write_transaction_info.Get().mutations;
(...skipping 18 matching lines...) Expand all
1966 VisiblePropertiesDiffer(it->second, crypto)) { 1966 VisiblePropertiesDiffer(it->second, crypto)) {
1967 change_buffers_[type].PushUpdatedItem( 1967 change_buffers_[type].PushUpdatedItem(
1968 handle, VisiblePositionsDiffer(it->second)); 1968 handle, VisiblePositionsDiffer(it->second));
1969 } 1969 }
1970 1970
1971 SetExtraChangeRecordData(handle, type, &change_buffers_[type], crypto, 1971 SetExtraChangeRecordData(handle, type, &change_buffers_[type], crypto,
1972 it->second.original, existed_before, exists_now); 1972 it->second.original, existed_before, exists_now);
1973 } 1973 }
1974 } 1974 }
1975 1975
1976 SyncStatus SyncManager::SyncInternal::GetStatus() { 1976 SyncStatus SyncManagerImpl::SyncInternal::GetStatus() {
1977 return allstatus_.status(); 1977 return allstatus_.status();
1978 } 1978 }
1979 1979
1980 void SyncManager::SyncInternal::RequestNudge( 1980 void SyncManagerImpl::SyncInternal::RequestNudge(
1981 const tracked_objects::Location& location) { 1981 const tracked_objects::Location& location) {
1982 if (scheduler()) { 1982 if (scheduler()) {
1983 scheduler()->ScheduleNudgeAsync( 1983 scheduler()->ScheduleNudgeAsync(
1984 TimeDelta::FromMilliseconds(0), syncer::NUDGE_SOURCE_LOCAL, 1984 TimeDelta::FromMilliseconds(0), syncer::NUDGE_SOURCE_LOCAL,
1985 ModelTypeSet(), location); 1985 ModelTypeSet(), location);
1986 } 1986 }
1987 } 1987 }
1988 1988
1989 TimeDelta SyncManager::SyncInternal::GetNudgeDelayTimeDelta( 1989 TimeDelta SyncManagerImpl::SyncInternal::GetNudgeDelayTimeDelta(
1990 const ModelType& model_type) { 1990 const ModelType& model_type) {
1991 return NudgeStrategy::GetNudgeDelayTimeDelta(model_type, this); 1991 return NudgeStrategy::GetNudgeDelayTimeDelta(model_type, this);
1992 } 1992 }
1993 1993
1994 void SyncManager::SyncInternal::RequestNudgeForDataTypes( 1994 void SyncManagerImpl::SyncInternal::RequestNudgeForDataTypes(
1995 const tracked_objects::Location& nudge_location, 1995 const tracked_objects::Location& nudge_location,
1996 ModelTypeSet types) { 1996 ModelTypeSet types) {
1997 if (!scheduler()) { 1997 if (!scheduler()) {
1998 NOTREACHED(); 1998 NOTREACHED();
1999 return; 1999 return;
2000 } 2000 }
2001 2001
2002 debug_info_event_listener_.OnNudgeFromDatatype(types.First().Get()); 2002 debug_info_event_listener_.OnNudgeFromDatatype(types.First().Get());
2003 2003
2004 // TODO(lipalani) : Calculate the nudge delay based on all types. 2004 // TODO(lipalani) : Calculate the nudge delay based on all types.
2005 base::TimeDelta nudge_delay = NudgeStrategy::GetNudgeDelayTimeDelta( 2005 base::TimeDelta nudge_delay = NudgeStrategy::GetNudgeDelayTimeDelta(
2006 types.First().Get(), 2006 types.First().Get(),
2007 this); 2007 this);
2008 scheduler()->ScheduleNudgeAsync(nudge_delay, 2008 scheduler()->ScheduleNudgeAsync(nudge_delay,
2009 syncer::NUDGE_SOURCE_LOCAL, 2009 syncer::NUDGE_SOURCE_LOCAL,
2010 types, 2010 types,
2011 nudge_location); 2011 nudge_location);
2012 } 2012 }
2013 2013
2014 void SyncManager::SyncInternal::OnSyncEngineEvent( 2014 void SyncManagerImpl::SyncInternal::OnSyncEngineEvent(
2015 const SyncEngineEvent& event) { 2015 const SyncEngineEvent& event) {
2016 DCHECK(thread_checker_.CalledOnValidThread()); 2016 DCHECK(thread_checker_.CalledOnValidThread());
2017 // Only send an event if this is due to a cycle ending and this cycle 2017 // Only send an event if this is due to a cycle ending and this cycle
2018 // concludes a canonical "sync" process; that is, based on what is known 2018 // concludes a canonical "sync" process; that is, based on what is known
2019 // locally we are "all happy" and up-to-date. There may be new changes on 2019 // locally we are "all happy" and up-to-date. There may be new changes on
2020 // the server, but we'll get them on a subsequent sync. 2020 // the server, but we'll get them on a subsequent sync.
2021 // 2021 //
2022 // Notifications are sent at the end of every sync cycle, regardless of 2022 // Notifications are sent at the end of every sync cycle, regardless of
2023 // whether we should sync again. 2023 // whether we should sync again.
2024 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) { 2024 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) {
2025 { 2025 {
2026 // Check to see if we need to notify the frontend that we have newly 2026 // Check to see if we need to notify the frontend that we have newly
2027 // encrypted types or that we require a passphrase. 2027 // encrypted types or that we require a passphrase.
2028 ReadTransaction trans(FROM_HERE, GetUserShare()); 2028 ReadTransaction trans(FROM_HERE, GetUserShare());
2029 Cryptographer* cryptographer = trans.GetCryptographer(); 2029 Cryptographer* cryptographer = trans.GetCryptographer();
2030 // If we've completed a sync cycle and the cryptographer isn't ready 2030 // If we've completed a sync cycle and the cryptographer isn't ready
2031 // yet, prompt the user for a passphrase. 2031 // yet, prompt the user for a passphrase.
2032 if (cryptographer->has_pending_keys()) { 2032 if (cryptographer->has_pending_keys()) {
2033 DVLOG(1) << "OnPassPhraseRequired Sent"; 2033 DVLOG(1) << "OnPassPhraseRequired Sent";
2034 sync_pb::EncryptedData pending_keys = cryptographer->GetPendingKeys(); 2034 sync_pb::EncryptedData pending_keys = cryptographer->GetPendingKeys();
2035 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 2035 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
2036 OnPassphraseRequired(syncer::REASON_DECRYPTION, 2036 OnPassphraseRequired(syncer::REASON_DECRYPTION,
2037 pending_keys)); 2037 pending_keys));
2038 } else if (!cryptographer->is_ready() && 2038 } else if (!cryptographer->is_ready() &&
2039 event.snapshot.initial_sync_ended().Has(syncer::NIGORI)) { 2039 event.snapshot.initial_sync_ended().Has(syncer::NIGORI)) {
2040 DVLOG(1) << "OnPassphraseRequired sent because cryptographer is not " 2040 DVLOG(1) << "OnPassphraseRequired sent because cryptographer is not "
2041 << "ready"; 2041 << "ready";
2042 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 2042 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
2043 OnPassphraseRequired(syncer::REASON_ENCRYPTION, 2043 OnPassphraseRequired(syncer::REASON_ENCRYPTION,
2044 sync_pb::EncryptedData())); 2044 sync_pb::EncryptedData()));
2045 } 2045 }
2046 2046
2047 NotifyCryptographerState(cryptographer); 2047 NotifyCryptographerState(cryptographer);
2048 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); 2048 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes());
2049 } 2049 }
2050 2050
2051 if (!initialized_) { 2051 if (!initialized_) {
2052 LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not " 2052 LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not "
2053 << "initialized"; 2053 << "initialized";
2054 return; 2054 return;
2055 } 2055 }
2056 2056
2057 if (!event.snapshot.has_more_to_sync()) { 2057 if (!event.snapshot.has_more_to_sync()) {
2058 // To account for a nigori node arriving with stale/bad data, we ensure 2058 // To account for a nigori node arriving with stale/bad data, we ensure
2059 // that the nigori node is up to date at the end of each cycle. 2059 // that the nigori node is up to date at the end of each cycle.
2060 WriteTransaction trans(FROM_HERE, GetUserShare()); 2060 WriteTransaction trans(FROM_HERE, GetUserShare());
2061 WriteNode nigori_node(&trans); 2061 WriteNode nigori_node(&trans);
2062 if (nigori_node.InitByTagLookup(kNigoriTag) == 2062 if (nigori_node.InitByTagLookup(kNigoriTag) ==
2063 syncer::BaseNode::INIT_OK) { 2063 syncer::BaseNode::INIT_OK) {
2064 Cryptographer* cryptographer = trans.GetCryptographer(); 2064 Cryptographer* cryptographer = trans.GetCryptographer();
2065 UpdateNigoriEncryptionState(cryptographer, &nigori_node); 2065 UpdateNigoriEncryptionState(cryptographer, &nigori_node);
2066 } 2066 }
2067 2067
2068 DVLOG(1) << "Sending OnSyncCycleCompleted"; 2068 DVLOG(1) << "Sending OnSyncCycleCompleted";
2069 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 2069 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
2070 OnSyncCycleCompleted(event.snapshot)); 2070 OnSyncCycleCompleted(event.snapshot));
2071 } 2071 }
2072 2072
2073 // This is here for tests, which are still using p2p notifications. 2073 // This is here for tests, which are still using p2p notifications.
2074 // 2074 //
2075 // TODO(chron): Consider changing this back to track has_more_to_sync 2075 // TODO(chron): Consider changing this back to track has_more_to_sync
2076 // only notify peers if a successful commit has occurred. 2076 // only notify peers if a successful commit has occurred.
2077 bool is_notifiable_commit = 2077 bool is_notifiable_commit =
2078 (event.snapshot.model_neutral_state().num_successful_commits > 0); 2078 (event.snapshot.model_neutral_state().num_successful_commits > 0);
2079 if (is_notifiable_commit) { 2079 if (is_notifiable_commit) {
2080 if (sync_notifier_.get()) { 2080 if (sync_notifier_.get()) {
2081 const ModelTypeSet changed_types = 2081 const ModelTypeSet changed_types =
2082 syncer::ModelTypePayloadMapToEnumSet( 2082 syncer::ModelTypePayloadMapToEnumSet(
2083 event.snapshot.source().types); 2083 event.snapshot.source().types);
2084 sync_notifier_->SendNotification(changed_types); 2084 sync_notifier_->SendNotification(changed_types);
2085 } else { 2085 } else {
2086 DVLOG(1) << "Not sending notification: sync_notifier_ is NULL"; 2086 DVLOG(1) << "Not sending notification: sync_notifier_ is NULL";
2087 } 2087 }
2088 } 2088 }
2089 } 2089 }
2090 2090
2091 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { 2091 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) {
2092 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 2092 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
2093 OnStopSyncingPermanently()); 2093 OnStopSyncingPermanently());
2094 return; 2094 return;
2095 } 2095 }
2096 2096
2097 if (event.what_happened == SyncEngineEvent::UPDATED_TOKEN) { 2097 if (event.what_happened == SyncEngineEvent::UPDATED_TOKEN) {
2098 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 2098 FOR_EACH_OBSERVER(SyncManagerImpl::Observer, observers_,
2099 OnUpdatedToken(event.updated_token)); 2099 OnUpdatedToken(event.updated_token));
2100 return; 2100 return;
2101 } 2101 }
2102 2102
2103 if (event.what_happened == SyncEngineEvent::ACTIONABLE_ERROR) { 2103 if (event.what_happened == SyncEngineEvent::ACTIONABLE_ERROR) {
2104 FOR_EACH_OBSERVER( 2104 FOR_EACH_OBSERVER(
2105 SyncManager::Observer, observers_, 2105 SyncManagerImpl::Observer, observers_,
2106 OnActionableError( 2106 OnActionableError(
2107 event.snapshot.model_neutral_state().sync_protocol_error)); 2107 event.snapshot.model_neutral_state().sync_protocol_error));
2108 return; 2108 return;
2109 } 2109 }
2110 2110
2111 } 2111 }
2112 2112
2113 void SyncManager::SyncInternal::SetJsEventHandler( 2113 void SyncManagerImpl::SyncInternal::SetJsEventHandler(
2114 const WeakHandle<JsEventHandler>& event_handler) { 2114 const WeakHandle<JsEventHandler>& event_handler) {
2115 js_event_handler_ = event_handler; 2115 js_event_handler_ = event_handler;
2116 js_sync_manager_observer_.SetJsEventHandler(js_event_handler_); 2116 js_sync_manager_observer_.SetJsEventHandler(js_event_handler_);
2117 js_mutation_event_observer_.SetJsEventHandler(js_event_handler_); 2117 js_mutation_event_observer_.SetJsEventHandler(js_event_handler_);
2118 } 2118 }
2119 2119
2120 void SyncManager::SyncInternal::ProcessJsMessage( 2120 void SyncManagerImpl::SyncInternal::ProcessJsMessage(
2121 const std::string& name, const JsArgList& args, 2121 const std::string& name, const JsArgList& args,
2122 const WeakHandle<JsReplyHandler>& reply_handler) { 2122 const WeakHandle<JsReplyHandler>& reply_handler) {
2123 if (!initialized_) { 2123 if (!initialized_) {
2124 NOTREACHED(); 2124 NOTREACHED();
2125 return; 2125 return;
2126 } 2126 }
2127 2127
2128 if (!reply_handler.IsInitialized()) { 2128 if (!reply_handler.IsInitialized()) {
2129 DVLOG(1) << "Uninitialized reply handler; dropping unknown message " 2129 DVLOG(1) << "Uninitialized reply handler; dropping unknown message "
2130 << name << " with args " << args.ToString(); 2130 << name << " with args " << args.ToString();
2131 return; 2131 return;
2132 } 2132 }
2133 2133
2134 JsMessageHandler js_message_handler = js_message_handlers_[name]; 2134 JsMessageHandler js_message_handler = js_message_handlers_[name];
2135 if (js_message_handler.is_null()) { 2135 if (js_message_handler.is_null()) {
2136 DVLOG(1) << "Dropping unknown message " << name 2136 DVLOG(1) << "Dropping unknown message " << name
2137 << " with args " << args.ToString(); 2137 << " with args " << args.ToString();
2138 return; 2138 return;
2139 } 2139 }
2140 2140
2141 reply_handler.Call(FROM_HERE, 2141 reply_handler.Call(FROM_HERE,
2142 &JsReplyHandler::HandleJsReply, 2142 &JsReplyHandler::HandleJsReply,
2143 name, js_message_handler.Run(args)); 2143 name, js_message_handler.Run(args));
2144 } 2144 }
2145 2145
2146 void SyncManager::SyncInternal::BindJsMessageHandler( 2146 void SyncManagerImpl::SyncInternal::BindJsMessageHandler(
2147 const std::string& name, 2147 const std::string& name,
2148 UnboundJsMessageHandler unbound_message_handler) { 2148 UnboundJsMessageHandler unbound_message_handler) {
2149 js_message_handlers_[name] = 2149 js_message_handlers_[name] =
2150 base::Bind(unbound_message_handler, base::Unretained(this)); 2150 base::Bind(unbound_message_handler, base::Unretained(this));
2151 } 2151 }
2152 2152
2153 DictionaryValue* SyncManager::SyncInternal::NotificationInfoToValue( 2153 DictionaryValue* SyncManagerImpl::SyncInternal::NotificationInfoToValue(
2154 const NotificationInfoMap& notification_info) { 2154 const NotificationInfoMap& notification_info) {
2155 DictionaryValue* value = new DictionaryValue(); 2155 DictionaryValue* value = new DictionaryValue();
2156 2156
2157 for (NotificationInfoMap::const_iterator it = notification_info.begin(); 2157 for (NotificationInfoMap::const_iterator it = notification_info.begin();
2158 it != notification_info.end(); ++it) { 2158 it != notification_info.end(); ++it) {
2159 const std::string& model_type_str = 2159 const std::string& model_type_str =
2160 syncer::ModelTypeToString(it->first); 2160 syncer::ModelTypeToString(it->first);
2161 value->Set(model_type_str, it->second.ToValue()); 2161 value->Set(model_type_str, it->second.ToValue());
2162 } 2162 }
2163 2163
2164 return value; 2164 return value;
2165 } 2165 }
2166 2166
2167 JsArgList SyncManager::SyncInternal::GetNotificationState( 2167 JsArgList SyncManagerImpl::SyncInternal::GetNotificationState(
2168 const JsArgList& args) { 2168 const JsArgList& args) {
2169 bool notifications_enabled = allstatus_.status().notifications_enabled; 2169 bool notifications_enabled = allstatus_.status().notifications_enabled;
2170 ListValue return_args; 2170 ListValue return_args;
2171 return_args.Append(Value::CreateBooleanValue(notifications_enabled)); 2171 return_args.Append(Value::CreateBooleanValue(notifications_enabled));
2172 return JsArgList(&return_args); 2172 return JsArgList(&return_args);
2173 } 2173 }
2174 2174
2175 JsArgList SyncManager::SyncInternal::GetNotificationInfo( 2175 JsArgList SyncManagerImpl::SyncInternal::GetNotificationInfo(
2176 const JsArgList& args) { 2176 const JsArgList& args) {
2177 ListValue return_args; 2177 ListValue return_args;
2178 return_args.Append(NotificationInfoToValue(notification_info_map_)); 2178 return_args.Append(NotificationInfoToValue(notification_info_map_));
2179 return JsArgList(&return_args); 2179 return JsArgList(&return_args);
2180 } 2180 }
2181 2181
2182 JsArgList SyncManager::SyncInternal::GetRootNodeDetails( 2182 JsArgList SyncManagerImpl::SyncInternal::GetRootNodeDetails(
2183 const JsArgList& args) { 2183 const JsArgList& args) {
2184 ReadTransaction trans(FROM_HERE, GetUserShare()); 2184 ReadTransaction trans(FROM_HERE, GetUserShare());
2185 ReadNode root(&trans); 2185 ReadNode root(&trans);
2186 root.InitByRootLookup(); 2186 root.InitByRootLookup();
2187 ListValue return_args; 2187 ListValue return_args;
2188 return_args.Append(root.GetDetailsAsValue()); 2188 return_args.Append(root.GetDetailsAsValue());
2189 return JsArgList(&return_args); 2189 return JsArgList(&return_args);
2190 } 2190 }
2191 2191
2192 JsArgList SyncManager::SyncInternal::GetClientServerTraffic( 2192 JsArgList SyncManagerImpl::SyncInternal::GetClientServerTraffic(
2193 const JsArgList& args) { 2193 const JsArgList& args) {
2194 ListValue return_args; 2194 ListValue return_args;
2195 ListValue* value = traffic_recorder_.ToValue(); 2195 ListValue* value = traffic_recorder_.ToValue();
2196 if (value != NULL) 2196 if (value != NULL)
2197 return_args.Append(value); 2197 return_args.Append(value);
2198 return JsArgList(&return_args); 2198 return JsArgList(&return_args);
2199 } 2199 }
2200 2200
2201 namespace { 2201 namespace {
2202 2202
(...skipping 30 matching lines...) Expand all
2233 continue; 2233 continue;
2234 } 2234 }
2235 node_summaries->Append((node.*info_getter)()); 2235 node_summaries->Append((node.*info_getter)());
2236 } 2236 }
2237 } 2237 }
2238 return JsArgList(&return_args); 2238 return JsArgList(&return_args);
2239 } 2239 }
2240 2240
2241 } // namespace 2241 } // namespace
2242 2242
2243 JsArgList SyncManager::SyncInternal::GetNodeSummariesById( 2243 JsArgList SyncManagerImpl::SyncInternal::GetNodeSummariesById(
2244 const JsArgList& args) { 2244 const JsArgList& args) {
2245 return GetNodeInfoById(args, GetUserShare(), &BaseNode::GetSummaryAsValue); 2245 return GetNodeInfoById(args, GetUserShare(), &BaseNode::GetSummaryAsValue);
2246 } 2246 }
2247 2247
2248 JsArgList SyncManager::SyncInternal::GetNodeDetailsById( 2248 JsArgList SyncManagerImpl::SyncInternal::GetNodeDetailsById(
2249 const JsArgList& args) { 2249 const JsArgList& args) {
2250 return GetNodeInfoById(args, GetUserShare(), &BaseNode::GetDetailsAsValue); 2250 return GetNodeInfoById(args, GetUserShare(), &BaseNode::GetDetailsAsValue);
2251 } 2251 }
2252 2252
2253 JsArgList SyncManager::SyncInternal::GetAllNodes( 2253 JsArgList SyncManagerImpl::SyncInternal::GetAllNodes(
2254 const JsArgList& args) { 2254 const JsArgList& args) {
2255 ListValue return_args; 2255 ListValue return_args;
2256 ListValue* result = new ListValue(); 2256 ListValue* result = new ListValue();
2257 return_args.Append(result); 2257 return_args.Append(result);
2258 2258
2259 ReadTransaction trans(FROM_HERE, GetUserShare()); 2259 ReadTransaction trans(FROM_HERE, GetUserShare());
2260 std::vector<const syncable::EntryKernel*> entry_kernels; 2260 std::vector<const syncable::EntryKernel*> entry_kernels;
2261 trans.GetDirectory()->GetAllEntryKernels(trans.GetWrappedTrans(), 2261 trans.GetDirectory()->GetAllEntryKernels(trans.GetWrappedTrans(),
2262 &entry_kernels); 2262 &entry_kernels);
2263 2263
2264 for (std::vector<const syncable::EntryKernel*>::const_iterator it = 2264 for (std::vector<const syncable::EntryKernel*>::const_iterator it =
2265 entry_kernels.begin(); it != entry_kernels.end(); ++it) { 2265 entry_kernels.begin(); it != entry_kernels.end(); ++it) {
2266 result->Append((*it)->ToValue()); 2266 result->Append((*it)->ToValue());
2267 } 2267 }
2268 2268
2269 return JsArgList(&return_args); 2269 return JsArgList(&return_args);
2270 } 2270 }
2271 2271
2272 JsArgList SyncManager::SyncInternal::GetChildNodeIds( 2272 JsArgList SyncManagerImpl::SyncInternal::GetChildNodeIds(
2273 const JsArgList& args) { 2273 const JsArgList& args) {
2274 ListValue return_args; 2274 ListValue return_args;
2275 ListValue* child_ids = new ListValue(); 2275 ListValue* child_ids = new ListValue();
2276 return_args.Append(child_ids); 2276 return_args.Append(child_ids);
2277 int64 id = GetId(args.Get(), 0); 2277 int64 id = GetId(args.Get(), 0);
2278 if (id != kInvalidId) { 2278 if (id != kInvalidId) {
2279 ReadTransaction trans(FROM_HERE, GetUserShare()); 2279 ReadTransaction trans(FROM_HERE, GetUserShare());
2280 syncable::Directory::ChildHandles child_handles; 2280 syncable::Directory::ChildHandles child_handles;
2281 trans.GetDirectory()->GetChildHandlesByHandle(trans.GetWrappedTrans(), 2281 trans.GetDirectory()->GetChildHandlesByHandle(trans.GetWrappedTrans(),
2282 id, &child_handles); 2282 id, &child_handles);
2283 for (syncable::Directory::ChildHandles::const_iterator it = 2283 for (syncable::Directory::ChildHandles::const_iterator it =
2284 child_handles.begin(); it != child_handles.end(); ++it) { 2284 child_handles.begin(); it != child_handles.end(); ++it) {
2285 child_ids->Append(Value::CreateStringValue( 2285 child_ids->Append(Value::CreateStringValue(
2286 base::Int64ToString(*it))); 2286 base::Int64ToString(*it)));
2287 } 2287 }
2288 } 2288 }
2289 return JsArgList(&return_args); 2289 return JsArgList(&return_args);
2290 } 2290 }
2291 2291
2292 void SyncManager::SyncInternal::OnEncryptedTypesChanged( 2292 void SyncManagerImpl::SyncInternal::OnEncryptedTypesChanged(
2293 syncer::ModelTypeSet encrypted_types, 2293 syncer::ModelTypeSet encrypted_types,
2294 bool encrypt_everything) { 2294 bool encrypt_everything) {
2295 // NOTE: We're in a transaction. 2295 // NOTE: We're in a transaction.
2296 FOR_EACH_OBSERVER( 2296 FOR_EACH_OBSERVER(
2297 SyncManager::Observer, observers_, 2297 SyncManagerImpl::Observer, observers_,
2298 OnEncryptedTypesChanged(encrypted_types, encrypt_everything)); 2298 OnEncryptedTypesChanged(encrypted_types, encrypt_everything));
2299 } 2299 }
2300 2300
2301 void SyncManager::SyncInternal::UpdateNotificationInfo( 2301 void SyncManagerImpl::SyncInternal::UpdateNotificationInfo(
2302 const syncer::ModelTypePayloadMap& type_payloads) { 2302 const syncer::ModelTypePayloadMap& type_payloads) {
2303 for (syncer::ModelTypePayloadMap::const_iterator it = type_payloads.begin(); 2303 for (syncer::ModelTypePayloadMap::const_iterator it = type_payloads.begin();
2304 it != type_payloads.end(); ++it) { 2304 it != type_payloads.end(); ++it) {
2305 NotificationInfo* info = &notification_info_map_[it->first]; 2305 NotificationInfo* info = &notification_info_map_[it->first];
2306 info->total_count++; 2306 info->total_count++;
2307 info->payload = it->second; 2307 info->payload = it->second;
2308 } 2308 }
2309 } 2309 }
2310 2310
2311 void SyncManager::SyncInternal::OnNotificationsEnabled() { 2311 void SyncManagerImpl::SyncInternal::OnNotificationsEnabled() {
2312 DVLOG(1) << "Notifications enabled"; 2312 DVLOG(1) << "Notifications enabled";
2313 allstatus_.SetNotificationsEnabled(true); 2313 allstatus_.SetNotificationsEnabled(true);
2314 if (scheduler()) { 2314 if (scheduler()) {
2315 scheduler()->set_notifications_enabled(true); 2315 scheduler()->set_notifications_enabled(true);
2316 } 2316 }
2317 // TODO(akalin): Separate onNotificationStateChange into 2317 // TODO(akalin): Separate onNotificationStateChange into
2318 // enabled/disabled events. 2318 // enabled/disabled events.
2319 if (js_event_handler_.IsInitialized()) { 2319 if (js_event_handler_.IsInitialized()) {
2320 DictionaryValue details; 2320 DictionaryValue details;
2321 details.Set("enabled", Value::CreateBooleanValue(true)); 2321 details.Set("enabled", Value::CreateBooleanValue(true));
2322 js_event_handler_.Call(FROM_HERE, 2322 js_event_handler_.Call(FROM_HERE,
2323 &JsEventHandler::HandleJsEvent, 2323 &JsEventHandler::HandleJsEvent,
2324 "onNotificationStateChange", 2324 "onNotificationStateChange",
2325 JsEventDetails(&details)); 2325 JsEventDetails(&details));
2326 } 2326 }
2327 } 2327 }
2328 2328
2329 void SyncManager::SyncInternal::OnNotificationsDisabled( 2329 void SyncManagerImpl::SyncInternal::OnNotificationsDisabled(
2330 syncer::NotificationsDisabledReason reason) { 2330 syncer::NotificationsDisabledReason reason) {
2331 DVLOG(1) << "Notifications disabled with reason " 2331 DVLOG(1) << "Notifications disabled with reason "
2332 << syncer::NotificationsDisabledReasonToString(reason); 2332 << syncer::NotificationsDisabledReasonToString(reason);
2333 allstatus_.SetNotificationsEnabled(false); 2333 allstatus_.SetNotificationsEnabled(false);
2334 if (scheduler()) { 2334 if (scheduler()) {
2335 scheduler()->set_notifications_enabled(false); 2335 scheduler()->set_notifications_enabled(false);
2336 } 2336 }
2337 if (js_event_handler_.IsInitialized()) { 2337 if (js_event_handler_.IsInitialized()) {
2338 DictionaryValue details; 2338 DictionaryValue details;
2339 details.Set("enabled", Value::CreateBooleanValue(false)); 2339 details.Set("enabled", Value::CreateBooleanValue(false));
2340 js_event_handler_.Call(FROM_HERE, 2340 js_event_handler_.Call(FROM_HERE,
2341 &JsEventHandler::HandleJsEvent, 2341 &JsEventHandler::HandleJsEvent,
2342 "onNotificationStateChange", 2342 "onNotificationStateChange",
2343 JsEventDetails(&details)); 2343 JsEventDetails(&details));
2344 } 2344 }
2345 // TODO(akalin): Treat a CREDENTIALS_REJECTED state as an auth 2345 // TODO(akalin): Treat a CREDENTIALS_REJECTED state as an auth
2346 // error. 2346 // error.
2347 } 2347 }
2348 2348
2349 void SyncManager::SyncInternal::OnIncomingNotification( 2349 void SyncManagerImpl::SyncInternal::OnIncomingNotification(
2350 const syncer::ModelTypePayloadMap& type_payloads, 2350 const syncer::ModelTypePayloadMap& type_payloads,
2351 syncer::IncomingNotificationSource source) { 2351 syncer::IncomingNotificationSource source) {
2352 DCHECK(thread_checker_.CalledOnValidThread()); 2352 DCHECK(thread_checker_.CalledOnValidThread());
2353 if (source == syncer::LOCAL_NOTIFICATION) { 2353 if (source == syncer::LOCAL_NOTIFICATION) {
2354 if (scheduler()) { 2354 if (scheduler()) {
2355 scheduler()->ScheduleNudgeWithPayloadsAsync( 2355 scheduler()->ScheduleNudgeWithPayloadsAsync(
2356 TimeDelta::FromMilliseconds(kSyncRefreshDelayMsec), 2356 TimeDelta::FromMilliseconds(kSyncRefreshDelayMsec),
2357 syncer::NUDGE_SOURCE_LOCAL_REFRESH, 2357 syncer::NUDGE_SOURCE_LOCAL_REFRESH,
2358 type_payloads, FROM_HERE); 2358 type_payloads, FROM_HERE);
2359 } 2359 }
(...skipping 24 matching lines...) Expand all
2384 } 2384 }
2385 details.SetString("source", (source == syncer::LOCAL_NOTIFICATION) ? 2385 details.SetString("source", (source == syncer::LOCAL_NOTIFICATION) ?
2386 "LOCAL_NOTIFICATION" : "REMOTE_NOTIFICATION"); 2386 "LOCAL_NOTIFICATION" : "REMOTE_NOTIFICATION");
2387 js_event_handler_.Call(FROM_HERE, 2387 js_event_handler_.Call(FROM_HERE,
2388 &JsEventHandler::HandleJsEvent, 2388 &JsEventHandler::HandleJsEvent,
2389 "onIncomingNotification", 2389 "onIncomingNotification",
2390 JsEventDetails(&details)); 2390 JsEventDetails(&details));
2391 } 2391 }
2392 } 2392 }
2393 2393
2394 void SyncManager::SyncInternal::AddObserver( 2394 void SyncManagerImpl::SyncInternal::AddObserver(
2395 SyncManager::Observer* observer) { 2395 SyncManagerImpl::Observer* observer) {
2396 observers_.AddObserver(observer); 2396 observers_.AddObserver(observer);
2397 } 2397 }
2398 2398
2399 void SyncManager::SyncInternal::RemoveObserver( 2399 void SyncManagerImpl::SyncInternal::RemoveObserver(
2400 SyncManager::Observer* observer) { 2400 SyncManagerImpl::Observer* observer) {
2401 observers_.RemoveObserver(observer); 2401 observers_.RemoveObserver(observer);
2402 } 2402 }
2403 2403
2404 void SyncManager::SyncInternal::SetSyncSchedulerForTest( 2404 void SyncManagerImpl::SyncInternal::SetSyncSchedulerForTest(
2405 scoped_ptr<SyncScheduler> sync_scheduler) { 2405 scoped_ptr<SyncScheduler> sync_scheduler) {
2406 scheduler_ = sync_scheduler.Pass(); 2406 scheduler_ = sync_scheduler.Pass();
2407 } 2407 }
2408 2408
2409 SyncStatus SyncManager::GetDetailedStatus() const { 2409 SyncStatus SyncManagerImpl::GetDetailedStatus() const {
2410 return data_->GetStatus(); 2410 return data_->GetStatus();
2411 } 2411 }
2412 2412
2413 void SyncManager::SaveChanges() { 2413 void SyncManagerImpl::SaveChanges() {
2414 DCHECK(thread_checker_.CalledOnValidThread()); 2414 DCHECK(thread_checker_.CalledOnValidThread());
2415 data_->SaveChanges(); 2415 data_->SaveChanges();
2416 } 2416 }
2417 2417
2418 void SyncManager::SyncInternal::SaveChanges() { 2418 void SyncManagerImpl::SyncInternal::SaveChanges() {
2419 directory()->SaveChanges(); 2419 directory()->SaveChanges();
2420 } 2420 }
2421 2421
2422 UserShare* SyncManager::GetUserShare() const { 2422 UserShare* SyncManagerImpl::GetUserShare() const {
2423 return data_->GetUserShare(); 2423 return data_->GetUserShare();
2424 } 2424 }
2425 2425
2426 void SyncManager::RefreshNigori(const std::string& chrome_version, 2426 void SyncManagerImpl::RefreshNigori(const std::string& chrome_version,
2427 const base::Closure& done_callback) { 2427 const base::Closure& done_callback) {
2428 DCHECK(thread_checker_.CalledOnValidThread()); 2428 DCHECK(thread_checker_.CalledOnValidThread());
2429 data_->UpdateCryptographerAndNigori( 2429 data_->UpdateCryptographerAndNigori(
2430 chrome_version, 2430 chrome_version,
2431 done_callback); 2431 done_callback);
2432 } 2432 }
2433 2433
2434 TimeDelta SyncManager::GetNudgeDelayTimeDelta( 2434 TimeDelta SyncManagerImpl::GetNudgeDelayTimeDelta(
2435 const ModelType& model_type) { 2435 const ModelType& model_type) {
2436 return data_->GetNudgeDelayTimeDelta(model_type); 2436 return data_->GetNudgeDelayTimeDelta(model_type);
2437 } 2437 }
2438 2438
2439 void SyncManager::SetSyncSchedulerForTest(scoped_ptr<SyncScheduler> scheduler) { 2439 void SyncManagerImpl::SetSyncSchedulerForTest(
2440 scoped_ptr<SyncScheduler> scheduler) {
2440 data_->SetSyncSchedulerForTest(scheduler.Pass()); 2441 data_->SetSyncSchedulerForTest(scheduler.Pass());
2441 } 2442 }
2442 2443
2443 syncer::ModelTypeSet SyncManager::GetEncryptedDataTypesForTest() const { 2444 syncer::ModelTypeSet SyncManagerImpl::GetEncryptedDataTypesForTest() const {
2444 ReadTransaction trans(FROM_HERE, GetUserShare()); 2445 ReadTransaction trans(FROM_HERE, GetUserShare());
2445 return GetEncryptedTypes(&trans); 2446 return GetEncryptedTypes(&trans);
2446 } 2447 }
2447 2448
2448 bool SyncManager::ReceivedExperiment(syncer::Experiments* experiments) 2449 bool SyncManagerImpl::ReceivedExperiment(
2449 const { 2450 syncer::Experiments* experiments) const {
2450 ReadTransaction trans(FROM_HERE, GetUserShare()); 2451 ReadTransaction trans(FROM_HERE, GetUserShare());
2451 ReadNode node(&trans); 2452 ReadNode node(&trans);
2452 if (node.InitByTagLookup(kNigoriTag) != syncer::BaseNode::INIT_OK) { 2453 if (node.InitByTagLookup(kNigoriTag) != syncer::BaseNode::INIT_OK) {
2453 DVLOG(1) << "Couldn't find Nigori node."; 2454 DVLOG(1) << "Couldn't find Nigori node.";
2454 return false; 2455 return false;
2455 } 2456 }
2456 bool found_experiment = false; 2457 bool found_experiment = false;
2457 if (node.GetNigoriSpecifics().sync_tab_favicons()) { 2458 if (node.GetNigoriSpecifics().sync_tab_favicons()) {
2458 experiments->sync_tab_favicons = true; 2459 experiments->sync_tab_favicons = true;
2459 found_experiment = true; 2460 found_experiment = true;
2460 } 2461 }
2461 return found_experiment; 2462 return found_experiment;
2462 } 2463 }
2463 2464
2464 bool SyncManager::HasUnsyncedItems() const { 2465 bool SyncManagerImpl::HasUnsyncedItems() const {
2465 syncer::ReadTransaction trans(FROM_HERE, GetUserShare()); 2466 syncer::ReadTransaction trans(FROM_HERE, GetUserShare());
2466 return (trans.GetWrappedTrans()->directory()->unsynced_entity_count() != 0); 2467 return (trans.GetWrappedTrans()->directory()->unsynced_entity_count() != 0);
2467 } 2468 }
2468 2469
2469 void SyncManager::SimulateEnableNotificationsForTest() { 2470 void SyncManagerImpl::SimulateEnableNotificationsForTest() {
2470 DCHECK(thread_checker_.CalledOnValidThread()); 2471 DCHECK(thread_checker_.CalledOnValidThread());
2471 data_->OnNotificationsEnabled(); 2472 data_->OnNotificationsEnabled();
2472 } 2473 }
2473 2474
2474 void SyncManager::SimulateDisableNotificationsForTest(int reason) { 2475 void SyncManagerImpl::SimulateDisableNotificationsForTest(int reason) {
2475 DCHECK(thread_checker_.CalledOnValidThread()); 2476 DCHECK(thread_checker_.CalledOnValidThread());
2476 data_->OnNotificationsDisabled( 2477 data_->OnNotificationsDisabled(
2477 static_cast<syncer::NotificationsDisabledReason>(reason)); 2478 static_cast<syncer::NotificationsDisabledReason>(reason));
2478 } 2479 }
2479 2480
2480 void SyncManager::TriggerOnIncomingNotificationForTest( 2481 void SyncManagerImpl::TriggerOnIncomingNotificationForTest(
2481 ModelTypeSet model_types) { 2482 ModelTypeSet model_types) {
2482 DCHECK(thread_checker_.CalledOnValidThread()); 2483 DCHECK(thread_checker_.CalledOnValidThread());
2483 syncer::ModelTypePayloadMap model_types_with_payloads = 2484 syncer::ModelTypePayloadMap model_types_with_payloads =
2484 syncer::ModelTypePayloadMapFromEnumSet(model_types, 2485 syncer::ModelTypePayloadMapFromEnumSet(model_types,
2485 std::string()); 2486 std::string());
2486 2487
2487 data_->OnIncomingNotification(model_types_with_payloads, 2488 data_->OnIncomingNotification(model_types_with_payloads,
2488 syncer::REMOTE_NOTIFICATION); 2489 syncer::REMOTE_NOTIFICATION);
2489 } 2490 }
2490 2491
2491 const char* ConnectionStatusToString(ConnectionStatus status) { 2492 // static.
2492 switch (status) { 2493 int SyncManagerImpl::GetDefaultNudgeDelay() {
2493 case CONNECTION_OK: 2494 return kDefaultNudgeDelayMilliseconds;
2494 return "CONNECTION_OK";
2495 case CONNECTION_AUTH_ERROR:
2496 return "CONNECTION_AUTH_ERROR";
2497 case CONNECTION_SERVER_ERROR:
2498 return "CONNECTION_SERVER_ERROR";
2499 default:
2500 NOTREACHED();
2501 return "INVALID_CONNECTION_STATUS";
2502 }
2503 } 2495 }
2504 2496
2505 // Helper function that converts a PassphraseRequiredReason value to a string. 2497 // static.
2506 const char* PassphraseRequiredReasonToString( 2498 int SyncManagerImpl::GetPreferencesNudgeDelay() {
2507 PassphraseRequiredReason reason) { 2499 return kPreferencesNudgeDelayMilliseconds;
2508 switch (reason) {
2509 case REASON_PASSPHRASE_NOT_REQUIRED:
2510 return "REASON_PASSPHRASE_NOT_REQUIRED";
2511 case REASON_ENCRYPTION:
2512 return "REASON_ENCRYPTION";
2513 case REASON_DECRYPTION:
2514 return "REASON_DECRYPTION";
2515 default:
2516 NOTREACHED();
2517 return "INVALID_REASON";
2518 }
2519 }
2520
2521 // Helper function to determine if initial sync had ended for types.
2522 bool InitialSyncEndedForTypes(syncer::ModelTypeSet types,
2523 syncer::UserShare* share) {
2524 for (syncer::ModelTypeSet::Iterator i = types.First();
2525 i.Good(); i.Inc()) {
2526 if (!share->directory->initial_sync_ended_for_type(i.Get()))
2527 return false;
2528 }
2529 return true;
2530 } 2500 }
2531 2501
2532 } // namespace syncer 2502 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698