1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
63f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/io_thread.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/ssl_config_service_manager.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_member.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/ssl_config_service.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//  SSLConfigServicePref
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An SSLConfigService which stores a cached version of the current SSLConfig
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// prefs, which are updated by SSLConfigServiceManagerPref when the prefs
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// change.
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SSLConfigServicePref : public net::SSLConfigService {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SSLConfigServicePref() {}
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~SSLConfigServicePref() {}
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Store SSL config settings in |config|. Must only be called from IO thread.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void GetSSLConfig(net::SSLConfig* config);
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Allow the pref watcher to update our internal state.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class SSLConfigServiceManagerPref;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This method is posted to the IO thread from the browser thread to carry the
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // new config information.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetNewSSLConfig(const net::SSLConfig& new_config);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cached value of prefs, should only be accessed from IO thread.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  net::SSLConfig cached_config_;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SSLConfigServicePref);
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SSLConfigServicePref::GetSSLConfig(net::SSLConfig* config) {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *config = cached_config_;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SSLConfigServicePref::SetNewSSLConfig(
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const net::SSLConfig& new_config) {
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::SSLConfig orig_config = cached_config_;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  cached_config_ = new_config;
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ProcessConfigUpdate(orig_config, new_config);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//  SSLConfigServiceManagerPref
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The manager for holding and updating an SSLConfigServicePref instance.
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SSLConfigServiceManagerPref
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public SSLConfigServiceManager,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      public NotificationObserver {
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SSLConfigServiceManagerPref(PrefService* user_prefs,
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              PrefService* local_state);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~SSLConfigServiceManagerPref() {}
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual net::SSLConfigService* Get();
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Register user_prefs and local_state SSL preferences.
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void RegisterPrefs(PrefService* prefs);
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Copy pref values to local_state from user_prefs if local_state doesn't have
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the pref value and user_prefs has the pref value. Remove them from
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // user_prefs.
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void MigrateUserPrefs(PrefService* local_state,
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               PrefService* user_prefs);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callback for preference changes.  This will post the changes to the IO
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // thread with SetNewSSLConfig.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Store SSL config settings in |config|, directly from the preferences. Must
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // only be called from UI thread.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetSSLConfigFromPrefs(net::SSLConfig* config);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The prefs (should only be accessed from UI thread)
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BooleanPrefMember rev_checking_enabled_;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BooleanPrefMember ssl3_enabled_;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BooleanPrefMember tls1_enabled_;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<SSLConfigServicePref> ssl_config_service_;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SSLConfigServiceManagerPref);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSSLConfigServiceManagerPref::SSLConfigServiceManagerPref(
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PrefService* user_prefs, PrefService* local_state)
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : ssl_config_service_(new SSLConfigServicePref()) {
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(user_prefs);
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(local_state);
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RegisterPrefs(user_prefs);
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RegisterPrefs(local_state);
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(rtenneti): remove migration code after 6 months.
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MigrateUserPrefs(local_state, user_prefs);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rev_checking_enabled_.Init(prefs::kCertRevocationCheckingEnabled,
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             local_state, this);
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ssl3_enabled_.Init(prefs::kSSL3Enabled, local_state, this);
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tls1_enabled_.Init(prefs::kTLS1Enabled, local_state, this);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initialize from UI thread.  This is okay as there shouldn't be anything on
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the IO thread trying to access it yet.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GetSSLConfigFromPrefs(&ssl_config_service_->cached_config_);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SSLConfigServiceManagerPref::RegisterPrefs(PrefService* prefs) {
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  net::SSLConfig default_config;
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!prefs->FindPreference(prefs::kCertRevocationCheckingEnabled)) {
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    prefs->RegisterBooleanPref(prefs::kCertRevocationCheckingEnabled,
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               default_config.rev_checking_enabled);
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!prefs->FindPreference(prefs::kSSL3Enabled)) {
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    prefs->RegisterBooleanPref(prefs::kSSL3Enabled,
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               default_config.ssl3_enabled);
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!prefs->FindPreference(prefs::kTLS1Enabled)) {
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    prefs->RegisterBooleanPref(prefs::kTLS1Enabled,
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               default_config.tls1_enabled);
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SSLConfigServiceManagerPref::MigrateUserPrefs(PrefService* local_state,
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                   PrefService* user_prefs) {
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (user_prefs->HasPrefPath(prefs::kCertRevocationCheckingEnabled)) {
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!local_state->HasPrefPath(prefs::kCertRevocationCheckingEnabled)) {
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Migrate the kCertRevocationCheckingEnabled preference.
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      local_state->SetBoolean(prefs::kCertRevocationCheckingEnabled,
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          user_prefs->GetBoolean(prefs::kCertRevocationCheckingEnabled));
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_prefs->ClearPref(prefs::kCertRevocationCheckingEnabled);
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (user_prefs->HasPrefPath(prefs::kSSL3Enabled)) {
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!local_state->HasPrefPath(prefs::kSSL3Enabled)) {
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Migrate the kSSL3Enabled preference.
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      local_state->SetBoolean(prefs::kSSL3Enabled,
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          user_prefs->GetBoolean(prefs::kSSL3Enabled));
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_prefs->ClearPref(prefs::kSSL3Enabled);
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (user_prefs->HasPrefPath(prefs::kTLS1Enabled)) {
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!local_state->HasPrefPath(prefs::kTLS1Enabled)) {
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Migrate the kTLS1Enabled preference.
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      local_state->SetBoolean(prefs::kTLS1Enabled,
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          user_prefs->GetBoolean(prefs::kTLS1Enabled));
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_prefs->ClearPref(prefs::kTLS1Enabled);
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnet::SSLConfigService* SSLConfigServiceManagerPref::Get() {
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return ssl_config_service_;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SSLConfigServiceManagerPref::Observe(NotificationType type,
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          const NotificationSource& source,
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          const NotificationDetails& details) {
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Thread* io_thread = g_browser_process->io_thread();
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (io_thread) {
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    net::SSLConfig new_config;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GetSSLConfigFromPrefs(&new_config);
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Post a task to |io_loop| with the new configuration, so it can
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // update |cached_config_|.
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    io_thread->message_loop()->PostTask(
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        FROM_HERE,
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NewRunnableMethod(
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            ssl_config_service_.get(),
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            &SSLConfigServicePref::SetNewSSLConfig,
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            new_config));
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SSLConfigServiceManagerPref::GetSSLConfigFromPrefs(
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    net::SSLConfig* config) {
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  config->rev_checking_enabled = rev_checking_enabled_.GetValue();
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  config->ssl3_enabled = ssl3_enabled_.GetValue();
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  config->tls1_enabled = tls1_enabled_.GetValue();
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SSLConfigServicePref::SetSSLConfigFlags(config);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//  SSLConfigServiceManager
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSSLConfigServiceManager* SSLConfigServiceManager::CreateDefaultManager(
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PrefService* user_prefs,
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PrefService* local_state) {
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return new SSLConfigServiceManagerPref(user_prefs, local_state);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
209