Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Side by Side Diff: chrome/browser/profiles/off_the_record_profile_io_data.cc

Issue 6201005: Initial support for partitioning cookies for isolated apps. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add ChromeURLRequestContext::Copy. Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/profiles/off_the_record_profile_io_data.h" 5 #include "chrome/browser/profiles/off_the_record_profile_io_data.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "build/build_config.h" 9 #include "build/build_config.h"
10 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/browser_process.h"
11 #include "chrome/browser/io_thread.h" 11 #include "chrome/browser/io_thread.h"
12 #include "chrome/browser/net/chrome_cookie_policy.h" 12 #include "chrome/browser/net/chrome_cookie_policy.h"
13 #include "chrome/browser/net/chrome_dns_cert_provenance_checker_factory.h" 13 #include "chrome/browser/net/chrome_dns_cert_provenance_checker_factory.h"
14 #include "chrome/browser/net/chrome_net_log.h" 14 #include "chrome/browser/net/chrome_net_log.h"
15 #include "chrome/browser/net/chrome_network_delegate.h" 15 #include "chrome/browser/net/chrome_network_delegate.h"
16 #include "chrome/browser/net/chrome_url_request_context.h" 16 #include "chrome/browser/net/chrome_url_request_context.h"
17 #include "chrome/common/extensions/extension.h"
17 #include "chrome/common/url_constants.h" 18 #include "chrome/common/url_constants.h"
18 #include "content/browser/browser_thread.h" 19 #include "content/browser/browser_thread.h"
19 #include "net/ftp/ftp_network_layer.h" 20 #include "net/ftp/ftp_network_layer.h"
20 #include "net/http/http_cache.h" 21 #include "net/http/http_cache.h"
21 22
22 OffTheRecordProfileIOData::Handle::Handle(Profile* profile) 23 OffTheRecordProfileIOData::Handle::Handle(Profile* profile)
23 : io_data_(new OffTheRecordProfileIOData), 24 : io_data_(new OffTheRecordProfileIOData),
24 profile_(profile), 25 profile_(profile),
25 initialized_(false) { 26 initialized_(false) {
26 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 27 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
27 DCHECK(profile); 28 DCHECK(profile);
28 DCHECK(!io_data_->lazy_params_.get()); 29 DCHECK(!io_data_->lazy_params_.get());
29 LazyParams* lazy_params = new LazyParams; 30 LazyParams* lazy_params = new LazyParams;
30 lazy_params->io_thread = g_browser_process->io_thread(); 31 lazy_params->io_thread = g_browser_process->io_thread();
31 io_data_->lazy_params_.reset(lazy_params); 32 io_data_->lazy_params_.reset(lazy_params);
32 } 33 }
33 34
34 OffTheRecordProfileIOData::Handle::~Handle() { 35 OffTheRecordProfileIOData::Handle::~Handle() {
35 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 36 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
36 if (main_request_context_getter_) 37 if (main_request_context_getter_)
37 main_request_context_getter_->CleanupOnUIThread(); 38 main_request_context_getter_->CleanupOnUIThread();
38 if (extensions_request_context_getter_) 39 if (extensions_request_context_getter_)
39 extensions_request_context_getter_->CleanupOnUIThread(); 40 extensions_request_context_getter_->CleanupOnUIThread();
41
42 // Clean up all isolated app request contexts.
43 for (ChromeURLRequestContextGetterMap::iterator iter =
44 app_request_context_getter_map_.begin();
45 iter != app_request_context_getter_map_.end();
46 ++iter) {
47 iter->second->CleanupOnUIThread();
48 }
40 } 49 }
41 50
42 scoped_refptr<ChromeURLRequestContextGetter> 51 scoped_refptr<ChromeURLRequestContextGetter>
43 OffTheRecordProfileIOData::Handle::GetMainRequestContextGetter() const { 52 OffTheRecordProfileIOData::Handle::GetMainRequestContextGetter() const {
44 // TODO(oshima): Re-enable when ChromeOS only accesses the profile on the UI 53 // TODO(oshima): Re-enable when ChromeOS only accesses the profile on the UI
45 // thread. 54 // thread.
46 #if !defined(OS_CHROMEOS) 55 #if !defined(OS_CHROMEOS)
47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
48 #endif // defined(OS_CHROMEOS) 57 #endif // defined(OS_CHROMEOS)
49 LazyInitialize(); 58 LazyInitialize();
50 if (!main_request_context_getter_) { 59 if (!main_request_context_getter_) {
51 main_request_context_getter_ = 60 main_request_context_getter_ =
52 ChromeURLRequestContextGetter::CreateOffTheRecord(profile_, io_data_); 61 ChromeURLRequestContextGetter::CreateOffTheRecord(profile_, io_data_);
53 } 62 }
54 return main_request_context_getter_; 63 return main_request_context_getter_;
55 } 64 }
56 65
57 scoped_refptr<ChromeURLRequestContextGetter> 66 scoped_refptr<ChromeURLRequestContextGetter>
58 OffTheRecordProfileIOData::Handle::GetExtensionsRequestContextGetter() const { 67 OffTheRecordProfileIOData::Handle::GetExtensionsRequestContextGetter() const {
59 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 68 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
60 LazyInitialize(); 69 LazyInitialize();
61 if (!extensions_request_context_getter_) { 70 if (!extensions_request_context_getter_) {
62 extensions_request_context_getter_ = 71 extensions_request_context_getter_ =
63 ChromeURLRequestContextGetter::CreateOffTheRecordForExtensions( 72 ChromeURLRequestContextGetter::CreateOffTheRecordForExtensions(
64 profile_, io_data_); 73 profile_, io_data_);
65 } 74 }
66 return extensions_request_context_getter_; 75 return extensions_request_context_getter_;
67 } 76 }
68 77
78 scoped_refptr<ChromeURLRequestContextGetter>
79 OffTheRecordProfileIOData::Handle::GetIsolatedAppRequestContextGetter(
80 const Extension* installed_app) const {
81 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
82 CHECK(installed_app);
83 LazyInitialize();
84
85 // Keep a map of request context getters, one per requested app ID.
86 std::string id = installed_app->id();
87 ChromeURLRequestContextGetterMap::iterator iter =
88 app_request_context_getter_map_.find(id);
89 if (iter != app_request_context_getter_map_.end())
90 return iter->second;
91
92 ChromeURLRequestContextGetter* context =
93 ChromeURLRequestContextGetter::CreateOffTheRecordForIsolatedApp(
94 profile_, io_data_, installed_app);
95 app_request_context_getter_map_[id] = context;
96
97 return context;
98 }
99
69 void OffTheRecordProfileIOData::Handle::LazyInitialize() const { 100 void OffTheRecordProfileIOData::Handle::LazyInitialize() const {
70 if (!initialized_) { 101 if (!initialized_) {
71 InitializeProfileParams(profile_, &io_data_->lazy_params_->profile_params); 102 InitializeProfileParams(profile_, &io_data_->lazy_params_->profile_params);
72 initialized_ = true; 103 initialized_ = true;
73 } 104 }
74 } 105 }
75 106
76 OffTheRecordProfileIOData::LazyParams::LazyParams() : io_thread(NULL) {} 107 OffTheRecordProfileIOData::LazyParams::LazyParams() : io_thread(NULL) {}
77 OffTheRecordProfileIOData::LazyParams::~LazyParams() {} 108 OffTheRecordProfileIOData::LazyParams::~LazyParams() {}
78 109
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 154
124 main_request_context_->set_proxy_service( 155 main_request_context_->set_proxy_service(
125 CreateProxyService( 156 CreateProxyService(
126 io_thread->net_log(), 157 io_thread->net_log(),
127 io_thread_globals->proxy_script_fetcher_context.get(), 158 io_thread_globals->proxy_script_fetcher_context.get(),
128 lazy_params_->profile_params.proxy_config_service.release(), 159 lazy_params_->profile_params.proxy_config_service.release(),
129 command_line)); 160 command_line));
130 161
131 main_request_context_->set_cookie_store( 162 main_request_context_->set_cookie_store(
132 new net::CookieMonster(NULL, profile_params.cookie_monster_delegate)); 163 new net::CookieMonster(NULL, profile_params.cookie_monster_delegate));
164 main_request_context_->set_cookie_delegate(
165 profile_params.cookie_monster_delegate);
133 // All we care about for extensions is the cookie store. For incognito, we 166 // All we care about for extensions is the cookie store. For incognito, we
134 // use a non-persistent cookie store. 167 // use a non-persistent cookie store.
135 168
136 net::CookieMonster* extensions_cookie_store = 169 net::CookieMonster* extensions_cookie_store =
137 new net::CookieMonster(NULL, NULL); 170 new net::CookieMonster(NULL, NULL);
138 // Enable cookies for devtools and extension URLs. 171 // Enable cookies for devtools and extension URLs.
139 const char* schemes[] = {chrome::kChromeDevToolsScheme, 172 const char* schemes[] = {chrome::kChromeDevToolsScheme,
140 chrome::kExtensionScheme}; 173 chrome::kExtensionScheme};
141 extensions_cookie_store->SetCookieableSchemes(schemes, 2); 174 extensions_cookie_store->SetCookieableSchemes(schemes, 2);
142 175
(...skipping 13 matching lines...) Expand all
156 main_request_context_->network_delegate(), 189 main_request_context_->network_delegate(),
157 main_request_context_->net_log(), 190 main_request_context_->net_log(),
158 main_backend); 191 main_backend);
159 192
160 main_http_factory_.reset(cache); 193 main_http_factory_.reset(cache);
161 main_request_context_->set_http_transaction_factory(cache); 194 main_request_context_->set_http_transaction_factory(cache);
162 main_request_context_->set_ftp_transaction_factory( 195 main_request_context_->set_ftp_transaction_factory(
163 new net::FtpNetworkLayer(main_request_context_->host_resolver())); 196 new net::FtpNetworkLayer(main_request_context_->host_resolver()));
164 } 197 }
165 198
199 scoped_refptr<ProfileIOData::RequestContext>
200 OffTheRecordProfileIOData::InitializeAppRequestContext(
201 scoped_refptr<ChromeURLRequestContext> main_context,
202 const Extension *app) const {
203 scoped_refptr<ProfileIOData::RequestContext> context = new RequestContext;
204
205 // Copy most state from the main context.
206 main_context->Copy(context);
willchan no longer on Chromium 2011/03/03 18:16:59 As I read this now, I realize that Copy() makes it
Charlie Reis 2011/03/04 22:34:53 Fixed.
207
208 // Use a separate in-memory cookie store for the app.
209 context->set_cookie_store(
210 new net::CookieMonster(NULL, main_context->cookie_delegate()));
211 context->set_cookie_delegate(main_context->cookie_delegate());
willchan no longer on Chromium 2011/03/03 18:16:59 Rather than forcing cookie_delegate to be a member
Charlie Reis 2011/03/04 22:34:53 Hmm, this is a tricky question to answer, since th
212
213 // Use a separate in-memory cache for the app.
214 net::HttpCache::BackendFactory* app_backend =
215 net::HttpCache::DefaultBackend::InMemory(0);
216 net::HttpNetworkSession* main_network_session =
217 main_http_factory_->GetSession();
218 net::HttpCache* app_cache =
willchan no longer on Chromium 2011/03/03 18:16:59 app_cache is used elsewhere in ChromeURLRequestCon
Charlie Reis 2011/03/04 22:34:53 Done.
219 new net::HttpCache(main_network_session, app_backend);
220 context->set_http_transaction_factory(app_cache);
willchan no longer on Chromium 2011/03/03 18:16:59 Are you leaking the HttpCache? Note that URLReque
Charlie Reis 2011/03/04 22:34:53 Ah! That answers my question from before about wh
221
222 return context;
223 }
224
166 scoped_refptr<ChromeURLRequestContext> 225 scoped_refptr<ChromeURLRequestContext>
167 OffTheRecordProfileIOData::AcquireMainRequestContext() const { 226 OffTheRecordProfileIOData::AcquireMainRequestContext() const {
168 DCHECK(main_request_context_); 227 DCHECK(main_request_context_);
169 scoped_refptr<ChromeURLRequestContext> context = main_request_context_; 228 scoped_refptr<ChromeURLRequestContext> context = main_request_context_;
170 main_request_context_->set_profile_io_data(this); 229 main_request_context_->set_profile_io_data(this);
171 main_request_context_ = NULL; 230 main_request_context_ = NULL;
172 return context; 231 return context;
173 } 232 }
174 233
175 scoped_refptr<ChromeURLRequestContext> 234 scoped_refptr<ChromeURLRequestContext>
176 OffTheRecordProfileIOData::AcquireMediaRequestContext() const { 235 OffTheRecordProfileIOData::AcquireMediaRequestContext() const {
177 NOTREACHED(); 236 NOTREACHED();
178 return NULL; 237 return NULL;
179 } 238 }
180 239
181 scoped_refptr<ChromeURLRequestContext> 240 scoped_refptr<ChromeURLRequestContext>
182 OffTheRecordProfileIOData::AcquireExtensionsRequestContext() const { 241 OffTheRecordProfileIOData::AcquireExtensionsRequestContext() const {
183 DCHECK(extensions_request_context_); 242 DCHECK(extensions_request_context_);
184 scoped_refptr<ChromeURLRequestContext> context = extensions_request_context_; 243 scoped_refptr<ChromeURLRequestContext> context = extensions_request_context_;
185 extensions_request_context_->set_profile_io_data(this); 244 extensions_request_context_->set_profile_io_data(this);
186 extensions_request_context_ = NULL; 245 extensions_request_context_ = NULL;
187 return context; 246 return context;
188 } 247 }
248
249 scoped_refptr<ChromeURLRequestContext>
250 OffTheRecordProfileIOData::AcquireIsolatedAppRequestContext(
251 scoped_refptr<ChromeURLRequestContext> main_context,
252 const Extension* installed_app) const {
253 // We create per-app contexts on demand, unlike the others above.
254 scoped_refptr<RequestContext> app_request_context =
255 InitializeAppRequestContext(main_context, installed_app);
256 DCHECK(app_request_context);
257 app_request_context->set_profile_io_data(this);
258 return app_request_context;
259 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698