| Index: trunk/src/chrome/browser/profiles/profile_impl_io_data.cc
|
| ===================================================================
|
| --- trunk/src/chrome/browser/profiles/profile_impl_io_data.cc (revision 219785)
|
| +++ trunk/src/chrome/browser/profiles/profile_impl_io_data.cc (working copy)
|
| @@ -22,7 +22,6 @@
|
| #include "chrome/browser/net/chrome_net_log.h"
|
| #include "chrome/browser/net/chrome_network_delegate.h"
|
| #include "chrome/browser/net/connect_interceptor.h"
|
| -#include "chrome/browser/net/cookie_store_util.h"
|
| #include "chrome/browser/net/http_server_properties_manager.h"
|
| #include "chrome/browser/net/predictor.h"
|
| #include "chrome/browser/net/sqlite_server_bound_cert_store.h"
|
| @@ -97,27 +96,33 @@
|
| }
|
|
|
| void ProfileImplIOData::Handle::Init(
|
| + const base::FilePath& cookie_path,
|
| const base::FilePath& server_bound_cert_path,
|
| const base::FilePath& cache_path,
|
| int cache_max_size,
|
| const base::FilePath& media_cache_path,
|
| int media_cache_max_size,
|
| + const base::FilePath& extensions_cookie_path,
|
| const base::FilePath& profile_path,
|
| const base::FilePath& infinite_cache_path,
|
| chrome_browser_net::Predictor* predictor,
|
| + bool restore_old_session_cookies,
|
| quota::SpecialStoragePolicy* special_storage_policy) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!io_data_->lazy_params_);
|
| DCHECK(predictor);
|
|
|
| - LazyParams* lazy_params = new LazyParams();
|
| + LazyParams* lazy_params = new LazyParams;
|
|
|
| + lazy_params->cookie_path = cookie_path;
|
| lazy_params->server_bound_cert_path = server_bound_cert_path;
|
| lazy_params->cache_path = cache_path;
|
| lazy_params->cache_max_size = cache_max_size;
|
| lazy_params->media_cache_path = media_cache_path;
|
| lazy_params->media_cache_max_size = media_cache_max_size;
|
| + lazy_params->extensions_cookie_path = extensions_cookie_path;
|
| lazy_params->infinite_cache_path = infinite_cache_path;
|
| + lazy_params->restore_old_session_cookies = restore_old_session_cookies;
|
| lazy_params->special_storage_policy = special_storage_policy;
|
|
|
| io_data_->lazy_params_.reset(lazy_params);
|
| @@ -186,6 +191,18 @@
|
| }
|
|
|
| scoped_refptr<ChromeURLRequestContextGetter>
|
| +ProfileImplIOData::Handle::GetExtensionsRequestContextGetter() const {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + LazyInitialize();
|
| + if (!extensions_request_context_getter_.get()) {
|
| + extensions_request_context_getter_ =
|
| + ChromeURLRequestContextGetter::CreateOriginalForExtensions(profile_,
|
| + io_data_);
|
| + }
|
| + return extensions_request_context_getter_;
|
| +}
|
| +
|
| +scoped_refptr<ChromeURLRequestContextGetter>
|
| ProfileImplIOData::Handle::CreateIsolatedAppRequestContextGetter(
|
| const base::FilePath& partition_path,
|
| bool in_memory,
|
| @@ -291,7 +308,8 @@
|
|
|
| ProfileImplIOData::LazyParams::LazyParams()
|
| : cache_max_size(0),
|
| - media_cache_max_size(0) {}
|
| + media_cache_max_size(0),
|
| + restore_old_session_cookies(false) {}
|
|
|
| ProfileImplIOData::LazyParams::~LazyParams() {}
|
|
|
| @@ -312,6 +330,13 @@
|
|
|
| IOThread* const io_thread = profile_params->io_thread;
|
| IOThread::Globals* const io_thread_globals = io_thread->globals();
|
| + const CommandLine& command_line = *CommandLine::ForCurrentProcess();
|
| + // Only allow Record Mode if we are in a Debug build or where we are running
|
| + // a cycle, and the user has limited control.
|
| + bool record_mode = command_line.HasSwitch(switches::kRecordMode) &&
|
| + (chrome::kRecordModeEnabled ||
|
| + command_line.HasSwitch(switches::kVisitURLs));
|
| + bool playback_mode = command_line.HasSwitch(switches::kPlaybackMode);
|
|
|
| network_delegate()->set_predictor(predictor_.get());
|
|
|
| @@ -343,14 +368,32 @@
|
|
|
| main_context->set_proxy_service(proxy_service());
|
|
|
| + scoped_refptr<net::CookieStore> cookie_store = NULL;
|
| net::ServerBoundCertService* server_bound_cert_service = NULL;
|
| - if (chrome_browser_net::ShouldUseInMemoryCookiesAndCache()) {
|
| + if (record_mode || playback_mode) {
|
| + // Don't use existing cookies and use an in-memory store.
|
| + cookie_store = new net::CookieMonster(
|
| + NULL, profile_params->cookie_monster_delegate.get());
|
| // Don't use existing server-bound certs and use an in-memory store.
|
| server_bound_cert_service = new net::ServerBoundCertService(
|
| new net::DefaultServerBoundCertStore(NULL),
|
| base::WorkerPool::GetTaskRunner(true));
|
| }
|
|
|
| + // setup cookie store
|
| + if (!cookie_store.get()) {
|
| + DCHECK(!lazy_params_->cookie_path.empty());
|
| +
|
| + cookie_store = content::CreatePersistentCookieStore(
|
| + lazy_params_->cookie_path,
|
| + lazy_params_->restore_old_session_cookies,
|
| + lazy_params_->special_storage_policy.get(),
|
| + profile_params->cookie_monster_delegate.get());
|
| + cookie_store->GetCookieMonster()->SetPersistSessionCookies(true);
|
| + }
|
| +
|
| + main_context->set_cookie_store(cookie_store.get());
|
| +
|
| // Setup server bound cert service.
|
| if (!server_bound_cert_service) {
|
| DCHECK(!lazy_params_->server_bound_cert_path.empty());
|
| @@ -385,10 +428,9 @@
|
| ChromeDataReductionProxyAndroid::Init(main_cache->GetSession());
|
| #endif
|
|
|
| - if (chrome_browser_net::ShouldUseInMemoryCookiesAndCache()) {
|
| + if (record_mode || playback_mode) {
|
| main_cache->set_mode(
|
| - chrome_browser_net::IsCookieRecordMode() ?
|
| - net::HttpCache::RECORD : net::HttpCache::PLAYBACK);
|
| + record_mode ? net::HttpCache::RECORD : net::HttpCache::PLAYBACK);
|
| }
|
|
|
| main_http_factory_.reset(main_cache);
|
| @@ -409,6 +451,10 @@
|
| ftp_factory_.get());
|
| main_context->set_job_factory(main_job_factory_.get());
|
|
|
| +#if defined(ENABLE_EXTENSIONS)
|
| + InitializeExtensionsRequestContext(profile_params);
|
| +#endif
|
| +
|
| // Create a media request context based on the main context, but using a
|
| // media cache. It shares the same job factory as the main context.
|
| StoragePartitionDescriptor details(profile_path_, false);
|
| @@ -418,6 +464,48 @@
|
| lazy_params_.reset();
|
| }
|
|
|
| +void ProfileImplIOData::
|
| + InitializeExtensionsRequestContext(ProfileParams* profile_params) const {
|
| + ChromeURLRequestContext* extensions_context = extensions_request_context();
|
| + IOThread* const io_thread = profile_params->io_thread;
|
| + IOThread::Globals* const io_thread_globals = io_thread->globals();
|
| + ApplyProfileParamsToContext(extensions_context);
|
| +
|
| + extensions_context->set_transport_security_state(transport_security_state());
|
| +
|
| + extensions_context->set_net_log(io_thread->net_log());
|
| +
|
| + extensions_context->set_throttler_manager(
|
| + io_thread_globals->throttler_manager.get());
|
| +
|
| + net::CookieStore* extensions_cookie_store =
|
| + content::CreatePersistentCookieStore(
|
| + lazy_params_->extensions_cookie_path,
|
| + lazy_params_->restore_old_session_cookies,
|
| + NULL,
|
| + NULL);
|
| + // Enable cookies for devtools and extension URLs.
|
| + const char* schemes[] = {chrome::kChromeDevToolsScheme,
|
| + extensions::kExtensionScheme};
|
| + extensions_cookie_store->GetCookieMonster()->SetCookieableSchemes(schemes, 2);
|
| + extensions_context->set_cookie_store(extensions_cookie_store);
|
| +
|
| + scoped_ptr<net::URLRequestJobFactoryImpl> extensions_job_factory(
|
| + new net::URLRequestJobFactoryImpl());
|
| + // 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. We pass NULL in to
|
| + // SetUpJobFactory() to get this effect.
|
| + extensions_job_factory_ = SetUpJobFactoryDefaults(
|
| + extensions_job_factory.Pass(),
|
| + scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>(),
|
| + NULL,
|
| + ftp_factory_.get());
|
| + extensions_context->set_job_factory(extensions_job_factory_.get());
|
| +}
|
| +
|
| ChromeURLRequestContext*
|
| ProfileImplIOData::InitializeAppRequestContext(
|
| ChromeURLRequestContext* main_context,
|
| @@ -429,9 +517,19 @@
|
| AppRequestContext* context = new AppRequestContext(load_time_stats());
|
| context->CopyFrom(main_context);
|
|
|
| + base::FilePath cookie_path = partition_descriptor.path.Append(
|
| + chrome::kCookieFilename);
|
| base::FilePath cache_path =
|
| partition_descriptor.path.Append(chrome::kCacheDirname);
|
|
|
| + const CommandLine& command_line = *CommandLine::ForCurrentProcess();
|
| + // Only allow Record Mode if we are in a Debug build or where we are running
|
| + // a cycle, and the user has limited control.
|
| + bool record_mode = command_line.HasSwitch(switches::kRecordMode) &&
|
| + (chrome::kRecordModeEnabled ||
|
| + command_line.HasSwitch(switches::kVisitURLs));
|
| + bool playback_mode = command_line.HasSwitch(switches::kPlaybackMode);
|
| +
|
| // Use a separate HTTP disk cache for isolated apps.
|
| net::HttpCache::BackendFactory* app_backend = NULL;
|
| if (partition_descriptor.in_memory) {
|
| @@ -450,12 +548,35 @@
|
| net::HttpCache* app_http_cache =
|
| new net::HttpCache(main_network_session, app_backend);
|
|
|
| - if (chrome_browser_net::ShouldUseInMemoryCookiesAndCache()) {
|
| + scoped_refptr<net::CookieStore> cookie_store = NULL;
|
| + if (partition_descriptor.in_memory) {
|
| + cookie_store = new net::CookieMonster(NULL, NULL);
|
| + } else if (record_mode || playback_mode) {
|
| + // Don't use existing cookies and use an in-memory store.
|
| + // TODO(creis): We should have a cookie delegate for notifying the cookie
|
| + // extensions API, but we need to update it to understand isolated apps
|
| + // first.
|
| + cookie_store = new net::CookieMonster(NULL, NULL);
|
| app_http_cache->set_mode(
|
| - chrome_browser_net::IsCookieRecordMode() ?
|
| - net::HttpCache::RECORD : net::HttpCache::PLAYBACK);
|
| + record_mode ? net::HttpCache::RECORD : net::HttpCache::PLAYBACK);
|
| }
|
|
|
| + // Use an app-specific cookie store.
|
| + if (!cookie_store.get()) {
|
| + DCHECK(!cookie_path.empty());
|
| +
|
| + // TODO(creis): We should have a cookie delegate for notifying the cookie
|
| + // extensions API, but we need to update it to understand isolated apps
|
| + // first.
|
| + cookie_store = content::CreatePersistentCookieStore(
|
| + cookie_path,
|
| + false,
|
| + NULL,
|
| + NULL);
|
| + }
|
| +
|
| + // Transfer ownership of the cookies and cache to AppRequestContext.
|
| + context->SetCookieStore(cookie_store.get());
|
| context->SetHttpTransactionFactory(
|
| scoped_ptr<net::HttpTransactionFactory>(app_http_cache));
|
|
|
|
|