io_thread.h revision 731df977c0511bca2206b5f333555b1205ff1f43
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 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
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <set>
10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/ref_counted.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/scoped_ptr.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process_sub_thread.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/chrome_network_delegate.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/net/predictor_common.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/network_change_notifier.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ChromeNetLog;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ListValue;
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass URLRequestContext;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chrome_browser_net {
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ConnectInterceptor;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Predictor;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chrome_browser_net
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass DnsRRResolver;
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass HostResolver;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HttpAuthHandlerFactory;
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ProxyScriptFetcher;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass URLSecurityManager;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace net
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass IOThread : public BrowserProcessSubThread {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Globals {
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Globals();
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ~Globals();
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_ptr<ChromeNetLog> net_log;
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    scoped_ptr<net::HostResolver> host_resolver;
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    scoped_ptr<net::DnsRRResolver> dnsrr_resolver;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_ptr<net::URLSecurityManager> url_security_manager;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ChromeNetworkDelegate network_delegate;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IOThread();
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~IOThread();
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Can only be called on the IO thread.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Globals* globals();
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initializes the network predictor, which induces DNS pre-resolution and/or
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TCP/IP preconnections.  |prefetching_enabled| indicates whether or not DNS
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // prefetching should be enabled, and |preconnect_enabled| controls whether
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TCP/IP preconnection is enabled.  This should be called by the UI thread.
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // It will post a task to the IO thread to perform the actual initialization.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InitNetworkPredictor(bool prefetching_enabled,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            base::TimeDelta max_dns_queue_delay,
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            size_t max_concurrent,
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const chrome_common_net::UrlList& startup_urls,
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            ListValue* referral_list,
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            bool preconnect_enabled);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handles changing to On The Record mode.  Posts a task for this onto the
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // IOThread's message loop.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ChangedToOnTheRecord();
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Creates a ProxyScriptFetcherImpl which will be automatically aborted
74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // during shutdown.
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This is used to avoid cycles between the ProxyScriptFetcher and the
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // URLRequestContext that owns it (indirectly via the ProxyService).
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  net::ProxyScriptFetcher* CreateAndRegisterProxyScriptFetcher(
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      URLRequestContext* url_request_context);
79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Init();
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CleanUp();
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CleanUpAfterMessageLoopDestruction();
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  class ManagedProxyScriptFetcher;
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  typedef std::set<ManagedProxyScriptFetcher*> ProxyScriptFetchers;
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      net::HostResolver* resolver);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InitNetworkPredictorOnIOThread(
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bool prefetching_enabled,
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      base::TimeDelta max_dns_queue_delay,
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      size_t max_concurrent,
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        const chrome_common_net::UrlList& startup_urls,
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ListValue* referral_list,
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bool preconnect_enabled);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ChangedToOnTheRecordOnIOThread();
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These member variables are basically global, but their lifetimes are tied
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to the IOThread.  IOThread owns them all, despite not using scoped_ptr.
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is because the destructor of IOThread runs on the wrong thread.  All
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // member variables should be deleted in CleanUp(), except ChromeNetLog
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // which is deleted later in CleanUpAfterMessageLoopDestruction().
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These member variables are initialized in Init() and do not change for the
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // lifetime of the IO thread.
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Globals* globals_;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This variable is only meaningful during shutdown. It is used to defer
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // deletion of the NetLog to CleanUpAfterMessageLoopDestruction() even
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // though |globals_| is reset by CleanUp().
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<ChromeNetLog> deferred_net_log_to_delete_;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Observer that logs network changes to the ChromeNetLog.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<net::NetworkChangeNotifier::Observer> network_change_observer_;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These member variables are initialized by a task posted to the IO thread,
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // which gets posted by calling certain member functions of IOThread.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Note: we user explicit pointers rather than smart pointers to be more
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // explicit about destruction order, and ensure that there is no chance that
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // these observers would be used accidentally after we have begun to tear
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // down.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome_browser_net::ConnectInterceptor* speculative_interceptor_;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome_browser_net::Predictor* predictor_;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // List of live ProxyScriptFetchers.
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ProxyScriptFetchers fetchers_;
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(IOThread);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_IO_THREAD_H_
139