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