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