Index: chrome/browser/chromeos/policy/device_local_account_policy_service.h |
diff --git a/chrome/browser/chromeos/policy/device_local_account_policy_service.h b/chrome/browser/chromeos/policy/device_local_account_policy_service.h |
index 02b82f4de26ffff2b6532db9d5338a852df83a96..9e8527840eeb8e0341f6f902fd0769bf2610f90a 100644 |
--- a/chrome/browser/chromeos/policy/device_local_account_policy_service.h |
+++ b/chrome/browser/chromeos/policy/device_local_account_policy_service.h |
@@ -6,6 +6,7 @@ |
#define CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_LOCAL_ACCOUNT_POLICY_SERVICE_H_ |
#include <map> |
+#include <set> |
#include <string> |
#include "base/basictypes.h" |
@@ -14,8 +15,8 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/weak_ptr.h" |
#include "base/observer_list.h" |
+#include "chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.h" |
#include "chrome/browser/chromeos/settings/cros_settings.h" |
-#include "chrome/browser/policy/cloud/cloud_policy_core.h" |
#include "chrome/browser/policy/cloud/cloud_policy_store.h" |
namespace base { |
@@ -30,7 +31,8 @@ class SessionManagerClient; |
namespace policy { |
-class CloudPolicyClient; |
+class CloudPolicyCore; |
+struct DeviceLocalAccount; |
class DeviceLocalAccountPolicyStore; |
class DeviceManagementService; |
@@ -39,19 +41,26 @@ class DeviceManagementService; |
class DeviceLocalAccountPolicyBroker { |
public: |
// |task_runner| is the runner for policy refresh tasks. |
- explicit DeviceLocalAccountPolicyBroker( |
- const std::string& user_id, |
+ DeviceLocalAccountPolicyBroker( |
+ const DeviceLocalAccount& account, |
scoped_ptr<DeviceLocalAccountPolicyStore> store, |
const scoped_refptr<base::SequencedTaskRunner>& task_runner); |
~DeviceLocalAccountPolicyBroker(); |
+ const std::string& account_id() const { return account_id_; } |
const std::string& user_id() const { return user_id_; } |
Joao da Silva
2013/10/17 14:57:54
Document these two, it's not clear when each shoul
bartfab (slow)
2013/10/18 12:58:39
Done.
|
- CloudPolicyCore* core() { return &core_; } |
- const CloudPolicyCore* core() const { return &core_; } |
+ scoped_refptr<chromeos::DeviceLocalAccountExternalPolicyLoader> |
+ extension_loader() const { return extension_loader_; } |
- // Establish a cloud connection for the service. |
- void Connect(scoped_ptr<CloudPolicyClient> client); |
+ CloudPolicyCore* core() { return core_.get(); } |
+ const CloudPolicyCore* core() const { return core_.get(); } |
+ |
+ // Fire up the cloud connection for fetching policy for the account from the |
+ // cloud if this is an enterprise-managed device. |
+ void ConnectIfPossible( |
+ chromeos::DeviceSettingsService* device_settings_service, |
+ DeviceManagementService* device_management_service); |
// Destroy the cloud connection, stopping policy refreshes. |
void Disconnect(); |
@@ -64,9 +73,12 @@ class DeviceLocalAccountPolicyBroker { |
std::string GetDisplayName() const; |
private: |
+ const std::string account_id_; |
const std::string user_id_; |
- scoped_ptr<DeviceLocalAccountPolicyStore> store_; |
- CloudPolicyCore core_; |
+ const scoped_ptr<DeviceLocalAccountPolicyStore> store_; |
+ scoped_refptr<chromeos::DeviceLocalAccountExternalPolicyLoader> |
+ extension_loader_; |
+ scoped_ptr<CloudPolicyCore> core_; |
DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyBroker); |
}; |
@@ -92,7 +104,8 @@ class DeviceLocalAccountPolicyService : public CloudPolicyStore::Observer { |
DeviceLocalAccountPolicyService( |
chromeos::SessionManagerClient* session_manager_client, |
chromeos::DeviceSettingsService* device_settings_service, |
- chromeos::CrosSettings* cros_settings); |
+ chromeos::CrosSettings* cros_settings, |
+ scoped_refptr<base::SequencedTaskRunner> extension_cache_task_runner); |
virtual ~DeviceLocalAccountPolicyService(); |
// Initializes the cloud policy service connection. |
@@ -117,29 +130,32 @@ class DeviceLocalAccountPolicyService : public CloudPolicyStore::Observer { |
virtual void OnStoreError(CloudPolicyStore* store) OVERRIDE; |
private: |
- struct PolicyBrokerWrapper { |
- PolicyBrokerWrapper(); |
+ typedef std::map<std::string, DeviceLocalAccountPolicyBroker*> |
+ PolicyBrokerMap; |
- // Return the |broker|, creating it first if necessary. |
- DeviceLocalAccountPolicyBroker* GetBroker(); |
+ // Returns |true| if the directory in which force-installed extensions are |
+ // cached for |account_id| is busy, either because a broker that was using |
+ // this directory has not shut down completely yet or because the directory is |
+ // being deleted. |
+ bool IsExtensionCacheDirectoryBusy(const std::string& account_id); |
- // Fire up the cloud connection for fetching policy for the account from the |
- // cloud if this is an enterprise-managed device. |
- void ConnectIfPossible(); |
+ // Starts any extension caches that are not running yet but can be started now |
+ // because their cache directories are no longer busy. |
+ void StartExtensionCachesIfPossible(); |
- // Destroy the cloud connection. |
- void Disconnect(); |
+ // Checks whether a broker exists for |account_id|. If so, starts the broker's |
+ // extension cache and returns |true|. Otherwise, returns |false|. |
+ bool StartExtensionCacheForAccountIfPresent(const std::string& account_id); |
- // Delete the broker. |
- void DeleteBroker(); |
+ // Called back when any extension caches belonging to device-local accounts |
+ // that no longer exist have been removed at start-up. |
+ void OnOrphanedExtensionCachesDeleted(); |
- std::string user_id; |
- std::string account_id; |
- DeviceLocalAccountPolicyService* parent; |
- DeviceLocalAccountPolicyBroker* broker; |
- }; |
+ // Called back when the extension cache for |account_id| has been shut down. |
+ void OnObsoleteExensionCacheShutdown(const std::string& account_id); |
Joao da Silva
2013/10/17 14:57:54
OnObsoleteExtensionCacheShutdown (missing "t")
bartfab (slow)
2013/10/18 12:58:39
Done.
|
- typedef std::map<std::string, PolicyBrokerWrapper> PolicyBrokerMap; |
+ // Called back when the extension cache for |account_id| has been removed. |
+ void OnObsoleteExtensionCacheDeleted(const std::string& account_id); |
// Re-queries the list of defined device-local accounts from device settings |
// and updates |policy_brokers_| to match that list. |
@@ -163,14 +179,32 @@ class DeviceLocalAccountPolicyService : public CloudPolicyStore::Observer { |
// The device-local account policy brokers, keyed by user ID. |
PolicyBrokerMap policy_brokers_; |
+ // Whether a call to UpdateAccountList() is pending because |cros_settings_| |
+ // are not trusted yet). |
Joao da Silva
2013/10/17 14:57:54
remove )
bartfab (slow)
2013/10/18 12:58:39
Done.
|
+ bool waiting_for_cros_settings_; |
+ |
+ // Whether the process of removing orphaned extension caches at startup has |
+ // been started. |
+ bool orphaned_cache_deletion_started_; |
+ // Whether the process of removing orphaned extension caches at startup has |
+ // been completed. |
+ bool orphaned_cache_deletion_finished_; |
+ |
+ // Account IDs whose extension cache directories are busy, either because a |
+ // broker for the account has not shut down completely yet or because the |
+ // directory is being deleted. |
+ std::set<std::string> busy_extension_cache_directories_; |
Joao da Silva
2013/10/17 14:57:54
I think you got the logic right but I'm wary of ha
bartfab (slow)
2013/10/18 12:58:39
I introduced an enum that combines the two bools i
|
+ |
+ // Background task runner on which all extension caches and cache directory |
+ // removal tasks run. |
+ const scoped_refptr<base::SequencedTaskRunner> extension_cache_task_runner_; |
+ |
ObserverList<Observer, true> observers_; |
- scoped_ptr<chromeos::CrosSettings::ObserverSubscription> |
+ const scoped_ptr<chromeos::CrosSettings::ObserverSubscription> |
local_accounts_subscription_; |
- // Weak pointer factory for cros_settings_->PrepareTrustedValues() callbacks. |
- base::WeakPtrFactory<DeviceLocalAccountPolicyService> |
- cros_settings_callback_factory_; |
+ base::WeakPtrFactory<DeviceLocalAccountPolicyService> weak_factory_; |
DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyService); |
}; |