summaryrefslogtreecommitdiffstats
path: root/net/base/network_change_notifier.cc
diff options
context:
space:
mode:
authorszym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-16 18:10:53 +0000
committerszym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-16 18:10:53 +0000
commit05aad32d741012a173ea8f1a4b5072dabe7c0188 (patch)
treef9b8535284f0503ef96bac3a451f995b5fcd508f /net/base/network_change_notifier.cc
parent1a92b28469774982203a8c88be0bb49d8275cf68 (diff)
downloadchromium_src-05aad32d741012a173ea8f1a4b5072dabe7c0188.zip
chromium_src-05aad32d741012a173ea8f1a4b5072dabe7c0188.tar.gz
chromium_src-05aad32d741012a173ea8f1a4b5072dabe7c0188.tar.bz2
[net/dns] Isolate DnsConfigWatcher from DnsConfigService.
DnsConfigWatcher is installed at NetworkChangeNotifier and provides signals to DNSObservers. DnsConfigService becomes a DNSObserver. BUG=114827,114223,128166 TEST=./net_unittests --gtest_filter=DnsConfigService* Review URL: https://chromiumcodereview.appspot.com/10377092 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@137457 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/network_change_notifier.cc')
-rw-r--r--net/base/network_change_notifier.cc27
1 files changed, 26 insertions, 1 deletions
diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc
index ec9cae0..7a14d0e 100644
--- a/net/base/network_change_notifier.cc
+++ b/net/base/network_change_notifier.cc
@@ -81,6 +81,14 @@ bool NetworkChangeNotifier::IsOffline() {
}
// static
+bool NetworkChangeNotifier::IsWatchingDNS() {
+ if (!g_network_change_notifier)
+ return false;
+ base::AutoLock(g_network_change_notifier->watching_dns_lock_);
+ return g_network_change_notifier->watching_dns_;
+}
+
+// static
NetworkChangeNotifier* NetworkChangeNotifier::CreateMock() {
return new MockNetworkChangeNotifier();
}
@@ -137,11 +145,13 @@ NetworkChangeNotifier::NetworkChangeNotifier()
ObserverListBase<OnlineStateObserver>::NOTIFY_EXISTING_ONLY)),
resolver_state_observer_list_(
new ObserverListThreadSafe<DNSObserver>(
- ObserverListBase<DNSObserver>::NOTIFY_EXISTING_ONLY)) {
+ ObserverListBase<DNSObserver>::NOTIFY_EXISTING_ONLY)),
+ watching_dns_(false) {
DCHECK(!g_network_change_notifier);
g_network_change_notifier = this;
}
+// static
void NetworkChangeNotifier::NotifyObserversOfIPAddressChange() {
if (g_network_change_notifier) {
g_network_change_notifier->ip_address_observer_list_->Notify(
@@ -149,13 +159,28 @@ void NetworkChangeNotifier::NotifyObserversOfIPAddressChange() {
}
}
+// static
void NetworkChangeNotifier::NotifyObserversOfDNSChange(unsigned detail) {
if (g_network_change_notifier) {
+ {
+ base::AutoLock(g_network_change_notifier->watching_dns_lock_);
+ if (detail & NetworkChangeNotifier::CHANGE_DNS_WATCH_STARTED) {
+ g_network_change_notifier->watching_dns_ = true;
+ } else if (detail & NetworkChangeNotifier::CHANGE_DNS_WATCH_FAILED) {
+ g_network_change_notifier->watching_dns_ = false;
+ }
+ // Include detail that watch is off to spare the call to IsWatchingDNS.
+ if (!g_network_change_notifier->watching_dns_)
+ detail |= NetworkChangeNotifier::CHANGE_DNS_WATCH_FAILED;
+ }
+ DCHECK(!(detail & NetworkChangeNotifier::CHANGE_DNS_WATCH_FAILED) ||
+ !(detail & NetworkChangeNotifier::CHANGE_DNS_WATCH_STARTED));
g_network_change_notifier->resolver_state_observer_list_->Notify(
&DNSObserver::OnDNSChanged, detail);
}
}
+// static
void NetworkChangeNotifier::NotifyObserversOfOnlineStateChange() {
if (g_network_change_notifier) {
g_network_change_notifier->online_state_observer_list_->Notify(