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

Unified Diff: lib/src/emitters.dart

Issue 11315020: Add attribute information table so we generate correct setters. (Closed) Base URL: https://github.com/dart-lang/dart-web-components.git@master
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 side-by-side diff with in-line comments
Download patch
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;
- });
- ''');
+ });''');
}
});

Powered by Google App Engine
This is Rietveld 408576698