Skip to content

Commit dfc8398

Browse files
committed
Revert to legacy template getter, update tests.
1 parent 1f9bced commit dfc8398

4 files changed

Lines changed: 90 additions & 45 deletions

File tree

lib/legacy/class.html

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,24 @@
152152
return info.observers;
153153
}
154154

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

lib/mixins/element-mixin.html

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -275,27 +275,6 @@
275275
}
276276
}
277277

278-
/**
279-
* Look up template from dom-module for element
280-
*
281-
* @param {!string} is Element name to look up
282-
* @return {!HTMLTemplateElement} Template found in dom module, or
283-
* undefined if not found
284-
* @private
285-
*/
286-
function getTemplateFromDomModule(is) {
287-
let template = null;
288-
if (is && Polymer.DomModule) {
289-
template = Polymer.DomModule.import(is, 'template');
290-
// Under strictTemplatePolicy, require any element with an `is`
291-
// specified to have a dom-module
292-
if (Polymer.strictTemplatePolicy && !template) {
293-
throw new Error(`strictTemplatePolicy: expecting dom-module or null template for ${is}`);
294-
}
295-
}
296-
return template;
297-
}
298-
299278
/**
300279
* @polymer
301280
* @mixinClass
@@ -368,6 +347,30 @@
368347
}
369348
}
370349

350+
/**
351+
* Look up template from dom-module for element
352+
*
353+
* @param {!string} is Element name to look up
354+
* @return {!HTMLTemplateElement} Template found in dom module, or
355+
* undefined if not found
356+
* @protected
357+
*/
358+
static _getTemplateFromDomModule() {
359+
let template = null;
360+
const is = /** @type {PolymerElementConstructor}*/ (this).is;
361+
// Under strictTemplatePolicy in 3.x+, dom-module lookup is only allowed
362+
// when opted-in via allowTemplateFromDomModule
363+
if (is && Polymer.DomModule) {
364+
template = Polymer.DomModule.import(is, 'template');
365+
// Under strictTemplatePolicy, require any element with an `is`
366+
// specified to have a dom-module
367+
if (Polymer.strictTemplatePolicy && !template) {
368+
throw new Error(`strictTemplatePolicy: expecting dom-module or null template for ${is}`);
369+
}
370+
}
371+
return template;
372+
}
373+
371374
/**
372375
* Returns the template that will be stamped into this element's shadow root.
373376
*
@@ -408,11 +411,8 @@
408411
static get template() {
409412
if (!this.hasOwnProperty(JSCompiler_renameProperty('_template', this))) {
410413
this._template =
411-
// Take any template set on the prototype, including null (for legacy
412-
// support, setting in registered callback, etc.)
413-
this.prototype._template !== undefined ? this.prototype._template :
414414
// Look in dom-module associated with this element's is
415-
getTemplateFromDomModule(/** @type {PolymerElementConstructor}*/ (this).is) ||
415+
this._getTemplateFromDomModule() ||
416416
// Next look for superclass template (call the super impl this
417417
// way so that `this` points to the superclass)
418418
Object.getPrototypeOf(/** @type {PolymerElementConstructor}*/ (this).prototype).constructor.template;

test/unit/behaviors.html

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

25-
<dom-module id="template-from-behavior">
25+
<dom-module id="template-from-base">
2626
<template>
2727
<div id="from-base">should not be used</div>
2828
</template>
@@ -298,9 +298,9 @@
298298
_template: Polymer.html`<div id="from-behavior2"></div>`
299299
};
300300

301-
window.templateBehaviorFromRegister = {
301+
window.templateBehaviorFromRegistered = {
302302
registered: function() {
303-
this._template = Polymer.html`<div id="behavior-from-register"></div>`;
303+
this._template = Polymer.html`<div id="behavior-from-registered"></div>`;
304304
}
305305
};
306306

@@ -311,6 +311,13 @@
311311
}
312312
});
313313

314+
Polymer({
315+
is: 'template-from-base',
316+
behaviors: [
317+
window.templateBehavior1
318+
]
319+
});
320+
314321
Polymer({
315322
is: 'template-from-behavior',
316323
behaviors: [
@@ -329,8 +336,7 @@
329336
Polymer({
330337
is: 'template-from-behavior-registered',
331338
behaviors: [
332-
window.templateBehavior1,
333-
window.templateBehaviorFromRegister
339+
window.templateBehaviorFromRegistered
334340
]
335341
});
336342

@@ -367,6 +373,12 @@
367373
</template>
368374
</test-fixture>
369375

376+
<test-fixture id="from-base">
377+
<template>
378+
<template-from-base></template-from-base>
379+
</template>
380+
</test-fixture>
381+
370382
<test-fixture id="from-behavior">
371383
<template>
372384
<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: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,15 @@
128128
const onerror = window.onerror;
129129
const topOnerror = window.top.topOnerror;
130130

131-
teardown(function() {
132-
// Restore mocha's onerror
131+
function restoreOnError() {
133132
window.onerror = onerror;
134133
window.top.onerror = topOnerror;
135134
window.uncaughtErrorFilter = window.top.uncaughtErrorFilter = null;
135+
}
136+
137+
teardown(function() {
138+
// Restore mocha's onerror
139+
restoreOnError();
136140
document.getElementById('target').textContent = '';
137141
});
138142

@@ -166,6 +170,7 @@
166170
throw uncaughtError;
167171
}
168172
}, re);
173+
restoreOnError();
169174
}
170175

171176
test('dom-bind', function() {
@@ -213,9 +218,12 @@
213218
' </template>`' +
214219
'</dom-module>';
215220
}, /trusted-element re-registered/);
216-
const el = document.createElement('trusted-element');
217-
document.getElementById('target').appendChild(el);
218-
assert.notOk(el.shadowRoot);
221+
let el;
222+
assertThrows(function() {
223+
el = document.createElement('trusted-element');
224+
document.getElementById('target').appendChild(el);
225+
}, /expecting dom-module or null template/);
226+
assert.notOk(el && el.shadowRoot);
219227
assert.notOk(document.getElementById('injected'));
220228
});
221229

@@ -230,7 +238,7 @@
230238
}, /trusted-element re-registered/);
231239
const el = document.createElement('trusted-element');
232240
document.getElementById('target').appendChild(el);
233-
assert.notOk(el.shadowRoot);
241+
assert.notOk(el && el.shadowRoot);
234242
assert.notOk(document.getElementById('injected'));
235243
});
236244

@@ -261,9 +269,12 @@
261269
' </template>`' +
262270
'</dom-module>';
263271
}, /trusted-element-legacy re-registered/);
264-
const el = document.createElement('trusted-element-legacy');
265-
document.getElementById('target').appendChild(el);
266-
assert.notOk(el.shadowRoot);
272+
let el;
273+
assertThrows(function() {
274+
el = document.createElement('trusted-element-legacy');
275+
document.getElementById('target').appendChild(el);
276+
}, /expecting dom-module or null template/);
277+
assert.notOk(el && el.shadowRoot);
267278
assert.notOk(document.getElementById('injected'));
268279
});
269280

@@ -276,9 +287,9 @@
276287
' </template>`' +
277288
'</dom-module>';
278289
}, /trusted-element-legacy re-registered/);
279-
const el = document.createElement('trusted-element-legacy');
290+
const el = document.createElement('trusted-element');
280291
document.getElementById('target').appendChild(el);
281-
assert.notOk(el.shadowRoot);
292+
assert.notOk(el && el.shadowRoot);
282293
assert.notOk(document.getElementById('injected'));
283294
});
284295

@@ -292,7 +303,7 @@
292303
Polymer({
293304
is: 'has-no-template-legacy',
294305
_template: null
295-
});
306+
}, /expecting dom-module or null template/);
296307
let el = document.createElement('has-no-template-legacy');
297308
document.getElementById('target').appendChild(el);
298309
assert.notOk(el.shadowRoot);

0 commit comments

Comments
 (0)