|
37 | 37 | template = document.querySelector('template'); |
38 | 38 | }); |
39 | 39 |
|
| 40 | + var canInnerHTML = (function() { |
| 41 | + var el = document.createElement('div'); |
| 42 | + try { |
| 43 | + Object.defineProperty(el, 'innerHTML', { |
| 44 | + get: function(){}, |
| 45 | + set: function(){} |
| 46 | + }); |
| 47 | + return true; |
| 48 | + } catch(e) { |
| 49 | + return false; |
| 50 | + } |
| 51 | + })(); |
| 52 | + |
| 53 | + function setupTemplate(template, string) { |
| 54 | + if (canInnerHTML) { |
| 55 | + template.innerHTML = string; |
| 56 | + } else { |
| 57 | + var el = document.createElement('div'); |
| 58 | + el.innerHTML = string; |
| 59 | + var nodes = Array.prototype.slice.call(el.childNodes, 0); |
| 60 | + for (var i = 0; i < nodes.length; i++) { |
| 61 | + template.content.appendChild(nodes[i]); |
| 62 | + } |
| 63 | + } |
| 64 | + } |
| 65 | + |
40 | 66 | test('No rendering', function() { |
41 | 67 | var bcr = template.getBoundingClientRect(); |
42 | 68 | assert.equal(bcr.height, 0); |
|
58 | 84 | }); |
59 | 85 |
|
60 | 86 | test('innerHTML', function() { |
| 87 | + if (!canInnerHTML) { |
| 88 | + this.skip(); |
| 89 | + } |
61 | 90 | var imp = document.createElement('template'); |
62 | 91 | assert.equal(imp.innerHTML, ''); |
63 | 92 | var s = 'pre<div>Hi</div><div>Bye</div>post'; |
|
84 | 113 | test('clone', function() { |
85 | 114 | var imp = document.createElement('template'); |
86 | 115 | var s = '<div>Hi</div>'; |
87 | | - imp.innerHTML = s; |
| 116 | + setupTemplate(imp, s); |
88 | 117 | var clone = imp.cloneNode(); |
89 | 118 | assert.notEqual(clone, imp, 'element is not cloned'); |
90 | 119 | assert.isDefined(clone.content, 'cloned template content dne'); |
|
100 | 129 | test('clone nested', function() { |
101 | 130 | var imp = document.createElement('template'); |
102 | 131 | var s = 'a<template id="a">b<template id="b">c<template id="c">d</template></template></template>'; |
103 | | - imp.innerHTML = s; |
| 132 | + setupTemplate(imp, s); |
104 | 133 | var clone = imp.cloneNode(); |
105 | 134 | assert.notEqual(clone, imp, 'element is not cloned'); |
106 | 135 | assert.isDefined(clone.content, 'cloned template content dne'); |
|
129 | 158 | var imp = document.createElement('div'); |
130 | 159 | var t = document.createElement('template'); |
131 | 160 | var s = 'a<template id="a">b<template id="b">c<template id="c">d</template></template></template>'; |
132 | | - t.innerHTML = s; |
| 161 | + setupTemplate(t, s); |
133 | 162 | imp.appendChild(t); |
134 | 163 | var impClone = imp.cloneNode(true); |
135 | 164 | var imp = imp.firstChild; |
|
155 | 184 | test('importNode', function() { |
156 | 185 | var imp = document.createElement('template'); |
157 | 186 | var s = '<div>Hi</div>'; |
158 | | - imp.innerHTML = s; |
| 187 | + setupTemplate(imp, s) |
159 | 188 | var clone = document.importNode(imp, false); |
160 | 189 | assert.notEqual(clone, imp, 'element is not cloned'); |
161 | 190 | assert.isDefined(clone.content, 'cloned template content dne'); |
|
171 | 200 | test('importNode: nested', function() { |
172 | 201 | var imp = document.createElement('template'); |
173 | 202 | var s = 'a<template id="a">b<template id="b">c<template id="c">d</template></template></template>'; |
174 | | - imp.innerHTML = s; |
| 203 | + setupTemplate(imp, s); |
175 | 204 | var clone = document.importNode(imp, false); |
176 | 205 | assert.notEqual(clone, imp, 'element is not cloned'); |
177 | 206 | assert.isDefined(clone.content, 'cloned template content dne'); |
|
200 | 229 | var imp = document.createElement('div'); |
201 | 230 | var t = document.createElement('template'); |
202 | 231 | var s = 'a<template id="a">b<template id="b">c<template id="c">d</template></template></template>'; |
203 | | - t.innerHTML = s; |
| 232 | + setupTemplate(t, s); |
204 | 233 | imp.appendChild(t); |
205 | 234 | var impClone = document.importNode(imp, true); |
206 | 235 | imp = imp.firstChild; |
|
0 commit comments