summaryrefslogtreecommitdiffstats
path: root/chrome/browser/automation/automation_provider_observers.cc
diff options
context:
space:
mode:
authorjoaodasilva@chromium.org <joaodasilva@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-01 08:58:17 +0000
committerjoaodasilva@chromium.org <joaodasilva@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-01 08:58:17 +0000
commite1f0fc3623f01ea038b513b1fd92e2f99428a160 (patch)
treebefa14590f069aad165b20a59bf5d1d3bed0a5f6 /chrome/browser/automation/automation_provider_observers.cc
parentd21cd38eefdb3d08a52f09fd781570a4b49c703f (diff)
downloadchromium_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.cc86
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(&registrars_);
+ 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)