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

Side by Side Diff: headless/lib/browser/client_api_generator.py

Issue 1907533002: headless: Implement DevTools events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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 unified diff | Download patch
OLDNEW
1 # Copyright 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import argparse 5 import argparse
6 import os.path 6 import os.path
7 import sys 7 import sys
8 import re 8 import re
9 try: 9 try:
10 import json 10 import json
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 return { 107 return {
108 'return_type': 'std::unique_ptr<headless::%s::%s>' % ( 108 'return_type': 'std::unique_ptr<headless::%s::%s>' % (
109 namespace, type['id']), 109 namespace, type['id']),
110 'pass_type': 'std::unique_ptr<headless::%s::%s>' % (namespace, type['id']), 110 'pass_type': 'std::unique_ptr<headless::%s::%s>' % (namespace, type['id']),
111 'to_raw_type': '*%s', 111 'to_raw_type': '*%s',
112 'to_raw_return_type': '%s.get()', 112 'to_raw_return_type': '%s.get()',
113 'to_pass_type': 'std::move(%s)', 113 'to_pass_type': 'std::move(%s)',
114 'type': 'std::unique_ptr<headless::%s::%s>' % (namespace, type['id']), 114 'type': 'std::unique_ptr<headless::%s::%s>' % (namespace, type['id']),
115 'raw_type': 'headless::%s::%s' % (namespace, type['id']), 115 'raw_type': 'headless::%s::%s' % (namespace, type['id']),
116 'raw_pass_type': 'headless::%s::%s*' % (namespace, type['id']), 116 'raw_pass_type': 'headless::%s::%s*' % (namespace, type['id']),
117 'raw_return_type': 'headless::%s::%s*' % (namespace, type['id']), 117 'raw_return_type': 'const headless::%s::%s*' % (namespace, type['id']),
118 } 118 }
119 119
120 120
121 def CreateEnumTypeDefinition(domain_name, type): 121 def CreateEnumTypeDefinition(domain_name, type):
122 namespace = CamelCaseToHackerStyle(domain_name) 122 namespace = CamelCaseToHackerStyle(domain_name)
123 return { 123 return {
124 'return_type': 'headless::%s::%s' % (namespace, type['id']), 124 'return_type': 'headless::%s::%s' % (namespace, type['id']),
125 'pass_type': 'headless::%s::%s' % (namespace, type['id']), 125 'pass_type': 'headless::%s::%s' % (namespace, type['id']),
126 'to_raw_type': '%s', 126 'to_raw_type': '%s',
127 'to_raw_return_type': '%s', 127 'to_raw_return_type': '%s',
128 'to_pass_type': '%s', 128 'to_pass_type': '%s',
129 'type': 'headless::%s::%s' % (namespace, type['id']), 129 'type': 'headless::%s::%s' % (namespace, type['id']),
130 'raw_type': 'headless::%s::%s' % (namespace, type['id']), 130 'raw_type': 'headless::%s::%s' % (namespace, type['id']),
131 'raw_pass_type': 'headless::%s::%s' % (namespace, type['id']), 131 'raw_pass_type': 'headless::%s::%s' % (namespace, type['id']),
132 'raw_return_type': 'headless::%s::%s' % (namespace, type['id']), 132 'raw_return_type': 'headless::%s::%s' % (namespace, type['id']),
133 } 133 }
134 134
135 135
136 def CreateObjectTypeDefinition(): 136 def CreateObjectTypeDefinition():
137 return { 137 return {
138 'return_type': 'std::unique_ptr<base::DictionaryValue>', 138 'return_type': 'std::unique_ptr<base::DictionaryValue>',
139 'pass_type': 'std::unique_ptr<base::DictionaryValue>', 139 'pass_type': 'std::unique_ptr<base::DictionaryValue>',
140 'to_raw_type': '*%s', 140 'to_raw_type': '*%s',
141 'to_raw_return_type': '%s.get()', 141 'to_raw_return_type': '%s.get()',
142 'to_pass_type': 'std::move(%s)', 142 'to_pass_type': 'std::move(%s)',
143 'type': 'std::unique_ptr<base::DictionaryValue>', 143 'type': 'std::unique_ptr<base::DictionaryValue>',
144 'raw_type': 'base::DictionaryValue', 144 'raw_type': 'base::DictionaryValue',
145 'raw_pass_type': 'base::DictionaryValue*', 145 'raw_pass_type': 'base::DictionaryValue*',
146 'raw_return_type': 'base::DictionaryValue*', 146 'raw_return_type': 'const base::DictionaryValue*',
147 } 147 }
148 148
149 149
150 def WrapObjectTypeDefinition(type): 150 def WrapObjectTypeDefinition(type):
151 id = type.get('id', 'base::Value') 151 id = type.get('id', 'base::Value')
152 return { 152 return {
153 'return_type': 'std::unique_ptr<%s>' % id, 153 'return_type': 'std::unique_ptr<%s>' % id,
154 'pass_type': 'std::unique_ptr<%s>' % id, 154 'pass_type': 'std::unique_ptr<%s>' % id,
155 'to_raw_type': '*%s', 155 'to_raw_type': '*%s',
156 'to_raw_return_type': '%s.get()', 156 'to_raw_return_type': '%s.get()',
157 'to_pass_type': 'std::move(%s)', 157 'to_pass_type': 'std::move(%s)',
158 'type': 'std::unique_ptr<%s>' % id, 158 'type': 'std::unique_ptr<%s>' % id,
159 'raw_type': id, 159 'raw_type': id,
160 'raw_pass_type': '%s*' % id, 160 'raw_pass_type': '%s*' % id,
161 'raw_return_type': '%s*' % id, 161 'raw_return_type': 'const %s*' % id,
162 } 162 }
163 163
164 164
165 def CreateAnyTypeDefinition(): 165 def CreateAnyTypeDefinition():
166 return { 166 return {
167 'return_type': 'std::unique_ptr<base::Value>', 167 'return_type': 'std::unique_ptr<base::Value>',
168 'pass_type': 'std::unique_ptr<base::Value>', 168 'pass_type': 'std::unique_ptr<base::Value>',
169 'to_raw_type': '*%s', 169 'to_raw_type': '*%s',
170 'to_raw_return_type': '%s.get()', 170 'to_raw_return_type': '%s.get()',
171 'to_pass_type': 'std::move(%s)', 171 'to_pass_type': 'std::move(%s)',
172 'type': 'std::unique_ptr<base::Value>', 172 'type': 'std::unique_ptr<base::Value>',
173 'raw_type': 'base::Value', 173 'raw_type': 'base::Value',
174 'raw_pass_type': 'base::Value*', 174 'raw_pass_type': 'base::Value*',
175 'raw_return_type': 'base::Value*', 175 'raw_return_type': 'const base::Value*',
176 } 176 }
177 177
178 178
179 def CreateStringTypeDefinition(domain): 179 def CreateStringTypeDefinition(domain):
180 return { 180 return {
181 'return_type': 'std::string', 181 'return_type': 'std::string',
182 'pass_type': 'const std::string&', 182 'pass_type': 'const std::string&',
183 'to_pass_type': '%s', 183 'to_pass_type': '%s',
184 'to_raw_type': '%s', 184 'to_raw_type': '%s',
185 'to_raw_return_type': '%s', 185 'to_raw_return_type': '%s',
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 def WrapArrayDefinition(type): 222 def WrapArrayDefinition(type):
223 return { 223 return {
224 'return_type': 'std::vector<%s>' % type['type'], 224 'return_type': 'std::vector<%s>' % type['type'],
225 'pass_type': 'std::vector<%s>' % type['type'], 225 'pass_type': 'std::vector<%s>' % type['type'],
226 'to_raw_type': '%s', 226 'to_raw_type': '%s',
227 'to_raw_return_type': '&%s', 227 'to_raw_return_type': '&%s',
228 'to_pass_type': 'std::move(%s)', 228 'to_pass_type': 'std::move(%s)',
229 'type': 'std::vector<%s>' % type['type'], 229 'type': 'std::vector<%s>' % type['type'],
230 'raw_type': 'std::vector<%s>' % type['type'], 230 'raw_type': 'std::vector<%s>' % type['type'],
231 'raw_pass_type': 'std::vector<%s>*' % type['type'], 231 'raw_pass_type': 'std::vector<%s>*' % type['type'],
232 'raw_return_type': 'std::vector<%s>*' % type['type'], 232 'raw_return_type': 'const std::vector<%s>*' % type['type'],
233 } 233 }
234 234
235 235
236 def CreateTypeDefinitions(json_api): 236 def CreateTypeDefinitions(json_api):
237 for domain in json_api['domains']: 237 for domain in json_api['domains']:
238 if not ('types' in domain): 238 if not ('types' in domain):
239 continue 239 continue
240 for type in domain['types']: 240 for type in domain['types']:
241 if type['type'] == 'object': 241 if type['type'] == 'object':
242 if 'properties' in type: 242 if 'properties' in type:
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 result_type = { 323 result_type = {
324 'id': ToTitleCase(command['name']) + 'Result', 324 'id': ToTitleCase(command['name']) + 'Result',
325 'type': 'object', 325 'type': 'object',
326 'description': 'Result for the %s command.' % ToTitleCase( 326 'description': 'Result for the %s command.' % ToTitleCase(
327 command['name']), 327 command['name']),
328 'properties': command['returns'] 328 'properties': command['returns']
329 } 329 }
330 domain['types'].append(result_type) 330 domain['types'].append(result_type)
331 331
332 332
333 def SynthesizeEventTypes(json_api):
334 """Generate types for events and their properties."""
335 for domain in json_api['domains']:
336 if not 'types' in domain:
337 domain['types'] = []
338 for event in domain.get('events', []):
339 if not 'parameters' in event:
340 continue
341 for parameter in event['parameters']:
342 if 'enum' in parameter and not '$ref' in parameter:
343 SynthesizeEnumType(domain, event['name'], parameter)
344 event_type = {
345 'id': ToTitleCase(event['name']) + 'Params',
346 'type': 'object',
347 'description': 'Parameters for the %s event.' % ToTitleCase(
348 event['name']),
349 'properties': event['parameters']
350 }
351 domain['types'].append(event_type)
352
353
333 def Generate(jinja_env, output_dirname, json_api, class_name, file_types): 354 def Generate(jinja_env, output_dirname, json_api, class_name, file_types):
334 template_context = { 355 template_context = {
335 'api': json_api, 356 'api': json_api,
336 'join_arrays': JoinArrays, 357 'join_arrays': JoinArrays,
337 'resolve_type': ResolveType, 358 'resolve_type': ResolveType,
338 'type_definition': TypeDefinition, 359 'type_definition': TypeDefinition,
339 } 360 }
340 for file_type in file_types: 361 for file_type in file_types:
341 template = jinja_env.get_template('/%s_%s.template' % ( 362 template = jinja_env.get_template('/%s_%s.template' % (
342 class_name, file_type)) 363 class_name, file_type))
(...skipping 15 matching lines...) Expand all
358 domain_name = CamelCaseToHackerStyle(domain['domain']) 379 domain_name = CamelCaseToHackerStyle(domain['domain'])
359 output_file = '%s/%s.%s' % (output_dirname, domain_name, file_type) 380 output_file = '%s/%s.%s' % (output_dirname, domain_name, file_type)
360 with open(output_file, 'w') as f: 381 with open(output_file, 'w') as f:
361 f.write(template.render(template_context)) 382 f.write(template.render(template_context))
362 383
363 384
364 if __name__ == '__main__': 385 if __name__ == '__main__':
365 json_api, output_dirname = ParseArguments(sys.argv[1:]) 386 json_api, output_dirname = ParseArguments(sys.argv[1:])
366 jinja_env = InitializeJinjaEnv(output_dirname) 387 jinja_env = InitializeJinjaEnv(output_dirname)
367 SynthesizeCommandTypes(json_api) 388 SynthesizeCommandTypes(json_api)
389 SynthesizeEventTypes(json_api)
368 PatchFullQualifiedRefs(json_api) 390 PatchFullQualifiedRefs(json_api)
369 CreateTypeDefinitions(json_api) 391 CreateTypeDefinitions(json_api)
370 Generate(jinja_env, output_dirname, json_api, 'types', ['cc', 'h']) 392 Generate(jinja_env, output_dirname, json_api, 'types', ['cc', 'h'])
371 Generate(jinja_env, output_dirname, json_api, 'type_conversions', ['h']) 393 Generate(jinja_env, output_dirname, json_api, 'type_conversions', ['h'])
372 GenerateDomains(jinja_env, output_dirname, json_api, 'domain', ['cc', 'h']) 394 GenerateDomains(jinja_env, output_dirname, json_api, 'domain', ['cc', 'h'])
OLDNEW
« no previous file with comments | « no previous file | headless/lib/browser/client_api_generator_unittest.py » ('j') | headless/lib/browser/domain_cc.template » ('J')

Powered by Google App Engine
This is Rietveld 408576698