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"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_dependency_manager.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/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)
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// A KeyedService that wraps a UserCloudPolicyManager.
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class UserCloudPolicyManagerFactory::ManagerWrapper : public KeyedService {
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  explicit ManagerWrapper(UserCloudPolicyManager* manager)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : manager_(manager) {
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(manager);
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~ManagerWrapper() {}
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void Shutdown() OVERRIDE {
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    manager_->Shutdown();
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UserCloudPolicyManager* manager() { return manager_; }
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UserCloudPolicyManager* manager_;
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ManagerWrapper);
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserCloudPolicyManagerFactory* UserCloudPolicyManagerFactory::GetInstance() {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Singleton<UserCloudPolicyManagerFactory>::get();
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager* UserCloudPolicyManagerFactory::GetForBrowserContext(
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetInstance()->GetManagerForBrowserContext(context);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<UserCloudPolicyManager>
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::CreateForOriginalBrowserContext(
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context,
728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    bool force_immediate_load,
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& file_task_runner,
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) {
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UserCloudPolicyManagerFactory* factory = GetInstance();
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If there's a testing factory set, don't bother creating a new one.
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (factory->testing_factory_ != NULL)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return scoped_ptr<UserCloudPolicyManager>();
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return factory->CreateManagerForOriginalBrowserContext(
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context,
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      force_immediate_load,
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      background_task_runner,
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      file_task_runner,
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      io_task_runner);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager*
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::RegisterForOffTheRecordBrowserContext(
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* original_context,
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* off_the_record_context) {
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetInstance()->RegisterManagerForOffTheRecordBrowserContext(
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      original_context, off_the_record_context);
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UserCloudPolicyManagerFactory::RegisterTestingFactory(
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestingFactoryFunction factory) {
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Can't set a testing factory when a testing factory has already been
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // created, or after UCPMs have already been built.
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!testing_factory_);
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(factory);
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(manager_wrappers_.empty());
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  testing_factory_ = factory;
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UserCloudPolicyManagerFactory::ClearTestingFactory() {
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  testing_factory_ = NULL;
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserCloudPolicyManagerFactory::UserCloudPolicyManagerFactory()
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : BrowserContextKeyedBaseFactory(
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        "UserCloudPolicyManager",
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        BrowserContextDependencyManager::GetInstance()),
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      testing_factory_(NULL) {
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DependsOn(SchemaRegistryServiceFactory::GetInstance());
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UserCloudPolicyManagerFactory::~UserCloudPolicyManagerFactory() {
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK(manager_wrappers_.empty());
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager*
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::GetManagerForBrowserContext(
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // In case |context| is an incognito Profile/Context, |manager_wrappers_|
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // will have a matching entry pointing to the manager of the original context.
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ManagerWrapperMap::const_iterator it = manager_wrappers_.find(context);
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return it != manager_wrappers_.end() ? it->second->manager() : NULL;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<UserCloudPolicyManager>
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::CreateManagerForOriginalBrowserContext(
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context,
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool force_immediate_load,
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& file_task_runner,
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) {
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(!context->IsOffTheRecord());
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This should never be called if we're using a testing factory.
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Instead, instances are instantiated via CreateServiceNow().
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!testing_factory_);
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<UserCloudPolicyStore> store(
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      UserCloudPolicyStore::Create(context->GetPath(),
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   GetPolicyVerificationKey(),
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   background_task_runner));
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (force_immediate_load)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    store->LoadImmediately();
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const base::FilePath component_policy_cache_dir =
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context->GetPath().Append(kPolicy).Append(kComponentsDir);
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<UserCloudPolicyManager> manager;
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager.reset(new UserCloudPolicyManager(
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      store.Pass(),
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      component_policy_cache_dir,
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_ptr<CloudExternalDataManager>(),
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::MessageLoopProxy::current(),
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file_task_runner,
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      io_task_runner));
1636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  manager->Init(
1646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      SchemaRegistryServiceFactory::GetForContext(context)->registry());
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)
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool UserCloudPolicyManagerFactory::HasTestingFactory(
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::BrowserContext* context) {
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return testing_factory_ != NULL;
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// If there's a TestingFactory set, then create a service during BrowserContext
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// initialization.
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool UserCloudPolicyManagerFactory::ServiceIsCreatedWithBrowserContext() const {
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return testing_factory_ != NULL;
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UserCloudPolicyManagerFactory::CreateServiceNow(
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::BrowserContext* context) {
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(testing_factory_);
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_wrappers_[context] = new ManagerWrapper(testing_factory_(context));
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace policy
222