diff --git a/lib/mixins/element-mixin.html b/lib/mixins/element-mixin.html
index 17e1287264..0e48f7897d 100644
--- a/lib/mixins/element-mixin.html
+++ b/lib/mixins/element-mixin.html
@@ -576,7 +576,9 @@
let value = typeof info.value == 'function' ?
info.value.call(this) :
info.value;
- if (this._hasPropertyEffect(p)) {
+ // Set via `_setProperty` if there is an accessor, to enable
+ // initializing readOnly property defaults
+ if (this._hasAccessor(p)) {
this._setProperty(p, value)
} else {
this[p] = value;
diff --git a/lib/mixins/property-effects.html b/lib/mixins/property-effects.html
index 0d4e023b31..2e5f1d85c4 100644
--- a/lib/mixins/property-effects.html
+++ b/lib/mixins/property-effects.html
@@ -447,16 +447,6 @@
// -- bindings ----------------------------------------------
- function addBinding(nodeInfo, kind, target, parts, literal) {
- nodeInfo.bindings = nodeInfo.bindings || [];
- let binding = {
- kind, target, parts, literal,
- isCompound: (parts.length !== 1)
- };
- nodeInfo.bindings.push(binding);
- return binding;
- }
-
/**
* Adds "binding" property effects for the template annotation
* ("note" for short) and node index specified. These may either be normal
@@ -471,10 +461,17 @@
* be included as a dependency to the effect.
* @private
*/
- function addBindingEffects(constructor, templateInfo, binding, index) {
+ function addBinding(constructor, templateInfo, nodeInfo, kind, target, parts, literal) {
+ // Create binding metadata and add to nodeInfo
+ nodeInfo.bindings = nodeInfo.bindings || [];
+ let binding = { kind, target, parts, literal, isCompound: (parts.length !== 1) };
+ let index = templateInfo.nodeInfoList.length;
+ nodeInfo.bindings.push(binding);
+ // Add 2-way binding listener metadata to templateInfo
if (shouldAddListener(binding)) {
addAnnotatedListener(templateInfo, index, binding);
}
+ // Add "propagate" property effects to templateInfo
for (let i=0; i