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

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: Add parameters to all events 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
« no previous file with comments | « no previous file | headless/lib/browser/client_api_generator_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
336 Note that parameter objects are also created for events without parameters to
337 make it easier to introduce parameters later.
338 """
339 for domain in json_api['domains']:
340 if not 'types' in domain:
341 domain['types'] = []
342 for event in domain.get('events', []):
343 for parameter in event.get('parameters', []):
344 if 'enum' in parameter and not '$ref' in parameter:
345 SynthesizeEnumType(domain, event['name'], parameter)
346 event_type = {
347 'id': ToTitleCase(event['name']) + 'Params',
348 'type': 'object',
349 'description': 'Parameters for the %s event.' % ToTitleCase(
350 event['name']),
351 'properties': event.get('parameters', [])
352 }
353 domain['types'].append(event_type)
354
355
333 def Generate(jinja_env, output_dirname, json_api, class_name, file_types): 356 def Generate(jinja_env, output_dirname, json_api, class_name, file_types):
334 template_context = { 357 template_context = {
335 'api': json_api, 358 'api': json_api,
336 'join_arrays': JoinArrays, 359 'join_arrays': JoinArrays,
337 'resolve_type': ResolveType, 360 'resolve_type': ResolveType,
338 'type_definition': TypeDefinition, 361 'type_definition': TypeDefinition,
339 } 362 }
340 for file_type in file_types: 363 for file_type in file_types:
341 template = jinja_env.get_template('/%s_%s.template' % ( 364 template = jinja_env.get_template('/%s_%s.template' % (
342 class_name, file_type)) 365 class_name, file_type))
(...skipping 15 matching lines...) Expand all
358 domain_name = CamelCaseToHackerStyle(domain['domain']) 381 domain_name = CamelCaseToHackerStyle(domain['domain'])
359 output_file = '%s/%s.%s' % (output_dirname, domain_name, file_type) 382 output_file = '%s/%s.%s' % (output_dirname, domain_name, file_type)
360 with open(output_file, 'w') as f: 383 with open(output_file, 'w') as f:
361 f.write(template.render(template_context)) 384 f.write(template.render(template_context))
362 385
363 386
364 if __name__ == '__main__': 387 if __name__ == '__main__':
365 json_api, output_dirname = ParseArguments(sys.argv[1:]) 388 json_api, output_dirname = ParseArguments(sys.argv[1:])
366 jinja_env = InitializeJinjaEnv(output_dirname) 389 jinja_env = InitializeJinjaEnv(output_dirname)
367 SynthesizeCommandTypes(json_api) 390 SynthesizeCommandTypes(json_api)
391 SynthesizeEventTypes(json_api)
368 PatchFullQualifiedRefs(json_api) 392 PatchFullQualifiedRefs(json_api)
369 CreateTypeDefinitions(json_api) 393 CreateTypeDefinitions(json_api)
370 Generate(jinja_env, output_dirname, json_api, 'types', ['cc', 'h']) 394 Generate(jinja_env, output_dirname, json_api, 'types', ['cc', 'h'])
371 Generate(jinja_env, output_dirname, json_api, 'type_conversions', ['h']) 395 Generate(jinja_env, output_dirname, json_api, 'type_conversions', ['h'])
372 GenerateDomains(jinja_env, output_dirname, json_api, 'domain', ['cc', 'h']) 396 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') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698