1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be 3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file. 4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/profiles/profile_impl_io_data.h" 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/command_line.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/file_util.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/logging.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/stl_util-inl.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/io_thread.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/net/chrome_net_log.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/net/chrome_network_delegate.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/net/sqlite_persistent_cookie_store.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/chrome_constants.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/chrome_switches.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/pref_names.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/url_constants.h" 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/resource_context.h" 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/ftp/ftp_network_layer.h" 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/http/http_cache.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 24dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenProfileImplIOData::Handle::Handle(Profile* profile) 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : io_data_(new ProfileImplIOData), 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile_(profile), 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen initialized_(false) { 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(profile); 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 32dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenProfileImplIOData::Handle::~Handle() { 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (main_request_context_getter_) 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen main_request_context_getter_->CleanupOnUIThread(); 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (media_request_context_getter_) 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_getter_->CleanupOnUIThread(); 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (extensions_request_context_getter_) 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen extensions_request_context_getter_->CleanupOnUIThread(); 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Clean up all isolated app request contexts. 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (ChromeURLRequestContextGetterMap::iterator iter = 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen app_request_context_getter_map_.begin(); 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter != app_request_context_getter_map_.end(); 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ++iter) { 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter->second->CleanupOnUIThread(); 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen io_data_->ShutdownOnUIThread(); 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ProfileImplIOData::Handle::Init(const FilePath& cookie_path, 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const FilePath& cache_path, 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int cache_max_size, 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const FilePath& media_cache_path, 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int media_cache_max_size, 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const FilePath& extensions_cookie_path, 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const FilePath& app_path) { 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(!io_data_->lazy_params_.get()); 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LazyParams* lazy_params = new LazyParams; 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params->cookie_path = cookie_path; 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params->cache_path = cache_path; 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params->cache_max_size = cache_max_size; 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params->media_cache_path = media_cache_path; 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params->media_cache_max_size = media_cache_max_size; 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params->extensions_cookie_path = extensions_cookie_path; 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen io_data_->lazy_params_.reset(lazy_params); 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Keep track of isolated app path separately so we can use it on demand. 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen io_data_->app_path_ = app_path; 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst content::ResourceContext& 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenProfileImplIOData::Handle::GetResourceContext() const { 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LazyInitialize(); 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return io_data_->GetResourceContext(); 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenscoped_refptr<ChromeURLRequestContextGetter> 84dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenProfileImplIOData::Handle::GetMainRequestContextGetter() const { 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LazyInitialize(); 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!main_request_context_getter_) { 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen main_request_context_getter_ = 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ChromeURLRequestContextGetter::CreateOriginal( 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile_, io_data_); 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return main_request_context_getter_; 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenscoped_refptr<ChromeURLRequestContextGetter> 96dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenProfileImplIOData::Handle::GetMediaRequestContextGetter() const { 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LazyInitialize(); 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!media_request_context_getter_) { 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_getter_ = 101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ChromeURLRequestContextGetter::CreateOriginalForMedia( 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile_, io_data_); 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return media_request_context_getter_; 105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenscoped_refptr<ChromeURLRequestContextGetter> 108dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenProfileImplIOData::Handle::GetExtensionsRequestContextGetter() const { 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LazyInitialize(); 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!extensions_request_context_getter_) { 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen extensions_request_context_getter_ = 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ChromeURLRequestContextGetter::CreateOriginalForExtensions( 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile_, io_data_); 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return extensions_request_context_getter_; 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenscoped_refptr<ChromeURLRequestContextGetter> 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenProfileImplIOData::Handle::GetIsolatedAppRequestContextGetter( 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& app_id) const { 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(!app_id.empty()); 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LazyInitialize(); 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Keep a map of request context getters, one per requested app ID. 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeURLRequestContextGetterMap::iterator iter = 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen app_request_context_getter_map_.find(app_id); 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (iter != app_request_context_getter_map_.end()) 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return iter->second; 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeURLRequestContextGetter* context = 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeURLRequestContextGetter::CreateOriginalForIsolatedApp( 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_, io_data_, app_id); 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen app_request_context_getter_map_[app_id] = context; 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return context; 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ProfileImplIOData::Handle::LazyInitialize() const { 141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!initialized_) { 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen io_data_->InitializeProfileParams(profile_); 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeNetworkDelegate::InitializeReferrersEnabled( 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen io_data_->enable_referrers(), profile_->GetPrefs()); 145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen initialized_ = true; 146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 149dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenProfileImplIOData::LazyParams::LazyParams() 150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : cache_max_size(0), 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen media_cache_max_size(0) {} 152dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenProfileImplIOData::LazyParams::~LazyParams() {} 153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenProfileImplIOData::ProfileImplIOData() 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : ProfileIOData(false), 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen clear_local_state_on_exit_(false) {} 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenProfileImplIOData::~ProfileImplIOData() { 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen STLDeleteValues(&app_http_factory_map_); 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ProfileImplIOData::LazyInitializeInternal( 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ProfileParams* profile_params) const { 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Keep track of clear_local_state_on_exit for isolated apps. 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen clear_local_state_on_exit_ = profile_params->clear_local_state_on_exit; 165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeURLRequestContext* main_context = main_request_context(); 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeURLRequestContext* extensions_context = extensions_request_context(); 168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_ = new RequestContext; 169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IOThread* const io_thread = profile_params->io_thread; 171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IOThread::Globals* const io_thread_globals = io_thread->globals(); 172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool record_mode = chrome::kRecordModeEnabled && 174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen command_line.HasSwitch(switches::kRecordMode); 175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool playback_mode = command_line.HasSwitch(switches::kPlaybackMode); 176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Initialize context members. 178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ApplyProfileParamsToContext(main_context); 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ApplyProfileParamsToContext(media_request_context_); 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ApplyProfileParamsToContext(extensions_context); 182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_cookie_policy(cookie_policy()); 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen media_request_context_->set_cookie_policy(cookie_policy()); 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen extensions_context->set_cookie_policy(cookie_policy()); 186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_net_log(io_thread->net_log()); 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen media_request_context_->set_net_log(io_thread->net_log()); 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen extensions_context->set_net_log(io_thread->net_log()); 190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_network_delegate(network_delegate()); 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen media_request_context_->set_network_delegate(network_delegate()); 193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_host_resolver( 195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen io_thread_globals->host_resolver.get()); 196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_->set_host_resolver( 197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen io_thread_globals->host_resolver.get()); 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_cert_verifier( 199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen io_thread_globals->cert_verifier.get()); 200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_->set_cert_verifier( 201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen io_thread_globals->cert_verifier.get()); 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_dnsrr_resolver( 203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen io_thread_globals->dnsrr_resolver.get()); 204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_->set_dnsrr_resolver( 205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen io_thread_globals->dnsrr_resolver.get()); 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_http_auth_handler_factory( 207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen io_thread_globals->http_auth_handler_factory.get()); 208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_->set_http_auth_handler_factory( 209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen io_thread_globals->http_auth_handler_factory.get()); 210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_dns_cert_checker(dns_cert_checker()); 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen media_request_context_->set_dns_cert_checker(dns_cert_checker()); 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_proxy_service(proxy_service()); 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen media_request_context_->set_proxy_service(proxy_service()); 216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::HttpCache::DefaultBackend* main_backend = 218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new net::HttpCache::DefaultBackend( 219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::DISK_CACHE, 220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params_->cache_path, 221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params_->cache_max_size, 222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); 223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::HttpCache* main_cache = new net::HttpCache( 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->host_resolver(), 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->cert_verifier(), 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->dnsrr_resolver(), 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->dns_cert_checker(), 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->proxy_service(), 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->ssl_config_service(), 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->http_auth_handler_factory(), 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->network_delegate(), 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->net_log(), 233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen main_backend); 234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::HttpCache::DefaultBackend* media_backend = 236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new net::HttpCache::DefaultBackend( 237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::MEDIA_CACHE, lazy_params_->media_cache_path, 238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params_->media_cache_max_size, 239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); 240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::HttpNetworkSession* main_network_session = main_cache->GetSession(); 241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::HttpCache* media_cache = 242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new net::HttpCache(main_network_session, media_backend); 243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_refptr<net::CookieStore> cookie_store = NULL; 245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (record_mode || playback_mode) { 246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Don't use existing cookies and use an in-memory store. 247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cookie_store = new net::CookieMonster( 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NULL, profile_params->cookie_monster_delegate); 249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen main_cache->set_mode( 250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen record_mode ? net::HttpCache::RECORD : net::HttpCache::PLAYBACK); 251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // setup cookie store 254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!cookie_store) { 255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(!lazy_params_->cookie_path.empty()); 256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_refptr<SQLitePersistentCookieStore> cookie_db = 258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new SQLitePersistentCookieStore(lazy_params_->cookie_path); 259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cookie_db->SetClearLocalStateOnExit( 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_params->clear_local_state_on_exit); 261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cookie_store = 262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new net::CookieMonster(cookie_db.get(), 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_params->cookie_monster_delegate); 264dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 265dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 266dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::CookieMonster* extensions_cookie_store = 267dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new net::CookieMonster( 268dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new SQLitePersistentCookieStore( 269dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params_->extensions_cookie_path), NULL); 270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Enable cookies for devtools and extension URLs. 271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char* schemes[] = {chrome::kChromeDevToolsScheme, 272dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen chrome::kExtensionScheme}; 273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen extensions_cookie_store->SetCookieableSchemes(schemes, 2); 274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_cookie_store(cookie_store); 276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_->set_cookie_store(cookie_store); 277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen extensions_context->set_cookie_store( 278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen extensions_cookie_store); 279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen main_http_factory_.reset(main_cache); 281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_http_factory_.reset(media_cache); 282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_http_transaction_factory(main_cache); 283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_->set_http_transaction_factory(media_cache); 284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_context->set_ftp_transaction_factory( 286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new net::FtpNetworkLayer(io_thread_globals->host_resolver.get())); 287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen lazy_params_.reset(); 289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenscoped_refptr<ProfileIOData::RequestContext> 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenProfileImplIOData::InitializeAppRequestContext( 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<ChromeURLRequestContext> main_context, 294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& app_id) const { 295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<ProfileIOData::RequestContext> context = new RequestContext; 296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Copy most state from the main context. 298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen context->CopyFrom(main_context); 299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath app_path = app_path_.AppendASCII(app_id); 301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath cookie_path = app_path.Append(chrome::kCookieFilename); 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath cache_path = app_path.Append(chrome::kCacheDirname); 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(creis): Determine correct cache size. 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int cache_max_size = 0; 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool record_mode = chrome::kRecordModeEnabled && 308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen command_line.HasSwitch(switches::kRecordMode); 309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool playback_mode = command_line.HasSwitch(switches::kPlaybackMode); 310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Use a separate HTTP disk cache for isolated apps. 312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen net::HttpCache::DefaultBackend* app_backend = 313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new net::HttpCache::DefaultBackend( 314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen net::DISK_CACHE, 315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache_path, 316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cache_max_size, 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); 318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen net::HttpNetworkSession* main_network_session = 319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_http_factory_->GetSession(); 320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen net::HttpCache* app_http_cache = 321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new net::HttpCache(main_network_session, app_backend); 322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<net::CookieStore> cookie_store = NULL; 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (record_mode || playback_mode) { 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Don't use existing cookies and use an in-memory store. 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(creis): We should have a cookie delegate for notifying the cookie 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // extensions API, but we need to update it to understand isolated apps 328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // first. 329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cookie_store = new net::CookieMonster(NULL, NULL); 330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen app_http_cache->set_mode( 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen record_mode ? net::HttpCache::RECORD : net::HttpCache::PLAYBACK); 332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Use an app-specific cookie store. 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!cookie_store) { 336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(!cookie_path.empty()); 337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<SQLitePersistentCookieStore> cookie_db = 339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new SQLitePersistentCookieStore(cookie_path); 340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cookie_db->SetClearLocalStateOnExit(clear_local_state_on_exit_); 341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(creis): We should have a cookie delegate for notifying the cookie 342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // extensions API, but we need to update it to understand isolated apps 343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // first. 344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cookie_store = new net::CookieMonster(cookie_db.get(), NULL); 345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen context->set_cookie_store(cookie_store); 348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Keep track of app_http_cache to delete it when we go away. 350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(!app_http_factory_map_[app_id]); 351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen app_http_factory_map_[app_id] = app_http_cache; 352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen context->set_http_transaction_factory(app_http_cache); 353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return context; 355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 356dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 357dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenscoped_refptr<ChromeURLRequestContext> 358dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenProfileImplIOData::AcquireMediaRequestContext() const { 359dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(media_request_context_); 360dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_refptr<ChromeURLRequestContext> context = media_request_context_; 361dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_->set_profile_io_data(this); 362dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen media_request_context_ = NULL; 363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return context; 364dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 365dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 366dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenscoped_refptr<ChromeURLRequestContext> 367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenProfileImplIOData::AcquireIsolatedAppRequestContext( 368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<ChromeURLRequestContext> main_context, 369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& app_id) const { 370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // We create per-app contexts on demand, unlike the others above. 371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RequestContext> app_request_context = 372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InitializeAppRequestContext(main_context, app_id); 373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(app_request_context); 374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen app_request_context->set_profile_io_data(this); 375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return app_request_context; 376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 377