From a89fc608f7161628208e45ccb283fb23c2bc3c96 Mon Sep 17 00:00:00 2001
From: "gauravsh@chromium.org"
 <gauravsh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>
Date: Tue, 11 Dec 2012 01:54:59 +0000
Subject: Rename NetworkChangeNotifierChromeos to
 NetworkChangeNotifierNetworkLibrary

We are eventually deprecating this version of the network change notifier
for Chrome OS in favor of a version that will use the new network state handler.

This lets us avoid file and class name conflicts with the new version.

BUG=chromium:162040
TEST=none


Review URL: https://chromiumcodereview.appspot.com/11488011

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172226 0039d316-1c4b-4281-b951-d872f2087c98
---
 .../chromeos/chrome_browser_main_chromeos.cc       |   2 +-
 .../net/cros_network_change_notifier_factory.cc    |   9 +-
 .../net/cros_network_change_notifier_factory.h     |   4 +-
 .../net/network_change_notifier_chromeos.cc        | 350 --------------------
 .../net/network_change_notifier_chromeos.h         | 109 -------
 .../net/network_change_notifier_network_library.cc | 352 +++++++++++++++++++++
 .../net/network_change_notifier_network_library.h  | 109 +++++++
 chrome/chrome_browser_chromeos.gypi                |   4 +-
 8 files changed, 471 insertions(+), 468 deletions(-)
 delete mode 100644 chrome/browser/chromeos/net/network_change_notifier_chromeos.cc
 delete mode 100644 chrome/browser/chromeos/net/network_change_notifier_chromeos.h
 create mode 100644 chrome/browser/chromeos/net/network_change_notifier_network_library.cc
 create mode 100644 chrome/browser/chromeos/net/network_change_notifier_network_library.h

(limited to 'chrome')

diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 6df5bd3..2a0ac03 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -45,7 +45,7 @@
 #include "chrome/browser/chromeos/memory/low_memory_observer.h"
 #include "chrome/browser/chromeos/memory/oom_priority_manager.h"
 #include "chrome/browser/chromeos/net/cros_network_change_notifier_factory.h"
-#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h"
+#include "chrome/browser/chromeos/net/network_change_notifier_network_library.h"
 #include "chrome/browser/chromeos/net/network_portal_detector.h"
 #include "chrome/browser/chromeos/power/brightness_observer.h"
 #include "chrome/browser/chromeos/power/output_observer.h"
diff --git a/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc
index 2f210da..6941f45 100644
--- a/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc
+++ b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc
@@ -3,24 +3,25 @@
 // found in the LICENSE file.
 #include "chrome/browser/chromeos/net/cros_network_change_notifier_factory.h"
 
-#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h"
+#include "chrome/browser/chromeos/net/network_change_notifier_network_library.h"
 
 namespace chromeos {
 
 namespace {
 
-NetworkChangeNotifierChromeos* g_network_change_notifier = NULL;
+NetworkChangeNotifierNetworkLibrary* g_network_change_notifier = NULL;
 
 }  // namespace
 
 net::NetworkChangeNotifier* CrosNetworkChangeNotifierFactory::CreateInstance() {
   DCHECK(!g_network_change_notifier);
-  g_network_change_notifier = new NetworkChangeNotifierChromeos();
+  g_network_change_notifier = new NetworkChangeNotifierNetworkLibrary();
   return g_network_change_notifier;
 }
 
 // static
-NetworkChangeNotifierChromeos* CrosNetworkChangeNotifierFactory::GetInstance() {
+NetworkChangeNotifierNetworkLibrary*
+CrosNetworkChangeNotifierFactory::GetInstance() {
   return g_network_change_notifier;
 }
 
diff --git a/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h
index 440fc2a..b51d46f5 100644
--- a/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h
+++ b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h
@@ -10,7 +10,7 @@
 
 namespace chromeos {
 
-class NetworkChangeNotifierChromeos;
+class NetworkChangeNotifierNetworkLibrary;
 
 // CrosNetworkChangeNotifierFactory creates ChromeOS-specific specialization of
 // NetworkChangeNotifier.
@@ -24,7 +24,7 @@ class CrosNetworkChangeNotifierFactory
 
   // Gets the instance of the NetworkChangeNotifier for Chrome OS.
   // This is used for setting up the notifier at startup.
-  static NetworkChangeNotifierChromeos* GetInstance();
+  static NetworkChangeNotifierNetworkLibrary* GetInstance();
 };
 
 }  // namespace net
diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc b/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc
deleted file mode 100644
index 4cc06a4..0000000
--- a/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc
+++ /dev/null
@@ -1,350 +0,0 @@
-// Copyright (c) 2012 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 <vector>
-
-#include "base/bind.h"
-#include "chrome/browser/chromeos/cros/cros_library.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
-#include "chromeos/dbus/root_power_manager_client.h"
-#include "content/public/browser/browser_thread.h"
-#include "net/dns/dns_config_service_posix.h"
-
-using content::BrowserThread;
-
-namespace {
-
-// Delay for online change notification reporting.
-const int kOnlineNotificationDelayMS = 500;
-const int kInitialNotificationCheckDelayMS = 1000;
-
-bool IsOnline(chromeos::ConnectionState state) {
-  return state == chromeos::STATE_ONLINE ||
-         state == chromeos::STATE_PORTAL;
-}
-
-}
-
-namespace chromeos {
-
-class NetworkChangeNotifierChromeos::DnsConfigServiceChromeos
-    : public net::internal::DnsConfigServicePosix {
- public:
-  DnsConfigServiceChromeos() {}
-
-  virtual ~DnsConfigServiceChromeos() {}
-
-  // net::DnsConfigServicePosix:
-  virtual bool StartWatching() OVERRIDE {
-    // Notifications from NetworkLibrary are sent to
-    // NetworkChangeNotifierChromeos.
-    return true;
-  }
-
-  void OnNetworkChange() {
-    InvalidateConfig();
-    InvalidateHosts();
-    ReadNow();
-  }
-};
-
-NetworkChangeNotifierChromeos::NetworkChangeNotifierChromeos()
-    : NetworkChangeNotifier(NetworkChangeCalculatorParamsChromeos()),
-      has_active_network_(false),
-      connection_state_(chromeos::STATE_UNKNOWN),
-      connection_type_(CONNECTION_NONE),
-      ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
-  BrowserThread::PostDelayedTask(
-         BrowserThread::UI, FROM_HERE,
-         base::Bind(
-             &NetworkChangeNotifierChromeos::UpdateInitialState, this),
-         base::TimeDelta::FromMilliseconds(kInitialNotificationCheckDelayMS));
-}
-
-NetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() {
-}
-
-void NetworkChangeNotifierChromeos::Init() {
-  chromeos::NetworkLibrary* network_library =
-      chromeos::CrosLibrary::Get()->GetNetworkLibrary();
-  network_library->AddNetworkManagerObserver(this);
-
-  DBusThreadManager::Get()->GetRootPowerManagerClient()->AddObserver(this);
-
-  dns_config_service_.reset(new DnsConfigServiceChromeos());
-  dns_config_service_->WatchConfig(
-      base::Bind(NetworkChangeNotifier::SetDnsConfig));
-
-  UpdateNetworkState(network_library);
-}
-
-void NetworkChangeNotifierChromeos::Shutdown() {
-  weak_factory_.InvalidateWeakPtrs();
-
-  dns_config_service_.reset();
-
-  if (!chromeos::CrosLibrary::Get())
-    return;
-
-  chromeos::NetworkLibrary* lib =
-      chromeos::CrosLibrary::Get()->GetNetworkLibrary();
-  lib->RemoveNetworkManagerObserver(this);
-  lib->RemoveObserverForAllNetworks(this);
-
-  DBusThreadManager::Get()->GetRootPowerManagerClient()->RemoveObserver(this);
-}
-
-void NetworkChangeNotifierChromeos::OnResume(
-    const base::TimeDelta& sleep_duration) {
-  // Force invalidation of various net resources on system resume.
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::Bind(
-          &NetworkChangeNotifier::NotifyObserversOfIPAddressChange));
-}
-
-
-void NetworkChangeNotifierChromeos::OnNetworkManagerChanged(
-    chromeos::NetworkLibrary* cros) {
-  UpdateNetworkState(cros);
-}
-
-net::NetworkChangeNotifier::ConnectionType
-NetworkChangeNotifierChromeos::GetCurrentConnectionType() const {
-  return connection_type_;
-}
-
-void NetworkChangeNotifierChromeos::OnNetworkChanged(
-    chromeos::NetworkLibrary* cros,
-    const chromeos::Network* network) {
-  CHECK(network);
-
-  // Active network changed?
-  if (network->service_path() != service_path_)
-    UpdateNetworkState(cros);
-  else
-    UpdateConnectivityState(network);
-}
-
-void NetworkChangeNotifierChromeos::UpdateNetworkState(
-    chromeos::NetworkLibrary* lib) {
-  const chromeos::Network* network = lib->active_network();
-  if (network) {
-    lib->GetIPConfigs(
-        network->device_path(),
-        chromeos::NetworkLibrary::FORMAT_COLON_SEPARATED_HEX,
-        base::Bind(&NetworkChangeNotifierChromeos::UpdateNetworkStateCallback,
-                   weak_factory_.GetWeakPtr(),
-                   lib));
-  } else {
-    // If we don't have a network, then we can't fetch ipconfigs, but we still
-    // need to process state updates when we lose a network (i.e. when
-    // has_active_network_ is still set, but we don't have one anymore).
-    NetworkIPConfigVector empty_ipconfigs;
-    UpdateNetworkStateCallback(lib, empty_ipconfigs, "");
-  }
-}
-
-void NetworkChangeNotifierChromeos::UpdateNetworkStateCallback(
-    chromeos::NetworkLibrary* lib,
-    const NetworkIPConfigVector& ipconfigs,
-    const std::string& hardware_address) {
-  const chromeos::Network* network = lib->active_network();
-
-  if (network) {
-    VLOG(1) << "UpdateNetworkStateCallback: " << network->name()
-            << ", type= " << network->type()
-            << ", device= " << network->device_path()
-            << ", state= " << network->state();
-  }
-
-  // Find the DNS servers currently in use. This code assumes that the order of
-  // the |ipconfigs| is stable.
-  std::vector<std::string> ipconfig_name_servers;
-  for (chromeos::NetworkIPConfigVector::const_iterator it = ipconfigs.begin();
-       it != ipconfigs.end(); ++it) {
-    const chromeos::NetworkIPConfig& ipconfig = *it;
-    if (!ipconfig.name_servers.empty())
-      ipconfig_name_servers.push_back(ipconfig.name_servers);
-  }
-
-  // Did we loose the active network?
-  bool lost_active_network = !network && has_active_network_;
-
-  // Did we have a change on the current active network?
-  bool changed_active_network = network && (
-      !has_active_network_ ||
-      network->service_path() != service_path_ ||
-      ipconfig_name_servers != name_servers_ ||
-      network->ip_address() != ip_address_);
-
-  // If just the current active network's state changed, update it if necessary.
-  if (!lost_active_network && !changed_active_network &&
-      network && network->state() != connection_state_) {
-    UpdateConnectivityState(network);
-  }
-
-  if (lost_active_network || changed_active_network) {
-    if (has_active_network_)
-      lib->RemoveObserverForAllNetworks(this);
-    if (!network) {
-      has_active_network_ = false;
-      service_path_.clear();
-      ip_address_.clear();
-      name_servers_.clear();
-    } else {
-      has_active_network_ = true;
-      service_path_ = network->service_path();
-      ip_address_ = network->ip_address();
-      name_servers_.swap(ipconfig_name_servers);
-    }
-    dns_config_service_->OnNetworkChange();
-    UpdateConnectivityState(network);
-    // If there is an active network, add observer to track its changes.
-    if (network)
-      lib->AddNetworkObserver(network->service_path(), this);
-
-    BrowserThread::PostTask(
-        BrowserThread::IO, FROM_HERE,
-        base::Bind(
-            &NetworkChangeNotifier::NotifyObserversOfIPAddressChange));
-  }
-}
-
-void NetworkChangeNotifierChromeos::UpdateConnectivityState(
-      const chromeos::Network* network) {
-  if (network) {
-    VLOG(1) << "UpdateConnectivityState: " << network->name()
-            << ", type= " << network->type()
-            << ", device= " << network->device_path()
-            << ", state= " << network->state()
-            << ", connect= " << connection_state_
-            << ", type= " << connection_type_;
-  }
-
-  // We don't care about all transitions of ConnectionState.  OnlineStateChange
-  // notification should trigger if ConnectionType is changed.
-  chromeos::ConnectionState new_connection_state =
-      network ? network->connection_state() : chromeos::STATE_UNKNOWN;
-
-  ConnectionType prev_connection_type = connection_type_;
-  ConnectionType new_connection_type = GetNetworkConnectionType(network);
-
-  bool is_online = (new_connection_state == chromeos::STATE_ONLINE);
-  bool was_online = (connection_state_ == chromeos::STATE_ONLINE);
-  bool is_portal = (new_connection_state == chromeos::STATE_PORTAL);
-  bool was_portal = (connection_state_ == chromeos::STATE_PORTAL);
-  VLOG(2) << " UpdateConnectivityState2: "
-          << "new_cs = " << new_connection_state
-          << ", is_online = " << is_online
-          << ", was_online = " << was_online
-          << ", is_portal = " << is_portal
-          << ", was_portal = " << was_portal;
-  connection_state_ = new_connection_state;
-  connection_type_ = new_connection_type;
-  if (new_connection_type != prev_connection_type) {
-    VLOG(1) << "UpdateConnectivityState3: "
-            << "prev_connection_type = " << prev_connection_type
-            << ", new_connection_type = " << new_connection_type;
-    ReportConnectionChange();
-  }
-  VLOG(2) << " UpdateConnectivityState4: "
-          << "new_cs = " << new_connection_state
-          << ", end_cs_ = " << connection_state_
-          << "prev_type = " << prev_connection_type
-          << ", new_type_ = " << new_connection_type;
-}
-
-void NetworkChangeNotifierChromeos::ReportConnectionChange() {
-  if (weak_factory_.HasWeakPtrs()) {
-    // If we have a pending task, cancel it.
-    DVLOG(1) << "ReportConnectionChange: has pending task";
-    weak_factory_.InvalidateWeakPtrs();
-    DVLOG(1) << "ReportConnectionChange: canceled pending task";
-  }
-  // Posting task with delay allows us to cancel it when connection type is
-  // changed frequently. This should help us avoid transient edge reporting
-  // while switching between connection types (e.g. ethernet->wifi).
-  BrowserThread::PostDelayedTask(
-      BrowserThread::UI, FROM_HERE,
-      base::Bind(
-          &NetworkChangeNotifierChromeos::ReportConnectionChangeOnUIThread,
-          weak_factory_.GetWeakPtr()),
-      base::TimeDelta::FromMilliseconds(kOnlineNotificationDelayMS));
-}
-
-void NetworkChangeNotifierChromeos::ReportConnectionChangeOnUIThread() {
-  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::Bind(
-         &NetworkChangeNotifierChromeos::
-             NotifyObserversOfConnectionTypeChange));
-}
-
-// static
-void NetworkChangeNotifierChromeos::UpdateInitialState(
-    NetworkChangeNotifierChromeos* self) {
-  chromeos::NetworkLibrary* net =
-      chromeos::CrosLibrary::Get()->GetNetworkLibrary();
-  self->UpdateNetworkState(net);
-}
-
-// static
-net::NetworkChangeNotifier::ConnectionType
-NetworkChangeNotifierChromeos::GetNetworkConnectionType(
-    const chromeos::Network* network) {
-  if (!network || !IsOnline(network->connection_state()))
-    return net::NetworkChangeNotifier::CONNECTION_NONE;
-
-  switch (network->type()) {
-    case chromeos::TYPE_ETHERNET:
-      return CONNECTION_ETHERNET;
-    case chromeos::TYPE_WIFI:
-      return CONNECTION_WIFI;
-    case chromeos::TYPE_WIMAX:
-      return CONNECTION_4G;
-    case chromeos::TYPE_CELLULAR:
-      switch (static_cast<const chromeos::CellularNetwork*>(
-          network)->network_technology()) {
-        case chromeos::NETWORK_TECHNOLOGY_UNKNOWN:
-        case chromeos::NETWORK_TECHNOLOGY_1XRTT:
-        case chromeos::NETWORK_TECHNOLOGY_GPRS:
-        case chromeos::NETWORK_TECHNOLOGY_EDGE:
-          return CONNECTION_2G;
-        case chromeos::NETWORK_TECHNOLOGY_GSM:
-        case chromeos::NETWORK_TECHNOLOGY_UMTS:
-        case chromeos::NETWORK_TECHNOLOGY_EVDO:
-        case chromeos::NETWORK_TECHNOLOGY_HSPA:
-          return CONNECTION_3G;
-        case chromeos::NETWORK_TECHNOLOGY_HSPA_PLUS:
-        case chromeos::NETWORK_TECHNOLOGY_LTE:
-        case chromeos::NETWORK_TECHNOLOGY_LTE_ADVANCED:
-          return CONNECTION_4G;
-      }
-    case chromeos::TYPE_BLUETOOTH:
-    case chromeos::TYPE_VPN:
-    case chromeos::TYPE_UNKNOWN:
-      break;
-  }
-  return net::NetworkChangeNotifier::CONNECTION_UNKNOWN;
-}
-
-// static
-net::NetworkChangeNotifier::NetworkChangeCalculatorParams
-NetworkChangeNotifierChromeos::NetworkChangeCalculatorParamsChromeos() {
-  NetworkChangeCalculatorParams params;
-  // Delay values arrived at by simple experimentation and adjusted so as to
-  // produce a single signal when switching between network connections.
-  params.ip_address_offline_delay_ = base::TimeDelta::FromMilliseconds(4000);
-  params.ip_address_online_delay_ = base::TimeDelta::FromMilliseconds(1000);
-  params.connection_type_offline_delay_ = base::TimeDelta::FromMilliseconds(0);
-  params.connection_type_online_delay_ = base::TimeDelta::FromMilliseconds(0);
-  return params;
-}
-
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.h b/chrome/browser/chromeos/net/network_change_notifier_chromeos.h
deleted file mode 100644
index 4a9ccf0..0000000
--- a/chrome/browser/chromeos/net/network_change_notifier_chromeos.h
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2012 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_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "base/memory/weak_ptr.h"
-#include "chrome/browser/chromeos/cros/network_library.h"
-#include "chromeos/dbus/root_power_manager_observer.h"
-#include "net/base/network_change_notifier.h"
-
-namespace chromeos {
-
-class OnlineStatusReportThreadTask;
-
-class NetworkChangeNotifierChromeos
-    : public net::NetworkChangeNotifier,
-      public chromeos::RootPowerManagerObserver,
-      public chromeos::NetworkLibrary::NetworkObserver,
-      public chromeos::NetworkLibrary::NetworkManagerObserver {
- public:
-  NetworkChangeNotifierChromeos();
-  virtual ~NetworkChangeNotifierChromeos();
-
-  // Initializes the network change notifier. Starts to observe changes
-  // from the power manager and the network manager.
-  void Init();
-
-  // Shutdowns the network change notifier. Stops observing changes from
-  // the power manager and the network manager.
-  void Shutdown();
-
- private:
-  friend class OnlineStatusReportThreadTask;
-
-  class DnsConfigServiceChromeos;
-
-  // RootPowerManagerObserver overrides:
-  virtual void OnResume(const base::TimeDelta& sleep_duration) OVERRIDE;
-
-  // NetworkChangeNotifier overrides:
-  virtual net::NetworkChangeNotifier::ConnectionType
-      GetCurrentConnectionType() const OVERRIDE;
-
-  // NetworkManagerObserver overrides:
-  virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj) OVERRIDE;
-
-  // NetworkObserver overrides:
-  virtual void OnNetworkChanged(chromeos::NetworkLibrary* cros,
-                                const chromeos::Network* network) OVERRIDE;
-
-  // Initiate online status change reporting.
-  void ReportConnectionChange();
-  void ReportConnectionChangeOnUIThread();
-  // Callback from online_notification_task_ when online state notification
-  // is actually scheduled.
-  void OnOnlineStateNotificationFired();
-
-  // Initiates an update of data members that keep the track the network stack
-  // state.
-  void UpdateNetworkState(chromeos::NetworkLibrary* cros);
-  // Called when a network state update has completed. Updates data members that
-  // keep the track the network stack state.
-  void UpdateNetworkStateCallback(chromeos::NetworkLibrary* cros,
-                                  const NetworkIPConfigVector& ip_configs,
-                                  const std::string& hardware_address);
-  // Updates network connectivity state.
-  void UpdateConnectivityState(const chromeos::Network* network);
-
-  // Updates the initial state. Lets us trigger initial eval of the
-  // connectivity status without waiting for an event from the connection
-  // manager.
-  static void UpdateInitialState(NetworkChangeNotifierChromeos* self);
-
-  // Gets connection type for given |network|.
-  static net::NetworkChangeNotifier::ConnectionType GetNetworkConnectionType(
-      const chromeos::Network* network);
-
-  // Get parameters for calculating new combined signal.
-  static NetworkChangeCalculatorParams NetworkChangeCalculatorParamsChromeos();
-
-  // True if we previously had an active network around.
-  bool has_active_network_;
-  // Current active network's connection state.
-  chromeos::ConnectionState connection_state_;
-  // Current active network's connection type.
-  net::NetworkChangeNotifier::ConnectionType connection_type_;
-  // Current active network's service path.
-  std::string service_path_;
-  // Current active network's IP address.
-  std::string ip_address_;
-  // Current active network's name servers.
-  std::vector<std::string> name_servers_;
-
-  scoped_ptr<DnsConfigServiceChromeos> dns_config_service_;
-
-  base::WeakPtrFactory<NetworkChangeNotifierChromeos> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifierChromeos);
-};
-
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_CHROMEOS_H_
diff --git a/chrome/browser/chromeos/net/network_change_notifier_network_library.cc b/chrome/browser/chromeos/net/network_change_notifier_network_library.cc
new file mode 100644
index 0000000..e6480be
--- /dev/null
+++ b/chrome/browser/chromeos/net/network_change_notifier_network_library.cc
@@ -0,0 +1,352 @@
+// Copyright (c) 2012 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_network_library.h"
+
+#include <vector>
+
+#include "base/bind.h"
+#include "chrome/browser/chromeos/cros/cros_library.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/root_power_manager_client.h"
+#include "content/public/browser/browser_thread.h"
+#include "net/dns/dns_config_service_posix.h"
+
+using content::BrowserThread;
+
+namespace {
+
+// Delay for online change notification reporting.
+const int kOnlineNotificationDelayMS = 500;
+const int kInitialNotificationCheckDelayMS = 1000;
+
+bool IsOnline(chromeos::ConnectionState state) {
+  return state == chromeos::STATE_ONLINE ||
+         state == chromeos::STATE_PORTAL;
+}
+
+}
+
+namespace chromeos {
+
+class NetworkChangeNotifierNetworkLibrary::DnsConfigServiceChromeos
+    : public net::internal::DnsConfigServicePosix {
+ public:
+  DnsConfigServiceChromeos() {}
+
+  virtual ~DnsConfigServiceChromeos() {}
+
+  // net::DnsConfigServicePosix:
+  virtual bool StartWatching() OVERRIDE {
+    // Notifications from NetworkLibrary are sent to
+    // NetworkChangeNotifierNetworkLibrary.
+    return true;
+  }
+
+  void OnNetworkChange() {
+    InvalidateConfig();
+    InvalidateHosts();
+    ReadNow();
+  }
+};
+
+NetworkChangeNotifierNetworkLibrary::NetworkChangeNotifierNetworkLibrary()
+    : NetworkChangeNotifier(NetworkChangeCalculatorParamsChromeos()),
+      has_active_network_(false),
+      connection_state_(chromeos::STATE_UNKNOWN),
+      connection_type_(CONNECTION_NONE),
+      ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
+  BrowserThread::PostDelayedTask(
+         BrowserThread::UI, FROM_HERE,
+         base::Bind(
+             &NetworkChangeNotifierNetworkLibrary::UpdateInitialState, this),
+         base::TimeDelta::FromMilliseconds(kInitialNotificationCheckDelayMS));
+}
+
+NetworkChangeNotifierNetworkLibrary::~NetworkChangeNotifierNetworkLibrary() {
+}
+
+void NetworkChangeNotifierNetworkLibrary::Init() {
+  chromeos::NetworkLibrary* network_library =
+      chromeos::CrosLibrary::Get()->GetNetworkLibrary();
+  network_library->AddNetworkManagerObserver(this);
+
+  DBusThreadManager::Get()->GetRootPowerManagerClient()->AddObserver(this);
+
+  dns_config_service_.reset(new DnsConfigServiceChromeos());
+  dns_config_service_->WatchConfig(
+      base::Bind(NetworkChangeNotifier::SetDnsConfig));
+
+  UpdateNetworkState(network_library);
+}
+
+void NetworkChangeNotifierNetworkLibrary::Shutdown() {
+  weak_factory_.InvalidateWeakPtrs();
+
+  dns_config_service_.reset();
+
+  if (!chromeos::CrosLibrary::Get())
+    return;
+
+  chromeos::NetworkLibrary* lib =
+      chromeos::CrosLibrary::Get()->GetNetworkLibrary();
+  lib->RemoveNetworkManagerObserver(this);
+  lib->RemoveObserverForAllNetworks(this);
+
+  DBusThreadManager::Get()->GetRootPowerManagerClient()->RemoveObserver(this);
+}
+
+void NetworkChangeNotifierNetworkLibrary::OnResume(
+    const base::TimeDelta& sleep_duration) {
+  // Force invalidation of various net resources on system resume.
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(
+          &NetworkChangeNotifier::NotifyObserversOfIPAddressChange));
+}
+
+
+void NetworkChangeNotifierNetworkLibrary::OnNetworkManagerChanged(
+    chromeos::NetworkLibrary* cros) {
+  UpdateNetworkState(cros);
+}
+
+net::NetworkChangeNotifier::ConnectionType
+NetworkChangeNotifierNetworkLibrary::GetCurrentConnectionType() const {
+  return connection_type_;
+}
+
+void NetworkChangeNotifierNetworkLibrary::OnNetworkChanged(
+    chromeos::NetworkLibrary* cros,
+    const chromeos::Network* network) {
+  CHECK(network);
+
+  // Active network changed?
+  if (network->service_path() != service_path_)
+    UpdateNetworkState(cros);
+  else
+    UpdateConnectivityState(network);
+}
+
+void NetworkChangeNotifierNetworkLibrary::UpdateNetworkState(
+    chromeos::NetworkLibrary* lib) {
+  const chromeos::Network* network = lib->active_network();
+  if (network) {
+    lib->GetIPConfigs(
+        network->device_path(),
+        chromeos::NetworkLibrary::FORMAT_COLON_SEPARATED_HEX,
+        base::Bind(
+            &NetworkChangeNotifierNetworkLibrary::UpdateNetworkStateCallback,
+            weak_factory_.GetWeakPtr(),
+            lib));
+  } else {
+    // If we don't have a network, then we can't fetch ipconfigs, but we still
+    // need to process state updates when we lose a network (i.e. when
+    // has_active_network_ is still set, but we don't have one anymore).
+    NetworkIPConfigVector empty_ipconfigs;
+    UpdateNetworkStateCallback(lib, empty_ipconfigs, "");
+  }
+}
+
+void NetworkChangeNotifierNetworkLibrary::UpdateNetworkStateCallback(
+    chromeos::NetworkLibrary* lib,
+    const NetworkIPConfigVector& ipconfigs,
+    const std::string& hardware_address) {
+  const chromeos::Network* network = lib->active_network();
+
+  if (network) {
+    VLOG(1) << "UpdateNetworkStateCallback: " << network->name()
+            << ", type= " << network->type()
+            << ", device= " << network->device_path()
+            << ", state= " << network->state();
+  }
+
+  // Find the DNS servers currently in use. This code assumes that the order of
+  // the |ipconfigs| is stable.
+  std::vector<std::string> ipconfig_name_servers;
+  for (chromeos::NetworkIPConfigVector::const_iterator it = ipconfigs.begin();
+       it != ipconfigs.end(); ++it) {
+    const chromeos::NetworkIPConfig& ipconfig = *it;
+    if (!ipconfig.name_servers.empty())
+      ipconfig_name_servers.push_back(ipconfig.name_servers);
+  }
+
+  // Did we loose the active network?
+  bool lost_active_network = !network && has_active_network_;
+
+  // Did we have a change on the current active network?
+  bool changed_active_network = network && (
+      !has_active_network_ ||
+      network->service_path() != service_path_ ||
+      ipconfig_name_servers != name_servers_ ||
+      network->ip_address() != ip_address_);
+
+  // If just the current active network's state changed, update it if necessary.
+  if (!lost_active_network && !changed_active_network &&
+      network && network->state() != connection_state_) {
+    UpdateConnectivityState(network);
+  }
+
+  if (lost_active_network || changed_active_network) {
+    if (has_active_network_)
+      lib->RemoveObserverForAllNetworks(this);
+    if (!network) {
+      has_active_network_ = false;
+      service_path_.clear();
+      ip_address_.clear();
+      name_servers_.clear();
+    } else {
+      has_active_network_ = true;
+      service_path_ = network->service_path();
+      ip_address_ = network->ip_address();
+      name_servers_.swap(ipconfig_name_servers);
+    }
+    dns_config_service_->OnNetworkChange();
+    UpdateConnectivityState(network);
+    // If there is an active network, add observer to track its changes.
+    if (network)
+      lib->AddNetworkObserver(network->service_path(), this);
+
+    BrowserThread::PostTask(
+        BrowserThread::IO, FROM_HERE,
+        base::Bind(
+            &NetworkChangeNotifier::NotifyObserversOfIPAddressChange));
+  }
+}
+
+void NetworkChangeNotifierNetworkLibrary::UpdateConnectivityState(
+      const chromeos::Network* network) {
+  if (network) {
+    VLOG(1) << "UpdateConnectivityState: " << network->name()
+            << ", type= " << network->type()
+            << ", device= " << network->device_path()
+            << ", state= " << network->state()
+            << ", connect= " << connection_state_
+            << ", type= " << connection_type_;
+  }
+
+  // We don't care about all transitions of ConnectionState.  OnlineStateChange
+  // notification should trigger if ConnectionType is changed.
+  chromeos::ConnectionState new_connection_state =
+      network ? network->connection_state() : chromeos::STATE_UNKNOWN;
+
+  ConnectionType prev_connection_type = connection_type_;
+  ConnectionType new_connection_type = GetNetworkConnectionType(network);
+
+  bool is_online = (new_connection_state == chromeos::STATE_ONLINE);
+  bool was_online = (connection_state_ == chromeos::STATE_ONLINE);
+  bool is_portal = (new_connection_state == chromeos::STATE_PORTAL);
+  bool was_portal = (connection_state_ == chromeos::STATE_PORTAL);
+  VLOG(2) << " UpdateConnectivityState2: "
+          << "new_cs = " << new_connection_state
+          << ", is_online = " << is_online
+          << ", was_online = " << was_online
+          << ", is_portal = " << is_portal
+          << ", was_portal = " << was_portal;
+  connection_state_ = new_connection_state;
+  connection_type_ = new_connection_type;
+  if (new_connection_type != prev_connection_type) {
+    VLOG(1) << "UpdateConnectivityState3: "
+            << "prev_connection_type = " << prev_connection_type
+            << ", new_connection_type = " << new_connection_type;
+    ReportConnectionChange();
+  }
+  VLOG(2) << " UpdateConnectivityState4: "
+          << "new_cs = " << new_connection_state
+          << ", end_cs_ = " << connection_state_
+          << "prev_type = " << prev_connection_type
+          << ", new_type_ = " << new_connection_type;
+}
+
+void NetworkChangeNotifierNetworkLibrary::ReportConnectionChange() {
+  if (weak_factory_.HasWeakPtrs()) {
+    // If we have a pending task, cancel it.
+    DVLOG(1) << "ReportConnectionChange: has pending task";
+    weak_factory_.InvalidateWeakPtrs();
+    DVLOG(1) << "ReportConnectionChange: canceled pending task";
+  }
+  // Posting task with delay allows us to cancel it when connection type is
+  // changed frequently. This should help us avoid transient edge reporting
+  // while switching between connection types (e.g. ethernet->wifi).
+  base::Closure task = base::Bind(
+      &NetworkChangeNotifierNetworkLibrary::ReportConnectionChangeOnUIThread,
+      weak_factory_.GetWeakPtr());
+
+  BrowserThread::PostDelayedTask(
+      BrowserThread::UI, FROM_HERE, task,
+      base::TimeDelta::FromMilliseconds(kOnlineNotificationDelayMS));
+}
+
+void NetworkChangeNotifierNetworkLibrary::ReportConnectionChangeOnUIThread() {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(
+         &NetworkChangeNotifierNetworkLibrary::
+             NotifyObserversOfConnectionTypeChange));
+}
+
+// static
+void NetworkChangeNotifierNetworkLibrary::UpdateInitialState(
+    NetworkChangeNotifierNetworkLibrary* self) {
+  chromeos::NetworkLibrary* net =
+      chromeos::CrosLibrary::Get()->GetNetworkLibrary();
+  self->UpdateNetworkState(net);
+}
+
+// static
+net::NetworkChangeNotifier::ConnectionType
+NetworkChangeNotifierNetworkLibrary::GetNetworkConnectionType(
+    const chromeos::Network* network) {
+  if (!network || !IsOnline(network->connection_state()))
+    return net::NetworkChangeNotifier::CONNECTION_NONE;
+
+  switch (network->type()) {
+    case chromeos::TYPE_ETHERNET:
+      return CONNECTION_ETHERNET;
+    case chromeos::TYPE_WIFI:
+      return CONNECTION_WIFI;
+    case chromeos::TYPE_WIMAX:
+      return CONNECTION_4G;
+    case chromeos::TYPE_CELLULAR:
+      switch (static_cast<const chromeos::CellularNetwork*>(
+          network)->network_technology()) {
+        case chromeos::NETWORK_TECHNOLOGY_UNKNOWN:
+        case chromeos::NETWORK_TECHNOLOGY_1XRTT:
+        case chromeos::NETWORK_TECHNOLOGY_GPRS:
+        case chromeos::NETWORK_TECHNOLOGY_EDGE:
+          return CONNECTION_2G;
+        case chromeos::NETWORK_TECHNOLOGY_GSM:
+        case chromeos::NETWORK_TECHNOLOGY_UMTS:
+        case chromeos::NETWORK_TECHNOLOGY_EVDO:
+        case chromeos::NETWORK_TECHNOLOGY_HSPA:
+          return CONNECTION_3G;
+        case chromeos::NETWORK_TECHNOLOGY_HSPA_PLUS:
+        case chromeos::NETWORK_TECHNOLOGY_LTE:
+        case chromeos::NETWORK_TECHNOLOGY_LTE_ADVANCED:
+          return CONNECTION_4G;
+      }
+    case chromeos::TYPE_BLUETOOTH:
+    case chromeos::TYPE_VPN:
+    case chromeos::TYPE_UNKNOWN:
+      break;
+  }
+  return net::NetworkChangeNotifier::CONNECTION_UNKNOWN;
+}
+
+// static
+net::NetworkChangeNotifier::NetworkChangeCalculatorParams
+NetworkChangeNotifierNetworkLibrary::NetworkChangeCalculatorParamsChromeos() {
+  NetworkChangeCalculatorParams params;
+  // Delay values arrived at by simple experimentation and adjusted so as to
+  // produce a single signal when switching between network connections.
+  params.ip_address_offline_delay_ = base::TimeDelta::FromMilliseconds(4000);
+  params.ip_address_online_delay_ = base::TimeDelta::FromMilliseconds(1000);
+  params.connection_type_offline_delay_ = base::TimeDelta::FromMilliseconds(0);
+  params.connection_type_online_delay_ = base::TimeDelta::FromMilliseconds(0);
+  return params;
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/net/network_change_notifier_network_library.h b/chrome/browser/chromeos/net/network_change_notifier_network_library.h
new file mode 100644
index 0000000..16d8aa4
--- /dev/null
+++ b/chrome/browser/chromeos/net/network_change_notifier_network_library.h
@@ -0,0 +1,109 @@
+// Copyright (c) 2012 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_NETWORK_LIBRARY_H_
+#define CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_NETWORK_LIBRARY_H_
+
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/chromeos/cros/network_library.h"
+#include "chromeos/dbus/root_power_manager_observer.h"
+#include "net/base/network_change_notifier.h"
+
+namespace chromeos {
+
+class OnlineStatusReportThreadTask;
+
+class NetworkChangeNotifierNetworkLibrary
+    : public net::NetworkChangeNotifier,
+      public chromeos::RootPowerManagerObserver,
+      public chromeos::NetworkLibrary::NetworkObserver,
+      public chromeos::NetworkLibrary::NetworkManagerObserver {
+ public:
+  NetworkChangeNotifierNetworkLibrary();
+  virtual ~NetworkChangeNotifierNetworkLibrary();
+
+  // Initializes the network change notifier. Starts to observe changes
+  // from the power manager and the network manager.
+  void Init();
+
+  // Shutdowns the network change notifier. Stops observing changes from
+  // the power manager and the network manager.
+  void Shutdown();
+
+ private:
+  friend class OnlineStatusReportThreadTask;
+
+  class DnsConfigServiceChromeos;
+
+  // RootPowerManagerObserver overrides:
+  virtual void OnResume(const base::TimeDelta& sleep_duration) OVERRIDE;
+
+  // NetworkChangeNotifier overrides:
+  virtual net::NetworkChangeNotifier::ConnectionType
+      GetCurrentConnectionType() const OVERRIDE;
+
+  // NetworkManagerObserver overrides:
+  virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj) OVERRIDE;
+
+  // NetworkObserver overrides:
+  virtual void OnNetworkChanged(chromeos::NetworkLibrary* cros,
+                                const chromeos::Network* network) OVERRIDE;
+
+  // Initiate online status change reporting.
+  void ReportConnectionChange();
+  void ReportConnectionChangeOnUIThread();
+  // Callback from online_notification_task_ when online state notification
+  // is actually scheduled.
+  void OnOnlineStateNotificationFired();
+
+  // Initiates an update of data members that keep the track the network stack
+  // state.
+  void UpdateNetworkState(chromeos::NetworkLibrary* cros);
+  // Called when a network state update has completed. Updates data members that
+  // keep the track the network stack state.
+  void UpdateNetworkStateCallback(chromeos::NetworkLibrary* cros,
+                                  const NetworkIPConfigVector& ip_configs,
+                                  const std::string& hardware_address);
+  // Updates network connectivity state.
+  void UpdateConnectivityState(const chromeos::Network* network);
+
+  // Updates the initial state. Lets us trigger initial eval of the
+  // connectivity status without waiting for an event from the connection
+  // manager.
+  static void UpdateInitialState(NetworkChangeNotifierNetworkLibrary* self);
+
+  // Gets connection type for given |network|.
+  static net::NetworkChangeNotifier::ConnectionType GetNetworkConnectionType(
+      const chromeos::Network* network);
+
+  // Get parameters for calculating new combined signal.
+  static NetworkChangeCalculatorParams NetworkChangeCalculatorParamsChromeos();
+
+  // True if we previously had an active network around.
+  bool has_active_network_;
+  // Current active network's connection state.
+  chromeos::ConnectionState connection_state_;
+  // Current active network's connection type.
+  net::NetworkChangeNotifier::ConnectionType connection_type_;
+  // Current active network's service path.
+  std::string service_path_;
+  // Current active network's IP address.
+  std::string ip_address_;
+  // Current active network's name servers.
+  std::vector<std::string> name_servers_;
+
+  scoped_ptr<DnsConfigServiceChromeos> dns_config_service_;
+
+  base::WeakPtrFactory<NetworkChangeNotifierNetworkLibrary> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifierNetworkLibrary);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_NETWORK_LIBRARY_H_
diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi
index f9a0f92..2e8ffb4 100644
--- a/chrome/chrome_browser_chromeos.gypi
+++ b/chrome/chrome_browser_chromeos.gypi
@@ -503,8 +503,8 @@
         'browser/chromeos/mobile_config.h',
         'browser/chromeos/net/cros_network_change_notifier_factory.cc',
         'browser/chromeos/net/cros_network_change_notifier_factory.h',
-        'browser/chromeos/net/network_change_notifier_chromeos.cc',
-        'browser/chromeos/net/network_change_notifier_chromeos.h',
+        'browser/chromeos/net/network_change_notifier_network_library.cc',
+        'browser/chromeos/net/network_change_notifier_network_library.h',
         'browser/chromeos/net/network_portal_detector.cc',
         'browser/chromeos/net/network_portal_detector.h',
         'browser/chromeos/network_login_observer.cc',
-- 
cgit v1.1