Index: chrome/browser/chromeos/policy/device_local_account_policy_service.cc |
diff --git a/chrome/browser/chromeos/policy/device_local_account_policy_service.cc b/chrome/browser/chromeos/policy/device_local_account_policy_service.cc |
index 150095cb11d4266b75338c6d6ae7d077387efd09..6fa5a13ae8d2e69284774c65a601cde045aff7de 100644 |
--- a/chrome/browser/chromeos/policy/device_local_account_policy_service.cc |
+++ b/chrome/browser/chromeos/policy/device_local_account_policy_service.cc |
@@ -18,11 +18,14 @@ |
#include "base/sequenced_task_runner.h" |
#include "base/stl_util.h" |
#include "base/strings/string_number_conversions.h" |
+#include "base/thread_task_runner_handle.h" |
+#include "base/time/default_clock.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/chromeos/policy/device_local_account.h" |
#include "chrome/browser/chromeos/policy/device_local_account_external_data_service.h" |
#include "chrome/browser/chromeos/policy/device_local_account_policy_store.h" |
#include "chrome/browser/chromeos/settings/device_settings_service.h" |
+#include "chrome/browser/policy/cloud/cloud_policy_invalidator.h" |
#include "chrome/common/chrome_content_client.h" |
#include "chromeos/chromeos_paths.h" |
#include "chromeos/dbus/session_manager_client.h" |
@@ -115,13 +118,15 @@ void DeleteObsoleteExtensionCache(const std::string& account_id_to_delete) { |
} // namespace |
DeviceLocalAccountPolicyBroker::DeviceLocalAccountPolicyBroker( |
+ AffiliatedInvalidationServiceProvider* invalidation_service_provider, |
const DeviceLocalAccount& account, |
const base::FilePath& component_policy_cache_path, |
scoped_ptr<DeviceLocalAccountPolicyStore> store, |
scoped_refptr<DeviceLocalAccountExternalDataManager> external_data_manager, |
const base::Closure& policy_update_callback, |
const scoped_refptr<base::SequencedTaskRunner>& task_runner) |
- : account_id_(account.account_id), |
+ : invalidation_service_provider_(invalidation_service_provider), |
+ account_id_(account.account_id), |
user_id_(account.user_id), |
component_policy_cache_path_(component_policy_cache_path), |
store_(store.Pass()), |
@@ -131,7 +136,9 @@ DeviceLocalAccountPolicyBroker::DeviceLocalAccountPolicyBroker( |
store_->account_id(), |
store_.get(), |
task_runner), |
- policy_update_callback_(policy_update_callback) { |
+ policy_update_callback_(policy_update_callback), |
+ highest_handled_invalidation_version_(0), |
+ invalidation_service_(nullptr) { |
base::FilePath cache_root_dir; |
CHECK(PathService::Get(chromeos::DIR_DEVICE_LOCAL_ACCOUNT_EXTENSIONS, |
&cache_root_dir)); |
@@ -148,9 +155,13 @@ DeviceLocalAccountPolicyBroker::DeviceLocalAccountPolicyBroker( |
g_browser_process->browser_policy_connector()->GetChromeSchema()); |
schema_registry_.SetReady(POLICY_DOMAIN_CHROME); |
schema_registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); |
+ |
+ invalidation_service_provider_->RegisterConsumer(this); |
} |
DeviceLocalAccountPolicyBroker::~DeviceLocalAccountPolicyBroker() { |
+ DestroyInvalidator(); |
+ invalidation_service_provider_->UnregisterConsumer(this); |
store_->RemoveObserver(this); |
external_data_manager_->SetPolicyStore(nullptr); |
external_data_manager_->Disconnect(); |
@@ -164,7 +175,7 @@ void DeviceLocalAccountPolicyBroker::ConnectIfPossible( |
chromeos::DeviceSettingsService* device_settings_service, |
DeviceManagementService* device_management_service, |
scoped_refptr<net::URLRequestContextGetter> request_context) { |
- if (core_.client()) |
+ if (IsConnected()) |
return; |
scoped_ptr<CloudPolicyClient> client(CreateClient(device_settings_service, |
@@ -178,6 +189,7 @@ void DeviceLocalAccountPolicyBroker::ConnectIfPossible( |
external_data_manager_->Connect(request_context); |
core_.StartRefreshScheduler(); |
UpdateRefreshDelay(); |
+ CreateInvalidatorIfPossible(); |
} |
void DeviceLocalAccountPolicyBroker::UpdateRefreshDelay() { |
@@ -212,6 +224,24 @@ void DeviceLocalAccountPolicyBroker::OnComponentCloudPolicyUpdated() { |
policy_update_callback_.Run(); |
} |
+void DeviceLocalAccountPolicyBroker::OnInvalidationServiceSet( |
+ invalidation::InvalidationService* invalidation_service) { |
+ DestroyInvalidator(); |
+ |
+ invalidation_service_ = invalidation_service; |
+ if (invalidation_service_) |
+ CreateInvalidatorIfPossible(); |
+} |
+ |
+CloudPolicyInvalidator* |
+DeviceLocalAccountPolicyBroker::GetInvalidatorForTest() const { |
+ return invalidator_.get(); |
+} |
+ |
+bool DeviceLocalAccountPolicyBroker::IsConnected() { |
+ return core_.client(); |
+} |
+ |
void DeviceLocalAccountPolicyBroker::CreateComponentCloudPolicyService( |
const scoped_refptr<net::URLRequestContextGetter>& request_context, |
CloudPolicyClient* client) { |
@@ -239,10 +269,36 @@ void DeviceLocalAccountPolicyBroker::CreateComponentCloudPolicyService( |
content::BrowserThread::IO))); |
} |
+void DeviceLocalAccountPolicyBroker::CreateInvalidatorIfPossible() { |
+ DCHECK(!invalidator_); |
+ |
+ if (!invalidation_service_ || !IsConnected()) |
+ return; |
+ |
+ invalidator_.reset(new CloudPolicyInvalidator( |
+ enterprise_management::DeviceRegisterRequest::USER, |
+ core(), |
+ base::ThreadTaskRunnerHandle::Get(), |
+ make_scoped_ptr(new base::DefaultClock), |
+ highest_handled_invalidation_version_)); |
+ invalidator_->Initialize(invalidation_service_); |
+} |
+ |
+void DeviceLocalAccountPolicyBroker::DestroyInvalidator() { |
+ if (!invalidator_) |
+ return; |
+ |
+ highest_handled_invalidation_version_ = |
+ invalidator_->highest_handled_invalidation_version(); |
+ invalidator_->Shutdown(); |
+ invalidator_.reset(); |
+} |
+ |
DeviceLocalAccountPolicyService::DeviceLocalAccountPolicyService( |
chromeos::SessionManagerClient* session_manager_client, |
chromeos::DeviceSettingsService* device_settings_service, |
chromeos::CrosSettings* cros_settings, |
+ AffiliatedInvalidationServiceProvider* invalidation_service_provider, |
scoped_refptr<base::SequencedTaskRunner> store_background_task_runner, |
scoped_refptr<base::SequencedTaskRunner> extension_cache_task_runner, |
scoped_refptr<base::SequencedTaskRunner> |
@@ -252,6 +308,7 @@ DeviceLocalAccountPolicyService::DeviceLocalAccountPolicyService( |
: session_manager_client_(session_manager_client), |
device_settings_service_(device_settings_service), |
cros_settings_(cros_settings), |
+ invalidation_service_provider_(invalidation_service_provider), |
device_management_service_(nullptr), |
waiting_for_cros_settings_(false), |
orphan_extension_cache_deletion_state_(NOT_STARTED), |
@@ -454,6 +511,7 @@ void DeviceLocalAccountPolicyService::UpdateAccountList() { |
external_data_service_->GetExternalDataManager(it->account_id, |
store.get()); |
broker.reset(new DeviceLocalAccountPolicyBroker( |
+ invalidation_service_provider_, |
*it, |
component_policy_cache_root_.Append( |
GetCacheSubdirectoryForAccountID(it->account_id)), |