OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync/internal_api/sync_manager.h" | 5 #include "chrome/browser/sync/internal_api/sync_manager.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/base64.h" | 9 #include "base/base64.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/compiler_specific.h" |
11 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
| 13 #include "base/memory/ref_counted.h" |
| 14 #include "base/observer_list.h" |
| 15 #include "base/observer_list_threadsafe.h" |
12 #include "base/string_number_conversions.h" | 16 #include "base/string_number_conversions.h" |
13 #include "base/values.h" | 17 #include "base/values.h" |
14 #include "chrome/browser/sync/engine/all_status.h" | 18 #include "chrome/browser/sync/engine/all_status.h" |
15 #include "chrome/browser/sync/engine/net/server_connection_manager.h" | 19 #include "chrome/browser/sync/engine/net/server_connection_manager.h" |
16 #include "chrome/browser/sync/engine/nigori_util.h" | 20 #include "chrome/browser/sync/engine/nigori_util.h" |
17 #include "chrome/browser/sync/engine/syncapi_internal.h" | 21 #include "chrome/browser/sync/engine/syncapi_internal.h" |
18 #include "chrome/browser/sync/engine/syncer_types.h" | 22 #include "chrome/browser/sync/engine/syncer_types.h" |
19 #include "chrome/browser/sync/engine/sync_scheduler.h" | 23 #include "chrome/browser/sync/engine/sync_scheduler.h" |
20 #include "chrome/browser/sync/internal_api/base_node.h" | 24 #include "chrome/browser/sync/internal_api/base_node.h" |
21 #include "chrome/browser/sync/internal_api/change_reorder_buffer.h" | 25 #include "chrome/browser/sync/internal_api/change_reorder_buffer.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 using browser_sync::ModelSafeRoutingInfo; | 69 using browser_sync::ModelSafeRoutingInfo; |
66 using browser_sync::ServerConnectionEvent; | 70 using browser_sync::ServerConnectionEvent; |
67 using browser_sync::ServerConnectionEventListener; | 71 using browser_sync::ServerConnectionEventListener; |
68 using browser_sync::SyncEngineEvent; | 72 using browser_sync::SyncEngineEvent; |
69 using browser_sync::SyncEngineEventListener; | 73 using browser_sync::SyncEngineEventListener; |
70 using browser_sync::SyncScheduler; | 74 using browser_sync::SyncScheduler; |
71 using browser_sync::Syncer; | 75 using browser_sync::Syncer; |
72 using browser_sync::WeakHandle; | 76 using browser_sync::WeakHandle; |
73 using browser_sync::sessions::SyncSessionContext; | 77 using browser_sync::sessions::SyncSessionContext; |
74 using syncable::DirectoryManager; | 78 using syncable::DirectoryManager; |
75 using syncable::EntryKernelMutationMap; | 79 using syncable::ImmutableWriteTransactionInfo; |
76 using syncable::ModelType; | 80 using syncable::ModelType; |
77 using syncable::ModelTypeBitSet; | 81 using syncable::ModelTypeBitSet; |
78 using syncable::SPECIFICS; | 82 using syncable::SPECIFICS; |
79 using sync_pb::GetUpdatesCallerInfo; | 83 using sync_pb::GetUpdatesCallerInfo; |
80 | 84 |
81 typedef GoogleServiceAuthError AuthError; | 85 typedef GoogleServiceAuthError AuthError; |
82 | 86 |
83 namespace { | 87 namespace { |
84 | 88 |
85 static const int kSyncSchedulerDelayMsec = 250; | 89 static const int kSyncSchedulerDelayMsec = 250; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 public JsBackend, | 122 public JsBackend, |
119 public SyncEngineEventListener, | 123 public SyncEngineEventListener, |
120 public ServerConnectionEventListener, | 124 public ServerConnectionEventListener, |
121 public syncable::DirectoryChangeDelegate { | 125 public syncable::DirectoryChangeDelegate { |
122 static const int kDefaultNudgeDelayMilliseconds; | 126 static const int kDefaultNudgeDelayMilliseconds; |
123 static const int kPreferencesNudgeDelayMilliseconds; | 127 static const int kPreferencesNudgeDelayMilliseconds; |
124 public: | 128 public: |
125 explicit SyncInternal(const std::string& name) | 129 explicit SyncInternal(const std::string& name) |
126 : name_(name), | 130 : name_(name), |
127 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 131 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
| 132 change_observers_( |
| 133 new ObserverListThreadSafe<SyncManager::ChangeObserver>()), |
128 registrar_(NULL), | 134 registrar_(NULL), |
| 135 change_delegate_(NULL), |
129 initialized_(false), | 136 initialized_(false), |
130 setup_for_test_mode_(false), | 137 setup_for_test_mode_(false), |
131 observing_ip_address_changes_(false) { | 138 observing_ip_address_changes_(false) { |
132 // Pre-fill |notification_info_map_|. | 139 // Pre-fill |notification_info_map_|. |
133 for (int i = syncable::FIRST_REAL_MODEL_TYPE; | 140 for (int i = syncable::FIRST_REAL_MODEL_TYPE; |
134 i < syncable::MODEL_TYPE_COUNT; ++i) { | 141 i < syncable::MODEL_TYPE_COUNT; ++i) { |
135 notification_info_map_.insert( | 142 notification_info_map_.insert( |
136 std::make_pair(syncable::ModelTypeFromInt(i), NotificationInfo())); | 143 std::make_pair(syncable::ModelTypeFromInt(i), NotificationInfo())); |
137 } | 144 } |
138 | 145 |
(...skipping 25 matching lines...) Expand all Loading... |
164 CHECK(!initialized_); | 171 CHECK(!initialized_); |
165 } | 172 } |
166 | 173 |
167 bool Init(const FilePath& database_location, | 174 bool Init(const FilePath& database_location, |
168 const WeakHandle<JsEventHandler>& event_handler, | 175 const WeakHandle<JsEventHandler>& event_handler, |
169 const std::string& sync_server_and_path, | 176 const std::string& sync_server_and_path, |
170 int port, | 177 int port, |
171 bool use_ssl, | 178 bool use_ssl, |
172 HttpPostProviderFactory* post_factory, | 179 HttpPostProviderFactory* post_factory, |
173 ModelSafeWorkerRegistrar* model_safe_worker_registrar, | 180 ModelSafeWorkerRegistrar* model_safe_worker_registrar, |
| 181 ChangeDelegate* change_delegate, |
174 const std::string& user_agent, | 182 const std::string& user_agent, |
175 const SyncCredentials& credentials, | 183 const SyncCredentials& credentials, |
176 sync_notifier::SyncNotifier* sync_notifier, | 184 sync_notifier::SyncNotifier* sync_notifier, |
177 const std::string& restored_key_for_bootstrapping, | 185 const std::string& restored_key_for_bootstrapping, |
178 bool setup_for_test_mode); | 186 bool setup_for_test_mode); |
179 | 187 |
180 // Sign into sync with given credentials. | 188 // Sign into sync with given credentials. |
181 // We do not verify the tokens given. After this call, the tokens are set | 189 // We do not verify the tokens given. After this call, the tokens are set |
182 // and the sync DB is open. True if successful, false if something | 190 // and the sync DB is open. True if successful, false if something |
183 // went wrong. | 191 // went wrong. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 | 225 |
218 // Call periodically from a database-safe thread to persist recent changes | 226 // Call periodically from a database-safe thread to persist recent changes |
219 // to the syncapi model. | 227 // to the syncapi model. |
220 void SaveChanges(); | 228 void SaveChanges(); |
221 | 229 |
222 // DirectoryChangeDelegate implementation. | 230 // DirectoryChangeDelegate implementation. |
223 // This listener is called upon completion of a syncable transaction, and | 231 // This listener is called upon completion of a syncable transaction, and |
224 // builds the list of sync-engine initiated changes that will be forwarded to | 232 // builds the list of sync-engine initiated changes that will be forwarded to |
225 // the SyncManager's Observers. | 233 // the SyncManager's Observers. |
226 virtual void HandleTransactionCompleteChangeEvent( | 234 virtual void HandleTransactionCompleteChangeEvent( |
227 const ModelTypeBitSet& models_with_changes); | 235 const ModelTypeBitSet& models_with_changes) OVERRIDE; |
228 virtual ModelTypeBitSet HandleTransactionEndingChangeEvent( | 236 virtual ModelTypeBitSet HandleTransactionEndingChangeEvent( |
229 syncable::BaseTransaction* trans); | 237 const ImmutableWriteTransactionInfo& write_transaction_info, |
| 238 syncable::BaseTransaction* trans) OVERRIDE; |
230 virtual void HandleCalculateChangesChangeEventFromSyncApi( | 239 virtual void HandleCalculateChangesChangeEventFromSyncApi( |
231 const EntryKernelMutationMap& mutations, | 240 const ImmutableWriteTransactionInfo& write_transaction_info, |
232 syncable::BaseTransaction* trans); | 241 syncable::BaseTransaction* trans) OVERRIDE; |
233 virtual void HandleCalculateChangesChangeEventFromSyncer( | 242 virtual void HandleCalculateChangesChangeEventFromSyncer( |
234 const EntryKernelMutationMap& mutations, | 243 const ImmutableWriteTransactionInfo& write_transaction_info, |
235 syncable::BaseTransaction* trans); | 244 syncable::BaseTransaction* trans) OVERRIDE; |
236 | 245 |
237 // Listens for notifications from the ServerConnectionManager | 246 // Listens for notifications from the ServerConnectionManager |
238 void HandleServerConnectionEvent(const ServerConnectionEvent& event); | 247 void HandleServerConnectionEvent(const ServerConnectionEvent& event); |
239 | 248 |
240 // Open the directory named with username_for_share | 249 // Open the directory named with username_for_share |
241 bool OpenDirectory(); | 250 bool OpenDirectory(); |
242 | 251 |
243 // SyncNotifierObserver implementation. | 252 // SyncNotifierObserver implementation. |
244 virtual void OnNotificationStateChange( | 253 virtual void OnNotificationStateChange( |
245 bool notifications_enabled); | 254 bool notifications_enabled) OVERRIDE; |
246 | 255 |
247 virtual void OnIncomingNotification( | 256 virtual void OnIncomingNotification( |
248 const syncable::ModelTypePayloadMap& type_payloads); | 257 const syncable::ModelTypePayloadMap& type_payloads) OVERRIDE; |
249 | 258 |
250 virtual void StoreState(const std::string& cookie); | 259 virtual void StoreState(const std::string& cookie) OVERRIDE; |
251 | 260 |
252 // Thread-safe observers_ accessors. | 261 void AddChangeObserver(SyncManager::ChangeObserver* observer); |
253 void CopyObservers(ObserverList<SyncManager::Observer>* observers_copy); | 262 void RemoveChangeObserver(SyncManager::ChangeObserver* observer); |
254 bool HaveObservers() const; | 263 |
255 void AddObserver(SyncManager::Observer* observer); | 264 void AddObserver(SyncManager::Observer* observer); |
256 void RemoveObserver(SyncManager::Observer* observer); | 265 void RemoveObserver(SyncManager::Observer* observer); |
257 | 266 |
258 // Accessors for the private members. | 267 // Accessors for the private members. |
259 DirectoryManager* dir_manager() { return share_.dir_manager.get(); } | 268 DirectoryManager* dir_manager() { return share_.dir_manager.get(); } |
260 SyncAPIServerConnectionManager* connection_manager() { | 269 SyncAPIServerConnectionManager* connection_manager() { |
261 return connection_manager_.get(); | 270 return connection_manager_.get(); |
262 } | 271 } |
263 SyncScheduler* scheduler() { return scheduler_.get(); } | 272 SyncScheduler* scheduler() { return scheduler_.get(); } |
264 UserShare* GetUserShare() { | 273 UserShare* GetUserShare() { |
(...skipping 25 matching lines...) Expand all Loading... |
290 // |buffer|'s specifics field to contain the unencrypted data. | 299 // |buffer|'s specifics field to contain the unencrypted data. |
291 void SetExtraChangeRecordData(int64 id, | 300 void SetExtraChangeRecordData(int64 id, |
292 syncable::ModelType type, | 301 syncable::ModelType type, |
293 ChangeReorderBuffer* buffer, | 302 ChangeReorderBuffer* buffer, |
294 Cryptographer* cryptographer, | 303 Cryptographer* cryptographer, |
295 const syncable::EntryKernel& original, | 304 const syncable::EntryKernel& original, |
296 bool existed_before, | 305 bool existed_before, |
297 bool exists_now); | 306 bool exists_now); |
298 | 307 |
299 // Called only by our NetworkChangeNotifier. | 308 // Called only by our NetworkChangeNotifier. |
300 virtual void OnIPAddressChanged(); | 309 virtual void OnIPAddressChanged() OVERRIDE; |
301 | 310 |
302 bool InitialSyncEndedForAllEnabledTypes() { | 311 bool InitialSyncEndedForAllEnabledTypes() { |
303 syncable::ModelTypeSet types; | 312 syncable::ModelTypeSet types; |
304 ModelSafeRoutingInfo enabled_types; | 313 ModelSafeRoutingInfo enabled_types; |
305 registrar_->GetModelSafeRoutingInfo(&enabled_types); | 314 registrar_->GetModelSafeRoutingInfo(&enabled_types); |
306 for (ModelSafeRoutingInfo::const_iterator i = enabled_types.begin(); | 315 for (ModelSafeRoutingInfo::const_iterator i = enabled_types.begin(); |
307 i != enabled_types.end(); ++i) { | 316 i != enabled_types.end(); ++i) { |
308 types.insert(i->first); | 317 types.insert(i->first); |
309 } | 318 } |
310 | 319 |
311 return InitialSyncEndedForTypes(types, &share_); | 320 return InitialSyncEndedForTypes(types, &share_); |
312 } | 321 } |
313 | 322 |
314 // SyncEngineEventListener implementation. | 323 // SyncEngineEventListener implementation. |
315 virtual void OnSyncEngineEvent(const SyncEngineEvent& event); | 324 virtual void OnSyncEngineEvent(const SyncEngineEvent& event) OVERRIDE; |
316 | 325 |
317 // ServerConnectionEventListener implementation. | 326 // ServerConnectionEventListener implementation. |
318 virtual void OnServerConnectionEvent(const ServerConnectionEvent& event); | 327 virtual void OnServerConnectionEvent( |
| 328 const ServerConnectionEvent& event) OVERRIDE; |
319 | 329 |
320 // JsBackend implementation. | 330 // JsBackend implementation. |
321 virtual void SetJsEventHandler( | 331 virtual void SetJsEventHandler( |
322 const WeakHandle<JsEventHandler>& event_handler) OVERRIDE; | 332 const WeakHandle<JsEventHandler>& event_handler) OVERRIDE; |
323 virtual void ProcessJsMessage( | 333 virtual void ProcessJsMessage( |
324 const std::string& name, const JsArgList& args, | 334 const std::string& name, const JsArgList& args, |
325 const WeakHandle<JsReplyHandler>& reply_handler) OVERRIDE; | 335 const WeakHandle<JsReplyHandler>& reply_handler) OVERRIDE; |
326 | 336 |
327 private: | 337 private: |
328 struct NotificationInfo { | 338 struct NotificationInfo { |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 // we'd have another worker class which implements | 487 // we'd have another worker class which implements |
478 // HandleCalculateChangesChangeEventFromSyncApi() and we'd pass it a | 488 // HandleCalculateChangesChangeEventFromSyncApi() and we'd pass it a |
479 // WeakHandle when we construct it. | 489 // WeakHandle when we construct it. |
480 WeakHandle<SyncInternal> weak_handle_this_; | 490 WeakHandle<SyncInternal> weak_handle_this_; |
481 | 491 |
482 // We couple the DirectoryManager and username together in a UserShare member | 492 // We couple the DirectoryManager and username together in a UserShare member |
483 // so we can return a handle to share_ to clients of the API for use when | 493 // so we can return a handle to share_ to clients of the API for use when |
484 // constructing any transaction type. | 494 // constructing any transaction type. |
485 UserShare share_; | 495 UserShare share_; |
486 | 496 |
487 // We have to lock around every observers_ access because it can get accessed | 497 // Even though observers are always added/removed from the sync |
488 // from any thread and added to/removed from on the core thread. | 498 // thread, we still need to use a thread-safe observer list as we |
489 mutable base::Lock observers_lock_; | 499 // can notify from any thread. |
| 500 scoped_refptr<ObserverListThreadSafe<SyncManager::ChangeObserver> > |
| 501 change_observers_; |
| 502 |
490 ObserverList<SyncManager::Observer> observers_; | 503 ObserverList<SyncManager::Observer> observers_; |
491 | 504 |
492 // The ServerConnectionManager used to abstract communication between the | 505 // The ServerConnectionManager used to abstract communication between the |
493 // client (the Syncer) and the sync server. | 506 // client (the Syncer) and the sync server. |
494 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; | 507 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; |
495 | 508 |
496 // The scheduler that runs the Syncer. Needs to be explicitly | 509 // The scheduler that runs the Syncer. Needs to be explicitly |
497 // Start()ed. | 510 // Start()ed. |
498 scoped_ptr<SyncScheduler> scheduler_; | 511 scoped_ptr<SyncScheduler> scheduler_; |
499 | 512 |
500 // The SyncNotifier which notifies us when updates need to be downloaded. | 513 // The SyncNotifier which notifies us when updates need to be downloaded. |
501 scoped_ptr<sync_notifier::SyncNotifier> sync_notifier_; | 514 scoped_ptr<sync_notifier::SyncNotifier> sync_notifier_; |
502 | 515 |
503 // A multi-purpose status watch object that aggregates stats from various | 516 // A multi-purpose status watch object that aggregates stats from various |
504 // sync components. | 517 // sync components. |
505 AllStatus allstatus_; | 518 AllStatus allstatus_; |
506 | 519 |
507 // Each element of this array is a store of change records produced by | 520 // Each element of this array is a store of change records produced by |
508 // HandleChangeEvent during the CALCULATE_CHANGES step. The changes are | 521 // HandleChangeEvent during the CALCULATE_CHANGES step. The changes are |
509 // segregated by model type, and are stored here to be processed and | 522 // segregated by model type, and are stored here to be processed and |
510 // forwarded to the observer slightly later, at the TRANSACTION_ENDING | 523 // forwarded to the observer slightly later, at the TRANSACTION_ENDING |
511 // step by HandleTransactionEndingChangeEvent. The list is cleared in the | 524 // step by HandleTransactionEndingChangeEvent. The list is cleared in the |
512 // TRANSACTION_COMPLETE step by HandleTransactionCompleteChangeEvent. | 525 // TRANSACTION_COMPLETE step by HandleTransactionCompleteChangeEvent. |
513 ChangeReorderBuffer change_buffers_[syncable::MODEL_TYPE_COUNT]; | 526 ChangeReorderBuffer change_buffers_[syncable::MODEL_TYPE_COUNT]; |
514 | 527 |
515 // The entity that provides us with information about which types to sync. | 528 // The entity that provides us with information about which types to sync. |
516 // The instance is shared between the SyncManager and the Syncer. | 529 // The instance is shared between the SyncManager and the Syncer. |
517 ModelSafeWorkerRegistrar* registrar_; | 530 ModelSafeWorkerRegistrar* registrar_; |
518 | 531 |
| 532 SyncManager::ChangeDelegate* change_delegate_; |
| 533 |
519 // Set to true once Init has been called. | 534 // Set to true once Init has been called. |
520 bool initialized_; | 535 bool initialized_; |
521 | 536 |
522 // True if the SyncManager should be running in test mode (no sync | 537 // True if the SyncManager should be running in test mode (no sync |
523 // scheduler actually communicating with the server). | 538 // scheduler actually communicating with the server). |
524 bool setup_for_test_mode_; | 539 bool setup_for_test_mode_; |
525 | 540 |
526 // Whether we should respond to an IP address change notification. | 541 // Whether we should respond to an IP address change notification. |
527 bool observing_ip_address_changes_; | 542 bool observing_ip_address_changes_; |
528 | 543 |
529 // Map used to store the notification info to be displayed in | 544 // Map used to store the notification info to be displayed in |
530 // about:sync page. | 545 // about:sync page. |
531 NotificationInfoMap notification_info_map_; | 546 NotificationInfoMap notification_info_map_; |
532 | 547 |
533 // These are for interacting with chrome://sync-internals. | 548 // These are for interacting with chrome://sync-internals. |
534 JsMessageHandlerMap js_message_handlers_; | 549 JsMessageHandlerMap js_message_handlers_; |
535 WeakHandle<JsEventHandler> js_event_handler_; | 550 WeakHandle<JsEventHandler> js_event_handler_; |
536 JsSyncManagerObserver js_sync_manager_observer_; | 551 JsSyncManagerObserver js_sync_manager_observer_; |
537 JsTransactionObserver js_transaction_observer_; | 552 JsTransactionObserver js_transaction_observer_; |
538 }; | 553 }; |
539 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200; | 554 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200; |
540 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000; | 555 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000; |
541 | 556 |
| 557 SyncManager::ChangeDelegate::~ChangeDelegate() {} |
| 558 |
| 559 SyncManager::ChangeObserver::~ChangeObserver() {} |
| 560 |
542 SyncManager::Observer::~Observer() {} | 561 SyncManager::Observer::~Observer() {} |
543 | 562 |
544 SyncManager::SyncManager(const std::string& name) | 563 SyncManager::SyncManager(const std::string& name) |
545 : data_(new SyncInternal(name)) {} | 564 : data_(new SyncInternal(name)) {} |
546 | 565 |
547 SyncManager::Status::Status() | 566 SyncManager::Status::Status() |
548 : summary(INVALID), | 567 : summary(INVALID), |
549 authenticated(false), | 568 authenticated(false), |
550 server_up(false), | 569 server_up(false), |
551 server_reachable(false), | 570 server_reachable(false), |
(...skipping 25 matching lines...) Expand all Loading... |
577 } | 596 } |
578 | 597 |
579 bool SyncManager::Init( | 598 bool SyncManager::Init( |
580 const FilePath& database_location, | 599 const FilePath& database_location, |
581 const WeakHandle<JsEventHandler>& event_handler, | 600 const WeakHandle<JsEventHandler>& event_handler, |
582 const std::string& sync_server_and_path, | 601 const std::string& sync_server_and_path, |
583 int sync_server_port, | 602 int sync_server_port, |
584 bool use_ssl, | 603 bool use_ssl, |
585 HttpPostProviderFactory* post_factory, | 604 HttpPostProviderFactory* post_factory, |
586 ModelSafeWorkerRegistrar* registrar, | 605 ModelSafeWorkerRegistrar* registrar, |
| 606 ChangeDelegate* change_delegate, |
587 const std::string& user_agent, | 607 const std::string& user_agent, |
588 const SyncCredentials& credentials, | 608 const SyncCredentials& credentials, |
589 sync_notifier::SyncNotifier* sync_notifier, | 609 sync_notifier::SyncNotifier* sync_notifier, |
590 const std::string& restored_key_for_bootstrapping, | 610 const std::string& restored_key_for_bootstrapping, |
591 bool setup_for_test_mode) { | 611 bool setup_for_test_mode) { |
| 612 DCHECK(thread_checker_.CalledOnValidThread()); |
592 DCHECK(post_factory); | 613 DCHECK(post_factory); |
593 VLOG(1) << "SyncManager starting Init..."; | 614 VLOG(1) << "SyncManager starting Init..."; |
594 string server_string(sync_server_and_path); | 615 string server_string(sync_server_and_path); |
595 return data_->Init(database_location, | 616 return data_->Init(database_location, |
596 event_handler, | 617 event_handler, |
597 server_string, | 618 server_string, |
598 sync_server_port, | 619 sync_server_port, |
599 use_ssl, | 620 use_ssl, |
600 post_factory, | 621 post_factory, |
601 registrar, | 622 registrar, |
| 623 change_delegate, |
602 user_agent, | 624 user_agent, |
603 credentials, | 625 credentials, |
604 sync_notifier, | 626 sync_notifier, |
605 restored_key_for_bootstrapping, | 627 restored_key_for_bootstrapping, |
606 setup_for_test_mode); | 628 setup_for_test_mode); |
607 } | 629 } |
608 | 630 |
609 void SyncManager::UpdateCredentials(const SyncCredentials& credentials) { | 631 void SyncManager::UpdateCredentials(const SyncCredentials& credentials) { |
| 632 DCHECK(thread_checker_.CalledOnValidThread()); |
610 data_->UpdateCredentials(credentials); | 633 data_->UpdateCredentials(credentials); |
611 } | 634 } |
612 | 635 |
613 void SyncManager::UpdateEnabledTypes() { | 636 void SyncManager::UpdateEnabledTypes() { |
| 637 DCHECK(thread_checker_.CalledOnValidThread()); |
614 data_->UpdateEnabledTypes(); | 638 data_->UpdateEnabledTypes(); |
615 } | 639 } |
616 | 640 |
617 void SyncManager::MaybeSetSyncTabsInNigoriNode( | 641 void SyncManager::MaybeSetSyncTabsInNigoriNode( |
618 const syncable::ModelTypeSet enabled_types) { | 642 const syncable::ModelTypeSet enabled_types) { |
| 643 DCHECK(thread_checker_.CalledOnValidThread()); |
619 data_->MaybeSetSyncTabsInNigoriNode(enabled_types); | 644 data_->MaybeSetSyncTabsInNigoriNode(enabled_types); |
620 } | 645 } |
621 | 646 |
622 bool SyncManager::InitialSyncEndedForAllEnabledTypes() { | 647 bool SyncManager::InitialSyncEndedForAllEnabledTypes() { |
623 return data_->InitialSyncEndedForAllEnabledTypes(); | 648 return data_->InitialSyncEndedForAllEnabledTypes(); |
624 } | 649 } |
625 | 650 |
626 void SyncManager::StartSyncingNormally() { | 651 void SyncManager::StartSyncingNormally() { |
| 652 DCHECK(thread_checker_.CalledOnValidThread()); |
627 data_->StartSyncingNormally(); | 653 data_->StartSyncingNormally(); |
628 } | 654 } |
629 | 655 |
630 void SyncManager::SetPassphrase(const std::string& passphrase, | 656 void SyncManager::SetPassphrase(const std::string& passphrase, |
631 bool is_explicit) { | 657 bool is_explicit) { |
| 658 DCHECK(thread_checker_.CalledOnValidThread()); |
632 data_->SetPassphrase(passphrase, is_explicit); | 659 data_->SetPassphrase(passphrase, is_explicit); |
633 } | 660 } |
634 | 661 |
635 void SyncManager::EnableEncryptEverything() { | 662 void SyncManager::EnableEncryptEverything() { |
| 663 DCHECK(thread_checker_.CalledOnValidThread()); |
636 { | 664 { |
637 // Update the cryptographer to know we're now encrypting everything. | 665 // Update the cryptographer to know we're now encrypting everything. |
638 WriteTransaction trans(FROM_HERE, GetUserShare()); | 666 WriteTransaction trans(FROM_HERE, GetUserShare()); |
639 Cryptographer* cryptographer = trans.GetCryptographer(); | 667 Cryptographer* cryptographer = trans.GetCryptographer(); |
640 // Only set encrypt everything if we know we can encrypt. This allows the | 668 // Only set encrypt everything if we know we can encrypt. This allows the |
641 // user to cancel encryption if they have forgotten their passphrase. | 669 // user to cancel encryption if they have forgotten their passphrase. |
642 if (cryptographer->is_ready()) | 670 if (cryptographer->is_ready()) |
643 cryptographer->set_encrypt_everything(); | 671 cryptographer->set_encrypt_everything(); |
644 } | 672 } |
645 | 673 |
646 // Call with empty set. Reads from cryptographer so will automatically encrypt | 674 // Call with empty set. Reads from cryptographer so will automatically encrypt |
647 // all datatypes and update the nigori node as necessary. Will trigger | 675 // all datatypes and update the nigori node as necessary. Will trigger |
648 // OnPassphraseRequired if necessary. | 676 // OnPassphraseRequired if necessary. |
649 data_->EncryptDataTypes(syncable::ModelTypeSet()); | 677 data_->EncryptDataTypes(syncable::ModelTypeSet()); |
650 } | 678 } |
651 | 679 |
652 bool SyncManager::EncryptEverythingEnabled() const { | 680 bool SyncManager::EncryptEverythingEnabled() const { |
653 ReadTransaction trans(FROM_HERE, GetUserShare()); | 681 ReadTransaction trans(FROM_HERE, GetUserShare()); |
654 return trans.GetCryptographer()->encrypt_everything(); | 682 return trans.GetCryptographer()->encrypt_everything(); |
655 } | 683 } |
656 | 684 |
657 bool SyncManager::IsUsingExplicitPassphrase() { | 685 bool SyncManager::IsUsingExplicitPassphrase() { |
658 return data_ && data_->IsUsingExplicitPassphrase(); | 686 return data_ && data_->IsUsingExplicitPassphrase(); |
659 } | 687 } |
660 | 688 |
661 void SyncManager::RequestCleanupDisabledTypes() { | 689 void SyncManager::RequestCleanupDisabledTypes() { |
| 690 DCHECK(thread_checker_.CalledOnValidThread()); |
662 if (data_->scheduler()) | 691 if (data_->scheduler()) |
663 data_->scheduler()->ScheduleCleanupDisabledTypes(); | 692 data_->scheduler()->ScheduleCleanupDisabledTypes(); |
664 } | 693 } |
665 | 694 |
666 void SyncManager::RequestClearServerData() { | 695 void SyncManager::RequestClearServerData() { |
| 696 DCHECK(thread_checker_.CalledOnValidThread()); |
667 if (data_->scheduler()) | 697 if (data_->scheduler()) |
668 data_->scheduler()->ScheduleClearUserData(); | 698 data_->scheduler()->ScheduleClearUserData(); |
669 } | 699 } |
670 | 700 |
671 void SyncManager::RequestConfig(const syncable::ModelTypeBitSet& types, | 701 void SyncManager::RequestConfig(const syncable::ModelTypeBitSet& types, |
672 ConfigureReason reason) { | 702 ConfigureReason reason) { |
| 703 DCHECK(thread_checker_.CalledOnValidThread()); |
673 if (!data_->scheduler()) { | 704 if (!data_->scheduler()) { |
674 LOG(INFO) | 705 LOG(INFO) |
675 << "SyncManager::RequestConfig: bailing out because scheduler is " | 706 << "SyncManager::RequestConfig: bailing out because scheduler is " |
676 << "null"; | 707 << "null"; |
677 return; | 708 return; |
678 } | 709 } |
679 StartConfigurationMode(NULL); | 710 StartConfigurationMode(NULL); |
680 data_->scheduler()->ScheduleConfig(types, GetSourceFromReason(reason)); | 711 data_->scheduler()->ScheduleConfig(types, GetSourceFromReason(reason)); |
681 } | 712 } |
682 | 713 |
683 void SyncManager::StartConfigurationMode(ModeChangeCallback* callback) { | 714 void SyncManager::StartConfigurationMode(ModeChangeCallback* callback) { |
| 715 DCHECK(thread_checker_.CalledOnValidThread()); |
684 if (!data_->scheduler()) { | 716 if (!data_->scheduler()) { |
685 LOG(INFO) | 717 LOG(INFO) |
686 << "SyncManager::StartConfigurationMode: could not start " | 718 << "SyncManager::StartConfigurationMode: could not start " |
687 << "configuration mode because because scheduler is null"; | 719 << "configuration mode because because scheduler is null"; |
688 return; | 720 return; |
689 } | 721 } |
690 data_->scheduler()->Start( | 722 data_->scheduler()->Start( |
691 browser_sync::SyncScheduler::CONFIGURATION_MODE, callback); | 723 browser_sync::SyncScheduler::CONFIGURATION_MODE, callback); |
692 } | 724 } |
693 | 725 |
694 const std::string& SyncManager::GetAuthenticatedUsername() { | 726 const std::string& SyncManager::GetAuthenticatedUsername() { |
695 DCHECK(data_); | 727 DCHECK(data_); |
696 return data_->username_for_share(); | 728 return data_->username_for_share(); |
697 } | 729 } |
698 | 730 |
699 bool SyncManager::SyncInternal::Init( | 731 bool SyncManager::SyncInternal::Init( |
700 const FilePath& database_location, | 732 const FilePath& database_location, |
701 const WeakHandle<JsEventHandler>& event_handler, | 733 const WeakHandle<JsEventHandler>& event_handler, |
702 const std::string& sync_server_and_path, | 734 const std::string& sync_server_and_path, |
703 int port, | 735 int port, |
704 bool use_ssl, | 736 bool use_ssl, |
705 HttpPostProviderFactory* post_factory, | 737 HttpPostProviderFactory* post_factory, |
706 ModelSafeWorkerRegistrar* model_safe_worker_registrar, | 738 ModelSafeWorkerRegistrar* model_safe_worker_registrar, |
| 739 ChangeDelegate* change_delegate, |
707 const std::string& user_agent, | 740 const std::string& user_agent, |
708 const SyncCredentials& credentials, | 741 const SyncCredentials& credentials, |
709 sync_notifier::SyncNotifier* sync_notifier, | 742 sync_notifier::SyncNotifier* sync_notifier, |
710 const std::string& restored_key_for_bootstrapping, | 743 const std::string& restored_key_for_bootstrapping, |
711 bool setup_for_test_mode) { | 744 bool setup_for_test_mode) { |
712 CHECK(!initialized_); | 745 CHECK(!initialized_); |
713 | 746 |
714 DCHECK(thread_checker_.CalledOnValidThread()); | 747 DCHECK(thread_checker_.CalledOnValidThread()); |
715 | 748 |
716 VLOG(1) << "Starting SyncInternal initialization."; | 749 VLOG(1) << "Starting SyncInternal initialization."; |
717 | 750 |
718 weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()); | 751 weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()); |
719 | 752 |
720 registrar_ = model_safe_worker_registrar; | 753 registrar_ = model_safe_worker_registrar; |
| 754 change_delegate_ = change_delegate; |
721 setup_for_test_mode_ = setup_for_test_mode; | 755 setup_for_test_mode_ = setup_for_test_mode; |
722 | 756 |
723 sync_notifier_.reset(sync_notifier); | 757 sync_notifier_.reset(sync_notifier); |
724 | 758 |
| 759 AddChangeObserver(&js_sync_manager_observer_); |
725 AddObserver(&js_sync_manager_observer_); | 760 AddObserver(&js_sync_manager_observer_); |
726 SetJsEventHandler(event_handler); | 761 SetJsEventHandler(event_handler); |
727 | 762 |
728 share_.dir_manager.reset(new DirectoryManager(database_location)); | 763 share_.dir_manager.reset(new DirectoryManager(database_location)); |
729 | 764 |
730 connection_manager_.reset(new SyncAPIServerConnectionManager( | 765 connection_manager_.reset(new SyncAPIServerConnectionManager( |
731 sync_server_and_path, port, use_ssl, user_agent, post_factory)); | 766 sync_server_and_path, port, use_ssl, user_agent, post_factory)); |
732 | 767 |
733 net::NetworkChangeNotifier::AddIPAddressObserver(this); | 768 net::NetworkChangeNotifier::AddIPAddressObserver(this); |
734 observing_ip_address_changes_ = true; | 769 observing_ip_address_changes_ = true; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
768 | 803 |
769 // The following calls check that initialized_ is true. | 804 // The following calls check that initialized_ is true. |
770 BootstrapEncryption(restored_key_for_bootstrapping); | 805 BootstrapEncryption(restored_key_for_bootstrapping); |
771 } | 806 } |
772 | 807 |
773 // Notify that initialization is complete. Note: This should be the last to | 808 // Notify that initialization is complete. Note: This should be the last to |
774 // execute if |signed_in| is false. Reason being in that case we would | 809 // execute if |signed_in| is false. Reason being in that case we would |
775 // post a task to shutdown sync. But if this function posts any other tasks | 810 // post a task to shutdown sync. But if this function posts any other tasks |
776 // on the UI thread and if shutdown wins then that tasks would execute on | 811 // on the UI thread and if shutdown wins then that tasks would execute on |
777 // a freed pointer. This is because UI thread is not shut down. | 812 // a freed pointer. This is because UI thread is not shut down. |
778 ObserverList<SyncManager::Observer> temp_obs_list; | 813 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
779 CopyObservers(&temp_obs_list); | |
780 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
781 OnInitializationComplete( | 814 OnInitializationComplete( |
782 WeakHandle<JsBackend>(weak_ptr_factory_.GetWeakPtr()), | 815 WeakHandle<JsBackend>(weak_ptr_factory_.GetWeakPtr()), |
783 signed_in)); | 816 signed_in)); |
784 | 817 |
785 if (!signed_in && !setup_for_test_mode_) | 818 if (!signed_in && !setup_for_test_mode_) |
786 return false; | 819 return false; |
787 | 820 |
788 sync_notifier_->AddObserver(this); | 821 sync_notifier_->AddObserver(this); |
789 | 822 |
790 return signed_in; | 823 return signed_in; |
(...skipping 24 matching lines...) Expand all Loading... |
815 Cryptographer* cryptographer = trans.GetCryptographer(); | 848 Cryptographer* cryptographer = trans.GetCryptographer(); |
816 | 849 |
817 WriteNode node(&trans); | 850 WriteNode node(&trans); |
818 if (!node.InitByTagLookup(kNigoriTag)) { | 851 if (!node.InitByTagLookup(kNigoriTag)) { |
819 NOTREACHED(); | 852 NOTREACHED(); |
820 return false; | 853 return false; |
821 } | 854 } |
822 sync_pb::NigoriSpecifics nigori(node.GetNigoriSpecifics()); | 855 sync_pb::NigoriSpecifics nigori(node.GetNigoriSpecifics()); |
823 Cryptographer::UpdateResult result = cryptographer->Update(nigori); | 856 Cryptographer::UpdateResult result = cryptographer->Update(nigori); |
824 if (result == Cryptographer::NEEDS_PASSPHRASE) { | 857 if (result == Cryptographer::NEEDS_PASSPHRASE) { |
825 ObserverList<SyncManager::Observer> temp_obs_list; | 858 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
826 CopyObservers(&temp_obs_list); | |
827 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
828 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); | 859 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); |
829 } | 860 } |
830 | 861 |
831 // Ensure the nigori node reflects the most recent set of sensitive types | 862 // Ensure the nigori node reflects the most recent set of sensitive types |
832 // and properly sets encrypt_everything. This is a no-op if nothing changes. | 863 // and properly sets encrypt_everything. This is a no-op if nothing changes. |
833 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); | 864 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); |
834 node.SetNigoriSpecifics(nigori); | 865 node.SetNigoriSpecifics(nigori); |
835 | 866 |
836 allstatus_.SetCryptographerReady(cryptographer->is_ready()); | 867 allstatus_.SetCryptographerReady(cryptographer->is_ready()); |
837 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); | 868 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 return; | 985 return; |
955 } | 986 } |
956 | 987 |
957 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); | 988 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); |
958 specifics.set_sync_tabs(true); | 989 specifics.set_sync_tabs(true); |
959 node.SetNigoriSpecifics(specifics); | 990 node.SetNigoriSpecifics(specifics); |
960 } | 991 } |
961 } | 992 } |
962 | 993 |
963 void SyncManager::SyncInternal::RaiseAuthNeededEvent() { | 994 void SyncManager::SyncInternal::RaiseAuthNeededEvent() { |
964 ObserverList<SyncManager::Observer> temp_obs_list; | 995 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
965 CopyObservers(&temp_obs_list); | |
966 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
967 OnAuthError(AuthError(AuthError::INVALID_GAIA_CREDENTIALS))); | 996 OnAuthError(AuthError(AuthError::INVALID_GAIA_CREDENTIALS))); |
968 } | 997 } |
969 | 998 |
970 void SyncManager::SyncInternal::SetPassphrase( | 999 void SyncManager::SyncInternal::SetPassphrase( |
971 const std::string& passphrase, bool is_explicit) { | 1000 const std::string& passphrase, bool is_explicit) { |
972 // We do not accept empty passphrases. | 1001 // We do not accept empty passphrases. |
973 if (passphrase.empty()) { | 1002 if (passphrase.empty()) { |
974 VLOG(1) << "Rejecting empty passphrase."; | 1003 VLOG(1) << "Rejecting empty passphrase."; |
975 ObserverList<SyncManager::Observer> temp_obs_list; | 1004 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
976 CopyObservers(&temp_obs_list); | |
977 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
978 OnPassphraseRequired(sync_api::REASON_SET_PASSPHRASE_FAILED)); | 1005 OnPassphraseRequired(sync_api::REASON_SET_PASSPHRASE_FAILED)); |
979 return; | 1006 return; |
980 } | 1007 } |
981 | 1008 |
982 // All accesses to the cryptographer are protected by a transaction. | 1009 // All accesses to the cryptographer are protected by a transaction. |
983 WriteTransaction trans(FROM_HERE, GetUserShare()); | 1010 WriteTransaction trans(FROM_HERE, GetUserShare()); |
984 Cryptographer* cryptographer = trans.GetCryptographer(); | 1011 Cryptographer* cryptographer = trans.GetCryptographer(); |
985 KeyParams params = {"localhost", "dummy", passphrase}; | 1012 KeyParams params = {"localhost", "dummy", passphrase}; |
986 | 1013 |
987 WriteNode node(&trans); | 1014 WriteNode node(&trans); |
(...skipping 16 matching lines...) Expand all Loading... |
1004 } else { | 1031 } else { |
1005 VLOG(1) << "Passphrase failed to decrypt pending keys."; | 1032 VLOG(1) << "Passphrase failed to decrypt pending keys."; |
1006 } | 1033 } |
1007 } else { | 1034 } else { |
1008 VLOG(1) << "Not trying the passphrase because the explicit flags dont " | 1035 VLOG(1) << "Not trying the passphrase because the explicit flags dont " |
1009 << "match. Nigori node's explicit flag is " | 1036 << "match. Nigori node's explicit flag is " |
1010 << node.GetNigoriSpecifics().using_explicit_passphrase(); | 1037 << node.GetNigoriSpecifics().using_explicit_passphrase(); |
1011 } | 1038 } |
1012 | 1039 |
1013 if (!succeeded) { | 1040 if (!succeeded) { |
1014 ObserverList<SyncManager::Observer> temp_obs_list; | 1041 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1015 CopyObservers(&temp_obs_list); | |
1016 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1017 OnPassphraseRequired(sync_api::REASON_SET_PASSPHRASE_FAILED)); | 1042 OnPassphraseRequired(sync_api::REASON_SET_PASSPHRASE_FAILED)); |
1018 return; | 1043 return; |
1019 } | 1044 } |
1020 | 1045 |
1021 // Nudge the syncer so that encrypted datatype updates that were waiting for | 1046 // Nudge the syncer so that encrypted datatype updates that were waiting for |
1022 // this passphrase get applied as soon as possible. | 1047 // this passphrase get applied as soon as possible. |
1023 RequestNudge(FROM_HERE); | 1048 RequestNudge(FROM_HERE); |
1024 } else { | 1049 } else { |
1025 VLOG(1) << "No pending keys, adding provided passphrase."; | 1050 VLOG(1) << "No pending keys, adding provided passphrase."; |
1026 | 1051 |
(...skipping 15 matching lines...) Expand all Loading... |
1042 node.SetNigoriSpecifics(specifics); | 1067 node.SetNigoriSpecifics(specifics); |
1043 } | 1068 } |
1044 | 1069 |
1045 // Does nothing if everything is already encrypted or the cryptographer has | 1070 // Does nothing if everything is already encrypted or the cryptographer has |
1046 // pending keys. | 1071 // pending keys. |
1047 ReEncryptEverything(&trans); | 1072 ReEncryptEverything(&trans); |
1048 | 1073 |
1049 VLOG(1) << "Passphrase accepted, bootstrapping encryption."; | 1074 VLOG(1) << "Passphrase accepted, bootstrapping encryption."; |
1050 std::string bootstrap_token; | 1075 std::string bootstrap_token; |
1051 cryptographer->GetBootstrapToken(&bootstrap_token); | 1076 cryptographer->GetBootstrapToken(&bootstrap_token); |
1052 ObserverList<SyncManager::Observer> temp_obs_list; | 1077 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1053 CopyObservers(&temp_obs_list); | |
1054 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1055 OnPassphraseAccepted(bootstrap_token)); | 1078 OnPassphraseAccepted(bootstrap_token)); |
1056 } | 1079 } |
1057 | 1080 |
1058 bool SyncManager::SyncInternal::IsUsingExplicitPassphrase() { | 1081 bool SyncManager::SyncInternal::IsUsingExplicitPassphrase() { |
1059 ReadTransaction trans(FROM_HERE, &share_); | 1082 ReadTransaction trans(FROM_HERE, &share_); |
1060 ReadNode node(&trans); | 1083 ReadNode node(&trans); |
1061 if (!node.InitByTagLookup(kNigoriTag)) { | 1084 if (!node.InitByTagLookup(kNigoriTag)) { |
1062 // TODO(albertb): Plumb an UnrecoverableError all the way back to the PSS. | 1085 // TODO(albertb): Plumb an UnrecoverableError all the way back to the PSS. |
1063 NOTREACHED(); | 1086 NOTREACHED(); |
1064 return false; | 1087 return false; |
(...skipping 14 matching lines...) Expand all Loading... |
1079 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not " | 1102 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not " |
1080 << "found."; | 1103 << "found."; |
1081 return; | 1104 return; |
1082 } | 1105 } |
1083 | 1106 |
1084 Cryptographer* cryptographer = trans.GetCryptographer(); | 1107 Cryptographer* cryptographer = trans.GetCryptographer(); |
1085 | 1108 |
1086 if (!cryptographer->is_ready()) { | 1109 if (!cryptographer->is_ready()) { |
1087 VLOG(1) << "Attempting to encrypt datatypes when cryptographer not " | 1110 VLOG(1) << "Attempting to encrypt datatypes when cryptographer not " |
1088 << "initialized, prompting for passphrase."; | 1111 << "initialized, prompting for passphrase."; |
1089 ObserverList<SyncManager::Observer> temp_obs_list; | |
1090 CopyObservers(&temp_obs_list); | |
1091 // TODO(zea): this isn't really decryption, but that's the only way we have | 1112 // TODO(zea): this isn't really decryption, but that's the only way we have |
1092 // to prompt the user for a passsphrase. See http://crbug.com/91379. | 1113 // to prompt the user for a passsphrase. See http://crbug.com/91379. |
1093 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | 1114 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1094 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); | 1115 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); |
1095 return; | 1116 return; |
1096 } | 1117 } |
1097 | 1118 |
1098 // Update the Nigori node's set of encrypted datatypes. | 1119 // Update the Nigori node's set of encrypted datatypes. |
1099 // Note, we merge the current encrypted types with those requested. Once a | 1120 // Note, we merge the current encrypted types with those requested. Once a |
1100 // datatypes is marked as needing encryption, it is never unmarked. | 1121 // datatypes is marked as needing encryption, it is never unmarked. |
1101 cryptographer->SetEncryptedTypes(encrypted_types); | 1122 cryptographer->SetEncryptedTypes(encrypted_types); |
1102 sync_pb::NigoriSpecifics nigori; | 1123 sync_pb::NigoriSpecifics nigori; |
1103 nigori.CopyFrom(node.GetNigoriSpecifics()); | 1124 nigori.CopyFrom(node.GetNigoriSpecifics()); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1175 if (!child.InitByIdLookup(child_id)) { | 1196 if (!child.InitByIdLookup(child_id)) { |
1176 NOTREACHED(); | 1197 NOTREACHED(); |
1177 return; | 1198 return; |
1178 } | 1199 } |
1179 child.SetPasswordSpecifics(child.GetPasswordSpecifics()); | 1200 child.SetPasswordSpecifics(child.GetPasswordSpecifics()); |
1180 child_id = child.GetSuccessorId(); | 1201 child_id = child.GetSuccessorId(); |
1181 } | 1202 } |
1182 } | 1203 } |
1183 } | 1204 } |
1184 | 1205 |
1185 ObserverList<SyncManager::Observer> temp_obs_list; | 1206 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1186 CopyObservers(&temp_obs_list); | |
1187 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1188 OnEncryptionComplete(encrypted_types)); | 1207 OnEncryptionComplete(encrypted_types)); |
1189 } | 1208 } |
1190 | 1209 |
1191 SyncManager::~SyncManager() { | 1210 SyncManager::~SyncManager() { |
| 1211 DCHECK(thread_checker_.CalledOnValidThread()); |
1192 delete data_; | 1212 delete data_; |
1193 } | 1213 } |
1194 | 1214 |
| 1215 void SyncManager::AddChangeObserver(ChangeObserver* observer) { |
| 1216 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1217 data_->AddChangeObserver(observer); |
| 1218 } |
| 1219 |
| 1220 void SyncManager::RemoveChangeObserver(ChangeObserver* observer) { |
| 1221 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1222 data_->RemoveChangeObserver(observer); |
| 1223 } |
| 1224 |
1195 void SyncManager::AddObserver(Observer* observer) { | 1225 void SyncManager::AddObserver(Observer* observer) { |
| 1226 DCHECK(thread_checker_.CalledOnValidThread()); |
1196 data_->AddObserver(observer); | 1227 data_->AddObserver(observer); |
1197 } | 1228 } |
1198 | 1229 |
1199 void SyncManager::RemoveObserver(Observer* observer) { | 1230 void SyncManager::RemoveObserver(Observer* observer) { |
| 1231 DCHECK(thread_checker_.CalledOnValidThread()); |
1200 data_->RemoveObserver(observer); | 1232 data_->RemoveObserver(observer); |
1201 } | 1233 } |
1202 | 1234 |
1203 void SyncManager::RequestEarlyExit() { | 1235 void SyncManager::RequestEarlyExit() { |
1204 data_->RequestEarlyExit(); | 1236 data_->RequestEarlyExit(); |
1205 } | 1237 } |
1206 | 1238 |
1207 void SyncManager::SyncInternal::RequestEarlyExit() { | 1239 void SyncManager::SyncInternal::RequestEarlyExit() { |
1208 if (scheduler()) { | 1240 if (scheduler()) { |
1209 scheduler()->RequestEarlyExit(); | 1241 scheduler()->RequestEarlyExit(); |
1210 } | 1242 } |
1211 | 1243 |
1212 if (connection_manager_.get()) { | 1244 if (connection_manager_.get()) { |
1213 connection_manager_->TerminateAllIO(); | 1245 connection_manager_->TerminateAllIO(); |
1214 } | 1246 } |
1215 } | 1247 } |
1216 | 1248 |
1217 void SyncManager::Shutdown() { | 1249 void SyncManager::Shutdown() { |
| 1250 DCHECK(thread_checker_.CalledOnValidThread()); |
1218 data_->Shutdown(); | 1251 data_->Shutdown(); |
1219 } | 1252 } |
1220 | 1253 |
1221 void SyncManager::SyncInternal::Shutdown() { | 1254 void SyncManager::SyncInternal::Shutdown() { |
1222 DCHECK(thread_checker_.CalledOnValidThread()); | 1255 DCHECK(thread_checker_.CalledOnValidThread()); |
1223 | 1256 |
1224 // Prevent any in-flight method calls from running. Also | 1257 // Prevent any in-flight method calls from running. Also |
1225 // invalidates |weak_handle_this_|. | 1258 // invalidates |weak_handle_this_|. |
1226 weak_ptr_factory_.InvalidateWeakPtrs(); | 1259 weak_ptr_factory_.InvalidateWeakPtrs(); |
1227 | 1260 |
1228 // Automatically stops the scheduler. | 1261 // Automatically stops the scheduler. |
1229 scheduler_.reset(); | 1262 scheduler_.reset(); |
1230 | 1263 |
1231 SetJsEventHandler(WeakHandle<JsEventHandler>()); | 1264 SetJsEventHandler(WeakHandle<JsEventHandler>()); |
| 1265 RemoveChangeObserver(&js_sync_manager_observer_); |
1232 RemoveObserver(&js_sync_manager_observer_); | 1266 RemoveObserver(&js_sync_manager_observer_); |
1233 | 1267 |
1234 if (sync_notifier_.get()) { | 1268 if (sync_notifier_.get()) { |
1235 sync_notifier_->RemoveObserver(this); | 1269 sync_notifier_->RemoveObserver(this); |
1236 } | 1270 } |
1237 sync_notifier_.reset(); | 1271 sync_notifier_.reset(); |
1238 | 1272 |
1239 if (connection_manager_.get()) { | 1273 if (connection_manager_.get()) { |
1240 connection_manager_->RemoveListener(this); | 1274 connection_manager_->RemoveListener(this); |
1241 } | 1275 } |
(...skipping 11 matching lines...) Expand all Loading... |
1253 } | 1287 } |
1254 dir_manager()->FinalSaveChangesForAll(); | 1288 dir_manager()->FinalSaveChangesForAll(); |
1255 dir_manager()->Close(username_for_share()); | 1289 dir_manager()->Close(username_for_share()); |
1256 } | 1290 } |
1257 | 1291 |
1258 // Reset the DirectoryManager and UserSettings so they relinquish sqlite | 1292 // Reset the DirectoryManager and UserSettings so they relinquish sqlite |
1259 // handles to backing files. | 1293 // handles to backing files. |
1260 share_.dir_manager.reset(); | 1294 share_.dir_manager.reset(); |
1261 | 1295 |
1262 setup_for_test_mode_ = false; | 1296 setup_for_test_mode_ = false; |
| 1297 change_delegate_ = NULL; |
1263 registrar_ = NULL; | 1298 registrar_ = NULL; |
1264 | 1299 |
1265 initialized_ = false; | 1300 initialized_ = false; |
1266 | 1301 |
1267 // We reset this here, since only now we know it will not be | 1302 // We reset this here, since only now we know it will not be |
1268 // accessed from other threads (since we shut down everything). | 1303 // accessed from other threads (since we shut down everything). |
1269 weak_handle_this_.Reset(); | 1304 weak_handle_this_.Reset(); |
1270 } | 1305 } |
1271 | 1306 |
1272 void SyncManager::SyncInternal::OnIPAddressChanged() { | 1307 void SyncManager::SyncInternal::OnIPAddressChanged() { |
(...skipping 21 matching lines...) Expand all Loading... |
1294 DCHECK(thread_checker_.CalledOnValidThread()); | 1329 DCHECK(thread_checker_.CalledOnValidThread()); |
1295 CheckServerReachable(); | 1330 CheckServerReachable(); |
1296 } | 1331 } |
1297 | 1332 |
1298 void SyncManager::SyncInternal::OnServerConnectionEvent( | 1333 void SyncManager::SyncInternal::OnServerConnectionEvent( |
1299 const ServerConnectionEvent& event) { | 1334 const ServerConnectionEvent& event) { |
1300 DCHECK(thread_checker_.CalledOnValidThread()); | 1335 DCHECK(thread_checker_.CalledOnValidThread()); |
1301 allstatus_.HandleServerConnectionEvent(event); | 1336 allstatus_.HandleServerConnectionEvent(event); |
1302 if (event.connection_code == | 1337 if (event.connection_code == |
1303 browser_sync::HttpResponse::SERVER_CONNECTION_OK) { | 1338 browser_sync::HttpResponse::SERVER_CONNECTION_OK) { |
1304 ObserverList<SyncManager::Observer> temp_obs_list; | 1339 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1305 CopyObservers(&temp_obs_list); | |
1306 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1307 OnAuthError(AuthError::None())); | 1340 OnAuthError(AuthError::None())); |
1308 } | 1341 } |
1309 | 1342 |
1310 if (event.connection_code == browser_sync::HttpResponse::SYNC_AUTH_ERROR) { | 1343 if (event.connection_code == browser_sync::HttpResponse::SYNC_AUTH_ERROR) { |
1311 observing_ip_address_changes_ = false; | 1344 observing_ip_address_changes_ = false; |
1312 ObserverList<SyncManager::Observer> temp_obs_list; | 1345 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1313 CopyObservers(&temp_obs_list); | |
1314 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1315 OnAuthError(AuthError(AuthError::INVALID_GAIA_CREDENTIALS))); | 1346 OnAuthError(AuthError(AuthError::INVALID_GAIA_CREDENTIALS))); |
1316 } | 1347 } |
1317 | 1348 |
1318 if (event.connection_code == | 1349 if (event.connection_code == |
1319 browser_sync::HttpResponse::SYNC_SERVER_ERROR) { | 1350 browser_sync::HttpResponse::SYNC_SERVER_ERROR) { |
1320 ObserverList<SyncManager::Observer> temp_obs_list; | 1351 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1321 CopyObservers(&temp_obs_list); | |
1322 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1323 OnAuthError(AuthError(AuthError::CONNECTION_FAILED))); | 1352 OnAuthError(AuthError(AuthError::CONNECTION_FAILED))); |
1324 } | 1353 } |
1325 } | 1354 } |
1326 | 1355 |
1327 void SyncManager::SyncInternal::HandleTransactionCompleteChangeEvent( | 1356 void SyncManager::SyncInternal::HandleTransactionCompleteChangeEvent( |
1328 const syncable::ModelTypeBitSet& models_with_changes) { | 1357 const syncable::ModelTypeBitSet& models_with_changes) { |
1329 // This notification happens immediately after the transaction mutex is | 1358 // This notification happens immediately after the transaction mutex is |
1330 // released. This allows work to be performed without blocking other threads | 1359 // released. This allows work to be performed without blocking other threads |
1331 // from acquiring a transaction. | 1360 // from acquiring a transaction. |
1332 if (!HaveObservers()) | 1361 if (!change_delegate_) |
1333 return; | 1362 return; |
1334 | 1363 |
1335 // Call commit. | 1364 // Call commit. |
1336 for (int i = 0; i < syncable::MODEL_TYPE_COUNT; ++i) { | 1365 for (int i = 0; i < syncable::MODEL_TYPE_COUNT; ++i) { |
1337 if (models_with_changes.test(i)) { | 1366 const syncable::ModelType type = syncable::ModelTypeFromInt(i); |
1338 ObserverList<SyncManager::Observer> temp_obs_list; | 1367 if (models_with_changes.test(type)) { |
1339 CopyObservers(&temp_obs_list); | 1368 change_delegate_->OnChangesComplete(type); |
1340 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | 1369 change_observers_->Notify( |
1341 OnChangesComplete(syncable::ModelTypeFromInt(i))); | 1370 &SyncManager::ChangeObserver::OnChangesComplete, type); |
1342 } | 1371 } |
1343 } | 1372 } |
1344 } | 1373 } |
1345 | 1374 |
1346 ModelTypeBitSet SyncManager::SyncInternal::HandleTransactionEndingChangeEvent( | 1375 ModelTypeBitSet SyncManager::SyncInternal::HandleTransactionEndingChangeEvent( |
| 1376 const ImmutableWriteTransactionInfo& write_transaction_info, |
1347 syncable::BaseTransaction* trans) { | 1377 syncable::BaseTransaction* trans) { |
1348 // This notification happens immediately before a syncable WriteTransaction | 1378 // This notification happens immediately before a syncable WriteTransaction |
1349 // falls out of scope. It happens while the channel mutex is still held, | 1379 // falls out of scope. It happens while the channel mutex is still held, |
1350 // and while the transaction mutex is held, so it cannot be re-entrant. | 1380 // and while the transaction mutex is held, so it cannot be re-entrant. |
1351 if (!HaveObservers() || ChangeBuffersAreEmpty()) | 1381 if (!change_delegate_ || ChangeBuffersAreEmpty()) |
1352 return ModelTypeBitSet(); | 1382 return ModelTypeBitSet(); |
1353 | 1383 |
1354 // This will continue the WriteTransaction using a read only wrapper. | 1384 // This will continue the WriteTransaction using a read only wrapper. |
1355 // This is the last chance for read to occur in the WriteTransaction | 1385 // This is the last chance for read to occur in the WriteTransaction |
1356 // that's closing. This special ReadTransaction will not close the | 1386 // that's closing. This special ReadTransaction will not close the |
1357 // underlying transaction. | 1387 // underlying transaction. |
1358 ReadTransaction read_trans(GetUserShare(), trans); | 1388 ReadTransaction read_trans(GetUserShare(), trans); |
1359 | 1389 |
1360 syncable::ModelTypeBitSet models_with_changes; | 1390 syncable::ModelTypeBitSet models_with_changes; |
1361 for (int i = 0; i < syncable::MODEL_TYPE_COUNT; ++i) { | 1391 for (int i = syncable::FIRST_REAL_MODEL_TYPE; |
1362 if (change_buffers_[i].IsEmpty()) | 1392 i < syncable::MODEL_TYPE_COUNT; ++i) { |
| 1393 const syncable::ModelType type = syncable::ModelTypeFromInt(i); |
| 1394 if (change_buffers_[type].IsEmpty()) |
1363 continue; | 1395 continue; |
1364 | 1396 |
1365 ImmutableChangeRecordList ordered_changes = | 1397 ImmutableChangeRecordList ordered_changes = |
1366 change_buffers_[i].GetAllChangesInTreeOrder(&read_trans); | 1398 change_buffers_[type].GetAllChangesInTreeOrder(&read_trans); |
1367 if (!ordered_changes.Get().empty()) { | 1399 if (!ordered_changes.Get().empty()) { |
1368 ObserverList<SyncManager::Observer> temp_obs_list; | 1400 change_delegate_-> |
1369 CopyObservers(&temp_obs_list); | 1401 OnChangesApplied(type, &read_trans, ordered_changes); |
1370 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | 1402 change_observers_->Notify( |
1371 OnChangesApplied(syncable::ModelTypeFromInt(i), | 1403 &SyncManager::ChangeObserver::OnChangesApplied, |
1372 &read_trans, ordered_changes)); | 1404 type, write_transaction_info.Get().id, ordered_changes); |
1373 models_with_changes.set(i, true); | 1405 models_with_changes.set(i, true); |
1374 } | 1406 } |
1375 change_buffers_[i].Clear(); | 1407 change_buffers_[i].Clear(); |
1376 } | 1408 } |
1377 return models_with_changes; | 1409 return models_with_changes; |
1378 } | 1410 } |
1379 | 1411 |
1380 void SyncManager::SyncInternal::HandleCalculateChangesChangeEventFromSyncApi( | 1412 void SyncManager::SyncInternal::HandleCalculateChangesChangeEventFromSyncApi( |
1381 const EntryKernelMutationMap& mutations, | 1413 const ImmutableWriteTransactionInfo& write_transaction_info, |
1382 syncable::BaseTransaction* trans) { | 1414 syncable::BaseTransaction* trans) { |
1383 if (!scheduler()) { | 1415 if (!scheduler()) { |
1384 return; | 1416 return; |
1385 } | 1417 } |
1386 | 1418 |
1387 // We have been notified about a user action changing a sync model. | 1419 // We have been notified about a user action changing a sync model. |
1388 LOG_IF(WARNING, !ChangeBuffersAreEmpty()) << | 1420 LOG_IF(WARNING, !ChangeBuffersAreEmpty()) << |
1389 "CALCULATE_CHANGES called with unapplied old changes."; | 1421 "CALCULATE_CHANGES called with unapplied old changes."; |
1390 | 1422 |
1391 // The mutated model type, or UNSPECIFIED if nothing was mutated. | 1423 // The mutated model type, or UNSPECIFIED if nothing was mutated. |
1392 syncable::ModelType mutated_model_type = syncable::UNSPECIFIED; | 1424 syncable::ModelType mutated_model_type = syncable::UNSPECIFIED; |
1393 | 1425 |
1394 // Find the first real mutation. We assume that only a single model | 1426 // Find the first real mutation. We assume that only a single model |
1395 // type is mutated per transaction. | 1427 // type is mutated per transaction. |
| 1428 const syncable::ImmutableEntryKernelMutationMap& mutations = |
| 1429 write_transaction_info.Get().mutations; |
1396 for (syncable::EntryKernelMutationMap::const_iterator it = | 1430 for (syncable::EntryKernelMutationMap::const_iterator it = |
1397 mutations.begin(); it != mutations.end(); ++it) { | 1431 mutations.Get().begin(); it != mutations.Get().end(); ++it) { |
1398 if (!it->second.mutated.ref(syncable::IS_UNSYNCED)) { | 1432 if (!it->second.mutated.ref(syncable::IS_UNSYNCED)) { |
1399 continue; | 1433 continue; |
1400 } | 1434 } |
1401 | 1435 |
1402 syncable::ModelType model_type = | 1436 syncable::ModelType model_type = |
1403 syncable::GetModelTypeFromSpecifics( | 1437 syncable::GetModelTypeFromSpecifics( |
1404 it->second.mutated.ref(SPECIFICS)); | 1438 it->second.mutated.ref(SPECIFICS)); |
1405 if (model_type < syncable::FIRST_REAL_MODEL_TYPE) { | 1439 if (model_type < syncable::FIRST_REAL_MODEL_TYPE) { |
1406 NOTREACHED() << "Permanent or underspecified item changed via syncapi."; | 1440 NOTREACHED() << "Permanent or underspecified item changed via syncapi."; |
1407 continue; | 1441 continue; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1451 if (!cryptographer->Decrypt(encrypted, &original_specifics)) { | 1485 if (!cryptographer->Decrypt(encrypted, &original_specifics)) { |
1452 NOTREACHED(); | 1486 NOTREACHED(); |
1453 return; | 1487 return; |
1454 } | 1488 } |
1455 } | 1489 } |
1456 buffer->SetSpecificsForId(id, original_specifics); | 1490 buffer->SetSpecificsForId(id, original_specifics); |
1457 } | 1491 } |
1458 } | 1492 } |
1459 | 1493 |
1460 void SyncManager::SyncInternal::HandleCalculateChangesChangeEventFromSyncer( | 1494 void SyncManager::SyncInternal::HandleCalculateChangesChangeEventFromSyncer( |
1461 const EntryKernelMutationMap& mutations, | 1495 const ImmutableWriteTransactionInfo& write_transaction_info, |
1462 syncable::BaseTransaction* trans) { | 1496 syncable::BaseTransaction* trans) { |
1463 // We only expect one notification per sync step, so change_buffers_ should | 1497 // We only expect one notification per sync step, so change_buffers_ should |
1464 // contain no pending entries. | 1498 // contain no pending entries. |
1465 LOG_IF(WARNING, !ChangeBuffersAreEmpty()) << | 1499 LOG_IF(WARNING, !ChangeBuffersAreEmpty()) << |
1466 "CALCULATE_CHANGES called with unapplied old changes."; | 1500 "CALCULATE_CHANGES called with unapplied old changes."; |
1467 | 1501 |
1468 Cryptographer* crypto = dir_manager()->GetCryptographer(trans); | 1502 Cryptographer* crypto = dir_manager()->GetCryptographer(trans); |
| 1503 const syncable::ImmutableEntryKernelMutationMap& mutations = |
| 1504 write_transaction_info.Get().mutations; |
1469 for (syncable::EntryKernelMutationMap::const_iterator it = | 1505 for (syncable::EntryKernelMutationMap::const_iterator it = |
1470 mutations.begin(); it != mutations.end(); ++it) { | 1506 mutations.Get().begin(); it != mutations.Get().end(); ++it) { |
1471 bool existed_before = !it->second.original.ref(syncable::IS_DEL); | 1507 bool existed_before = !it->second.original.ref(syncable::IS_DEL); |
1472 bool exists_now = !it->second.mutated.ref(syncable::IS_DEL); | 1508 bool exists_now = !it->second.mutated.ref(syncable::IS_DEL); |
1473 | 1509 |
1474 // Omit items that aren't associated with a model. | 1510 // Omit items that aren't associated with a model. |
1475 syncable::ModelType type = | 1511 syncable::ModelType type = |
1476 syncable::GetModelTypeFromSpecifics( | 1512 syncable::GetModelTypeFromSpecifics( |
1477 it->second.mutated.ref(SPECIFICS)); | 1513 it->second.mutated.ref(SPECIFICS)); |
1478 if (type < syncable::FIRST_REAL_MODEL_TYPE) | 1514 if (type < syncable::FIRST_REAL_MODEL_TYPE) |
1479 continue; | 1515 continue; |
1480 | 1516 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1531 types.set(type); | 1567 types.set(type); |
1532 scheduler()->ScheduleNudge(nudge_delay, | 1568 scheduler()->ScheduleNudge(nudge_delay, |
1533 browser_sync::NUDGE_SOURCE_LOCAL, | 1569 browser_sync::NUDGE_SOURCE_LOCAL, |
1534 types, | 1570 types, |
1535 nudge_location); | 1571 nudge_location); |
1536 } | 1572 } |
1537 | 1573 |
1538 void SyncManager::SyncInternal::OnSyncEngineEvent( | 1574 void SyncManager::SyncInternal::OnSyncEngineEvent( |
1539 const SyncEngineEvent& event) { | 1575 const SyncEngineEvent& event) { |
1540 DCHECK(thread_checker_.CalledOnValidThread()); | 1576 DCHECK(thread_checker_.CalledOnValidThread()); |
1541 if (!HaveObservers()) { | |
1542 LOG(INFO) | |
1543 << "OnSyncEngineEvent returning because observers_.size() is zero"; | |
1544 return; | |
1545 } | |
1546 | |
1547 // Only send an event if this is due to a cycle ending and this cycle | 1577 // Only send an event if this is due to a cycle ending and this cycle |
1548 // concludes a canonical "sync" process; that is, based on what is known | 1578 // concludes a canonical "sync" process; that is, based on what is known |
1549 // locally we are "all happy" and up-to-date. There may be new changes on | 1579 // locally we are "all happy" and up-to-date. There may be new changes on |
1550 // the server, but we'll get them on a subsequent sync. | 1580 // the server, but we'll get them on a subsequent sync. |
1551 // | 1581 // |
1552 // Notifications are sent at the end of every sync cycle, regardless of | 1582 // Notifications are sent at the end of every sync cycle, regardless of |
1553 // whether we should sync again. | 1583 // whether we should sync again. |
1554 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) { | 1584 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) { |
1555 ModelSafeRoutingInfo enabled_types; | 1585 ModelSafeRoutingInfo enabled_types; |
1556 registrar_->GetModelSafeRoutingInfo(&enabled_types); | 1586 registrar_->GetModelSafeRoutingInfo(&enabled_types); |
1557 { | 1587 { |
1558 // Check to see if we need to notify the frontend that we have newly | 1588 // Check to see if we need to notify the frontend that we have newly |
1559 // encrypted types or that we require a passphrase. | 1589 // encrypted types or that we require a passphrase. |
1560 sync_api::ReadTransaction trans(FROM_HERE, GetUserShare()); | 1590 sync_api::ReadTransaction trans(FROM_HERE, GetUserShare()); |
1561 Cryptographer* cryptographer = trans.GetCryptographer(); | 1591 Cryptographer* cryptographer = trans.GetCryptographer(); |
1562 // If we've completed a sync cycle and the cryptographer isn't ready | 1592 // If we've completed a sync cycle and the cryptographer isn't ready |
1563 // yet, prompt the user for a passphrase. | 1593 // yet, prompt the user for a passphrase. |
1564 if (cryptographer->has_pending_keys()) { | 1594 if (cryptographer->has_pending_keys()) { |
1565 VLOG(1) << "OnPassPhraseRequired Sent"; | 1595 VLOG(1) << "OnPassPhraseRequired Sent"; |
1566 ObserverList<SyncManager::Observer> temp_obs_list; | 1596 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1567 CopyObservers(&temp_obs_list); | |
1568 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1569 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); | 1597 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); |
1570 } else if (!cryptographer->is_ready() && | 1598 } else if (!cryptographer->is_ready() && |
1571 event.snapshot->initial_sync_ended.test(syncable::NIGORI)) { | 1599 event.snapshot->initial_sync_ended.test(syncable::NIGORI)) { |
1572 VLOG(1) << "OnPassphraseRequired sent because cryptographer is not " | 1600 VLOG(1) << "OnPassphraseRequired sent because cryptographer is not " |
1573 << "ready"; | 1601 << "ready"; |
1574 ObserverList<SyncManager::Observer> temp_obs_list; | 1602 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1575 CopyObservers(&temp_obs_list); | |
1576 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1577 OnPassphraseRequired(sync_api::REASON_ENCRYPTION)); | 1603 OnPassphraseRequired(sync_api::REASON_ENCRYPTION)); |
1578 } | 1604 } |
1579 | 1605 |
1580 allstatus_.SetCryptographerReady(cryptographer->is_ready()); | 1606 allstatus_.SetCryptographerReady(cryptographer->is_ready()); |
1581 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); | 1607 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); |
1582 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); | 1608 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); |
1583 | 1609 |
1584 // If everything is in order(we have the passphrase) then there is no | 1610 // If everything is in order(we have the passphrase) then there is no |
1585 // need to inform the listeners. They will just wait for sync | 1611 // need to inform the listeners. They will just wait for sync |
1586 // completion event and if no errors have been raised it means | 1612 // completion event and if no errors have been raised it means |
1587 // encryption was succesful. | 1613 // encryption was succesful. |
1588 } | 1614 } |
1589 | 1615 |
1590 if (!initialized_) { | 1616 if (!initialized_) { |
1591 LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not " | 1617 LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not " |
1592 << "initialized"; | 1618 << "initialized"; |
1593 return; | 1619 return; |
1594 } | 1620 } |
1595 | 1621 |
1596 if (!event.snapshot->has_more_to_sync) { | 1622 if (!event.snapshot->has_more_to_sync) { |
1597 VLOG(1) << "OnSyncCycleCompleted sent"; | 1623 VLOG(1) << "OnSyncCycleCompleted sent"; |
1598 ObserverList<SyncManager::Observer> temp_obs_list; | 1624 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1599 CopyObservers(&temp_obs_list); | |
1600 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1601 OnSyncCycleCompleted(event.snapshot)); | 1625 OnSyncCycleCompleted(event.snapshot)); |
1602 } | 1626 } |
1603 | 1627 |
1604 // This is here for tests, which are still using p2p notifications. | 1628 // This is here for tests, which are still using p2p notifications. |
1605 // | 1629 // |
1606 // TODO(chron): Consider changing this back to track has_more_to_sync | 1630 // TODO(chron): Consider changing this back to track has_more_to_sync |
1607 // only notify peers if a successful commit has occurred. | 1631 // only notify peers if a successful commit has occurred. |
1608 bool is_notifiable_commit = | 1632 bool is_notifiable_commit = |
1609 (event.snapshot->syncer_status.num_successful_commits > 0); | 1633 (event.snapshot->syncer_status.num_successful_commits > 0); |
1610 if (is_notifiable_commit) { | 1634 if (is_notifiable_commit) { |
1611 allstatus_.IncrementNotifiableCommits(); | 1635 allstatus_.IncrementNotifiableCommits(); |
1612 if (sync_notifier_.get()) { | 1636 if (sync_notifier_.get()) { |
1613 const syncable::ModelTypeSet& changed_types = | 1637 const syncable::ModelTypeSet& changed_types = |
1614 syncable::ModelTypePayloadMapToSet(event.snapshot->source.types); | 1638 syncable::ModelTypePayloadMapToSet(event.snapshot->source.types); |
1615 sync_notifier_->SendNotification(changed_types); | 1639 sync_notifier_->SendNotification(changed_types); |
1616 } else { | 1640 } else { |
1617 VLOG(1) << "Not sending notification: sync_notifier_ is NULL"; | 1641 VLOG(1) << "Not sending notification: sync_notifier_ is NULL"; |
1618 } | 1642 } |
1619 } | 1643 } |
1620 } | 1644 } |
1621 | 1645 |
1622 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { | 1646 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { |
1623 ObserverList<SyncManager::Observer> temp_obs_list; | 1647 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1624 CopyObservers(&temp_obs_list); | |
1625 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1626 OnStopSyncingPermanently()); | 1648 OnStopSyncingPermanently()); |
1627 return; | 1649 return; |
1628 } | 1650 } |
1629 | 1651 |
1630 if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_SUCCEEDED) { | 1652 if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_SUCCEEDED) { |
1631 ObserverList<SyncManager::Observer> temp_obs_list; | 1653 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1632 CopyObservers(&temp_obs_list); | |
1633 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1634 OnClearServerDataSucceeded()); | 1654 OnClearServerDataSucceeded()); |
1635 return; | 1655 return; |
1636 } | 1656 } |
1637 | 1657 |
1638 if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_FAILED) { | 1658 if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_FAILED) { |
1639 ObserverList<SyncManager::Observer> temp_obs_list; | 1659 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1640 CopyObservers(&temp_obs_list); | |
1641 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1642 OnClearServerDataFailed()); | 1660 OnClearServerDataFailed()); |
1643 return; | 1661 return; |
1644 } | 1662 } |
1645 | 1663 |
1646 if (event.what_happened == SyncEngineEvent::UPDATED_TOKEN) { | 1664 if (event.what_happened == SyncEngineEvent::UPDATED_TOKEN) { |
1647 ObserverList<SyncManager::Observer> temp_obs_list; | 1665 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1648 CopyObservers(&temp_obs_list); | |
1649 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1650 OnUpdatedToken(event.updated_token)); | 1666 OnUpdatedToken(event.updated_token)); |
1651 return; | 1667 return; |
1652 } | 1668 } |
1653 | 1669 |
1654 if (event.what_happened == SyncEngineEvent::ACTIONABLE_ERROR) { | 1670 if (event.what_happened == SyncEngineEvent::ACTIONABLE_ERROR) { |
1655 ObserverList<SyncManager::Observer> temp_obs_list; | 1671 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
1656 CopyObservers(&temp_obs_list); | |
1657 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | |
1658 OnActionableError( | 1672 OnActionableError( |
1659 event.snapshot->errors.sync_protocol_error)); | 1673 event.snapshot->errors.sync_protocol_error)); |
1660 return; | 1674 return; |
1661 } | 1675 } |
1662 | 1676 |
1663 } | 1677 } |
1664 | 1678 |
1665 void SyncManager::SyncInternal::SetJsEventHandler( | 1679 void SyncManager::SyncInternal::SetJsEventHandler( |
1666 const WeakHandle<JsEventHandler>& event_handler) { | 1680 const WeakHandle<JsEventHandler>& event_handler) { |
1667 js_event_handler_ = event_handler; | 1681 js_event_handler_ = event_handler; |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1918 } | 1932 } |
1919 if (VLOG_IS_ON(1)) { | 1933 if (VLOG_IS_ON(1)) { |
1920 std::string encoded_state; | 1934 std::string encoded_state; |
1921 base::Base64Encode(state, &encoded_state); | 1935 base::Base64Encode(state, &encoded_state); |
1922 VLOG(1) << "Writing notification state: " << encoded_state; | 1936 VLOG(1) << "Writing notification state: " << encoded_state; |
1923 } | 1937 } |
1924 lookup->SetNotificationState(state); | 1938 lookup->SetNotificationState(state); |
1925 lookup->SaveChanges(); | 1939 lookup->SaveChanges(); |
1926 } | 1940 } |
1927 | 1941 |
1928 // Note: it is possible that an observer will remove itself after we have made | 1942 void SyncManager::SyncInternal::AddChangeObserver( |
1929 // a copy, but before the copy is consumed. This could theoretically result | 1943 SyncManager::ChangeObserver* observer) { |
1930 // in accessing a garbage pointer, but can only occur when an about:sync window | 1944 change_observers_->AddObserver(observer); |
1931 // is closed in the middle of a notification. | |
1932 // See crbug.com/85481. | |
1933 void SyncManager::SyncInternal::CopyObservers( | |
1934 ObserverList<SyncManager::Observer>* observers_copy) { | |
1935 DCHECK_EQ(0U, observers_copy->size()); | |
1936 base::AutoLock lock(observers_lock_); | |
1937 if (observers_.size() == 0) | |
1938 return; | |
1939 ObserverListBase<SyncManager::Observer>::Iterator it(observers_); | |
1940 SyncManager::Observer* obs; | |
1941 while ((obs = it.GetNext()) != NULL) | |
1942 observers_copy->AddObserver(obs); | |
1943 } | 1945 } |
1944 | 1946 |
1945 bool SyncManager::SyncInternal::HaveObservers() const { | 1947 void SyncManager::SyncInternal::RemoveChangeObserver( |
1946 base::AutoLock lock(observers_lock_); | 1948 SyncManager::ChangeObserver* observer) { |
1947 return observers_.size() > 0; | 1949 change_observers_->RemoveObserver(observer); |
1948 } | 1950 } |
1949 | 1951 |
1950 void SyncManager::SyncInternal::AddObserver( | 1952 void SyncManager::SyncInternal::AddObserver( |
1951 SyncManager::Observer* observer) { | 1953 SyncManager::Observer* observer) { |
1952 base::AutoLock lock(observers_lock_); | |
1953 observers_.AddObserver(observer); | 1954 observers_.AddObserver(observer); |
1954 } | 1955 } |
1955 | 1956 |
1956 void SyncManager::SyncInternal::RemoveObserver( | 1957 void SyncManager::SyncInternal::RemoveObserver( |
1957 SyncManager::Observer* observer) { | 1958 SyncManager::Observer* observer) { |
1958 base::AutoLock lock(observers_lock_); | |
1959 observers_.RemoveObserver(observer); | 1959 observers_.RemoveObserver(observer); |
1960 } | 1960 } |
1961 | 1961 |
1962 SyncManager::Status::Summary SyncManager::GetStatusSummary() const { | 1962 SyncManager::Status::Summary SyncManager::GetStatusSummary() const { |
1963 return data_->GetStatus().summary; | 1963 return data_->GetStatus().summary; |
1964 } | 1964 } |
1965 | 1965 |
1966 SyncManager::Status SyncManager::GetDetailedStatus() const { | 1966 SyncManager::Status SyncManager::GetDetailedStatus() const { |
1967 return data_->GetStatus(); | 1967 return data_->GetStatus(); |
1968 } | 1968 } |
1969 | 1969 |
1970 SyncManager::SyncInternal* SyncManager::GetImpl() const { return data_; } | |
1971 | |
1972 void SyncManager::SaveChanges() { | 1970 void SyncManager::SaveChanges() { |
| 1971 DCHECK(thread_checker_.CalledOnValidThread()); |
1973 data_->SaveChanges(); | 1972 data_->SaveChanges(); |
1974 } | 1973 } |
1975 | 1974 |
1976 void SyncManager::SyncInternal::SaveChanges() { | 1975 void SyncManager::SyncInternal::SaveChanges() { |
1977 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); | 1976 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); |
1978 if (!lookup.good()) { | 1977 if (!lookup.good()) { |
1979 DCHECK(false) << "ScopedDirLookup creation failed; Unable to SaveChanges"; | 1978 DCHECK(false) << "ScopedDirLookup creation failed; Unable to SaveChanges"; |
1980 return; | 1979 return; |
1981 } | 1980 } |
1982 lookup->SaveChanges(); | 1981 lookup->SaveChanges(); |
1983 } | 1982 } |
1984 | 1983 |
1985 UserShare* SyncManager::GetUserShare() const { | 1984 UserShare* SyncManager::GetUserShare() const { |
1986 return data_->GetUserShare(); | 1985 return data_->GetUserShare(); |
1987 } | 1986 } |
1988 | 1987 |
1989 void SyncManager::RefreshEncryption() { | 1988 void SyncManager::RefreshEncryption() { |
| 1989 DCHECK(thread_checker_.CalledOnValidThread()); |
1990 if (data_->UpdateCryptographerFromNigori()) | 1990 if (data_->UpdateCryptographerFromNigori()) |
1991 data_->EncryptDataTypes(syncable::ModelTypeSet()); | 1991 data_->EncryptDataTypes(syncable::ModelTypeSet()); |
1992 } | 1992 } |
1993 | 1993 |
1994 syncable::ModelTypeSet SyncManager::GetEncryptedDataTypes() const { | 1994 syncable::ModelTypeSet SyncManager::GetEncryptedDataTypes() const { |
1995 ReadTransaction trans(FROM_HERE, GetUserShare()); | 1995 ReadTransaction trans(FROM_HERE, GetUserShare()); |
1996 return GetEncryptedTypes(&trans); | 1996 return GetEncryptedTypes(&trans); |
1997 } | 1997 } |
1998 | 1998 |
1999 bool SyncManager::ReceivedExperimentalTypes(syncable::ModelTypeSet* to_add) | 1999 bool SyncManager::ReceivedExperimentalTypes(syncable::ModelTypeSet* to_add) |
2000 const { | 2000 const { |
2001 ReadTransaction trans(FROM_HERE, GetUserShare()); | 2001 ReadTransaction trans(FROM_HERE, GetUserShare()); |
2002 ReadNode node(&trans); | 2002 ReadNode node(&trans); |
2003 if (!node.InitByTagLookup(kNigoriTag)) { | 2003 if (!node.InitByTagLookup(kNigoriTag)) { |
2004 VLOG(1) << "Couldn't find Nigori node."; | 2004 VLOG(1) << "Couldn't find Nigori node."; |
2005 return false; | 2005 return false; |
2006 } | 2006 } |
2007 if (node.GetNigoriSpecifics().sync_tabs()) { | 2007 if (node.GetNigoriSpecifics().sync_tabs()) { |
2008 to_add->insert(syncable::SESSIONS); | 2008 to_add->insert(syncable::SESSIONS); |
2009 return true; | 2009 return true; |
2010 } | 2010 } |
2011 return false; | 2011 return false; |
2012 } | 2012 } |
2013 | 2013 |
2014 bool SyncManager::HasUnsyncedItems() const { | 2014 bool SyncManager::HasUnsyncedItems() const { |
2015 sync_api::ReadTransaction trans(FROM_HERE, GetUserShare()); | 2015 sync_api::ReadTransaction trans(FROM_HERE, GetUserShare()); |
2016 return (trans.GetWrappedTrans()->directory()->unsynced_entity_count() != 0); | 2016 return (trans.GetWrappedTrans()->directory()->unsynced_entity_count() != 0); |
2017 } | 2017 } |
2018 | 2018 |
2019 void SyncManager::LogUnsyncedItems(int level) const { | |
2020 std::vector<int64> unsynced_handles; | |
2021 sync_api::ReadTransaction trans(FROM_HERE, GetUserShare()); | |
2022 trans.GetWrappedTrans()->directory()->GetUnsyncedMetaHandles( | |
2023 trans.GetWrappedTrans(), &unsynced_handles); | |
2024 | |
2025 for (std::vector<int64>::const_iterator it = unsynced_handles.begin(); | |
2026 it != unsynced_handles.end(); ++it) { | |
2027 ReadNode node(&trans); | |
2028 if (node.InitByIdLookup(*it)) { | |
2029 scoped_ptr<DictionaryValue> value(node.GetDetailsAsValue()); | |
2030 std::string info; | |
2031 base::JSONWriter::Write(value.get(), true, &info); | |
2032 VLOG(level) << info; | |
2033 } | |
2034 } | |
2035 } | |
2036 | |
2037 void SyncManager::TriggerOnNotificationStateChangeForTest( | 2019 void SyncManager::TriggerOnNotificationStateChangeForTest( |
2038 bool notifications_enabled) { | 2020 bool notifications_enabled) { |
| 2021 DCHECK(thread_checker_.CalledOnValidThread()); |
2039 data_->OnNotificationStateChange(notifications_enabled); | 2022 data_->OnNotificationStateChange(notifications_enabled); |
2040 } | 2023 } |
2041 | 2024 |
2042 void SyncManager::TriggerOnIncomingNotificationForTest( | 2025 void SyncManager::TriggerOnIncomingNotificationForTest( |
2043 const syncable::ModelTypeBitSet& model_types) { | 2026 const syncable::ModelTypeBitSet& model_types) { |
| 2027 DCHECK(thread_checker_.CalledOnValidThread()); |
2044 syncable::ModelTypePayloadMap model_types_with_payloads = | 2028 syncable::ModelTypePayloadMap model_types_with_payloads = |
2045 syncable::ModelTypePayloadMapFromBitSet(model_types, | 2029 syncable::ModelTypePayloadMapFromBitSet(model_types, |
2046 std::string()); | 2030 std::string()); |
2047 | 2031 |
2048 data_->OnIncomingNotification(model_types_with_payloads); | 2032 data_->OnIncomingNotification(model_types_with_payloads); |
2049 } | 2033 } |
2050 | 2034 |
2051 // Helper function that converts a PassphraseRequiredReason value to a string. | 2035 // Helper function that converts a PassphraseRequiredReason value to a string. |
2052 std::string PassphraseRequiredReasonToString( | 2036 std::string PassphraseRequiredReasonToString( |
2053 PassphraseRequiredReason reason) { | 2037 PassphraseRequiredReason reason) { |
(...skipping 24 matching lines...) Expand all Loading... |
2078 | 2062 |
2079 for (syncable::ModelTypeSet::const_iterator i = types.begin(); | 2063 for (syncable::ModelTypeSet::const_iterator i = types.begin(); |
2080 i != types.end(); ++i) { | 2064 i != types.end(); ++i) { |
2081 if (!lookup->initial_sync_ended_for_type(*i)) | 2065 if (!lookup->initial_sync_ended_for_type(*i)) |
2082 return false; | 2066 return false; |
2083 } | 2067 } |
2084 return true; | 2068 return true; |
2085 } | 2069 } |
2086 | 2070 |
2087 } // namespace sync_api | 2071 } // namespace sync_api |
OLD | NEW |