Initial support for built-in DNS resolver/cache.

BUG=60149
TEST=None

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@64271 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index f4f92ba..f1cb24b 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/net/passive_log_collector.h"
 #include "chrome/browser/net/predictor_api.h"
 #include "chrome/common/chrome_switches.h"
+#include "chrome/common/net/raw_host_resolver_proc.h"
 #include "chrome/common/net/url_fetcher.h"
 #include "net/base/dnsrr_resolver.h"
 #include "net/base/host_cache.h"
@@ -87,8 +88,24 @@
       parallelism = 20;
   }
 
+  // Use the specified DNS server for doing raw resolutions if requested
+  // from the command-line.
+  scoped_refptr<net::HostResolverProc> resolver_proc;
+  if (command_line.HasSwitch(switches::kDnsServer)) {
+    std::string dns_ip_string =
+        command_line.GetSwitchValueASCII(switches::kDnsServer);
+    net::IPAddressNumber dns_ip_number;
+    if (net::ParseIPLiteralToNumber(dns_ip_string, &dns_ip_number)) {
+      resolver_proc =
+          new chrome_common_net::RawHostResolverProc(dns_ip_number, NULL);
+    } else {
+      LOG(ERROR) << "Invalid IP address specified for --dns-server: "
+                 << dns_ip_string;
+    }
+  }
+
   net::HostResolver* global_host_resolver =
-      net::CreateSystemHostResolver(parallelism, net_log);
+      net::CreateSystemHostResolver(parallelism, resolver_proc.get(), net_log);
 
   // Determine if we should disable IPv6 support.
   if (!command_line.HasSwitch(switches::kEnableIPv6)) {