13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_IO_THREAD_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_IO_THREAD_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <list>
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <string>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process_sub_thread.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prefs/pref_member.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/net/predictor_common.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/network_change_notifier.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ChromeNetLog;
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ChromeURLRequestContextGetter;
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass ExtensionEventRouterForwarder;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ListValue;
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass PrefProxyConfigTracker;
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass PrefService;
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass SystemURLRequestContextGetter;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chrome_browser_net {
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ConnectInterceptor;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Predictor;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chrome_browser_net
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass CertVerifier;
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass DnsRRResolver;
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass FtpTransactionFactory;
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass HostResolver;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HttpAuthHandlerFactory;
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass HttpTransactionFactory;
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass NetworkDelegate;
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ProxyConfigService;
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ProxyScriptFetcher;
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass ProxyService;
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass SSLConfigService;
443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass URLRequestContext;
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass URLRequestContextGetter;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass URLSecurityManager;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace net
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass IOThread : public BrowserProcessSubThread {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Globals {
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Globals();
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ~Globals();
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // The "system" NetworkDelegate, used for Profile-agnostic network events.
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_ptr<net::NetworkDelegate> system_network_delegate;
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    scoped_ptr<net::HostResolver> host_resolver;
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    scoped_ptr<net::CertVerifier> cert_verifier;
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    scoped_ptr<net::DnsRRResolver> dnsrr_resolver;
6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    scoped_refptr<net::SSLConfigService> ssl_config_service;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    scoped_refptr<net::ProxyService> proxy_script_fetcher_proxy_service;
6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    scoped_ptr<net::HttpTransactionFactory>
6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        proxy_script_fetcher_http_transaction_factory;
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<net::FtpTransactionFactory>
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        proxy_script_fetcher_ftp_transaction_factory;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_ptr<net::URLSecurityManager> url_security_manager;
683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    scoped_refptr<net::URLRequestContext> proxy_script_fetcher_context;
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<net::HttpTransactionFactory> system_http_transaction_factory;
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<net::FtpTransactionFactory> system_ftp_transaction_factory;
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_refptr<net::ProxyService> system_proxy_service;
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // NOTE(willchan): This request context is unusable until a system
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // SSLConfigService is provided that doesn't rely on
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Profiles. Do NOT use this yet.
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_refptr<net::URLRequestContext> system_request_context;
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<ExtensionEventRouterForwarder>
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        extension_event_router_forwarder;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // |net_log| must either outlive the IOThread or be NULL.
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  IOThread(PrefService* local_state,
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen           ChromeNetLog* net_log,
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen           ExtensionEventRouterForwarder* extension_event_router_forwarder);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~IOThread();
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Can only be called on the IO thread.
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Globals* globals();
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ChromeNetLog* net_log();
9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initializes the network predictor, which induces DNS pre-resolution and/or
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TCP/IP preconnections.  |prefetching_enabled| indicates whether or not DNS
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // prefetching should be enabled, and |preconnect_enabled| controls whether
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TCP/IP preconnection is enabled.  This should be called by the UI thread.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // It will post a task to the IO thread to perform the actual initialization.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InitNetworkPredictor(bool prefetching_enabled,
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            base::TimeDelta max_dns_queue_delay,
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            size_t max_speculative_parallel_resolves,
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const chrome_common_net::UrlList& startup_urls,
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            ListValue* referral_list,
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            bool preconnect_enabled);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Registers |url_request_context_getter| into the IO thread.  During
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // IOThread::CleanUp(), IOThread will iterate through known getters and
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // release their URLRequestContexts.  Only called on the IO thread.  It does
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // not acquire a refcount for |url_request_context_getter|.  If
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // |url_request_context_getter| is being deleted before IOThread::CleanUp() is
109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // invoked, then this needs to be balanced with a call to
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // UnregisterURLRequestContextGetter().
111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void RegisterURLRequestContextGetter(
112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      ChromeURLRequestContextGetter* url_request_context_getter);
113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Unregisters |url_request_context_getter| from the IO thread.  Only called
115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // on the IO thread.
116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void UnregisterURLRequestContextGetter(
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      ChromeURLRequestContextGetter* url_request_context_getter);
118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Handles changing to On The Record mode, discarding confidential data.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ChangedToOnTheRecord();
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns a getter for the URLRequestContext.  Only called on the UI thread.
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::URLRequestContextGetter* system_url_request_context_getter();
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Clear all network stack history, including the host cache, as well as
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // speculative data about subresources of visited sites, and startup-time
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // navigations.
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ClearNetworkingHistory();
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Init();
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CleanUp();
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Provide SystemURLRequestContextGetter with access to
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // InitSystemRequestContext().
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class SystemURLRequestContextGetter;
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static void RegisterPrefs(PrefService* local_state);
1404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      net::HostResolver* resolver);
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Lazy initialization of system request context for
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // SystemURLRequestContextGetter. To be called on IO thread.
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void InitSystemRequestContext();
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InitNetworkPredictorOnIOThread(
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bool prefetching_enabled,
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      base::TimeDelta max_dns_queue_delay,
151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      size_t max_speculative_parallel_resolves,
152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      const chrome_common_net::UrlList& startup_urls,
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ListValue* referral_list,
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bool preconnect_enabled);
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ChangedToOnTheRecordOnIOThread();
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Clears the host cache.  Intended to be used to prevent exposing recently
159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // visited sites on about:net-internals/#dns and about:dns pages.  Must be
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // called on the IO thread.
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ClearHostCache();
162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
16321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // The NetLog is owned by the browser process, to allow logging from other
16421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // threads during shutdown, but is used most frequently on the IOThread.
16521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ChromeNetLog* net_log_;
16621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The ExtensionEventRouterForwarder allows for sending events to extensions
168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // from the IOThread.
169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ExtensionEventRouterForwarder* extension_event_router_forwarder_;
170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These member variables are basically global, but their lifetimes are tied
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to the IOThread.  IOThread owns them all, despite not using scoped_ptr.
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is because the destructor of IOThread runs on the wrong thread.  All
17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // member variables should be deleted in CleanUp().
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These member variables are initialized in Init() and do not change for the
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // lifetime of the IO thread.
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Globals* globals_;
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Observer that logs network changes to the ChromeNetLog.
182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  scoped_ptr<net::NetworkChangeNotifier::IPAddressObserver>
183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      network_change_observer_;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BooleanPrefMember system_enable_referrers_;
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Store HTTP Auth-related policies in this thread.
1884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string auth_schemes_;
1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool negotiate_disable_cname_lookup_;
1904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool negotiate_enable_port_;
1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string auth_server_whitelist_;
1924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string auth_delegate_whitelist_;
1934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string gssapi_library_name_;
1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These member variables are initialized by a task posted to the IO thread,
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // which gets posted by calling certain member functions of IOThread.
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Note: we user explicit pointers rather than smart pointers to be more
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // explicit about destruction order, and ensure that there is no chance that
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // these observers would be used accidentally after we have begun to tear
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // down.
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome_browser_net::ConnectInterceptor* speculative_interceptor_;
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome_browser_net::Predictor* predictor_;
204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<net::ProxyConfigService> system_proxy_config_service_;
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<net::URLRequestContextGetter>
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      system_url_request_context_getter_;
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
212513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Keeps track of all live ChromeURLRequestContextGetters, so the
213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // ChromeURLRequestContexts can be released during
214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // IOThread::CleanUp().
215513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::list<ChromeURLRequestContextGetter*> url_request_context_getters_;
216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(IOThread);
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_IO_THREAD_H_
221