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

Side by Side Diff: chrome/browser/sync/glue/sync_backend_host.cc

Issue 15580002: Make use of InvalidationService (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 7 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
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 "build/build_config.h"
6
7 #include "chrome/browser/sync/glue/sync_backend_host.h" 5 #include "chrome/browser/sync/glue/sync_backend_host.h"
8 6
9 #include <algorithm> 7 #include <algorithm>
10 #include <map> 8 #include <map>
11 9
12 #include "base/bind.h" 10 #include "base/bind.h"
13 #include "base/command_line.h" 11 #include "base/command_line.h"
14 #include "base/compiler_specific.h" 12 #include "base/compiler_specific.h"
15 #include "base/file_util.h" 13 #include "base/file_util.h"
16 #include "base/files/file_path.h" 14 #include "base/files/file_path.h"
17 #include "base/location.h" 15 #include "base/location.h"
18 #include "base/metrics/histogram.h" 16 #include "base/metrics/histogram.h"
19 #include "base/strings/utf_string_conversions.h" 17 #include "base/strings/utf_string_conversions.h"
20 #include "base/threading/thread_restrictions.h" 18 #include "base/threading/thread_restrictions.h"
21 #include "base/timer.h" 19 #include "base/timer.h"
22 #include "base/tracked_objects.h" 20 #include "base/tracked_objects.h"
23 #include "build/build_config.h" 21 #include "build/build_config.h"
24 #include "chrome/browser/invalidation/invalidator_storage.h" 22 #include "chrome/browser/invalidation/invalidation_service.h"
23 #include "chrome/browser/invalidation/invalidation_service_factory.h"
25 #include "chrome/browser/net/network_time_tracker.h" 24 #include "chrome/browser/net/network_time_tracker.h"
26 #include "chrome/browser/profiles/profile.h" 25 #include "chrome/browser/profiles/profile.h"
27 #include "chrome/browser/signin/token_service.h" 26 #include "chrome/browser/signin/token_service.h"
28 #include "chrome/browser/signin/token_service_factory.h" 27 #include "chrome/browser/signin/token_service_factory.h"
29 #include "chrome/browser/sync/glue/android_invalidator_bridge.h"
30 #include "chrome/browser/sync/glue/android_invalidator_bridge_proxy.h"
31 #include "chrome/browser/sync/glue/change_processor.h" 28 #include "chrome/browser/sync/glue/change_processor.h"
32 #include "chrome/browser/sync/glue/chrome_encryptor.h" 29 #include "chrome/browser/sync/glue/chrome_encryptor.h"
33 #include "chrome/browser/sync/glue/device_info.h" 30 #include "chrome/browser/sync/glue/device_info.h"
34 #include "chrome/browser/sync/glue/dummy_invalidator.h"
35 #include "chrome/browser/sync/glue/sync_backend_registrar.h" 31 #include "chrome/browser/sync/glue/sync_backend_registrar.h"
36 #include "chrome/browser/sync/glue/synced_device_tracker.h" 32 #include "chrome/browser/sync/glue/synced_device_tracker.h"
37 #include "chrome/browser/sync/sync_prefs.h" 33 #include "chrome/browser/sync/sync_prefs.h"
38 #include "chrome/common/chrome_notification_types.h" 34 #include "chrome/common/chrome_notification_types.h"
39 #include "chrome/common/chrome_notification_types.h" 35 #include "chrome/common/chrome_notification_types.h"
40 #include "chrome/common/chrome_switches.h" 36 #include "chrome/common/chrome_switches.h"
41 #include "chrome/common/chrome_version_info.h" 37 #include "chrome/common/chrome_version_info.h"
42 #include "content/public/browser/browser_thread.h" 38 #include "content/public/browser/browser_thread.h"
43 #include "content/public/browser/notification_details.h" 39 #include "content/public/browser/notification_details.h"
44 #include "content/public/browser/notification_service.h" 40 #include "content/public/browser/notification_service.h"
45 #include "content/public/browser/notification_source.h" 41 #include "content/public/browser/notification_source.h"
46 #include "content/public/common/content_client.h" 42 #include "content/public/common/content_client.h"
47 #include "google_apis/gaia/gaia_constants.h" 43 #include "google_apis/gaia/gaia_constants.h"
48 #include "jingle/notifier/base/notification_method.h" 44 #include "jingle/notifier/base/notification_method.h"
49 #include "jingle/notifier/base/notifier_options.h" 45 #include "jingle/notifier/base/notifier_options.h"
50 #include "net/base/host_port_pair.h" 46 #include "net/base/host_port_pair.h"
51 #include "net/url_request/url_request_context_getter.h" 47 #include "net/url_request/url_request_context_getter.h"
52 #include "sync/internal_api/public/base_transaction.h" 48 #include "sync/internal_api/public/base_transaction.h"
53 #include "sync/internal_api/public/engine/model_safe_worker.h" 49 #include "sync/internal_api/public/engine/model_safe_worker.h"
54 #include "sync/internal_api/public/http_bridge.h" 50 #include "sync/internal_api/public/http_bridge.h"
55 #include "sync/internal_api/public/internal_components_factory_impl.h" 51 #include "sync/internal_api/public/internal_components_factory_impl.h"
56 #include "sync/internal_api/public/read_transaction.h" 52 #include "sync/internal_api/public/read_transaction.h"
57 #include "sync/internal_api/public/sync_manager_factory.h" 53 #include "sync/internal_api/public/sync_manager_factory.h"
58 #include "sync/internal_api/public/util/experiments.h" 54 #include "sync/internal_api/public/util/experiments.h"
59 #include "sync/internal_api/public/util/sync_string_conversions.h" 55 #include "sync/internal_api/public/util/sync_string_conversions.h"
60 #include "sync/notifier/invalidator.h"
61 #include "sync/protocol/encryption.pb.h" 56 #include "sync/protocol/encryption.pb.h"
62 #include "sync/protocol/sync.pb.h" 57 #include "sync/protocol/sync.pb.h"
63 #include "sync/util/nigori.h" 58 #include "sync/util/nigori.h"
64 59
65 #if defined(ENABLE_MANAGED_USERS) 60 #if defined(ENABLE_MANAGED_USERS)
66 #include "chrome/browser/managed_mode/managed_user_service.h" 61 #include "chrome/browser/managed_mode/managed_user_service.h"
67 #endif 62 #endif
68 63
69 static const int kSaveChangesIntervalSeconds = 10; 64 static const int kSaveChangesIntervalSeconds = 10;
70 static const base::FilePath::CharType kSyncDataFolderName[] = 65 static const base::FilePath::CharType kSyncDataFolderName[] =
(...skipping 29 matching lines...) Expand all
100 // Helper macros to log with the syncer thread name; useful when there 95 // Helper macros to log with the syncer thread name; useful when there
101 // are multiple syncers involved. 96 // are multiple syncers involved.
102 97
103 #define SLOG(severity) LOG(severity) << name_ << ": " 98 #define SLOG(severity) LOG(severity) << name_ << ": "
104 99
105 #define SDVLOG(verbose_level) DVLOG(verbose_level) << name_ << ": " 100 #define SDVLOG(verbose_level) DVLOG(verbose_level) << name_ << ": "
106 101
107 class SyncBackendHost::Core 102 class SyncBackendHost::Core
108 : public base::RefCountedThreadSafe<SyncBackendHost::Core>, 103 : public base::RefCountedThreadSafe<SyncBackendHost::Core>,
109 public syncer::SyncEncryptionHandler::Observer, 104 public syncer::SyncEncryptionHandler::Observer,
110 public syncer::SyncManager::Observer, 105 public syncer::SyncManager::Observer {
111 public syncer::InvalidationHandler {
112 public: 106 public:
113 Core(const std::string& name, 107 Core(const std::string& name,
114 const base::FilePath& sync_data_folder_path, 108 const base::FilePath& sync_data_folder_path,
115 const base::WeakPtr<SyncBackendHost>& backend); 109 const base::WeakPtr<SyncBackendHost>& backend);
116 110
117 // SyncManager::Observer implementation. The Core just acts like an air 111 // SyncManager::Observer implementation. The Core just acts like an air
118 // traffic controller here, forwarding incoming messages to appropriate 112 // traffic controller here, forwarding incoming messages to appropriate
119 // landing threads. 113 // landing threads.
120 virtual void OnSyncCycleCompleted( 114 virtual void OnSyncCycleCompleted(
121 const syncer::sessions::SyncSessionSnapshot& snapshot) OVERRIDE; 115 const syncer::sessions::SyncSessionSnapshot& snapshot) OVERRIDE;
(...skipping 20 matching lines...) Expand all
142 syncer::BootstrapTokenType type) OVERRIDE; 136 syncer::BootstrapTokenType type) OVERRIDE;
143 virtual void OnEncryptedTypesChanged( 137 virtual void OnEncryptedTypesChanged(
144 syncer::ModelTypeSet encrypted_types, 138 syncer::ModelTypeSet encrypted_types,
145 bool encrypt_everything) OVERRIDE; 139 bool encrypt_everything) OVERRIDE;
146 virtual void OnEncryptionComplete() OVERRIDE; 140 virtual void OnEncryptionComplete() OVERRIDE;
147 virtual void OnCryptographerStateChanged( 141 virtual void OnCryptographerStateChanged(
148 syncer::Cryptographer* cryptographer) OVERRIDE; 142 syncer::Cryptographer* cryptographer) OVERRIDE;
149 virtual void OnPassphraseTypeChanged(syncer::PassphraseType type, 143 virtual void OnPassphraseTypeChanged(syncer::PassphraseType type,
150 base::Time passphrase_time) OVERRIDE; 144 base::Time passphrase_time) OVERRIDE;
151 145
152 // syncer::InvalidationHandler implementation. 146 // Forwards an invalidation state change to the sync manager.
153 virtual void OnInvalidatorStateChange( 147 void DoOnInvalidatorStateChange(syncer::InvalidatorState state);
154 syncer::InvalidatorState state) OVERRIDE; 148
155 virtual void OnIncomingInvalidation( 149 // Forwards an invalidation to the sync manager.
156 const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE; 150 void DoOnIncomingInvalidation(
151 syncer::ObjectIdInvalidationMap invalidation_map);
157 152
158 // Note: 153 // Note:
159 // 154 //
160 // The Do* methods are the various entry points from our 155 // The Do* methods are the various entry points from our
161 // SyncBackendHost. They are all called on the sync thread to 156 // SyncBackendHost. They are all called on the sync thread to
162 // actually perform synchronous (and potentially blocking) syncapi 157 // actually perform synchronous (and potentially blocking) syncapi
163 // operations. 158 // operations.
164 // 159 //
165 // Called to perform initialization of the syncapi on behalf of 160 // Called to perform initialization of the syncapi on behalf of
166 // SyncBackendHost::Initialize. 161 // SyncBackendHost::Initialize.
167 void DoInitialize(const DoInitializeOptions& options); 162 void DoInitialize(const DoInitializeOptions& options);
168 163
169 // Called to perform credential update on behalf of 164 // Called to perform credential update on behalf of
170 // SyncBackendHost::UpdateCredentials. 165 // SyncBackendHost::UpdateCredentials.
171 void DoUpdateCredentials(const syncer::SyncCredentials& credentials); 166 void DoUpdateCredentials(const syncer::SyncCredentials& credentials);
172 167
173 // Called to update the given registered ids on behalf of
174 // SyncBackendHost::UpdateRegisteredInvalidationIds.
175 void DoUpdateRegisteredInvalidationIds(const syncer::ObjectIdSet& ids);
176
177 // Called to acknowledge an invalidation on behalf of
178 // SyncBackendHost::AcknowledgeInvalidation.
179 void DoAcknowledgeInvalidation(const invalidation::ObjectId& id,
180 const syncer::AckHandle& ack_handle);
181
182 // Called to tell the syncapi to start syncing (generally after 168 // Called to tell the syncapi to start syncing (generally after
183 // initialization and authentication). 169 // initialization and authentication).
184 void DoStartSyncing(const syncer::ModelSafeRoutingInfo& routing_info); 170 void DoStartSyncing(const syncer::ModelSafeRoutingInfo& routing_info);
185 171
186 // Called to set the passphrase for encryption. 172 // Called to set the passphrase for encryption.
187 void DoSetEncryptionPassphrase(const std::string& passphrase, 173 void DoSetEncryptionPassphrase(const std::string& passphrase,
188 bool is_explicit); 174 bool is_explicit);
189 175
190 // Called to decrypt the pending keys. 176 // Called to decrypt the pending keys.
191 void DoSetDecryptionPassphrase(const std::string& passphrase); 177 void DoSetDecryptionPassphrase(const std::string& passphrase);
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 288
303 // Our encryptor, which uses Chrome's encryption functions. 289 // Our encryptor, which uses Chrome's encryption functions.
304 ChromeEncryptor encryptor_; 290 ChromeEncryptor encryptor_;
305 291
306 // A special ChangeProcessor that tracks the DEVICE_INFO type for us. 292 // A special ChangeProcessor that tracks the DEVICE_INFO type for us.
307 scoped_ptr<SyncedDeviceTracker> synced_device_tracker_; 293 scoped_ptr<SyncedDeviceTracker> synced_device_tracker_;
308 294
309 // The top-level syncapi entry point. Lives on the sync thread. 295 // The top-level syncapi entry point. Lives on the sync thread.
310 scoped_ptr<syncer::SyncManager> sync_manager_; 296 scoped_ptr<syncer::SyncManager> sync_manager_;
311 297
312 // Whether or not we registered with |sync_manager_| as an invalidation
313 // handler. Necessary since we may end up trying to unregister before we
314 // register in tests (in synchronous initialization mode).
315 //
316 // TODO(akalin): Fix this behavior (see http://crbug.com/140354).
317 bool registered_as_invalidation_handler_;
318
319 DISALLOW_COPY_AND_ASSIGN(Core); 298 DISALLOW_COPY_AND_ASSIGN(Core);
320 }; 299 };
321 300
322 namespace {
323
324 // Parses the given command line for notifier options.
325 notifier::NotifierOptions ParseNotifierOptions(
326 const CommandLine& command_line,
327 const scoped_refptr<net::URLRequestContextGetter>&
328 request_context_getter) {
329 notifier::NotifierOptions notifier_options;
330 notifier_options.request_context_getter = request_context_getter;
331 if (!command_line.HasSwitch(switches::kSyncDisableOAuth2Token))
332 notifier_options.auth_mechanism = "X-OAUTH2";
333
334 if (command_line.HasSwitch(switches::kSyncNotificationHostPort)) {
335 notifier_options.xmpp_host_port =
336 net::HostPortPair::FromString(
337 command_line.GetSwitchValueASCII(
338 switches::kSyncNotificationHostPort));
339 DVLOG(1) << "Using " << notifier_options.xmpp_host_port.ToString()
340 << " for test sync notification server.";
341 }
342
343 notifier_options.try_ssltcp_first =
344 command_line.HasSwitch(switches::kSyncTrySsltcpFirstForXmpp);
345 DVLOG_IF(1, notifier_options.try_ssltcp_first)
346 << "Trying SSL/TCP port before XMPP port for notifications.";
347
348 notifier_options.invalidate_xmpp_login =
349 command_line.HasSwitch(switches::kSyncInvalidateXmppLogin);
350 DVLOG_IF(1, notifier_options.invalidate_xmpp_login)
351 << "Invalidating sync XMPP login.";
352
353 notifier_options.allow_insecure_connection =
354 command_line.HasSwitch(switches::kSyncAllowInsecureXmppConnection);
355 DVLOG_IF(1, notifier_options.allow_insecure_connection)
356 << "Allowing insecure XMPP connections.";
357
358 if (command_line.HasSwitch(switches::kSyncNotificationMethod)) {
359 const std::string notification_method_str(
360 command_line.GetSwitchValueASCII(switches::kSyncNotificationMethod));
361 notifier_options.notification_method =
362 notifier::StringToNotificationMethod(notification_method_str);
363 }
364
365 return notifier_options;
366 }
367
368 } // namespace
369
370 SyncBackendHost::SyncBackendHost( 301 SyncBackendHost::SyncBackendHost(
371 const std::string& name, 302 const std::string& name,
372 Profile* profile, 303 Profile* profile,
373 const base::WeakPtr<SyncPrefs>& sync_prefs, 304 const base::WeakPtr<SyncPrefs>& sync_prefs)
374 const base::WeakPtr<invalidation::InvalidatorStorage>& invalidator_storage)
375 : weak_ptr_factory_(this), 305 : weak_ptr_factory_(this),
376 sync_thread_("Chrome_SyncThread"), 306 sync_thread_("Chrome_SyncThread"),
377 frontend_loop_(base::MessageLoop::current()), 307 frontend_loop_(base::MessageLoop::current()),
378 profile_(profile), 308 profile_(profile),
379 name_(name), 309 name_(name),
380 core_(new Core(name, profile_->GetPath().Append(kSyncDataFolderName), 310 core_(new Core(name, profile_->GetPath().Append(kSyncDataFolderName),
381 weak_ptr_factory_.GetWeakPtr())), 311 weak_ptr_factory_.GetWeakPtr())),
382 initialization_state_(NOT_ATTEMPTED), 312 initialization_state_(NOT_ATTEMPTED),
383 sync_prefs_(sync_prefs), 313 sync_prefs_(sync_prefs),
384 invalidator_factory_(
385 ParseNotifierOptions(*CommandLine::ForCurrentProcess(),
386 profile_->GetRequestContext()),
387 content::GetUserAgent(GURL()),
388 invalidator_storage),
389 frontend_(NULL), 314 frontend_(NULL),
390 cached_passphrase_type_(syncer::IMPLICIT_PASSPHRASE) { 315 cached_passphrase_type_(syncer::IMPLICIT_PASSPHRASE),
316 invalidator_(
317 invalidation::InvalidationServiceFactory::GetForProfile(profile)) {
391 } 318 }
392 319
393 SyncBackendHost::SyncBackendHost(Profile* profile) 320 SyncBackendHost::SyncBackendHost(Profile* profile)
394 : weak_ptr_factory_(this), 321 : weak_ptr_factory_(this),
395 sync_thread_("Chrome_SyncThread"), 322 sync_thread_("Chrome_SyncThread"),
396 frontend_loop_(base::MessageLoop::current()), 323 frontend_loop_(base::MessageLoop::current()),
397 profile_(profile), 324 profile_(profile),
398 name_("Unknown"), 325 name_("Unknown"),
399 initialization_state_(NOT_ATTEMPTED), 326 initialization_state_(NOT_ATTEMPTED),
400 invalidator_factory_(
401 ParseNotifierOptions(*CommandLine::ForCurrentProcess(),
402 profile_->GetRequestContext()),
403 content::GetUserAgent(GURL()),
404 base::WeakPtr<syncer::InvalidationStateTracker>()),
405 frontend_(NULL), 327 frontend_(NULL),
406 cached_passphrase_type_(syncer::IMPLICIT_PASSPHRASE) { 328 cached_passphrase_type_(syncer::IMPLICIT_PASSPHRASE) {
407 } 329 }
408 330
409 SyncBackendHost::~SyncBackendHost() { 331 SyncBackendHost::~SyncBackendHost() {
410 DCHECK(!core_.get() && !frontend_) << "Must call Shutdown before destructor."; 332 DCHECK(!core_.get() && !frontend_) << "Must call Shutdown before destructor.";
411 DCHECK(!android_invalidator_bridge_.get());
412 DCHECK(!registrar_.get()); 333 DCHECK(!registrar_.get());
413 } 334 }
414 335
415 namespace { 336 namespace {
416 337
417 scoped_ptr<syncer::HttpPostProviderFactory> MakeHttpBridgeFactory( 338 scoped_ptr<syncer::HttpPostProviderFactory> MakeHttpBridgeFactory(
418 const scoped_refptr<net::URLRequestContextGetter>& getter, 339 const scoped_refptr<net::URLRequestContextGetter>& getter,
419 const NetworkTimeTracker::UpdateCallback& update_callback) { 340 const NetworkTimeTracker::UpdateCallback& update_callback) {
420 chrome::VersionInfo version_info; 341 chrome::VersionInfo version_info;
421 return scoped_ptr<syncer::HttpPostProviderFactory>( 342 return scoped_ptr<syncer::HttpPostProviderFactory>(
(...skipping 11 matching lines...) Expand all
433 const GURL& sync_service_url, 354 const GURL& sync_service_url,
434 const SyncCredentials& credentials, 355 const SyncCredentials& credentials,
435 bool delete_sync_data_folder, 356 bool delete_sync_data_folder,
436 syncer::SyncManagerFactory* sync_manager_factory, 357 syncer::SyncManagerFactory* sync_manager_factory,
437 syncer::UnrecoverableErrorHandler* unrecoverable_error_handler, 358 syncer::UnrecoverableErrorHandler* unrecoverable_error_handler,
438 syncer::ReportUnrecoverableErrorFunction 359 syncer::ReportUnrecoverableErrorFunction
439 report_unrecoverable_error_function) { 360 report_unrecoverable_error_function) {
440 if (!sync_thread_.Start()) 361 if (!sync_thread_.Start())
441 return; 362 return;
442 363
443 android_invalidator_bridge_.reset(
444 new AndroidInvalidatorBridge(
445 profile_, sync_thread_.message_loop_proxy()));
446
447 frontend_ = frontend; 364 frontend_ = frontend;
448 DCHECK(frontend); 365 DCHECK(frontend);
449 366
450 registrar_.reset(new SyncBackendRegistrar(name_, 367 registrar_.reset(new SyncBackendRegistrar(name_,
451 profile_, 368 profile_,
452 sync_thread_.message_loop())); 369 sync_thread_.message_loop()));
453 syncer::ModelSafeRoutingInfo routing_info; 370 syncer::ModelSafeRoutingInfo routing_info;
454 std::vector<syncer::ModelSafeWorker*> workers; 371 std::vector<syncer::ModelSafeWorker*> workers;
455 registrar_->GetModelSafeRoutingInfo(&routing_info); 372 registrar_->GetModelSafeRoutingInfo(&routing_info);
456 registrar_->GetWorkers(&workers); 373 registrar_->GetWorkers(&workers);
457 374
458 InternalComponentsFactory::Switches factory_switches = { 375 InternalComponentsFactory::Switches factory_switches = {
459 InternalComponentsFactory::ENCRYPTION_KEYSTORE, 376 InternalComponentsFactory::ENCRYPTION_KEYSTORE,
460 InternalComponentsFactory::BACKOFF_NORMAL 377 InternalComponentsFactory::BACKOFF_NORMAL
461 }; 378 };
462 379
463 CommandLine* cl = CommandLine::ForCurrentProcess(); 380 CommandLine* cl = CommandLine::ForCurrentProcess();
464 if (cl->HasSwitch(switches::kSyncShortInitialRetryOverride)) { 381 if (cl->HasSwitch(switches::kSyncShortInitialRetryOverride)) {
465 factory_switches.backoff_override = 382 factory_switches.backoff_override =
466 InternalComponentsFactoryImpl::BACKOFF_SHORT_INITIAL_RETRY_OVERRIDE; 383 InternalComponentsFactoryImpl::BACKOFF_SHORT_INITIAL_RETRY_OVERRIDE;
467 } 384 }
468 385
469 bool create_invalidator = true; 386 invalidator_->RegisterInvalidationHandler(this);
470 #if defined(ENABLE_MANAGED_USERS)
471 if (ManagedUserService::ProfileIsManaged(profile_))
472 create_invalidator = false;
473 #endif
474 387
475 initialization_state_ = CREATING_SYNC_MANAGER; 388 initialization_state_ = CREATING_SYNC_MANAGER;
476 InitCore(DoInitializeOptions( 389 InitCore(DoInitializeOptions(
477 sync_thread_.message_loop(), 390 sync_thread_.message_loop(),
478 registrar_.get(), 391 registrar_.get(),
479 routing_info, 392 routing_info,
480 workers, 393 workers,
481 &extensions_activity_monitor_, 394 &extensions_activity_monitor_,
482 event_handler, 395 event_handler,
483 sync_service_url, 396 sync_service_url,
484 base::Bind(&MakeHttpBridgeFactory, 397 base::Bind(&MakeHttpBridgeFactory,
485 make_scoped_refptr(profile_->GetRequestContext()), 398 make_scoped_refptr(profile_->GetRequestContext()),
486 NetworkTimeTracker::BuildNotifierUpdateCallback()), 399 NetworkTimeTracker::BuildNotifierUpdateCallback()),
487 credentials, 400 credentials,
488 android_invalidator_bridge_.get(), 401 invalidator_->GetInvalidatorClientId(),
489 &invalidator_factory_,
490 sync_manager_factory, 402 sync_manager_factory,
491 delete_sync_data_folder, 403 delete_sync_data_folder,
492 sync_prefs_->GetEncryptionBootstrapToken(), 404 sync_prefs_->GetEncryptionBootstrapToken(),
493 sync_prefs_->GetKeystoreEncryptionBootstrapToken(), 405 sync_prefs_->GetKeystoreEncryptionBootstrapToken(),
494 new InternalComponentsFactoryImpl(factory_switches), 406 new InternalComponentsFactoryImpl(factory_switches),
495 unrecoverable_error_handler, 407 unrecoverable_error_handler,
496 report_unrecoverable_error_function, 408 report_unrecoverable_error_function,
497 !cl->HasSwitch(switches::kSyncDisableOAuth2Token), 409 !cl->HasSwitch(switches::kSyncDisableOAuth2Token)));
498 create_invalidator));
499 } 410 }
500 411
501 void SyncBackendHost::UpdateCredentials(const SyncCredentials& credentials) { 412 void SyncBackendHost::UpdateCredentials(const SyncCredentials& credentials) {
502 DCHECK(sync_thread_.IsRunning()); 413 DCHECK(sync_thread_.IsRunning());
503 sync_thread_.message_loop()->PostTask(FROM_HERE, 414 sync_thread_.message_loop()->PostTask(FROM_HERE,
504 base::Bind(&SyncBackendHost::Core::DoUpdateCredentials, core_.get(), 415 base::Bind(&SyncBackendHost::Core::DoUpdateCredentials, core_.get(),
505 credentials)); 416 credentials));
506 } 417 }
507 418
508 void SyncBackendHost::UpdateRegisteredInvalidationIds(
509 const syncer::ObjectIdSet& ids) {
510 DCHECK_EQ(base::MessageLoop::current(), frontend_loop_);
511 DCHECK(sync_thread_.IsRunning());
512 sync_thread_.message_loop()->PostTask(FROM_HERE,
513 base::Bind(&SyncBackendHost::Core::DoUpdateRegisteredInvalidationIds,
514 core_.get(), ids));
515 }
516
517 void SyncBackendHost::AcknowledgeInvalidation(
518 const invalidation::ObjectId& id, const syncer::AckHandle& ack_handle) {
519 DCHECK_EQ(base::MessageLoop::current(), frontend_loop_);
520 DCHECK(sync_thread_.IsRunning());
521 sync_thread_.message_loop()->PostTask(FROM_HERE,
522 base::Bind(&SyncBackendHost::Core::DoAcknowledgeInvalidation,
523 core_.get(), id, ack_handle));
524 }
525
526 void SyncBackendHost::StartSyncingWithServer() { 419 void SyncBackendHost::StartSyncingWithServer() {
527 SDVLOG(1) << "SyncBackendHost::StartSyncingWithServer called."; 420 SDVLOG(1) << "SyncBackendHost::StartSyncingWithServer called.";
528 421
529 syncer::ModelSafeRoutingInfo routing_info; 422 syncer::ModelSafeRoutingInfo routing_info;
530 registrar_->GetModelSafeRoutingInfo(&routing_info); 423 registrar_->GetModelSafeRoutingInfo(&routing_info);
531 424
532 sync_thread_.message_loop()->PostTask(FROM_HERE, 425 sync_thread_.message_loop()->PostTask(FROM_HERE,
533 base::Bind(&SyncBackendHost::Core::DoStartSyncing, 426 base::Bind(&SyncBackendHost::Core::DoStartSyncing,
534 core_.get(), routing_info)); 427 core_.get(), routing_info));
535 } 428 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 // so the registrar won't need stopping either. 552 // so the registrar won't need stopping either.
660 DCHECK_EQ(initialization_state_, NOT_ATTEMPTED); 553 DCHECK_EQ(initialization_state_, NOT_ATTEMPTED);
661 DCHECK(!registrar_.get()); 554 DCHECK(!registrar_.get());
662 } 555 }
663 } 556 }
664 557
665 void SyncBackendHost::Shutdown(bool sync_disabled) { 558 void SyncBackendHost::Shutdown(bool sync_disabled) {
666 // StopSyncingForShutdown() (which nulls out |frontend_|) should be 559 // StopSyncingForShutdown() (which nulls out |frontend_|) should be
667 // called first. 560 // called first.
668 DCHECK(!frontend_); 561 DCHECK(!frontend_);
562
563 if (sync_disabled)
564 invalidator_->UpdateRegisteredInvalidationIds(this, syncer::ObjectIdSet());
565 invalidator_->UnregisterInvalidationHandler(this);
566 invalidator_ = NULL;
567
669 // TODO(tim): DCHECK(registrar_->StoppedOnUIThread()) would be nice. 568 // TODO(tim): DCHECK(registrar_->StoppedOnUIThread()) would be nice.
670 if (sync_thread_.IsRunning()) { 569 if (sync_thread_.IsRunning()) {
671 sync_thread_.message_loop()->PostTask(FROM_HERE, 570 sync_thread_.message_loop()->PostTask(FROM_HERE,
672 base::Bind(&SyncBackendHost::Core::DoShutdown, core_.get(), 571 base::Bind(&SyncBackendHost::Core::DoShutdown, core_.get(),
673 sync_disabled)); 572 sync_disabled));
674
675 if (android_invalidator_bridge_)
676 android_invalidator_bridge_->StopForShutdown();
677 } 573 }
678 574
679 // Stop will return once the thread exits, which will be after DoShutdown 575 // Stop will return once the thread exits, which will be after DoShutdown
680 // runs. DoShutdown needs to run from sync_thread_ because the sync backend 576 // runs. DoShutdown needs to run from sync_thread_ because the sync backend
681 // requires any thread that opened sqlite handles to relinquish them 577 // requires any thread that opened sqlite handles to relinquish them
682 // personally. We need to join threads, because otherwise the main Chrome 578 // personally. We need to join threads, because otherwise the main Chrome
683 // thread (ui loop) can exit before DoShutdown finishes, at which point 579 // thread (ui loop) can exit before DoShutdown finishes, at which point
684 // virtually anything the sync backend does (or the post-back to 580 // virtually anything the sync backend does (or the post-back to
685 // frontend_loop_ by our Core) will epically fail because the CRT won't be 581 // frontend_loop_ by our Core) will epically fail because the CRT won't be
686 // initialized. 582 // initialized.
687 // Since we are blocking the UI thread here, we need to turn ourselves in 583 // Since we are blocking the UI thread here, we need to turn ourselves in
688 // with the ThreadRestriction police. For sentencing and how we plan to fix 584 // with the ThreadRestriction police. For sentencing and how we plan to fix
689 // this, see bug 19757. 585 // this, see bug 19757.
690 base::Time stop_thread_start_time = base::Time::Now(); 586 base::Time stop_thread_start_time = base::Time::Now();
691 { 587 {
692 base::ThreadRestrictions::ScopedAllowIO allow_io; 588 base::ThreadRestrictions::ScopedAllowIO allow_io;
693 sync_thread_.Stop(); 589 sync_thread_.Stop();
694 } 590 }
695 base::TimeDelta stop_sync_thread_time = base::Time::Now() - 591 base::TimeDelta stop_sync_thread_time = base::Time::Now() -
696 stop_thread_start_time; 592 stop_thread_start_time;
697 UMA_HISTOGRAM_TIMES("Sync.Shutdown.StopSyncThreadTime", 593 UMA_HISTOGRAM_TIMES("Sync.Shutdown.StopSyncThreadTime",
698 stop_sync_thread_time); 594 stop_sync_thread_time);
699 595
700 registrar_.reset(); 596 registrar_.reset();
701 js_backend_.Reset(); 597 js_backend_.Reset();
702 android_invalidator_bridge_.reset();
703 core_ = NULL; // Releases reference to core_. 598 core_ = NULL; // Releases reference to core_.
704 } 599 }
705 600
706 void SyncBackendHost::ConfigureDataTypes( 601 void SyncBackendHost::ConfigureDataTypes(
707 syncer::ConfigureReason reason, 602 syncer::ConfigureReason reason,
708 const DataTypeConfigStateMap& config_state_map, 603 const DataTypeConfigStateMap& config_state_map,
709 const base::Callback<void(syncer::ModelTypeSet, 604 const base::Callback<void(syncer::ModelTypeSet,
710 syncer::ModelTypeSet)>& ready_task, 605 syncer::ModelTypeSet)>& ready_task,
711 const base::Callback<void()>& retry_callback) { 606 const base::Callback<void()>& retry_callback) {
712 // Only one configure is allowed at a time. This is guaranteed by our 607 // Only one configure is allowed at a time. This is guaranteed by our
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 base::Bind(&SyncBackendHost::Core::DoConfigureSyncer, 798 base::Bind(&SyncBackendHost::Core::DoConfigureSyncer,
904 core_.get(), 799 core_.get(),
905 reason, 800 reason,
906 config_types, 801 config_types,
907 routing_info, 802 routing_info,
908 ready_task, 803 ready_task,
909 retry_callback)); 804 retry_callback));
910 } 805 }
911 806
912 void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop( 807 void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop(
808 const syncer::ModelTypeSet enabled_types,
913 const syncer::ModelTypeSet succeeded_configuration_types, 809 const syncer::ModelTypeSet succeeded_configuration_types,
914 const syncer::ModelTypeSet failed_configuration_types, 810 const syncer::ModelTypeSet failed_configuration_types,
915 const base::Callback<void(syncer::ModelTypeSet, 811 const base::Callback<void(syncer::ModelTypeSet,
916 syncer::ModelTypeSet)>& ready_task) { 812 syncer::ModelTypeSet)>& ready_task) {
917 if (!frontend_) 813 if (!frontend_)
918 return; 814 return;
919 DCHECK_EQ(base::MessageLoop::current(), frontend_loop_); 815
816 invalidator_->UpdateRegisteredInvalidationIds(
817 this,
818 ModelTypeSetToObjectIdSet(enabled_types));
819
920 if (!ready_task.is_null()) 820 if (!ready_task.is_null())
921 ready_task.Run(succeeded_configuration_types, failed_configuration_types); 821 ready_task.Run(succeeded_configuration_types, failed_configuration_types);
922 } 822 }
923 823
924 void SyncBackendHost::HandleSyncManagerInitializationOnFrontendLoop( 824 void SyncBackendHost::HandleSyncManagerInitializationOnFrontendLoop(
925 const syncer::WeakHandle<syncer::JsBackend>& js_backend, 825 const syncer::WeakHandle<syncer::JsBackend>& js_backend,
926 const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& 826 const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>&
927 debug_info_listener, 827 debug_info_listener,
928 syncer::ModelTypeSet restored_types) { 828 syncer::ModelTypeSet restored_types) {
929 DCHECK_EQ(initialization_state_, CREATING_SYNC_MANAGER); 829 DCHECK_EQ(initialization_state_, CREATING_SYNC_MANAGER);
(...skipping 10 matching lines...) Expand all
940 840
941 // Start forwarding refresh requests to the SyncManager 841 // Start forwarding refresh requests to the SyncManager
942 notification_registrar_.Add(this, chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, 842 notification_registrar_.Add(this, chrome::NOTIFICATION_SYNC_REFRESH_LOCAL,
943 content::Source<Profile>(profile_)); 843 content::Source<Profile>(profile_));
944 844
945 syncer::ConfigureReason reason = 845 syncer::ConfigureReason reason =
946 (sync_prefs_->HasSyncSetupCompleted() ? 846 (sync_prefs_->HasSyncSetupCompleted() ?
947 syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE : 847 syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE :
948 syncer::CONFIGURE_REASON_NEW_CLIENT); 848 syncer::CONFIGURE_REASON_NEW_CLIENT);
949 849
850 // Fake a state change to initialize the SyncManager's cached invalidator
851 // state.
852 OnInvalidatorStateChange(invalidator_->GetInvalidatorState());
853
950 // Kick off the next step in SyncBackendHost initialization by downloading 854 // Kick off the next step in SyncBackendHost initialization by downloading
951 // any necessary control types. 855 // any necessary control types.
952 sync_thread_.message_loop()->PostTask( 856 sync_thread_.message_loop()->PostTask(
953 FROM_HERE, 857 FROM_HERE,
954 base::Bind(&SyncBackendHost::Core::DoDownloadControlTypes, 858 base::Bind(&SyncBackendHost::Core::DoDownloadControlTypes,
955 core_.get(), 859 core_.get(),
956 reason)); 860 reason));
957 } 861 }
958 862
959 void SyncBackendHost::Observe( 863 void SyncBackendHost::Observe(
(...skipping 16 matching lines...) Expand all
976 SyncBackendHost::DoInitializeOptions::DoInitializeOptions( 880 SyncBackendHost::DoInitializeOptions::DoInitializeOptions(
977 base::MessageLoop* sync_loop, 881 base::MessageLoop* sync_loop,
978 SyncBackendRegistrar* registrar, 882 SyncBackendRegistrar* registrar,
979 const syncer::ModelSafeRoutingInfo& routing_info, 883 const syncer::ModelSafeRoutingInfo& routing_info,
980 const std::vector<syncer::ModelSafeWorker*>& workers, 884 const std::vector<syncer::ModelSafeWorker*>& workers,
981 syncer::ExtensionsActivityMonitor* extensions_activity_monitor, 885 syncer::ExtensionsActivityMonitor* extensions_activity_monitor,
982 const syncer::WeakHandle<syncer::JsEventHandler>& event_handler, 886 const syncer::WeakHandle<syncer::JsEventHandler>& event_handler,
983 const GURL& service_url, 887 const GURL& service_url,
984 MakeHttpBridgeFactoryFn make_http_bridge_factory_fn, 888 MakeHttpBridgeFactoryFn make_http_bridge_factory_fn,
985 const syncer::SyncCredentials& credentials, 889 const syncer::SyncCredentials& credentials,
986 AndroidInvalidatorBridge* android_invalidator_bridge, 890 const std::string& invalidator_client_id,
987 syncer::InvalidatorFactory* invalidator_factory,
988 syncer::SyncManagerFactory* sync_manager_factory, 891 syncer::SyncManagerFactory* sync_manager_factory,
989 bool delete_sync_data_folder, 892 bool delete_sync_data_folder,
990 const std::string& restored_key_for_bootstrapping, 893 const std::string& restored_key_for_bootstrapping,
991 const std::string& restored_keystore_key_for_bootstrapping, 894 const std::string& restored_keystore_key_for_bootstrapping,
992 InternalComponentsFactory* internal_components_factory, 895 InternalComponentsFactory* internal_components_factory,
993 syncer::UnrecoverableErrorHandler* unrecoverable_error_handler, 896 syncer::UnrecoverableErrorHandler* unrecoverable_error_handler,
994 syncer::ReportUnrecoverableErrorFunction 897 syncer::ReportUnrecoverableErrorFunction
995 report_unrecoverable_error_function, 898 report_unrecoverable_error_function,
996 bool use_oauth2_token, 899 bool use_oauth2_token)
997 bool create_invalidator)
998 : sync_loop(sync_loop), 900 : sync_loop(sync_loop),
999 registrar(registrar), 901 registrar(registrar),
1000 routing_info(routing_info), 902 routing_info(routing_info),
1001 workers(workers), 903 workers(workers),
1002 extensions_activity_monitor(extensions_activity_monitor), 904 extensions_activity_monitor(extensions_activity_monitor),
1003 event_handler(event_handler), 905 event_handler(event_handler),
1004 service_url(service_url), 906 service_url(service_url),
1005 make_http_bridge_factory_fn(make_http_bridge_factory_fn), 907 make_http_bridge_factory_fn(make_http_bridge_factory_fn),
1006 credentials(credentials), 908 credentials(credentials),
1007 android_invalidator_bridge(android_invalidator_bridge), 909 invalidator_client_id(invalidator_client_id),
1008 invalidator_factory(invalidator_factory),
1009 sync_manager_factory(sync_manager_factory), 910 sync_manager_factory(sync_manager_factory),
1010 delete_sync_data_folder(delete_sync_data_folder), 911 delete_sync_data_folder(delete_sync_data_folder),
1011 restored_key_for_bootstrapping(restored_key_for_bootstrapping), 912 restored_key_for_bootstrapping(restored_key_for_bootstrapping),
1012 restored_keystore_key_for_bootstrapping( 913 restored_keystore_key_for_bootstrapping(
1013 restored_keystore_key_for_bootstrapping), 914 restored_keystore_key_for_bootstrapping),
1014 internal_components_factory(internal_components_factory), 915 internal_components_factory(internal_components_factory),
1015 unrecoverable_error_handler(unrecoverable_error_handler), 916 unrecoverable_error_handler(unrecoverable_error_handler),
1016 report_unrecoverable_error_function( 917 report_unrecoverable_error_function(
1017 report_unrecoverable_error_function), 918 report_unrecoverable_error_function),
1018 use_oauth2_token(use_oauth2_token), 919 use_oauth2_token(use_oauth2_token) {
1019 create_invalidator(create_invalidator) {
1020 } 920 }
1021 921
1022 SyncBackendHost::DoInitializeOptions::~DoInitializeOptions() {} 922 SyncBackendHost::DoInitializeOptions::~DoInitializeOptions() {}
1023 923
1024 SyncBackendHost::Core::Core(const std::string& name, 924 SyncBackendHost::Core::Core(const std::string& name,
1025 const base::FilePath& sync_data_folder_path, 925 const base::FilePath& sync_data_folder_path,
1026 const base::WeakPtr<SyncBackendHost>& backend) 926 const base::WeakPtr<SyncBackendHost>& backend)
1027 : name_(name), 927 : name_(name),
1028 sync_data_folder_path_(sync_data_folder_path), 928 sync_data_folder_path_(sync_data_folder_path),
1029 host_(backend), 929 host_(backend),
1030 sync_loop_(NULL), 930 sync_loop_(NULL),
1031 registrar_(NULL), 931 registrar_(NULL) {
1032 registered_as_invalidation_handler_(false) {
1033 DCHECK(backend.get()); 932 DCHECK(backend.get());
1034 } 933 }
1035 934
1036 SyncBackendHost::Core::~Core() { 935 SyncBackendHost::Core::~Core() {
1037 DCHECK(!sync_manager_.get()); 936 DCHECK(!sync_manager_.get());
1038 DCHECK(!sync_loop_); 937 DCHECK(!sync_loop_);
1039 } 938 }
1040 939
1041 void SyncBackendHost::Core::OnSyncCycleCompleted( 940 void SyncBackendHost::Core::OnSyncCycleCompleted(
1042 const SyncSessionSnapshot& snapshot) { 941 const SyncSessionSnapshot& snapshot) {
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1221 const syncer::SyncProtocolError& sync_error) { 1120 const syncer::SyncProtocolError& sync_error) {
1222 if (!sync_loop_) 1121 if (!sync_loop_)
1223 return; 1122 return;
1224 DCHECK_EQ(base::MessageLoop::current(), sync_loop_); 1123 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
1225 host_.Call( 1124 host_.Call(
1226 FROM_HERE, 1125 FROM_HERE,
1227 &SyncBackendHost::HandleActionableErrorEventOnFrontendLoop, 1126 &SyncBackendHost::HandleActionableErrorEventOnFrontendLoop,
1228 sync_error); 1127 sync_error);
1229 } 1128 }
1230 1129
1231 void SyncBackendHost::Core::OnInvalidatorStateChange( 1130 void SyncBackendHost::Core::DoOnInvalidatorStateChange(
1232 syncer::InvalidatorState state) { 1131 syncer::InvalidatorState state) {
1233 if (!sync_loop_)
1234 return;
1235 DCHECK_EQ(base::MessageLoop::current(), sync_loop_); 1132 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
1236 host_.Call(FROM_HERE, 1133 sync_manager_->OnInvalidatorStateChange(state);
1237 &SyncBackendHost::HandleInvalidatorStateChangeOnFrontendLoop,
1238 state);
1239 } 1134 }
1240 1135
1241 void SyncBackendHost::Core::OnIncomingInvalidation( 1136 void SyncBackendHost::Core::DoOnIncomingInvalidation(
1242 const syncer::ObjectIdInvalidationMap& invalidation_map) { 1137 syncer::ObjectIdInvalidationMap invalidation_map) {
1243 if (!sync_loop_)
1244 return;
1245 DCHECK_EQ(base::MessageLoop::current(), sync_loop_); 1138 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
1246 host_.Call(FROM_HERE, 1139 sync_manager_->OnIncomingInvalidation(invalidation_map);
1247 &SyncBackendHost::HandleIncomingInvalidationOnFrontendLoop,
1248 invalidation_map);
1249 } 1140 }
1250 1141
1251 void SyncBackendHost::Core::DoInitialize(const DoInitializeOptions& options) { 1142 void SyncBackendHost::Core::DoInitialize(const DoInitializeOptions& options) {
1252 DCHECK(!sync_loop_); 1143 DCHECK(!sync_loop_);
1253 sync_loop_ = options.sync_loop; 1144 sync_loop_ = options.sync_loop;
1254 DCHECK(sync_loop_); 1145 DCHECK(sync_loop_);
1255 1146
1256 // Blow away the partial or corrupt sync data folder before doing any more 1147 // Blow away the partial or corrupt sync data folder before doing any more
1257 // initialization, if necessary. 1148 // initialization, if necessary.
1258 if (options.delete_sync_data_folder) { 1149 if (options.delete_sync_data_folder) {
1259 DeleteSyncDataFolder(); 1150 DeleteSyncDataFolder();
1260 } 1151 }
1261 1152
1262 // Make sure that the directory exists before initializing the backend. 1153 // Make sure that the directory exists before initializing the backend.
1263 // If it already exists, this will do no harm. 1154 // If it already exists, this will do no harm.
1264 if (!file_util::CreateDirectory(sync_data_folder_path_)) { 1155 if (!file_util::CreateDirectory(sync_data_folder_path_)) {
1265 DLOG(FATAL) << "Sync Data directory creation failed."; 1156 DLOG(FATAL) << "Sync Data directory creation failed.";
1266 } 1157 }
1267 1158
1268 DCHECK(!registrar_); 1159 DCHECK(!registrar_);
1269 registrar_ = options.registrar; 1160 registrar_ = options.registrar;
1270 DCHECK(registrar_); 1161 DCHECK(registrar_);
1271 1162
1272 sync_manager_ = options.sync_manager_factory->CreateSyncManager(name_); 1163 sync_manager_ = options.sync_manager_factory->CreateSyncManager(name_);
1273 sync_manager_->AddObserver(this); 1164 sync_manager_->AddObserver(this);
1274 scoped_ptr<syncer::Invalidator> invalidator;
1275 if (options.create_invalidator) {
1276 #if defined(OS_ANDROID)
1277 invalidator.reset(
1278 new AndroidInvalidatorBridgeProxy(options.android_invalidator_bridge));
1279 #else
1280 invalidator.reset(options.invalidator_factory->CreateInvalidator());
1281 #endif
1282 } else {
1283 invalidator.reset(new DummyInvalidator());
1284 }
1285 sync_manager_->Init(sync_data_folder_path_, 1165 sync_manager_->Init(sync_data_folder_path_,
1286 options.event_handler, 1166 options.event_handler,
1287 options.service_url.host() + options.service_url.path(), 1167 options.service_url.host() + options.service_url.path(),
1288 options.service_url.EffectiveIntPort(), 1168 options.service_url.EffectiveIntPort(),
1289 options.service_url.SchemeIsSecure(), 1169 options.service_url.SchemeIsSecure(),
1290 options.make_http_bridge_factory_fn.Run().Pass(), 1170 options.make_http_bridge_factory_fn.Run().Pass(),
1291 options.workers, 1171 options.workers,
1292 options.extensions_activity_monitor, 1172 options.extensions_activity_monitor,
1293 options.registrar /* as SyncManager::ChangeDelegate */, 1173 options.registrar /* as SyncManager::ChangeDelegate */,
1294 options.credentials, 1174 options.credentials,
1295 invalidator.Pass(), 1175 options.invalidator_client_id,
1296 options.invalidator_factory->GetInvalidatorClientId(),
1297 options.restored_key_for_bootstrapping, 1176 options.restored_key_for_bootstrapping,
1298 options.restored_keystore_key_for_bootstrapping, 1177 options.restored_keystore_key_for_bootstrapping,
1299 scoped_ptr<InternalComponentsFactory>( 1178 scoped_ptr<InternalComponentsFactory>(
1300 options.internal_components_factory), 1179 options.internal_components_factory),
1301 &encryptor_, 1180 &encryptor_,
1302 options.unrecoverable_error_handler, 1181 options.unrecoverable_error_handler,
1303 options.report_unrecoverable_error_function, 1182 options.report_unrecoverable_error_function,
1304 options.use_oauth2_token); 1183 options.use_oauth2_token);
1305 1184
1306 // |sync_manager_| may end up being NULL here in tests (in 1185 // |sync_manager_| may end up being NULL here in tests (in
1307 // synchronous initialization mode). 1186 // synchronous initialization mode).
1308 // 1187 //
1309 // TODO(akalin): Fix this behavior (see http://crbug.com/140354). 1188 // TODO(akalin): Fix this behavior (see http://crbug.com/140354).
1310 if (sync_manager_) { 1189 if (sync_manager_) {
1311 sync_manager_->RegisterInvalidationHandler(this);
1312 registered_as_invalidation_handler_ = true;
1313
1314 // Now check the command line to see if we need to simulate an 1190 // Now check the command line to see if we need to simulate an
1315 // unrecoverable error for testing purpose. Note the error is thrown 1191 // unrecoverable error for testing purpose. Note the error is thrown
1316 // only if the initialization succeeded. Also it makes sense to use this 1192 // only if the initialization succeeded. Also it makes sense to use this
1317 // flag only when restarting the browser with an account already setup. If 1193 // flag only when restarting the browser with an account already setup. If
1318 // you use this before setting up the setup would not succeed as an error 1194 // you use this before setting up the setup would not succeed as an error
1319 // would be encountered. 1195 // would be encountered.
1320 if (CommandLine::ForCurrentProcess()->HasSwitch( 1196 if (CommandLine::ForCurrentProcess()->HasSwitch(
1321 switches::kSyncThrowUnrecoverableError)) { 1197 switches::kSyncThrowUnrecoverableError)) {
1322 sync_manager_->ThrowUnrecoverableError(); 1198 sync_manager_->ThrowUnrecoverableError();
1323 } 1199 }
1324 } 1200 }
1325 } 1201 }
1326 1202
1327 void SyncBackendHost::Core::DoUpdateCredentials( 1203 void SyncBackendHost::Core::DoUpdateCredentials(
1328 const SyncCredentials& credentials) { 1204 const SyncCredentials& credentials) {
1329 DCHECK_EQ(base::MessageLoop::current(), sync_loop_); 1205 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
1330 // UpdateCredentials can be called during backend initialization, possibly 1206 // UpdateCredentials can be called during backend initialization, possibly
1331 // when backend initialization has failed but hasn't notified the UI thread 1207 // when backend initialization has failed but hasn't notified the UI thread
1332 // yet. In that case, the sync manager may have been destroyed on the sync 1208 // yet. In that case, the sync manager may have been destroyed on the sync
1333 // thread before this task was executed, so we do nothing. 1209 // thread before this task was executed, so we do nothing.
1334 if (sync_manager_) { 1210 if (sync_manager_) {
1335 sync_manager_->UpdateCredentials(credentials); 1211 sync_manager_->UpdateCredentials(credentials);
1336 } 1212 }
1337 } 1213 }
1338 1214
1339 void SyncBackendHost::Core::DoUpdateRegisteredInvalidationIds(
1340 const syncer::ObjectIdSet& ids) {
1341 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
1342 // |sync_manager_| may end up being NULL here in tests (in
1343 // synchronous initialization mode) since this is called during
1344 // shutdown.
1345 //
1346 // TODO(akalin): Fix this behavior (see http://crbug.com/140354).
1347 if (sync_manager_) {
1348 sync_manager_->UpdateRegisteredInvalidationIds(this, ids);
1349 }
1350 }
1351
1352 void SyncBackendHost::Core::DoAcknowledgeInvalidation(
1353 const invalidation::ObjectId& id, const syncer::AckHandle& ack_handle) {
1354 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
1355 // |sync_manager_| may end up being NULL here in tests (in
1356 // synchronous initialization mode).
1357 //
1358 // TODO(akalin): Fix this behavior (see http://crbug.com/140354).
1359 if (sync_manager_) {
1360 sync_manager_->AcknowledgeInvalidation(id, ack_handle);
1361 }
1362 }
1363
1364 void SyncBackendHost::Core::DoStartSyncing( 1215 void SyncBackendHost::Core::DoStartSyncing(
1365 const syncer::ModelSafeRoutingInfo& routing_info) { 1216 const syncer::ModelSafeRoutingInfo& routing_info) {
1366 DCHECK_EQ(base::MessageLoop::current(), sync_loop_); 1217 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
1367 sync_manager_->StartSyncingNormally(routing_info); 1218 sync_manager_->StartSyncingNormally(routing_info);
1368 } 1219 }
1369 1220
1370 void SyncBackendHost::Core::DoSetEncryptionPassphrase( 1221 void SyncBackendHost::Core::DoSetEncryptionPassphrase(
1371 const std::string& passphrase, 1222 const std::string& passphrase,
1372 bool is_explicit) { 1223 bool is_explicit) {
1373 DCHECK_EQ(base::MessageLoop::current(), sync_loop_); 1224 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1463 1314
1464 sync_loop_ = NULL; 1315 sync_loop_ = NULL;
1465 1316
1466 host_.Reset(); 1317 host_.Reset();
1467 } 1318 }
1468 1319
1469 void SyncBackendHost::Core::DoDestroySyncManager() { 1320 void SyncBackendHost::Core::DoDestroySyncManager() {
1470 DCHECK_EQ(base::MessageLoop::current(), sync_loop_); 1321 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
1471 if (sync_manager_) { 1322 if (sync_manager_) {
1472 save_changes_timer_.reset(); 1323 save_changes_timer_.reset();
1473 if (registered_as_invalidation_handler_) {
1474 sync_manager_->UnregisterInvalidationHandler(this);
1475 registered_as_invalidation_handler_ = false;
1476 }
1477 sync_manager_->RemoveObserver(this); 1324 sync_manager_->RemoveObserver(this);
1478 sync_manager_->ShutdownOnSyncThread(); 1325 sync_manager_->ShutdownOnSyncThread();
1479 sync_manager_.reset(); 1326 sync_manager_.reset();
1480 } 1327 }
1481 } 1328 }
1482 1329
1483 void SyncBackendHost::Core::DoConfigureSyncer( 1330 void SyncBackendHost::Core::DoConfigureSyncer(
1484 syncer::ConfigureReason reason, 1331 syncer::ConfigureReason reason,
1485 const DoConfigureSyncerTypes& config_types, 1332 const DoConfigureSyncerTypes& config_types,
1486 const syncer::ModelSafeRoutingInfo routing_info, 1333 const syncer::ModelSafeRoutingInfo routing_info,
(...skipping 21 matching lines...) Expand all
1508 syncer::ModelTypeSet types_to_config, 1355 syncer::ModelTypeSet types_to_config,
1509 const base::Callback<void(syncer::ModelTypeSet, 1356 const base::Callback<void(syncer::ModelTypeSet,
1510 syncer::ModelTypeSet)>& ready_task) { 1357 syncer::ModelTypeSet)>& ready_task) {
1511 DCHECK_EQ(base::MessageLoop::current(), sync_loop_); 1358 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
1512 1359
1513 // Update the enabled types for the bridge and sync manager. 1360 // Update the enabled types for the bridge and sync manager.
1514 syncer::ModelSafeRoutingInfo routing_info; 1361 syncer::ModelSafeRoutingInfo routing_info;
1515 registrar_->GetModelSafeRoutingInfo(&routing_info); 1362 registrar_->GetModelSafeRoutingInfo(&routing_info);
1516 syncer::ModelTypeSet enabled_types = GetRoutingInfoTypes(routing_info); 1363 syncer::ModelTypeSet enabled_types = GetRoutingInfoTypes(routing_info);
1517 enabled_types.RemoveAll(syncer::ProxyTypes()); 1364 enabled_types.RemoveAll(syncer::ProxyTypes());
1518 sync_manager_->UpdateEnabledTypes(enabled_types);
1519 1365
1520 const syncer::ModelTypeSet failed_configuration_types = 1366 const syncer::ModelTypeSet failed_configuration_types =
1521 Difference(types_to_config, sync_manager_->InitialSyncEndedTypes()); 1367 Difference(types_to_config, sync_manager_->InitialSyncEndedTypes());
1522 const syncer::ModelTypeSet succeeded_configuration_types = 1368 const syncer::ModelTypeSet succeeded_configuration_types =
1523 Difference(types_to_config, failed_configuration_types); 1369 Difference(types_to_config, failed_configuration_types);
1524 host_.Call(FROM_HERE, 1370 host_.Call(FROM_HERE,
1525 &SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop, 1371 &SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop,
1526 succeeded_configuration_types, failed_configuration_types, 1372 enabled_types,
1373 succeeded_configuration_types,
1374 failed_configuration_types,
1527 ready_task); 1375 ready_task);
1528 } 1376 }
1529 1377
1530 void SyncBackendHost::Core::DoRetryConfiguration( 1378 void SyncBackendHost::Core::DoRetryConfiguration(
1531 const base::Closure& retry_callback) { 1379 const base::Closure& retry_callback) {
1532 DCHECK_EQ(base::MessageLoop::current(), sync_loop_); 1380 DCHECK_EQ(base::MessageLoop::current(), sync_loop_);
1533 host_.Call(FROM_HERE, 1381 host_.Call(FROM_HERE,
1534 &SyncBackendHost::RetryConfigurationOnFrontendLoop, 1382 &SyncBackendHost::RetryConfigurationOnFrontendLoop,
1535 retry_callback); 1383 retry_callback);
1536 } 1384 }
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1646 } 1494 }
1647 1495
1648 void SyncBackendHost::HandleActionableErrorEventOnFrontendLoop( 1496 void SyncBackendHost::HandleActionableErrorEventOnFrontendLoop(
1649 const syncer::SyncProtocolError& sync_error) { 1497 const syncer::SyncProtocolError& sync_error) {
1650 if (!frontend_) 1498 if (!frontend_)
1651 return; 1499 return;
1652 DCHECK_EQ(base::MessageLoop::current(), frontend_loop_); 1500 DCHECK_EQ(base::MessageLoop::current(), frontend_loop_);
1653 frontend_->OnActionableError(sync_error); 1501 frontend_->OnActionableError(sync_error);
1654 } 1502 }
1655 1503
1656 void SyncBackendHost::HandleInvalidatorStateChangeOnFrontendLoop( 1504 void SyncBackendHost::OnInvalidatorStateChange(syncer::InvalidatorState state) {
1657 syncer::InvalidatorState state) { 1505 sync_thread_.message_loop()->PostTask(
1658 if (!frontend_) 1506 FROM_HERE,
1659 return; 1507 base::Bind(&SyncBackendHost::Core::DoOnInvalidatorStateChange,
1660 DCHECK_EQ(base::MessageLoop::current(), frontend_loop_); 1508 core_.get(),
1661 frontend_->OnInvalidatorStateChange(state); 1509 state));
1662 } 1510 }
1663 1511
1664 void SyncBackendHost::HandleIncomingInvalidationOnFrontendLoop( 1512 void SyncBackendHost::OnIncomingInvalidation(
1665 const syncer::ObjectIdInvalidationMap& invalidation_map) { 1513 const syncer::ObjectIdInvalidationMap& invalidation_map) {
1666 if (!frontend_) 1514 // TODO(dcheng): Acknowledge immediately for now. Fix this once the
1667 return; 1515 // invalidator doesn't repeatedly ping for unacknowledged invaliations, since
1668 DCHECK_EQ(base::MessageLoop::current(), frontend_loop_); 1516 // it conflicts with the sync scheduler's internal backoff algorithm.
1669 frontend_->OnIncomingInvalidation(invalidation_map); 1517 // See http://crbug.com/124149 for more information.
1518 for (syncer::ObjectIdInvalidationMap::const_iterator it =
1519 invalidation_map.begin(); it != invalidation_map.end(); ++it) {
1520 invalidator_->AcknowledgeInvalidation(it->first, it->second.ack_handle);
1521 }
1522
1523 sync_thread_.message_loop()->PostTask(
1524 FROM_HERE,
1525 base::Bind(&SyncBackendHost::Core::DoOnIncomingInvalidation,
1526 core_.get(),
1527 invalidation_map));
1670 } 1528 }
1671 1529
1672 bool SyncBackendHost::CheckPassphraseAgainstCachedPendingKeys( 1530 bool SyncBackendHost::CheckPassphraseAgainstCachedPendingKeys(
1673 const std::string& passphrase) const { 1531 const std::string& passphrase) const {
1674 DCHECK(cached_pending_keys_.has_blob()); 1532 DCHECK(cached_pending_keys_.has_blob());
1675 DCHECK(!passphrase.empty()); 1533 DCHECK(!passphrase.empty());
1676 syncer::Nigori nigori; 1534 syncer::Nigori nigori;
1677 nigori.InitByDerivation("localhost", "dummy", passphrase); 1535 nigori.InitByDerivation("localhost", "dummy", passphrase);
1678 std::string plaintext; 1536 std::string plaintext;
1679 bool result = nigori.Decrypt(cached_pending_keys_.blob(), &plaintext); 1537 bool result = nigori.Decrypt(cached_pending_keys_.blob(), &plaintext);
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1760 DVLOG(1) << "Connection status changed: " 1618 DVLOG(1) << "Connection status changed: "
1761 << syncer::ConnectionStatusToString(status); 1619 << syncer::ConnectionStatusToString(status);
1762 frontend_->OnConnectionStatusChange(status); 1620 frontend_->OnConnectionStatusChange(status);
1763 } 1621 }
1764 1622
1765 #undef SDVLOG 1623 #undef SDVLOG
1766 1624
1767 #undef SLOG 1625 #undef SLOG
1768 1626
1769 } // namespace browser_sync 1627 } // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/glue/sync_backend_host.h ('k') | chrome/browser/sync/glue/sync_backend_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698