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