| Index: headless/lib/browser/devtools_api/client_api_generator.py
|
| diff --git a/headless/lib/browser/devtools_api/client_api_generator.py b/headless/lib/browser/devtools_api/client_api_generator.py
|
| index 6b9936d6aafe2488bcc4f5a84177bb1e8471c014..7a8ea3434503f999df50612875c8d2a02d1aaa56 100644
|
| --- a/headless/lib/browser/devtools_api/client_api_generator.py
|
| +++ b/headless/lib/browser/devtools_api/client_api_generator.py
|
| @@ -4,9 +4,11 @@
|
|
|
| import argparse
|
| import collections
|
| +import functools
|
| import os.path
|
| import re
|
| import sys
|
| +
|
| try:
|
| import json
|
| except ImportError:
|
| @@ -61,6 +63,22 @@ def CamelCaseToHackerStyle(name):
|
| return name.lower()
|
|
|
|
|
| +def Shorten(js_name, domain_name):
|
| + short_name = domain_name + '.'
|
| + long_name = 'chromium.DevTools.' + short_name
|
| + return js_name.replace(long_name, short_name)
|
| +
|
| +
|
| +def ShortForm(domain, js_name):
|
| + if not 'js_dependencies' in domain:
|
| + return js_name
|
| +
|
| + for dependency in domain['js_dependencies']:
|
| + js_name = Shorten(js_name, dependency)
|
| + js_name = Shorten(js_name, domain['domain'])
|
| + return js_name
|
| +
|
| +
|
| def SanitizeLiteral(literal):
|
| return {
|
| # Rename null enumeration values to avoid a clash with the NULL macro.
|
| @@ -120,6 +138,7 @@ def PatchFullQualifiedRefs(json_api):
|
| def CreateUserTypeDefinition(domain, type):
|
| namespace = CamelCaseToHackerStyle(domain['domain'])
|
| return {
|
| + 'js_type': '!chromium.DevTools.%s.%s' % (domain['domain'], type['id']),
|
| 'return_type': 'std::unique_ptr<headless::%s::%s>' % (
|
| namespace, type['id']),
|
| 'pass_type': 'std::unique_ptr<headless::%s::%s>' % (
|
| @@ -137,6 +156,7 @@ def CreateUserTypeDefinition(domain, type):
|
| def CreateEnumTypeDefinition(domain_name, type):
|
| namespace = CamelCaseToHackerStyle(domain_name)
|
| return {
|
| + 'js_type': '!chromium.DevTools.%s.%s' % (domain_name, type['id']),
|
| 'return_type': 'headless::%s::%s' % (namespace, type['id']),
|
| 'pass_type': 'headless::%s::%s' % (namespace, type['id']),
|
| 'to_raw_type': '%s',
|
| @@ -151,6 +171,7 @@ def CreateEnumTypeDefinition(domain_name, type):
|
|
|
| def CreateObjectTypeDefinition():
|
| return {
|
| + 'js_type': 'Object',
|
| 'return_type': 'std::unique_ptr<base::DictionaryValue>',
|
| 'pass_type': 'std::unique_ptr<base::DictionaryValue>',
|
| 'to_raw_type': '*%s',
|
| @@ -166,6 +187,7 @@ def CreateObjectTypeDefinition():
|
| def WrapObjectTypeDefinition(type):
|
| id = type.get('id', 'base::Value')
|
| return {
|
| + 'js_type': '!Object',
|
| 'return_type': 'std::unique_ptr<%s>' % id,
|
| 'pass_type': 'std::unique_ptr<%s>' % id,
|
| 'to_raw_type': '*%s',
|
| @@ -180,6 +202,7 @@ def WrapObjectTypeDefinition(type):
|
|
|
| def CreateAnyTypeDefinition():
|
| return {
|
| + 'js_type': '*',
|
| 'return_type': 'std::unique_ptr<base::Value>',
|
| 'pass_type': 'std::unique_ptr<base::Value>',
|
| 'to_raw_type': '*%s',
|
| @@ -194,6 +217,7 @@ def CreateAnyTypeDefinition():
|
|
|
| def CreateStringTypeDefinition():
|
| return {
|
| + 'js_type': 'string',
|
| 'return_type': 'std::string',
|
| 'pass_type': 'const std::string&',
|
| 'to_pass_type': '%s',
|
| @@ -212,7 +236,13 @@ def CreatePrimitiveTypeDefinition(type):
|
| 'integer': 'int',
|
| 'boolean': 'bool',
|
| }
|
| + js_typedefs = {
|
| + 'number': 'number',
|
| + 'integer': 'number',
|
| + 'boolean': 'boolean',
|
| + }
|
| return {
|
| + 'js_type': js_typedefs[type],
|
| 'return_type': typedefs[type],
|
| 'pass_type': typedefs[type],
|
| 'to_pass_type': '%s',
|
| @@ -236,6 +266,7 @@ type_definitions['any'] = CreateAnyTypeDefinition()
|
|
|
| def WrapArrayDefinition(type):
|
| return {
|
| + 'js_type': '!Array.<%s>' % type['js_type'],
|
| 'return_type': 'std::vector<%s>' % type['type'],
|
| 'pass_type': 'std::vector<%s>' % type['type'],
|
| 'to_raw_type': '%s',
|
| @@ -377,6 +408,7 @@ def InitializeDomainDependencies(json_api):
|
| including itself."""
|
|
|
| direct_deps = collections.defaultdict(set)
|
| + types_required = collections.defaultdict(set)
|
|
|
| def GetDomainDepsFromRefs(domain_name, json):
|
| if isinstance(json, list):
|
| @@ -393,9 +425,11 @@ def InitializeDomainDependencies(json_api):
|
| if '.' in json['$ref']:
|
| dep = json['$ref'].split('.')[0]
|
| direct_deps[domain_name].add(dep)
|
| + types_required[domain_name].add(json['$ref'])
|
|
|
| for domain in json_api['domains']:
|
| direct_deps[domain['domain']] = set(domain.get('dependencies', []))
|
| + types_required[domain['domain']] = set(domain.get('types_required', []))
|
| GetDomainDepsFromRefs(domain['domain'], domain)
|
|
|
| def TraverseDependencies(domain, deps):
|
| @@ -409,6 +443,15 @@ def InitializeDomainDependencies(json_api):
|
| for domain in json_api['domains']:
|
| domain_deps = set()
|
| TraverseDependencies(domain['domain'], domain_deps)
|
| + if 'dependencies' in domain:
|
| + domain['js_dependencies'] = domain['dependencies']
|
| + else:
|
| + domain['js_dependencies'] = []
|
| +
|
| + domain['js_forward_declarations'] = []
|
| + for type in types_required[domain['domain']]:
|
| + if not type.split('.')[0] in domain['js_dependencies']:
|
| + domain['js_forward_declarations'].append(type)
|
| domain['dependencies'] = sorted(domain_deps)
|
|
|
|
|
| @@ -456,6 +499,7 @@ def GeneratePerDomain(jinja_env, output_dirname, json_api, class_name,
|
| template_context = {
|
| 'domain': domain,
|
| 'resolve_type': ResolveType,
|
| + 'short_form': functools.partial(ShortForm, domain),
|
| }
|
| domain_name = CamelCaseToHackerStyle(domain['domain'])
|
| output_file = '%s/%s.%s' % (output_dirname,
|
| @@ -470,6 +514,10 @@ def GenerateDomains(jinja_env, output_dirname, json_api):
|
| jinja_env, os.path.join(output_dirname, 'devtools', 'domains'), json_api,
|
| 'domain', ['cc', 'h'],
|
| lambda domain_name: domain_name)
|
| + GeneratePerDomain(
|
| + jinja_env, os.path.join(output_dirname, 'devtools_js'), json_api,
|
| + 'domain', ['js'],
|
| + lambda domain_name: domain_name)
|
|
|
|
|
| def GenerateTypes(jinja_env, output_dirname, json_api):
|
|
|