diff options
Diffstat (limited to 'net/base')
-rw-r--r-- | net/base/host_resolver.h | 3 | ||||
-rw-r--r-- | net/base/host_resolver_impl.cc | 9 | ||||
-rw-r--r-- | net/base/host_resolver_impl.h | 7 | ||||
-rw-r--r-- | net/base/host_resolver_impl_unittest.cc | 32 | ||||
-rw-r--r-- | net/base/mapped_host_resolver.h | 1 | ||||
-rw-r--r-- | net/base/mock_host_resolver.cc | 4 | ||||
-rw-r--r-- | net/base/mock_host_resolver.h | 3 |
7 files changed, 44 insertions, 15 deletions
diff --git a/net/base/host_resolver.h b/net/base/host_resolver.h index 9fd8dbe4..e4bf847 100644 --- a/net/base/host_resolver.h +++ b/net/base/host_resolver.h @@ -167,9 +167,6 @@ class HostResolver : public base::RefCountedThreadSafe<HostResolver> { // Unregisters an observer previously added by AddObserver(). virtual void RemoveObserver(Observer* observer) = 0; - // Gives the HostResolver an opportunity to flush state. - virtual void Flush() {} - // Sets the default AddressFamily to use when requests have left it // unspecified. For example, this could be used to restrict resolution // results to AF_INET by passing in ADDRESS_FAMILY_IPV4, or to diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc index 1f43c60..df5bc79 100644 --- a/net/base/host_resolver_impl.cc +++ b/net/base/host_resolver_impl.cc @@ -683,6 +683,8 @@ HostResolverImpl::HostResolverImpl( #if defined(OS_WIN) EnsureWinsockInit(); #endif + if (network_change_notifier_) + network_change_notifier_->AddObserver(this); } HostResolverImpl::~HostResolverImpl() { @@ -697,6 +699,9 @@ HostResolverImpl::~HostResolverImpl() { if (cur_completing_job_) cur_completing_job_->Cancel(); + if (network_change_notifier_) + network_change_notifier_->RemoveObserver(this); + // Delete the job pools. for (size_t i = 0u; i < arraysize(job_pools_); ++i) delete job_pools_[i]; @@ -841,7 +846,7 @@ void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) { void HostResolverImpl::ProbeIPv6Support() { DCHECK(!ipv6_probe_monitoring_); ipv6_probe_monitoring_ = true; - Flush(); // Give initial setup call. + OnIPAddressChanged(); // Give initial setup call. } void HostResolverImpl::Shutdown() { @@ -1074,7 +1079,7 @@ void HostResolverImpl::OnCancelRequest(const BoundNetLog& net_log, net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL); } -void HostResolverImpl::Flush() { +void HostResolverImpl::OnIPAddressChanged() { if (cache_.get()) cache_->clear(); if (ipv6_probe_monitoring_) { diff --git a/net/base/host_resolver_impl.h b/net/base/host_resolver_impl.h index 4814921..1a182b3 100644 --- a/net/base/host_resolver_impl.h +++ b/net/base/host_resolver_impl.h @@ -47,7 +47,8 @@ namespace net { // // Requests are ordered in the queue based on their priority. -class HostResolverImpl : public HostResolver { +class HostResolverImpl : public HostResolver, + public NetworkChangeNotifier::Observer { public: // The index into |job_pools_| for the various job pools. Pools with a higher // index have lower priority. @@ -87,7 +88,6 @@ class HostResolverImpl : public HostResolver { virtual void CancelRequest(RequestHandle req); virtual void AddObserver(HostResolver::Observer* observer); virtual void RemoveObserver(HostResolver::Observer* observer); - virtual void Flush(); // Set address family, and disable IPv6 probe support. virtual void SetDefaultAddressFamily(AddressFamily address_family); @@ -180,6 +180,9 @@ class HostResolverImpl : public HostResolver { int request_id, const RequestInfo& info); + // NetworkChangeNotifier::Observer methods: + virtual void OnIPAddressChanged(); + // Notify IPv6ProbeJob not to call back, and discard reference to the job. void DiscardIPv6ProbeJob(); diff --git a/net/base/host_resolver_impl_unittest.cc b/net/base/host_resolver_impl_unittest.cc index e9a721c..a17fb6a 100644 --- a/net/base/host_resolver_impl_unittest.cc +++ b/net/base/host_resolver_impl_unittest.cc @@ -1043,6 +1043,38 @@ TEST_F(HostResolverImplTest, CancellationObserver) { CapturingObserver::StartOrCancelEntry(1, info)); } +// Test that IP address changes flush the cache. +TEST_F(HostResolverImplTest, FlushCacheOnIPAddressChange) { + MockNetworkChangeNotifier mock_network_change_notifier; + scoped_refptr<HostResolver> host_resolver( + new HostResolverImpl(NULL, CreateDefaultCache(), + &mock_network_change_notifier, + kMaxJobs)); + + AddressList addrlist; + + // Resolve "host1". + HostResolver::RequestInfo info1("host1", 70); + TestCompletionCallback callback; + int rv = host_resolver->Resolve(info1, &addrlist, &callback, NULL, NULL); + EXPECT_EQ(ERR_IO_PENDING, rv); + EXPECT_EQ(OK, callback.WaitForResult()); + + // Resolve "host1" again -- this time it will be served from cache, but it + // should still notify of completion. + rv = host_resolver->Resolve(info1, &addrlist, &callback, NULL, NULL); + ASSERT_EQ(OK, rv); // Should complete synchronously. + + // Flush cache by triggering an IP address change. + mock_network_change_notifier.NotifyIPAddressChange(); + + // Resolve "host1" again -- this time it won't be served from cache, so it + // will complete asynchronously. + rv = host_resolver->Resolve(info1, &addrlist, &callback, NULL, NULL); + ASSERT_EQ(ERR_IO_PENDING, rv); // Should complete asynchronously. + EXPECT_EQ(OK, callback.WaitForResult()); +} + // Tests that when the maximum threads is set to 1, requests are dequeued // in order of priority. TEST_F(HostResolverImplTest, HigherPriorityRequestsStartedFirst) { diff --git a/net/base/mapped_host_resolver.h b/net/base/mapped_host_resolver.h index 890f3072..7339f06 100644 --- a/net/base/mapped_host_resolver.h +++ b/net/base/mapped_host_resolver.h @@ -32,7 +32,6 @@ class MappedHostResolver : public HostResolver { virtual void CancelRequest(RequestHandle req); virtual void AddObserver(Observer* observer); virtual void RemoveObserver(Observer* observer); - virtual void Flush() { impl_->Flush(); } virtual HostResolverImpl* GetAsHostResolverImpl(); // Adds a rule to this mapper. The format of the rule can be one of: diff --git a/net/base/mock_host_resolver.cc b/net/base/mock_host_resolver.cc index 9e57fd1..d99b24e 100644 --- a/net/base/mock_host_resolver.cc +++ b/net/base/mock_host_resolver.cc @@ -66,10 +66,6 @@ void MockHostResolverBase::RemoveObserver(Observer* observer) { impl_->RemoveObserver(observer); } -void MockHostResolverBase::Flush() { - impl_->Flush(); -} - void MockHostResolverBase::Reset(HostResolverProc* interceptor) { synchronous_mode_ = false; diff --git a/net/base/mock_host_resolver.h b/net/base/mock_host_resolver.h index ff9f9fc..5a1df7f 100644 --- a/net/base/mock_host_resolver.h +++ b/net/base/mock_host_resolver.h @@ -47,12 +47,9 @@ class MockHostResolverBase : public HostResolver { virtual void CancelRequest(RequestHandle req); virtual void AddObserver(Observer* observer); virtual void RemoveObserver(Observer* observer); - virtual void Flush(); RuleBasedHostResolverProc* rules() { return rules_; } - const HostCache* cache() const { return impl_->cache(); } - // Controls whether resolutions complete synchronously or asynchronously. void set_synchronous_mode(bool is_synchronous) { synchronous_mode_ = is_synchronous; |