Chromium Code Reviews| Index: lib/src/emitters.dart |
| diff --git a/lib/src/emitters.dart b/lib/src/emitters.dart |
| index 97c37e82b5cf7b268789d2b55e8e03fe5c0f6ab3..46d6493ef8151d8d43f126a4d033636a9ad7292b 100644 |
| --- a/lib/src/emitters.dart |
| +++ b/lib/src/emitters.dart |
| @@ -18,6 +18,7 @@ import 'codegen.dart' as codegen; |
| import 'file_system/path.dart'; |
| import 'files.dart'; |
| import 'html5_utils.dart'; |
| +import 'html5_setters.g.dart'; |
| import 'info.dart'; |
| import 'messages.dart'; |
| import 'utils.dart'; |
| @@ -90,10 +91,7 @@ class ElementFieldEmitter extends Emitter<ElementInfo> { |
| ElementFieldEmitter(ElementInfo info) : super(info); |
| void emitDeclarations(Context context) { |
| - var type = htmlElementNames[elem.tagName]; |
| - // Note: this will eventually be the component's class name if it is a |
| - // known x-tag. |
| - if (type == null) type = 'UnknownElement'; |
| + var type = typeForHtmlTag(elem.tagName); |
| context.declarations.add('autogenerated.$type ${elemInfo.identifier};'); |
| } |
| @@ -230,23 +228,25 @@ class DataBindingEmitter extends Emitter<ElementInfo> { |
| '''); |
| } |
| } else { |
| + // Note: it is important for correctness to use the DOM setter if it |
| + // is available. Otherwise changes will not be applied. This is most |
| + // easily observed with "InputElement.value", ".checked", etc. |
| + var setter = null; |
| + var typeName = typeForHtmlTag(elem.tagName); |
| + while (typeName != null) { |
| + var fields = htmlElementFields[typeName]; |
| + if (fields != null) setter = fields[name]; |
| + if (setter != null) break; |
| + typeName = htmlElementExtends[typeName]; |
|
Siggi Cherem (dart-lang)
2012/11/06 03:20:36
emulating dart semantics, yay! -- sarcasm ;-)
Jennifer Messerly
2012/11/06 03:51:57
Hah, yeah :\. OTOH, it's kind of Web IDL semantics
|
| + } |
| + if (setter == null) setter = 'attributes["$name"]'; |
| + |
| var val = attrInfo.boundValue; |
| var stopperName = attrInfo.stopperNames[0]; |
| - var setter; |
| - // TODO(sigmund): use setters when they are available (issue #112) |
| - // Need to know if an attr is known for an element. |
| - if ((elem.tagName == 'input' && |
| - (name == 'value' || name == 'checked')) || |
| - name == 'hidden') { |
| - setter = name; |
| - } else { |
| - setter = 'attributes["$name"]'; |
| - } |
| context.insertedMethod.add(''' |
| $stopperName = autogenerated.watchAndInvoke(() => $val, (e) { |
| $elemField.$setter = e.newValue; |
| - }); |
| - '''); |
| + });'''); |
| } |
| }); |