| Index: net/android/network_change_notifier_android.cc
|
| diff --git a/net/android/network_change_notifier_android.cc b/net/android/network_change_notifier_android.cc
|
| index d1ad338a15f32f439fc7586d236a95eecc3cfd86..36ebda679660abfeb2a4a0f8cf79a0f1a559eab3 100644
|
| --- a/net/android/network_change_notifier_android.cc
|
| +++ b/net/android/network_change_notifier_android.cc
|
| @@ -61,29 +61,43 @@
|
|
|
| #include "base/threading/thread.h"
|
| #include "net/base/address_tracker_linux.h"
|
| -#include "net/dns/dns_config_service.h"
|
| +#include "net/dns/dns_config_service_posix.h"
|
|
|
| namespace net {
|
|
|
| // Thread on which we can run DnsConfigService, which requires a TYPE_IO
|
| // message loop to monitor /system/etc/hosts.
|
| class NetworkChangeNotifierAndroid::DnsConfigServiceThread
|
| - : public base::Thread {
|
| + : public base::Thread,
|
| + public NetworkChangeNotifier::NetworkChangeObserver {
|
| public:
|
| - DnsConfigServiceThread()
|
| + DnsConfigServiceThread(const DnsConfig* dns_config_for_testing)
|
| : base::Thread("DnsConfigService"),
|
| + dns_config_for_testing_(dns_config_for_testing),
|
| + creation_time_(base::Time::Now()),
|
| address_tracker_(base::Bind(base::DoNothing),
|
| base::Bind(base::DoNothing),
|
| // We're only interested in tunnel interface changes.
|
| base::Bind(NotifyNetworkChangeNotifierObservers)) {}
|
|
|
| - ~DnsConfigServiceThread() override { Stop(); }
|
| + ~DnsConfigServiceThread() override {
|
| + NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
|
| + Stop();
|
| + }
|
| +
|
| + void InitAfterStart() {
|
| + DCHECK(IsRunning());
|
| + NetworkChangeNotifier::AddNetworkChangeObserver(this);
|
| + }
|
|
|
| void Init() override {
|
| address_tracker_.Init();
|
| - dns_config_service_ = DnsConfigService::CreateSystemService();
|
| + dns_config_service_.reset(new internal::DnsConfigServicePosix());
|
| + if (dns_config_for_testing_)
|
| + dns_config_service_->SetDnsConfigForTesting(dns_config_for_testing_);
|
| dns_config_service_->WatchConfig(
|
| - base::Bind(&NetworkChangeNotifier::SetDnsConfig));
|
| + base::Bind(&DnsConfigServiceThread::DnsConfigChangeCallback,
|
| + base::Unretained(this)));
|
| }
|
|
|
| void CleanUp() override { dns_config_service_.reset(); }
|
| @@ -94,7 +108,26 @@ class NetworkChangeNotifierAndroid::DnsConfigServiceThread
|
| }
|
|
|
| private:
|
| - scoped_ptr<DnsConfigService> dns_config_service_;
|
| + void DnsConfigChangeCallback(const DnsConfig& config) {
|
| + DCHECK(task_runner()->BelongsToCurrentThread());
|
| + if (dns_config_service_->SeenChangeSince(creation_time_)) {
|
| + NetworkChangeNotifier::SetDnsConfig(config);
|
| + } else {
|
| + NetworkChangeNotifier::SetInitialDnsConfig(config);
|
| + }
|
| + }
|
| +
|
| + // NetworkChangeNotifier::NetworkChangeObserver implementation:
|
| + void OnNetworkChanged(NetworkChangeNotifier::ConnectionType type) override {
|
| + task_runner()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&internal::DnsConfigServicePosix::OnNetworkChanged,
|
| + base::Unretained(dns_config_service_.get()), type));
|
| + }
|
| +
|
| + const DnsConfig* dns_config_for_testing_;
|
| + const base::Time creation_time_;
|
| + scoped_ptr<internal::DnsConfigServicePosix> dns_config_service_;
|
| // Used to detect tunnel state changes.
|
| internal::AddressTrackerLinux address_tracker_;
|
|
|
| @@ -130,13 +163,16 @@ bool NetworkChangeNotifierAndroid::Register(JNIEnv* env) {
|
| }
|
|
|
| NetworkChangeNotifierAndroid::NetworkChangeNotifierAndroid(
|
| - NetworkChangeNotifierDelegateAndroid* delegate)
|
| + NetworkChangeNotifierDelegateAndroid* delegate,
|
| + const DnsConfig* dns_config_for_testing)
|
| : NetworkChangeNotifier(NetworkChangeCalculatorParamsAndroid()),
|
| delegate_(delegate),
|
| - dns_config_service_thread_(new DnsConfigServiceThread()) {
|
| + dns_config_service_thread_(
|
| + new DnsConfigServiceThread(dns_config_for_testing)) {
|
| delegate_->AddObserver(this);
|
| dns_config_service_thread_->StartWithOptions(
|
| base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
|
| + dns_config_service_thread_->InitAfterStart();
|
| }
|
|
|
| // static
|
|
|