| 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 #include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" | 5 #include "chrome/browser/chromeos/net/network_change_notifier_network_library.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "chrome/browser/chromeos/cros/cros_library.h" | 10 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 11 #include "chromeos/dbus/dbus_thread_manager.h" | 11 #include "chromeos/dbus/dbus_thread_manager.h" |
| 12 #include "chromeos/dbus/root_power_manager_client.h" | 12 #include "chromeos/dbus/root_power_manager_client.h" |
| 13 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.h" |
| 14 #include "net/dns/dns_config_service_posix.h" | 14 #include "net/dns/dns_config_service_posix.h" |
| 15 | 15 |
| 16 using content::BrowserThread; | 16 using content::BrowserThread; |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 // Delay for online change notification reporting. | 20 // Delay for online change notification reporting. |
| 21 const int kOnlineNotificationDelayMS = 500; | 21 const int kOnlineNotificationDelayMS = 500; |
| 22 const int kInitialNotificationCheckDelayMS = 1000; | 22 const int kInitialNotificationCheckDelayMS = 1000; |
| 23 | 23 |
| 24 bool IsOnline(chromeos::ConnectionState state) { | 24 bool IsOnline(chromeos::ConnectionState state) { |
| 25 return state == chromeos::STATE_ONLINE || | 25 return state == chromeos::STATE_ONLINE || |
| 26 state == chromeos::STATE_PORTAL; | 26 state == chromeos::STATE_PORTAL; |
| 27 } | 27 } |
| 28 | 28 |
| 29 } | 29 } |
| 30 | 30 |
| 31 namespace chromeos { | 31 namespace chromeos { |
| 32 | 32 |
| 33 class NetworkChangeNotifierChromeos::DnsConfigServiceChromeos | 33 class NetworkChangeNotifierNetworkLibrary::DnsConfigServiceChromeos |
| 34 : public net::internal::DnsConfigServicePosix { | 34 : public net::internal::DnsConfigServicePosix { |
| 35 public: | 35 public: |
| 36 DnsConfigServiceChromeos() {} | 36 DnsConfigServiceChromeos() {} |
| 37 | 37 |
| 38 virtual ~DnsConfigServiceChromeos() {} | 38 virtual ~DnsConfigServiceChromeos() {} |
| 39 | 39 |
| 40 // net::DnsConfigServicePosix: | 40 // net::DnsConfigServicePosix: |
| 41 virtual bool StartWatching() OVERRIDE { | 41 virtual bool StartWatching() OVERRIDE { |
| 42 // Notifications from NetworkLibrary are sent to | 42 // Notifications from NetworkLibrary are sent to |
| 43 // NetworkChangeNotifierChromeos. | 43 // NetworkChangeNotifierNetworkLibrary. |
| 44 return true; | 44 return true; |
| 45 } | 45 } |
| 46 | 46 |
| 47 void OnNetworkChange() { | 47 void OnNetworkChange() { |
| 48 InvalidateConfig(); | 48 InvalidateConfig(); |
| 49 InvalidateHosts(); | 49 InvalidateHosts(); |
| 50 ReadNow(); | 50 ReadNow(); |
| 51 } | 51 } |
| 52 }; | 52 }; |
| 53 | 53 |
| 54 NetworkChangeNotifierChromeos::NetworkChangeNotifierChromeos() | 54 NetworkChangeNotifierNetworkLibrary::NetworkChangeNotifierNetworkLibrary() |
| 55 : NetworkChangeNotifier(NetworkChangeCalculatorParamsChromeos()), | 55 : NetworkChangeNotifier(NetworkChangeCalculatorParamsChromeos()), |
| 56 has_active_network_(false), | 56 has_active_network_(false), |
| 57 connection_state_(chromeos::STATE_UNKNOWN), | 57 connection_state_(chromeos::STATE_UNKNOWN), |
| 58 connection_type_(CONNECTION_NONE), | 58 connection_type_(CONNECTION_NONE), |
| 59 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { | 59 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { |
| 60 BrowserThread::PostDelayedTask( | 60 BrowserThread::PostDelayedTask( |
| 61 BrowserThread::UI, FROM_HERE, | 61 BrowserThread::UI, FROM_HERE, |
| 62 base::Bind( | 62 base::Bind( |
| 63 &NetworkChangeNotifierChromeos::UpdateInitialState, this), | 63 &NetworkChangeNotifierNetworkLibrary::UpdateInitialState, this), |
| 64 base::TimeDelta::FromMilliseconds(kInitialNotificationCheckDelayMS)); | 64 base::TimeDelta::FromMilliseconds(kInitialNotificationCheckDelayMS)); |
| 65 } | 65 } |
| 66 | 66 |
| 67 NetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() { | 67 NetworkChangeNotifierNetworkLibrary::~NetworkChangeNotifierNetworkLibrary() { |
| 68 } | 68 } |
| 69 | 69 |
| 70 void NetworkChangeNotifierChromeos::Init() { | 70 void NetworkChangeNotifierNetworkLibrary::Init() { |
| 71 chromeos::NetworkLibrary* network_library = | 71 chromeos::NetworkLibrary* network_library = |
| 72 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); | 72 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| 73 network_library->AddNetworkManagerObserver(this); | 73 network_library->AddNetworkManagerObserver(this); |
| 74 | 74 |
| 75 DBusThreadManager::Get()->GetRootPowerManagerClient()->AddObserver(this); | 75 DBusThreadManager::Get()->GetRootPowerManagerClient()->AddObserver(this); |
| 76 | 76 |
| 77 dns_config_service_.reset(new DnsConfigServiceChromeos()); | 77 dns_config_service_.reset(new DnsConfigServiceChromeos()); |
| 78 dns_config_service_->WatchConfig( | 78 dns_config_service_->WatchConfig( |
| 79 base::Bind(NetworkChangeNotifier::SetDnsConfig)); | 79 base::Bind(NetworkChangeNotifier::SetDnsConfig)); |
| 80 | 80 |
| 81 UpdateNetworkState(network_library); | 81 UpdateNetworkState(network_library); |
| 82 } | 82 } |
| 83 | 83 |
| 84 void NetworkChangeNotifierChromeos::Shutdown() { | 84 void NetworkChangeNotifierNetworkLibrary::Shutdown() { |
| 85 weak_factory_.InvalidateWeakPtrs(); | 85 weak_factory_.InvalidateWeakPtrs(); |
| 86 | 86 |
| 87 dns_config_service_.reset(); | 87 dns_config_service_.reset(); |
| 88 | 88 |
| 89 if (!chromeos::CrosLibrary::Get()) | 89 if (!chromeos::CrosLibrary::Get()) |
| 90 return; | 90 return; |
| 91 | 91 |
| 92 chromeos::NetworkLibrary* lib = | 92 chromeos::NetworkLibrary* lib = |
| 93 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); | 93 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| 94 lib->RemoveNetworkManagerObserver(this); | 94 lib->RemoveNetworkManagerObserver(this); |
| 95 lib->RemoveObserverForAllNetworks(this); | 95 lib->RemoveObserverForAllNetworks(this); |
| 96 | 96 |
| 97 DBusThreadManager::Get()->GetRootPowerManagerClient()->RemoveObserver(this); | 97 DBusThreadManager::Get()->GetRootPowerManagerClient()->RemoveObserver(this); |
| 98 } | 98 } |
| 99 | 99 |
| 100 void NetworkChangeNotifierChromeos::OnResume( | 100 void NetworkChangeNotifierNetworkLibrary::OnResume( |
| 101 const base::TimeDelta& sleep_duration) { | 101 const base::TimeDelta& sleep_duration) { |
| 102 // Force invalidation of various net resources on system resume. | 102 // Force invalidation of various net resources on system resume. |
| 103 BrowserThread::PostTask( | 103 BrowserThread::PostTask( |
| 104 BrowserThread::IO, FROM_HERE, | 104 BrowserThread::IO, FROM_HERE, |
| 105 base::Bind( | 105 base::Bind( |
| 106 &NetworkChangeNotifier::NotifyObserversOfIPAddressChange)); | 106 &NetworkChangeNotifier::NotifyObserversOfIPAddressChange)); |
| 107 } | 107 } |
| 108 | 108 |
| 109 | 109 |
| 110 void NetworkChangeNotifierChromeos::OnNetworkManagerChanged( | 110 void NetworkChangeNotifierNetworkLibrary::OnNetworkManagerChanged( |
| 111 chromeos::NetworkLibrary* cros) { | 111 chromeos::NetworkLibrary* cros) { |
| 112 UpdateNetworkState(cros); | 112 UpdateNetworkState(cros); |
| 113 } | 113 } |
| 114 | 114 |
| 115 net::NetworkChangeNotifier::ConnectionType | 115 net::NetworkChangeNotifier::ConnectionType |
| 116 NetworkChangeNotifierChromeos::GetCurrentConnectionType() const { | 116 NetworkChangeNotifierNetworkLibrary::GetCurrentConnectionType() const { |
| 117 return connection_type_; | 117 return connection_type_; |
| 118 } | 118 } |
| 119 | 119 |
| 120 void NetworkChangeNotifierChromeos::OnNetworkChanged( | 120 void NetworkChangeNotifierNetworkLibrary::OnNetworkChanged( |
| 121 chromeos::NetworkLibrary* cros, | 121 chromeos::NetworkLibrary* cros, |
| 122 const chromeos::Network* network) { | 122 const chromeos::Network* network) { |
| 123 CHECK(network); | 123 CHECK(network); |
| 124 | 124 |
| 125 // Active network changed? | 125 // Active network changed? |
| 126 if (network->service_path() != service_path_) | 126 if (network->service_path() != service_path_) |
| 127 UpdateNetworkState(cros); | 127 UpdateNetworkState(cros); |
| 128 else | 128 else |
| 129 UpdateConnectivityState(network); | 129 UpdateConnectivityState(network); |
| 130 } | 130 } |
| 131 | 131 |
| 132 void NetworkChangeNotifierChromeos::UpdateNetworkState( | 132 void NetworkChangeNotifierNetworkLibrary::UpdateNetworkState( |
| 133 chromeos::NetworkLibrary* lib) { | 133 chromeos::NetworkLibrary* lib) { |
| 134 const chromeos::Network* network = lib->active_network(); | 134 const chromeos::Network* network = lib->active_network(); |
| 135 if (network) { | 135 if (network) { |
| 136 lib->GetIPConfigs( | 136 lib->GetIPConfigs( |
| 137 network->device_path(), | 137 network->device_path(), |
| 138 chromeos::NetworkLibrary::FORMAT_COLON_SEPARATED_HEX, | 138 chromeos::NetworkLibrary::FORMAT_COLON_SEPARATED_HEX, |
| 139 base::Bind(&NetworkChangeNotifierChromeos::UpdateNetworkStateCallback, | 139 base::Bind( |
| 140 weak_factory_.GetWeakPtr(), | 140 &NetworkChangeNotifierNetworkLibrary::UpdateNetworkStateCallback, |
| 141 lib)); | 141 weak_factory_.GetWeakPtr(), |
| 142 lib)); |
| 142 } else { | 143 } else { |
| 143 // If we don't have a network, then we can't fetch ipconfigs, but we still | 144 // If we don't have a network, then we can't fetch ipconfigs, but we still |
| 144 // need to process state updates when we lose a network (i.e. when | 145 // need to process state updates when we lose a network (i.e. when |
| 145 // has_active_network_ is still set, but we don't have one anymore). | 146 // has_active_network_ is still set, but we don't have one anymore). |
| 146 NetworkIPConfigVector empty_ipconfigs; | 147 NetworkIPConfigVector empty_ipconfigs; |
| 147 UpdateNetworkStateCallback(lib, empty_ipconfigs, ""); | 148 UpdateNetworkStateCallback(lib, empty_ipconfigs, ""); |
| 148 } | 149 } |
| 149 } | 150 } |
| 150 | 151 |
| 151 void NetworkChangeNotifierChromeos::UpdateNetworkStateCallback( | 152 void NetworkChangeNotifierNetworkLibrary::UpdateNetworkStateCallback( |
| 152 chromeos::NetworkLibrary* lib, | 153 chromeos::NetworkLibrary* lib, |
| 153 const NetworkIPConfigVector& ipconfigs, | 154 const NetworkIPConfigVector& ipconfigs, |
| 154 const std::string& hardware_address) { | 155 const std::string& hardware_address) { |
| 155 const chromeos::Network* network = lib->active_network(); | 156 const chromeos::Network* network = lib->active_network(); |
| 156 | 157 |
| 157 if (network) { | 158 if (network) { |
| 158 VLOG(1) << "UpdateNetworkStateCallback: " << network->name() | 159 VLOG(1) << "UpdateNetworkStateCallback: " << network->name() |
| 159 << ", type= " << network->type() | 160 << ", type= " << network->type() |
| 160 << ", device= " << network->device_path() | 161 << ", device= " << network->device_path() |
| 161 << ", state= " << network->state(); | 162 << ", state= " << network->state(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 if (network) | 208 if (network) |
| 208 lib->AddNetworkObserver(network->service_path(), this); | 209 lib->AddNetworkObserver(network->service_path(), this); |
| 209 | 210 |
| 210 BrowserThread::PostTask( | 211 BrowserThread::PostTask( |
| 211 BrowserThread::IO, FROM_HERE, | 212 BrowserThread::IO, FROM_HERE, |
| 212 base::Bind( | 213 base::Bind( |
| 213 &NetworkChangeNotifier::NotifyObserversOfIPAddressChange)); | 214 &NetworkChangeNotifier::NotifyObserversOfIPAddressChange)); |
| 214 } | 215 } |
| 215 } | 216 } |
| 216 | 217 |
| 217 void NetworkChangeNotifierChromeos::UpdateConnectivityState( | 218 void NetworkChangeNotifierNetworkLibrary::UpdateConnectivityState( |
| 218 const chromeos::Network* network) { | 219 const chromeos::Network* network) { |
| 219 if (network) { | 220 if (network) { |
| 220 VLOG(1) << "UpdateConnectivityState: " << network->name() | 221 VLOG(1) << "UpdateConnectivityState: " << network->name() |
| 221 << ", type= " << network->type() | 222 << ", type= " << network->type() |
| 222 << ", device= " << network->device_path() | 223 << ", device= " << network->device_path() |
| 223 << ", state= " << network->state() | 224 << ", state= " << network->state() |
| 224 << ", connect= " << connection_state_ | 225 << ", connect= " << connection_state_ |
| 225 << ", type= " << connection_type_; | 226 << ", type= " << connection_type_; |
| 226 } | 227 } |
| 227 | 228 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 251 << ", new_connection_type = " << new_connection_type; | 252 << ", new_connection_type = " << new_connection_type; |
| 252 ReportConnectionChange(); | 253 ReportConnectionChange(); |
| 253 } | 254 } |
| 254 VLOG(2) << " UpdateConnectivityState4: " | 255 VLOG(2) << " UpdateConnectivityState4: " |
| 255 << "new_cs = " << new_connection_state | 256 << "new_cs = " << new_connection_state |
| 256 << ", end_cs_ = " << connection_state_ | 257 << ", end_cs_ = " << connection_state_ |
| 257 << "prev_type = " << prev_connection_type | 258 << "prev_type = " << prev_connection_type |
| 258 << ", new_type_ = " << new_connection_type; | 259 << ", new_type_ = " << new_connection_type; |
| 259 } | 260 } |
| 260 | 261 |
| 261 void NetworkChangeNotifierChromeos::ReportConnectionChange() { | 262 void NetworkChangeNotifierNetworkLibrary::ReportConnectionChange() { |
| 262 if (weak_factory_.HasWeakPtrs()) { | 263 if (weak_factory_.HasWeakPtrs()) { |
| 263 // If we have a pending task, cancel it. | 264 // If we have a pending task, cancel it. |
| 264 DVLOG(1) << "ReportConnectionChange: has pending task"; | 265 DVLOG(1) << "ReportConnectionChange: has pending task"; |
| 265 weak_factory_.InvalidateWeakPtrs(); | 266 weak_factory_.InvalidateWeakPtrs(); |
| 266 DVLOG(1) << "ReportConnectionChange: canceled pending task"; | 267 DVLOG(1) << "ReportConnectionChange: canceled pending task"; |
| 267 } | 268 } |
| 268 // Posting task with delay allows us to cancel it when connection type is | 269 // Posting task with delay allows us to cancel it when connection type is |
| 269 // changed frequently. This should help us avoid transient edge reporting | 270 // changed frequently. This should help us avoid transient edge reporting |
| 270 // while switching between connection types (e.g. ethernet->wifi). | 271 // while switching between connection types (e.g. ethernet->wifi). |
| 272 base::Closure task = base::Bind( |
| 273 &NetworkChangeNotifierNetworkLibrary::ReportConnectionChangeOnUIThread, |
| 274 weak_factory_.GetWeakPtr()); |
| 275 |
| 271 BrowserThread::PostDelayedTask( | 276 BrowserThread::PostDelayedTask( |
| 272 BrowserThread::UI, FROM_HERE, | 277 BrowserThread::UI, FROM_HERE, task, |
| 273 base::Bind( | |
| 274 &NetworkChangeNotifierChromeos::ReportConnectionChangeOnUIThread, | |
| 275 weak_factory_.GetWeakPtr()), | |
| 276 base::TimeDelta::FromMilliseconds(kOnlineNotificationDelayMS)); | 278 base::TimeDelta::FromMilliseconds(kOnlineNotificationDelayMS)); |
| 277 } | 279 } |
| 278 | 280 |
| 279 void NetworkChangeNotifierChromeos::ReportConnectionChangeOnUIThread() { | 281 void NetworkChangeNotifierNetworkLibrary::ReportConnectionChangeOnUIThread() { |
| 280 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 282 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 281 | 283 |
| 282 BrowserThread::PostTask( | 284 BrowserThread::PostTask( |
| 283 BrowserThread::IO, FROM_HERE, | 285 BrowserThread::IO, FROM_HERE, |
| 284 base::Bind( | 286 base::Bind( |
| 285 &NetworkChangeNotifierChromeos:: | 287 &NetworkChangeNotifierNetworkLibrary:: |
| 286 NotifyObserversOfConnectionTypeChange)); | 288 NotifyObserversOfConnectionTypeChange)); |
| 287 } | 289 } |
| 288 | 290 |
| 289 // static | 291 // static |
| 290 void NetworkChangeNotifierChromeos::UpdateInitialState( | 292 void NetworkChangeNotifierNetworkLibrary::UpdateInitialState( |
| 291 NetworkChangeNotifierChromeos* self) { | 293 NetworkChangeNotifierNetworkLibrary* self) { |
| 292 chromeos::NetworkLibrary* net = | 294 chromeos::NetworkLibrary* net = |
| 293 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); | 295 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| 294 self->UpdateNetworkState(net); | 296 self->UpdateNetworkState(net); |
| 295 } | 297 } |
| 296 | 298 |
| 297 // static | 299 // static |
| 298 net::NetworkChangeNotifier::ConnectionType | 300 net::NetworkChangeNotifier::ConnectionType |
| 299 NetworkChangeNotifierChromeos::GetNetworkConnectionType( | 301 NetworkChangeNotifierNetworkLibrary::GetNetworkConnectionType( |
| 300 const chromeos::Network* network) { | 302 const chromeos::Network* network) { |
| 301 if (!network || !IsOnline(network->connection_state())) | 303 if (!network || !IsOnline(network->connection_state())) |
| 302 return net::NetworkChangeNotifier::CONNECTION_NONE; | 304 return net::NetworkChangeNotifier::CONNECTION_NONE; |
| 303 | 305 |
| 304 switch (network->type()) { | 306 switch (network->type()) { |
| 305 case chromeos::TYPE_ETHERNET: | 307 case chromeos::TYPE_ETHERNET: |
| 306 return CONNECTION_ETHERNET; | 308 return CONNECTION_ETHERNET; |
| 307 case chromeos::TYPE_WIFI: | 309 case chromeos::TYPE_WIFI: |
| 308 return CONNECTION_WIFI; | 310 return CONNECTION_WIFI; |
| 309 case chromeos::TYPE_WIMAX: | 311 case chromeos::TYPE_WIMAX: |
| (...skipping 19 matching lines...) Expand all Loading... |
| 329 case chromeos::TYPE_BLUETOOTH: | 331 case chromeos::TYPE_BLUETOOTH: |
| 330 case chromeos::TYPE_VPN: | 332 case chromeos::TYPE_VPN: |
| 331 case chromeos::TYPE_UNKNOWN: | 333 case chromeos::TYPE_UNKNOWN: |
| 332 break; | 334 break; |
| 333 } | 335 } |
| 334 return net::NetworkChangeNotifier::CONNECTION_UNKNOWN; | 336 return net::NetworkChangeNotifier::CONNECTION_UNKNOWN; |
| 335 } | 337 } |
| 336 | 338 |
| 337 // static | 339 // static |
| 338 net::NetworkChangeNotifier::NetworkChangeCalculatorParams | 340 net::NetworkChangeNotifier::NetworkChangeCalculatorParams |
| 339 NetworkChangeNotifierChromeos::NetworkChangeCalculatorParamsChromeos() { | 341 NetworkChangeNotifierNetworkLibrary::NetworkChangeCalculatorParamsChromeos() { |
| 340 NetworkChangeCalculatorParams params; | 342 NetworkChangeCalculatorParams params; |
| 341 // Delay values arrived at by simple experimentation and adjusted so as to | 343 // Delay values arrived at by simple experimentation and adjusted so as to |
| 342 // produce a single signal when switching between network connections. | 344 // produce a single signal when switching between network connections. |
| 343 params.ip_address_offline_delay_ = base::TimeDelta::FromMilliseconds(4000); | 345 params.ip_address_offline_delay_ = base::TimeDelta::FromMilliseconds(4000); |
| 344 params.ip_address_online_delay_ = base::TimeDelta::FromMilliseconds(1000); | 346 params.ip_address_online_delay_ = base::TimeDelta::FromMilliseconds(1000); |
| 345 params.connection_type_offline_delay_ = base::TimeDelta::FromMilliseconds(0); | 347 params.connection_type_offline_delay_ = base::TimeDelta::FromMilliseconds(0); |
| 346 params.connection_type_online_delay_ = base::TimeDelta::FromMilliseconds(0); | 348 params.connection_type_online_delay_ = base::TimeDelta::FromMilliseconds(0); |
| 347 return params; | 349 return params; |
| 348 } | 350 } |
| 349 | 351 |
| 350 } // namespace chromeos | 352 } // namespace chromeos |
| OLD | NEW |