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

Unified Diff: headless/lib/browser/devtools_api/client_api_generator.py

Issue 2902583002: Add some closureised JS bindings for DevTools for use by headless embedder (Closed)
Patch Set: Don't run the test on windows because js_binary doesn't work Created 3 years, 7 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
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..2f67f0f21486d680e4e175ae40414e24c2825dd0 100644
--- a/headless/lib/browser/devtools_api/client_api_generator.py
+++ b/headless/lib/browser/devtools_api/client_api_generator.py
@@ -120,6 +120,7 @@ def PatchFullQualifiedRefs(json_api):
def CreateUserTypeDefinition(domain, type):
namespace = CamelCaseToHackerStyle(domain['domain'])
return {
+ 'js_type': '!goog.DevTools.%s.%s' % (domain['domain'], type['id']),
Sami 2017/05/24 09:16:21 Is the goog namespace the one we should be using?
alex clarke (OOO till 29th) 2017/05/24 11:38:14 Well we are google so goog seems appropriate?
Sami 2017/05/25 17:53:35 Let's use the chrome namespace since this is more
alex clarke (OOO till 29th) 2017/05/26 11:37:02 As discussed offline we had to use chromium instea
'return_type': 'std::unique_ptr<headless::%s::%s>' % (
namespace, type['id']),
'pass_type': 'std::unique_ptr<headless::%s::%s>' % (
@@ -137,6 +138,7 @@ def CreateUserTypeDefinition(domain, type):
def CreateEnumTypeDefinition(domain_name, type):
namespace = CamelCaseToHackerStyle(domain_name)
return {
+ 'js_type': '!goog.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 +153,7 @@ def CreateEnumTypeDefinition(domain_name, type):
def CreateObjectTypeDefinition():
return {
+ 'js_type': '%s',
'return_type': 'std::unique_ptr<base::DictionaryValue>',
'pass_type': 'std::unique_ptr<base::DictionaryValue>',
'to_raw_type': '*%s',
@@ -166,6 +169,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 +184,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 +199,7 @@ def CreateAnyTypeDefinition():
def CreateStringTypeDefinition():
return {
+ 'js_type': 'string',
'return_type': 'std::string',
'pass_type': 'const std::string&',
'to_pass_type': '%s',
@@ -212,7 +218,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 +248,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',
@@ -309,6 +322,19 @@ def SynthesizeEnumType(domain, owner, type):
domain['types'].append(type)
+def SynthesizeJsConstructorArgs(properties):
Sami 2017/05/24 09:16:21 Please add some coverage in update client_api_gene
alex clarke (OOO till 29th) 2017/05/24 11:38:14 We don't need this anymore, removing.
+ args = []
+ for prop in properties:
+ if 'optional' in prop and prop['optional']:
+ continue
+ args.append(prop['name'])
+ for prop in properties:
+ if not 'optional' in prop or not prop['optional']:
+ continue
+ args.append('opt_' + prop['name'])
+ return ', '.join(args)
+
+
def SynthesizeCommandTypes(json_api):
"""Generate types for command parameters, return values and enum
properties.
@@ -332,7 +358,9 @@ def SynthesizeCommandTypes(json_api):
'type': 'object',
'description': 'Parameters for the %s command.' % ToTitleCase(
SanitizeLiteral(command['name'])),
- 'properties': command['parameters']
+ 'properties': command['parameters'],
+ 'js_constructor_args': SynthesizeJsConstructorArgs(
+ command['parameters'])
}
domain['types'].append(parameters_type)
if 'returns' in command:
@@ -344,7 +372,9 @@ def SynthesizeCommandTypes(json_api):
'type': 'object',
'description': 'Result for the %s command.' % ToTitleCase(
SanitizeLiteral(command['name'])),
- 'properties': command['returns']
+ 'properties': command['returns'],
+ 'js_constructor_args': SynthesizeJsConstructorArgs(
+ command['returns'])
}
domain['types'].append(result_type)
@@ -367,7 +397,9 @@ def SynthesizeEventTypes(json_api):
'type': 'object',
'description': 'Parameters for the %s event.' % ToTitleCase(
event['name']),
- 'properties': event.get('parameters', [])
+ 'properties': event.get('parameters', []),
+ 'js_constructor_args': SynthesizeJsConstructorArgs(
+ event.get('parameters', []))
}
domain['types'].append(event_type)
@@ -395,7 +427,9 @@ def InitializeDomainDependencies(json_api):
direct_deps[domain_name].add(dep)
for domain in json_api['domains']:
- direct_deps[domain['domain']] = set(domain.get('dependencies', []))
+ deps = domain.get('dependencies', [])
+ js_dependencies = deps
Sami 2017/05/24 09:16:21 |js_dependencies| unused?
alex clarke (OOO till 29th) 2017/05/24 11:38:14 Done.
+ direct_deps[domain['domain']] = set(deps)
GetDomainDepsFromRefs(domain['domain'], domain)
def TraverseDependencies(domain, deps):
@@ -468,7 +502,7 @@ def GeneratePerDomain(jinja_env, output_dirname, json_api, class_name,
def GenerateDomains(jinja_env, output_dirname, json_api):
GeneratePerDomain(
jinja_env, os.path.join(output_dirname, 'devtools', 'domains'), json_api,
- 'domain', ['cc', 'h'],
+ 'domain', ['cc', 'h', 'js'],
lambda domain_name: domain_name)

Powered by Google App Engine
This is Rietveld 408576698