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)#ifndef CHROME_BROWSER_CHROMEOS_POLICY_USER_CLOUD_POLICY_MANAGER_FACTORY_CHROMEOS_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_POLICY_USER_CLOUD_POLICY_MANAGER_FACTORY_CHROMEOS_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/memory/ref_counted.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/singleton.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_keyed_base_factory.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Profile;
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)namespace base {
188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class SequencedTaskRunner;
198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class BrowserContext;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace policy {
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class UserCloudPolicyManagerChromeOS;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// BrowserContextKeyedBaseFactory implementation
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// for UserCloudPolicyManagerChromeOS instances that initialize per-profile
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// cloud policy settings on ChromeOS.
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// UserCloudPolicyManagerChromeOS is handled different than other
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// KeyedServices because it is a dependency of PrefService.
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Therefore, lifetime of instances is managed by Profile, Profile startup code
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// invokes CreateForProfile() explicitly, takes ownership, and the instance
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// is only deleted after PrefService destruction.
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(mnissler): Remove the special lifetime management in favor of
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// PrefService directly depending on UserCloudPolicyManagerChromeOS once the
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// former has been converted to a KeyedService.
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// See also http://crbug.com/131843 and http://crbug.com/131844.
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserCloudPolicyManagerFactoryChromeOS
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : public BrowserContextKeyedBaseFactory {
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns an instance of the UserCloudPolicyManagerFactoryChromeOS singleton.
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static UserCloudPolicyManagerFactoryChromeOS* GetInstance();
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns the UserCloudPolicyManagerChromeOS instance associated with
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |profile|.
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static UserCloudPolicyManagerChromeOS* GetForProfile(Profile* profile);
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Creates an instance for |profile|. Note that the caller is responsible for
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // managing the lifetime of the instance. Subsequent calls to GetForProfile()
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // will return the created instance as long as it lives.
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If |force_immediate_load| is true, policy is loaded synchronously from
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // UserCloudPolicyStore at startup.
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_ptr<UserCloudPolicyManagerChromeOS> CreateForProfile(
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Profile* profile,
618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      bool force_immediate_load,
628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      scoped_refptr<base::SequencedTaskRunner> background_task_runner);
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend struct DefaultSingletonTraits<UserCloudPolicyManagerFactoryChromeOS>;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UserCloudPolicyManagerFactoryChromeOS();
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~UserCloudPolicyManagerFactoryChromeOS();
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // See comments for the static versions above.
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UserCloudPolicyManagerChromeOS* GetManagerForProfile(Profile* profile);
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<UserCloudPolicyManagerChromeOS> CreateManagerForProfile(
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Profile* profile,
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      bool force_immediate_load,
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      scoped_refptr<base::SequencedTaskRunner> background_task_runner);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // BrowserContextKeyedBaseFactory:
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BrowserContextShutdown(
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      content::BrowserContext* context) OVERRIDE;
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void BrowserContextDestroyed(
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      content::BrowserContext* context) OVERRIDE;
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetEmptyTestingFactory(
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::BrowserContext* context) OVERRIDE;
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool HasTestingFactory(content::BrowserContext* context) OVERRIDE;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CreateServiceNow(content::BrowserContext* context) OVERRIDE;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::map<Profile*, UserCloudPolicyManagerChromeOS*> ManagerMap;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ManagerMap managers_;
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UserCloudPolicyManagerFactoryChromeOS);
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace policy
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_POLICY_USER_CLOUD_POLICY_MANAGER_FACTORY_CHROMEOS_H_
96