diff options
author | creis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-21 19:07:08 +0000 |
---|---|---|
committer | creis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-21 19:07:08 +0000 |
commit | 10705a7b86405ba171f4b4237e43f70757b00441 (patch) | |
tree | 4ba50ed0f81684cd33d916dec0cd2da3eecf67e6 /chrome/browser/profiles | |
parent | f84278cd1a26aff14aff8d169b68b1edee950591 (diff) | |
download | chromium_src-10705a7b86405ba171f4b4237e43f70757b00441.zip chromium_src-10705a7b86405ba171f4b4237e43f70757b00441.tar.gz chromium_src-10705a7b86405ba171f4b4237e43f70757b00441.tar.bz2 |
Ensure that isolated apps use the right cookies for media requests.
Also abstract out the media URLRequestContext logic from ProfileImpl.
BUG=141172
TEST=Check cookies attached to video tag request inside an isolated app.
Review URL: https://chromiumcodereview.appspot.com/10836305
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@152604 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/profiles')
-rw-r--r-- | chrome/browser/profiles/off_the_record_profile_impl.cc | 11 | ||||
-rw-r--r-- | chrome/browser/profiles/off_the_record_profile_impl.h | 4 | ||||
-rw-r--r-- | chrome/browser/profiles/off_the_record_profile_io_data.cc | 16 | ||||
-rw-r--r-- | chrome/browser/profiles/off_the_record_profile_io_data.h | 7 | ||||
-rw-r--r-- | chrome/browser/profiles/profile_impl.cc | 33 | ||||
-rw-r--r-- | chrome/browser/profiles/profile_impl.h | 4 | ||||
-rw-r--r-- | chrome/browser/profiles/profile_impl_io_data.cc | 143 | ||||
-rw-r--r-- | chrome/browser/profiles/profile_impl_io_data.h | 15 | ||||
-rw-r--r-- | chrome/browser/profiles/profile_io_data.cc | 44 | ||||
-rw-r--r-- | chrome/browser/profiles/profile_io_data.h | 37 |
10 files changed, 256 insertions, 58 deletions
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.cc b/chrome/browser/profiles/off_the_record_profile_impl.cc index c50d844..4c0b81b 100644 --- a/chrome/browser/profiles/off_the_record_profile_impl.cc +++ b/chrome/browser/profiles/off_the_record_profile_impl.cc @@ -281,9 +281,16 @@ net::URLRequestContextGetter* } net::URLRequestContextGetter* - OffTheRecordProfileImpl::GetRequestContextForMedia() { + OffTheRecordProfileImpl::GetMediaRequestContext() { // In OTR mode, media request context is the same as the original one. - return io_data_.GetMainRequestContextGetter(); + return GetRequestContext(); +} + +net::URLRequestContextGetter* + OffTheRecordProfileImpl::GetMediaRequestContextForRenderProcess( + int renderer_child_id) { + // In OTR mode, media request context is the same as the original one. + return GetRequestContextForRenderProcess(renderer_child_id); } net::URLRequestContextGetter* diff --git a/chrome/browser/profiles/off_the_record_profile_impl.h b/chrome/browser/profiles/off_the_record_profile_impl.h index 170a33e..c7826d6 100644 --- a/chrome/browser/profiles/off_the_record_profile_impl.h +++ b/chrome/browser/profiles/off_the_record_profile_impl.h @@ -91,7 +91,9 @@ class OffTheRecordProfileImpl : public Profile, virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE; virtual net::URLRequestContextGetter* GetRequestContextForRenderProcess( int renderer_child_id) OVERRIDE; - virtual net::URLRequestContextGetter* GetRequestContextForMedia() OVERRIDE; + virtual net::URLRequestContextGetter* GetMediaRequestContext() OVERRIDE; + virtual net::URLRequestContextGetter* GetMediaRequestContextForRenderProcess( + int renderer_child_id) OVERRIDE; virtual content::ResourceContext* GetResourceContext() OVERRIDE; virtual content::GeolocationPermissionContext* GetGeolocationPermissionContext() OVERRIDE; diff --git a/chrome/browser/profiles/off_the_record_profile_io_data.cc b/chrome/browser/profiles/off_the_record_profile_io_data.cc index 615c030..79112ec 100644 --- a/chrome/browser/profiles/off_the_record_profile_io_data.cc +++ b/chrome/browser/profiles/off_the_record_profile_io_data.cc @@ -319,6 +319,14 @@ OffTheRecordProfileIOData::InitializeAppRequestContext( } ChromeURLRequestContext* +OffTheRecordProfileIOData::InitializeMediaRequestContext( + ChromeURLRequestContext* original_context, + const std::string& app_id) const { + NOTREACHED(); + return NULL; +} + +ChromeURLRequestContext* OffTheRecordProfileIOData::AcquireMediaRequestContext() const { NOTREACHED(); return NULL; @@ -335,6 +343,14 @@ OffTheRecordProfileIOData::AcquireIsolatedAppRequestContext( return app_request_context; } +ChromeURLRequestContext* +OffTheRecordProfileIOData::AcquireIsolatedMediaRequestContext( + ChromeURLRequestContext* app_context, + const std::string& app_id) const { + NOTREACHED(); + return NULL; +} + void OffTheRecordProfileIOData::CreateFtpProtocolHandler( net::URLRequestJobFactory* job_factory, net::FtpAuthCache* ftp_auth_cache) const { diff --git a/chrome/browser/profiles/off_the_record_profile_io_data.h b/chrome/browser/profiles/off_the_record_profile_io_data.h index 366911c..4d83990 100644 --- a/chrome/browser/profiles/off_the_record_profile_io_data.h +++ b/chrome/browser/profiles/off_the_record_profile_io_data.h @@ -100,12 +100,19 @@ class OffTheRecordProfileIOData : public ProfileIOData { virtual ChromeURLRequestContext* InitializeAppRequestContext( ChromeURLRequestContext* main_context, const std::string& app_id) const OVERRIDE; + virtual ChromeURLRequestContext* InitializeMediaRequestContext( + ChromeURLRequestContext* original_context, + const std::string& app_id) const OVERRIDE; virtual ChromeURLRequestContext* AcquireMediaRequestContext() const OVERRIDE; virtual ChromeURLRequestContext* AcquireIsolatedAppRequestContext( ChromeURLRequestContext* main_context, const std::string& app_id) const OVERRIDE; + virtual ChromeURLRequestContext* + AcquireIsolatedMediaRequestContext( + ChromeURLRequestContext* app_context, + const std::string& app_id) const OVERRIDE; void CreateFtpProtocolHandler(net::URLRequestJobFactory* job_factory, net::FtpAuthCache* ftp_auth_cache) const; diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc index ff2725c..1f2b99d 100644 --- a/chrome/browser/profiles/profile_impl.cc +++ b/chrome/browser/profiles/profile_impl.cc @@ -684,9 +684,8 @@ net::URLRequestContextGetter* ProfileImpl::GetRequestContextForRenderProcess( if (extension_service) { const extensions::Extension* installed_app = extension_service-> GetInstalledAppForRenderer(renderer_child_id); - if (installed_app != NULL && installed_app->is_storage_isolated()) { + if (installed_app && installed_app->is_storage_isolated()) return GetRequestContextForIsolatedApp(installed_app->id()); - } } content::RenderProcessHost* rph = content::RenderProcessHost::FromID( @@ -704,7 +703,35 @@ net::URLRequestContextGetter* ProfileImpl::GetRequestContextForRenderProcess( return GetRequestContext(); } -net::URLRequestContextGetter* ProfileImpl::GetRequestContextForMedia() { +net::URLRequestContextGetter* ProfileImpl::GetMediaRequestContext() { + // Return the default media context. + return io_data_.GetMediaRequestContextGetter(); +} + +net::URLRequestContextGetter* +ProfileImpl::GetMediaRequestContextForRenderProcess( + int renderer_child_id) { + ExtensionService* extension_service = + extensions::ExtensionSystem::Get(this)->extension_service(); + if (extension_service) { + const extensions::Extension* installed_app = extension_service-> + GetInstalledAppForRenderer(renderer_child_id); + if (installed_app && installed_app->is_storage_isolated()) + return io_data_.GetIsolatedMediaRequestContextGetter(installed_app->id()); + } + + content::RenderProcessHost* rph = content::RenderProcessHost::FromID( + renderer_child_id); + if (rph && rph->IsGuest()) { + // For guest processes (used by the browser tag), we need to isolate the + // storage. + // TODO(nasko): Until we have proper storage partitions, create a + // non-persistent context using the RPH's id. + std::string id("guest-"); + id.append(base::IntToString(renderer_child_id)); + return io_data_.GetIsolatedMediaRequestContextGetter(id); + } + return io_data_.GetMediaRequestContextGetter(); } diff --git a/chrome/browser/profiles/profile_impl.h b/chrome/browser/profiles/profile_impl.h index ee3a2bc..ce1364b 100644 --- a/chrome/browser/profiles/profile_impl.h +++ b/chrome/browser/profiles/profile_impl.h @@ -57,7 +57,9 @@ class ProfileImpl : public Profile, virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE; virtual net::URLRequestContextGetter* GetRequestContextForRenderProcess( int renderer_child_id) OVERRIDE; - virtual net::URLRequestContextGetter* GetRequestContextForMedia() OVERRIDE; + virtual net::URLRequestContextGetter* GetMediaRequestContext() OVERRIDE; + virtual net::URLRequestContextGetter* GetMediaRequestContextForRenderProcess( + int renderer_child_id) OVERRIDE; virtual content::ResourceContext* GetResourceContext() OVERRIDE; virtual content::GeolocationPermissionContext* GetGeolocationPermissionContext() OVERRIDE; diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc index d71357a..f233e82 100644 --- a/chrome/browser/profiles/profile_impl_io_data.cc +++ b/chrome/browser/profiles/profile_impl_io_data.cc @@ -73,6 +73,14 @@ ProfileImplIOData::Handle::~Handle() { iter->second->CleanupOnUIThread(); } + // Clean up all isolated media request contexts. + for (ChromeURLRequestContextGetterMap::iterator iter = + isolated_media_request_context_getter_map_.begin(); + iter != isolated_media_request_context_getter_map_.end(); + ++iter) { + iter->second->CleanupOnUIThread(); + } + if (io_data_->http_server_properties_manager()) io_data_->http_server_properties_manager()->ShutdownOnUIThread(); io_data_->ShutdownOnUIThread(); @@ -110,8 +118,11 @@ void ProfileImplIOData::Handle::Init( io_data_->lazy_params_.reset(lazy_params); - // Keep track of isolated app path separately so we can use it on demand. + // Keep track of isolated app path and cache sizes separately so we can use + // them on demand. io_data_->app_path_ = app_path; + io_data_->app_cache_max_size_ = cache_max_size; + io_data_->app_media_cache_max_size_ = media_cache_max_size; io_data_->predictor_.reset(predictor); @@ -197,7 +208,7 @@ scoped_refptr<ChromeURLRequestContextGetter> ProfileImplIOData::Handle::GetIsolatedAppRequestContextGetter( const std::string& app_id) const { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DCHECK(!app_id.empty()); + CHECK(!app_id.empty()); LazyInitialize(); // Keep a map of request context getters, one per requested app ID. @@ -214,6 +225,28 @@ ProfileImplIOData::Handle::GetIsolatedAppRequestContextGetter( return context; } +scoped_refptr<ChromeURLRequestContextGetter> +ProfileImplIOData::Handle::GetIsolatedMediaRequestContextGetter( + const std::string& app_id) const { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + // We must have an app ID, or this will act like the default media context. + CHECK(!app_id.empty()); + LazyInitialize(); + + // Keep a map of request context getters, one per requested app ID. + ChromeURLRequestContextGetterMap::iterator iter = + isolated_media_request_context_getter_map_.find(app_id); + if (iter != isolated_media_request_context_getter_map_.end()) + return iter->second; + + ChromeURLRequestContextGetter* context = + ChromeURLRequestContextGetter::CreateOriginalForIsolatedMedia( + profile_, io_data_, app_id); + isolated_media_request_context_getter_map_[app_id] = context; + + return context; +} + void ProfileImplIOData::Handle::ClearNetworkingHistorySince( base::Time time) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); @@ -270,8 +303,6 @@ void ProfileImplIOData::LazyInitializeInternal( ProfileParams* profile_params) const { ChromeURLRequestContext* main_context = main_request_context(); ChromeURLRequestContext* extensions_context = extensions_request_context(); - media_request_context_.reset(new ChromeURLRequestContext( - ChromeURLRequestContext::CONTEXT_TYPE_MEDIA, load_time_stats())); IOThread* const io_thread = profile_params->io_thread; IOThread::Globals* const io_thread_globals = io_thread->globals(); @@ -286,55 +317,37 @@ void ProfileImplIOData::LazyInitializeInternal( // Initialize context members. ApplyProfileParamsToContext(main_context); - ApplyProfileParamsToContext(media_request_context_.get()); ApplyProfileParamsToContext(extensions_context); if (http_server_properties_manager()) http_server_properties_manager()->InitializeOnIOThread(); main_context->set_transport_security_state(transport_security_state()); - media_request_context_->set_transport_security_state( - transport_security_state()); extensions_context->set_transport_security_state(transport_security_state()); main_context->set_net_log(io_thread->net_log()); - media_request_context_->set_net_log(io_thread->net_log()); extensions_context->set_net_log(io_thread->net_log()); main_context->set_network_delegate(network_delegate()); - media_request_context_->set_network_delegate(network_delegate()); main_context->set_http_server_properties(http_server_properties_manager()); - media_request_context_->set_http_server_properties( - http_server_properties_manager()); main_context->set_host_resolver( io_thread_globals->host_resolver.get()); - media_request_context_->set_host_resolver( - io_thread_globals->host_resolver.get()); main_context->set_cert_verifier( io_thread_globals->cert_verifier.get()); - media_request_context_->set_cert_verifier( - io_thread_globals->cert_verifier.get()); main_context->set_http_auth_handler_factory( io_thread_globals->http_auth_handler_factory.get()); - media_request_context_->set_http_auth_handler_factory( - io_thread_globals->http_auth_handler_factory.get()); main_context->set_fraudulent_certificate_reporter( fraudulent_certificate_reporter()); - media_request_context_->set_fraudulent_certificate_reporter( - fraudulent_certificate_reporter()); main_context->set_throttler_manager( io_thread_globals->throttler_manager.get()); - media_request_context_->set_throttler_manager( - io_thread_globals->throttler_manager.get()); extensions_context->set_throttler_manager( io_thread_globals->throttler_manager.get()); main_context->set_proxy_service(proxy_service()); - media_request_context_->set_proxy_service(proxy_service()); scoped_refptr<net::CookieStore> cookie_store = NULL; net::ServerBoundCertService* server_bound_cert_service = NULL; @@ -374,7 +387,6 @@ void ProfileImplIOData::LazyInitializeInternal( extensions_cookie_store->SetCookieableSchemes(schemes, 2); main_context->set_cookie_store(cookie_store); - media_request_context_->set_cookie_store(cookie_store); extensions_context->set_cookie_store(extensions_cookie_store); // Setup server bound cert service. @@ -392,8 +404,6 @@ void ProfileImplIOData::LazyInitializeInternal( set_server_bound_cert_service(server_bound_cert_service); main_context->set_server_bound_cert_service(server_bound_cert_service); - media_request_context_->set_server_bound_cert_service( - server_bound_cert_service); std::string trusted_spdy_proxy; if (command_line.HasSwitch(switches::kTrustedSpdyProxy)) { @@ -421,33 +431,25 @@ void ProfileImplIOData::LazyInitializeInternal( main_backend, trusted_spdy_proxy); - net::HttpCache::DefaultBackend* media_backend = - new net::HttpCache::DefaultBackend( - net::MEDIA_CACHE, lazy_params_->media_cache_path, - lazy_params_->media_cache_max_size, - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); - net::HttpNetworkSession* main_network_session = main_cache->GetSession(); - net::HttpCache* media_cache = - new net::HttpCache(main_network_session, media_backend); - if (record_mode || playback_mode) { main_cache->set_mode( record_mode ? net::HttpCache::RECORD : net::HttpCache::PLAYBACK); } main_http_factory_.reset(main_cache); - media_http_factory_.reset(media_cache); main_context->set_http_transaction_factory(main_cache); - media_request_context_->set_http_transaction_factory(media_cache); ftp_factory_.reset( new net::FtpNetworkLayer(io_thread_globals->host_resolver.get())); main_context->set_ftp_transaction_factory(ftp_factory_.get()); - media_request_context_->set_ftp_transaction_factory(ftp_factory_.get()); main_context->set_chrome_url_data_manager_backend( chrome_url_data_manager_backend()); + // Create a media request context based on the main context, but using a + // media cache. + media_request_context_.reset(InitializeMediaRequestContext(main_context, "")); + main_job_factory_.reset(new net::URLRequestJobFactory); media_request_job_factory_.reset(new net::URLRequestJobFactory); extensions_job_factory_.reset(new net::URLRequestJobFactory); @@ -509,20 +511,17 @@ ChromeURLRequestContext* ProfileImplIOData::InitializeAppRequestContext( ChromeURLRequestContext* main_context, const std::string& app_id) const { - AppRequestContext* context = new AppRequestContext(load_time_stats()); - // If this is for a guest process, we should not persist cookies and http // cache. - bool guest_process = (app_id.find("guest-") != std::string::npos); + bool is_guest_process = (app_id.find("guest-") != std::string::npos); // Copy most state from the main context. + AppRequestContext* context = new AppRequestContext(load_time_stats()); context->CopyFrom(main_context); FilePath app_path = app_path_.AppendASCII(app_id); FilePath cookie_path = app_path.Append(chrome::kCookieFilename); FilePath cache_path = app_path.Append(chrome::kCacheDirname); - // TODO(creis): Determine correct cache size. - int cache_max_size = 0; const CommandLine& command_line = *CommandLine::ForCurrentProcess(); // Only allow Record Mode if we are in a Debug build or where we are running @@ -534,13 +533,13 @@ ProfileImplIOData::InitializeAppRequestContext( // Use a separate HTTP disk cache for isolated apps. net::HttpCache::BackendFactory* app_backend = NULL; - if (guest_process) { + if (is_guest_process) { app_backend = net::HttpCache::DefaultBackend::InMemory(0); } else { app_backend = new net::HttpCache::DefaultBackend( net::DISK_CACHE, cache_path, - cache_max_size, + app_cache_max_size_, BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); } net::HttpNetworkSession* main_network_session = @@ -549,7 +548,7 @@ ProfileImplIOData::InitializeAppRequestContext( new net::HttpCache(main_network_session, app_backend); scoped_refptr<net::CookieStore> cookie_store = NULL; - if (guest_process) { + if (is_guest_process) { cookie_store = new net::CookieMonster(NULL, NULL); } else if (record_mode || playback_mode) { // Don't use existing cookies and use an in-memory store. @@ -573,6 +572,7 @@ ProfileImplIOData::InitializeAppRequestContext( cookie_store = new net::CookieMonster(cookie_db.get(), NULL); } + // Transfer ownership of the cookies and cache to AppRequestContext. context->SetCookieStore(cookie_store); context->SetHttpTransactionFactory(app_http_cache); @@ -580,6 +580,48 @@ ProfileImplIOData::InitializeAppRequestContext( } ChromeURLRequestContext* +ProfileImplIOData::InitializeMediaRequestContext( + ChromeURLRequestContext* original_context, + const std::string& app_id) const { + // If this is for a guest process, we do not persist storage, so we can + // simply use the app's in-memory cache (like off-the-record mode). + if (app_id.find("guest-") != std::string::npos) + return original_context; + + // Copy most state from the original context. + MediaRequestContext* context = new MediaRequestContext(load_time_stats()); + context->CopyFrom(original_context); + + FilePath app_path = app_path_.AppendASCII(app_id); + FilePath cache_path; + int cache_max_size = app_media_cache_max_size_; + if (app_id.empty()) { + // lazy_params_ is only valid for the default media context creation. + cache_path = lazy_params_->media_cache_path; + cache_max_size = lazy_params_->media_cache_max_size; + } else { + cache_path = app_path.Append(chrome::kMediaCacheDirname); + } + + // Use a separate HTTP disk cache for isolated apps. + net::HttpCache::BackendFactory* media_backend = + new net::HttpCache::DefaultBackend( + net::MEDIA_CACHE, + cache_path, + cache_max_size, + 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); + + // Transfer ownership of the cache to MediaRequestContext. + context->SetHttpTransactionFactory(media_http_cache); + + return context; +} + +ChromeURLRequestContext* ProfileImplIOData::AcquireMediaRequestContext() const { DCHECK(media_request_context_.get()); return media_request_context_.get(); @@ -596,6 +638,17 @@ ProfileImplIOData::AcquireIsolatedAppRequestContext( return app_request_context; } +ChromeURLRequestContext* +ProfileImplIOData::AcquireIsolatedMediaRequestContext( + ChromeURLRequestContext* app_context, + const std::string& app_id) const { + // We create per-app media contexts on demand, unlike the others above. + ChromeURLRequestContext* media_request_context = + InitializeMediaRequestContext(app_context, app_id); + DCHECK(media_request_context); + return media_request_context; +} + chrome_browser_net::LoadTimeStats* ProfileImplIOData::GetLoadTimeStats( IOThread::Globals* io_thread_globals) const { return io_thread_globals->load_time_stats.get(); diff --git a/chrome/browser/profiles/profile_impl_io_data.h b/chrome/browser/profiles/profile_impl_io_data.h index 25ffefe..83b2148 100644 --- a/chrome/browser/profiles/profile_impl_io_data.h +++ b/chrome/browser/profiles/profile_impl_io_data.h @@ -66,6 +66,9 @@ class ProfileImplIOData : public ProfileIOData { scoped_refptr<ChromeURLRequestContextGetter> GetIsolatedAppRequestContextGetter( const std::string& app_id) const; + scoped_refptr<ChromeURLRequestContextGetter> + GetIsolatedMediaRequestContextGetter( + const std::string& app_id) const; void ClearNetworkingHistorySince(base::Time time); @@ -94,6 +97,8 @@ class ProfileImplIOData : public ProfileIOData { mutable scoped_refptr<ChromeURLRequestContextGetter> extensions_request_context_getter_; mutable ChromeURLRequestContextGetterMap app_request_context_getter_map_; + mutable ChromeURLRequestContextGetterMap + isolated_media_request_context_getter_map_; ProfileImplIOData* const io_data_; Profile* const profile_; @@ -133,12 +138,19 @@ class ProfileImplIOData : public ProfileIOData { virtual ChromeURLRequestContext* InitializeAppRequestContext( ChromeURLRequestContext* main_context, const std::string& app_id) const OVERRIDE; + virtual ChromeURLRequestContext* InitializeMediaRequestContext( + ChromeURLRequestContext* original_context, + const std::string& app_id) const OVERRIDE; virtual ChromeURLRequestContext* AcquireMediaRequestContext() const OVERRIDE; virtual ChromeURLRequestContext* AcquireIsolatedAppRequestContext( ChromeURLRequestContext* main_context, const std::string& app_id) const OVERRIDE; + virtual ChromeURLRequestContext* + AcquireIsolatedMediaRequestContext( + ChromeURLRequestContext* app_context, + const std::string& app_id) const OVERRIDE; virtual chrome_browser_net::LoadTimeStats* GetLoadTimeStats( IOThread::Globals* io_thread_globals) const OVERRIDE; @@ -152,7 +164,6 @@ class ProfileImplIOData : public ProfileIOData { mutable scoped_ptr<LazyParams> lazy_params_; mutable scoped_ptr<net::HttpTransactionFactory> main_http_factory_; - mutable scoped_ptr<net::HttpTransactionFactory> media_http_factory_; mutable scoped_ptr<net::FtpTransactionFactory> ftp_factory_; mutable scoped_ptr<chrome_browser_net::Predictor> predictor_; @@ -165,6 +176,8 @@ class ProfileImplIOData : public ProfileIOData { // Parameters needed for isolated apps. FilePath app_path_; + int app_cache_max_size_; + int app_media_cache_max_size_; DISALLOW_COPY_AND_ASSIGN(ProfileImplIOData); }; diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc index c69bdb3..b7de713 100644 --- a/chrome/browser/profiles/profile_io_data.cc +++ b/chrome/browser/profiles/profile_io_data.cc @@ -225,6 +225,20 @@ void ProfileIOData::InitializeOnUIThread(Profile* profile) { BrowserContext::EnsureResourceContextInitialized(profile); } +ProfileIOData::MediaRequestContext::MediaRequestContext( + chrome_browser_net::LoadTimeStats* load_time_stats) + : ChromeURLRequestContext(ChromeURLRequestContext::CONTEXT_TYPE_MEDIA, + load_time_stats) { +} + +void ProfileIOData::MediaRequestContext::SetHttpTransactionFactory( + net::HttpTransactionFactory* http_factory) { + http_factory_.reset(http_factory); + set_http_transaction_factory(http_factory); +} + +ProfileIOData::MediaRequestContext::~MediaRequestContext() {} + ProfileIOData::AppRequestContext::AppRequestContext( chrome_browser_net::LoadTimeStats* load_time_stats) : ChromeURLRequestContext(ChromeURLRequestContext::CONTEXT_TYPE_APP, @@ -272,11 +286,17 @@ ProfileIOData::~ProfileIOData() { main_request_context_->AssertNoURLRequests(); if (extensions_request_context_.get()) extensions_request_context_->AssertNoURLRequests(); - for (AppRequestContextMap::iterator it = app_request_context_map_.begin(); + for (URLRequestContextMap::iterator it = app_request_context_map_.begin(); it != app_request_context_map_.end(); ++it) { it->second->AssertNoURLRequests(); delete it->second; } + for (URLRequestContextMap::iterator it = + isolated_media_request_context_map_.begin(); + it != isolated_media_request_context_map_.end(); ++it) { + it->second->AssertNoURLRequests(); + delete it->second; + } } // static @@ -352,7 +372,7 @@ ProfileIOData::GetIsolatedAppRequestContext( ChromeURLRequestContext* main_context, const std::string& app_id) const { LazyInitialize(); - ChromeURLRequestContext* context; + ChromeURLRequestContext* context = NULL; if (ContainsKey(app_request_context_map_, app_id)) { context = app_request_context_map_[app_id]; } else { @@ -363,6 +383,26 @@ ProfileIOData::GetIsolatedAppRequestContext( return context; } +ChromeURLRequestContext* +ProfileIOData::GetIsolatedMediaRequestContext( + ChromeURLRequestContext* main_context, + const std::string& app_id) const { + LazyInitialize(); + ChromeURLRequestContext* context = NULL; + if (ContainsKey(isolated_media_request_context_map_, app_id)) { + context = isolated_media_request_context_map_[app_id]; + } else { + // Get the app context as the starting point for the media context, + // so that it uses the app's cookie store. + ChromeURLRequestContext* app_context = GetIsolatedAppRequestContext( + main_context, app_id); + context = AcquireIsolatedMediaRequestContext(app_context, app_id); + isolated_media_request_context_map_[app_id] = context; + } + DCHECK(context); + return context; +} + ExtensionInfoMap* ProfileIOData::GetExtensionInfoMap() const { DCHECK(extension_info_map_) << "ExtensionSystem not initialized"; return extension_info_map_; diff --git a/chrome/browser/profiles/profile_io_data.h b/chrome/browser/profiles/profile_io_data.h index e5fcb55..2047351 100644 --- a/chrome/browser/profiles/profile_io_data.h +++ b/chrome/browser/profiles/profile_io_data.h @@ -82,6 +82,9 @@ class ProfileIOData { ChromeURLRequestContext* GetIsolatedAppRequestContext( ChromeURLRequestContext* main_context, const std::string& app_id) const; + ChromeURLRequestContext* GetIsolatedMediaRequestContext( + ChromeURLRequestContext* media_context, + const std::string& app_id) const; // These are useful when the Chrome layer is called from the content layer // with a content::ResourceContext, and they want access to Chrome data for @@ -135,6 +138,23 @@ class ProfileIOData { bool GetMetricsEnabledStateOnIOThread() const; protected: + // A URLRequestContext for media that owns its HTTP factory, to ensure + // it is deleted. + class MediaRequestContext : public ChromeURLRequestContext { + public: + explicit MediaRequestContext( + chrome_browser_net::LoadTimeStats* load_time_stats); + + void SetHttpTransactionFactory(net::HttpTransactionFactory* http_factory); + + private: + virtual ~MediaRequestContext(); + + scoped_ptr<net::HttpTransactionFactory> http_factory_; + }; + + // A URLRequestContext for apps that owns its cookie store and HTTP factory, + // to ensure they are deleted. class AppRequestContext : public ChromeURLRequestContext { public: explicit AppRequestContext( @@ -272,7 +292,7 @@ class ProfileIOData { }; typedef base::hash_map<std::string, ChromeURLRequestContext*> - AppRequestContextMap; + URLRequestContextMap; // -------------------------------------------- // Virtual interface for subtypes to implement: @@ -288,6 +308,12 @@ class ProfileIOData { ChromeURLRequestContext* main_context, const std::string& app_id) const = 0; + // Does an on-demand initialization of a media RequestContext for the given + // isolated app. + virtual ChromeURLRequestContext* InitializeMediaRequestContext( + ChromeURLRequestContext* original_context, + const std::string& app_id) const = 0; + // These functions are used to transfer ownership of the lazily initialized // context from ProfileIOData to the URLRequestContextGetter. virtual ChromeURLRequestContext* @@ -296,6 +322,10 @@ class ProfileIOData { AcquireIsolatedAppRequestContext( ChromeURLRequestContext* main_context, const std::string& app_id) const = 0; + virtual ChromeURLRequestContext* + AcquireIsolatedMediaRequestContext( + ChromeURLRequestContext* app_context, + const std::string& app_id) const = 0; // Returns the LoadTimeStats object to be used for this profile. virtual chrome_browser_net::LoadTimeStats* GetLoadTimeStats( @@ -363,8 +393,9 @@ class ProfileIOData { // called. mutable scoped_ptr<ChromeURLRequestContext> main_request_context_; mutable scoped_ptr<ChromeURLRequestContext> extensions_request_context_; - // One AppRequestContext per isolated app. - mutable AppRequestContextMap app_request_context_map_; + // One URLRequestContext per isolated app for main and media requests. + mutable URLRequestContextMap app_request_context_map_; + mutable URLRequestContextMap isolated_media_request_context_map_; mutable scoped_ptr<ResourceContext> resource_context_; |