Set up HostResolverImpl to flush cache on IP address change.
BUG=http://crbug.com/26159

Review URL: http://codereview.chromium.org/545003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35956 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc
index 36975f8..5644223 100644
--- a/net/base/host_resolver_impl.cc
+++ b/net/base/host_resolver_impl.cc
@@ -15,6 +15,7 @@
 #include "net/base/host_resolver_proc.h"
 #include "net/base/load_log.h"
 #include "net/base/net_errors.h"
+#include "net/base/network_change_notifier.h"
 
 #if defined(OS_WIN)
 #include "net/base/winsock_init.h"
@@ -22,7 +23,9 @@
 
 namespace net {
 
-HostResolver* CreateSystemHostResolver() {
+namespace {
+
+HostCache* CreateDefaultCache() {
   static const size_t kMaxHostCacheEntries = 100;
 
   HostCache* cache = new HostCache(
@@ -30,7 +33,14 @@
       base::TimeDelta::FromMinutes(1),
       base::TimeDelta::FromSeconds(1));
 
-  return new HostResolverImpl(NULL, cache);
+  return cache;
+}
+
+}  // anonymous namespace
+
+HostResolver* CreateSystemHostResolver() {
+  // TODO(willchan): Pass in the NetworkChangeNotifier.
+  return new HostResolverImpl(NULL, CreateDefaultCache(), NULL);
 }
 
 static int ResolveAddrInfo(HostResolverProc* resolver_proc,
@@ -279,16 +289,21 @@
 
 //-----------------------------------------------------------------------------
 
-HostResolverImpl::HostResolverImpl(HostResolverProc* resolver_proc,
-                                   HostCache* cache)
+HostResolverImpl::HostResolverImpl(
+    HostResolverProc* resolver_proc,
+    HostCache* cache,
+    const scoped_refptr<NetworkChangeNotifier>& network_change_notifier)
     : cache_(cache),
       next_request_id_(0),
       resolver_proc_(resolver_proc),
       default_address_family_(ADDRESS_FAMILY_UNSPECIFIED),
-      shutdown_(false) {
+      shutdown_(false),
+      network_change_notifier_(network_change_notifier) {
 #if defined(OS_WIN)
   EnsureWinsockInit();
 #endif
+  if (network_change_notifier_)
+    network_change_notifier_->AddObserver(this);
 }
 
 HostResolverImpl::~HostResolverImpl() {
@@ -300,6 +315,9 @@
   // In case we are being deleted during the processing of a callback.
   if (cur_completing_job_)
     cur_completing_job_->Cancel();
+
+  if (network_change_notifier_)
+    network_change_notifier_->RemoveObserver(this);
 }
 
 // TODO(eroman): Don't create cache entries for hostnames which are simply IP
@@ -408,11 +426,11 @@
   OnCancelRequest(req->load_log(), req->id(), req->info());
 }
 
-void HostResolverImpl::AddObserver(Observer* observer) {
+void HostResolverImpl::AddObserver(HostResolver::Observer* observer) {
   observers_.push_back(observer);
 }
 
-void HostResolverImpl::RemoveObserver(Observer* observer) {
+void HostResolverImpl::RemoveObserver(HostResolver::Observer* observer) {
   ObserversList::iterator it =
       std::find(observers_.begin(), observers_.end(), observer);
 
@@ -555,4 +573,9 @@
   LoadLog::EndEvent(load_log, LoadLog::TYPE_HOST_RESOLVER_IMPL);
 }
 
+void HostResolverImpl::OnIPAddressChanged() {
+  if (cache_.get())
+    cache_->clear();
+}
+
 }  // namespace net