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

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

Issue 10969017: Create a new URLRequestJobFactory for isolated request contexts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comment fixes. Created 8 years, 3 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
11 #include "base/threading/worker_pool.h" 11 #include "base/threading/worker_pool.h"
12 #include "build/build_config.h" 12 #include "build/build_config.h"
13 #include "chrome/browser/browser_process.h" 13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/custom_handlers/protocol_handler_registry.h"
15 #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
14 #include "chrome/browser/io_thread.h" 16 #include "chrome/browser/io_thread.h"
15 #include "chrome/browser/net/about_protocol_handler.h" 17 #include "chrome/browser/net/about_protocol_handler.h"
16 #include "chrome/browser/net/chrome_net_log.h" 18 #include "chrome/browser/net/chrome_net_log.h"
17 #include "chrome/browser/net/chrome_url_request_context.h" 19 #include "chrome/browser/net/chrome_url_request_context.h"
18 #include "chrome/browser/prefs/pref_service.h" 20 #include "chrome/browser/prefs/pref_service.h"
19 #include "chrome/browser/profiles/profile.h" 21 #include "chrome/browser/profiles/profile.h"
20 #include "chrome/browser/ui/webui/chrome_url_data_manager_backend.h" 22 #include "chrome/browser/ui/webui/chrome_url_data_manager_backend.h"
21 #include "chrome/common/chrome_switches.h" 23 #include "chrome/common/chrome_switches.h"
22 #include "chrome/common/extensions/extension.h" 24 #include "chrome/common/extensions/extension.h"
23 #include "chrome/common/pref_names.h" 25 #include "chrome/common/pref_names.h"
24 #include "chrome/common/url_constants.h" 26 #include "chrome/common/url_constants.h"
25 #include "content/public/browser/browser_thread.h" 27 #include "content/public/browser/browser_thread.h"
26 #include "content/public/browser/resource_context.h" 28 #include "content/public/browser/resource_context.h"
27 #include "net/base/default_server_bound_cert_store.h" 29 #include "net/base/default_server_bound_cert_store.h"
28 #include "net/base/server_bound_cert_service.h" 30 #include "net/base/server_bound_cert_service.h"
29 #include "net/ftp/ftp_network_layer.h" 31 #include "net/ftp/ftp_network_layer.h"
30 #include "net/http/http_cache.h" 32 #include "net/http/http_cache.h"
31 #include "net/http/http_network_session.h" 33 #include "net/http/http_network_session.h"
32 #include "net/http/http_server_properties_impl.h" 34 #include "net/http/http_server_properties_impl.h"
33 #include "net/url_request/file_protocol_handler.h"
34 #include "net/url_request/ftp_protocol_handler.h"
35 #include "net/url_request/url_request_job_factory_impl.h" 35 #include "net/url_request/url_request_job_factory_impl.h"
36 #include "webkit/database/database_tracker.h" 36 #include "webkit/database/database_tracker.h"
37 37
38 using content::BrowserThread; 38 using content::BrowserThread;
39 39
40 OffTheRecordProfileIOData::Handle::Handle(Profile* profile) 40 OffTheRecordProfileIOData::Handle::Handle(Profile* profile)
41 : io_data_(new OffTheRecordProfileIOData), 41 : io_data_(new OffTheRecordProfileIOData),
42 profile_(profile), 42 profile_(profile),
43 initialized_(false) { 43 initialized_(false) {
44 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 44 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
122 DCHECK(!app_id.empty()); 122 DCHECK(!app_id.empty());
123 LazyInitialize(); 123 LazyInitialize();
124 124
125 // Keep a map of request context getters, one per requested app ID. 125 // Keep a map of request context getters, one per requested app ID.
126 ChromeURLRequestContextGetterMap::iterator iter = 126 ChromeURLRequestContextGetterMap::iterator iter =
127 app_request_context_getter_map_.find(app_id); 127 app_request_context_getter_map_.find(app_id);
128 if (iter != app_request_context_getter_map_.end()) 128 if (iter != app_request_context_getter_map_.end())
129 return iter->second; 129 return iter->second;
130 130
131 scoped_ptr<net::URLRequestJobFactory::Interceptor>
132 protocol_handler_interceptor(
133 ProtocolHandlerRegistryFactory::GetForProfile(profile_)->
134 CreateURLInterceptor());
131 ChromeURLRequestContextGetter* context = 135 ChromeURLRequestContextGetter* context =
132 ChromeURLRequestContextGetter::CreateOffTheRecordForIsolatedApp( 136 ChromeURLRequestContextGetter::CreateOffTheRecordForIsolatedApp(
133 profile_, io_data_, app_id); 137 profile_, io_data_, app_id, protocol_handler_interceptor.Pass());
134 app_request_context_getter_map_[app_id] = context; 138 app_request_context_getter_map_[app_id] = context;
135 139
136 return context; 140 return context;
137 } 141 }
138 142
139 void OffTheRecordProfileIOData::Handle::LazyInitialize() const { 143 void OffTheRecordProfileIOData::Handle::LazyInitialize() const {
140 if (initialized_) 144 if (initialized_)
141 return; 145 return;
142 146
143 // Set initialized_ to true at the beginning in case any of the objects 147 // Set initialized_ to true at the beginning in case any of the objects
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 main_context->set_http_transaction_factory(cache); 231 main_context->set_http_transaction_factory(cache);
228 #if !defined(DISABLE_FTP_SUPPORT) 232 #if !defined(DISABLE_FTP_SUPPORT)
229 ftp_factory_.reset( 233 ftp_factory_.reset(
230 new net::FtpNetworkLayer(main_context->host_resolver())); 234 new net::FtpNetworkLayer(main_context->host_resolver()));
231 main_context->set_ftp_transaction_factory(ftp_factory_.get()); 235 main_context->set_ftp_transaction_factory(ftp_factory_.get());
232 #endif // !defined(DISABLE_FTP_SUPPORT) 236 #endif // !defined(DISABLE_FTP_SUPPORT)
233 237
234 main_context->set_chrome_url_data_manager_backend( 238 main_context->set_chrome_url_data_manager_backend(
235 chrome_url_data_manager_backend()); 239 chrome_url_data_manager_backend());
236 240
237 main_job_factory_.reset(new net::URLRequestJobFactoryImpl); 241 main_job_factory_.reset(new net::URLRequestJobFactoryImpl());
238 extensions_job_factory_.reset(new net::URLRequestJobFactoryImpl); 242 extensions_job_factory_.reset(new net::URLRequestJobFactoryImpl());
239 243
240 int set_protocol = main_job_factory_->SetProtocolHandler( 244 SetUpJobFactoryDefaults(
241 chrome::kFileScheme, new net::FileProtocolHandler()); 245 main_job_factory_.get(),
242 DCHECK(set_protocol); 246 profile_params->protocol_handler_interceptor.Pass(),
243 // TODO(shalev): The extension_job_factory_ has a NULL NetworkDelegate. 247 network_delegate(),
248 main_context->ftp_transaction_factory(),
249 main_context->ftp_auth_cache());
250 // TODO(shalev): The extensions_job_factory has a NULL NetworkDelegate.
244 // Without a network_delegate, this protocol handler will never 251 // Without a network_delegate, this protocol handler will never
245 // handle file: requests, but as a side effect it makes 252 // handle file: requests, but as a side effect it makes
246 // job_factory::IsHandledProtocol return true, which prevents attempts to 253 // job_factory::IsHandledProtocol return true, which prevents attempts to
247 // handle the protocol externally. 254 // handle the protocol externally. We pass NULL in to
248 set_protocol = extensions_job_factory_->SetProtocolHandler( 255 // SetUpJobFactoryDefaults() to get this effect.
249 chrome::kFileScheme, new net::FileProtocolHandler()); 256 SetUpJobFactoryDefaults(
250 DCHECK(set_protocol); 257 extensions_job_factory_.get(),
251 258 scoped_ptr<net::URLRequestJobFactoryImpl::Interceptor>(NULL),
252 set_protocol = main_job_factory_->SetProtocolHandler( 259 NULL,
253 chrome::kChromeDevToolsScheme, 260 extensions_context->ftp_transaction_factory(),
254 CreateDevToolsProtocolHandler(chrome_url_data_manager_backend(), 261 extensions_context->ftp_auth_cache());
255 network_delegate()));
256 DCHECK(set_protocol);
257 set_protocol = extensions_job_factory_->SetProtocolHandler(
258 chrome::kChromeDevToolsScheme,
259 CreateDevToolsProtocolHandler(chrome_url_data_manager_backend(), NULL));
260 DCHECK(set_protocol);
261
262 net::URLRequestJobFactory* job_factories[2];
263 job_factories[0] = main_job_factory_.get();
264 job_factories[1] = extensions_job_factory_.get();
265
266 net::FtpAuthCache* ftp_auth_caches[2];
267 ftp_auth_caches[0] = main_context->ftp_auth_cache();
268 ftp_auth_caches[1] = extensions_context->ftp_auth_cache();
269
270 for (int i = 0; i < 2; i++) {
271 SetUpJobFactoryDefaults(job_factories[i]);
272 job_factories[i]->SetProtocolHandler(chrome::kAboutScheme,
273 new net::AboutProtocolHandler());
274 CreateFtpProtocolHandler(job_factories[i], ftp_auth_caches[i]);
275 }
276 262
277 main_context->set_job_factory(main_job_factory_.get()); 263 main_context->set_job_factory(main_job_factory_.get());
278 extensions_context->set_job_factory(extensions_job_factory_.get()); 264 extensions_context->set_job_factory(extensions_job_factory_.get());
279 } 265 }
280 266
281 ChromeURLRequestContext* 267 ChromeURLRequestContext*
282 OffTheRecordProfileIOData::InitializeAppRequestContext( 268 OffTheRecordProfileIOData::InitializeAppRequestContext(
283 ChromeURLRequestContext* main_context, 269 ChromeURLRequestContext* main_context,
284 const std::string& app_id) const { 270 const std::string& app_id,
271 scoped_ptr<net::URLRequestJobFactory::Interceptor>
272 protocol_handler_interceptor) const {
285 AppRequestContext* context = new AppRequestContext(load_time_stats()); 273 AppRequestContext* context = new AppRequestContext(load_time_stats());
286 274
287 // Copy most state from the main context. 275 // Copy most state from the main context.
288 context->CopyFrom(main_context); 276 context->CopyFrom(main_context);
289 277
290 // Use a separate in-memory cookie store for the app. 278 // Use a separate in-memory cookie store for the app.
291 // TODO(creis): We should have a cookie delegate for notifying the cookie 279 // TODO(creis): We should have a cookie delegate for notifying the cookie
292 // extensions API, but we need to update it to understand isolated apps first. 280 // extensions API, but we need to update it to understand isolated apps first.
293 context->SetCookieStore(new net::CookieMonster(NULL, NULL)); 281 context->SetCookieStore(new net::CookieMonster(NULL, NULL));
294 282
295 // Use a separate in-memory cache for the app. 283 // Use a separate in-memory cache for the app.
296 net::HttpCache::BackendFactory* app_backend = 284 net::HttpCache::BackendFactory* app_backend =
297 net::HttpCache::DefaultBackend::InMemory(0); 285 net::HttpCache::DefaultBackend::InMemory(0);
298 net::HttpNetworkSession* main_network_session = 286 net::HttpNetworkSession* main_network_session =
299 main_http_factory_->GetSession(); 287 main_http_factory_->GetSession();
300 net::HttpCache* app_http_cache = 288 scoped_ptr<net::HttpTransactionFactory> app_http_cache(
301 new net::HttpCache(main_network_session, app_backend); 289 new net::HttpCache(main_network_session, app_backend));
302 290
303 context->SetHttpTransactionFactory(app_http_cache); 291 context->SetHttpTransactionFactory(app_http_cache.Pass());
292
293 scoped_ptr<net::URLRequestJobFactory> job_factory(
294 new net::URLRequestJobFactoryImpl());
295 SetUpJobFactoryDefaults(job_factory.get(),
296 protocol_handler_interceptor.Pass(),
297 network_delegate(),
298 context->ftp_transaction_factory(),
299 context->ftp_auth_cache());
300 context->SetJobFactory(job_factory.Pass());
304 return context; 301 return context;
305 } 302 }
306 303
307 ChromeURLRequestContext* 304 ChromeURLRequestContext*
308 OffTheRecordProfileIOData::InitializeMediaRequestContext( 305 OffTheRecordProfileIOData::InitializeMediaRequestContext(
309 ChromeURLRequestContext* original_context, 306 ChromeURLRequestContext* original_context,
310 const std::string& app_id) const { 307 const std::string& app_id) const {
311 NOTREACHED(); 308 NOTREACHED();
312 return NULL; 309 return NULL;
313 } 310 }
314 311
315 ChromeURLRequestContext* 312 ChromeURLRequestContext*
316 OffTheRecordProfileIOData::AcquireMediaRequestContext() const { 313 OffTheRecordProfileIOData::AcquireMediaRequestContext() const {
317 NOTREACHED(); 314 NOTREACHED();
318 return NULL; 315 return NULL;
319 } 316 }
320 317
321 ChromeURLRequestContext* 318 ChromeURLRequestContext*
322 OffTheRecordProfileIOData::AcquireIsolatedAppRequestContext( 319 OffTheRecordProfileIOData::AcquireIsolatedAppRequestContext(
323 ChromeURLRequestContext* main_context, 320 ChromeURLRequestContext* main_context,
324 const std::string& app_id) const { 321 const std::string& app_id,
322 scoped_ptr<net::URLRequestJobFactory::Interceptor>
323 protocol_handler_interceptor) const {
325 // We create per-app contexts on demand, unlike the others above. 324 // We create per-app contexts on demand, unlike the others above.
326 ChromeURLRequestContext* app_request_context = 325 ChromeURLRequestContext* app_request_context =
327 InitializeAppRequestContext(main_context, app_id); 326 InitializeAppRequestContext(main_context, app_id,
327 protocol_handler_interceptor.Pass());
328 DCHECK(app_request_context); 328 DCHECK(app_request_context);
329 return app_request_context; 329 return app_request_context;
330 } 330 }
331 331
332 ChromeURLRequestContext* 332 ChromeURLRequestContext*
333 OffTheRecordProfileIOData::AcquireIsolatedMediaRequestContext( 333 OffTheRecordProfileIOData::AcquireIsolatedMediaRequestContext(
334 ChromeURLRequestContext* app_context, 334 ChromeURLRequestContext* app_context,
335 const std::string& app_id) const { 335 const std::string& app_id) const {
336 NOTREACHED(); 336 NOTREACHED();
337 return NULL; 337 return NULL;
338 } 338 }
339 339
340 void OffTheRecordProfileIOData::CreateFtpProtocolHandler(
341 net::URLRequestJobFactory* job_factory,
342 net::FtpAuthCache* ftp_auth_cache) const {
343 #if !defined(DISABLE_FTP_SUPPORT)
344 job_factory->SetProtocolHandler(
345 chrome::kFtpScheme,
346 new net::FtpProtocolHandler(ftp_factory_.get(), ftp_auth_cache));
347 #endif // !defined(DISABLE_FTP_SUPPORT)
348 }
349
350 chrome_browser_net::LoadTimeStats* OffTheRecordProfileIOData::GetLoadTimeStats( 340 chrome_browser_net::LoadTimeStats* OffTheRecordProfileIOData::GetLoadTimeStats(
351 IOThread::Globals* io_thread_globals) const { 341 IOThread::Globals* io_thread_globals) const {
352 return NULL; 342 return NULL;
353 } 343 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698