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

Unified Diff: chrome/browser/profiles/profile_impl_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: fix ordering 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/profiles/profile_impl_io_data.h ('k') | chrome/browser/profiles/profile_io_data.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/profiles/profile_impl_io_data.cc
diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc
index 4e7e378b5b3ed8250d15fee8dc37546f221a8f62..6a8fc08cfc6d5ae90efcf4e25ac54ee4564c6407 100644
--- a/chrome/browser/profiles/profile_impl_io_data.cc
+++ b/chrome/browser/profiles/profile_impl_io_data.cc
@@ -11,8 +11,9 @@
#include "base/stl_util.h"
#include "base/threading/worker_pool.h"
#include "chrome/browser/api/prefs/pref_member.h"
+#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
+#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
#include "chrome/browser/io_thread.h"
-#include "chrome/browser/net/about_protocol_handler.h"
#include "chrome/browser/net/chrome_net_log.h"
#include "chrome/browser/net/clear_on_exit_policy.h"
#include "chrome/browser/net/connect_interceptor.h"
@@ -35,8 +36,6 @@
#include "net/base/server_bound_cert_service.h"
#include "net/ftp/ftp_network_layer.h"
#include "net/http/http_cache.h"
-#include "net/url_request/file_protocol_handler.h"
-#include "net/url_request/ftp_protocol_handler.h"
#include "net/url_request/url_request_job_factory_impl.h"
#include "webkit/quota/special_storage_policy.h"
@@ -220,9 +219,13 @@ ProfileImplIOData::Handle::GetIsolatedAppRequestContextGetter(
if (iter != app_request_context_getter_map_.end())
return iter->second;
+ scoped_ptr<net::URLRequestJobFactory::Interceptor>
+ protocol_handler_interceptor(
+ ProtocolHandlerRegistryFactory::GetForProfile(profile_)->
+ CreateURLInterceptor());
ChromeURLRequestContextGetter* context =
ChromeURLRequestContextGetter::CreateOriginalForIsolatedApp(
- profile_, io_data_, app_id);
+ profile_, io_data_, app_id, protocol_handler_interceptor.Pass());
app_request_context_getter_map_[app_id] = context;
return context;
@@ -242,9 +245,13 @@ ProfileImplIOData::Handle::GetIsolatedMediaRequestContextGetter(
if (iter != isolated_media_request_context_getter_map_.end())
return iter->second;
+ // Get the app context as the starting point for the media context, so that
+ // it uses the app's cookie store.
+ ChromeURLRequestContextGetter* app_context =
+ GetIsolatedAppRequestContextGetter(app_id);
ChromeURLRequestContextGetter* context =
ChromeURLRequestContextGetter::CreateOriginalForIsolatedMedia(
- profile_, io_data_, app_id);
+ profile_, app_context, io_data_, app_id);
isolated_media_request_context_getter_map_[app_id] = context;
return context;
@@ -430,6 +437,7 @@ void ProfileImplIOData::LazyInitializeInternal(
ftp_factory_.reset(
new net::FtpNetworkLayer(io_thread_globals->host_resolver.get()));
main_context->set_ftp_transaction_factory(ftp_factory_.get());
+ extensions_context->set_ftp_transaction_factory(ftp_factory_.get());
#endif // !defined(DISABLE_FTP_SUPPORT)
main_context->set_chrome_url_data_manager_backend(
@@ -443,54 +451,27 @@ void ProfileImplIOData::LazyInitializeInternal(
media_request_job_factory_.reset(new net::URLRequestJobFactoryImpl);
extensions_job_factory_.reset(new net::URLRequestJobFactoryImpl);
- int set_protocol = main_job_factory_->SetProtocolHandler(
- chrome::kFileScheme, new net::FileProtocolHandler());
- DCHECK(set_protocol);
- set_protocol = media_request_job_factory_->SetProtocolHandler(
- chrome::kFileScheme, new net::FileProtocolHandler());
- DCHECK(set_protocol);
+ SetUpJobFactory(main_job_factory_.get(),
+ profile_params->protocol_handler_interceptor.Pass(),
+ network_delegate(),
+ main_context->ftp_transaction_factory(),
+ main_context->ftp_auth_cache());
+ SetUpJobFactory(media_request_job_factory_.get(),
+ scoped_ptr<net::URLRequestJobFactoryImpl::Interceptor>(NULL),
+ network_delegate(),
+ media_request_context_->ftp_transaction_factory(),
+ media_request_context_->ftp_auth_cache());
// TODO(shalev): The extensions_job_factory has a NULL NetworkDelegate.
// Without a network_delegate, this protocol handler will never
// handle file: requests, but as a side effect it makes
// job_factory::IsHandledProtocol return true, which prevents attempts to
- // handle the protocol externally.
- set_protocol = extensions_job_factory_->SetProtocolHandler(
- chrome::kFileScheme, new net::FileProtocolHandler());
- DCHECK(set_protocol);
-
- set_protocol = main_job_factory_->SetProtocolHandler(
- chrome::kChromeDevToolsScheme,
- CreateDevToolsProtocolHandler(chrome_url_data_manager_backend(),
- network_delegate()));
- DCHECK(set_protocol);
- set_protocol = media_request_job_factory_->SetProtocolHandler(
- chrome::kChromeDevToolsScheme,
- CreateDevToolsProtocolHandler(chrome_url_data_manager_backend(),
- network_delegate()));
- DCHECK(set_protocol);
- set_protocol = extensions_job_factory_->SetProtocolHandler(
- chrome::kChromeDevToolsScheme,
- CreateDevToolsProtocolHandler(chrome_url_data_manager_backend(), NULL));
- DCHECK(set_protocol);
-
- net::URLRequestJobFactory* job_factories[3];
- job_factories[0] = main_job_factory_.get();
- job_factories[1] = media_request_job_factory_.get();
- job_factories[2] = extensions_job_factory_.get();
-
- net::FtpAuthCache* ftp_auth_caches[3];
- ftp_auth_caches[0] = main_context->ftp_auth_cache();
- ftp_auth_caches[1] = media_request_context_->ftp_auth_cache();
- ftp_auth_caches[2] = extensions_context->ftp_auth_cache();
-
- for (int i = 0; i < 3; i++) {
- SetUpJobFactoryDefaults(job_factories[i]);
- job_factories[i]->SetProtocolHandler(chrome::kAboutScheme,
- new net::AboutProtocolHandler());
- CreateFtpProtocolHandler(job_factories[i], ftp_auth_caches[i]);
- job_factories[i]->AddInterceptor(
- new chrome_browser_net::ConnectInterceptor(predictor_.get()));
- }
+ // handle the protocol externally. We pass NULL in to
+ // SetUpJobFactory() to get this effect.
+ SetUpJobFactory(extensions_job_factory_.get(),
+ scoped_ptr<net::URLRequestJobFactoryImpl::Interceptor>(NULL),
+ NULL,
+ extensions_context->ftp_transaction_factory(),
+ extensions_context->ftp_auth_cache());
main_context->set_job_factory(main_job_factory_.get());
media_request_context_->set_job_factory(media_request_job_factory_.get());
@@ -502,7 +483,9 @@ void ProfileImplIOData::LazyInitializeInternal(
ChromeURLRequestContext*
ProfileImplIOData::InitializeAppRequestContext(
ChromeURLRequestContext* main_context,
- const std::string& app_id) const {
+ const std::string& app_id,
+ scoped_ptr<net::URLRequestJobFactory::Interceptor>
+ protocol_handler_interceptor) const {
// If this is for a guest process, we should not persist cookies and http
// cache.
bool is_guest_process = (app_id.find("guest-") != std::string::npos);
@@ -569,7 +552,18 @@ ProfileImplIOData::InitializeAppRequestContext(
// Transfer ownership of the cookies and cache to AppRequestContext.
context->SetCookieStore(cookie_store);
- context->SetHttpTransactionFactory(app_http_cache);
+ context->SetHttpTransactionFactory(
+ scoped_ptr<net::HttpTransactionFactory>(app_http_cache));
+
+ // Overwrite the job factory that we inherit from the main context so
+ // that we can later provide our own handles for storage related protocols.
+ scoped_ptr<net::URLRequestJobFactory> job_factory(
+ new net::URLRequestJobFactoryImpl());
+ SetUpJobFactory(job_factory.get(), protocol_handler_interceptor.Pass(),
+ network_delegate(),
+ context->ftp_transaction_factory(),
+ context->ftp_auth_cache());
+ context->SetJobFactory(job_factory.Pass());
return context;
}
@@ -609,11 +603,17 @@ ProfileImplIOData::InitializeMediaRequestContext(
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE));
net::HttpNetworkSession* main_network_session =
main_http_factory_->GetSession();
- net::HttpCache* media_http_cache =
- new net::HttpCache(main_network_session, media_backend);
+ scoped_ptr<net::HttpTransactionFactory> media_http_cache(
+ new net::HttpCache(main_network_session, media_backend));
// Transfer ownership of the cache to MediaRequestContext.
- context->SetHttpTransactionFactory(media_http_cache);
+ context->SetHttpTransactionFactory(media_http_cache.Pass());
+
+ // Note that we do not create a new URLRequestJobFactory because
+ // the media context should behave exactly like its parent context
+ // in all respects except for cache behavior on media subresources.
+ // The CopyFrom() step above means that our media context will use
+ // the same URLRequestJobFactory instance that our parent context does.
return context;
}
@@ -627,10 +627,13 @@ ProfileImplIOData::AcquireMediaRequestContext() const {
ChromeURLRequestContext*
ProfileImplIOData::AcquireIsolatedAppRequestContext(
ChromeURLRequestContext* main_context,
- const std::string& app_id) const {
+ const std::string& app_id,
+ scoped_ptr<net::URLRequestJobFactory::Interceptor>
+ protocol_handler_interceptor) const {
// We create per-app contexts on demand, unlike the others above.
ChromeURLRequestContext* app_request_context =
- InitializeAppRequestContext(main_context, app_id);
+ InitializeAppRequestContext(main_context, app_id,
+ protocol_handler_interceptor.Pass());
DCHECK(app_request_context);
return app_request_context;
}
@@ -651,15 +654,19 @@ chrome_browser_net::LoadTimeStats* ProfileImplIOData::GetLoadTimeStats(
return io_thread_globals->load_time_stats.get();
}
-void ProfileImplIOData::CreateFtpProtocolHandler(
+void ProfileImplIOData::SetUpJobFactory(
net::URLRequestJobFactory* job_factory,
+ scoped_ptr<net::URLRequestJobFactory::Interceptor>
+ protocol_handler_interceptor,
+ net::NetworkDelegate* network_delegate,
+ net::FtpTransactionFactory* ftp_transaction_factory,
net::FtpAuthCache* ftp_auth_cache) const {
-#if !defined(DISABLE_FTP_SUPPORT)
- job_factory->SetProtocolHandler(
- chrome::kFtpScheme,
- new net::FtpProtocolHandler(ftp_factory_.get(),
- ftp_auth_cache));
-#endif // !defined(DISABLE_FTP_SUPPORT)
+ SetUpJobFactoryDefaults(job_factory, protocol_handler_interceptor.Pass(),
+ network_delegate, ftp_transaction_factory,
+ ftp_auth_cache);
+
+ job_factory->AddInterceptor(
+ new chrome_browser_net::ConnectInterceptor(predictor_.get()));
}
void ProfileImplIOData::ClearNetworkingHistorySinceOnIOThread(
« no previous file with comments | « chrome/browser/profiles/profile_impl_io_data.h ('k') | chrome/browser/profiles/profile_io_data.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698