user_cloud_policy_manager_factory.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/files/file_path.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/sequenced_task_runner.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/schema_registry_service.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/schema_registry_service_factory.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_keyed_service.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_external_data_manager.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_constants.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/user_cloud_policy_store.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/browser_context.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace policy {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Directory inside the profile directory where policy-related resources are
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// stored.
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const base::FilePath::CharType kPolicy[] = FILE_PATH_LITERAL("Policy");
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Directory under kPolicy, in the user's profile dir, where policy for
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// components is cached.
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const base::FilePath::CharType kComponentsDir[] =
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FILE_PATH_LITERAL("Components");
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// A BrowserContextKeyedService that wraps a UserCloudPolicyManager.
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class UserCloudPolicyManagerFactory::ManagerWrapper
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : public BrowserContextKeyedService {
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  explicit ManagerWrapper(UserCloudPolicyManager* manager)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : manager_(manager) {
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(manager);
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~ManagerWrapper() {}
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void Shutdown() OVERRIDE {
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    manager_->Shutdown();
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UserCloudPolicyManager* manager() { return manager_; }
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UserCloudPolicyManager* manager_;
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ManagerWrapper);
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserCloudPolicyManagerFactory* UserCloudPolicyManagerFactory::GetInstance() {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Singleton<UserCloudPolicyManagerFactory>::get();
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager* UserCloudPolicyManagerFactory::GetForBrowserContext(
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetInstance()->GetManagerForBrowserContext(context);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<UserCloudPolicyManager>
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::CreateForOriginalBrowserContext(
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context,
738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    bool force_immediate_load,
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& file_task_runner,
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) {
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UserCloudPolicyManagerFactory* factory = GetInstance();
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If there's a testing factory set, don't bother creating a new one.
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (factory->testing_factory_ != NULL)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return scoped_ptr<UserCloudPolicyManager>();
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return factory->CreateManagerForOriginalBrowserContext(
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context,
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      force_immediate_load,
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      background_task_runner,
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      file_task_runner,
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      io_task_runner);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager*
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::RegisterForOffTheRecordBrowserContext(
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* original_context,
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* off_the_record_context) {
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetInstance()->RegisterManagerForOffTheRecordBrowserContext(
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      original_context, off_the_record_context);
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UserCloudPolicyManagerFactory::RegisterTestingFactory(
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestingFactoryFunction factory) {
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Can't set a testing factory when a testing factory has already been
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // created, or after UCPMs have already been built.
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!testing_factory_);
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(factory);
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(manager_wrappers_.empty());
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  testing_factory_ = factory;
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UserCloudPolicyManagerFactory::ClearTestingFactory() {
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  testing_factory_ = NULL;
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserCloudPolicyManagerFactory::UserCloudPolicyManagerFactory()
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : BrowserContextKeyedBaseFactory(
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        "UserCloudPolicyManager",
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        BrowserContextDependencyManager::GetInstance()),
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      testing_factory_(NULL) {
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DependsOn(SchemaRegistryServiceFactory::GetInstance());
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UserCloudPolicyManagerFactory::~UserCloudPolicyManagerFactory() {
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK(manager_wrappers_.empty());
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager*
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::GetManagerForBrowserContext(
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // In case |context| is an incognito Profile/Context, |manager_wrappers_|
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // will have a matching entry pointing to the manager of the original context.
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ManagerWrapperMap::const_iterator it = manager_wrappers_.find(context);
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return it != manager_wrappers_.end() ? it->second->manager() : NULL;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<UserCloudPolicyManager>
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::CreateManagerForOriginalBrowserContext(
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context,
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool force_immediate_load,
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& file_task_runner,
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) {
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(!context->IsOffTheRecord());
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This should never be called if we're using a testing factory.
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Instead, instances are instantiated via CreateServiceNow().
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!testing_factory_);
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<UserCloudPolicyStore> store(
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      UserCloudPolicyStore::Create(context->GetPath(),
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   GetPolicyVerificationKey(),
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   background_task_runner));
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (force_immediate_load)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    store->LoadImmediately();
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const base::FilePath component_policy_cache_dir =
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context->GetPath().Append(kPolicy).Append(kComponentsDir);
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<UserCloudPolicyManager> manager;
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager.reset(new UserCloudPolicyManager(
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      store.Pass(),
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      component_policy_cache_dir,
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_ptr<CloudExternalDataManager>(),
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::MessageLoopProxy::current(),
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file_task_runner,
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      io_task_runner));
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  manager->Init(SchemaRegistryServiceFactory::GetForContext(context));
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  manager_wrappers_[context] = new ManagerWrapper(manager.get());
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return manager.Pass();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager*
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::RegisterManagerForOffTheRecordBrowserContext(
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* original_context,
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* off_the_record_context) {
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Register the UserCloudPolicyManager of the original context for the
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // respective incognito context. See also GetManagerForBrowserContext.
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  UserCloudPolicyManager* manager =
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetManagerForBrowserContext(original_context);
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  manager_wrappers_[off_the_record_context] = new ManagerWrapper(manager);
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return manager;
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCloudPolicyManagerFactory::BrowserContextShutdown(
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) {
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (context->IsOffTheRecord())
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ManagerWrapperMap::iterator it = manager_wrappers_.find(context);
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // E.g. for a TestingProfile there might not be a manager created.
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (it != manager_wrappers_.end())
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    it->second->Shutdown();
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UserCloudPolicyManagerFactory::BrowserContextDestroyed(
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ManagerWrapperMap::iterator it = manager_wrappers_.find(context);
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (it != manager_wrappers_.end()) {
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // The manager is not owned by the factory, so it's not deleted here.
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    delete it->second;
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    manager_wrappers_.erase(it);
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UserCloudPolicyManagerFactory::SetEmptyTestingFactory(
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    content::BrowserContext* context) {}
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// If there's a TestingFactory set, then create a service during BrowserContext
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// initialization.
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool UserCloudPolicyManagerFactory::ServiceIsCreatedWithBrowserContext() const {
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return testing_factory_ != NULL;
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UserCloudPolicyManagerFactory::CreateServiceNow(
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::BrowserContext* context) {
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(testing_factory_);
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_wrappers_[context] = new ManagerWrapper(testing_factory_(context));
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace policy
217