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

Unified Diff: net/base/network_change_notifier.h

Issue 11360108: Start calculating new combined NetworkChangeNotifier signal (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Switch to default argument constructor Created 8 years 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
« no previous file with comments | « net/base/net_log_event_type_list.h ('k') | net/base/network_change_notifier.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/network_change_notifier.h
diff --git a/net/base/network_change_notifier.h b/net/base/network_change_notifier.h
index 84e399ee6c28162d53fc49695e1c51109b09a5a8..fe8d091a6e35edce51c25bed30e79b85823fba93 100644
--- a/net/base/network_change_notifier.h
+++ b/net/base/network_change_notifier.h
@@ -7,6 +7,7 @@
#include "base/basictypes.h"
#include "base/observer_list_threadsafe.h"
+#include "base/time.h"
#include "net/base/net_export.h"
class GURL;
@@ -86,6 +87,43 @@ class NET_EXPORT NetworkChangeNotifier {
DISALLOW_COPY_AND_ASSIGN(DNSObserver);
};
+ class NET_EXPORT NetworkChangeObserver {
+ public:
+ // OnNetworkChanged will be called when a change occurs to the host
+ // computer's hardware or software that affects the route network packets
+ // take to any network server. Some examples:
+ // 1. A network connection becoming available or going away. For example
+ // plugging or unplugging an Ethernet cable, WiFi or cellular modem
+ // connecting or disconnecting from a network, or a VPN tunnel being
+ // established or taken down.
+ // 2. An active network connection's IP address changes.
+ // 3. A change to the local IP routing tables.
+ // The signal shall only be produced when the change is complete. For
+ // example if a new network connection has become available, only give the
+ // signal once we think the O/S has finished establishing the connection
+ // (i.e. DHCP is done) to the point where the new connection is usable.
+ // The signal shall not be produced spuriously as it will be triggering some
+ // expensive operations, like socket pools closing all connections and
+ // sockets and then re-establishing them.
+ // |type| indicates the type of the active primary network connection after
+ // the change. Observers performing "constructive" activities like trying
+ // to establish a connection to a server should only do so when
+ // |type != CONNECTION_NONE|. Observers performing "destructive" activities
+ // like resetting already established server connections should only do so
+ // when |type == CONNECTION_NONE|. OnNetworkChanged will always be called
+ // with CONNECTION_NONE immediately prior to being called with an online
+ // state; this is done to make sure that destructive actions take place
+ // prior to constructive actions.
+ virtual void OnNetworkChanged(ConnectionType type) = 0;
+
+ protected:
+ NetworkChangeObserver() {}
+ virtual ~NetworkChangeObserver() {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(NetworkChangeObserver);
+ };
+
virtual ~NetworkChangeNotifier();
// See the description of NetworkChangeNotifier::GetConnectionType().
@@ -155,6 +193,7 @@ class NET_EXPORT NetworkChangeNotifier {
static void AddIPAddressObserver(IPAddressObserver* observer);
static void AddConnectionTypeObserver(ConnectionTypeObserver* observer);
static void AddDNSObserver(DNSObserver* observer);
+ static void AddNetworkChangeObserver(NetworkChangeObserver* observer);
// Unregisters |observer| from receiving notifications. This must be called
// on the same thread on which AddObserver() was called. Like AddObserver(),
@@ -166,6 +205,7 @@ class NET_EXPORT NetworkChangeNotifier {
static void RemoveIPAddressObserver(IPAddressObserver* observer);
static void RemoveConnectionTypeObserver(ConnectionTypeObserver* observer);
static void RemoveDNSObserver(DNSObserver* observer);
+ static void RemoveNetworkChangeObserver(NetworkChangeObserver* observer);
// Allow unit tests to trigger notifications.
static void NotifyObserversOfIPAddressChangeForTests() {
@@ -185,7 +225,31 @@ class NET_EXPORT NetworkChangeNotifier {
static void InitHistogramWatcher();
protected:
- NetworkChangeNotifier();
+ // NetworkChanged signal is calculated from the IPAddressChanged and
+ // ConnectionTypeChanged signals. Delay parameters control how long to delay
+ // producing NetworkChanged signal after particular input signals so as to
+ // combine duplicates. In other words if an input signal is repeated within
+ // the corresponding delay period, only one resulting NetworkChange signal is
+ // produced.
+ struct NET_EXPORT NetworkChangeCalculatorParams {
+ NetworkChangeCalculatorParams();
+ // Controls delay after OnIPAddressChanged when transitioning from an
+ // offline state.
+ base::TimeDelta ip_address_offline_delay_;
+ // Controls delay after OnIPAddressChanged when transitioning from an
+ // online state.
+ base::TimeDelta ip_address_online_delay_;
+ // Controls delay after OnConnectionTypeChanged when transitioning from an
+ // offline state.
+ base::TimeDelta connection_type_offline_delay_;
+ // Controls delay after OnConnectionTypeChanged when transitioning from an
+ // online state.
+ base::TimeDelta connection_type_online_delay_;
+ };
+
+ explicit NetworkChangeNotifier(
+ const NetworkChangeCalculatorParams& params =
+ NetworkChangeCalculatorParams());
#if defined(OS_LINUX)
// Returns the AddressTrackerLinux if present.
@@ -200,6 +264,7 @@ class NET_EXPORT NetworkChangeNotifier {
static void NotifyObserversOfIPAddressChange();
static void NotifyObserversOfConnectionTypeChange();
static void NotifyObserversOfDNSChange();
+ static void NotifyObserversOfNetworkChange(ConnectionType type);
// Stores |config| in NetworkState and notifies observers.
static void SetDnsConfig(const DnsConfig& config);
@@ -211,6 +276,7 @@ class NET_EXPORT NetworkChangeNotifier {
friend class NetworkChangeNotifierWinTest;
class NetworkState;
+ class NetworkChangeCalculator;
// Allows a second NetworkChangeNotifier to be created for unit testing, so
// the test suite can create a MockNetworkChangeNotifier, but platform
@@ -235,6 +301,8 @@ class NET_EXPORT NetworkChangeNotifier {
connection_type_observer_list_;
const scoped_refptr<ObserverListThreadSafe<DNSObserver> >
resolver_state_observer_list_;
+ const scoped_refptr<ObserverListThreadSafe<NetworkChangeObserver> >
+ network_change_observer_list_;
// The current network state. Hosts DnsConfig, exposed via GetDnsConfig.
scoped_ptr<NetworkState> network_state_;
@@ -242,6 +310,9 @@ class NET_EXPORT NetworkChangeNotifier {
// A little-piggy-back observer that simply logs UMA histogram data.
scoped_ptr<HistogramWatcher> histogram_watcher_;
+ // Computes NetworkChange signal from IPAddress and ConnectionType signals.
+ scoped_ptr<NetworkChangeCalculator> network_change_calculator_;
+
DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifier);
};
« no previous file with comments | « net/base/net_log_event_type_list.h ('k') | net/base/network_change_notifier.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698