Index: chrome/tools/build/generate_policy_source.py |
diff --git a/chrome/tools/build/generate_policy_source.py b/chrome/tools/build/generate_policy_source.py |
index f4eef86ff01c8651a16de6114ecd4444aaabe717..95234398eaf6a03a374f4701786771ba9b8dda86 100644 |
--- a/chrome/tools/build/generate_policy_source.py |
+++ b/chrome/tools/build/generate_policy_source.py |
@@ -17,6 +17,15 @@ import sys; |
CHROME_SUBKEY = 'SOFTWARE\\\\Policies\\\\Google\\\\Chrome'; |
CHROMIUM_SUBKEY = 'SOFTWARE\\\\Policies\\\\Chromium'; |
+TYPE_MAP = { |
+ 'int': 'TYPE_INTEGER', |
+ 'int-enum': 'TYPE_INTEGER', |
+ 'list': 'TYPE_LIST', |
+ 'main': 'TYPE_BOOLEAN', |
+ 'string': 'TYPE_STRING', |
+ 'string-enum': 'TYPE_STRING', |
+} |
+ |
def main(): |
parser = OptionParser(usage=__doc__); |
@@ -64,16 +73,48 @@ def _OutputGeneratedWarningForC(f, template_file_path): |
'//\n\n') |
-def _GetPolicyNameList(template_file_contents): |
- policy_names = []; |
+# Returns a tuple with details about the given policy: |
+# (name, type, list_of_platforms, is_device_policy) |
+def _GetPolicyDetails(policy): |
+ if not TYPE_MAP.has_key(policy['type']): |
+ print "Unknown policy type for %s: %s" % (policy['name'], policy['type']) |
+ sys.exit(3) |
+ # platforms is a list of "chrome", "chrome_os" and/or "chrome_frame". |
+ platforms = [ x.split('.')[0].split(':')[0] for x in policy['supported_on'] ] |
+ is_device_policy = policy.get('device_only', False) |
+ return (policy['name'], TYPE_MAP[policy['type']], platforms, is_device_policy) |
+ |
+ |
+def _GetPolicyList(template_file_contents): |
+ policies = []; |
for policy in template_file_contents['policy_definitions']: |
if policy['type'] == 'group': |
for sub_policy in policy['policies']: |
- policy_names.append(sub_policy['name']) |
+ policies.append(_GetPolicyDetails(sub_policy)) |
else: |
- policy_names.append(policy['name']) |
- policy_names.sort() |
- return policy_names |
+ policies.append(_GetPolicyDetails(policy)) |
+ # Tuples are sorted in lexicographical order, which will sort by policy name |
+ # in this case. |
+ policies.sort() |
+ return policies |
+ |
+ |
+def _GetPolicyNameList(template_file_contents): |
+ return [name for (name, _, _, _) in _GetPolicyList(template_file_contents)] |
+ |
+ |
+def _GetChromePolicyList(template_file_contents): |
+ return [(name, vtype) for (name, vtype, platforms, is_device_only) |
+ in _GetPolicyList(template_file_contents) |
+ if 'chrome' in platforms and not is_device_only] |
+ |
+ |
+def _GetChromeOSPolicyList(template_file_contents): |
+ return [(name, vtype) for (name, vtype, platforms, is_device_only) |
+ in _GetPolicyList(template_file_contents) |
+ if 'chrome_os' in platforms |
+ and not 'chrome' in platforms |
+ and not is_device_only] |
def _LoadJSONFile(json_file): |
@@ -87,20 +128,43 @@ def _WritePolicyConstantHeader(template_file_contents, args, opts): |
platform = args[0]; |
with open(opts.header_path, "w") as f: |
_OutputGeneratedWarningForC(f, args[1]) |
+ |
f.write('#ifndef CHROME_COMMON_POLICY_CONSTANTS_H_\n' |
'#define CHROME_COMMON_POLICY_CONSTANTS_H_\n' |
'#pragma once\n' |
'\n' |
+ '#include "base/values.h"\n' |
+ '#include "policy/configuration_policy_type.h"\n' |
+ '\n' |
'namespace policy {\n\n') |
+ |
if platform == "win": |
f.write('// The windows registry path where policy configuration ' |
- 'resides.\nextern const wchar_t kRegistrySubKey[];\n\n') |
+ 'resides.\n' |
+ 'extern const wchar_t kRegistrySubKey[];\n\n') |
+ |
+ f.write('// Lists policy types mapped to their names and expected types.\n' |
+ '// Used to initialize ConfigurationPolicyProviders.\n' |
+ 'struct PolicyDefinitionList {\n' |
+ ' struct Entry {\n' |
+ ' ConfigurationPolicyType policy_type;\n' |
+ ' base::Value::Type value_type;\n' |
+ ' const char* name;\n' |
+ ' };\n' |
+ '\n' |
+ ' const Entry* begin;\n' |
+ ' const Entry* end;\n' |
+ '};\n' |
+ '\n' |
+ '// Gets the policy name for the given policy type.\n' |
+ 'const char* GetPolicyName(ConfigurationPolicyType type);\n' |
+ '\n' |
+ '// Returns the default policy definition list for Chrome.\n' |
+ 'const PolicyDefinitionList* GetChromePolicyDefinitionList();\n\n') |
f.write('// Key names for the policy settings.\n' |
'namespace key {\n\n') |
for policy_name in _GetPolicyNameList(template_file_contents): |
f.write('extern const char k' + policy_name + '[];\n') |
- f.write('\n// Only used in testing.' |
- '\nextern const char* kMapPolicyString[];\n') |
f.write('\n} // namespace key\n\n' |
'} // namespace policy\n\n' |
'#endif // CHROME_COMMON_POLICY_CONSTANTS_H_\n') |
@@ -111,10 +175,37 @@ def _WritePolicyConstantSource(template_file_contents, args, opts): |
platform = args[0]; |
with open(opts.source_path, "w") as f: |
_OutputGeneratedWarningForC(f, args[1]) |
- f.write('#include "policy/policy_constants.h"\n' |
+ |
+ f.write('#include "base/basictypes.h"\n' |
+ '#include "base/logging.h"\n' |
+ '#include "policy/policy_constants.h"\n' |
'\n' |
- 'namespace policy {\n' |
- '\n') |
+ 'namespace policy {\n\n') |
+ |
+ f.write('namespace {\n\n') |
+ |
+ f.write('PolicyDefinitionList::Entry entries[] = {\n') |
+ for (name, vtype) in _GetChromePolicyList(template_file_contents): |
+ f.write(' { kPolicy%s, Value::%s, key::k%s },\n' % (name, vtype, name)) |
+ f.write('\n#if defined(OS_CHROMEOS)\n') |
+ for (name, vtype) in _GetChromeOSPolicyList(template_file_contents): |
+ f.write(' { kPolicy%s, Value::%s, key::k%s },\n' % (name, vtype, name)) |
+ f.write('#endif\n' |
+ '};\n\n') |
+ |
+ f.write('PolicyDefinitionList chrome_policy_list = {\n' |
+ ' entries,\n' |
+ ' entries + arraysize(entries),\n' |
+ '};\n\n') |
+ |
+ f.write('// Maps a policy-type enum value to the policy name.\n' |
+ 'const char* policy_name_map[] = {\n'); |
+ for name in _GetPolicyNameList(template_file_contents): |
+ f.write(' key::k%s,\n' % name) |
+ f.write('};\n\n') |
+ |
+ f.write('} // namespace\n\n') |
+ |
if platform == "win": |
f.write('#if defined(GOOGLE_CHROME_BUILD)\n' |
'const wchar_t kRegistrySubKey[] = ' |
@@ -123,14 +214,20 @@ def _WritePolicyConstantSource(template_file_contents, args, opts): |
'const wchar_t kRegistrySubKey[] = ' |
'L"' + CHROMIUM_SUBKEY + '";\n' |
'#endif\n\n') |
+ |
+ f.write('const char* GetPolicyName(ConfigurationPolicyType type) {\n' |
+ ' CHECK(type >= 0 && ' |
+ 'static_cast<size_t>(type) < arraysize(policy_name_map));\n' |
+ ' return policy_name_map[type];\n' |
+ '}\n' |
+ '\n' |
+ 'const PolicyDefinitionList* GetChromePolicyDefinitionList() {\n' |
+ ' return &chrome_policy_list;\n' |
+ '}\n\n') |
+ |
f.write('namespace key {\n\n') |
for policy_name in _GetPolicyNameList(template_file_contents): |
f.write('const char k%s[] = "%s";\n' % (policy_name, policy_name)) |
- f.write('\n// Only used in testing.' |
- '\nconst char* kMapPolicyString[] = {\n ') |
- for policy_name in _GetPolicyNameList(template_file_contents): |
- f.write('\n "%s",' % policy_name) |
- f.write('\n};\n') |
f.write('\n} // namespace key\n\n' |
'} // namespace policy\n') |