polymer-rails 0.3.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/polymer/polymer-micro.html +528 -21
  3. data/app/assets/javascripts/polymer/polymer-mini.html +1304 -27
  4. data/app/assets/javascripts/polymer/polymer.html +3771 -51
  5. data/app/assets/javascripts/webcomponentsjs/webcomponents-lite.js +44 -14
  6. data/app/assets/javascripts/webcomponentsjs/webcomponents.js +7106 -0
  7. data/lib/polymer-rails/version.rb +1 -1
  8. metadata +4 -64
  9. data/app/assets/javascripts/polymer/src/lib/annotations/annotations.html +0 -262
  10. data/app/assets/javascripts/polymer/src/lib/annotations/demo/app-chrome.html +0 -60
  11. data/app/assets/javascripts/polymer/src/lib/array-observe.html +0 -118
  12. data/app/assets/javascripts/polymer/src/lib/array-splice.html +0 -262
  13. data/app/assets/javascripts/polymer/src/lib/async.html +0 -68
  14. data/app/assets/javascripts/polymer/src/lib/base.html +0 -117
  15. data/app/assets/javascripts/polymer/src/lib/bind/accessors.html +0 -223
  16. data/app/assets/javascripts/polymer/src/lib/bind/demo/app-chrome.html +0 -28
  17. data/app/assets/javascripts/polymer/src/lib/bind/demo/app.html +0 -29
  18. data/app/assets/javascripts/polymer/src/lib/bind/demo/src/annotations-bind-demo.html +0 -76
  19. data/app/assets/javascripts/polymer/src/lib/bind/demo/src/bind-demo.html +0 -83
  20. data/app/assets/javascripts/polymer/src/lib/bind/effects.html +0 -80
  21. data/app/assets/javascripts/polymer/src/lib/case-map.html +0 -46
  22. data/app/assets/javascripts/polymer/src/lib/collection.html +0 -179
  23. data/app/assets/javascripts/polymer/src/lib/css-parse.html +0 -131
  24. data/app/assets/javascripts/polymer/src/lib/debounce.html +0 -69
  25. data/app/assets/javascripts/polymer/src/lib/dom-api.html +0 -467
  26. data/app/assets/javascripts/polymer/src/lib/dom-module.html +0 -68
  27. data/app/assets/javascripts/polymer/src/lib/event-api.html +0 -92
  28. data/app/assets/javascripts/polymer/src/lib/expr/focus.html +0 -22
  29. data/app/assets/javascripts/polymer/src/lib/expr/gestures.html +0 -1
  30. data/app/assets/javascripts/polymer/src/lib/expr/log.html +0 -21
  31. data/app/assets/javascripts/polymer/src/lib/expr/sinspect.html +0 -235
  32. data/app/assets/javascripts/polymer/src/lib/expr/style-auditor.html +0 -123
  33. data/app/assets/javascripts/polymer/src/lib/expr/style-protector.html +0 -52
  34. data/app/assets/javascripts/polymer/src/lib/gestures.html +0 -284
  35. data/app/assets/javascripts/polymer/src/lib/lang.html +0 -21
  36. data/app/assets/javascripts/polymer/src/lib/module.html +0 -56
  37. data/app/assets/javascripts/polymer/src/lib/polymer-bootstrap.html +0 -78
  38. data/app/assets/javascripts/polymer/src/lib/resolve-url.html +0 -82
  39. data/app/assets/javascripts/polymer/src/lib/settings.html +0 -52
  40. data/app/assets/javascripts/polymer/src/lib/style-defaults.html +0 -32
  41. data/app/assets/javascripts/polymer/src/lib/style-transformer.html +0 -185
  42. data/app/assets/javascripts/polymer/src/lib/style-util.html +0 -77
  43. data/app/assets/javascripts/polymer/src/lib/template/templatizer.html +0 -132
  44. data/app/assets/javascripts/polymer/src/lib/template/x-array-selector.html +0 -178
  45. data/app/assets/javascripts/polymer/src/lib/template/x-autobind.html +0 -80
  46. data/app/assets/javascripts/polymer/src/lib/template/x-if.html +0 -115
  47. data/app/assets/javascripts/polymer/src/lib/template/x-repeat.html +0 -510
  48. data/app/assets/javascripts/polymer/src/lib/template/x-template.html +0 -39
  49. data/app/assets/javascripts/polymer/src/lib/x-style.html +0 -115
  50. data/app/assets/javascripts/polymer/src/micro/attributes.html +0 -180
  51. data/app/assets/javascripts/polymer/src/micro/constructor.html +0 -74
  52. data/app/assets/javascripts/polymer/src/micro/extends.html +0 -79
  53. data/app/assets/javascripts/polymer/src/micro/mixins.html +0 -40
  54. data/app/assets/javascripts/polymer/src/micro/properties.html +0 -96
  55. data/app/assets/javascripts/polymer/src/micro/tag.html +0 -28
  56. data/app/assets/javascripts/polymer/src/mini/ready.html +0 -180
  57. data/app/assets/javascripts/polymer/src/mini/shadow.html +0 -41
  58. data/app/assets/javascripts/polymer/src/mini/shady.html +0 -365
  59. data/app/assets/javascripts/polymer/src/mini/template.html +0 -56
  60. data/app/assets/javascripts/polymer/src/polymer-lib.html +0 -15
  61. data/app/assets/javascripts/polymer/src/standard/annotations.html +0 -198
  62. data/app/assets/javascripts/polymer/src/standard/configure.html +0 -160
  63. data/app/assets/javascripts/polymer/src/standard/effects.html +0 -215
  64. data/app/assets/javascripts/polymer/src/standard/events.html +0 -127
  65. data/app/assets/javascripts/polymer/src/standard/notify-path.html +0 -260
  66. data/app/assets/javascripts/polymer/src/standard/resolveUrl.html +0 -27
  67. data/app/assets/javascripts/polymer/src/standard/styling.html +0 -157
  68. data/app/assets/javascripts/polymer/src/standard/utils.html +0 -158
  69. data/app/assets/javascripts/polymer/src/standard/x-styling.html +0 -300
@@ -1,56 +0,0 @@
1
- <!--
2
- @license
3
- Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4
- This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5
- The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6
- The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7
- Code distributed by Google as part of the polymer project is also
8
- subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9
- -->
10
- <script>
11
-
12
- /**
13
- * Automatic template management.
14
- *
15
- * The `template` feature locates and instances a `<template>` element
16
- * corresponding to the current Polymer prototype.
17
- *
18
- * The `<template>` element may be immediately preceeding the script that
19
- * invokes `Polymer()`.
20
- *
21
- * @class standard feature: template
22
- */
23
-
24
- Polymer.Base.addFeature({
25
-
26
- _prepTemplate: function() {
27
- // locate template using dom-module
28
- this._template =
29
- this._template || Polymer.DomModule.import(this.is, 'template');
30
- // fallback to look at the node previous to the currentScript.
31
- if (!this._template) {
32
- var script = document._currentScript || document.currentScript;
33
- var prev = script && script.previousElementSibling;
34
- if (prev && prev.localName === 'template') {
35
- this._template = prev;
36
- }
37
- }
38
- },
39
-
40
- _stampTemplate: function() {
41
- if (this._template) {
42
- // note: root is now a fragment which can be manipulated
43
- // while not attached to the element.
44
- this.root = this.instanceTemplate(this._template);
45
- }
46
- },
47
-
48
- instanceTemplate: function(template) {
49
- var dom =
50
- document.importNode(template._content || template.content, true);
51
- return dom;
52
- }
53
-
54
- });
55
-
56
- </script>
@@ -1,15 +0,0 @@
1
- <!--
2
- @license
3
- Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4
- This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5
- The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6
- The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7
- Code distributed by Google as part of the polymer project is also
8
- subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9
- -->
10
-
11
- <link rel="import" href="lib/settings.html">
12
- <link rel="import" href="lib/polymer-bootstrap.html">
13
- <link rel="import" href="lib/lang.html">
14
- <link rel="import" href="lib/base.html">
15
- <link rel="import" href="lib/dom-module.html">
@@ -1,198 +0,0 @@
1
- <!--
2
- @license
3
- Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4
- This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5
- The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6
- The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7
- Code distributed by Google as part of the polymer project is also
8
- subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9
- -->
10
-
11
- <!-- employ 'Annotations' module -->
12
-
13
- <link rel="import" href="../lib/annotations/annotations.html">
14
- <link rel="import" href="../lib/resolve-url.html">
15
- <script>
16
-
17
- /**
18
- * Scans a template to produce an annotation object that stores expression
19
- * metadata along with information to associate the metadata with nodes in an
20
- * instance.
21
- *
22
- * Elements with `id` in the template are noted and marshaled into an
23
- * the `$` hash in an instance.
24
- *
25
- * Example
26
- *
27
- * &lt;template>
28
- * &lt;div id="foo">&lt;/div>
29
- * &lt;/template>
30
- * &lt;script>
31
- * Polymer({
32
- * task: function() {
33
- * this.$.foo.style.color = 'red';
34
- * }
35
- * });
36
- * &lt;/script>
37
- *
38
- * Other expressions that are noted include:
39
- *
40
- * Double-mustache annotations in text content. The annotation must be the only
41
- * content in the tag, compound expressions are not (currently) supported.
42
- *
43
- * <[tag]>{{path.to.host.property}}<[tag]>
44
- *
45
- * Double-mustache annotations in an attribute.
46
- *
47
- * <[tag] someAttribute="{{path.to.host.property}}"><[tag]>
48
- *
49
- * Only immediate host properties can automatically trigger side-effects.
50
- * Setting `host.path` in the example above triggers the binding, setting
51
- * `host.path.to.host.property` does not.
52
- *
53
- * `on-` style event declarations.
54
- *
55
- * <[tag] on-<event-name>="{{hostMethodName}}"><[tag]>
56
- *
57
- * Note: **the `annotations` feature does not actually implement the behaviors
58
- * associated with these expressions, it only captures the data**.
59
- *
60
- * Other optional features contain actual data implementations.
61
- *
62
- * @class standard feature: annotations
63
- */
64
-
65
- /*
66
-
67
- Scans a template to produce an annotation map that stores expression metadata
68
- and information that associates the metadata to nodes in a template instance.
69
-
70
- Supported annotations are:
71
-
72
- * id attributes
73
- * binding annotations in text nodes
74
- * double-mustache expressions: {{expression}}
75
- * double-bracket expressions: [[expression]]
76
- * binding annotations in attributes
77
- * attribute-bind expressions: name="{{expression}} || [[expression]]"
78
- * property-bind expressions: name*="{{expression}} || [[expression]]"
79
- * property-bind expressions: name:="expression"
80
- * event annotations
81
- * event delegation directives: on-<eventName>="expression"
82
-
83
- Generated data-structure:
84
-
85
- [
86
- {
87
- id: '<id>',
88
- events: [
89
- {
90
- mode: ['auto'|''],
91
- name: '<name>'
92
- value: '<expression>'
93
- }, ...
94
- ],
95
- bindings: [
96
- {
97
- kind: ['text'|'attribute'|'property'],
98
- mode: ['auto'|''],
99
- name: '<name>'
100
- value: '<expression>'
101
- }, ...
102
- ],
103
- // TODO(sjmiles): confusingly, this is annotation-parent, not node-parent
104
- parent: <reference to parent annotation>,
105
- index: <integer index in parent's childNodes collection>
106
- },
107
- ...
108
- ]
109
-
110
- TODO(sjmiles): this module should produce either syntactic metadata
111
- (e.g. double-mustache, double-bracket, star-attr), or semantic metadata
112
- (e.g. manual-bind, auto-bind, property-bind). Right now it's half and half.
113
-
114
- */
115
-
116
- Polymer.Base.addFeature({
117
-
118
- // registration-time
119
-
120
- _prepAnnotations: function() {
121
- if (!this._template) {
122
- this._annotes = [];
123
- } else {
124
- // TODO(sorvell): ad hoc method of plugging behavior into Annotations
125
- Polymer.Annotations.prepElement = this._prepElement.bind(this);
126
- this._annotes = Polymer.Annotations.parseAnnotations(this._template);
127
- Polymer.Annotations.prepElement = null;
128
- }
129
- },
130
-
131
- _prepElement: function(element) {
132
- Polymer.ResolveUrl.resolveAttrs(element, this._template.ownerDocument);
133
- },
134
-
135
- // instance-time
136
-
137
- findAnnotatedNode: Polymer.Annotations.findAnnotatedNode,
138
-
139
- // marshal all teh things
140
- _marshalAnnotationReferences: function() {
141
- if (this._template) {
142
- this._marshalIdNodes();
143
- this._marshalAnnotatedNodes();
144
- this._marshalAnnotatedListeners();
145
- }
146
- },
147
-
148
- // push configuration references at configure time
149
- _configureAnnotationReferences: function() {
150
- this._configureTemplateContent();
151
- },
152
-
153
- // nested template contents have been stored prototypically to avoid
154
- // unnecessary duplication, here we put references to the
155
- // indirected contents onto the nested template instances
156
- _configureTemplateContent: function() {
157
- this._annotes.forEach(function(note) {
158
- if (note.templateContent) {
159
- var template = this.findAnnotatedNode(this.root, note);
160
- template._content = note.templateContent;
161
- }
162
- }, this);
163
- },
164
-
165
- // construct `$` map (from id annotations)
166
- _marshalIdNodes: function() {
167
- this.$ = {};
168
- this._annotes.forEach(function(a) {
169
- if (a.id) {
170
- this.$[a.id] = this.findAnnotatedNode(this.root, a);
171
- }
172
- }, this);
173
- },
174
-
175
- // concretize `_nodes` map (from anonymous annotations)
176
- _marshalAnnotatedNodes: function() {
177
- if (this._nodes) {
178
- this._nodes = this._nodes.map(function(a) {
179
- return this.findAnnotatedNode(this.root, a);
180
- }, this);
181
- }
182
- },
183
-
184
- // install event listeners (from event annotations)
185
- _marshalAnnotatedListeners: function() {
186
- this._annotes.forEach(function(a) {
187
- if (a.events && a.events.length) {
188
- var node = this.findAnnotatedNode(this.root, a);
189
- a.events.forEach(function(e) {
190
- this.listen(node, e.name, e.value);
191
- }, this);
192
- }
193
- }, this);
194
- }
195
-
196
- });
197
-
198
- </script>
@@ -1,160 +0,0 @@
1
- <!--
2
- @license
3
- Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4
- This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5
- The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6
- The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7
- Code distributed by Google as part of the polymer project is also
8
- subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9
- -->
10
-
11
- <script>
12
-
13
- /*
14
- Process inputs efficiently via a configure lifecycle callback.
15
- Configure is called top-down, host before local dom. Users should
16
- implement configure to supply a set of default values for the element by
17
- returning an object containing the properties and values to set.
18
-
19
- Configured values are not immediately set, instead they are set when
20
- an element becomes ready, after its local dom is ready. This ensures
21
- that any user change handlers are not called before ready time.
22
-
23
- */
24
-
25
- /*
26
- Implementation notes:
27
-
28
- Configured values are collected into _config. At ready time, properties
29
- are set to the values in _config. This ensures properties are set child
30
- before host and change handlers are called only at ready time. The host
31
- will reset a value already propagated to a child, but this is not
32
- inefficient because of dirty checking at the set point.
33
-
34
- Bind notification events are sent when properties are set at ready time
35
- and thus received by the host before it is ready. Since notifications result
36
- in property updates and this triggers side effects, handling notifications
37
- is deferred until ready time.
38
-
39
- In general, events can be heard before an element is ready. This may occur
40
- when a user sends an event in a change handler or listens to a data event
41
- directly (on-foo-changed).
42
- */
43
-
44
- Polymer.Base.addFeature({
45
-
46
- // storage for configuration
47
- _setupConfigure: function(initialConfig) {
48
- this._config = initialConfig || {};
49
- this._handlers = [];
50
- },
51
-
52
- // static attributes are deserialized into _config
53
- _takeAttributes: function() {
54
- this._takeAttributesToModel(this._config);
55
- },
56
-
57
- // at configure time values are stored in _config
58
- _configValue: function(name, value) {
59
- this._config[name] = value;
60
- },
61
-
62
- // configure: returns user supplied default property values
63
- // combines with _config to create final property values
64
- _configure: function() {
65
- this._configureAnnotationReferences();
66
- var i;
67
- // get individual default values from property config
68
- var config = {};
69
- for (i in this.properties) {
70
- var c = this.properties[i];
71
- if (c.value !== undefined) {
72
- if (typeof c.value == 'function') {
73
- config[i] = c.value.call(this, this._config);
74
- } else {
75
- config[i] = c.value;
76
- }
77
- }
78
- }
79
- // get add'l default values from central configure
80
- this.simpleMixin(config, this.configure(this._config));
81
- // combine defaults returned from configure with inputs in _config
82
- this.simpleMixin(config, this._config);
83
- // this is the new _config, which are the final values to be applied
84
- this._config = config;
85
- // pass configuration data to bindings
86
- this._distributeConfig(this._config);
87
- },
88
-
89
- simpleMixin: function(a, b) {
90
- for (var i in b) {
91
- a[i] = b[i];
92
- }
93
- },
94
-
95
- // distribute config values to bound nodes.
96
- _distributeConfig: function(config) {
97
- var fx$ = this._propertyEffects;
98
- if (fx$) {
99
- for (var p in config) {
100
- var fx = fx$[p];
101
- if (fx) {
102
- for (var i=0, l=fx.length, x; (i<l) && (x=fx[i]); i++) {
103
- if (x.kind === 'annotation') {
104
- var node = this._nodes[x.effect.index];
105
- // seeding configuration only
106
- if (node._configValue) {
107
- var value = (p === x.effect.value) ? config[p] :
108
- this.getPathValue(x.effect.value, config);
109
- node._configValue(x.effect.name, value);
110
- }
111
- }
112
- }
113
- }
114
- }
115
- }
116
- },
117
-
118
- _beforeReady: function() {
119
- this._applyConfig(this._config);
120
- this._flushHandlers();
121
- },
122
-
123
- // NOTE: values are already propagated to children via
124
- // _distributeConfig so propagation triggered by effects here is
125
- // redundant, but safe due to dirty checking
126
- _applyConfig: function(config) {
127
- for (var n in config) {
128
- // Don't stomp on values that may have been set by other side effects
129
- if (this[n] === undefined) {
130
- this[n] = config[n];
131
- }
132
- }
133
- },
134
-
135
- // NOTE: Notifications can be processed before ready since
136
- // they are sent at *child* ready time. Since notifications cause side
137
- // effects and side effects must not be processed before ready time,
138
- // handling is queue/defered until then.
139
- _notifyListener: function(fn, e) {
140
- if (!this._readied) {
141
- this._queueHandler([fn, e, e.target]);
142
- } else {
143
- return fn.call(this, e, e.target);
144
- }
145
- },
146
-
147
- _queueHandler: function(args) {
148
- this._handlers.push(args);
149
- },
150
-
151
- _flushHandlers: function() {
152
- var h$ = this._handlers;
153
- for (var i=0, l=h$.length, h; (i<l) && (h=h$[i]); i++) {
154
- h[0].call(this, h[1], h[2]);
155
- }
156
- }
157
-
158
- });
159
-
160
- </script>
@@ -1,215 +0,0 @@
1
- <!--
2
- @license
3
- Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4
- This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5
- The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6
- The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7
- Code distributed by Google as part of the polymer project is also
8
- subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9
- -->
10
-
11
- <link rel="import" href="../lib/bind/accessors.html">
12
- <link rel="import" href="../lib/bind/effects.html">
13
-
14
- <script>
15
-
16
- /**
17
- * Support for the declarative property sugaring via mustache `{{ }}`
18
- * annotations in templates, and via the `properties` objects on
19
- * prototypes.
20
- *
21
- * Example:
22
- *
23
- * <template>
24
- * <span hidden="{{hideSpan}}">{{name}}</span> is on the hook.
25
- * </template>
26
- *
27
- * The `properties` object syntax is as follows:
28
- *
29
- * Polymer({
30
- *
31
- * properties: {
32
- * myProp: {
33
- * observer: 'myPropChanged',
34
- * computed: 'computemyProp(input1, input2)'
35
- * }
36
- * }
37
- *
38
- * ...
39
- *
40
- * });
41
- *
42
- * The `bind` feature also provides an API for registering effects against
43
- * properties.
44
- *
45
- * Property effects can be created imperatively, by template-annotations
46
- * (e.g. mustache notation), or by declaration in the `properties` object.
47
- *
48
- * The effect data is consumed by the `bind` subsystem (`/src/bind/*`),
49
- * which compiles the effects into efficient JavaScript that is triggered,
50
- * e.g., when a property is set to a new value.
51
- *
52
- * @class data feature: bind
53
- */
54
-
55
- Polymer.Base.addFeature({
56
-
57
- _addPropertyEffect: function(property, kind, effect) {
58
- // TODO(sjmiles): everything to the right of the first '.' is lost, implies
59
- // there is some duplicate information flow (not the only sign)
60
- var model = property.split('.').shift();
61
- Polymer.Bind.addPropertyEffect(this, model, kind, effect);
62
- },
63
-
64
- // prototyping
65
-
66
- _prepEffects: function() {
67
- Polymer.Bind.prepareModel(this);
68
- this._addPropertyEffects(this.properties);
69
- this._addObserverEffects(this.observers);
70
- this._addAnnotationEffects(this._annotes);
71
- Polymer.Bind.createBindings(this);
72
- },
73
-
74
- _addPropertyEffects: function(effects) {
75
- if (effects) {
76
- for (var n in effects) {
77
- var effect = effects[n];
78
- if (effect.observer) {
79
- this._addObserverEffect(n, effect.observer);
80
- }
81
- if (effect.computed) {
82
- this._addComputedEffect(n, effect.computed);
83
- }
84
- if (this.isNotifyProperty(n)) {
85
- this._addPropertyEffect(n, 'notify');
86
- }
87
- if (this.isReflectedProperty(n)) {
88
- this._addPropertyEffect(n, 'reflect');
89
- }
90
- }
91
- }
92
- },
93
-
94
- _addComputedEffect: function(name, expression) {
95
- var index = expression.indexOf('(');
96
- var method = expression.slice(0, index);
97
- var args = expression.slice(index + 1, -1).replace(/ /g, '').split(',');
98
- //console.log('%c on [%s] compute [%s] via [%s]', 'color: green', args[0], name, method);
99
- var effect = {
100
- property: name,
101
- args: args,
102
- methodName: method
103
- };
104
- for (var i=0; i<args.length; i++) {
105
- this._addPropertyEffect(args[i], 'compute', effect);
106
- }
107
- },
108
-
109
- _addObserverEffects: function(effects) {
110
- for (var n in effects) {
111
- this._addObserverEffect(n, effects[n]);
112
- }
113
- },
114
-
115
- _addObserverEffect: function(property, observer) {
116
- var effect = {
117
- method: observer
118
- };
119
- var props = property.split(' ');
120
- if (props.length == 1) {
121
- // Single property synchronous observer (supports paths)
122
- var model = property.split('.').shift();
123
- if (model != property) {
124
- // TODO(kschaaf): path observers won't get the right `new` argument
125
- this.addPathObserver(property, observer);
126
- }
127
- effect.property = model;
128
- this._addPropertyEffect(model, 'observer', effect);
129
- } else {
130
- // Multiple-property observer
131
- effect.properties = props;
132
- for (var i=0, l=props.length; i<l; i++) {
133
- this._addPropertyEffect(props[i], 'observer', effect);
134
- }
135
- }
136
- },
137
-
138
- _addAnnotationEffects: function(effects) {
139
- // create a virtual annotation list, must be concretized at instance time
140
- this._nodes = [];
141
- // process annotations that have been parsed from template
142
- effects.forEach(function(note) {
143
- // where to find the node in the concretized list
144
- var index = this._nodes.push(note) - 1;
145
- note.bindings.forEach(function(effect) {
146
- this._addAnnotationEffect(effect, index);
147
- }, this);
148
- }, this);
149
- },
150
-
151
- _addAnnotationEffect: function(effect, index) {
152
- // TODO(sjmiles): annotations have 'effects' proper and 'listener'
153
- if (Polymer.Bind._shouldAddListener(effect)) {
154
- // <node>.on.<dash-case-property>-changed: <path> = e.detail.value
155
- Polymer.Bind._addAnnotatedListener(this, index,
156
- effect.name, effect.value, effect.event);
157
- }
158
- var computed = effect.value.match(/(\w*)\((.*)\)/);
159
- if (computed) {
160
- var method = computed[1];
161
- var args = computed[2].split(/[^\w]+/);
162
- this._addAnnotatedComputationEffect(method, args, effect, index);
163
- } else {
164
- // capture the node index
165
- effect.index = index;
166
- // discover top-level property (model) from path
167
- var model = effect.value.split('.').shift();
168
- // add 'annotation' binding effect for property 'model'
169
- this._addPropertyEffect(model, 'annotation', effect);
170
- }
171
- },
172
-
173
- _addAnnotatedComputationEffect: function(method, args, info, index) {
174
- var effect = {
175
- kind: info.kind,
176
- property: info.name,
177
- index: index,
178
- args: args,
179
- methodName: method
180
- };
181
- for (var i=0, l=args.length; i<l; i++) {
182
- this._addPropertyEffect(args[i], 'annotatedComputation', effect);
183
- }
184
- },
185
-
186
- // instancing
187
-
188
- _marshalInstanceEffects: function() {
189
- Polymer.Bind.prepareInstance(this);
190
- Polymer.Bind.setupBindListeners(this);
191
- },
192
-
193
- _applyEffectValue: function(value, info) {
194
- var node = this._nodes[info.index];
195
- // TODO(sorvell): ideally, the info object is normalized for easy
196
- // lookup here.
197
- var property = info.property || info.name || 'textContent';
198
- // TODO(sorvell): consider pre-processing this step so we don't need
199
- // this lookup.
200
- // if (info._class === undefined) {
201
- // info._class = (property === 'class' || property === 'className');
202
- // }
203
- // if (info._class) {
204
- // value = this._scopeElementClass(node, value);
205
- // }
206
- if (info.kind == 'attribute') {
207
- this.serializeValueToAttribute(value, property, node);
208
- } else {
209
- return node[property] = value;
210
- }
211
- }
212
-
213
- });
214
-
215
- </script>