Index: runtime/observatory/lib/src/elements/shims/binding.dart |
diff --git a/runtime/observatory/lib/src/elements/shims/binding.dart b/runtime/observatory/lib/src/elements/shims/binding.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5e37609dc58bdead8bc05147a0909ed2ed45578b |
--- /dev/null |
+++ b/runtime/observatory/lib/src/elements/shims/binding.dart |
@@ -0,0 +1,61 @@ |
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+import 'dart:core'; |
+import 'dart:html'; |
+import 'dart:js'; |
+import 'dart:mirrors'; |
+import 'package:js/js.dart'; |
+import 'package:js_util/js_util.dart'; |
+import 'package:polymer/polymer.dart'; |
+ |
+class Binding { |
+ final String attribute; |
+ final String property; |
+ const Binding (attribute, [String property]) |
+ : attribute = attribute, |
+ property = property == null ? attribute : property; |
+} |
+ |
+///This is a temporary bridge between Polymer Bindings and the wrapper entities. |
+class Binder<T extends HtmlElement> { |
+ final List<Binding> attributes; |
+ final callback; |
+ |
+ Binder(List<Binding> attributes) |
+ : attributes = attributes, |
+ callback = _createCallback(T, attributes); |
+ |
+ registerCallback(T element) { |
+ assert(element != null); |
+ setValue(element, 'bind', callback); |
+ } |
+ |
+ static _createCallback(Type T, List<Binding> attributes){ |
+ final target = reflectClass(T); |
+ final setters = <String, Symbol>{}; |
+ for (Binding binding in attributes){ |
+ var member = target.instanceMembers[new Symbol(binding.property + '=')]; |
+ if (!member.isSetter) |
+ throw new ArgumentError( |
+ '${binding.property} is not a Setter for class $T'); |
+ setters[binding.attribute] = new Symbol(binding.property); |
+ } |
+ return allowInteropCaptureThis((_this, name, value, [other]) { |
+ final setter = setters[name]; |
+ if (setter == null) return; |
+ Bindable bindable; |
+ if (identical(1, 1.0)) { // dart2js |
+ bindable = getValue(getValue(value, '__dartBindable'), 'o') as Bindable; |
+ } else { // vm |
+ bindable = getValue(value, '__dartBindable'); |
+ } |
+ var obj = reflect(_this); |
+ obj.setField(setter, bindable.value); |
+ bindable.open((value) { |
+ obj.setField(setter, value); |
+ }); |
+ }); |
+ } |
+} |