1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_POLICY_CLOUD_USER_CLOUD_POLICY_MANAGER_FACTORY_H_ 6 #define CHROME_BROWSER_POLICY_CLOUD_USER_CLOUD_POLICY_MANAGER_FACTORY_H_ 7 8 #include <map> 9 10 #include "base/basictypes.h" 11 #include "base/memory/ref_counted.h" 12 #include "base/memory/singleton.h" 13 #include "components/keyed_service/content/browser_context_keyed_base_factory.h" 14 15 namespace base { 16 class SequencedTaskRunner; 17 } 18 19 namespace content { 20 class BrowserContext; 21 } 22 23 namespace policy { 24 25 class UserCloudPolicyManager; 26 27 // BrowserContextKeyedBaseFactory implementation for UserCloudPolicyManager 28 // instances that initialize per-profile cloud policy settings on the desktop 29 // platforms. 30 // 31 // UserCloudPolicyManager is handled different than other 32 // KeyedServices because it is a dependency of PrefService. 33 // Therefore, lifetime of instances is managed by Profile, Profile startup code 34 // invokes CreateForBrowserContext() explicitly, takes ownership, and the 35 // instance is only deleted after PrefService destruction. 36 // 37 // TODO(mnissler): Remove the special lifetime management in favor of 38 // PrefService directly depending on UserCloudPolicyManager once the former has 39 // been converted to a KeyedService. 40 // See also http://crbug.com/131843 and http://crbug.com/131844. 41 class UserCloudPolicyManagerFactory : public BrowserContextKeyedBaseFactory { 42 public: 43 // Returns an instance of the UserCloudPolicyManagerFactory singleton. 44 static UserCloudPolicyManagerFactory* GetInstance(); 45 46 // Returns the UserCloudPolicyManager instance associated with |context|. 47 static UserCloudPolicyManager* GetForBrowserContext( 48 content::BrowserContext* context); 49 50 // Creates an instance for |context|. Note that the caller is responsible for 51 // managing the lifetime of the instance. Subsequent calls to 52 // GetForBrowserContext() will return the created instance as long as it 53 // lives. If RegisterTestingFactory() has been called, then calls to 54 // this method will return null. 55 // 56 // If |force_immediate_load| is true, policy is loaded synchronously from 57 // UserCloudPolicyStore at startup. 58 // 59 // |background_task_runner| is used for the cloud policy store. 60 // |file_task_runner| is used for file operations. Currently this must be the 61 // FILE BrowserThread. 62 // |io_task_runner| is used for network IO. Currently this must be the IO 63 // BrowserThread. 64 static scoped_ptr<UserCloudPolicyManager> CreateForOriginalBrowserContext( 65 content::BrowserContext* context, 66 bool force_immediate_load, 67 const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, 68 const scoped_refptr<base::SequencedTaskRunner>& file_task_runner, 69 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner); 70 71 static UserCloudPolicyManager* RegisterForOffTheRecordBrowserContext( 72 content::BrowserContext* original_context, 73 content::BrowserContext* off_the_record_context); 74 75 typedef UserCloudPolicyManager* 76 (*TestingFactoryFunction)(content::BrowserContext* context); 77 78 // Allows testing code to inject UserCloudPolicyManager objects for tests. 79 // The factory function will be invoked for every Profile created. Because 80 // this class does not free the UserCloudPolicyManager objects it manages, 81 // it is up to the tests themselves to free the objects after the profile is 82 // shut down. 83 void RegisterTestingFactory(TestingFactoryFunction factory); 84 void ClearTestingFactory(); 85 86 private: 87 class ManagerWrapper; 88 friend struct DefaultSingletonTraits<UserCloudPolicyManagerFactory>; 89 90 UserCloudPolicyManagerFactory(); 91 virtual ~UserCloudPolicyManagerFactory(); 92 93 // See comments for the static versions above. 94 UserCloudPolicyManager* GetManagerForBrowserContext( 95 content::BrowserContext* context); 96 97 scoped_ptr<UserCloudPolicyManager> CreateManagerForOriginalBrowserContext( 98 content::BrowserContext* context, 99 bool force_immediate_load, 100 const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, 101 const scoped_refptr<base::SequencedTaskRunner>& file_task_runner, 102 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner); 103 104 UserCloudPolicyManager* RegisterManagerForOffTheRecordBrowserContext( 105 content::BrowserContext* original_context, 106 content::BrowserContext* off_the_record_context); 107 108 // BrowserContextKeyedBaseFactory: 109 virtual void BrowserContextShutdown( 110 content::BrowserContext* context) OVERRIDE; 111 virtual void BrowserContextDestroyed( 112 content::BrowserContext* context) OVERRIDE; 113 virtual void SetEmptyTestingFactory( 114 content::BrowserContext* context) OVERRIDE; 115 virtual bool HasTestingFactory(content::BrowserContext* context) OVERRIDE; 116 virtual void CreateServiceNow(content::BrowserContext* context) OVERRIDE; 117 virtual bool ServiceIsCreatedWithBrowserContext() const OVERRIDE; 118 119 120 typedef std::map<content::BrowserContext*, ManagerWrapper*> ManagerWrapperMap; 121 122 ManagerWrapperMap manager_wrappers_; 123 TestingFactoryFunction testing_factory_; 124 125 DISALLOW_COPY_AND_ASSIGN(UserCloudPolicyManagerFactory); 126 }; 127 128 } // namespace policy 129 130 #endif // CHROME_BROWSER_POLICY_CLOUD_USER_CLOUD_POLICY_MANAGER_FACTORY_H_ 131