Skip to content

Commit de09d73

Browse files
author
Steven Orvell
committed
Fixes #4437. Ensure _registered is called 1x for each element class using LegacyElementMixin. Ensure that a behaviors’s registered method is called for any extending class.
1 parent 04c5053 commit de09d73

3 files changed

Lines changed: 32 additions & 13 deletions

File tree

‎lib/legacy/class.html‎

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,6 @@
131131

132132
function GenerateClassFromInfo(info, Base) {
133133

134-
let registered = false;
135-
136134
class PolymerGenerated extends Base {
137135

138136
static get properties() {
@@ -163,13 +161,9 @@
163161
}
164162

165163
_registered() {
166-
if (!registered) {
167-
super._registered();
168-
// call `registered` only if it was not called for *this* constructor
169-
registered = true;
170-
if (info.registered) {
171-
info.registered.call(Object.getPrototypeOf(this));
172-
}
164+
super._registered();
165+
if (info.registered) {
166+
info.registered.call(Object.getPrototypeOf(this));
173167
}
174168
}
175169

‎lib/legacy/legacy-element-mixin.html‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,17 @@
105105

106106
/**
107107
* Overrides the default `Polymer.PropertyEffects` implementation to
108-
* add support for one-time `registration` callback.
108+
* add support for class initialization via the `_registered` callback.
109+
* This is called only when the first instance of the element is created.
109110
*
110111
* @override
111112
*/
112113
_initializeProperties() {
113-
this._registered();
114+
let proto = Object.getPrototypeOf(this);
115+
if (!proto.hasOwnProperty('__hasRegisterFinished')) {
116+
proto.__hasRegisterFinished = true;
117+
this._registered();
118+
}
114119
super._initializeProperties();
115120
}
116121

‎test/unit/mixin-behaviors.html‎

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,12 +329,18 @@
329329
BehaviorRegistered.prototype.registeredCount = 0;
330330

331331
customElements.define(BehaviorRegistered.is, BehaviorRegistered);
332+
333+
class BehaviorRegisteredExt extends BehaviorRegistered {
334+
static get is() { return 'behavior-registered-ext'}
335+
}
336+
337+
BehaviorRegisteredExt.prototype.registeredCount = 0;
338+
339+
customElements.define(BehaviorRegisteredExt.is, BehaviorRegisteredExt);
332340
});
333341
</script>
334342
</dom-module>
335343

336-
</script>
337-
338344
<test-fixture id="single">
339345
<template>
340346
<single-behavior></single-behavior>
@@ -364,6 +370,12 @@
364370
<behavior-registered></behavior-registered>
365371
</template>
366372
</test-fixture>
373+
374+
<test-fixture id="registered-ext">
375+
<template>
376+
<behavior-registered-ext></behavior-registered-ext>
377+
</template>
378+
</test-fixture>
367379
<script>
368380

369381
suite('single behavior element', function() {
@@ -421,6 +433,14 @@
421433
assert.deepEqual(el.registeredProps, [true, true, true]);
422434
});
423435

436+
test('extending element with behaviors with registered properly registers', function() {
437+
var el = fixture('registered-ext');
438+
assert.equal(el.registeredCount, 4);
439+
assert.equal(el.registeredBehaviors.length, 3);
440+
assert.equal(el.registeredBehaviors, el.behaviors);
441+
assert.deepEqual(el.registeredProps, [true, true, true]);
442+
});
443+
424444
});
425445

426446
suite('behavior lifecycle', function() {

0 commit comments

Comments
 (0)