Chromium Code Reviews| 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 edbda8db79282d6b95d221cd30b257b336eb6765..7de637504652678320ea5bf780de0775a0647b7c 100644 |
| --- a/chrome/browser/ui/webui/policy_ui.cc |
| +++ b/chrome/browser/ui/webui/policy_ui.cc |
| @@ -26,8 +26,10 @@ |
| #include "chrome/browser/policy/cloud/cloud_policy_validator.h" |
| #include "chrome/browser/policy/cloud/message_util.h" |
| #include "chrome/browser/policy/configuration_policy_handler_list.h" |
| +#include "chrome/browser/policy/policy_domain_descriptor.h" |
| #include "chrome/browser/policy/policy_error_map.h" |
| #include "chrome/browser/policy/policy_map.h" |
| +#include "chrome/browser/policy/policy_schema.h" |
| #include "chrome/browser/policy/policy_service.h" |
| #include "chrome/browser/policy/policy_types.h" |
| #include "chrome/browser/policy/profile_policy_connector.h" |
| @@ -500,17 +502,80 @@ void PolicyUIHandler::RegisterMessages() { |
| void PolicyUIHandler::OnPolicyUpdated(const policy::PolicyNamespace& ns, |
| const policy::PolicyMap& previous, |
| const policy::PolicyMap& current) { |
| + SendPolicyNames(); |
| SendPolicyValues(); |
| } |
| 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); |
| + |
| + // Add extension policy names. |
| + base::DictionaryValue* extension_policy_names = new base::DictionaryValue; |
| + |
| + // Get extensions. |
| + extensions::ExtensionSystem* extension_system = |
| + extensions::ExtensionSystem::Get(Profile::FromWebUI(web_ui())); |
| + const ExtensionSet* extensions = |
| + extension_system->extension_service()->extensions(); |
| + |
| + // Add all extension names to the map. |
| + 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; |
| + extension_value->SetString("name", extension->name()); |
| + extension_policy_names->Set(extension->id(), extension_value); |
| + } |
| + |
| + // Get the policy schema map. |
| + 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(); |
| + |
| + // Add policy names for extensions which are in the policy schema map. |
| + policy::PolicyDomainDescriptor::SchemaMap::const_iterator it_map; |
| + for (it_map = schema_map.begin(); it_map != schema_map.end(); it_map++) { |
| + // Skip this extension if it doesn't have a policy schema, |
| + // or if it is a component extension. |
| + if (it_map->second == NULL || |
| + extensions->GetByID(it_map->first)->location() == |
| + extensions::Manifest::COMPONENT) |
| + continue; |
| + |
| + // Get policy names from the extension's policy schema. |
| + // Store in a map, not an array, for faster lookup on JS side. |
| + base::DictionaryValue* policy_names = new base::DictionaryValue; |
| + const policy::PolicySchemaMap* policies = it_map->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); |
| + } |
| + |
| + // Add policy names to extension's entry in the dictionary. |
| + base::DictionaryValue* extension_value = new base::DictionaryValue; |
| + extension_policy_names->GetDictionary(it_map->first, &extension_value); |
| + extension_value->Set("policyNames", policy_names); |
| + } |
|
Joao da Silva
2013/06/18 13:26:04
Have a single for loop:
- get the list of all ext
anitawoodruff
2013/06/18 14:53:38
I've combined it into a single for-loop, but that
|
| + |
| + names.Set("extensionPolicyNames", extension_policy_names); |
| web_ui()->CallJavascriptFunction("policy.Page.setPolicyNames", names); |
| } |
| @@ -538,22 +603,17 @@ void PolicyUIHandler::SendPolicyValues() const { |
| if (extension->location() == extensions::Manifest::COMPONENT) |
| continue; |
| - base::DictionaryValue* extension_value = new base::DictionaryValue; |
| - |
| - // Add name. |
| - extension_value->SetString("name", extension->name()); |
| - |
| - // Add policies. |
| + // Add policies values. |
| + // Store in a map, not an array, for faster lookup on JS side. |
| 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); |