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

Unified Diff: components/invalidation/gcm_network_channel.cc

Issue 348503002: Report InvalidatorState correctly from GCMNetworkChannel (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@GCM.ConnectionState
Patch Set: Rebase Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: components/invalidation/gcm_network_channel.cc
diff --git a/components/invalidation/gcm_network_channel.cc b/components/invalidation/gcm_network_channel.cc
index 43081b9fb934902531e62a2aa9821446578c1bff..fa16b9162b55da57bde9c85e7d7f8a97917f9881 100644
--- a/components/invalidation/gcm_network_channel.cc
+++ b/components/invalidation/gcm_network_channel.cc
@@ -107,6 +107,8 @@ GCMNetworkChannel::GCMNetworkChannel(
: request_context_getter_(request_context_getter),
delegate_(delegate.Pass()),
register_backoff_entry_(new net::BackoffEntry(&kRegisterBackoffPolicy)),
+ gcm_channel_online_(false),
+ http_channel_online_(false),
diagnostic_info_(this),
weak_factory_(this) {
net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
@@ -195,10 +197,8 @@ void GCMNetworkChannel::OnGetTokenComplete(
// sending message and at that time we'll retry requesting access token.
DVLOG(1) << "RequestAccessToken failed: " << error.ToString();
RecordOutgoingMessageStatus(ACCESS_TOKEN_FAILURE);
- // Message won't get sent because of connection failure. Let's retry once
- // connection is restored.
- if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED)
- NotifyStateChange(TRANSIENT_INVALIDATION_ERROR);
+ // Message won't get sent. Notify that http channel doesn't work.
+ UpdateHttpChannelState(false);
cached_message_.clear();
return;
}
@@ -243,12 +243,14 @@ void GCMNetworkChannel::OnURLFetchComplete(const net::URLFetcher* source) {
fetcher->GetResponseCode() != net::HTTP_NO_CONTENT)) {
DVLOG(1) << "URLFetcher failure";
RecordOutgoingMessageStatus(POST_FAILURE);
- NotifyStateChange(TRANSIENT_INVALIDATION_ERROR);
+ // POST failed. Notify that http channel doesn't work.
+ UpdateHttpChannelState(false);
return;
}
RecordOutgoingMessageStatus(OUTGOING_MESSAGE_SUCCESS);
- NotifyStateChange(INVALIDATIONS_ENABLED);
+ // Successfully sent message. Http channel works.
+ UpdateHttpChannelState(true);
DVLOG(2) << "URLFetcher success";
}
@@ -277,6 +279,7 @@ void GCMNetworkChannel::OnIncomingMessage(const std::string& message,
}
DVLOG(2) << "Deliver incoming message";
RecordIncomingMessageStatus(INCOMING_MESSAGE_SUCCESS);
+ UpdateGcmChannelState(true);
DeliverIncomingMessage(android_message.message());
#else
// This code shouldn't be invoked on Android.
@@ -284,30 +287,36 @@ void GCMNetworkChannel::OnIncomingMessage(const std::string& message,
#endif
}
-void GCMNetworkChannel::OnConnectionStateChanged(
- GCMNetworkChannelDelegate::ConnectionState connection_state) {
- switch (connection_state) {
- case GCMNetworkChannelDelegate::CONNECTION_STATE_OFFLINE: {
- NotifyStateChange(TRANSIENT_INVALIDATION_ERROR);
- break;
- }
- case GCMNetworkChannelDelegate::CONNECTION_STATE_ONLINE: {
- NotifyStateChange(INVALIDATIONS_ENABLED);
- break;
- }
- default: {
- NOTREACHED();
- break;
- }
- }
+void GCMNetworkChannel::OnConnectionStateChanged(bool online) {
+ UpdateGcmChannelState(online);
}
void GCMNetworkChannel::OnNetworkChanged(
net::NetworkChangeNotifier::ConnectionType connection_type) {
// Network connection is restored. Let's notify cacheinvalidations so it has
// chance to retry.
- if (connection_type != net::NetworkChangeNotifier::CONNECTION_NONE)
- NotifyStateChange(INVALIDATIONS_ENABLED);
+ NotifyNetworkStatusChange(
+ connection_type != net::NetworkChangeNotifier::CONNECTION_NONE);
+}
+
+void GCMNetworkChannel::UpdateGcmChannelState(bool online) {
+ if (gcm_channel_online_ == online)
+ return;
+ gcm_channel_online_ = online;
+ InvalidatorState channel_state = TRANSIENT_INVALIDATION_ERROR;
+ if (gcm_channel_online_ && http_channel_online_)
+ channel_state = INVALIDATIONS_ENABLED;
+ NotifyChannelStateChange(channel_state);
+}
+
+void GCMNetworkChannel::UpdateHttpChannelState(bool online) {
+ if (http_channel_online_ == online)
+ return;
+ http_channel_online_ = online;
+ InvalidatorState channel_state = TRANSIENT_INVALIDATION_ERROR;
+ if (gcm_channel_online_ && http_channel_online_)
+ channel_state = INVALIDATIONS_ENABLED;
+ NotifyChannelStateChange(channel_state);
}
GURL GCMNetworkChannel::BuildUrl(const std::string& registration_id) {

Powered by Google App Engine
This is Rietveld 408576698