Skip to content

Commit c4b94a0

Browse files
committed
Revert to legacy template getter, update tests.
1 parent f318661 commit c4b94a0

File tree

4 files changed

+86
-43
lines changed

4 files changed

+86
-43
lines changed

lib/legacy/class.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,24 @@ function GenerateClassFromInfo(info, Base) {
148148
return info.observers;
149149
}
150150

151+
/**
152+
* @return {HTMLTemplateElement} template for this class
153+
*/
154+
static get template() {
155+
if (!this.hasOwnProperty(JSCompiler_renameProperty('_template', this))) {
156+
this._template =
157+
// Accept template: _null to short-circuit dom-module lookup
158+
info._template !== undefined ? info._template :
159+
// Look in dom-module associated with this element's is
160+
this._getTemplateFromDomModule() ||
161+
// Look up in the chain
162+
Base.template ||
163+
// Use any template set on the prototype via registered callback
164+
this.prototype._template;
165+
}
166+
return this._template;
167+
}
168+
151169
/**
152170
* @return {void}
153171
*/

lib/mixins/element-mixin.js

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -270,29 +270,6 @@ export const ElementMixin = dedupingMixin(base => {
270270
}
271271
}
272272

273-
/**
274-
* Look up template from dom-module for element
275-
*
276-
* @param {!string} is Element name to look up
277-
* @return {!HTMLTemplateElement} Template found in dom module, or
278-
* undefined if not found
279-
* @private
280-
*/
281-
function getTemplateFromDomModule(is) {
282-
let template = null;
283-
// Under strictTemplatePolicy in 3.x+, dom-module lookup is only allowed
284-
// when opted-in via allowTemplateFromDomModule
285-
if (is && (!strictTemplatePolicy || allowTemplateFromDomModule)) {
286-
template = DomModule.import(is, 'template');
287-
// Under strictTemplatePolicy, require any element with an `is`
288-
// specified to have a dom-module
289-
if (strictTemplatePolicy && !template) {
290-
throw new Error(`strictTemplatePolicy: expecting dom-module or null template for ${is}`);
291-
}
292-
}
293-
return template;
294-
}
295-
296273
/**
297274
* @polymer
298275
* @mixinClass
@@ -364,6 +341,30 @@ export const ElementMixin = dedupingMixin(base => {
364341
}
365342
}
366343

344+
/**
345+
* Look up template from dom-module for element
346+
*
347+
* @param {!string} is Element name to look up
348+
* @return {!HTMLTemplateElement} Template found in dom module, or
349+
* undefined if not found
350+
* @protected
351+
*/
352+
static _getTemplateFromDomModule() {
353+
let template = null;
354+
const is = /** @type {PolymerElementConstructor}*/ (this).is;
355+
// Under strictTemplatePolicy in 3.x+, dom-module lookup is only allowed
356+
// when opted-in via allowTemplateFromDomModule
357+
if (is && (!strictTemplatePolicy || allowTemplateFromDomModule)) {
358+
template = DomModule.import(is, 'template');
359+
// Under strictTemplatePolicy, require any element with an `is`
360+
// specified to have a dom-module
361+
if (strictTemplatePolicy && !template) {
362+
throw new Error(`strictTemplatePolicy: expecting dom-module or null template for ${is}`);
363+
}
364+
}
365+
return template;
366+
}
367+
367368
/**
368369
* Returns the template that will be stamped into this element's shadow root.
369370
*
@@ -403,17 +404,14 @@ export const ElementMixin = dedupingMixin(base => {
403404
static get template() {
404405
if (!this.hasOwnProperty(JSCompiler_renameProperty('_template', this))) {
405406
this._template =
406-
// Take any template set on the prototype, including null (for legacy
407-
// support, setting in registered callback, etc.)
408-
this.prototype._template !== undefined ? this.prototype._template :
409407
// Look in dom-module associated with this element's is
410-
getTemplateFromDomModule(/** @type {PolymerElementConstructor}*/ (this).is) ||
408+
this._getTemplateFromDomModule() ||
411409
// Next look for superclass template (call the super impl this
412410
// way so that `this` points to the superclass)
413411
Object.getPrototypeOf(/** @type {PolymerElementConstructor}*/ (this).prototype).constructor.template;
414412
}
415413
return this._template;
416-
}
414+
}
417415

418416
/**
419417
* Path matching the url from which the element was imported.

test/unit/behaviors.html

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
</template>
2424
</dom-module>
2525

26-
<dom-module id="template-from-behavior">
26+
<dom-module id="template-from-base">
2727
<template>
2828
<div id="from-base">should not be used</div>
2929
</template>
@@ -299,9 +299,9 @@
299299
_template: html`<div id="from-behavior2"></div>`
300300
};
301301

302-
window.templateBehaviorFromRegister = {
302+
window.templateBehaviorFromRegistered = {
303303
registered: function() {
304-
this._template = html`<div id="behavior-from-register"></div>`;
304+
this._template = html`<div id="behavior-from-registered"></div>`;
305305
}
306306
};
307307

@@ -312,6 +312,13 @@
312312
}
313313
});
314314

315+
Polymer({
316+
is: 'template-from-base',
317+
behaviors: [
318+
window.templateBehavior1
319+
]
320+
});
321+
315322
Polymer({
316323
is: 'template-from-behavior',
317324
behaviors: [
@@ -330,8 +337,7 @@
330337
Polymer({
331338
is: 'template-from-behavior-registered',
332339
behaviors: [
333-
window.templateBehavior1,
334-
window.templateBehaviorFromRegister
340+
window.templateBehaviorFromRegistered
335341
]
336342
});
337343
</script>
@@ -366,6 +372,12 @@
366372
</template>
367373
</test-fixture>
368374

375+
<test-fixture id="from-base">
376+
<template>
377+
<template-from-base></template-from-base>
378+
</template>
379+
</test-fixture>
380+
369381
<test-fixture id="from-behavior">
370382
<template>
371383
<template-from-behavior></template-from-behavior>
@@ -588,9 +600,14 @@
588600
assert.ok(el.shadowRoot.querySelector('#from-registered'));
589601
});
590602

603+
test('template from base', function() {
604+
var el = fixture('from-base');
605+
assert.ok(el.shadowRoot.querySelector('#from-base'));
606+
assert.notOk(el.shadowRoot.querySelector('#from-behavior1'));
607+
});
608+
591609
test('template from behavior', function() {
592610
var el = fixture('from-behavior');
593-
assert.notOk(el.shadowRoot.querySelector('#from-base'));
594611
assert.ok(el.shadowRoot.querySelector('#from-behavior1'));
595612
});
596613

@@ -602,8 +619,7 @@
602619

603620
test('template from behavior registered callback', function() {
604621
var el = fixture('from-behavior-registered');
605-
assert.notOk(el.shadowRoot.querySelector('#from-behavior1'));
606-
assert.ok(el.shadowRoot.querySelector('#behavior-from-register'));
622+
assert.ok(el.shadowRoot.querySelector('#behavior-from-registered'));
607623
});
608624

609625
});

test/unit/strict-template-policy.html

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,12 @@
8585

8686
suite('strictTemplatePolicy', function() {
8787

88-
teardown(function() {
88+
function restoreOnError() {
8989
window.uncaughtErrorFilter = window.top.uncaughtErrorFilter = null;
90+
}
91+
92+
teardown(function() {
93+
restoreOnError();
9094
document.getElementById('target').textContent = '';
9195
});
9296

@@ -117,6 +121,7 @@
117121
throw new Error(uncaughtError.message);
118122
}
119123
}, re);
124+
restoreOnError();
120125
}
121126

122127
test('dom-bind', function() {
@@ -181,9 +186,12 @@
181186
' </template>`' +
182187
'</dom-module>';
183188
}, /trusted-element re-registered/);
184-
const el = document.createElement('trusted-element');
185-
document.getElementById('target').appendChild(el);
186-
assert.notOk(el.shadowRoot);
189+
let el;
190+
assertThrows(function() {
191+
el = document.createElement('trusted-element');
192+
document.getElementById('target').appendChild(el);
193+
}, /expecting dom-module or null template for trusted-element/);
194+
assert.notOk(el && el.shadowRoot);
187195
assert.notOk(document.getElementById('injected'));
188196
});
189197

@@ -229,9 +237,12 @@
229237
' </template>`' +
230238
'</dom-module>';
231239
}, /trusted-element-legacy re-registered/);
232-
const el = document.createElement('trusted-element-legacy');
233-
document.getElementById('target').appendChild(el);
234-
assert.notOk(el.shadowRoot);
240+
let el;
241+
assertThrows(function() {
242+
el = document.createElement('trusted-element-legacy');
243+
document.getElementById('target').appendChild(el);
244+
}, /expecting dom-module or null template for trusted-element-legacy/);
245+
assert.notOk(el && el.shadowRoot);
235246
assert.notOk(document.getElementById('injected'));
236247
});
237248

0 commit comments

Comments
 (0)