| OLD | NEW |
| 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 Loading... |
| 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 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 PopulateNetworkSessionParams(profile_params, &network_session_params); | 226 PopulateNetworkSessionParams(profile_params, &network_session_params); |
| 223 net::HttpCache* cache = new net::HttpCache( | 227 net::HttpCache* cache = new net::HttpCache( |
| 224 network_session_params, main_backend); | 228 network_session_params, main_backend); |
| 225 | 229 |
| 226 main_http_factory_.reset(cache); | 230 main_http_factory_.reset(cache); |
| 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()); |
| 236 extensions_context->set_ftp_transaction_factory(ftp_factory_.get()); |
| 232 #endif // !defined(DISABLE_FTP_SUPPORT) | 237 #endif // !defined(DISABLE_FTP_SUPPORT) |
| 233 | 238 |
| 234 main_context->set_chrome_url_data_manager_backend( | 239 main_context->set_chrome_url_data_manager_backend( |
| 235 chrome_url_data_manager_backend()); | 240 chrome_url_data_manager_backend()); |
| 236 | 241 |
| 237 main_job_factory_.reset(new net::URLRequestJobFactoryImpl); | 242 main_job_factory_.reset(new net::URLRequestJobFactoryImpl()); |
| 238 extensions_job_factory_.reset(new net::URLRequestJobFactoryImpl); | 243 extensions_job_factory_.reset(new net::URLRequestJobFactoryImpl()); |
| 239 | 244 |
| 240 int set_protocol = main_job_factory_->SetProtocolHandler( | 245 SetUpJobFactoryDefaults( |
| 241 chrome::kFileScheme, new net::FileProtocolHandler()); | 246 main_job_factory_.get(), |
| 242 DCHECK(set_protocol); | 247 profile_params->protocol_handler_interceptor.Pass(), |
| 243 // TODO(shalev): The extension_job_factory_ has a NULL NetworkDelegate. | 248 network_delegate(), |
| 249 main_context->ftp_transaction_factory(), |
| 250 main_context->ftp_auth_cache()); |
| 251 // TODO(shalev): The extensions_job_factory has a NULL NetworkDelegate. |
| 244 // Without a network_delegate, this protocol handler will never | 252 // Without a network_delegate, this protocol handler will never |
| 245 // handle file: requests, but as a side effect it makes | 253 // handle file: requests, but as a side effect it makes |
| 246 // job_factory::IsHandledProtocol return true, which prevents attempts to | 254 // job_factory::IsHandledProtocol return true, which prevents attempts to |
| 247 // handle the protocol externally. | 255 // handle the protocol externally. We pass NULL in to |
| 248 set_protocol = extensions_job_factory_->SetProtocolHandler( | 256 // SetUpJobFactoryDefaults() to get this effect. |
| 249 chrome::kFileScheme, new net::FileProtocolHandler()); | 257 SetUpJobFactoryDefaults( |
| 250 DCHECK(set_protocol); | 258 extensions_job_factory_.get(), |
| 251 | 259 scoped_ptr<net::URLRequestJobFactoryImpl::Interceptor>(NULL), |
| 252 set_protocol = main_job_factory_->SetProtocolHandler( | 260 NULL, |
| 253 chrome::kChromeDevToolsScheme, | 261 extensions_context->ftp_transaction_factory(), |
| 254 CreateDevToolsProtocolHandler(chrome_url_data_manager_backend(), | 262 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 | 263 |
| 277 main_context->set_job_factory(main_job_factory_.get()); | 264 main_context->set_job_factory(main_job_factory_.get()); |
| 278 extensions_context->set_job_factory(extensions_job_factory_.get()); | 265 extensions_context->set_job_factory(extensions_job_factory_.get()); |
| 279 } | 266 } |
| 280 | 267 |
| 281 ChromeURLRequestContext* | 268 ChromeURLRequestContext* |
| 282 OffTheRecordProfileIOData::InitializeAppRequestContext( | 269 OffTheRecordProfileIOData::InitializeAppRequestContext( |
| 283 ChromeURLRequestContext* main_context, | 270 ChromeURLRequestContext* main_context, |
| 284 const std::string& app_id) const { | 271 const std::string& app_id, |
| 272 scoped_ptr<net::URLRequestJobFactory::Interceptor> |
| 273 protocol_handler_interceptor) const { |
| 285 AppRequestContext* context = new AppRequestContext(load_time_stats()); | 274 AppRequestContext* context = new AppRequestContext(load_time_stats()); |
| 286 | 275 |
| 287 // Copy most state from the main context. | 276 // Copy most state from the main context. |
| 288 context->CopyFrom(main_context); | 277 context->CopyFrom(main_context); |
| 289 | 278 |
| 290 // Use a separate in-memory cookie store for the app. | 279 // Use a separate in-memory cookie store for the app. |
| 291 // TODO(creis): We should have a cookie delegate for notifying the cookie | 280 // 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. | 281 // extensions API, but we need to update it to understand isolated apps first. |
| 293 context->SetCookieStore(new net::CookieMonster(NULL, NULL)); | 282 context->SetCookieStore(new net::CookieMonster(NULL, NULL)); |
| 294 | 283 |
| 295 // Use a separate in-memory cache for the app. | 284 // Use a separate in-memory cache for the app. |
| 296 net::HttpCache::BackendFactory* app_backend = | 285 net::HttpCache::BackendFactory* app_backend = |
| 297 net::HttpCache::DefaultBackend::InMemory(0); | 286 net::HttpCache::DefaultBackend::InMemory(0); |
| 298 net::HttpNetworkSession* main_network_session = | 287 net::HttpNetworkSession* main_network_session = |
| 299 main_http_factory_->GetSession(); | 288 main_http_factory_->GetSession(); |
| 300 net::HttpCache* app_http_cache = | 289 scoped_ptr<net::HttpTransactionFactory> app_http_cache( |
| 301 new net::HttpCache(main_network_session, app_backend); | 290 new net::HttpCache(main_network_session, app_backend)); |
| 302 | 291 |
| 303 context->SetHttpTransactionFactory(app_http_cache); | 292 context->SetHttpTransactionFactory(app_http_cache.Pass()); |
| 293 |
| 294 scoped_ptr<net::URLRequestJobFactory> job_factory( |
| 295 new net::URLRequestJobFactoryImpl()); |
| 296 SetUpJobFactoryDefaults(job_factory.get(), |
| 297 protocol_handler_interceptor.Pass(), |
| 298 network_delegate(), |
| 299 context->ftp_transaction_factory(), |
| 300 context->ftp_auth_cache()); |
| 301 context->SetJobFactory(job_factory.Pass()); |
| 304 return context; | 302 return context; |
| 305 } | 303 } |
| 306 | 304 |
| 307 ChromeURLRequestContext* | 305 ChromeURLRequestContext* |
| 308 OffTheRecordProfileIOData::InitializeMediaRequestContext( | 306 OffTheRecordProfileIOData::InitializeMediaRequestContext( |
| 309 ChromeURLRequestContext* original_context, | 307 ChromeURLRequestContext* original_context, |
| 310 const std::string& app_id) const { | 308 const std::string& app_id) const { |
| 311 NOTREACHED(); | 309 NOTREACHED(); |
| 312 return NULL; | 310 return NULL; |
| 313 } | 311 } |
| 314 | 312 |
| 315 ChromeURLRequestContext* | 313 ChromeURLRequestContext* |
| 316 OffTheRecordProfileIOData::AcquireMediaRequestContext() const { | 314 OffTheRecordProfileIOData::AcquireMediaRequestContext() const { |
| 317 NOTREACHED(); | 315 NOTREACHED(); |
| 318 return NULL; | 316 return NULL; |
| 319 } | 317 } |
| 320 | 318 |
| 321 ChromeURLRequestContext* | 319 ChromeURLRequestContext* |
| 322 OffTheRecordProfileIOData::AcquireIsolatedAppRequestContext( | 320 OffTheRecordProfileIOData::AcquireIsolatedAppRequestContext( |
| 323 ChromeURLRequestContext* main_context, | 321 ChromeURLRequestContext* main_context, |
| 324 const std::string& app_id) const { | 322 const std::string& app_id, |
| 323 scoped_ptr<net::URLRequestJobFactory::Interceptor> |
| 324 protocol_handler_interceptor) const { |
| 325 // We create per-app contexts on demand, unlike the others above. | 325 // We create per-app contexts on demand, unlike the others above. |
| 326 ChromeURLRequestContext* app_request_context = | 326 ChromeURLRequestContext* app_request_context = |
| 327 InitializeAppRequestContext(main_context, app_id); | 327 InitializeAppRequestContext(main_context, app_id, |
| 328 protocol_handler_interceptor.Pass()); |
| 328 DCHECK(app_request_context); | 329 DCHECK(app_request_context); |
| 329 return app_request_context; | 330 return app_request_context; |
| 330 } | 331 } |
| 331 | 332 |
| 332 ChromeURLRequestContext* | 333 ChromeURLRequestContext* |
| 333 OffTheRecordProfileIOData::AcquireIsolatedMediaRequestContext( | 334 OffTheRecordProfileIOData::AcquireIsolatedMediaRequestContext( |
| 334 ChromeURLRequestContext* app_context, | 335 ChromeURLRequestContext* app_context, |
| 335 const std::string& app_id) const { | 336 const std::string& app_id) const { |
| 336 NOTREACHED(); | 337 NOTREACHED(); |
| 337 return NULL; | 338 return NULL; |
| 338 } | 339 } |
| 339 | 340 |
| 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( | 341 chrome_browser_net::LoadTimeStats* OffTheRecordProfileIOData::GetLoadTimeStats( |
| 351 IOThread::Globals* io_thread_globals) const { | 342 IOThread::Globals* io_thread_globals) const { |
| 352 return NULL; | 343 return NULL; |
| 353 } | 344 } |
| OLD | NEW |