summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
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',