| Index: chrome/browser/net/chrome_url_request_context.cc
|
| ===================================================================
|
| --- chrome/browser/net/chrome_url_request_context.cc (revision 31010)
|
| +++ chrome/browser/net/chrome_url_request_context.cc (working copy)
|
| @@ -33,81 +33,29 @@
|
| #include "net/ocsp/nss_ocsp.h"
|
| #endif
|
|
|
| -// TODO(eroman): Fix the definition ordering to match-up with the declaration
|
| -// ordering (this was done to help keep the diffs simple during
|
| -// refactor).
|
| -
|
| +namespace {
|
| // TODO(eroman): The ChromeURLRequestContext's Blacklist* is shared with the
|
| // Profile... This is a problem since the Profile dies before
|
| // the IO thread, so we may end up accessing a deleted variable.
|
| +// http://crbug.com/26733.
|
|
|
| -static void CheckCurrentlyOnIOThread() {
|
| +// ----------------------------------------------------------------------------
|
| +// Helper methods to check current thread
|
| +// ----------------------------------------------------------------------------
|
| +
|
| +void CheckCurrentlyOnIOThread() {
|
| DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
|
| }
|
|
|
| -static void CheckCurrentlyOnMainThread() {
|
| +void CheckCurrentlyOnMainThread() {
|
| DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
|
| }
|
|
|
| -net::ProxyConfig* CreateProxyConfig(const CommandLine& command_line) {
|
| - // Scan for all "enable" type proxy switches.
|
| - static const char* proxy_switches[] = {
|
| - switches::kProxyServer,
|
| - switches::kProxyPacUrl,
|
| - switches::kProxyAutoDetect,
|
| - switches::kProxyBypassList
|
| - };
|
| +// ----------------------------------------------------------------------------
|
| +// Helper methods to initialize proxy
|
| +// ----------------------------------------------------------------------------
|
|
|
| - bool found_enable_proxy_switch = false;
|
| - for (size_t i = 0; i < arraysize(proxy_switches); i++) {
|
| - if (command_line.HasSwitch(proxy_switches[i])) {
|
| - found_enable_proxy_switch = true;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (!found_enable_proxy_switch &&
|
| - !command_line.HasSwitch(switches::kNoProxyServer)) {
|
| - return NULL;
|
| - }
|
| -
|
| - net::ProxyConfig* proxy_config = new net::ProxyConfig();
|
| - if (command_line.HasSwitch(switches::kNoProxyServer)) {
|
| - // Ignore (and warn about) all the other proxy config switches we get if
|
| - // the --no-proxy-server command line argument is present.
|
| - if (found_enable_proxy_switch) {
|
| - LOG(WARNING) << "Additional command line proxy switches found when --"
|
| - << switches::kNoProxyServer << " was specified.";
|
| - }
|
| - return proxy_config;
|
| - }
|
| -
|
| - if (command_line.HasSwitch(switches::kProxyServer)) {
|
| - const std::wstring& proxy_server =
|
| - command_line.GetSwitchValue(switches::kProxyServer);
|
| - proxy_config->proxy_rules.ParseFromString(WideToASCII(proxy_server));
|
| - }
|
| -
|
| - if (command_line.HasSwitch(switches::kProxyPacUrl)) {
|
| - proxy_config->pac_url =
|
| - GURL(WideToASCII(command_line.GetSwitchValue(
|
| - switches::kProxyPacUrl)));
|
| - }
|
| -
|
| - if (command_line.HasSwitch(switches::kProxyAutoDetect)) {
|
| - proxy_config->auto_detect = true;
|
| - }
|
| -
|
| - if (command_line.HasSwitch(switches::kProxyBypassList)) {
|
| - proxy_config->ParseNoProxyList(
|
| - WideToASCII(command_line.GetSwitchValue(
|
| - switches::kProxyBypassList)));
|
| - }
|
| -
|
| - return proxy_config;
|
| -}
|
| -
|
| -static net::ProxyConfigService* CreateProxyConfigService(
|
| +net::ProxyConfigService* CreateProxyConfigService(
|
| const CommandLine& command_line) {
|
| // The linux gconf-based proxy settings getter relies on being initialized
|
| // from the UI thread.
|
| @@ -131,7 +79,7 @@
|
| }
|
|
|
| // Create a proxy service according to the options on command line.
|
| -static net::ProxyService* CreateProxyService(
|
| +net::ProxyService* CreateProxyService(
|
| URLRequestContext* context,
|
| net::ProxyConfigService* proxy_config_service,
|
| const CommandLine& command_line,
|
| @@ -153,19 +101,10 @@
|
| io_loop);
|
| }
|
|
|
| -// Lazily create a ChromeURLRequestContext using our factory.
|
| -URLRequestContext* ChromeURLRequestContextGetter::GetURLRequestContext() {
|
| - CheckCurrentlyOnIOThread();
|
| +// ----------------------------------------------------------------------------
|
| +// Helper factories
|
| +// ----------------------------------------------------------------------------
|
|
|
| - if (!url_request_context_) {
|
| - DCHECK(factory_.get());
|
| - url_request_context_ = factory_->Create();
|
| - factory_.reset();
|
| - }
|
| -
|
| - return url_request_context_;
|
| -}
|
| -
|
| // Factory that creates the main ChromeURLRequestContext.
|
| class FactoryForOriginal : public ChromeURLRequestContextFactory {
|
| public:
|
| @@ -195,19 +134,6 @@
|
| scoped_ptr<net::ProxyConfigService> proxy_config_service_;
|
| };
|
|
|
| -// static
|
| -ChromeURLRequestContextGetter* ChromeURLRequestContextGetter::CreateOriginal(
|
| - Profile* profile, const FilePath& cookie_store_path,
|
| - const FilePath& disk_cache_path, int cache_size) {
|
| - DCHECK(!profile->IsOffTheRecord());
|
| - return new ChromeURLRequestContextGetter(
|
| - profile,
|
| - new FactoryForOriginal(profile,
|
| - cookie_store_path,
|
| - disk_cache_path,
|
| - cache_size));
|
| -}
|
| -
|
| ChromeURLRequestContext* FactoryForOriginal::Create() {
|
| ChromeURLRequestContext* context = new ChromeURLRequestContext;
|
| ApplyProfileParametersToContext(context);
|
| @@ -278,15 +204,6 @@
|
| return context;
|
| }
|
|
|
| -// static
|
| -ChromeURLRequestContextGetter*
|
| -ChromeURLRequestContextGetter::CreateOriginalForMedia(
|
| - Profile* profile, const FilePath& disk_cache_path, int cache_size) {
|
| - DCHECK(!profile->IsOffTheRecord());
|
| - return CreateRequestContextForMedia(profile, disk_cache_path, cache_size,
|
| - false);
|
| -}
|
| -
|
| // Factory that creates the ChromeURLRequestContext for extensions.
|
| class FactoryForExtensions : public ChromeURLRequestContextFactory {
|
| public:
|
| @@ -301,16 +218,6 @@
|
| FilePath cookie_store_path_;
|
| };
|
|
|
| -// static
|
| -ChromeURLRequestContextGetter*
|
| -ChromeURLRequestContextGetter::CreateOriginalForExtensions(
|
| - Profile* profile, const FilePath& cookie_store_path) {
|
| - DCHECK(!profile->IsOffTheRecord());
|
| - return new ChromeURLRequestContextGetter(
|
| - profile,
|
| - new FactoryForExtensions(profile, cookie_store_path));
|
| -}
|
| -
|
| ChromeURLRequestContext* FactoryForExtensions::Create() {
|
| ChromeURLRequestContext* context = new ChromeURLRequestContext;
|
| ApplyProfileParametersToContext(context);
|
| @@ -346,14 +253,6 @@
|
| scoped_refptr<ChromeURLRequestContextGetter> original_context_getter_;
|
| };
|
|
|
| -// static
|
| -ChromeURLRequestContextGetter* ChromeURLRequestContextGetter::CreateOffTheRecord(
|
| - Profile* profile) {
|
| - DCHECK(profile->IsOffTheRecord());
|
| - return new ChromeURLRequestContextGetter(
|
| - profile, new FactoryForOffTheRecord(profile));
|
| -}
|
| -
|
| ChromeURLRequestContext* FactoryForOffTheRecord::Create() {
|
| ChromeURLRequestContext* context = new ChromeURLRequestContext;
|
| ApplyProfileParametersToContext(context);
|
| @@ -410,15 +309,6 @@
|
| virtual ChromeURLRequestContext* Create();
|
| };
|
|
|
| -// static
|
| -ChromeURLRequestContextGetter*
|
| -ChromeURLRequestContextGetter::CreateOffTheRecordForExtensions(Profile* profile) {
|
| - DCHECK(profile->IsOffTheRecord());
|
| - return new ChromeURLRequestContextGetter(
|
| - profile,
|
| - new FactoryForOffTheRecordExtensions(profile));
|
| -}
|
| -
|
| ChromeURLRequestContext* FactoryForOffTheRecordExtensions::Create() {
|
| ChromeURLRequestContext* context = new ChromeURLRequestContext;
|
| ApplyProfileParametersToContext(context);
|
| @@ -459,19 +349,6 @@
|
| int cache_size_;
|
| };
|
|
|
| -// static
|
| -ChromeURLRequestContextGetter*
|
| -ChromeURLRequestContextGetter::CreateRequestContextForMedia(
|
| - Profile* profile, const FilePath& disk_cache_path, int cache_size,
|
| - bool off_the_record) {
|
| - return new ChromeURLRequestContextGetter(
|
| - profile,
|
| - new FactoryForMedia(profile,
|
| - disk_cache_path,
|
| - cache_size,
|
| - off_the_record));
|
| -}
|
| -
|
| ChromeURLRequestContext* FactoryForMedia::Create() {
|
| ChromeURLRequestContext* context = new ChromeURLRequestContext;
|
| ApplyProfileParametersToContext(context);
|
| @@ -524,6 +401,12 @@
|
| return context;
|
| }
|
|
|
| +} // namespace
|
| +
|
| +// ----------------------------------------------------------------------------
|
| +// ChromeURLRequestContextGetter
|
| +// ----------------------------------------------------------------------------
|
| +
|
| ChromeURLRequestContextGetter::ChromeURLRequestContextGetter(
|
| Profile* profile,
|
| ChromeURLRequestContextFactory* factory)
|
| @@ -537,127 +420,137 @@
|
| RegisterPrefsObserver(profile);
|
| }
|
|
|
| -// Extract values from |profile| and copy them into
|
| -// ChromeURLRequestContextFactory. We will use them later when constructing the
|
| -// ChromeURLRequestContext on the IO thread (see
|
| -// ApplyProfileParametersToContext() which reverses this).
|
| -ChromeURLRequestContextFactory::ChromeURLRequestContextFactory(Profile* profile)
|
| - : is_media_(false),
|
| - is_off_the_record_(profile->IsOffTheRecord()) {
|
| - CheckCurrentlyOnMainThread();
|
| - PrefService* prefs = profile->GetPrefs();
|
| +ChromeURLRequestContextGetter::~ChromeURLRequestContextGetter() {
|
| + CheckCurrentlyOnIOThread();
|
|
|
| - // Set up Accept-Language and Accept-Charset header values
|
| - accept_language_ = net::HttpUtil::GenerateAcceptLanguageHeader(
|
| - WideToASCII(prefs->GetString(prefs::kAcceptLanguages)));
|
| - std::string default_charset =
|
| - WideToASCII(prefs->GetString(prefs::kDefaultCharset));
|
| - accept_charset_ =
|
| - net::HttpUtil::GenerateAcceptCharsetHeader(default_charset);
|
| + DCHECK(!prefs_) << "Probably didn't call CleanupOnUIThread";
|
|
|
| - // At this point, we don't know the charset of the referring page
|
| - // where a url request originates from. This is used to get a suggested
|
| - // filename from Content-Disposition header made of raw 8bit characters.
|
| - // Down the road, it can be overriden if it becomes known (for instance,
|
| - // when download request is made through the context menu in a web page).
|
| - // At the moment, it'll remain 'undeterministic' when a user
|
| - // types a URL in the omnibar or click on a download link in a page.
|
| - // For the latter, we need a change on the webkit-side.
|
| - // We initialize it to the default charset here and a user will
|
| - // have an *arguably* better default charset for interpreting a raw 8bit
|
| - // C-D header field. It means the native OS codepage fallback in
|
| - // net_util::GetSuggestedFilename is unlikely to be taken.
|
| - referrer_charset_ = default_charset;
|
| + // Either we already transformed the factory into a URLRequestContext, or
|
| + // we still have a pending factory.
|
| + DCHECK((factory_.get() && !url_request_context_.get()) ||
|
| + (!factory_.get() && url_request_context_.get()));
|
|
|
| - cookie_policy_type_ = net::CookiePolicy::FromInt(
|
| - prefs->GetInteger(prefs::kCookieBehavior));
|
| + // The scoped_refptr / scoped_ptr destructors take care of releasing
|
| + // |factory_| and |url_request_context_| now.
|
| +}
|
|
|
| - // TODO(eroman): this doesn't look safe; sharing between IO and UI threads!
|
| - blacklist_ = profile->GetBlacklist();
|
| +// Lazily create a ChromeURLRequestContext using our factory.
|
| +URLRequestContext* ChromeURLRequestContextGetter::GetURLRequestContext() {
|
| + CheckCurrentlyOnIOThread();
|
|
|
| - // TODO(eroman): this doesn't look safe; sharing between IO and UI threads!
|
| - strict_transport_security_state_ = profile->GetStrictTransportSecurityState();
|
| -
|
| - if (profile->GetExtensionsService()) {
|
| - const ExtensionList* extensions =
|
| - profile->GetExtensionsService()->extensions();
|
| - for (ExtensionList::const_iterator iter = extensions->begin();
|
| - iter != extensions->end(); ++iter) {
|
| - extension_paths_[(*iter)->id()] = (*iter)->path();
|
| - }
|
| + if (!url_request_context_) {
|
| + DCHECK(factory_.get());
|
| + url_request_context_ = factory_->Create();
|
| + factory_.reset();
|
| }
|
|
|
| - if (profile->GetUserScriptMaster())
|
| - user_script_dir_path_ = profile->GetUserScriptMaster()->user_script_dir();
|
| + return url_request_context_;
|
| +}
|
|
|
| - // TODO(eroman): this doesn't look safe; sharing between IO and UI threads!
|
| - ssl_config_service_ = profile->GetSSLConfigService();
|
| +net::CookieStore* ChromeURLRequestContextGetter::GetCookieStore() {
|
| + // If we are running on the IO thread this is real easy.
|
| + if (ChromeThread::CurrentlyOn(ChromeThread::IO))
|
| + return GetURLRequestContext()->cookie_store();
|
|
|
| - profile_dir_path_ = profile->GetPath();
|
| + // If we aren't running on the IO thread, we cannot call
|
| + // GetURLRequestContext(). Instead we will post a task to the IO loop
|
| + // and wait for it to complete.
|
| +
|
| + base::WaitableEvent completion(false, false);
|
| + net::CookieStore* result = NULL;
|
| +
|
| + ChromeThread::PostTask(
|
| + ChromeThread::IO, FROM_HERE,
|
| + NewRunnableMethod(this,
|
| + &ChromeURLRequestContextGetter::GetCookieStoreAsyncHelper,
|
| + &completion,
|
| + &result));
|
| +
|
| + completion.Wait();
|
| + DCHECK(result);
|
| + return result;
|
| }
|
|
|
| -ChromeURLRequestContextFactory::~ChromeURLRequestContextFactory() {
|
| - CheckCurrentlyOnIOThread();
|
| +// static
|
| +ChromeURLRequestContextGetter* ChromeURLRequestContextGetter::CreateOriginal(
|
| + Profile* profile, const FilePath& cookie_store_path,
|
| + const FilePath& disk_cache_path, int cache_size) {
|
| + DCHECK(!profile->IsOffTheRecord());
|
| + return new ChromeURLRequestContextGetter(
|
| + profile,
|
| + new FactoryForOriginal(profile,
|
| + cookie_store_path,
|
| + disk_cache_path,
|
| + cache_size));
|
| }
|
|
|
| -void ChromeURLRequestContextFactory::ApplyProfileParametersToContext(
|
| - ChromeURLRequestContext* context) {
|
| - // Apply all the parameters. NOTE: keep this in sync with
|
| - // ChromeURLRequestContextFactory(Profile*).
|
| - context->set_is_media(is_media_);
|
| - context->set_is_off_the_record(is_off_the_record_);
|
| - context->set_accept_language(accept_language_);
|
| - context->set_accept_charset(accept_charset_);
|
| - context->set_referrer_charset(referrer_charset_);
|
| - context->set_cookie_policy_type(cookie_policy_type_);
|
| - context->set_extension_paths(extension_paths_);
|
| - context->set_user_script_dir_path(user_script_dir_path_);
|
| - context->set_blacklist(blacklist_);
|
| - context->set_strict_transport_security_state(
|
| - strict_transport_security_state_);
|
| - context->set_ssl_config_service(ssl_config_service_);
|
| +// static
|
| +ChromeURLRequestContextGetter*
|
| +ChromeURLRequestContextGetter::CreateOriginalForMedia(
|
| + Profile* profile, const FilePath& disk_cache_path, int cache_size) {
|
| + DCHECK(!profile->IsOffTheRecord());
|
| + return CreateRequestContextForMedia(profile, disk_cache_path, cache_size,
|
| + false);
|
| }
|
|
|
| -void ChromeURLRequestContextGetter::RegisterPrefsObserver(Profile* profile) {
|
| - CheckCurrentlyOnMainThread();
|
| +// static
|
| +ChromeURLRequestContextGetter*
|
| +ChromeURLRequestContextGetter::CreateOriginalForExtensions(
|
| + Profile* profile, const FilePath& cookie_store_path) {
|
| + DCHECK(!profile->IsOffTheRecord());
|
| + return new ChromeURLRequestContextGetter(
|
| + profile,
|
| + new FactoryForExtensions(profile, cookie_store_path));
|
| +}
|
|
|
| - prefs_ = profile->GetPrefs();
|
| +// static
|
| +ChromeURLRequestContextGetter* ChromeURLRequestContextGetter::CreateOffTheRecord(
|
| + Profile* profile) {
|
| + DCHECK(profile->IsOffTheRecord());
|
| + return new ChromeURLRequestContextGetter(
|
| + profile, new FactoryForOffTheRecord(profile));
|
| +}
|
|
|
| - prefs_->AddPrefObserver(prefs::kAcceptLanguages, this);
|
| - prefs_->AddPrefObserver(prefs::kCookieBehavior, this);
|
| - prefs_->AddPrefObserver(prefs::kDefaultCharset, this);
|
| +// static
|
| +ChromeURLRequestContextGetter*
|
| +ChromeURLRequestContextGetter::CreateOffTheRecordForExtensions(Profile* profile) {
|
| + DCHECK(profile->IsOffTheRecord());
|
| + return new ChromeURLRequestContextGetter(
|
| + profile,
|
| + new FactoryForOffTheRecordExtensions(profile));
|
| }
|
|
|
| -ChromeURLRequestContext::ChromeURLRequestContext(
|
| - ChromeURLRequestContext* other) {
|
| - CheckCurrentlyOnIOThread();
|
| +void ChromeURLRequestContextGetter::CleanupOnUIThread() {
|
| + CheckCurrentlyOnMainThread();
|
|
|
| - // Set URLRequestContext members
|
| - host_resolver_ = other->host_resolver_;
|
| - proxy_service_ = other->proxy_service_;
|
| - ssl_config_service_ = other->ssl_config_service_;
|
| - http_transaction_factory_ = other->http_transaction_factory_;
|
| - ftp_transaction_factory_ = other->ftp_transaction_factory_;
|
| - cookie_store_ = other->cookie_store_;
|
| - cookie_policy_.set_type(other->cookie_policy_.type());
|
| - strict_transport_security_state_ = other->strict_transport_security_state_;
|
| - accept_language_ = other->accept_language_;
|
| - accept_charset_ = other->accept_charset_;
|
| - referrer_charset_ = other->referrer_charset_;
|
| + if (prefs_) {
|
| + // Unregister for pref notifications.
|
| + prefs_->RemovePrefObserver(prefs::kAcceptLanguages, this);
|
| + prefs_->RemovePrefObserver(prefs::kCookieBehavior, this);
|
| + prefs_->RemovePrefObserver(prefs::kDefaultCharset, this);
|
| + prefs_ = NULL;
|
| + }
|
|
|
| - // Set ChromeURLRequestContext members
|
| - appcache_service_ = other->appcache_service_;
|
| - extension_paths_ = other->extension_paths_;
|
| - user_script_dir_path_ = other->user_script_dir_path_;
|
| - blacklist_ = other->blacklist_;
|
| - is_media_ = other->is_media_;
|
| - is_off_the_record_ = other->is_off_the_record_;
|
| + // TODO(eroman): Doesn't look like this member is even used...
|
| + // can probably be deleted.
|
| + registrar_.RemoveAll();
|
| }
|
|
|
| +void ChromeURLRequestContextGetter::OnNewExtensions(const std::string& id,
|
| + const FilePath& path) {
|
| + GetIOContext()->OnNewExtensions(id, path);
|
| +}
|
| +
|
| +void ChromeURLRequestContextGetter::OnUnloadedExtension(
|
| + const std::string& id) {
|
| + GetIOContext()->OnUnloadedExtension(id);
|
| +}
|
| +
|
| // NotificationObserver implementation.
|
| -void ChromeURLRequestContextGetter::Observe(NotificationType type,
|
| - const NotificationSource& source,
|
| - const NotificationDetails& details) {
|
| +void ChromeURLRequestContextGetter::Observe(
|
| + NotificationType type,
|
| + const NotificationSource& source,
|
| + const NotificationDetails& details) {
|
| CheckCurrentlyOnMainThread();
|
|
|
| if (NotificationType::PREF_CHANGED == type) {
|
| @@ -697,6 +590,29 @@
|
| }
|
| }
|
|
|
| +void ChromeURLRequestContextGetter::RegisterPrefsObserver(Profile* profile) {
|
| + CheckCurrentlyOnMainThread();
|
| +
|
| + prefs_ = profile->GetPrefs();
|
| +
|
| + prefs_->AddPrefObserver(prefs::kAcceptLanguages, this);
|
| + prefs_->AddPrefObserver(prefs::kCookieBehavior, this);
|
| + prefs_->AddPrefObserver(prefs::kDefaultCharset, this);
|
| +}
|
| +
|
| +// static
|
| +ChromeURLRequestContextGetter*
|
| +ChromeURLRequestContextGetter::CreateRequestContextForMedia(
|
| + Profile* profile, const FilePath& disk_cache_path, int cache_size,
|
| + bool off_the_record) {
|
| + return new ChromeURLRequestContextGetter(
|
| + profile,
|
| + new FactoryForMedia(profile,
|
| + disk_cache_path,
|
| + cache_size,
|
| + off_the_record));
|
| +}
|
| +
|
| void ChromeURLRequestContextGetter::OnAcceptLanguageChange(
|
| const std::string& accept_language) {
|
| GetIOContext()->OnAcceptLanguageChange(accept_language);
|
| @@ -712,50 +628,36 @@
|
| GetIOContext()->OnDefaultCharsetChange(default_charset);
|
| }
|
|
|
| -void ChromeURLRequestContextGetter::OnNewExtensions(const std::string& id,
|
| - const FilePath& path) {
|
| - GetIOContext()->OnNewExtensions(id, path);
|
| +void ChromeURLRequestContextGetter::GetCookieStoreAsyncHelper(
|
| + base::WaitableEvent* completion,
|
| + net::CookieStore** result) {
|
| + // Note that CookieStore is refcounted, yet we do not add a reference.
|
| + *result = GetURLRequestContext()->cookie_store();
|
| + completion->Signal();
|
| }
|
|
|
| -void ChromeURLRequestContextGetter::OnUnloadedExtension(
|
| - const std::string& id) {
|
| - GetIOContext()->OnUnloadedExtension(id);
|
| -}
|
| +// ----------------------------------------------------------------------------
|
| +// ChromeURLRequestContext
|
| +// ----------------------------------------------------------------------------
|
|
|
| -void ChromeURLRequestContextGetter::CleanupOnUIThread() {
|
| - CheckCurrentlyOnMainThread();
|
| -
|
| - if (prefs_) {
|
| - // Unregister for pref notifications.
|
| - prefs_->RemovePrefObserver(prefs::kAcceptLanguages, this);
|
| - prefs_->RemovePrefObserver(prefs::kCookieBehavior, this);
|
| - prefs_->RemovePrefObserver(prefs::kDefaultCharset, this);
|
| - prefs_ = NULL;
|
| - }
|
| -
|
| - // TODO(eroman): Doesn't look like this member is even used...
|
| - // can probably be deleted.
|
| - registrar_.RemoveAll();
|
| +ChromeURLRequestContext::ChromeURLRequestContext() {
|
| + CheckCurrentlyOnIOThread();
|
| }
|
|
|
| -ChromeURLRequestContextGetter::~ChromeURLRequestContextGetter() {
|
| +ChromeURLRequestContext::~ChromeURLRequestContext() {
|
| CheckCurrentlyOnIOThread();
|
| + if (appcache_service_.get() && appcache_service_->request_context() == this)
|
| + appcache_service_->set_request_context(NULL);
|
|
|
| - DCHECK(!prefs_) << "Probably didn't call CleanupOnUIThread";
|
| + NotificationService::current()->Notify(
|
| + NotificationType::URL_REQUEST_CONTEXT_RELEASED,
|
| + Source<URLRequestContext>(this),
|
| + NotificationService::NoDetails());
|
|
|
| - // Either we already transformed the factory into a URLRequestContext, or
|
| - // we still have a pending factory.
|
| - DCHECK((factory_.get() && !url_request_context_.get()) ||
|
| - (!factory_.get() && url_request_context_.get()));
|
| -
|
| - // The scoped_refptr / scoped_ptr destructors take care of releasing
|
| - // |factory_| and |url_request_context_| now.
|
| + delete ftp_transaction_factory_;
|
| + delete http_transaction_factory_;
|
| }
|
|
|
| -ChromeURLRequestContext::ChromeURLRequestContext() {
|
| - CheckCurrentlyOnIOThread();
|
| -}
|
| -
|
| FilePath ChromeURLRequestContext::GetPathForExtension(const std::string& id) {
|
| ExtensionPaths::iterator iter = extension_paths_.find(id);
|
| if (iter != extension_paths_.end()) {
|
| @@ -810,6 +712,47 @@
|
| return true;
|
| }
|
|
|
| +void ChromeURLRequestContext::OnNewExtensions(const std::string& id,
|
| + const FilePath& path) {
|
| + if (!is_off_the_record_)
|
| + extension_paths_[id] = path;
|
| +}
|
| +
|
| +void ChromeURLRequestContext::OnUnloadedExtension(const std::string& id) {
|
| + CheckCurrentlyOnIOThread();
|
| + if (is_off_the_record_)
|
| + return;
|
| + ExtensionPaths::iterator iter = extension_paths_.find(id);
|
| + DCHECK(iter != extension_paths_.end());
|
| + extension_paths_.erase(iter);
|
| +}
|
| +
|
| +ChromeURLRequestContext::ChromeURLRequestContext(
|
| + ChromeURLRequestContext* other) {
|
| + CheckCurrentlyOnIOThread();
|
| +
|
| + // Set URLRequestContext members
|
| + host_resolver_ = other->host_resolver_;
|
| + proxy_service_ = other->proxy_service_;
|
| + ssl_config_service_ = other->ssl_config_service_;
|
| + http_transaction_factory_ = other->http_transaction_factory_;
|
| + ftp_transaction_factory_ = other->ftp_transaction_factory_;
|
| + cookie_store_ = other->cookie_store_;
|
| + cookie_policy_.set_type(other->cookie_policy_.type());
|
| + strict_transport_security_state_ = other->strict_transport_security_state_;
|
| + accept_language_ = other->accept_language_;
|
| + accept_charset_ = other->accept_charset_;
|
| + referrer_charset_ = other->referrer_charset_;
|
| +
|
| + // Set ChromeURLRequestContext members
|
| + appcache_service_ = other->appcache_service_;
|
| + extension_paths_ = other->extension_paths_;
|
| + user_script_dir_path_ = other->user_script_dir_path_;
|
| + blacklist_ = other->blacklist_;
|
| + is_media_ = other->is_media_;
|
| + is_off_the_record_ = other->is_off_the_record_;
|
| +}
|
| +
|
| void ChromeURLRequestContext::OnAcceptLanguageChange(
|
| const std::string& accept_language) {
|
| CheckCurrentlyOnIOThread();
|
| @@ -831,63 +774,147 @@
|
| net::HttpUtil::GenerateAcceptCharsetHeader(default_charset);
|
| }
|
|
|
| -void ChromeURLRequestContext::OnNewExtensions(const std::string& id,
|
| - const FilePath& path) {
|
| - if (!is_off_the_record_)
|
| - extension_paths_[id] = path;
|
| +// ----------------------------------------------------------------------------
|
| +// ChromeURLRequestContextFactory
|
| +// ----------------------------------------------------------------------------
|
| +
|
| +// Extract values from |profile| and copy them into
|
| +// ChromeURLRequestContextFactory. We will use them later when constructing the
|
| +// ChromeURLRequestContext on the IO thread (see
|
| +// ApplyProfileParametersToContext() which reverses this).
|
| +ChromeURLRequestContextFactory::ChromeURLRequestContextFactory(Profile* profile)
|
| + : is_media_(false),
|
| + is_off_the_record_(profile->IsOffTheRecord()) {
|
| + CheckCurrentlyOnMainThread();
|
| + PrefService* prefs = profile->GetPrefs();
|
| +
|
| + // Set up Accept-Language and Accept-Charset header values
|
| + accept_language_ = net::HttpUtil::GenerateAcceptLanguageHeader(
|
| + WideToASCII(prefs->GetString(prefs::kAcceptLanguages)));
|
| + std::string default_charset =
|
| + WideToASCII(prefs->GetString(prefs::kDefaultCharset));
|
| + accept_charset_ =
|
| + net::HttpUtil::GenerateAcceptCharsetHeader(default_charset);
|
| +
|
| + // At this point, we don't know the charset of the referring page
|
| + // where a url request originates from. This is used to get a suggested
|
| + // filename from Content-Disposition header made of raw 8bit characters.
|
| + // Down the road, it can be overriden if it becomes known (for instance,
|
| + // when download request is made through the context menu in a web page).
|
| + // At the moment, it'll remain 'undeterministic' when a user
|
| + // types a URL in the omnibar or click on a download link in a page.
|
| + // For the latter, we need a change on the webkit-side.
|
| + // We initialize it to the default charset here and a user will
|
| + // have an *arguably* better default charset for interpreting a raw 8bit
|
| + // C-D header field. It means the native OS codepage fallback in
|
| + // net_util::GetSuggestedFilename is unlikely to be taken.
|
| + referrer_charset_ = default_charset;
|
| +
|
| + cookie_policy_type_ = net::CookiePolicy::FromInt(
|
| + prefs->GetInteger(prefs::kCookieBehavior));
|
| +
|
| + // TODO(eroman): this doesn't look safe; sharing between IO and UI threads!
|
| + blacklist_ = profile->GetBlacklist();
|
| +
|
| + // TODO(eroman): this doesn't look safe; sharing between IO and UI threads!
|
| + strict_transport_security_state_ = profile->GetStrictTransportSecurityState();
|
| +
|
| + if (profile->GetExtensionsService()) {
|
| + const ExtensionList* extensions =
|
| + profile->GetExtensionsService()->extensions();
|
| + for (ExtensionList::const_iterator iter = extensions->begin();
|
| + iter != extensions->end(); ++iter) {
|
| + extension_paths_[(*iter)->id()] = (*iter)->path();
|
| + }
|
| + }
|
| +
|
| + if (profile->GetUserScriptMaster())
|
| + user_script_dir_path_ = profile->GetUserScriptMaster()->user_script_dir();
|
| +
|
| + // TODO(eroman): this doesn't look safe; sharing between IO and UI threads!
|
| + ssl_config_service_ = profile->GetSSLConfigService();
|
| +
|
| + profile_dir_path_ = profile->GetPath();
|
| }
|
|
|
| -void ChromeURLRequestContext::OnUnloadedExtension(const std::string& id) {
|
| +ChromeURLRequestContextFactory::~ChromeURLRequestContextFactory() {
|
| CheckCurrentlyOnIOThread();
|
| - if (is_off_the_record_)
|
| - return;
|
| - ExtensionPaths::iterator iter = extension_paths_.find(id);
|
| - DCHECK(iter != extension_paths_.end());
|
| - extension_paths_.erase(iter);
|
| }
|
|
|
| -ChromeURLRequestContext::~ChromeURLRequestContext() {
|
| - CheckCurrentlyOnIOThread();
|
| - if (appcache_service_.get() && appcache_service_->request_context() == this)
|
| - appcache_service_->set_request_context(NULL);
|
| +void ChromeURLRequestContextFactory::ApplyProfileParametersToContext(
|
| + ChromeURLRequestContext* context) {
|
| + // Apply all the parameters. NOTE: keep this in sync with
|
| + // ChromeURLRequestContextFactory(Profile*).
|
| + context->set_is_media(is_media_);
|
| + context->set_is_off_the_record(is_off_the_record_);
|
| + context->set_accept_language(accept_language_);
|
| + context->set_accept_charset(accept_charset_);
|
| + context->set_referrer_charset(referrer_charset_);
|
| + context->set_cookie_policy_type(cookie_policy_type_);
|
| + context->set_extension_paths(extension_paths_);
|
| + context->set_user_script_dir_path(user_script_dir_path_);
|
| + context->set_blacklist(blacklist_);
|
| + context->set_strict_transport_security_state(
|
| + strict_transport_security_state_);
|
| + context->set_ssl_config_service(ssl_config_service_);
|
| +}
|
|
|
| - NotificationService::current()->Notify(
|
| - NotificationType::URL_REQUEST_CONTEXT_RELEASED,
|
| - Source<URLRequestContext>(this),
|
| - NotificationService::NoDetails());
|
| +// ----------------------------------------------------------------------------
|
|
|
| - delete ftp_transaction_factory_;
|
| - delete http_transaction_factory_;
|
| -}
|
| +net::ProxyConfig* CreateProxyConfig(const CommandLine& command_line) {
|
| + // Scan for all "enable" type proxy switches.
|
| + static const char* proxy_switches[] = {
|
| + switches::kProxyServer,
|
| + switches::kProxyPacUrl,
|
| + switches::kProxyAutoDetect,
|
| + switches::kProxyBypassList
|
| + };
|
|
|
| -net::CookieStore* ChromeURLRequestContextGetter::GetCookieStore() {
|
| - // If we are running on the IO thread this is real easy.
|
| - if (ChromeThread::CurrentlyOn(ChromeThread::IO))
|
| - return GetURLRequestContext()->cookie_store();
|
| + bool found_enable_proxy_switch = false;
|
| + for (size_t i = 0; i < arraysize(proxy_switches); i++) {
|
| + if (command_line.HasSwitch(proxy_switches[i])) {
|
| + found_enable_proxy_switch = true;
|
| + break;
|
| + }
|
| + }
|
|
|
| - // If we aren't running on the IO thread, we cannot call
|
| - // GetURLRequestContext(). Instead we will post a task to the IO loop
|
| - // and wait for it to complete.
|
| + if (!found_enable_proxy_switch &&
|
| + !command_line.HasSwitch(switches::kNoProxyServer)) {
|
| + return NULL;
|
| + }
|
|
|
| - base::WaitableEvent completion(false, false);
|
| - net::CookieStore* result = NULL;
|
| + net::ProxyConfig* proxy_config = new net::ProxyConfig();
|
| + if (command_line.HasSwitch(switches::kNoProxyServer)) {
|
| + // Ignore (and warn about) all the other proxy config switches we get if
|
| + // the --no-proxy-server command line argument is present.
|
| + if (found_enable_proxy_switch) {
|
| + LOG(WARNING) << "Additional command line proxy switches found when --"
|
| + << switches::kNoProxyServer << " was specified.";
|
| + }
|
| + return proxy_config;
|
| + }
|
|
|
| - ChromeThread::PostTask(
|
| - ChromeThread::IO, FROM_HERE,
|
| - NewRunnableMethod(this,
|
| - &ChromeURLRequestContextGetter::GetCookieStoreAsyncHelper,
|
| - &completion,
|
| - &result));
|
| + if (command_line.HasSwitch(switches::kProxyServer)) {
|
| + const std::wstring& proxy_server =
|
| + command_line.GetSwitchValue(switches::kProxyServer);
|
| + proxy_config->proxy_rules.ParseFromString(WideToASCII(proxy_server));
|
| + }
|
|
|
| - completion.Wait();
|
| - DCHECK(result);
|
| - return result;
|
| -}
|
| + if (command_line.HasSwitch(switches::kProxyPacUrl)) {
|
| + proxy_config->pac_url =
|
| + GURL(WideToASCII(command_line.GetSwitchValue(
|
| + switches::kProxyPacUrl)));
|
| + }
|
|
|
| -void ChromeURLRequestContextGetter::GetCookieStoreAsyncHelper(
|
| - base::WaitableEvent* completion,
|
| - net::CookieStore** result) {
|
| - // Note that CookieStore is refcounted, yet we do not add a reference.
|
| - *result = GetURLRequestContext()->cookie_store();
|
| - completion->Signal();
|
| + if (command_line.HasSwitch(switches::kProxyAutoDetect)) {
|
| + proxy_config->auto_detect = true;
|
| + }
|
| +
|
| + if (command_line.HasSwitch(switches::kProxyBypassList)) {
|
| + proxy_config->ParseNoProxyList(
|
| + WideToASCII(command_line.GetSwitchValue(
|
| + switches::kProxyBypassList)));
|
| + }
|
| +
|
| + return proxy_config;
|
| }
|
|
|