summaryrefslogtreecommitdiffstats
path: root/sync/internal_api
diff options
context:
space:
mode:
authorakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-18 20:50:28 +0000
committerakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-18 20:50:28 +0000
commit2d3d1d19828e0ad8ef5218a2cd7967079e13a1c8 (patch)
tree1469346ebe8cd33fe3c98aba590b53e6e90fb0ee /sync/internal_api
parente341fb8781ffac9f1a6e166a2b304137508f58ff (diff)
downloadchromium_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.h2
-rw-r--r--sync/internal_api/public/sync_manager.h5
-rw-r--r--sync/internal_api/sync_manager.cc66
-rw-r--r--sync/internal_api/syncapi_unittest.cc15
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 = &notification_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 = &notification_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();