172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef CHROME_BROWSER_PROFILES_PROFILE_IO_DATA_H_
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_PROFILES_PROFILE_IO_DATA_H_
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#pragma once
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <set>
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/basictypes.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/debug/stack_trace.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/file_path.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/synchronization/lock.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/net/chrome_url_request_context.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prefs/pref_member.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/profiles/profile.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/resource_context.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/cookie_monster.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass CommandLine;
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass ChromeAppCacheService;
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass ChromeBlobStorageContext;
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass ExtensionInfoMap;
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace fileapi {
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FileSystemContext;
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace fileapi
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass HostContentSettingsMap;
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass HostZoomMap;
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass IOThread;
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace net {
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass DnsCertProvenanceChecker;
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass NetLog;
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass ProxyConfigService;
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass ProxyService;
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass SSLConfigService;
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass TransportSecurityState;
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace net
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace prerender {
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass PrerenderManager;
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};  // namespace prerender
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ProtocolHandlerRegistry;
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace webkit_database {
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass DatabaseTracker;
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // webkit_database
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Conceptually speaking, the ProfileIOData represents data that lives on the IO
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// thread that is owned by a Profile, such as, but not limited to, network
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// objects like CookieMonster, HttpTransactionFactory, etc. The Profile
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// implementation will maintain a reference to the ProfileIOData. The
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// ProfileIOData will originally own a reference to the ChromeURLRequestContexts
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// that reference its members. When an accessor for a ChromeURLRequestContext is
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// invoked, then ProfileIOData will release its reference to the
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// ChromeURLRequestContext and the ChromeURLRequestContext will acquire a
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// reference to the ProfileIOData, so they exchange ownership. This is done
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// because it's possible for a context's accessor never to be invoked, so this
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// ownership reversal prevents shutdown leaks. ProfileIOData will lazily
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// initialize its members on the first invocation of a ChromeURLRequestContext
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// accessor.
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ProfileIOData : public base::RefCountedThreadSafe<ProfileIOData> {
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // These should only be called at most once each. Ownership is reversed when
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // they get called, from ProfileIOData owning ChromeURLRequestContext to vice
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // versa.
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<ChromeURLRequestContext> GetMainRequestContext() const;
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<ChromeURLRequestContext> GetMediaRequestContext() const;
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<ChromeURLRequestContext> GetExtensionsRequestContext() const;
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<ChromeURLRequestContext> GetIsolatedAppRequestContext(
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      scoped_refptr<ChromeURLRequestContext> main_context,
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& app_id) const;
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const content::ResourceContext& GetResourceContext() const;
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen protected:
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  friend class base::RefCountedThreadSafe<ProfileIOData>;
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  class RequestContext : public ChromeURLRequestContext {
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen   public:
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    RequestContext();
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ~RequestContext();
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Setter is used to transfer ownership of the ProfileIOData to the context.
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    void set_profile_io_data(const ProfileIOData* profile_io_data) {
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      profile_io_data_ = profile_io_data;
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen   private:
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<const ProfileIOData> profile_io_data_;
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Created on the UI thread, read on the IO thread during ProfileIOData lazy
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // initialization.
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  struct ProfileParams {
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ProfileParams();
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ~ProfileParams();
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    bool is_incognito;
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    bool clear_local_state_on_exit;
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::string accept_language;
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::string accept_charset;
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::string referrer_charset;
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    FilePath user_script_dir_path;
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IOThread* io_thread;
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<HostContentSettingsMap> host_content_settings_map;
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<HostZoomMap> host_zoom_map;
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<net::TransportSecurityState> transport_security_state;
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<net::SSLConfigService> ssl_config_service;
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<net::CookieMonster::Delegate> cookie_monster_delegate;
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<webkit_database::DatabaseTracker> database_tracker;
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<ChromeAppCacheService> appcache_service;
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<ChromeBlobStorageContext> blob_storage_context;
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<fileapi::FileSystemContext> file_system_context;
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<ExtensionInfoMap> extension_info_map;
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<prerender::PrerenderManager> prerender_manager;
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_refptr<ProtocolHandlerRegistry> protocol_handler_registry;
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // We need to initialize the ProxyConfigService from the UI thread
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // because on linux it relies on initializing things through gconf,
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // and needs to be on the main thread.
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    scoped_ptr<net::ProxyConfigService> proxy_config_service;
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // The profile this struct was populated from.
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ProfileId profile_id;
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  explicit ProfileIOData(bool is_incognito);
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~ProfileIOData();
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void InitializeProfileParams(Profile* profile);
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ApplyProfileParamsToContext(ChromeURLRequestContext* context) const;
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Lazy initializes the ProfileIOData object the first time a request context
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // is requested. The lazy logic is implemented here. The actual initialization
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // is done in LazyInitializeInternal(), implemented by subtypes. Static helper
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // functions have been provided to assist in common operations.
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void LazyInitialize() const;
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Called when the profile is destroyed.
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ShutdownOnUIThread();
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BooleanPrefMember* enable_referrers() const {
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return &enable_referrers_;
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::NetworkDelegate* network_delegate() const {
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return network_delegate_.get();
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::DnsCertProvenanceChecker* dns_cert_checker() const {
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return dns_cert_checker_.get();
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::ProxyService* proxy_service() const {
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return proxy_service_.get();
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::CookiePolicy* cookie_policy() const {
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return cookie_policy_.get();
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ChromeURLRequestContext* main_request_context() const {
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return main_request_context_;
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ChromeURLRequestContext* extensions_request_context() const {
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return extensions_request_context_;
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  class ResourceContext : public content::ResourceContext {
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   public:
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    explicit ResourceContext(const ProfileIOData* io_data);
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual ~ResourceContext();
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   private:
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual void EnsureInitialized() const;
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const ProfileIOData* const io_data_;
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // --------------------------------------------
180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Virtual interface for subtypes to implement:
181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // --------------------------------------------
182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Does the actual initialization of the ProfileIOData subtype. Subtypes
184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // should use the static helper functions above to implement this.
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void LazyInitializeInternal(ProfileParams* profile_params) const = 0;
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Does an on-demand initialization of a RequestContext for the given
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // isolated app.
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual scoped_refptr<RequestContext> InitializeAppRequestContext(
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      scoped_refptr<ChromeURLRequestContext> main_context,
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& app_id) const = 0;
192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // These functions are used to transfer ownership of the lazily initialized
194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // context from ProfileIOData to the URLRequestContextGetter.
195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual scoped_refptr<ChromeURLRequestContext>
196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      AcquireMediaRequestContext() const = 0;
197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual scoped_refptr<ChromeURLRequestContext>
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      AcquireIsolatedAppRequestContext(
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          scoped_refptr<ChromeURLRequestContext> main_context,
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          const std::string& app_id) const = 0;
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Tracks whether or not we've been lazily initialized.
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  mutable bool initialized_;
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Data from the UI thread from the Profile, used to initialize ProfileIOData.
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Deleted after lazy initialization.
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_ptr<ProfileParams> profile_params_;
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Member variables which are pointed to by the various context objects.
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable BooleanPrefMember enable_referrers_;
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Pointed to by URLRequestContext.
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_ptr<net::NetworkDelegate> network_delegate_;
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_ptr<net::DnsCertProvenanceChecker> dns_cert_checker_;
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_refptr<net::ProxyService> proxy_service_;
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_ptr<net::CookiePolicy> cookie_policy_;
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Pointed to by ResourceContext.
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_refptr<webkit_database::DatabaseTracker> database_tracker_;
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_refptr<ChromeAppCacheService> appcache_service_;
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_refptr<ChromeBlobStorageContext> blob_storage_context_;
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_refptr<fileapi::FileSystemContext> file_system_context_;
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable ResourceContext resource_context_;
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // These are only valid in between LazyInitialize() and their accessor being
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // called.
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_refptr<RequestContext> main_request_context_;
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mutable scoped_refptr<RequestContext> extensions_request_context_;
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(ProfileIOData);
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // CHROME_BROWSER_PROFILES_PROFILE_IO_DATA_H_
235