diff options
author | joaodasilva@chromium.org <joaodasilva@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-01 08:58:17 +0000 |
---|---|---|
committer | joaodasilva@chromium.org <joaodasilva@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-01 08:58:17 +0000 |
commit | e1f0fc3623f01ea038b513b1fd92e2f99428a160 (patch) | |
tree | befa14590f069aad165b20a59bf5d1d3bed0a5f6 /chrome/browser/automation/automation_provider_observers.cc | |
parent | d21cd38eefdb3d08a52f09fd781570a4b49c703f (diff) | |
download | chromium_src-e1f0fc3623f01ea038b513b1fd92e2f99428a160.zip chromium_src-e1f0fc3623f01ea038b513b1fd92e2f99428a160.tar.gz chromium_src-e1f0fc3623f01ea038b513b1fd92e2f99428a160.tar.bz2 |
Added RefreshPolicies automation call.
Also added CloudPolicyProvider.RefreshPolicies to support it, and extended
CloudPolicyObserver to also observe platform provider updates.
BUG=chromium-os:21956
Review URL: http://codereview.chromium.org/8591001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@112431 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/automation/automation_provider_observers.cc')
-rw-r--r-- | chrome/browser/automation/automation_provider_observers.cc | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/chrome/browser/automation/automation_provider_observers.cc b/chrome/browser/automation/automation_provider_observers.cc index 55fc709..ba23f4b 100644 --- a/chrome/browser/automation/automation_provider_observers.cc +++ b/chrome/browser/automation/automation_provider_observers.cc @@ -16,6 +16,7 @@ #include "base/json/json_value_serializer.h" #include "base/json/json_writer.h" #include "base/memory/scoped_ptr.h" +#include "base/stl_util.h" #include "base/string_number_conversions.h" #include "base/string_util.h" #include "base/stringprintf.h" @@ -45,6 +46,7 @@ #include "chrome/browser/notifications/notification.h" #include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/browser/password_manager/password_store_change.h" +#include "chrome/browser/policy/browser_policy_connector.h" #include "chrome/browser/printing/print_job.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search_engines/template_url_service.h" @@ -2960,3 +2962,87 @@ void BrowserOpenedWithNewProfileNotificationObserver::Observe( NOTREACHED(); } } + +#if defined(ENABLE_CONFIGURATION_POLICY) + +PolicyUpdatesObserver::PolicyUpdatesObserver( + AutomationProvider* automation, + IPC::Message* reply_message, + policy::BrowserPolicyConnector* browser_policy_connector) + : automation_(automation->AsWeakPtr()), + reply_message_(reply_message) { + policy::ConfigurationPolicyProvider* providers[] = { + browser_policy_connector->GetManagedCloudProvider(), + browser_policy_connector->GetManagedPlatformProvider(), + browser_policy_connector->GetRecommendedCloudProvider(), + browser_policy_connector->GetRecommendedPlatformProvider(), + }; + for (size_t i = 0; i < arraysize(providers); ++i) { + if (providers[i]) { + registrars_.push_back(new policy::ConfigurationPolicyObserverRegistrar); + registrars_.back()->Init(providers[i], this); + } + } + MaybeReply(); +} + +PolicyUpdatesObserver::~PolicyUpdatesObserver() {} + +// static +void PolicyUpdatesObserver::PostCallbackAfterPolicyUpdates( + const base::Closure& callback) { + // Some policies (e.g. URLBlacklist) post tasks to other message loops before + // they start enforcing updated policy values; make sure those tasks have + // finished after a policy update. + // Updates of the URLBlacklist are done on IO, after building the blacklist + // on FILE, which is initiated from IO. + PostTask(BrowserThread::IO, + base::Bind(&PostTask, BrowserThread::FILE, + base::Bind(&PostTask, BrowserThread::IO, + base::Bind(&PostTask, BrowserThread::UI, callback)))); +} + +void PolicyUpdatesObserver::OnUpdatePolicy( + policy::ConfigurationPolicyProvider* provider) { + std::vector<policy::ConfigurationPolicyObserverRegistrar*>::iterator it; + for (it = registrars_.begin(); it != registrars_.end(); ++it) { + if ((*it)->provider() == provider) { + delete *it; + registrars_.erase(it); + MaybeReply(); + return; + } + } +} + +void PolicyUpdatesObserver::OnProviderGoingAway( + policy::ConfigurationPolicyProvider* provider) { + STLDeleteElements(®istrars_); + if (automation_) { + AutomationJSONReply(automation_, reply_message_.release()).SendError( + "Policy provider went away."); + } + delete this; +} + +void PolicyUpdatesObserver::MaybeReply() { + if (registrars_.empty()) { + PostCallbackAfterPolicyUpdates( + base::Bind(&PolicyUpdatesObserver::Reply, base::Owned(this))); + } +} + +void PolicyUpdatesObserver::Reply() { + if (automation_) { + AutomationJSONReply( + automation_, reply_message_.release()).SendSuccess(NULL); + } +} + +// static +void PolicyUpdatesObserver::PostTask(content::BrowserThread::ID id, + const base::Closure& callback) { + content::BrowserThread::PostTask(id, FROM_HERE, callback); +} + +#endif // defined(ENABLE_CONFIGURATION_POLICY) |