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

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: Try and fix python test Created 3 years, 6 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..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):
« no previous file with comments | « headless/headless_browsertest_resources.grd ('k') | headless/lib/browser/devtools_api/devtools_connection.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698