diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-18 20:50:28 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-18 20:50:28 +0000 |
commit | 2d3d1d19828e0ad8ef5218a2cd7967079e13a1c8 (patch) | |
tree | 1469346ebe8cd33fe3c98aba590b53e6e90fb0ee /sync/internal_api | |
parent | e341fb8781ffac9f1a6e166a2b304137508f58ff (diff) | |
download | chromium_src-2d3d1d19828e0ad8ef5218a2cd7967079e13a1c8.zip chromium_src-2d3d1d19828e0ad8ef5218a2cd7967079e13a1c8.tar.gz chromium_src-2d3d1d19828e0ad8ef5218a2cd7967079e13a1c8.tar.bz2 |
[Sync] Propagate XMPP auth errors to SyncNotifierObservers
Detect XMPP auth errors and add new notifications to SingleLoginAttempt
and Login.
Replace PushClientObserver::OnNotificationStateChange with
OnNotifications{Enabled,Disabled} notifications.
Change SyncNotifierObserver similarly.
Handle InvalidationClient errors and propagate auth errors from that,
too.
Propagate XMPP auth errors all the way up to SyncManager. It will be
handled in a future CL.
BUG=38091
TEST=
Review URL: https://chromiumcodereview.appspot.com/10545170
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142806 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sync/internal_api')
-rw-r--r-- | sync/internal_api/public/engine/sync_status.h | 2 | ||||
-rw-r--r-- | sync/internal_api/public/sync_manager.h | 5 | ||||
-rw-r--r-- | sync/internal_api/sync_manager.cc | 66 | ||||
-rw-r--r-- | sync/internal_api/syncapi_unittest.cc | 15 |
4 files changed, 60 insertions, 28 deletions
diff --git a/sync/internal_api/public/engine/sync_status.h b/sync/internal_api/public/engine/sync_status.h index 1c9ba1a..f05a5bc 100644 --- a/sync/internal_api/public/engine/sync_status.h +++ b/sync/internal_api/public/engine/sync_status.h @@ -22,6 +22,8 @@ struct SyncStatus { SyncStatus(); ~SyncStatus(); + // TODO(akalin): Replace this with a NotificationsDisabledReason + // variable. bool notifications_enabled; // True only if subscribed for notifications. // Notifications counters updated by the actions in synapi. diff --git a/sync/internal_api/public/sync_manager.h b/sync/internal_api/public/sync_manager.h index f4a42e3..a03e2d7 100644 --- a/sync/internal_api/public/sync_manager.h +++ b/sync/internal_api/public/sync_manager.h @@ -532,8 +532,9 @@ class SyncManager { // Functions used for testing. - void TriggerOnNotificationStateChangeForTest( - bool notifications_enabled); + void SimulateEnableNotificationsForTest(); + + void SimulateDisableNotificationsForTest(int reason); void TriggerOnIncomingNotificationForTest( syncable::ModelTypeSet model_types); diff --git a/sync/internal_api/sync_manager.cc b/sync/internal_api/sync_manager.cc index 8c95292..52a9c76 100644 --- a/sync/internal_api/sync_manager.cc +++ b/sync/internal_api/sync_manager.cc @@ -46,6 +46,7 @@ #include "sync/js/js_event_details.h" #include "sync/js/js_event_handler.h" #include "sync/js/js_reply_handler.h" +#include "sync/notifier/notifications_disabled_reason.h" #include "sync/notifier/sync_notifier.h" #include "sync/notifier/sync_notifier_observer.h" #include "sync/protocol/encryption.pb.h" @@ -321,9 +322,9 @@ class SyncManager::SyncInternal bool encrypt_everything) OVERRIDE; // SyncNotifierObserver implementation. - virtual void OnNotificationStateChange( - bool notifications_enabled) OVERRIDE; - + virtual void OnNotificationsEnabled() OVERRIDE; + virtual void OnNotificationsDisabled( + sync_notifier::NotificationsDisabledReason reason) OVERRIDE; virtual void OnIncomingNotification( const syncable::ModelTypePayloadMap& type_payloads, sync_notifier::IncomingNotificationSource source) OVERRIDE; @@ -2274,17 +2275,27 @@ void SyncManager::SyncInternal::OnEncryptedTypesChanged( OnEncryptedTypesChanged(encrypted_types, encrypt_everything)); } -void SyncManager::SyncInternal::OnNotificationStateChange( - bool notifications_enabled) { - DVLOG(1) << "P2P: Notifications enabled = " - << (notifications_enabled ? "true" : "false"); - allstatus_.SetNotificationsEnabled(notifications_enabled); +void SyncManager::SyncInternal::UpdateNotificationInfo( + const syncable::ModelTypePayloadMap& type_payloads) { + for (syncable::ModelTypePayloadMap::const_iterator it = type_payloads.begin(); + it != type_payloads.end(); ++it) { + NotificationInfo* info = ¬ification_info_map_[it->first]; + info->total_count++; + info->payload = it->second; + } +} + +void SyncManager::SyncInternal::OnNotificationsEnabled() { + DVLOG(1) << "Notifications enabled"; + allstatus_.SetNotificationsEnabled(true); if (scheduler()) { - scheduler()->set_notifications_enabled(notifications_enabled); + scheduler()->set_notifications_enabled(true); } + // TODO(akalin): Separate onNotificationStateChange into + // enabled/disabled events. if (js_event_handler_.IsInitialized()) { DictionaryValue details; - details.Set("enabled", Value::CreateBooleanValue(notifications_enabled)); + details.Set("enabled", Value::CreateBooleanValue(true)); js_event_handler_.Call(FROM_HERE, &JsEventHandler::HandleJsEvent, "onNotificationStateChange", @@ -2292,14 +2303,24 @@ void SyncManager::SyncInternal::OnNotificationStateChange( } } -void SyncManager::SyncInternal::UpdateNotificationInfo( - const syncable::ModelTypePayloadMap& type_payloads) { - for (syncable::ModelTypePayloadMap::const_iterator it = type_payloads.begin(); - it != type_payloads.end(); ++it) { - NotificationInfo* info = ¬ification_info_map_[it->first]; - info->total_count++; - info->payload = it->second; +void SyncManager::SyncInternal::OnNotificationsDisabled( + sync_notifier::NotificationsDisabledReason reason) { + DVLOG(1) << "Notifications disabled with reason " + << sync_notifier::NotificationsDisabledReasonToString(reason); + allstatus_.SetNotificationsEnabled(false); + if (scheduler()) { + scheduler()->set_notifications_enabled(false); + } + if (js_event_handler_.IsInitialized()) { + DictionaryValue details; + details.Set("enabled", Value::CreateBooleanValue(false)); + js_event_handler_.Call(FROM_HERE, + &JsEventHandler::HandleJsEvent, + "onNotificationStateChange", + JsEventDetails(&details)); } + // TODO(akalin): Treat a CREDENTIALS_REJECTED state as an auth + // error. } void SyncManager::SyncInternal::OnIncomingNotification( @@ -2422,10 +2443,15 @@ bool SyncManager::HasUnsyncedItems() const { return (trans.GetWrappedTrans()->directory()->unsynced_entity_count() != 0); } -void SyncManager::TriggerOnNotificationStateChangeForTest( - bool notifications_enabled) { +void SyncManager::SimulateEnableNotificationsForTest() { + DCHECK(thread_checker_.CalledOnValidThread()); + data_->OnNotificationsEnabled(); +} + +void SyncManager::SimulateDisableNotificationsForTest(int reason) { DCHECK(thread_checker_.CalledOnValidThread()); - data_->OnNotificationStateChange(notifications_enabled); + data_->OnNotificationsDisabled( + static_cast<sync_notifier::NotificationsDisabledReason>(reason)); } void SyncManager::TriggerOnIncomingNotificationForTest( diff --git a/sync/internal_api/syncapi_unittest.cc b/sync/internal_api/syncapi_unittest.cc index 1f1079c..460ee92 100644 --- a/sync/internal_api/syncapi_unittest.cc +++ b/sync/internal_api/syncapi_unittest.cc @@ -1275,16 +1275,19 @@ TEST_F(SyncManagerTest, OnNotificationStateChange) { HandleJsEvent("onNotificationStateChange", HasDetailsAsDictionary(false_details))); - sync_manager_.TriggerOnNotificationStateChangeForTest(true); - sync_manager_.TriggerOnNotificationStateChangeForTest(false); + sync_manager_.SimulateEnableNotificationsForTest(); + sync_manager_.SimulateDisableNotificationsForTest( + sync_notifier::TRANSIENT_NOTIFICATION_ERROR); SetJsEventHandler(event_handler.AsWeakHandle()); - sync_manager_.TriggerOnNotificationStateChangeForTest(true); - sync_manager_.TriggerOnNotificationStateChangeForTest(false); + sync_manager_.SimulateEnableNotificationsForTest(); + sync_manager_.SimulateDisableNotificationsForTest( + sync_notifier::TRANSIENT_NOTIFICATION_ERROR); SetJsEventHandler(WeakHandle<JsEventHandler>()); - sync_manager_.TriggerOnNotificationStateChangeForTest(true); - sync_manager_.TriggerOnNotificationStateChangeForTest(false); + sync_manager_.SimulateEnableNotificationsForTest(); + sync_manager_.SimulateDisableNotificationsForTest( + sync_notifier::TRANSIENT_NOTIFICATION_ERROR); // Should trigger the replies. PumpLoop(); |