OLD | NEW |
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 #ifndef NET_BASE_NETWORK_CHANGE_NOTIFIER_H_ | 5 #ifndef NET_BASE_NETWORK_CHANGE_NOTIFIER_H_ |
6 #define NET_BASE_NETWORK_CHANGE_NOTIFIER_H_ | 6 #define NET_BASE_NETWORK_CHANGE_NOTIFIER_H_ |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/observer_list_threadsafe.h" | 9 #include "base/observer_list_threadsafe.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 virtual void OnNetworkChanged(ConnectionType type) = 0; | 167 virtual void OnNetworkChanged(ConnectionType type) = 0; |
168 | 168 |
169 protected: | 169 protected: |
170 NetworkChangeObserver() {} | 170 NetworkChangeObserver() {} |
171 virtual ~NetworkChangeObserver() {} | 171 virtual ~NetworkChangeObserver() {} |
172 | 172 |
173 private: | 173 private: |
174 DISALLOW_COPY_AND_ASSIGN(NetworkChangeObserver); | 174 DISALLOW_COPY_AND_ASSIGN(NetworkChangeObserver); |
175 }; | 175 }; |
176 | 176 |
| 177 class NET_EXPORT MaxBandwidthObserver { |
| 178 public: |
| 179 // Will be called when a change occurs to the network's maximum bandwidth as |
| 180 // defined in http://w3c.github.io/netinfo/. Generally this will only be |
| 181 // called on bandwidth changing network connection/disconnection events. |
| 182 // Some platforms may call it more frequently, such as when WiFi signal |
| 183 // strength changes. |
| 184 // TODO(jkarlin): This is currently only implemented for Android. Implement |
| 185 // on every platform. |
| 186 virtual void OnMaxBandwidthChanged(double max_bandwidth_mbps) = 0; |
| 187 |
| 188 protected: |
| 189 MaxBandwidthObserver() {} |
| 190 virtual ~MaxBandwidthObserver() {} |
| 191 |
| 192 private: |
| 193 DISALLOW_COPY_AND_ASSIGN(MaxBandwidthObserver); |
| 194 }; |
| 195 |
177 virtual ~NetworkChangeNotifier(); | 196 virtual ~NetworkChangeNotifier(); |
178 | 197 |
179 // See the description of NetworkChangeNotifier::GetConnectionType(). | 198 // See the description of NetworkChangeNotifier::GetConnectionType(). |
180 // Implementations must be thread-safe. Implementations must also be | 199 // Implementations must be thread-safe. Implementations must also be |
181 // cheap as it is called often. | 200 // cheap as it is called often. |
182 virtual ConnectionType GetCurrentConnectionType() const = 0; | 201 virtual ConnectionType GetCurrentConnectionType() const = 0; |
183 | 202 |
184 // Replaces the default class factory instance of NetworkChangeNotifier class. | 203 // Replaces the default class factory instance of NetworkChangeNotifier class. |
185 // The method will take over the ownership of |factory| object. | 204 // The method will take over the ownership of |factory| object. |
186 static void SetFactory(NetworkChangeNotifierFactory* factory); | 205 static void SetFactory(NetworkChangeNotifierFactory* factory); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 | 264 |
246 // Registers |observer| to receive notifications of network changes. The | 265 // Registers |observer| to receive notifications of network changes. The |
247 // thread on which this is called is the thread on which |observer| will be | 266 // thread on which this is called is the thread on which |observer| will be |
248 // called back with notifications. This is safe to call if Create() has not | 267 // called back with notifications. This is safe to call if Create() has not |
249 // been called (as long as it doesn't race the Create() call on another | 268 // been called (as long as it doesn't race the Create() call on another |
250 // thread), in which case it will simply do nothing. | 269 // thread), in which case it will simply do nothing. |
251 static void AddIPAddressObserver(IPAddressObserver* observer); | 270 static void AddIPAddressObserver(IPAddressObserver* observer); |
252 static void AddConnectionTypeObserver(ConnectionTypeObserver* observer); | 271 static void AddConnectionTypeObserver(ConnectionTypeObserver* observer); |
253 static void AddDNSObserver(DNSObserver* observer); | 272 static void AddDNSObserver(DNSObserver* observer); |
254 static void AddNetworkChangeObserver(NetworkChangeObserver* observer); | 273 static void AddNetworkChangeObserver(NetworkChangeObserver* observer); |
| 274 static void AddMaxBandwidthObserver(MaxBandwidthObserver* observer); |
255 | 275 |
256 // Unregisters |observer| from receiving notifications. This must be called | 276 // Unregisters |observer| from receiving notifications. This must be called |
257 // on the same thread on which AddObserver() was called. Like AddObserver(), | 277 // on the same thread on which AddObserver() was called. Like AddObserver(), |
258 // this is safe to call if Create() has not been called (as long as it doesn't | 278 // this is safe to call if Create() has not been called (as long as it doesn't |
259 // race the Create() call on another thread), in which case it will simply do | 279 // race the Create() call on another thread), in which case it will simply do |
260 // nothing. Technically, it's also safe to call after the notifier object has | 280 // nothing. Technically, it's also safe to call after the notifier object has |
261 // been destroyed, if the call doesn't race the notifier's destruction, but | 281 // been destroyed, if the call doesn't race the notifier's destruction, but |
262 // there's no reason to use the API in this risky way, so don't do it. | 282 // there's no reason to use the API in this risky way, so don't do it. |
263 static void RemoveIPAddressObserver(IPAddressObserver* observer); | 283 static void RemoveIPAddressObserver(IPAddressObserver* observer); |
264 static void RemoveConnectionTypeObserver(ConnectionTypeObserver* observer); | 284 static void RemoveConnectionTypeObserver(ConnectionTypeObserver* observer); |
265 static void RemoveDNSObserver(DNSObserver* observer); | 285 static void RemoveDNSObserver(DNSObserver* observer); |
266 static void RemoveNetworkChangeObserver(NetworkChangeObserver* observer); | 286 static void RemoveNetworkChangeObserver(NetworkChangeObserver* observer); |
| 287 static void RemoveMaxBandwidthObserver(MaxBandwidthObserver* observer); |
267 | 288 |
268 // Allow unit tests to trigger notifications. | 289 // Allow unit tests to trigger notifications. |
269 static void NotifyObserversOfIPAddressChangeForTests(); | 290 static void NotifyObserversOfIPAddressChangeForTests(); |
270 static void NotifyObserversOfConnectionTypeChangeForTests( | 291 static void NotifyObserversOfConnectionTypeChangeForTests( |
271 ConnectionType type); | 292 ConnectionType type); |
272 static void NotifyObserversOfNetworkChangeForTests(ConnectionType type); | 293 static void NotifyObserversOfNetworkChangeForTests(ConnectionType type); |
273 | 294 |
274 // Enable or disable notifications from the host. After setting to true, be | 295 // Enable or disable notifications from the host. After setting to true, be |
275 // sure to pump the RunLoop until idle to finish any preexisting | 296 // sure to pump the RunLoop until idle to finish any preexisting |
276 // notifications. | 297 // notifications. |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 // the NetInfo spec: http://w3c.github.io/netinfo/. | 380 // the NetInfo spec: http://w3c.github.io/netinfo/. |
360 static double GetMaxBandwidthForConnectionSubtype(ConnectionSubtype subtype); | 381 static double GetMaxBandwidthForConnectionSubtype(ConnectionSubtype subtype); |
361 | 382 |
362 // Broadcasts a notification to all registered observers. Note that this | 383 // Broadcasts a notification to all registered observers. Note that this |
363 // happens asynchronously, even for observers on the current thread, even in | 384 // happens asynchronously, even for observers on the current thread, even in |
364 // tests. | 385 // tests. |
365 static void NotifyObserversOfIPAddressChange(); | 386 static void NotifyObserversOfIPAddressChange(); |
366 static void NotifyObserversOfConnectionTypeChange(); | 387 static void NotifyObserversOfConnectionTypeChange(); |
367 static void NotifyObserversOfDNSChange(); | 388 static void NotifyObserversOfDNSChange(); |
368 static void NotifyObserversOfNetworkChange(ConnectionType type); | 389 static void NotifyObserversOfNetworkChange(ConnectionType type); |
| 390 static void NotifyObserversOfMaxBandwidthChange(double max_bandwidth_mbps); |
369 | 391 |
370 // Stores |config| in NetworkState and notifies observers. | 392 // Stores |config| in NetworkState and notifies observers. |
371 static void SetDnsConfig(const DnsConfig& config); | 393 static void SetDnsConfig(const DnsConfig& config); |
372 | 394 |
373 private: | 395 private: |
374 friend class HostResolverImplDnsTest; | 396 friend class HostResolverImplDnsTest; |
375 friend class NetworkChangeNotifierAndroidTest; | 397 friend class NetworkChangeNotifierAndroidTest; |
376 friend class NetworkChangeNotifierLinuxTest; | 398 friend class NetworkChangeNotifierLinuxTest; |
377 friend class NetworkChangeNotifierWinTest; | 399 friend class NetworkChangeNotifierWinTest; |
378 | 400 |
379 class NetworkState; | 401 class NetworkState; |
380 class NetworkChangeCalculator; | 402 class NetworkChangeCalculator; |
381 | 403 |
382 void NotifyObserversOfIPAddressChangeImpl(); | 404 void NotifyObserversOfIPAddressChangeImpl(); |
383 void NotifyObserversOfConnectionTypeChangeImpl(ConnectionType type); | 405 void NotifyObserversOfConnectionTypeChangeImpl(ConnectionType type); |
384 void NotifyObserversOfDNSChangeImpl(); | 406 void NotifyObserversOfDNSChangeImpl(); |
385 void NotifyObserversOfNetworkChangeImpl(ConnectionType type); | 407 void NotifyObserversOfNetworkChangeImpl(ConnectionType type); |
| 408 void NotifyObserversOfMaxBandwidthChangeImpl(double max_bandwidth_mbps); |
386 | 409 |
387 const scoped_refptr<ObserverListThreadSafe<IPAddressObserver> > | 410 const scoped_refptr<ObserverListThreadSafe<IPAddressObserver>> |
388 ip_address_observer_list_; | 411 ip_address_observer_list_; |
389 const scoped_refptr<ObserverListThreadSafe<ConnectionTypeObserver> > | 412 const scoped_refptr<ObserverListThreadSafe<ConnectionTypeObserver>> |
390 connection_type_observer_list_; | 413 connection_type_observer_list_; |
391 const scoped_refptr<ObserverListThreadSafe<DNSObserver> > | 414 const scoped_refptr<ObserverListThreadSafe<DNSObserver>> |
392 resolver_state_observer_list_; | 415 resolver_state_observer_list_; |
393 const scoped_refptr<ObserverListThreadSafe<NetworkChangeObserver> > | 416 const scoped_refptr<ObserverListThreadSafe<NetworkChangeObserver>> |
394 network_change_observer_list_; | 417 network_change_observer_list_; |
| 418 const scoped_refptr<ObserverListThreadSafe<MaxBandwidthObserver>> |
| 419 max_bandwidth_observer_list_; |
395 | 420 |
396 // The current network state. Hosts DnsConfig, exposed via GetDnsConfig. | 421 // The current network state. Hosts DnsConfig, exposed via GetDnsConfig. |
397 scoped_ptr<NetworkState> network_state_; | 422 scoped_ptr<NetworkState> network_state_; |
398 | 423 |
399 // A little-piggy-back observer that simply logs UMA histogram data. | 424 // A little-piggy-back observer that simply logs UMA histogram data. |
400 scoped_ptr<HistogramWatcher> histogram_watcher_; | 425 scoped_ptr<HistogramWatcher> histogram_watcher_; |
401 | 426 |
402 // Computes NetworkChange signal from IPAddress and ConnectionType signals. | 427 // Computes NetworkChange signal from IPAddress and ConnectionType signals. |
403 scoped_ptr<NetworkChangeCalculator> network_change_calculator_; | 428 scoped_ptr<NetworkChangeCalculator> network_change_calculator_; |
404 | 429 |
405 // Set true to disable non-test notifications (to prevent flakes in tests). | 430 // Set true to disable non-test notifications (to prevent flakes in tests). |
406 bool test_notifications_only_; | 431 bool test_notifications_only_; |
407 | 432 |
408 DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifier); | 433 DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifier); |
409 }; | 434 }; |
410 | 435 |
411 } // namespace net | 436 } // namespace net |
412 | 437 |
413 #endif // NET_BASE_NETWORK_CHANGE_NOTIFIER_H_ | 438 #endif // NET_BASE_NETWORK_CHANGE_NOTIFIER_H_ |
OLD | NEW |