Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4968)

Unified Diff: chrome/browser/ui/webui/policy_ui.cc

Issue 17387002: Sending known policy names for extensions to chrome://policy page (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@anita-policies
Patch Set: Fixing accidentally-removed line in prev patch Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/resources/policy.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/webui/policy_ui.cc
diff --git a/chrome/browser/ui/webui/policy_ui.cc b/chrome/browser/ui/webui/policy_ui.cc
index 7367f1b335f8316687699af2e042b5a253055a13..a879cf2e8b4ac94fa6e739d8d3d4f5fae42dd87c 100644
--- a/chrome/browser/ui/webui/policy_ui.cc
+++ b/chrome/browser/ui/webui/policy_ui.cc
@@ -32,8 +32,12 @@
#include "chrome/browser/policy/profile_policy_connector_factory.h"
#include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/time_format.h"
#include "chrome/common/url_constants.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/notification_service.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/browser/web_ui_message_handler.h"
@@ -57,6 +61,8 @@
#if !defined(OS_ANDROID) && !defined(OS_IOS)
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_system.h"
+#include "chrome/browser/policy/policy_domain_descriptor.h"
+#include "chrome/browser/policy/policy_schema.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_set.h"
#include "chrome/common/extensions/manifest.h"
@@ -266,12 +272,18 @@ class DeviceLocalAccountPolicyStatusProvider
#endif
// The JavaScript message handler for the chrome://policy page.
-class PolicyUIHandler : public content::WebUIMessageHandler,
+class PolicyUIHandler : public content::NotificationObserver,
+ public content::WebUIMessageHandler,
public policy::PolicyService::Observer {
public:
PolicyUIHandler();
virtual ~PolicyUIHandler();
+ // content::NotificationObserver implementation.
+ virtual void Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) OVERRIDE;
+
// content::WebUIMessageHandler implementation.
virtual void RegisterMessages() OVERRIDE;
@@ -319,6 +331,8 @@ class PolicyUIHandler : public content::WebUIMessageHandler,
scoped_ptr<CloudPolicyStatusProvider> user_status_provider_;
scoped_ptr<CloudPolicyStatusProvider> device_status_provider_;
+ content::NotificationRegistrar registrar_;
+
DISALLOW_COPY_AND_ASSIGN(PolicyUIHandler);
};
@@ -491,6 +505,13 @@ void PolicyUIHandler::RegisterMessages() {
GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_CHROME, this);
GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_EXTENSIONS, this);
+ registrar_.Add(this,
+ chrome::NOTIFICATION_EXTENSION_LOADED,
+ content::NotificationService::AllSources());
+ registrar_.Add(this,
+ chrome::NOTIFICATION_EXTENSION_UNLOADED,
+ content::NotificationService::AllSources());
+
web_ui()->RegisterMessageCallback(
"initialized",
base::Bind(&PolicyUIHandler::HandleInitialized, base::Unretained(this)));
@@ -500,6 +521,15 @@ void PolicyUIHandler::RegisterMessages() {
base::Unretained(this)));
}
+void PolicyUIHandler::Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ DCHECK(type == chrome::NOTIFICATION_EXTENSION_LOADED ||
+ type == chrome::NOTIFICATION_EXTENSION_UNLOADED);
+ SendPolicyNames();
+ SendPolicyValues();
+}
+
void PolicyUIHandler::OnPolicyUpdated(const policy::PolicyNamespace& ns,
const policy::PolicyMap& previous,
const policy::PolicyMap& current) {
@@ -508,60 +538,90 @@ void PolicyUIHandler::OnPolicyUpdated(const policy::PolicyNamespace& ns,
void PolicyUIHandler::SendPolicyNames() const {
base::DictionaryValue names;
+
+ // Add Chrome policy names.
+ base::DictionaryValue* chrome_policy_names = new base::DictionaryValue;
const policy::PolicyDefinitionList* list =
policy::GetChromePolicyDefinitionList();
for (const policy::PolicyDefinitionList::Entry* entry = list->begin;
entry != list->end; ++entry) {
- names.SetBoolean(entry->name, true);
+ chrome_policy_names->SetBoolean(entry->name, true);
+ }
+ names.Set("chromePolicyNames", chrome_policy_names);
+
+#if !defined(OS_ANDROID) && !defined(OS_IOS)
+ // Add extension policy names.
+ base::DictionaryValue* extension_policy_names = new base::DictionaryValue;
+ extensions::ExtensionSystem* extension_system =
+ extensions::ExtensionSystem::Get(Profile::FromWebUI(web_ui()));
+ const ExtensionSet* extensions =
+ extension_system->extension_service()->extensions();
+ scoped_refptr<const policy::PolicyDomainDescriptor> policy_domain_descriptor;
+ policy_domain_descriptor = GetPolicyService()->
+ GetPolicyDomainDescriptor(policy::POLICY_DOMAIN_EXTENSIONS);
+ const policy::PolicyDomainDescriptor::SchemaMap& schema_map =
+ policy_domain_descriptor->components();
+
+ for (ExtensionSet::const_iterator it = extensions->begin();
+ it != extensions->end(); ++it) {
+ const extensions::Extension* extension = *it;
+ if (extension->location() == extensions::Manifest::COMPONENT)
+ continue;
+ base::DictionaryValue* extension_value = new base::DictionaryValue;
+ extension_value->SetString("name", extension->name());
+ policy::PolicyDomainDescriptor::SchemaMap::const_iterator schema =
+ schema_map.find(extension->id());
+ base::DictionaryValue* policy_names = new base::DictionaryValue;
+ if (schema != schema_map.end()) {
+ // Get policy names from the extension's policy schema.
+ // Store in a map, not an array, for faster lookup on JS side.
+ const policy::PolicySchemaMap* policies = schema->second->GetProperties();
+ policy::PolicySchemaMap::const_iterator it_policies;
+ for (it_policies = policies->begin(); it_policies != policies->end();
+ it_policies++) {
+ policy_names->SetBoolean(it_policies->first, true);
+ }
+ }
+ extension_value->Set("policyNames", policy_names);
+ extension_policy_names->Set(extension->id(), extension_value);
}
+ names.Set("extensionPolicyNames", extension_policy_names);
+#endif
+
web_ui()->CallJavascriptFunction("policy.Page.setPolicyNames", names);
}
void PolicyUIHandler::SendPolicyValues() const {
base::DictionaryValue all_policies;
- // Add chrome policies.
+ // Add Chrome policy values.
base::DictionaryValue* chrome_policies = new base::DictionaryValue;
GetChromePolicyValues(chrome_policies);
all_policies.Set("chromePolicies", chrome_policies);
#if !defined(OS_ANDROID) && !defined(OS_IOS)
- // Get extensions.
+ // Add extension policy values.
extensions::ExtensionSystem* extension_system =
extensions::ExtensionSystem::Get(Profile::FromWebUI(web_ui()));
const ExtensionSet* extensions =
extension_system->extension_service()->extensions();
-
- // Add policies for each extension.
base::DictionaryValue* extension_values = new base::DictionaryValue;
+
for (ExtensionSet::const_iterator it = extensions->begin();
it != extensions->end(); ++it) {
const extensions::Extension* extension = *it;
-
- // Skip this extension if it's a component extension.
if (extension->location() == extensions::Manifest::COMPONENT)
continue;
-
- base::DictionaryValue* extension_value = new base::DictionaryValue;
-
- // Add name.
- extension_value->SetString("name", extension->name());
-
- // Add policies.
base::DictionaryValue* extension_policies = new base::DictionaryValue;
policy::PolicyNamespace policy_namespace = policy::PolicyNamespace(
policy::POLICY_DOMAIN_EXTENSIONS, extension->id());
policy::PolicyErrorMap empty_error_map;
GetPolicyValues(GetPolicyService()->GetPolicies(policy_namespace),
&empty_error_map, extension_policies);
- extension_value->Set("policies", extension_policies);
-
- // Add entry to the dictionary.
- extension_values->Set(extension->id(), extension_value);
+ extension_values->Set(extension->id(), extension_policies);
}
all_policies.Set("extensionPolicies", extension_values);
#endif
-
web_ui()->CallJavascriptFunction("policy.Page.setPolicyValues", all_policies);
}
« no previous file with comments | « chrome/browser/resources/policy.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698