• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_PROFILES_PROFILE_IMPL_IO_DATA_H_
6 #define CHROME_BROWSER_PROFILES_PROFILE_IMPL_IO_DATA_H_
7 #pragma once
8 
9 #include "base/basictypes.h"
10 #include "base/hash_tables.h"
11 #include "base/memory/ref_counted.h"
12 #include "chrome/browser/profiles/profile_io_data.h"
13 
14 namespace net {
15 class CookiePolicy;
16 class NetworkDelegate;
17 class DnsCertProvenanceChecker;
18 class HttpTransactionFactory;
19 }  // namespace net
20 
21 class ProfileImplIOData : public ProfileIOData {
22  public:
23   class Handle {
24    public:
25     explicit Handle(Profile* profile);
26     ~Handle();
27 
HasMainRequestContext()28     bool HasMainRequestContext() const {
29       return main_request_context_getter_ != NULL;
30     }
31 
32     // Init() must be called before ~Handle(). It records all the necessary
33     // parameters needed to construct a ChromeURLRequestContextGetter.
34     void Init(const FilePath& cookie_path,
35               const FilePath& cache_path,
36               int cache_max_size,
37               const FilePath& media_cache_path,
38               int media_cache_max_size,
39               const FilePath& extensions_cookie_path,
40               const FilePath& app_path);
41 
42     const content::ResourceContext& GetResourceContext() const;
43     scoped_refptr<ChromeURLRequestContextGetter>
44         GetMainRequestContextGetter() const;
45     scoped_refptr<ChromeURLRequestContextGetter>
46         GetMediaRequestContextGetter() const;
47     scoped_refptr<ChromeURLRequestContextGetter>
48         GetExtensionsRequestContextGetter() const;
49     scoped_refptr<ChromeURLRequestContextGetter>
50         GetIsolatedAppRequestContextGetter(
51             const std::string& app_id) const;
52 
53    private:
54     typedef base::hash_map<std::string,
55                            scoped_refptr<ChromeURLRequestContextGetter> >
56         ChromeURLRequestContextGetterMap;
57 
58     // Lazily initialize ProfileParams. We do this on the calls to
59     // Get*RequestContextGetter(), so we only initialize ProfileParams right
60     // before posting a task to the IO thread to start using them. This prevents
61     // objects that are supposed to be deleted on the IO thread, but are created
62     // on the UI thread from being unnecessarily initialized.
63     void LazyInitialize() const;
64 
65     // Ordering is important here. Do not reorder unless you know what you're
66     // doing. We need to release |io_data_| *before* the getters, because we
67     // want to make sure that the last reference for |io_data_| is on the IO
68     // thread. The getters will be deleted on the IO thread, so they will
69     // release their refs to their contexts, which will release the last refs to
70     // the ProfileIOData on the IO thread.
71     mutable scoped_refptr<ChromeURLRequestContextGetter>
72         main_request_context_getter_;
73     mutable scoped_refptr<ChromeURLRequestContextGetter>
74         media_request_context_getter_;
75     mutable scoped_refptr<ChromeURLRequestContextGetter>
76         extensions_request_context_getter_;
77     mutable ChromeURLRequestContextGetterMap app_request_context_getter_map_;
78     const scoped_refptr<ProfileImplIOData> io_data_;
79 
80     Profile* const profile_;
81 
82     mutable bool initialized_;
83 
84     DISALLOW_COPY_AND_ASSIGN(Handle);
85   };
86 
87  private:
88   friend class base::RefCountedThreadSafe<ProfileImplIOData>;
89 
90   struct LazyParams {
91     LazyParams();
92     ~LazyParams();
93 
94     // All of these parameters are intended to be read on the IO thread.
95     FilePath cookie_path;
96     FilePath cache_path;
97     int cache_max_size;
98     FilePath media_cache_path;
99     int media_cache_max_size;
100     FilePath extensions_cookie_path;
101   };
102 
103   typedef base::hash_map<std::string, net::HttpTransactionFactory* >
104       HttpTransactionFactoryMap;
105 
106   ProfileImplIOData();
107   virtual ~ProfileImplIOData();
108 
109   virtual void LazyInitializeInternal(ProfileParams* profile_params) const;
110   virtual scoped_refptr<RequestContext> InitializeAppRequestContext(
111       scoped_refptr<ChromeURLRequestContext> main_context,
112       const std::string& app_id) const;
113   virtual scoped_refptr<ChromeURLRequestContext>
114       AcquireMediaRequestContext() const;
115   virtual scoped_refptr<ChromeURLRequestContext>
116       AcquireIsolatedAppRequestContext(
117           scoped_refptr<ChromeURLRequestContext> main_context,
118           const std::string& app_id) const;
119 
120   // Lazy initialization params.
121   mutable scoped_ptr<LazyParams> lazy_params_;
122 
123   mutable scoped_refptr<RequestContext> media_request_context_;
124 
125   mutable scoped_ptr<net::HttpTransactionFactory> main_http_factory_;
126   mutable scoped_ptr<net::HttpTransactionFactory> media_http_factory_;
127 
128   // One HttpTransactionFactory per isolated app.
129   mutable HttpTransactionFactoryMap app_http_factory_map_;
130 
131   // Parameters needed for isolated apps.
132   FilePath app_path_;
133   mutable bool clear_local_state_on_exit_;
134 
135   DISALLOW_COPY_AND_ASSIGN(ProfileImplIOData);
136 };
137 
138 #endif  // CHROME_BROWSER_PROFILES_PROFILE_IMPL_IO_DATA_H_
139