summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
Diffstat (limited to 'chrome')
-rw-r--r--chrome/utility/local_discovery/local_domain_resolver_unittest.cc16
-rw-r--r--chrome/utility/local_discovery/service_discovery_client_impl.cc17
2 files changed, 28 insertions, 5 deletions
diff --git a/chrome/utility/local_discovery/local_domain_resolver_unittest.cc b/chrome/utility/local_discovery/local_domain_resolver_unittest.cc
index c1fd51c..fe1cebf 100644
--- a/chrome/utility/local_discovery/local_domain_resolver_unittest.cc
+++ b/chrome/utility/local_discovery/local_domain_resolver_unittest.cc
@@ -167,6 +167,22 @@ TEST_F(LocalDomainResolverTest, ResolveDomainNone) {
RunFor(base::TimeDelta::FromSeconds(4));
}
+TEST_F(LocalDomainResolverTest, ResolveDomainPreferAFromCache) {
+ socket_factory_->SimulateReceive(
+ kSamplePacketA, sizeof(kSamplePacketAAAA));
+ socket_factory_->SimulateReceive(
+ kSamplePacketA, sizeof(kSamplePacketA));
+
+ LocalDomainResolverImpl resolver(
+ "myhello.local", net::ADDRESS_FAMILY_UNSPECIFIED,
+ base::Bind(&LocalDomainResolverTest::AddressCallback,
+ base::Unretained(this)), &mdns_client_);
+
+ EXPECT_CALL(*this, AddressCallbackInternal(true, "1.2.3.4"));
+
+ resolver.Start();
+}
+
} // namespace
} // namespace local_discovery
diff --git a/chrome/utility/local_discovery/service_discovery_client_impl.cc b/chrome/utility/local_discovery/service_discovery_client_impl.cc
index 524f176..1df586d 100644
--- a/chrome/utility/local_discovery/service_discovery_client_impl.cc
+++ b/chrome/utility/local_discovery/service_discovery_client_impl.cc
@@ -406,10 +406,14 @@ void LocalDomainResolverImpl::Start() {
transaction_a_->Start();
}
- if (address_family_ == net::ADDRESS_FAMILY_IPV6 ||
- address_family_ == net::ADDRESS_FAMILY_UNSPECIFIED) {
- transaction_aaaa_ = CreateTransaction(net::dns_protocol::kTypeAAAA);
- transaction_aaaa_->Start();
+ // Callback may have finished syncrhonously during |transaction_a_->Start()|,
+ // check to make sure it hasn't before starting |transaction_aaaa_|.
+ if (!callback_.is_null()) {
+ if (address_family_ == net::ADDRESS_FAMILY_IPV6 ||
+ address_family_ == net::ADDRESS_FAMILY_UNSPECIFIED) {
+ transaction_aaaa_ = CreateTransaction(net::dns_protocol::kTypeAAAA);
+ transaction_aaaa_->Start();
+ }
}
}
@@ -449,7 +453,10 @@ void LocalDomainResolverImpl::OnTransactionComplete(
}
}
- callback_.Run(result == net::MDnsTransaction::RESULT_RECORD, address);
+ if (!callback_.is_null()) {
+ callback_.Run(result == net::MDnsTransaction::RESULT_RECORD, address);
+ callback_.Reset();
+ }
}
} // namespace local_discovery