|
37 | 37 | </head> |
38 | 38 | <body> |
39 | 39 |
|
40 | | - <dom-module id="trusted-element"> |
| 40 | + <dom-module id="no-dm"> |
41 | 41 | <template>Should never be used</template> |
42 | 42 | <script type="module"> |
43 | 43 | import {PolymerElement} from '../../polymer-element.js'; |
44 | 44 | class TrustedElement extends PolymerElement { |
45 | | - static get is() { return 'trusted-element'; } |
| 45 | + static get is() { return 'no-dm'; } |
46 | 46 | } |
47 | 47 | customElements.define(TrustedElement.is, TrustedElement); |
48 | 48 | </script> |
49 | 49 | </dom-module> |
50 | 50 |
|
51 | | - <dom-module id="trusted-element-legacy"> |
| 51 | + <dom-module id="no-dm-legacy"> |
52 | 52 | <template>Should never be used</template> |
53 | 53 | <script type="module"> |
54 | 54 | import {Polymer} from '../../polymer-legacy.js'; |
55 | | - Polymer({is: 'trusted-element-legacy'}); |
| 55 | + Polymer({is: 'no-dm-legacy'}); |
56 | 56 | </script> |
57 | 57 | </dom-module> |
58 | 58 |
|
| 59 | + <dom-module id="trusted-element"> |
| 60 | + <template>Trusted</template> |
| 61 | + <script type="module"> |
| 62 | + import {PolymerElement} from '../../polymer-element.js'; |
| 63 | + class TrustedElement extends PolymerElement { |
| 64 | + static get is() { return 'trusted-element'; } |
| 65 | + } |
| 66 | + customElements.define(TrustedElement.is, TrustedElement); |
| 67 | + </script> |
| 68 | + </dom-module> |
| 69 | + |
| 70 | + <dom-module id="trusted-element-legacy"> |
| 71 | + <template>Trusted</template> |
| 72 | + <script type="module"> |
| 73 | + import {Polymer} from '../../polymer-legacy.js'; |
| 74 | + Polymer({is: 'trusted-element-legacy'}); |
| 75 | + </script> |
| 76 | + </dom-module> |
| 77 | + |
59 | 78 | <div id="target"></div> |
60 | | - |
| 79 | + |
61 | 80 | <script type="module"> |
| 81 | + import {PolymerElement} from '../../polymer-element.js'; |
| 82 | + import {Polymer} from '../../polymer-legacy.js'; |
62 | 83 | import {flush} from '../../lib/utils/flush.js'; |
| 84 | + import {setAllowTemplateFromDomModule} from '../../lib/utils/settings.js'; |
63 | 85 |
|
64 | 86 | suite('strictTemplatePolicy', function() { |
65 | 87 |
|
66 | 88 | teardown(function() { |
67 | 89 | window.uncaughtErrorFilter = window.top.uncaughtErrorFilter = null; |
| 90 | + document.getElementById('target').textContent = ''; |
68 | 91 | }); |
69 | 92 |
|
70 | 93 | // Errors thrown in custom element reactions are not thrown up |
|
76 | 99 | // Safari errors are thrown on the top window, sometimes not, so |
77 | 100 | // catch in both places |
78 | 101 | window.uncaughtErrorFilter = window.top.uncaughtErrorFilter = function(err) { |
79 | | - uncaughtError = err; |
| 102 | + if (!uncaughtError) { |
| 103 | + uncaughtError = err; |
| 104 | + } |
80 | 105 | return true; |
81 | 106 | }; |
82 | 107 | assert.throws(function() { |
|
131 | 156 | }); |
132 | 157 |
|
133 | 158 | test('dom-module never used', function() { |
134 | | - var el = document.createElement('trusted-element'); |
| 159 | + var el = document.createElement('no-dm'); |
135 | 160 | document.getElementById('target').appendChild(el); |
136 | 161 | assert.notOk(el.shadowRoot); |
137 | 162 | }); |
138 | 163 |
|
139 | 164 | test('dom-module never used (legacy)', function() { |
140 | | - var el = document.createElement('trusted-element-legacy'); |
| 165 | + var el = document.createElement('no-dm-legacy'); |
141 | 166 | document.getElementById('target').appendChild(el); |
142 | 167 | assert.notOk(el.shadowRoot); |
143 | 168 | }); |
144 | 169 |
|
145 | | - test('dom-module re-registration throws', function() { |
| 170 | + // From this point down, dom-module lookup is globally enabled |
| 171 | + test('setAllowTemplateFromDomModule', function() { |
| 172 | + setAllowTemplateFromDomModule(true); |
| 173 | + }); |
| 174 | + |
| 175 | + test('dom-module after registration', function() { |
146 | 176 | assertThrows(function() { |
147 | 177 | document.getElementById('target').innerHTML = |
148 | 178 | '<dom-module id="trusted-element">' + |
149 | 179 | ' <template>' + |
150 | 180 | ' <div id="injected"></div>'+ |
151 | 181 | ' </template>`' + |
152 | | - '</dom-module>'; |
153 | | - }, /trusted-element registered twice/); |
| 182 | + '</dom-module>' + |
| 183 | + '<trusted-element></trusted-element>'; |
| 184 | + }, /trusted-element re-registered/); |
| 185 | + const el = document.querySelector('trusted-element'); |
| 186 | + assert.notOk(el && el.shadowRoot && el.shadowRoot.querySelector('#injected')); |
| 187 | + }); |
| 188 | + |
| 189 | + test('dom-module before registration', function() { |
| 190 | + document.getElementById('target').innerHTML = |
| 191 | + '<dom-module id="has-no-template">' + |
| 192 | + ' <template>' + |
| 193 | + ' <div id="injected"></div>'+ |
| 194 | + ' </template>`' + |
| 195 | + '</dom-module>'; |
| 196 | + class HasNoTemplate extends PolymerElement { |
| 197 | + static get is() { return 'has-no-template'; } |
| 198 | + static get template() { return null; } |
| 199 | + } |
| 200 | + customElements.define(HasNoTemplate.is, HasNoTemplate); |
| 201 | + let el = document.createElement('has-no-template'); |
| 202 | + document.getElementById('target').appendChild(el); |
| 203 | + assert.notOk(el.shadowRoot); |
| 204 | + }); |
| 205 | + |
| 206 | + test('dom-module after registration (legacy)', function() { |
| 207 | + assertThrows(function() { |
| 208 | + document.getElementById('target').innerHTML = |
| 209 | + '<dom-module id="trusted-element-legacy">' + |
| 210 | + ' <template>' + |
| 211 | + ' <div id="injected"></div>'+ |
| 212 | + ' </template>`' + |
| 213 | + '</dom-module>' + |
| 214 | + '<trusted-element-legacy></trusted-element-legacy>'; |
| 215 | + }, /trusted-element-legacy re-registered/); |
| 216 | + const el = document.querySelector('trusted-element-legacy'); |
| 217 | + assert.notOk(el && el.shadowRoot && el.shadowRoot.querySelector('#injected')); |
| 218 | + }); |
| 219 | + |
| 220 | + test('dom-module before registration (legacy)', function() { |
| 221 | + document.getElementById('target').innerHTML = |
| 222 | + '<dom-module id="has-no-template-legacy">' + |
| 223 | + ' <template>' + |
| 224 | + ' <div id="injected"></div>'+ |
| 225 | + ' </template>`' + |
| 226 | + '</dom-module>'; |
| 227 | + Polymer({ |
| 228 | + is: 'has-no-template-legacy', |
| 229 | + _template: null |
| 230 | + }); |
| 231 | + let el = document.createElement('has-no-template-legacy'); |
| 232 | + document.getElementById('target').appendChild(el); |
| 233 | + assert.notOk(document.querySelector('has-no-template-legacy').shadowRoot); |
154 | 234 | }); |
155 | 235 |
|
| 236 | + test('element without explicit template throws', function() { |
| 237 | + assertThrows(function() { |
| 238 | + class HasNoTemplateThrows extends PolymerElement { |
| 239 | + static get is() { return 'has-no-template-throws'; } |
| 240 | + } |
| 241 | + customElements.define(HasNoTemplateThrows.is, HasNoTemplateThrows); |
| 242 | + var el = document.createElement('has-no-template-throws'); |
| 243 | + document.getElementById('target').appendChild(el); |
| 244 | + }, /expecting dom-module or null template/); |
| 245 | + }); |
| 246 | + |
| 247 | + test('element without explicit template throws (legacy)', function() { |
| 248 | + assertThrows(function() { |
| 249 | + Polymer({ |
| 250 | + is: 'has-no-template-throws-legacy' |
| 251 | + }); |
| 252 | + var el = document.createElement('has-no-template-throws-legacy'); |
| 253 | + document.getElementById('target').appendChild(el); |
| 254 | + }, /expecting dom-module or null template/); |
| 255 | + }); |
| 256 | + |
156 | 257 | }); |
157 | 258 | </script> |
158 | 259 |
|
|
0 commit comments