This is an extension of http://codereview.chromium.org/6280018 that provides a proxy configuration which respects command line parameters and policies

This was committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=78228, iyengar asked to commit again after fixing trunk.

BUG=67232,70732
TEST=Start chrome, observe two PROXY_CONFIG_CHANGED events in about:net-internals (if you are on a corporate network  with PAC configurations), observe that everything behaves as usual. In particular the https://www.google.com/searchdomaincheck?format=domain&type=chrome request should not fail as it uses the new system URLRequestContext.

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78362 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h
index d3bf4e7..2c8362dd 100644
--- a/chrome/browser/io_thread.h
+++ b/chrome/browser/io_thread.h
@@ -19,7 +19,10 @@
 class ChromeURLRequestContextGetter;
 class ExtensionEventRouterForwarder;
 class ListValue;
+class PrefProxyConfigTracker;
 class PrefService;
+class SystemURLRequestContextGetter;
+class URLRequestContextGetter;
 
 namespace chrome_browser_net {
 class ConnectInterceptor;
@@ -33,6 +36,7 @@
 class HttpAuthHandlerFactory;
 class HttpTransactionFactory;
 class NetworkDelegate;
+class ProxyConfigService;
 class ProxyScriptFetcher;
 class ProxyService;
 class SSLConfigService;
@@ -58,6 +62,12 @@
         proxy_script_fetcher_http_transaction_factory;
     scoped_ptr<net::URLSecurityManager> url_security_manager;
     scoped_refptr<net::URLRequestContext> proxy_script_fetcher_context;
+    scoped_ptr<net::HttpTransactionFactory> system_http_transaction_factory;
+    scoped_refptr<net::ProxyService> system_proxy_service;
+    // NOTE(willchan): This request context is unusable until a system
+    // SSLConfigService is provided that doesn't rely on
+    // Profiles. Do NOT use this yet.
+    scoped_refptr<net::URLRequestContext> system_request_context;
     scoped_refptr<ExtensionEventRouterForwarder>
         extension_event_router_forwarder;
   };
@@ -104,6 +114,9 @@
   // Handles changing to On The Record mode, discarding confidential data.
   void ChangedToOnTheRecord();
 
+  // Returns a getter for the URLRequestContext.  Only called on the UI thread.
+  URLRequestContextGetter* system_url_request_context_getter();
+
   // Clear all network stack history, including the host cache, as well as
   // speculative data about subresources of visited sites, and startup-time
   // navigations.
@@ -114,11 +127,19 @@
   virtual void CleanUp();
 
  private:
+  // Provide SystemURLRequestContextGetter with access to
+  // InitSystemRequestContext().
+  friend class SystemURLRequestContextGetter;
+
   static void RegisterPrefs(PrefService* local_state);
 
   net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(
       net::HostResolver* resolver);
 
+  // Lazy initialization of system request context for
+  // SystemURLRequestContextGetter. To be called on IO thread.
+  void InitSystemRequestContext();
+
   void InitNetworkPredictorOnIOThread(
       bool prefetching_enabled,
       base::TimeDelta max_dns_queue_delay,
@@ -174,6 +195,12 @@
   chrome_browser_net::ConnectInterceptor* speculative_interceptor_;
   chrome_browser_net::Predictor* predictor_;
 
+  scoped_ptr<net::ProxyConfigService> system_proxy_config_service_;
+
+  scoped_refptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
+
+  scoped_refptr<URLRequestContextGetter> system_url_request_context_getter_;
+
   // Keeps track of all live ChromeURLRequestContextGetters, so the
   // ChromeURLRequestContexts can be released during
   // IOThread::CleanUp().