summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-19 23:58:34 +0000
committerzelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-19 23:58:34 +0000
commit04cc980aac8a75963f7a3f94727aa1d5f6fa8fb0 (patch)
treee77c46ce701494e76908e2b1411835d3dc9dee03
parent6f6a6ef15d6e158fee0a7fa3f60e6170f384f2f7 (diff)
downloadchromium_src-04cc980aac8a75963f7a3f94727aa1d5f6fa8fb0.zip
chromium_src-04cc980aac8a75963f7a3f94727aa1d5f6fa8fb0.tar.gz
chromium_src-04cc980aac8a75963f7a3f94727aa1d5f6fa8fb0.tar.bz2
Merge 85779 - 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 TBR=zelidrag@chromium.org Review URL: http://codereview.chromium.org/7047025 git-svn-id: svn://svn.chromium.org/chrome/branches/742/src@86017 0039d316-1c4b-4281-b951-d872f2087c98
-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 99543bf..d714743 100644
--- a/chrome/browser/browser_main.cc
+++ b/chrome/browser/browser_main.cc
@@ -145,6 +145,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/oom_priority_manager.h"
#include "chrome/browser/ui/views/browser_dialogs.h"
@@ -517,8 +518,15 @@ void BrowserMainParts::MainMessageLoopStart() {
// TODO(viettrungluu): should these really go before setting the thread name?
system_monitor_.reset(new ui::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 2dfd545..0c2530a 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',