summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorzelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-18 17:34:42 +0000
committerzelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-18 17:34:42 +0000
commit7a020b793e052c064b0a31596a57c9fcce24e138 (patch)
tree7e23ef2668a68d0bac6417c459cba58f663b4f46 /chrome
parente0bf967257cbc3334f6709b56ae24ee0e1ebc5f9 (diff)
downloadchromium_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.cc10
-rw-r--r--chrome/browser/chromeos/net/network_change_notifier_chromeos.cc88
-rw-r--r--chrome/browser/chromeos/net/network_change_notifier_chromeos.h54
-rw-r--r--chrome/chrome_browser.gypi2
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',