profile_policy_connector_factory.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/policy/profile_policy_connector_factory.h"
6
7#include "base/logging.h"
8#include "base/memory/singleton.h"
9#include "chrome/browser/policy/profile_policy_connector.h"
10#include "chrome/browser/profiles/profile.h"
11#include "components/keyed_service/content/browser_context_dependency_manager.h"
12
13#if defined(ENABLE_CONFIGURATION_POLICY)
14#include "chrome/browser/policy/schema_registry_service.h"
15#include "chrome/browser/policy/schema_registry_service_factory.h"
16#if defined(OS_CHROMEOS)
17#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
18#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h"
19#include "chrome/browser/chromeos/profiles/profile_helper.h"
20#include "components/user_manager/user.h"
21#else
22#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
23#include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
24#endif
25#endif
26
27namespace policy {
28
29// static
30ProfilePolicyConnectorFactory* ProfilePolicyConnectorFactory::GetInstance() {
31  return Singleton<ProfilePolicyConnectorFactory>::get();
32}
33
34// static
35ProfilePolicyConnector* ProfilePolicyConnectorFactory::GetForProfile(
36    Profile* profile) {
37  return GetInstance()->GetForProfileInternal(profile);
38}
39
40// static
41scoped_ptr<ProfilePolicyConnector>
42ProfilePolicyConnectorFactory::CreateForProfile(Profile* profile,
43                                                bool force_immediate_load) {
44  return GetInstance()->CreateForProfileInternal(profile, force_immediate_load);
45}
46
47void ProfilePolicyConnectorFactory::SetServiceForTesting(
48    Profile* profile,
49    ProfilePolicyConnector* connector) {
50  ProfilePolicyConnector*& map_entry = connectors_[profile];
51  CHECK(!map_entry);
52  map_entry = connector;
53}
54
55ProfilePolicyConnectorFactory::ProfilePolicyConnectorFactory()
56    : BrowserContextKeyedBaseFactory(
57        "ProfilePolicyConnector",
58        BrowserContextDependencyManager::GetInstance()) {
59#if defined(ENABLE_CONFIGURATION_POLICY)
60  DependsOn(SchemaRegistryServiceFactory::GetInstance());
61#if defined(OS_CHROMEOS)
62  DependsOn(UserCloudPolicyManagerFactoryChromeOS::GetInstance());
63#else
64  DependsOn(UserCloudPolicyManagerFactory::GetInstance());
65#endif
66#endif
67}
68
69ProfilePolicyConnectorFactory::~ProfilePolicyConnectorFactory() {
70  DCHECK(connectors_.empty());
71}
72
73ProfilePolicyConnector*
74    ProfilePolicyConnectorFactory::GetForProfileInternal(Profile* profile) {
75  // Get the connector for the original Profile, so that the incognito Profile
76  // gets managed settings from the same PolicyService.
77  ConnectorMap::const_iterator it =
78      connectors_.find(profile->GetOriginalProfile());
79  CHECK(it != connectors_.end());
80  return it->second;
81}
82
83scoped_ptr<ProfilePolicyConnector>
84ProfilePolicyConnectorFactory::CreateForProfileInternal(
85    Profile* profile,
86    bool force_immediate_load) {
87  DCHECK(connectors_.find(profile) == connectors_.end());
88
89  SchemaRegistry* schema_registry = NULL;
90  CloudPolicyManager* user_cloud_policy_manager = NULL;
91
92#if defined(ENABLE_CONFIGURATION_POLICY)
93  schema_registry =
94      SchemaRegistryServiceFactory::GetForContext(profile)->registry();
95
96#if defined(OS_CHROMEOS)
97  user_manager::User* user = NULL;
98  if (!chromeos::ProfileHelper::IsSigninProfile(profile)) {
99    user = chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
100    CHECK(user);
101  }
102  user_cloud_policy_manager =
103      UserCloudPolicyManagerFactoryChromeOS::GetForProfile(profile);
104#else
105  user_cloud_policy_manager =
106      UserCloudPolicyManagerFactory::GetForBrowserContext(profile);
107#endif  // defined(OS_CHROMEOS)
108#endif  // defined(ENABLE_CONFIGURATION_POLICY)
109
110  ProfilePolicyConnector* connector = new ProfilePolicyConnector();
111  connector->Init(force_immediate_load,
112#if defined(ENABLE_CONFIGURATION_POLICY) && defined(OS_CHROMEOS)
113                  user,
114#endif
115                  schema_registry,
116                  user_cloud_policy_manager);
117  connectors_[profile] = connector;
118  return make_scoped_ptr(connector);
119}
120
121void ProfilePolicyConnectorFactory::BrowserContextShutdown(
122    content::BrowserContext* context) {
123  Profile* profile = static_cast<Profile*>(context);
124  if (profile->IsOffTheRecord())
125    return;
126  ConnectorMap::iterator it = connectors_.find(profile);
127  if (it != connectors_.end())
128    it->second->Shutdown();
129}
130
131void ProfilePolicyConnectorFactory::BrowserContextDestroyed(
132    content::BrowserContext* context) {
133  ConnectorMap::iterator it = connectors_.find(static_cast<Profile*>(context));
134  if (it != connectors_.end())
135    connectors_.erase(it);
136  BrowserContextKeyedBaseFactory::BrowserContextDestroyed(context);
137}
138
139void ProfilePolicyConnectorFactory::SetEmptyTestingFactory(
140    content::BrowserContext* context) {}
141
142bool ProfilePolicyConnectorFactory::HasTestingFactory(
143    content::BrowserContext* context) {
144  return false;
145}
146
147void ProfilePolicyConnectorFactory::CreateServiceNow(
148    content::BrowserContext* context) {}
149
150}  // namespace policy
151