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

Side by Side Diff: sdk/lib/html/scripts/systemhtml.py

Issue 11412042: "Reverting 15020" (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 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 | Annotate | Revision Log
« no previous file with comments | « sdk/lib/html/scripts/htmldartgenerator.py ('k') | sdk/lib/html/scripts/systemnative.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 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
3 # for details. All rights reserved. Use of this source code is governed by a 3 # for details. All rights reserved. Use of this source code is governed by a
4 # BSD-style license that can be found in the LICENSE file. 4 # BSD-style license that can be found in the LICENSE file.
5 5
6 """This module provides shared functionality for the system to generate 6 """This module provides shared functionality for the system to generate
7 Dart:html APIs from the IDL database.""" 7 Dart:html APIs from the IDL database."""
8 8
9 import emitter 9 import emitter
10 import os 10 import os
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 # Information for generating element constructors. 51 # Information for generating element constructors.
52 # 52 #
53 # TODO(sra): maybe remove all the argument complexity and use cascades. 53 # TODO(sra): maybe remove all the argument complexity and use cascades.
54 # 54 #
55 # var c = new CanvasElement(width: 100, height: 70); 55 # var c = new CanvasElement(width: 100, height: 70);
56 # var c = new CanvasElement()..width = 100..height = 70; 56 # var c = new CanvasElement()..width = 100..height = 70;
57 # 57 #
58 class ElementConstructorInfo(object): 58 class ElementConstructorInfo(object):
59 def __init__(self, name=None, tag=None, 59 def __init__(self, name=None, tag=None,
60 params=[], opt_params=[], 60 params=[], opt_params=[],
61 factory_provider_name='document'): 61 factory_provider_name='_Elements'):
62 self.name = name # The constructor name 'h1' in 'HeadingElement.h1' 62 self.name = name # The constructor name 'h1' in 'HeadingElement.h1'
63 self.tag = tag or name # The HTML or SVG tag 63 self.tag = tag or name # The HTML tag
64 self.params = params 64 self.params = params
65 self.opt_params = opt_params 65 self.opt_params = opt_params
66 self.factory_provider_name = factory_provider_name 66 self.factory_provider_name = factory_provider_name
67 67
68 def ConstructorInfo(self, interface_name): 68 def ConstructorInfo(self, interface_name):
69 info = OperationInfo() 69 info = OperationInfo()
70 info.overloads = None 70 info.overloads = None
71 info.declared_name = interface_name 71 info.declared_name = interface_name
72 info.name = interface_name 72 info.name = interface_name
73 info.constructor_name = self.name 73 info.constructor_name = self.name
74 info.js_name = None 74 info.js_name = None
75 info.type_name = interface_name 75 info.type_name = interface_name
76 info.param_infos = map(lambda tXn: ParamInfo(tXn[1], tXn[0], True), 76 info.param_infos = map(lambda tXn: ParamInfo(tXn[1], tXn[0], True),
77 self.opt_params) 77 self.opt_params)
78 info.requires_named_arguments = True 78 info.requires_named_arguments = True
79 info.factory_parameters = ['"%s"' % self.tag]
80 return info 79 return info
81 80
82 _html_element_constructors = { 81 _html_element_constructors = {
83 'AnchorElement' : 82 'AnchorElement' :
84 ElementConstructorInfo(tag='a', opt_params=[('DOMString', 'href')]), 83 ElementConstructorInfo(tag='a', opt_params=[('DOMString', 'href')]),
85 'AreaElement': 'area', 84 'AreaElement': 'area',
86 'ButtonElement': 'button', 85 'ButtonElement': 'button',
87 'BRElement': 'br', 86 'BRElement': 'br',
88 'BaseElement': 'base', 87 'BaseElement': 'base',
89 'BodyElement': 'body', 88 'BodyElement': 'body',
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 'TableElement': 'table', 141 'TableElement': 'table',
143 'TableRowElement': 'tr', 142 'TableRowElement': 'tr',
144 #'TableSectionElement' <thead> <tbody> <tfoot> 143 #'TableSectionElement' <thead> <tbody> <tfoot>
145 'TextAreaElement': 'textarea', 144 'TextAreaElement': 'textarea',
146 'TitleElement': 'title', 145 'TitleElement': 'title',
147 'TrackElement': 'track', 146 'TrackElement': 'track',
148 'UListElement': 'ul', 147 'UListElement': 'ul',
149 'VideoElement': 'video' 148 'VideoElement': 'video'
150 } 149 }
151 150
152 _svg_element_constructors = { 151 def HtmlElementConstructorInfos(typename):
153 'SVGAElement': 'a',
154 'SVGAnimateColorElement': 'animateColor',
155 'SVGAnimateElement': 'animate',
156 'SVGAnimateMotionElement': 'animateMotion',
157 'SVGAnimateTransformElement': 'animateTransform',
158 'SVGAnimationElement': 'animation',
159 'SVGCircleElement': 'circle',
160 'SVGClipPathElement': 'clipPath',
161 'SVGCursorElement': 'cursor',
162 'SVGDefsElement': 'defs',
163 'SVGDescElement': 'desc',
164 'SVGEllipseElement': 'ellipse',
165 'SVGFilterElement': 'filter',
166 'SVGFontElement': 'font',
167 'SVGFontFaceElement': 'font-face',
168 'SVGFontFaceFormatElement': 'font-face-format',
169 'SVGFontFaceNameElement': 'font-face-name',
170 'SVGFontFaceSrcElement': 'font-face-src',
171 'SVGFontFaceUriElement': 'font-face-uri',
172 'SVGForeignObjectElement': 'foreignObject',
173 'SVGGlyphElement': 'glyph',
174 'SVGGElement': 'g',
175 'SVGHKernElement': 'hkern',
176 'SVGImageElement': 'image',
177 'SVGLinearGradientElement': 'linearGradient',
178 'SVGLineElement': 'line',
179 'SVGMarkerElement': 'marker',
180 'SVGMaskElement': 'mask',
181 'SVGMPathElement': 'mpath',
182 'SVGPathElement': 'path',
183 'SVGPatternElement': 'pattern',
184 'SVGPolygonElement': 'polygon',
185 'SVGPolylineElement': 'polyline',
186 'SVGRadialGradientElement': 'radialGradient',
187 'SVGRectElement': 'rect',
188 'SVGScriptElement': 'script',
189 'SVGSetElement': 'set',
190 'SVGStopElement': 'stop',
191 'SVGStyleElement': 'style',
192 'SVGSwitchElement': 'switch',
193 'SVGSymbolElement': 'symbol',
194 'SVGTextElement': 'text',
195 'SVGTitleElement': 'title',
196 'SVGTRefElement': 'tref',
197 'SVGTSpanElement': 'tspan',
198 'SVGUseElement': 'use',
199 'SVGViewElement': 'view',
200 'SVGVKernElement': 'vkern',
201 }
202
203 _element_constructors = {
204 'html': _html_element_constructors,
205 'svg': _svg_element_constructors
206 }
207
208 _factory_ctr_strings = {
209 'html': {
210 'provider_name': 'document',
211 'constructor_name': '$dom_createElement'
212 },
213 'svg': {
214 'provider_name': '_SvgElementFactoryProvider',
215 'constructor_name': 'createSVGElement_tag',
216 },
217 }
218
219 def ElementConstructorInfos(typename, element_constructors,
220 factory_provider_name='_Elements'):
221 """Returns list of ElementConstructorInfos about the convenience constructors 152 """Returns list of ElementConstructorInfos about the convenience constructors
222 for an Element or SvgElement.""" 153 for an Element."""
223 # TODO(sra): Handle multiple and named constructors. 154 # TODO(sra): Handle multiple and named constructors.
224 if typename not in element_constructors: 155 if typename not in _html_element_constructors:
225 return [] 156 return []
226 infos = element_constructors[typename] 157 infos = _html_element_constructors[typename]
227 if isinstance(infos, str): 158 if isinstance(infos, str):
228 infos = ElementConstructorInfo(tag=infos, 159 infos = ElementConstructorInfo(tag=infos)
229 factory_provider_name=factory_provider_name)
230 if not isinstance(infos, list): 160 if not isinstance(infos, list):
231 infos = [infos] 161 infos = [infos]
232 return infos 162 return infos
233 163
164 def EmitHtmlElementFactoryConstructors(emitter, infos, typename, class_name,
165 rename_type):
166 for info in infos:
167 constructor_info = info.ConstructorInfo(typename)
168
169 inits = emitter.Emit(
170 '\n'
171 ' static $RETURN_TYPE $CONSTRUCTOR($PARAMS) {\n'
172 ' $CLASS _e = document.$dom_createElement("$TAG");\n'
173 '$!INITS'
174 ' return _e;\n'
175 ' }\n',
176 RETURN_TYPE=rename_type(constructor_info.type_name),
177 CONSTRUCTOR=constructor_info.ConstructorFactoryName(rename_type),
178 CLASS=class_name,
179 TAG=info.tag,
180 PARAMS=constructor_info.ParametersDeclaration(
181 rename_type, force_optional=True))
182 for param in constructor_info.param_infos:
183 inits.Emit(' if ($E != null) _e.$E = $E;\n', E=param.name)
184
234 # ------------------------------------------------------------------------------ 185 # ------------------------------------------------------------------------------
235 186
236 class HtmlDartInterfaceGenerator(object): 187 class HtmlDartInterfaceGenerator(object):
237 """Generates dart interface and implementation for the DOM IDL interface.""" 188 """Generates dart interface and implementation for the DOM IDL interface."""
238 189
239 def __init__(self, options, library_emitter, event_generator, interface, 190 def __init__(self, options, library_emitter, event_generator, interface,
240 backend): 191 backend):
241 self._renamer = options.renamer 192 self._renamer = options.renamer
242 self._database = options.database 193 self._database = options.database
243 self._template_loader = options.templates 194 self._template_loader = options.templates
(...skipping 24 matching lines...) Expand all
268 NAME=self._interface.id, 219 NAME=self._interface.id,
269 PARAMS=info.ParametersDeclaration(self._DartType)) 220 PARAMS=info.ParametersDeclaration(self._DartType))
270 self._backend.GenerateCallback(info) 221 self._backend.GenerateCallback(info)
271 222
272 def GenerateInterface(self): 223 def GenerateInterface(self):
273 interface_name = self._interface_type_info.interface_name() 224 interface_name = self._interface_type_info.interface_name()
274 225
275 factory_provider = None 226 factory_provider = None
276 if interface_name in interface_factories: 227 if interface_name in interface_factories:
277 factory_provider = interface_factories[interface_name] 228 factory_provider = interface_factories[interface_name]
278 factory_constructor_name = None
279 229
280 constructors = [] 230 constructors = []
281 if interface_name in _static_classes: 231 if interface_name in _static_classes:
282 constructor_info = None 232 constructor_info = None
283 else: 233 else:
284 constructor_info = AnalyzeConstructor(self._interface) 234 constructor_info = AnalyzeConstructor(self._interface)
285 if constructor_info: 235 if constructor_info:
286 constructors.append(constructor_info) 236 constructors.append(constructor_info)
287 factory_provider = '_' + interface_name + 'FactoryProvider' 237 factory_provider = '_' + interface_name + 'FactoryProvider'
288 factory_provider_emitter = self._library_emitter.FileEmitter( 238 factory_provider_emitter = self._library_emitter.FileEmitter(
289 '_%sFactoryProvider' % interface_name, self._library_name) 239 '_%sFactoryProvider' % interface_name, self._library_name)
290 self._backend.EmitFactoryProvider( 240 self._backend.EmitFactoryProvider(
291 constructor_info, factory_provider, factory_provider_emitter) 241 constructor_info, factory_provider, factory_provider_emitter)
292 242
293 # HTML Elements and SVG Elements have convenience constructors. 243 infos = HtmlElementConstructorInfos(interface_name)
294 infos = ElementConstructorInfos(interface_name, 244 if infos:
295 _element_constructors[self._library_name], factory_provider_name= 245 template = self._template_loader.Load(
296 _factory_ctr_strings[self._library_name]['provider_name']) 246 'factoryprovider_Elements.darttemplate')
247 EmitHtmlElementFactoryConstructors(
248 self._library_emitter.FileEmitter('_Elements', self._library_name,
249 template),
250 infos,
251 self._interface.id,
252 self._interface_type_info.implementation_name(),
253 self._DartType)
297 254
298 if infos:
299 factory_constructor_name = _factory_ctr_strings[
300 self._library_name]['constructor_name']
301
302 for info in infos: 255 for info in infos:
303 constructors.append(info.ConstructorInfo(self._interface.id)) 256 constructors.append(info.ConstructorInfo(self._interface.id))
304 if factory_provider: 257 if factory_provider:
305 assert factory_provider == info.factory_provider_name 258 assert factory_provider == info.factory_provider_name
306 else: 259 else:
307 factory_provider = info.factory_provider_name 260 factory_provider = info.factory_provider_name
308 261
309 implementation_emitter = self._ImplementationEmitter() 262 implementation_emitter = self._ImplementationEmitter()
310 263
311 base_type_info = None 264 base_type_info = None
(...skipping 30 matching lines...) Expand all
342 LIBRARYNAME=self._library_name, 295 LIBRARYNAME=self._library_name,
343 CLASSNAME=self._interface_type_info.implementation_name(), 296 CLASSNAME=self._interface_type_info.implementation_name(),
344 EXTENDS=' extends %s' % base_class if base_class else '', 297 EXTENDS=' extends %s' % base_class if base_class else '',
345 IMPLEMENTS=implements_str, 298 IMPLEMENTS=implements_str,
346 DOMNAME=self._interface.doc_js_name, 299 DOMNAME=self._interface.doc_js_name,
347 NATIVESPEC=self._backend.NativeSpec()) 300 NATIVESPEC=self._backend.NativeSpec())
348 self._backend.StartInterface(self._implementation_members_emitter) 301 self._backend.StartInterface(self._implementation_members_emitter)
349 302
350 self._backend.AddConstructors(constructors, factory_provider, 303 self._backend.AddConstructors(constructors, factory_provider,
351 self._interface_type_info.implementation_name(), 304 self._interface_type_info.implementation_name(),
352 base_class, factory_constructor_name=factory_constructor_name) 305 base_class)
353 306
354 events_class_name = self._event_generator.ProcessInterface( 307 events_class_name = self._event_generator.ProcessInterface(
355 self._interface, interface_name, 308 self._interface, interface_name,
356 self._backend.CustomJSMembers(), 309 self._backend.CustomJSMembers(),
357 implementation_emitter) 310 implementation_emitter)
358 if events_class_name: 311 if events_class_name:
359 self._backend.EmitEventGetter(events_class_name) 312 self._backend.EmitEventGetter(events_class_name)
360 313
361 merged_interface = self._interface_type_info.merged_interface() 314 merged_interface = self._interface_type_info.merged_interface()
362 if merged_interface: 315 if merged_interface:
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 'svg': DartLibrary('svg', template_loader, library_type, output_dir), 926 'svg': DartLibrary('svg', template_loader, library_type, output_dir),
974 'html': DartLibrary('html', template_loader, library_type, output_dir), 927 'html': DartLibrary('html', template_loader, library_type, output_dir),
975 } 928 }
976 929
977 def AddFile(self, basename, library_name, path): 930 def AddFile(self, basename, library_name, path):
978 self._libraries[library_name].AddFile(path) 931 self._libraries[library_name].AddFile(path)
979 932
980 def Emit(self, emitter, auxiliary_dir): 933 def Emit(self, emitter, auxiliary_dir):
981 for lib in self._libraries.values(): 934 for lib in self._libraries.values():
982 lib.Emit(emitter, auxiliary_dir) 935 lib.Emit(emitter, auxiliary_dir)
OLDNEW
« no previous file with comments | « sdk/lib/html/scripts/htmldartgenerator.py ('k') | sdk/lib/html/scripts/systemnative.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698