summaryrefslogtreecommitdiffstats
path: root/chrome/browser/profiles
diff options
context:
space:
mode:
authorcreis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-21 19:07:08 +0000
committercreis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-21 19:07:08 +0000
commit10705a7b86405ba171f4b4237e43f70757b00441 (patch)
tree4ba50ed0f81684cd33d916dec0cd2da3eecf67e6 /chrome/browser/profiles
parentf84278cd1a26aff14aff8d169b68b1edee950591 (diff)
downloadchromium_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.cc11
-rw-r--r--chrome/browser/profiles/off_the_record_profile_impl.h4
-rw-r--r--chrome/browser/profiles/off_the_record_profile_io_data.cc16
-rw-r--r--chrome/browser/profiles/off_the_record_profile_io_data.h7
-rw-r--r--chrome/browser/profiles/profile_impl.cc33
-rw-r--r--chrome/browser/profiles/profile_impl.h4
-rw-r--r--chrome/browser/profiles/profile_impl_io_data.cc143
-rw-r--r--chrome/browser/profiles/profile_impl_io_data.h15
-rw-r--r--chrome/browser/profiles/profile_io_data.cc44
-rw-r--r--chrome/browser/profiles/profile_io_data.h37
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_;