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

Side by Side Diff: third_party/WebKit/Source/bindings/scripts/code_generator_web_module.py

Issue 2495033003: Stop using v8_interface.interface_context in Web modules bindings. (Closed)
Patch Set: Created 4 years, 1 month 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 | third_party/WebKit/Source/bindings/templates/web_module_interface.cpp.tmpl » ('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 # pylint: disable=import-error,print-statement,relative-import 5 # pylint: disable=import-error,print-statement,relative-import
6 6
7 """Generates Blink Web Module bindings. 7 """Generates Blink Web Module bindings.
8 8
9 The Blink Web Module bindings provide a stable, IDL-generated interface for the 9 The Blink Web Module bindings provide a stable, IDL-generated interface for the
10 Web Modules. 10 Web Modules.
11 11
12 The Web Modules are the high-level services like Autofill, 12 The Web Modules are the high-level services like Autofill,
13 Autocomplete, Translate, Distiller, Phishing Detector, and others. Web Modules 13 Autocomplete, Translate, Distiller, Phishing Detector, and others. Web Modules
14 typically want to introspec the document and rendering infromation to implement 14 typically want to introspec the document and rendering infromation to implement
15 browser features. 15 browser features.
16 16
17 The bindings are meant to be as simple and as ephemeral as possible, mostly just 17 The bindings are meant to be as simple and as ephemeral as possible, mostly just
18 wrapping existing DOM classes. Their primary goal is to avoid leaking the actual 18 wrapping existing DOM classes. Their primary goal is to avoid leaking the actual
19 DOM classes to the Web Modules layer. 19 DOM classes to the Web Modules layer.
20 """ 20 """
21 21
22 import os 22 import os
23 import posixpath 23 import posixpath
24 24
25 from code_generator import CodeGeneratorBase 25 from code_generator import CodeGeneratorBase
26 # TODO(dglazkov): Move TypedefResolver to code_generator.py 26 # TODO(dglazkov): Move TypedefResolver to code_generator.py
27 from code_generator_v8 import TypedefResolver 27 from code_generator_v8 import TypedefResolver
28 from v8_interface import interface_context
29 28
30 MODULE_PYNAME = os.path.splitext(os.path.basename(__file__))[0] + '.py' 29 MODULE_PYNAME = os.path.splitext(os.path.basename(__file__))[0] + '.py'
31 30
32 WEB_MODULE_IDL_ATTRIBUTE = 'WebModuleAPI' 31 WEB_MODULE_IDL_ATTRIBUTE = 'WebModuleAPI'
33 32
34 33
34 def includes_for_type(idl_type):
haraken 2016/11/12 08:01:37 Would you help me understand why you need to imple
dglazkov 2016/11/13 00:11:45 Sure! `v8_types.includes_for_type` returns very sp
35 # TODO(dglazkov): Make this actually work.
36 name = idl_type.preprocessed_type.base_type
37 return set([name])
38
39
40 def interface_context(idl_interface):
41 attributes = []
42 methods = []
43 includes = set()
44 for idl_attribute in idl_interface.attributes:
45 attributes.append(Attribute.create(idl_attribute))
46 includes.update(includes_for_type(idl_attribute.idl_type))
47 for idl_operation in idl_interface.operations:
48 if idl_operation.name:
49 methods.append(Method.create(idl_operation))
haraken 2016/11/12 08:01:37 bashi@, yukishiino@: Is this an expected way to bu
dglazkov 2016/11/13 00:11:45 Factories seem like a good thing. We use them else
bashi 2016/11/13 23:33:58 We haven't used factories but I'm fine with using
haraken 2016/11/14 01:41:41 Yeah, other places are using attribute_context, me
50 return {
51 'code_generator': MODULE_PYNAME,
52 'class_name': idl_interface.name,
53 'cpp_includes': includes,
54 'attributes': attributes,
55 'methods': methods,
56 }
57
58
59 class Attribute(object):
haraken 2016/11/12 08:01:37 object is unused
dglazkov 2016/11/13 00:11:45 What do you mean? The Attribute.create returns an
60 def __init__(self, name, return_type):
61 self.name = name
62 self.return_type = return_type
63
64 @staticmethod
65 def create(idl_attribute):
66 name = idl_attribute.name
67 return_type = idl_attribute.idl_type.preprocessed_type.base_type
68 return Attribute(name, return_type)
69
70
71 # TODO(dglazkov): Attribute and Method are both created off
72 # idl_definitions.TypedObject sub-types, so maybe use inheritance?
73 class Method(object):
haraken 2016/11/12 08:01:37 Ditto.
dglazkov 2016/11/13 00:11:45 Same here.
74 def __init__(self, name, return_type):
75 self.name = name
76 self.return_type = return_type
77
78 @staticmethod
79 def create(idl_operation):
80 name = idl_operation.name
81 return_type = idl_operation.idl_type.preprocessed_type.base_type
82 return Method(name, return_type)
83
84
35 class CodeGeneratorWebModule(CodeGeneratorBase): 85 class CodeGeneratorWebModule(CodeGeneratorBase):
36 def __init__(self, info_provider, cache_dir, output_dir): 86 def __init__(self, info_provider, cache_dir, output_dir):
37 CodeGeneratorBase.__init__(self, MODULE_PYNAME, info_provider, 87 CodeGeneratorBase.__init__(self, MODULE_PYNAME, info_provider,
38 cache_dir, output_dir) 88 cache_dir, output_dir)
39 self.typedef_resolver = TypedefResolver(info_provider) 89 self.typedef_resolver = TypedefResolver(info_provider)
40 90
41 def get_template(self): 91 def get_template(self, file_extension):
42 template_filename = 'web_module_interface.cpp.tmpl' 92 template_filename = 'web_module_interface.%s.tmpl' % file_extension
43 return self.jinja_env.get_template(template_filename) 93 return self.jinja_env.get_template(template_filename)
44 94
45 # TODO(dglazkov): Move to CodeGeneratorBase. 95 # TODO(dglazkov): Move to CodeGeneratorBase.
46 def output_paths(self, definition_name): 96 def output_paths(self, definition_name):
47 header_path = posixpath.join(self.output_dir, 97 header_path = posixpath.join(self.output_dir,
48 'Web%s.h' % definition_name) 98 'Web%s.h' % definition_name)
49 cpp_path = posixpath.join(self.output_dir, 99 cpp_path = posixpath.join(self.output_dir,
50 'Web%s.cpp' % definition_name) 100 'Web%s.cpp' % definition_name)
51 return header_path, cpp_path 101 return header_path, cpp_path
52 102
103 def generate_interface_code(self, interface):
104 # TODO(dglazkov): Implement callback interfaces.
105 # TODO(dglazkov): Make sure partial interfaces are handled.
106 if interface.is_callback and interface.is_partial:
haraken 2016/11/12 08:01:37 and => or ?
dglazkov 2016/11/13 00:11:45 Oops. Thanks! Fixed.
107 return None
haraken 2016/11/12 08:01:37 Or you can raise an exception when you hit somethi
dglazkov 2016/11/13 00:11:45 That's a great idea! Fixed.
108
109 template_context = interface_context(interface)
110
111 cpp_template = self.get_template('cpp')
112 h_template = self.get_template('h')
haraken 2016/11/12 08:01:37 header_template
dglazkov 2016/11/13 00:11:45 Fixed.
113 cpp_text = cpp_template.render(template_context)
114 h_text = h_template.render(template_context)
haraken 2016/11/12 08:01:37 header_text
dglazkov 2016/11/13 00:11:45 Fixed.
115 header_path, cpp_path = self.output_paths(interface.name)
116
117 return (
118 (header_path, h_text),
119 (cpp_path, cpp_text)
120 )
121
53 def generate_code(self, definitions, definition_name): 122 def generate_code(self, definitions, definition_name):
54 self.typedef_resolver.resolve(definitions, definition_name) 123 self.typedef_resolver.resolve(definitions, definition_name)
55 header_path, cpp_path = self.output_paths(definition_name) 124 header_path, cpp_path = self.output_paths(definition_name)
56 125
57 template_context = {} 126 template_context = {}
58 # TODO(dglazkov): Implement dictionaries 127 # TODO(dglazkov): Implement dictionaries
59 if definition_name not in definitions.interfaces: 128 if definition_name not in definitions.interfaces:
60 return None 129 return None
61 130
62 interface = definitions.interfaces[definition_name] 131 interface = definitions.interfaces[definition_name]
63 if WEB_MODULE_IDL_ATTRIBUTE not in interface.extended_attributes: 132 if WEB_MODULE_IDL_ATTRIBUTE not in interface.extended_attributes:
64 return None 133 return None
65 134
66 # TODO(dglazkov): Implement callback interfaces. 135 return self.generate_interface_code(interface)
67 # TODO(dglazkov): Implement partial interfaces.
68 if interface.is_callback and interface.is_partial:
69 return None
70
71 template_context = interface_context(interface,
72 definitions.interfaces)
73 template_context['code_generator'] = MODULE_PYNAME
74 template_context['class_name'] = definition_name
75
76 cpp_template = self.get_template()
77 cpp_text = cpp_template.render(template_context)
78
79 header_text = 'header'
80 return (
81 (header_path, header_text),
82 (cpp_path, cpp_text)
83 )
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/bindings/templates/web_module_interface.cpp.tmpl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698