diff options
author | zelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-18 17:34:42 +0000 |
---|---|---|
committer | zelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-18 17:34:42 +0000 |
commit | 7a020b793e052c064b0a31596a57c9fcce24e138 (patch) | |
tree | 7e23ef2668a68d0bac6417c459cba58f663b4f46 /chrome | |
parent | e0bf967257cbc3334f6709b56ae24ee0e1ebc5f9 (diff) | |
download | chromium_src-7a020b793e052c064b0a31596a57c9fcce24e138.zip chromium_src-7a020b793e052c064b0a31596a57c9fcce24e138.tar.gz chromium_src-7a020b793e052c064b0a31596a57c9fcce24e138.tar.bz2 |
Added ChromeOS-specific NetworkChangeNotifier specialization that is wired directly to flimflam.
This implementation will help us detect more networking issues than the regular Linux version
that was based on netlink. In addition to service/ip changes, we can now raise network change
notification for connectivity changes (i.e. captive portal state changes).
BUG=chromium-os:15327
TEST=make sure SPDY and Proxy settings are properly invalidated once we resume ChromeOS session
Review URL: http://codereview.chromium.org/7029019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85779 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/browser_main.cc | 10 | ||||
-rw-r--r-- | chrome/browser/chromeos/net/network_change_notifier_chromeos.cc | 88 | ||||
-rw-r--r-- | chrome/browser/chromeos/net/network_change_notifier_chromeos.h | 54 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 |
4 files changed, 153 insertions, 1 deletions
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc index 7dcc31b..8d3bc37 100644 --- a/chrome/browser/browser_main.cc +++ b/chrome/browser/browser_main.cc @@ -142,6 +142,7 @@ #include "chrome/browser/chromeos/login/screen_locker.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/metrics_cros_settings_provider.h" +#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" #include "chrome/browser/chromeos/system_key_event_listener.h" #include "chrome/browser/chromeos/web_socket_proxy_controller.h" #include "chrome/browser/oom_priority_manager.h" @@ -529,8 +530,15 @@ void BrowserMainParts::MainMessageLoopStart() { // TODO(viettrungluu): should these really go before setting the thread name? system_monitor_.reset(new base::SystemMonitor); hi_res_timer_manager_.reset(new HighResolutionTimerManager); +#if defined(OS_CHROMEOS) + // TODO(zelidrag): We need to move cros library glue code outside of + // chrome/browser directory to avoid check_deps issues and then migrate + // NetworkChangeNotifierCros class to net/base where other OS implementations + // live. + network_change_notifier_.reset(new chromeos::NetworkChangeNotifierChromeos()); +#else network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); - +#endif InitializeMainThread(); PostMainMessageLoopStart(); diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc b/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc new file mode 100644 index 0000000..e099cf4 --- /dev/null +++ b/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc @@ -0,0 +1,88 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" + +#include "base/task.h" +#include "chrome/browser/chromeos/cros/cros_library.h" +#include "content/browser/browser_thread.h" + +namespace chromeos { + +NetworkChangeNotifierChromeos::NetworkChangeNotifierChromeos() + : has_active_network_(false), + connectivity_state_(chromeos::CONN_STATE_UNKNOWN), + ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { + + chromeos::NetworkLibrary* lib = + chromeos::CrosLibrary::Get()->GetNetworkLibrary(); + lib->AddNetworkManagerObserver(this); +} + +NetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() { + chromeos::NetworkLibrary* lib = + chromeos::CrosLibrary::Get()->GetNetworkLibrary(); + lib->RemoveNetworkManagerObserver(this); + lib->RemoveObserverForAllNetworks(this); +} + +void NetworkChangeNotifierChromeos::OnNetworkManagerChanged( + chromeos::NetworkLibrary* cros) { + UpdateNetworkState(cros); +} + +bool NetworkChangeNotifierChromeos::IsCurrentlyOffline() const { + return connectivity_state_ != chromeos::CONN_STATE_UNRESTRICTED; +} + +void NetworkChangeNotifierChromeos::UpdateNetworkState( + chromeos::NetworkLibrary* lib) { + const chromeos::Network* network = lib->active_network(); + + // Check if active network was added, removed or changed. + if ((!network && has_active_network_) || + (network && (!has_active_network_ || + network->service_path() != service_path_ || + network->ip_address() != ip_address_))) { + if (has_active_network_) + lib->RemoveObserverForAllNetworks(this); + if (!network) { + has_active_network_ = false; + service_path_.clear(); + ip_address_.clear(); + } else { + has_active_network_ = true; + service_path_ = network->service_path(); + lib->AddNetworkObserver(network->service_path(), this); + ip_address_ = network->ip_address(); + } + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + NewRunnableFunction( + &NetworkChangeNotifierChromeos::NotifyObserversOfIPAddressChange)); + } +} + +void NetworkChangeNotifierChromeos::OnNetworkChanged( + chromeos::NetworkLibrary* cros, + const chromeos::Network* network) { + if (!network) { + NOTREACHED(); + return; + } + // Active network changed? + if (network->service_path() != service_path_) { + UpdateNetworkState(cros); + return; + } + if (network->connectivity_state() != connectivity_state_) { + connectivity_state_ = network->connectivity_state(); + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + method_factory_.NewRunnableMethod( + &NetworkChangeNotifierChromeos::NotifyObserversOfOnlineStateChange)); + } +} + +} // namespace net diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.h b/chrome/browser/chromeos/net/network_change_notifier_chromeos.h new file mode 100644 index 0000000..850f9e6 --- /dev/null +++ b/chrome/browser/chromeos/net/network_change_notifier_chromeos.h @@ -0,0 +1,54 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_CHROMEOS_H_ +#define CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_CHROMEOS_H_ +#pragma once + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "chrome/browser/chromeos/cros/network_library.h" +#include "net/base/network_change_notifier.h" + +namespace chromeos { + +class NetworkChangeNotifierChromeos + : public net::NetworkChangeNotifier, + public chromeos::NetworkLibrary::NetworkManagerObserver, + public chromeos::NetworkLibrary::NetworkObserver { + public: + NetworkChangeNotifierChromeos(); + virtual ~NetworkChangeNotifierChromeos(); + + private: + // NetworkChangeNotifier overrides. + virtual bool IsCurrentlyOffline() const OVERRIDE; + + // NetworkManagerObserver overrides: + virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj) OVERRIDE; + + // NetworkObserver overrides: + virtual void OnNetworkChanged(chromeos::NetworkLibrary* cros, + const chromeos::Network* network) OVERRIDE; + + // Updates data members that keep the track the network stack state. + void UpdateNetworkState(chromeos::NetworkLibrary* cros); + + // True if we previously had an active network around. + bool has_active_network_; + // Current active network's connectivity state. + chromeos::ConnectivityState connectivity_state_; + // Current active network's service path. + std::string service_path_; + // Current active network's IP address. + std::string ip_address_; + + ScopedRunnableMethodFactory<NetworkChangeNotifierChromeos> method_factory_; + + DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifierChromeos); +}; + +} // namespace net + +#endif // CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_CHROMEOS_H_ diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 46413fd..a46f6c9 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -620,6 +620,8 @@ 'browser/chromeos/name_value_pairs_parser.h', 'browser/chromeos/native_dialog_window.cc', 'browser/chromeos/native_dialog_window.h', + 'browser/chromeos/net/network_change_notifier_chromeos.cc', + 'browser/chromeos/net/network_change_notifier_chromeos.h', 'browser/chromeos/network_login_observer.cc', 'browser/chromeos/network_login_observer.h', 'browser/chromeos/network_message_observer.cc', |