profile_io_data.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h" 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <string> 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/basictypes.h" 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/bind.h" 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/bind_helpers.h" 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/command_line.h" 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/compiler_specific.h" 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/logging.h" 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/path_service.h" 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/prefs/pref_service.h" 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/stl_util.h" 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/string_util.h" 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/stringprintf.h" 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/browser_process.h" 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h" 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry.h" 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/download/download_service.h" 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/download/download_service_factory.h" 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/extensions/extension_info_map.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/extensions/extension_protocols.h" 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/extensions/extension_resource_protocols.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 32d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "chrome/browser/io_thread.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/net/about_protocol_handler.h" 34f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "chrome/browser/net/chrome_cookie_notification_details.h" 35bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "chrome/browser/net/chrome_fraudulent_certificate_reporter.h" 3681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "chrome/browser/net/chrome_http_user_agent_settings.h" 371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "chrome/browser/net/chrome_net_log.h" 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "chrome/browser/net/chrome_network_delegate.h" 39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "chrome/browser/net/evicted_domain_cookie_counter.h" 40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "chrome/browser/net/load_time_stats.h" 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/net/proxy_service_factory.h" 42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "chrome/browser/net/resource_prefetch_predictor_observer.h" 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "chrome/browser/net/transport_security_persister.h" 44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "chrome/browser/notifications/desktop_notification_service_factory.h" 45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "chrome/browser/policy/url_blacklist_manager.h" 46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "chrome/browser/predictors/resource_prefetch_predictor.h" 47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "chrome/browser/predictors/resource_prefetch_predictor_factory.h" 48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "chrome/browser/profiles/profile_manager.h" 50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "chrome/browser/signin/signin_names_io_thread.h" 51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "chrome/common/chrome_notification_types.h" 52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "chrome/common/chrome_paths.h" 53f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 54f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "chrome/common/pref_names.h" 55d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "chrome/common/startup_metric_utils.h" 56f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "chrome/common/url_constants.h" 57f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 58d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "content/public/browser/host_zoom_map.h" 5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "content/public/browser/notification_service.h" 60d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "content/public/browser/resource_context.h" 6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "extensions/common/constants.h" 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "net/cert/cert_verifier.h" 63d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 64d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "net/http/http_transaction_factory.h" 6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "net/http/http_util.h" 67f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "net/proxy/proxy_config_service_fixed.h" 68d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "net/proxy/proxy_script_fetcher_impl.h" 69f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "net/proxy/proxy_service.h" 70f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "net/ssl/server_bound_cert_service.h" 71f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "net/url_request/data_protocol_handler.h" 7281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "net/url_request/file_protocol_handler.h" 7353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "net/url_request/ftp_protocol_handler.h" 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "net/url_request/protocol_intercept_job_factory.h" 75d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "net/url_request/url_request.h" 7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "net/url_request/url_request_file_job.h" 77d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 78d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 80d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "chrome/browser/managed_mode/managed_mode_url_filter.h" 8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_service.h" 8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_service_factory.h" 83d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 85d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if defined(OS_CHROMEOS) 86d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "chrome/browser/chromeos/drive/drive_protocol_handler.h" 8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "chrome/browser/chromeos/policy/policy_cert_verifier.h" 88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "chrome/browser/chromeos/proxy_config_service_impl.h" 8951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 9051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings_names.h" 9193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h" 92d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 9351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 94aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochusing content::BrowserContext; 95aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochusing content::BrowserThread; 96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)using content::ResourceContext; 9751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 9881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)namespace { 9981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// ---------------------------------------------------------------------------- 101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// CookieMonster::Delegate implementation 102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// ---------------------------------------------------------------------------- 103197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass ChromeCookieMonsterDelegate : public net::CookieMonster::Delegate { 104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch public: 105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch explicit ChromeCookieMonsterDelegate( 106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const base::Callback<Profile*(void)>& profile_getter) 107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch : profile_getter_(profile_getter) { 108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 110197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 111197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // net::CookieMonster::Delegate implementation. 112d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) virtual void OnCookieChanged( 113f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) const net::CanonicalCookie& cookie, 114f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) bool removed, 115f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) net::CookieMonster::Delegate::ChangeCause cause) OVERRIDE { 116f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) BrowserThread::PostTask( 117d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 11881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) base::Bind(&ChromeCookieMonsterDelegate::OnCookieChangedAsyncHelper, 119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch this, cookie, removed, cause)); 1201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } 121f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 122bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) private: 123f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) virtual ~ChromeCookieMonsterDelegate() {} 124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 125d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) void OnCookieChangedAsyncHelper( 126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const net::CanonicalCookie& cookie, 127d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) bool removed, 128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) net::CookieMonster::Delegate::ChangeCause cause) { 129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Profile* profile = profile_getter_.Run(); 130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (profile) { 131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ChromeCookieDetails cookie_details(&cookie, removed, cause); 132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) content::NotificationService::current()->Notify( 133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) chrome::NOTIFICATION_COOKIE_CHANGED, 134a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch content::Source<Profile>(profile), 135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) content::Details<ChromeCookieDetails>(&cookie_details)); 136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 138e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 13981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) const base::Callback<Profile*(void)> profile_getter_; 140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}; 141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Profile* GetProfileOnUI(ProfileManager* profile_manager, Profile* profile) { 143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 144f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) DCHECK(profile); 145323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (profile_manager->IsValidProfile(profile)) 146f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return profile; 147f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return NULL; 148d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 149f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#if defined(DEBUG_DEVTOOLS) 151f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)bool IsSupportedDevToolsURL(const GURL& url, base::FilePath* path) { 152f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!url.SchemeIs(chrome::kChromeDevToolsScheme) || 153d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) url.host() != chrome::kChromeUIDevToolsBundledHost) { 154f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return false; 155f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) } 15653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!url.is_valid()) { 158d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) NOTREACHED(); 159e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return false; 16009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 161f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 162bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // Remove Query and Ref from URL. 163bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) GURL stripped_url; 164d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) GURL::Replacements replacements; 165d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) replacements.ClearQuery(); 166d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) replacements.ClearRef(); 167d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) stripped_url = url.ReplaceComponents(replacements); 168d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 169d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) std::string relative_path; 1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const std::string& spec = stripped_url.possibly_invalid_spec(); 1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const url_parse::Parsed& parsed = 1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci stripped_url.parsed_for_possibly_invalid_spec(); 1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // + 1 to skip the slash at the beginning of the path. 1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int offset = parsed.CountCharactersBefore(url_parse::Parsed::PATH, false) + 1; 1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (offset < static_cast<int>(spec.size())) 1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci relative_path.assign(spec.substr(offset)); 1777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 178d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // Check that |relative_path| is not an absolute path (otherwise 179bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // AppendASCII() will DCHECK). The awkward use of StringType is because on 18010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // some systems FilePath expects a std::string, but on others a std::wstring. 18110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch base::FilePath p( 18210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch base::FilePath::StringType(relative_path.begin(), relative_path.end())); 183d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (p.IsAbsolute()) 18410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return false; 185aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 186aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch base::FilePath inspector_dir; 18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!PathService::Get(chrome::DIR_INSPECTOR, &inspector_dir)) 188aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch return false; 189d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 190aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (inspector_dir.empty()) 191aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch return false; 192aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 193aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch *path = inspector_dir.AppendASCII(relative_path); 194d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return true; 195aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch} 19610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 19710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochclass DebugDevToolsInterceptor 19810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch : public net::URLRequestJobFactory::ProtocolHandler { 199d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) public: 20010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch DebugDevToolsInterceptor() {} 201aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch virtual ~DebugDevToolsInterceptor() {} 20210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 203e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 204e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) net::URLRequest* request, 205d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 20607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch base::FilePath path; 20710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (IsSupportedDevToolsURL(request->url(), &path)) 20807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return new net::URLRequestFileJob(request, network_delegate, path); 20907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 21007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return NULL; 211d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 212e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}; 213d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif // defined(DEBUG_DEVTOOLS) 214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 215323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} // namespace 216323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 217323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void ProfileIOData::InitializeOnUIThread(Profile* profile) { 218d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 219323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) PrefService* pref_service = profile->GetPrefs(); 220d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) PrefService* local_state_pref_service = g_browser_process->local_state(); 221323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 222323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) scoped_ptr<ProfileParams> params(new ProfileParams); 223323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) params->path = profile->GetPath(); 224323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 22509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) params->io_thread = g_browser_process->io_thread(); 22609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 227d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) params->cookie_settings = CookieSettings::Factory::GetForProfile(profile); 22809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) params->ssl_config_service = profile->GetSSLConfigService(); 229323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) base::Callback<Profile*(void)> profile_getter = 230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) base::Bind(&GetProfileOnUI, g_browser_process->profile_manager(), 231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) profile); 23209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) params->cookie_monster_delegate = 233e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch new chrome_browser_net::EvictedDomainCookieCounter( 234e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch new ChromeCookieMonsterDelegate(profile_getter)); 235d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) params->extension_info_map = 236d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(); 237d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 238d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (predictors::ResourcePrefetchPredictor* predictor = 239d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) predictors::ResourcePrefetchPredictorFactory::GetForProfile( 240d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) profile)) { 241d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) resource_prefetch_predictor_observer_.reset( 242d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) new chrome_browser_net::ResourcePrefetchPredictorObserver(predictor)); 243d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 244d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 245197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if defined(ENABLE_NOTIFICATIONS) 246d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) params->notification_service = 247d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile(profile); 248d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 249d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 250197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ProtocolHandlerRegistry* protocol_handler_registry = 25109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ProtocolHandlerRegistryFactory::GetForProfile(profile); 25209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) DCHECK(protocol_handler_registry); 25381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 254 // The profile instance is only available here in the InitializeOnUIThread 255 // method, so we create the url job factory here, then save it for 256 // later delivery to the job factory in Init(). 257 params->protocol_handler_interceptor = 258 protocol_handler_registry->CreateJobInterceptorFactory(); 259 260 ChromeProxyConfigService* proxy_config_service = 261 ProxyServiceFactory::CreateProxyConfigService(); 262 params->proxy_config_service.reset(proxy_config_service); 263 profile->GetProxyConfigTracker()->SetChromeProxyConfigService( 264 proxy_config_service); 265#if defined(ENABLE_MANAGED_USERS) 266 ManagedUserService* managed_user_service = 267 ManagedUserServiceFactory::GetForProfile(profile); 268 params->managed_mode_url_filter = 269 managed_user_service->GetURLFilterForIOThread(); 270#endif 271#if defined(OS_CHROMEOS) 272 policy::BrowserPolicyConnector* connector = 273 g_browser_process->browser_policy_connector(); 274 params->trust_anchor_provider = connector->GetCertTrustAnchorProvider(); 275#endif 276 277 params->profile = profile; 278 profile_params_.reset(params.release()); 279 280 ChromeNetworkDelegate::InitializePrefsOnUIThread( 281 &enable_referrers_, 282 &enable_do_not_track_, 283 &force_safesearch_, 284 pref_service); 285 286 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy = 287 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); 288#if defined(ENABLE_PRINTING) 289 printing_enabled_.Init(prefs::kPrintingEnabled, pref_service); 290 printing_enabled_.MoveToThread(io_message_loop_proxy); 291#endif 292 chrome_http_user_agent_settings_.reset( 293 new ChromeHttpUserAgentSettings(pref_service)); 294 295 // These members are used only for one click sign in, which is not enabled 296 // in incognito mode. So no need to initialize them. 297 if (!is_incognito()) { 298 signin_names_.reset(new SigninNamesOnIOThread()); 299 300 google_services_username_.Init( 301 prefs::kGoogleServicesUsername, pref_service); 302 google_services_username_.MoveToThread(io_message_loop_proxy); 303 304 google_services_username_pattern_.Init( 305 prefs::kGoogleServicesUsernamePattern, local_state_pref_service); 306 google_services_username_pattern_.MoveToThread(io_message_loop_proxy); 307 308 reverse_autologin_enabled_.Init( 309 prefs::kReverseAutologinEnabled, pref_service); 310 reverse_autologin_enabled_.MoveToThread(io_message_loop_proxy); 311 312 one_click_signin_rejected_email_list_.Init( 313 prefs::kReverseAutologinRejectedEmailList, pref_service); 314 one_click_signin_rejected_email_list_.MoveToThread(io_message_loop_proxy); 315 316 sync_disabled_.Init(prefs::kSyncManaged, pref_service); 317 sync_disabled_.MoveToThread(io_message_loop_proxy); 318 319 signin_allowed_.Init(prefs::kSigninAllowed, pref_service); 320 signin_allowed_.MoveToThread(io_message_loop_proxy); 321 } 322 323 // The URLBlacklistManager has to be created on the UI thread to register 324 // observers of |pref_service|, and it also has to clean up on 325 // ShutdownOnUIThread to release these observers on the right thread. 326 // Don't pass it in |profile_params_| to make sure it is correctly cleaned up, 327 // in particular when this ProfileIOData isn't |initialized_| during deletion. 328#if defined(ENABLE_CONFIGURATION_POLICY) 329 url_blacklist_manager_.reset(new policy::URLBlacklistManager(pref_service)); 330#endif 331 332 initialized_on_UI_thread_ = true; 333 334 // We need to make sure that content initializes its own data structures that 335 // are associated with each ResourceContext because we might post this 336 // object to the IO thread after this function. 337 BrowserContext::EnsureResourceContextInitialized(profile); 338} 339 340ProfileIOData::MediaRequestContext::MediaRequestContext( 341 chrome_browser_net::LoadTimeStats* load_time_stats) 342 : ChromeURLRequestContext(ChromeURLRequestContext::CONTEXT_TYPE_MEDIA, 343 load_time_stats) { 344} 345 346void ProfileIOData::MediaRequestContext::SetHttpTransactionFactory( 347 scoped_ptr<net::HttpTransactionFactory> http_factory) { 348 http_factory_ = http_factory.Pass(); 349 set_http_transaction_factory(http_factory_.get()); 350} 351 352ProfileIOData::MediaRequestContext::~MediaRequestContext() {} 353 354ProfileIOData::AppRequestContext::AppRequestContext( 355 chrome_browser_net::LoadTimeStats* load_time_stats) 356 : ChromeURLRequestContext(ChromeURLRequestContext::CONTEXT_TYPE_APP, 357 load_time_stats) { 358} 359 360void ProfileIOData::AppRequestContext::SetCookieStore( 361 net::CookieStore* cookie_store) { 362 cookie_store_ = cookie_store; 363 set_cookie_store(cookie_store); 364} 365 366void ProfileIOData::AppRequestContext::SetHttpTransactionFactory( 367 scoped_ptr<net::HttpTransactionFactory> http_factory) { 368 http_factory_ = http_factory.Pass(); 369 set_http_transaction_factory(http_factory_.get()); 370} 371 372void ProfileIOData::AppRequestContext::SetJobFactory( 373 scoped_ptr<net::URLRequestJobFactory> job_factory) { 374 job_factory_ = job_factory.Pass(); 375 set_job_factory(job_factory_.get()); 376} 377 378ProfileIOData::AppRequestContext::~AppRequestContext() {} 379 380ProfileIOData::ProfileParams::ProfileParams() 381 : io_thread(NULL), 382#if defined(ENABLE_NOTIFICATIONS) 383 notification_service(NULL), 384#endif 385#if defined(OS_CHROMEOS) 386 trust_anchor_provider(NULL), 387#endif 388 profile(NULL) { 389} 390 391ProfileIOData::ProfileParams::~ProfileParams() {} 392 393ProfileIOData::ProfileIOData(bool is_incognito) 394 : initialized_(false), 395#if defined(ENABLE_NOTIFICATIONS) 396 notification_service_(NULL), 397#endif 398 resource_context_(new ResourceContext(this)), 399 load_time_stats_(NULL), 400 initialized_on_UI_thread_(false), 401 is_incognito_(is_incognito) { 402 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 403} 404 405ProfileIOData::~ProfileIOData() { 406 if (BrowserThread::IsMessageLoopValid(BrowserThread::IO)) 407 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 408 409 if (main_request_context_) 410 main_request_context_->AssertNoURLRequests(); 411 if (extensions_request_context_) 412 extensions_request_context_->AssertNoURLRequests(); 413 for (URLRequestContextMap::iterator it = app_request_context_map_.begin(); 414 it != app_request_context_map_.end(); ++it) { 415 it->second->AssertNoURLRequests(); 416 delete it->second; 417 } 418 for (URLRequestContextMap::iterator it = 419 isolated_media_request_context_map_.begin(); 420 it != isolated_media_request_context_map_.end(); ++it) { 421 it->second->AssertNoURLRequests(); 422 delete it->second; 423 } 424} 425 426// static 427ProfileIOData* ProfileIOData::FromResourceContext( 428 content::ResourceContext* rc) { 429 return (static_cast<ResourceContext*>(rc))->io_data_; 430} 431 432// static 433bool ProfileIOData::IsHandledProtocol(const std::string& scheme) { 434 DCHECK_EQ(scheme, StringToLowerASCII(scheme)); 435 static const char* const kProtocolList[] = { 436 chrome::kFileScheme, 437 chrome::kChromeDevToolsScheme, 438 extensions::kExtensionScheme, 439 chrome::kExtensionResourceScheme, 440 chrome::kChromeUIScheme, 441 chrome::kDataScheme, 442#if defined(OS_CHROMEOS) 443 chrome::kDriveScheme, 444#endif // defined(OS_CHROMEOS) 445 chrome::kAboutScheme, 446#if !defined(DISABLE_FTP_SUPPORT) 447 chrome::kFtpScheme, 448#endif // !defined(DISABLE_FTP_SUPPORT) 449 chrome::kBlobScheme, 450 chrome::kFileSystemScheme, 451 chrome::kChromeSearchScheme, 452 }; 453 for (size_t i = 0; i < arraysize(kProtocolList); ++i) { 454 if (scheme == kProtocolList[i]) 455 return true; 456 } 457 return net::URLRequest::IsHandledProtocol(scheme); 458} 459 460// static 461bool ProfileIOData::IsHandledURL(const GURL& url) { 462 if (!url.is_valid()) { 463 // We handle error cases. 464 return true; 465 } 466 467 return IsHandledProtocol(url.scheme()); 468} 469 470// static 471void ProfileIOData::InstallProtocolHandlers( 472 net::URLRequestJobFactoryImpl* job_factory, 473 content::ProtocolHandlerMap* protocol_handlers) { 474 for (content::ProtocolHandlerMap::iterator it = 475 protocol_handlers->begin(); 476 it != protocol_handlers->end(); 477 ++it) { 478 bool set_protocol = job_factory->SetProtocolHandler( 479 it->first, it->second.release()); 480 DCHECK(set_protocol); 481 } 482 protocol_handlers->clear(); 483} 484 485content::ResourceContext* ProfileIOData::GetResourceContext() const { 486 return resource_context_.get(); 487} 488 489ChromeURLRequestContext* ProfileIOData::GetMainRequestContext() const { 490 DCHECK(initialized_); 491 return main_request_context_.get(); 492} 493 494ChromeURLRequestContext* ProfileIOData::GetMediaRequestContext() const { 495 DCHECK(initialized_); 496 ChromeURLRequestContext* context = AcquireMediaRequestContext(); 497 DCHECK(context); 498 return context; 499} 500 501ChromeURLRequestContext* ProfileIOData::GetExtensionsRequestContext() const { 502 DCHECK(initialized_); 503 return extensions_request_context_.get(); 504} 505 506ChromeURLRequestContext* ProfileIOData::GetIsolatedAppRequestContext( 507 ChromeURLRequestContext* main_context, 508 const StoragePartitionDescriptor& partition_descriptor, 509 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> 510 protocol_handler_interceptor, 511 content::ProtocolHandlerMap* protocol_handlers) const { 512 DCHECK(initialized_); 513 ChromeURLRequestContext* context = NULL; 514 if (ContainsKey(app_request_context_map_, partition_descriptor)) { 515 context = app_request_context_map_[partition_descriptor]; 516 } else { 517 context = AcquireIsolatedAppRequestContext( 518 main_context, partition_descriptor, protocol_handler_interceptor.Pass(), 519 protocol_handlers); 520 app_request_context_map_[partition_descriptor] = context; 521 } 522 DCHECK(context); 523 return context; 524} 525 526ChromeURLRequestContext* ProfileIOData::GetIsolatedMediaRequestContext( 527 ChromeURLRequestContext* app_context, 528 const StoragePartitionDescriptor& partition_descriptor) const { 529 DCHECK(initialized_); 530 ChromeURLRequestContext* context = NULL; 531 if (ContainsKey(isolated_media_request_context_map_, partition_descriptor)) { 532 context = isolated_media_request_context_map_[partition_descriptor]; 533 } else { 534 context = AcquireIsolatedMediaRequestContext(app_context, 535 partition_descriptor); 536 isolated_media_request_context_map_[partition_descriptor] = context; 537 } 538 DCHECK(context); 539 return context; 540} 541 542ExtensionInfoMap* ProfileIOData::GetExtensionInfoMap() const { 543 DCHECK(initialized_) << "ExtensionSystem not initialized"; 544 return extension_info_map_; 545} 546 547CookieSettings* ProfileIOData::GetCookieSettings() const { 548 // Allow either Init() or SetCookieSettingsForTesting() to initialize. 549 DCHECK(initialized_ || cookie_settings_); 550 return cookie_settings_; 551} 552 553#if defined(ENABLE_NOTIFICATIONS) 554DesktopNotificationService* ProfileIOData::GetNotificationService() const { 555 DCHECK(initialized_); 556 return notification_service_; 557} 558#endif 559 560void ProfileIOData::InitializeMetricsEnabledStateOnUIThread() { 561 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 562#if defined(OS_CHROMEOS) 563 // Just fetch the value from ChromeOS' settings while we're on the UI thread. 564 // TODO(stevet): For now, this value is only set on profile initialization. 565 // We will want to do something similar to the PrefMember method below in the 566 // future to more accurately capture this state. 567 chromeos::CrosSettings::Get()->GetBoolean(chromeos::kStatsReportingPref, 568 &enable_metrics_); 569#else 570 // Prep the PrefMember and send it to the IO thread, since this value will be 571 // read from there. 572 enable_metrics_.Init(prefs::kMetricsReportingEnabled, 573 g_browser_process->local_state()); 574 enable_metrics_.MoveToThread( 575 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); 576#endif // defined(OS_CHROMEOS) 577} 578 579bool ProfileIOData::GetMetricsEnabledStateOnIOThread() const { 580 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 581#if defined(OS_CHROMEOS) 582 return enable_metrics_; 583#else 584 return enable_metrics_.GetValue(); 585#endif // defined(OS_CHROMEOS) 586} 587 588net::HttpServerProperties* ProfileIOData::http_server_properties() const { 589 return http_server_properties_.get(); 590} 591 592void ProfileIOData::set_http_server_properties( 593 net::HttpServerProperties* http_server_properties) const { 594 http_server_properties_.reset(http_server_properties); 595} 596 597ProfileIOData::ResourceContext::ResourceContext(ProfileIOData* io_data) 598 : io_data_(io_data), 599 host_resolver_(NULL), 600 request_context_(NULL) { 601 DCHECK(io_data); 602} 603 604ProfileIOData::ResourceContext::~ResourceContext() {} 605 606net::HostResolver* ProfileIOData::ResourceContext::GetHostResolver() { 607 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 608 DCHECK(io_data_->initialized_); 609 return host_resolver_; 610} 611 612net::URLRequestContext* ProfileIOData::ResourceContext::GetRequestContext() { 613 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 614 DCHECK(io_data_->initialized_); 615 return request_context_; 616} 617 618// static 619std::string ProfileIOData::GetSSLSessionCacheShard() { 620 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 621 // The SSL session cache is partitioned by setting a string. This returns a 622 // unique string to partition the SSL session cache. Each time we create a 623 // new profile, we'll get a fresh SSL session cache which is separate from 624 // the other profiles. 625 static unsigned ssl_session_cache_instance = 0; 626 return base::StringPrintf("profile/%u", ssl_session_cache_instance++); 627} 628 629void ProfileIOData::Init(content::ProtocolHandlerMap* protocol_handlers) const { 630 // The basic logic is implemented here. The specific initialization 631 // is done in InitializeInternal(), implemented by subtypes. Static helper 632 // functions have been provided to assist in common operations. 633 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 634 DCHECK(!initialized_); 635 636 startup_metric_utils::ScopedSlowStartupUMA 637 scoped_timer("Startup.SlowStartupProfileIODataInit"); 638 639 // TODO(jhawkins): Remove once crbug.com/102004 is fixed. 640 CHECK(initialized_on_UI_thread_); 641 642 // TODO(jhawkins): Return to DCHECK once crbug.com/102004 is fixed. 643 CHECK(profile_params_.get()); 644 645 IOThread* const io_thread = profile_params_->io_thread; 646 IOThread::Globals* const io_thread_globals = io_thread->globals(); 647 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 648 load_time_stats_ = GetLoadTimeStats(io_thread_globals); 649 650 // Create the common request contexts. 651 main_request_context_.reset( 652 new ChromeURLRequestContext(ChromeURLRequestContext::CONTEXT_TYPE_MAIN, 653 load_time_stats_)); 654 extensions_request_context_.reset( 655 new ChromeURLRequestContext( 656 ChromeURLRequestContext::CONTEXT_TYPE_EXTENSIONS, 657 load_time_stats_)); 658 659 ChromeNetworkDelegate* network_delegate = 660 new ChromeNetworkDelegate( 661 io_thread_globals->extension_event_router_forwarder.get(), 662 &enable_referrers_); 663 network_delegate->set_extension_info_map(profile_params_->extension_info_map); 664 network_delegate->set_url_blacklist_manager(url_blacklist_manager_.get()); 665 network_delegate->set_profile(profile_params_->profile); 666 network_delegate->set_cookie_settings(profile_params_->cookie_settings); 667 network_delegate->set_enable_do_not_track(&enable_do_not_track_); 668 network_delegate->set_force_google_safe_search(&force_safesearch_); 669 network_delegate->set_load_time_stats(load_time_stats_); 670 network_delegate_.reset(network_delegate); 671 672 fraudulent_certificate_reporter_.reset( 673 new chrome_browser_net::ChromeFraudulentCertificateReporter( 674 main_request_context_.get())); 675 676 // NOTE: Proxy service uses the default io thread network delegate, not the 677 // delegate just created. 678 proxy_service_.reset( 679 ProxyServiceFactory::CreateProxyService( 680 io_thread->net_log(), 681 io_thread_globals->proxy_script_fetcher_context.get(), 682 io_thread_globals->system_network_delegate.get(), 683 profile_params_->proxy_config_service.release(), 684 command_line)); 685 686 transport_security_state_.reset(new net::TransportSecurityState()); 687 transport_security_persister_.reset( 688 new TransportSecurityPersister(transport_security_state_.get(), 689 profile_params_->path, 690 is_incognito())); 691 const std::string& serialized = 692 command_line.GetSwitchValueASCII(switches::kHstsHosts); 693 transport_security_persister_.get()->DeserializeFromCommandLine(serialized); 694 695 // Take ownership over these parameters. 696 cookie_settings_ = profile_params_->cookie_settings; 697#if defined(ENABLE_NOTIFICATIONS) 698 notification_service_ = profile_params_->notification_service; 699#endif 700 extension_info_map_ = profile_params_->extension_info_map; 701 702 resource_context_->host_resolver_ = io_thread_globals->host_resolver.get(); 703 resource_context_->request_context_ = main_request_context_.get(); 704 705 if (profile_params_->resource_prefetch_predictor_observer_) { 706 resource_prefetch_predictor_observer_.reset( 707 profile_params_->resource_prefetch_predictor_observer_.release()); 708 } 709 710#if defined(ENABLE_MANAGED_USERS) 711 managed_mode_url_filter_ = profile_params_->managed_mode_url_filter; 712#endif 713 714#if defined(OS_CHROMEOS) 715 cert_verifier_.reset(new policy::PolicyCertVerifier( 716 profile_params_->profile, profile_params_->trust_anchor_provider)); 717 main_request_context_->set_cert_verifier(cert_verifier_.get()); 718#else 719 main_request_context_->set_cert_verifier( 720 io_thread_globals->cert_verifier.get()); 721#endif 722 723 InitializeInternal(profile_params_.get(), protocol_handlers); 724 725 profile_params_.reset(); 726 initialized_ = true; 727} 728 729void ProfileIOData::ApplyProfileParamsToContext( 730 ChromeURLRequestContext* context) const { 731 context->set_http_user_agent_settings( 732 chrome_http_user_agent_settings_.get()); 733 context->set_ssl_config_service(profile_params_->ssl_config_service); 734} 735 736scoped_ptr<net::URLRequestJobFactory> ProfileIOData::SetUpJobFactoryDefaults( 737 scoped_ptr<net::URLRequestJobFactoryImpl> job_factory, 738 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> 739 protocol_handler_interceptor, 740 net::NetworkDelegate* network_delegate, 741 net::FtpTransactionFactory* ftp_transaction_factory) const { 742 // NOTE(willchan): Keep these protocol handlers in sync with 743 // ProfileIOData::IsHandledProtocol(). 744 bool set_protocol = job_factory->SetProtocolHandler( 745 chrome::kFileScheme, new net::FileProtocolHandler()); 746 DCHECK(set_protocol); 747 748 DCHECK(extension_info_map_); 749 set_protocol = job_factory->SetProtocolHandler( 750 extensions::kExtensionScheme, 751 CreateExtensionProtocolHandler(is_incognito(), extension_info_map_)); 752 DCHECK(set_protocol); 753 set_protocol = job_factory->SetProtocolHandler( 754 chrome::kExtensionResourceScheme, 755 CreateExtensionResourceProtocolHandler()); 756 DCHECK(set_protocol); 757 set_protocol = job_factory->SetProtocolHandler( 758 chrome::kDataScheme, new net::DataProtocolHandler()); 759 DCHECK(set_protocol); 760#if defined(OS_CHROMEOS) 761 if (!is_incognito() && profile_params_) { 762 set_protocol = job_factory->SetProtocolHandler( 763 chrome::kDriveScheme, 764 new drive::DriveProtocolHandler(profile_params_->profile)); 765 DCHECK(set_protocol); 766 } 767#endif // defined(OS_CHROMEOS) 768 769 job_factory->SetProtocolHandler( 770 chrome::kAboutScheme, 771 new chrome_browser_net::AboutProtocolHandler()); 772#if !defined(DISABLE_FTP_SUPPORT) 773 DCHECK(ftp_transaction_factory); 774 job_factory->SetProtocolHandler( 775 chrome::kFtpScheme, 776 new net::FtpProtocolHandler(ftp_transaction_factory)); 777#endif // !defined(DISABLE_FTP_SUPPORT) 778 779 scoped_ptr<net::URLRequestJobFactory> top_job_factory = 780 job_factory.PassAs<net::URLRequestJobFactory>(); 781#if defined(DEBUG_DEVTOOLS) 782 top_job_factory.reset(new net::ProtocolInterceptJobFactory( 783 top_job_factory.Pass(), 784 scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>( 785 new DebugDevToolsInterceptor))); 786#endif 787 788 if (protocol_handler_interceptor) { 789 protocol_handler_interceptor->Chain(top_job_factory.Pass()); 790 return protocol_handler_interceptor.PassAs<net::URLRequestJobFactory>(); 791 } else { 792 return top_job_factory.Pass(); 793 } 794} 795 796void ProfileIOData::ShutdownOnUIThread() { 797 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 798 799 if (signin_names_) 800 signin_names_->ReleaseResourcesOnUIThread(); 801 802 google_services_username_.Destroy(); 803 google_services_username_pattern_.Destroy(); 804 reverse_autologin_enabled_.Destroy(); 805 one_click_signin_rejected_email_list_.Destroy(); 806 enable_referrers_.Destroy(); 807 enable_do_not_track_.Destroy(); 808 force_safesearch_.Destroy(); 809#if !defined(OS_CHROMEOS) 810 enable_metrics_.Destroy(); 811#endif 812 safe_browsing_enabled_.Destroy(); 813 printing_enabled_.Destroy(); 814 sync_disabled_.Destroy(); 815 signin_allowed_.Destroy(); 816 session_startup_pref_.Destroy(); 817#if defined(ENABLE_CONFIGURATION_POLICY) 818 if (url_blacklist_manager_) 819 url_blacklist_manager_->ShutdownOnUIThread(); 820#endif 821 if (chrome_http_user_agent_settings_) 822 chrome_http_user_agent_settings_->CleanupOnUIThread(); 823 bool posted = BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, this); 824 if (!posted) 825 delete this; 826} 827 828void ProfileIOData::set_server_bound_cert_service( 829 net::ServerBoundCertService* server_bound_cert_service) const { 830 server_bound_cert_service_.reset(server_bound_cert_service); 831} 832 833void ProfileIOData::DestroyResourceContext() { 834 resource_context_.reset(); 835} 836 837void ProfileIOData::PopulateNetworkSessionParams( 838 const ProfileParams* profile_params, 839 net::HttpNetworkSession::Params* params) const { 840 841 ChromeURLRequestContext* context = main_request_context(); 842 843 IOThread* const io_thread = profile_params->io_thread; 844 845 io_thread->InitializeNetworkSessionParams(params); 846 847 params->host_resolver = context->host_resolver(); 848 params->cert_verifier = context->cert_verifier(); 849 params->server_bound_cert_service = context->server_bound_cert_service(); 850 params->transport_security_state = context->transport_security_state(); 851 params->proxy_service = context->proxy_service(); 852 params->ssl_session_cache_shard = GetSSLSessionCacheShard(); 853 params->ssl_config_service = context->ssl_config_service(); 854 params->http_auth_handler_factory = context->http_auth_handler_factory(); 855 params->network_delegate = network_delegate(); 856 params->http_server_properties = context->http_server_properties(); 857 params->net_log = context->net_log(); 858} 859 860void ProfileIOData::SetCookieSettingsForTesting( 861 CookieSettings* cookie_settings) { 862 DCHECK(!cookie_settings_); 863 cookie_settings_ = cookie_settings; 864} 865 866void ProfileIOData::set_signin_names_for_testing( 867 SigninNamesOnIOThread* signin_names) { 868 signin_names_.reset(signin_names); 869} 870