Index: remoting/host/policy_watcher.cc |
diff --git a/remoting/host/policy_watcher.cc b/remoting/host/policy_watcher.cc |
index 9c71cb2a5601907b6b69d369c22b68de87c5774b..8ef59a7558e47b638e77ecf2587a663a15b5a6e3 100644 |
--- a/remoting/host/policy_watcher.cc |
+++ b/remoting/host/policy_watcher.cc |
@@ -26,9 +26,7 @@ |
#include "base/json/json_reader.h" |
#endif |
-#if defined(OS_CHROMEOS) |
-#include "content/public/browser/browser_thread.h" |
-#elif defined(OS_WIN) |
+#if defined(OS_WIN) |
#include "components/policy/core/common/policy_loader_win.h" |
#elif defined(OS_MACOSX) |
#include "components/policy/core/common/policy_loader_mac.h" |
@@ -93,13 +91,10 @@ policy::PolicyNamespace GetPolicyNamespace() { |
void PolicyWatcher::StartWatching( |
const PolicyUpdatedCallback& policy_updated_callback, |
const PolicyErrorCallback& policy_error_callback) { |
- if (!OnPolicyServiceThread()) { |
- policy_service_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&PolicyWatcher::StartWatching, base::Unretained(this), |
- policy_updated_callback, policy_error_callback)); |
- return; |
- } |
+ DCHECK(CalledOnValidThread()); |
+ DCHECK(!policy_updated_callback.is_null()); |
+ DCHECK(!policy_error_callback.is_null()); |
+ DCHECK(policy_updated_callback_.is_null()); |
policy_updated_callback_ = policy_updated_callback; |
policy_error_callback_ = policy_error_callback; |
@@ -113,26 +108,9 @@ void PolicyWatcher::StartWatching( |
} |
} |
-void PolicyWatcher::StopWatching(const base::Closure& stopped_callback) { |
- policy_service_task_runner_->PostTaskAndReply( |
- FROM_HERE, base::Bind(&PolicyWatcher::StopWatchingOnPolicyServiceThread, |
- base::Unretained(this)), |
- stopped_callback); |
-} |
- |
-void PolicyWatcher::StopWatchingOnPolicyServiceThread() { |
- policy_service_->RemoveObserver(policy::POLICY_DOMAIN_CHROME, this); |
- policy_updated_callback_.Reset(); |
- policy_error_callback_.Reset(); |
-} |
- |
-bool PolicyWatcher::OnPolicyServiceThread() const { |
- return policy_service_task_runner_->BelongsToCurrentThread(); |
-} |
- |
void PolicyWatcher::UpdatePolicies( |
const base::DictionaryValue* new_policies_raw) { |
- DCHECK(OnPolicyServiceThread()); |
+ DCHECK(CalledOnValidThread()); |
transient_policy_error_retry_counter_ = 0; |
@@ -176,14 +154,11 @@ void PolicyWatcher::SignalTransientPolicyError() { |
} |
PolicyWatcher::PolicyWatcher( |
- const scoped_refptr<base::SingleThreadTaskRunner>& |
- policy_service_task_runner, |
policy::PolicyService* policy_service, |
scoped_ptr<policy::PolicyService> owned_policy_service, |
scoped_ptr<policy::ConfigurationPolicyProvider> owned_policy_provider, |
scoped_ptr<policy::SchemaRegistry> owned_schema_registry) |
- : policy_service_task_runner_(policy_service_task_runner), |
- transient_policy_error_retry_counter_(0), |
+ : transient_policy_error_retry_counter_(0), |
old_policies_(new base::DictionaryValue()), |
default_values_(new base::DictionaryValue()), |
policy_service_(policy_service), |
@@ -222,6 +197,11 @@ PolicyWatcher::PolicyWatcher( |
} |
PolicyWatcher::~PolicyWatcher() { |
+ // Stop observing |policy_service_| if StartWatching() has been called. |
+ if (!policy_updated_callback_.is_null()) { |
+ policy_service_->RemoveObserver(policy::POLICY_DOMAIN_CHROME, this); |
+ } |
+ |
if (owned_policy_provider_) { |
owned_policy_provider_->Shutdown(); |
} |
@@ -245,8 +225,6 @@ void PolicyWatcher::OnPolicyServiceInitialized(policy::PolicyDomain domain) { |
} |
scoped_ptr<PolicyWatcher> PolicyWatcher::CreateFromPolicyLoader( |
- const scoped_refptr<base::SingleThreadTaskRunner>& |
- policy_service_task_runner, |
scoped_ptr<policy::AsyncPolicyLoader> async_policy_loader) { |
// TODO(lukasza): Schema below should ideally only cover Chromoting-specific |
// policies (expecting perf and maintanability improvement, but no functional |
@@ -268,49 +246,46 @@ scoped_ptr<PolicyWatcher> PolicyWatcher::CreateFromPolicyLoader( |
new policy::PolicyServiceImpl(providers)); |
policy::PolicyService* borrowed_policy_service = policy_service.get(); |
- return make_scoped_ptr(new PolicyWatcher( |
- policy_service_task_runner, borrowed_policy_service, |
- policy_service.Pass(), policy_provider.Pass(), schema_registry.Pass())); |
+ return make_scoped_ptr( |
+ new PolicyWatcher(borrowed_policy_service, policy_service.Pass(), |
+ policy_provider.Pass(), schema_registry.Pass())); |
} |
scoped_ptr<PolicyWatcher> PolicyWatcher::Create( |
policy::PolicyService* policy_service, |
- const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner) { |
+ const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) { |
#if defined(OS_CHROMEOS) |
+ // On Chrome OS the PolicyService is owned by the browser. |
DCHECK(policy_service); |
return make_scoped_ptr( |
- new PolicyWatcher(content::BrowserThread::GetMessageLoopProxyForThread( |
- content::BrowserThread::UI), |
- policy_service, nullptr, nullptr, nullptr)); |
-#elif defined(OS_WIN) |
+ new PolicyWatcher(policy_service, nullptr, nullptr, nullptr)); |
+#else // !defined(OS_CHROMEOS) |
DCHECK(!policy_service); |
- // Always read the Chrome policies (even on Chromium) so that policy |
- // enforcement can't be bypassed by running Chromium. |
- // Note that this comment applies to all of Win/Mac/Posix branches below. |
- static const wchar_t kRegistryKey[] = L"SOFTWARE\\Policies\\Google\\Chrome"; |
- return PolicyWatcher::CreateFromPolicyLoader( |
- network_task_runner, |
- policy::PolicyLoaderWin::Create(network_task_runner, kRegistryKey)); |
+ |
+ // Create platform-specific PolicyLoader. Always read the Chrome policies |
+ // (even on Chromium) so that policy enforcement can't be bypassed by running |
+ // Chromium. |
+ scoped_ptr<policy::AsyncPolicyLoader> policy_loader; |
+#if defined(OS_WIN) |
+ policy_loader = policy::PolicyLoaderWin::Create( |
+ file_task_runner, L"SOFTWARE\\Policies\\Google\\Chrome"); |
#elif defined(OS_MACOSX) |
CFStringRef bundle_id = CFSTR("com.google.Chrome"); |
- DCHECK(!policy_service); |
- return PolicyWatcher::CreateFromPolicyLoader( |
- network_task_runner, |
- make_scoped_ptr(new policy::PolicyLoaderMac( |
- network_task_runner, |
- policy::PolicyLoaderMac::GetManagedPolicyPath(bundle_id), |
- new MacPreferences(), bundle_id))); |
+ policy_loader.reset(new policy::PolicyLoaderMac( |
+ file_task_runner, |
+ policy::PolicyLoaderMac::GetManagedPolicyPath(bundle_id), |
+ new MacPreferences(), bundle_id)); |
#elif defined(OS_POSIX) && !defined(OS_ANDROID) |
- DCHECK(!policy_service); |
- static const base::FilePath::CharType kPolicyDir[] = |
- FILE_PATH_LITERAL("/etc/opt/chrome/policies"); |
- return PolicyWatcher::CreateFromPolicyLoader( |
- network_task_runner, make_scoped_ptr(new policy::ConfigDirPolicyLoader( |
- network_task_runner, base::FilePath(kPolicyDir), |
- policy::POLICY_SCOPE_MACHINE))); |
+ policy_loader.reset(new policy::ConfigDirPolicyLoader( |
+ file_task_runner, |
+ base::FilePath(FILE_PATH_LITERAL("/etc/opt/chrome/policies")), |
+ policy::POLICY_SCOPE_MACHINE)); |
#else |
#error OS that is not yet supported by PolicyWatcher code. |
#endif |
+ |
+ return PolicyWatcher::CreateFromPolicyLoader(policy_loader.Pass()); |
+#endif // !(OS_CHROMEOS) |
} |
} // namespace remoting |