user_cloud_policy_manager_factory_chromeos.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/path_service.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/browser_process.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/cloud/device_management_service.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/cloud/resource_cache.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_paths.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_dependency_manager.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace policy { 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Subdirectory in the user's profile for storing legacy user policies. 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::FilePath::CharType kDeviceManagementDir[] = 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FILE_PATH_LITERAL("Device Management"); 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// File in the above directory for storing legacy user policy dmtokens. 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::FilePath::CharType kToken[] = FILE_PATH_LITERAL("Token"); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This constant is used to build two different paths. It can be a file inside 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// kDeviceManagementDir where legacy user policy data is stored, and it can be 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// a directory inside the profile directory where other resources are stored. 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::FilePath::CharType kPolicy[] = FILE_PATH_LITERAL("Policy"); 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Directory under kPolicy, in the user's profile dir, where external policy 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// resources are stored. 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::FilePath::CharType kResourceDir[] = FILE_PATH_LITERAL("Resources"); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)UserCloudPolicyManagerFactoryChromeOS* 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserCloudPolicyManagerFactoryChromeOS::GetInstance() { 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Singleton<UserCloudPolicyManagerFactoryChromeOS>::get(); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)UserCloudPolicyManagerChromeOS* 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserCloudPolicyManagerFactoryChromeOS::GetForProfile( 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile) { 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetInstance()->GetManagerForProfile(profile); 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<UserCloudPolicyManagerChromeOS> 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserCloudPolicyManagerFactoryChromeOS::CreateForProfile( 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile, 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool force_immediate_load) { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetInstance()->CreateManagerForProfile(profile, force_immediate_load); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)UserCloudPolicyManagerFactoryChromeOS::UserCloudPolicyManagerFactoryChromeOS() 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : BrowserContextKeyedBaseFactory( 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "UserCloudPolicyManagerChromeOS", 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserContextDependencyManager::GetInstance()) {} 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)UserCloudPolicyManagerFactoryChromeOS:: 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~UserCloudPolicyManagerFactoryChromeOS() {} 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)UserCloudPolicyManagerChromeOS* 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserCloudPolicyManagerFactoryChromeOS::GetManagerForProfile( 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile) { 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Get the manager for the original profile, since the PolicyService is 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // also shared between the incognito Profile and the original Profile. 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagerMap::const_iterator it = managers_.find(profile->GetOriginalProfile()); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return it != managers_.end() ? it->second : NULL; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<UserCloudPolicyManagerChromeOS> 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserCloudPolicyManagerFactoryChromeOS::CreateManagerForProfile( 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile, 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool force_immediate_load) { 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const CommandLine* command_line = CommandLine::ForCurrentProcess(); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't initialize cloud policy for the signin profile. 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chromeos::ProfileHelper::IsSigninProfile(profile)) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<UserCloudPolicyManagerChromeOS>(); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |user| should never be NULL except for the signin profile. This object is 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // created as part of the Profile creation, which happens right after 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // sign-in. The just-signed-in User is the active user during that time. 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::UserManager* user_manager = chromeos::UserManager::Get(); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::User* user = user_manager->GetActiveUser(); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK(user); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only USER_TYPE_REGULAR users have user cloud policy. 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // USER_TYPE_RETAIL_MODE, USER_TYPE_KIOSK_APP and USER_TYPE_GUEST are not 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // signed in and can't authenticate the policy registration. 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // USER_TYPE_PUBLIC_ACCOUNT gets its policy from the 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // DeviceLocalAccountPolicyService. 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // USER_TYPE_LOCALLY_MANAGED gets its policy from the 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ManagedModePolicyProvider. 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& username = user->email(); 109a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (user->GetType() != chromeos::User::USER_TYPE_REGULAR || 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserPolicyConnector::IsNonEnterpriseUser(username)) { 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<UserCloudPolicyManagerChromeOS>(); 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserPolicyConnector* connector = 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_browser_process->browser_policy_connector(); 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserAffiliation affiliation = connector->GetUserAffiliation(username); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const bool is_managed_user = affiliation == USER_AFFILIATION_MANAGED; 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const bool is_browser_restart = 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->HasSwitch(chromeos::switches::kLoginUser) && 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !command_line->HasSwitch(chromeos::switches::kLoginPassword); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const bool wait_for_initial_policy = is_managed_user && !is_browser_restart; 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DeviceManagementService* device_management_service = 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connector->device_management_service(); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (wait_for_initial_policy) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) device_management_service->ScheduleInitialization(0); 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath profile_dir = profile->GetPath(); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath legacy_dir = profile_dir.Append(kDeviceManagementDir); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath policy_cache_file = legacy_dir.Append(kPolicy); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath token_cache_file = legacy_dir.Append(kToken); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath resource_cache_dir = 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_dir.Append(kPolicy).Append(kResourceDir); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath policy_key_dir; 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK(PathService::Get(chromeos::DIR_USER_POLICY_KEYS, &policy_key_dir)); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<CloudPolicyStore> store( 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new UserCloudPolicyStoreChromeOS( 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::DBusThreadManager::Get()->GetCryptohomeClient(), 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::DBusThreadManager::Get()->GetSessionManagerClient(), 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) username, policy_key_dir, token_cache_file, policy_cache_file)); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ResourceCache> resource_cache; 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_line->HasSwitch(switches::kEnableComponentCloudPolicy)) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resource_cache.reset(new ResourceCache(resource_cache_dir)); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<UserCloudPolicyManagerChromeOS> manager( 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new UserCloudPolicyManagerChromeOS(store.Pass(), 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resource_cache.Pass(), 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wait_for_initial_policy)); 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager->Init(); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager->Connect(g_browser_process->local_state(), 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) device_management_service, 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_browser_process->system_request_context(), 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) affiliation); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(managers_.find(profile) == managers_.end()); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) managers_[profile] = manager.get(); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return manager.Pass(); 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCloudPolicyManagerFactoryChromeOS::BrowserContextShutdown( 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* context) { 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (profile->IsOffTheRecord()) 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserCloudPolicyManagerChromeOS* manager = GetManagerForProfile(profile); 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (manager) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager->Shutdown(); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCloudPolicyManagerFactoryChromeOS::BrowserContextDestroyed( 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* context) { 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) managers_.erase(profile); 17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserContextKeyedBaseFactory::BrowserContextDestroyed(context); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void UserCloudPolicyManagerFactoryChromeOS::SetEmptyTestingFactory( 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* context) {} 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void UserCloudPolicyManagerFactoryChromeOS::CreateServiceNow( 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* context) {} 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace policy 184