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

Side by Side Diff: chrome/tools/build/generate_policy_source.py

Issue 58313002: Removed the PolicyDefinitionList. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@chrome-policy-schema-10-use-registry
Patch Set: rebase Created 7 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « chrome/chrome_tests_unit.gypi ('k') | components/policy.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 '''python %prog [options] platform chromium_os_flag template 6 '''python %prog [options] platform chromium_os_flag template
7 7
8 platform specifies which platform source is being generated for 8 platform specifies which platform source is being generated for
9 and can be one of (win, mac, linux) 9 and can be one of (win, mac, linux)
10 chromium_os_flag should be 1 if this is a Chromium OS build 10 chromium_os_flag should be 1 if this is a Chromium OS build
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 #------------------ policy constants header ------------------------# 205 #------------------ policy constants header ------------------------#
206 206
207 def _WritePolicyConstantHeader(policies, os, f): 207 def _WritePolicyConstantHeader(policies, os, f):
208 f.write('#ifndef CHROME_COMMON_POLICY_CONSTANTS_H_\n' 208 f.write('#ifndef CHROME_COMMON_POLICY_CONSTANTS_H_\n'
209 '#define CHROME_COMMON_POLICY_CONSTANTS_H_\n' 209 '#define CHROME_COMMON_POLICY_CONSTANTS_H_\n'
210 '\n' 210 '\n'
211 '#include <string>\n' 211 '#include <string>\n'
212 '\n' 212 '\n'
213 '#include "base/basictypes.h"\n' 213 '#include "base/basictypes.h"\n'
214 '#include "base/values.h"\n' 214 '#include "base/values.h"\n'
215 '#include "components/policy/core/common/policy_details.h"\n'
215 '\n' 216 '\n'
216 'namespace policy {\n' 217 'namespace policy {\n'
217 '\n' 218 '\n'
218 'namespace internal {\n' 219 'namespace internal {\n'
219 'struct SchemaData;\n' 220 'struct SchemaData;\n'
220 '}\n\n') 221 '}\n\n')
221 222
222 if os == 'win': 223 if os == 'win':
223 f.write('// The windows registry path where Chrome policy ' 224 f.write('// The windows registry path where Chrome policy '
224 'configuration resides.\n' 225 'configuration resides.\n'
225 'extern const wchar_t kRegistryChromePolicyKey[];\n') 226 'extern const wchar_t kRegistryChromePolicyKey[];\n')
226 227
227 f.write('// Lists metadata such as name, expected type and id for all\n' 228 f.write('// Returns the PolicyDetails for |policy| if |policy| is a known\n'
228 '// policies. Used to initialize ConfigurationPolicyProviders and\n' 229 '// Chrome policy, otherwise returns NULL.\n'
229 '// CloudExternalDataManagers.\n' 230 'const PolicyDetails* GetChromePolicyDetails('
230 'struct PolicyDefinitionList {\n' 231 'const std::string& policy);\n'
231 ' struct Entry {\n'
232 ' const char* name;\n'
233 ' base::Value::Type value_type;\n'
234 ' bool device_policy;\n'
235 ' int id;\n'
236 ' size_t max_external_data_size;\n'
237 ' };\n'
238 '\n'
239 ' const Entry* begin;\n'
240 ' const Entry* end;\n'
241 '};\n'
242 '\n'
243 '// Returns true if the given policy is deprecated.\n'
244 'bool IsDeprecatedPolicy(const std::string& policy);\n'
245 '\n'
246 '// Returns the default policy definition list for Chrome.\n'
247 'const PolicyDefinitionList* GetChromePolicyDefinitionList();\n'
248 '\n' 232 '\n'
249 '// Returns the schema data of the Chrome policy schema.\n' 233 '// Returns the schema data of the Chrome policy schema.\n'
250 'const internal::SchemaData* GetChromeSchemaData();\n' 234 'const internal::SchemaData* GetChromeSchemaData();\n'
251 '\n') 235 '\n')
252 f.write('// Key names for the policy settings.\n' 236 f.write('// Key names for the policy settings.\n'
253 'namespace key {\n\n') 237 'namespace key {\n\n')
254 for policy in policies: 238 for policy in policies:
255 # TODO(joaodasilva): Include only supported policies in 239 # TODO(joaodasilva): Include only supported policies in
256 # configuration_policy_handler.cc and configuration_policy_handler_list.cc 240 # configuration_policy_handler.cc and configuration_policy_handler_list.cc
257 # so that these names can be conditional on 'policy.is_supported'. 241 # so that these names can be conditional on 'policy.is_supported'.
258 # http://crbug.com/223616 242 # http://crbug.com/223616
259 f.write('extern const char k' + policy.name + '[];\n') 243 f.write('extern const char k' + policy.name + '[];\n')
260 f.write('\n} // namespace key\n\n' 244 f.write('\n} // namespace key\n\n'
261 '} // namespace policy\n\n' 245 '} // namespace policy\n\n'
262 '#endif // CHROME_COMMON_POLICY_CONSTANTS_H_\n') 246 '#endif // CHROME_COMMON_POLICY_CONSTANTS_H_\n')
263 247
264 248
265 #------------------ policy constants source ------------------------# 249 #------------------ policy constants source ------------------------#
266 250
267 def _GetValueType(policy_type):
268 return policy_type if policy_type != 'TYPE_EXTERNAL' else 'TYPE_DICTIONARY'
269
270
271 # A mapping of the simple schema types to base::Value::Types. 251 # A mapping of the simple schema types to base::Value::Types.
272 SIMPLE_SCHEMA_NAME_MAP = { 252 SIMPLE_SCHEMA_NAME_MAP = {
273 'boolean': 'TYPE_BOOLEAN', 253 'boolean': 'TYPE_BOOLEAN',
274 'integer': 'TYPE_INTEGER', 254 'integer': 'TYPE_INTEGER',
275 'null' : 'TYPE_NULL', 255 'null' : 'TYPE_NULL',
276 'number' : 'TYPE_DOUBLE', 256 'number' : 'TYPE_DOUBLE',
277 'string' : 'TYPE_STRING', 257 'string' : 'TYPE_STRING',
278 } 258 }
279 259
280 260
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 # Properties must be sorted by name, for the binary search lookup. 336 # Properties must be sorted by name, for the binary search lookup.
357 # Note that |properties| must be evaluated immediately, so that all the 337 # Note that |properties| must be evaluated immediately, so that all the
358 # recursive calls to Generate() append the necessary child nodes; if 338 # recursive calls to Generate() append the necessary child nodes; if
359 # |properties| were a generator then this wouldn't work. 339 # |properties| were a generator then this wouldn't work.
360 sorted_properties = sorted(schema.get('properties', {}).items()) 340 sorted_properties = sorted(schema.get('properties', {}).items())
361 properties = [ (self.GetString(key), self.Generate(schema, key)) 341 properties = [ (self.GetString(key), self.Generate(schema, key))
362 for key, schema in sorted_properties ] 342 for key, schema in sorted_properties ]
363 begin = len(self.property_nodes) 343 begin = len(self.property_nodes)
364 self.property_nodes += properties 344 self.property_nodes += properties
365 end = len(self.property_nodes) 345 end = len(self.property_nodes)
346 if index == 0:
347 self.root_properties_begin = begin
348 self.root_properties_end = end
366 349
367 extra = len(self.properties_nodes) 350 extra = len(self.properties_nodes)
368 self.properties_nodes.append((begin, end, additionalProperties, name)) 351 self.properties_nodes.append((begin, end, additionalProperties, name))
369 352
370 # Set the right data at |index| now. 353 # Set the right data at |index| now.
371 self.schema_nodes[index] = ('TYPE_DICTIONARY', extra, name) 354 self.schema_nodes[index] = ('TYPE_DICTIONARY', extra, name)
372 return index 355 return index
373 else: 356 else:
374 assert False 357 assert False
375 358
(...skipping 22 matching lines...) Expand all
398 f.write('};\n\n') 381 f.write('};\n\n')
399 382
400 f.write('const internal::SchemaData kChromeSchemaData = {\n' 383 f.write('const internal::SchemaData kChromeSchemaData = {\n'
401 ' kSchemas,\n' 384 ' kSchemas,\n'
402 ' kPropertyNodes,\n' 385 ' kPropertyNodes,\n'
403 ' kProperties,\n' 386 ' kProperties,\n'
404 '};\n\n') 387 '};\n\n')
405 388
406 389
407 def _WritePolicyConstantSource(policies, os, f): 390 def _WritePolicyConstantSource(policies, os, f):
408 f.write('#include "base/basictypes.h"\n' 391 f.write('#include "policy/policy_constants.h"\n'
392 '\n'
393 '#include <algorithm>\n'
394 '\n'
409 '#include "base/logging.h"\n' 395 '#include "base/logging.h"\n'
410 '#include "components/policy/core/common/schema_internal.h"\n' 396 '#include "components/policy/core/common/schema_internal.h"\n'
411 '#include "policy/policy_constants.h"\n'
412 '\n' 397 '\n'
413 'namespace policy {\n' 398 'namespace policy {\n'
414 '\n' 399 '\n'
415 'namespace {\n' 400 'namespace {\n'
416 '\n') 401 '\n')
417 402
418 # Generate the Chrome schema. 403 # Generate the Chrome schema.
419 chrome_schema = { 404 chrome_schema = {
420 'type': 'object', 405 'type': 'object',
421 'properties': {}, 406 'properties': {},
422 } 407 }
423 shared_strings = {} 408 shared_strings = {}
424 for policy in policies: 409 for policy in policies:
425 shared_strings[policy.name] = "key::k%s" % policy.name 410 shared_strings[policy.name] = "key::k%s" % policy.name
426 if policy.is_supported: 411 if policy.is_supported:
427 chrome_schema['properties'][policy.name] = policy.schema 412 chrome_schema['properties'][policy.name] = policy.schema
428 413
429 f.write('const PolicyDefinitionList::Entry kEntries[] = {\n') 414 # Note: this list must be kept in sync with the known property list of the
415 # Chrome schema, so that binary seaching in the PropertyNode array gets the
416 # right index on this array as well. See the implementation of
417 # GetChromePolicyDetails() below.
418 f.write('const PolicyDetails kChromePolicyDetails[] = {\n'
419 '// is_deprecated is_device_policy id max_external_data_size\n')
430 for policy in policies: 420 for policy in policies:
431 if policy.is_supported: 421 if policy.is_supported:
432 f.write(' { key::k%s, base::Value::%s, %s, %s, %s },\n' % 422 f.write(' { %-14s %-16s %3s, %24s },\n' % (
433 (policy.name, _GetValueType(policy.policy_type), 423 'true,' if policy.is_deprecated else 'false,',
434 'true' if policy.is_device_only else 'false', policy.id, 424 'true,' if policy.is_device_only else 'false,',
435 policy.max_size)) 425 policy.id,
426 policy.max_size))
436 f.write('};\n\n') 427 f.write('};\n\n')
437 428
438 f.write('const PolicyDefinitionList kChromePolicyList = {\n'
439 ' kEntries,\n'
440 ' kEntries + arraysize(kEntries),\n'
441 '};\n\n')
442
443 has_deprecated_policies = any(
444 [p.is_supported and p.is_deprecated for p in policies])
445
446 if has_deprecated_policies:
447 f.write('// List of deprecated policies.\n'
448 'const char* kDeprecatedPolicyList[] = {\n')
449 for policy in policies:
450 if policy.is_supported and policy.is_deprecated:
451 f.write(' key::k%s,\n' % policy.name)
452 f.write('};\n\n')
453
454 schema_generator = SchemaNodesGenerator(shared_strings) 429 schema_generator = SchemaNodesGenerator(shared_strings)
455 schema_generator.Generate(chrome_schema, 'root node') 430 schema_generator.Generate(chrome_schema, 'root node')
456 schema_generator.Write(f) 431 schema_generator.Write(f)
457 432
433 f.write('bool CompareKeys(const internal::PropertyNode& node,\n'
434 ' const std::string& key) {\n'
435 ' return node.key < key;\n'
436 '}\n\n')
437
458 f.write('} // namespace\n\n') 438 f.write('} // namespace\n\n')
459 439
460 if os == 'win': 440 if os == 'win':
461 f.write('#if defined(GOOGLE_CHROME_BUILD)\n' 441 f.write('#if defined(GOOGLE_CHROME_BUILD)\n'
462 'const wchar_t kRegistryChromePolicyKey[] = ' 442 'const wchar_t kRegistryChromePolicyKey[] = '
463 'L"' + CHROME_POLICY_KEY + '";\n' 443 'L"' + CHROME_POLICY_KEY + '";\n'
464 '#else\n' 444 '#else\n'
465 'const wchar_t kRegistryChromePolicyKey[] = ' 445 'const wchar_t kRegistryChromePolicyKey[] = '
466 'L"' + CHROMIUM_POLICY_KEY + '";\n' 446 'L"' + CHROMIUM_POLICY_KEY + '";\n'
467 '#endif\n\n') 447 '#endif\n\n')
468 448
469 f.write('bool IsDeprecatedPolicy(const std::string& policy) {\n')
470 if has_deprecated_policies:
471 # arraysize() doesn't work with empty arrays.
472 f.write(' for (size_t i = 0; i < arraysize(kDeprecatedPolicyList);'
473 ' ++i) {\n'
474 ' if (policy == kDeprecatedPolicyList[i])\n'
475 ' return true;\n'
476 ' }\n')
477 f.write(' return false;\n'
478 '}\n\n')
479
480 f.write('const PolicyDefinitionList* GetChromePolicyDefinitionList() {\n'
481 ' return &kChromePolicyList;\n'
482 '}\n\n')
483
484 f.write('const internal::SchemaData* GetChromeSchemaData() {\n' 449 f.write('const internal::SchemaData* GetChromeSchemaData() {\n'
485 ' return &kChromeSchemaData;\n' 450 ' return &kChromeSchemaData;\n'
486 '}\n\n') 451 '}\n\n')
487 452
453 f.write('const PolicyDetails* GetChromePolicyDetails('
454 'const std::string& policy) {\n'
455 ' // First index in kPropertyNodes of the Chrome policies.\n'
456 ' static const int begin_index = %s;\n'
457 ' // One-past-the-end of the Chrome policies in kPropertyNodes.\n'
458 ' static const int end_index = %s;\n' %
459 (schema_generator.root_properties_begin,
460 schema_generator.root_properties_end))
461 f.write(' const internal::PropertyNode* begin =\n'
462 ' kPropertyNodes + begin_index;\n'
463 ' const internal::PropertyNode* end = kPropertyNodes + end_index;\n'
464 ' const internal::PropertyNode* it =\n'
465 ' std::lower_bound(begin, end, policy, CompareKeys);\n'
466 ' if (it == end || it->key != policy)\n'
467 ' return NULL;\n'
468 ' // This relies on kPropertyNodes from begin_index to end_index\n'
469 ' // having exactly the same policies (and in the same order) as\n'
470 ' // kChromePolicyDetails, so that binary searching on the first\n'
471 ' // gets the same results as a binary search on the second would.\n'
472 ' // However, kPropertyNodes has the policy names and\n'
473 ' // kChromePolicyDetails doesn\'t, so we obtain the index into\n'
474 ' // the second array by searching the first to avoid duplicating\n'
475 ' // the policy name pointers.\n'
476 ' // Offsetting |it| from |begin| here obtains the index we\'re\n'
477 ' // looking for.\n'
478 ' size_t index = it - begin;\n'
479 ' CHECK_LT(index, arraysize(kChromePolicyDetails));\n'
480 ' return kChromePolicyDetails + index;\n'
481 '}\n\n')
482
488 f.write('namespace key {\n\n') 483 f.write('namespace key {\n\n')
489 for policy in policies: 484 for policy in policies:
490 # TODO(joaodasilva): Include only supported policies in 485 # TODO(joaodasilva): Include only supported policies in
491 # configuration_policy_handler.cc and configuration_policy_handler_list.cc 486 # configuration_policy_handler.cc and configuration_policy_handler_list.cc
492 # so that these names can be conditional on 'policy.is_supported'. 487 # so that these names can be conditional on 'policy.is_supported'.
493 # http://crbug.com/223616 488 # http://crbug.com/223616
494 f.write('const char k{name}[] = "{name}";\n'.format(name=policy.name)) 489 f.write('const char k{name}[] = "{name}";\n'.format(name=policy.name))
495 f.write('\n} // namespace key\n\n' 490 f.write('\n} // namespace key\n\n'
496 '} // namespace policy\n') 491 '} // namespace policy\n')
497 492
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
740 def _WriteCloudPolicyDecoder(policies, os, f): 735 def _WriteCloudPolicyDecoder(policies, os, f):
741 f.write(CPP_HEAD) 736 f.write(CPP_HEAD)
742 for policy in policies: 737 for policy in policies:
743 if policy.is_supported and not policy.is_device_only: 738 if policy.is_supported and not policy.is_device_only:
744 _WritePolicyCode(f, policy) 739 _WritePolicyCode(f, policy)
745 f.write(CPP_FOOT) 740 f.write(CPP_FOOT)
746 741
747 742
748 if __name__ == '__main__': 743 if __name__ == '__main__':
749 sys.exit(main()) 744 sys.exit(main())
OLDNEW
« no previous file with comments | « chrome/chrome_tests_unit.gypi ('k') | components/policy.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698