mirror of
https://github.com/Polymer/polymer.git
synced 2025-02-25 18:55:30 -06:00
161 lines
5.6 KiB
HTML
161 lines
5.6 KiB
HTML
<!DOCTYPE html>
|
|
<!--
|
|
@license
|
|
Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
|
|
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
|
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
|
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
|
Code distributed by Google as part of the polymer project is also
|
|
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
|
-->
|
|
<html>
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
|
|
<script src="wct-browser-config.js"></script>
|
|
<script src="../../node_modules/wct-browser-legacy/browser.js"></script>
|
|
<script type="module">
|
|
import { setStrictTemplatePolicy } from '../../lib/utils/settings.js';
|
|
import { Debouncer } from '../../lib/utils/debounce.js';
|
|
setStrictTemplatePolicy(true);
|
|
// Errors thrown in Polymer's debouncer queue get re-thrown
|
|
// via setTimeout, making them particulary difficult to verify;
|
|
// Wrap debouncer callbacks and store on the globalError to test later
|
|
const debounce = Debouncer.debounce;
|
|
Debouncer.debounce = function(debouncer, asyncModule, callback) {
|
|
return debounce(debouncer, asyncModule, function() {
|
|
try {
|
|
callback();
|
|
} catch(error) {
|
|
if (!window.uncaughtErrorFilter || !window.uncaughtErrorFilter(error)) {
|
|
throw error;
|
|
}
|
|
}
|
|
});
|
|
};
|
|
</script>
|
|
</head>
|
|
<body>
|
|
|
|
<dom-module id="trusted-element">
|
|
<template>Should never be used</template>
|
|
<script type="module">
|
|
import {PolymerElement} from '../../polymer-element.js';
|
|
class TrustedElement extends PolymerElement {
|
|
static get is() { return 'trusted-element'; }
|
|
}
|
|
customElements.define(TrustedElement.is, TrustedElement);
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id="trusted-element-legacy">
|
|
<template>Should never be used</template>
|
|
<script type="module">
|
|
import {Polymer} from '../../polymer-legacy.js';
|
|
Polymer({is: 'trusted-element-legacy'});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<div id="target"></div>
|
|
|
|
<script type="module">
|
|
import {Polymer} from '../../polymer-legacy.js';
|
|
import {flush} from '../../lib/utils/flush.js';
|
|
|
|
suite('strictTemplatePolicy', function() {
|
|
|
|
teardown(function() {
|
|
window.uncaughtErrorFilter = window.top.uncaughtErrorFilter = null;
|
|
});
|
|
|
|
// Errors thrown in custom element reactions are not thrown up
|
|
// the call stack to the dom methods that provoked them, so this
|
|
// wraps Chai's assert.throws to re-throw uncaught errors
|
|
function assertThrows(fn, re) {
|
|
let uncaughtError = null;
|
|
// Catch uncaught errors; note when running in iframe sometimes
|
|
// Safari errors are thrown on the top window, sometimes not, so
|
|
// catch in both places
|
|
window.uncaughtErrorFilter = window.top.uncaughtErrorFilter = function(err) {
|
|
uncaughtError = err;
|
|
return true;
|
|
}
|
|
assert.throws(function() {
|
|
fn();
|
|
// Re-throw any uncaughtErrors
|
|
if (uncaughtError) {
|
|
throw new Error(uncaughtError.message);
|
|
}
|
|
// Force polyfill reactions and/or async template stamping
|
|
flush();
|
|
// Re-throw any uncaughtErrors
|
|
if (uncaughtError) {
|
|
throw new Error(uncaughtError.message);
|
|
}
|
|
}, re);
|
|
}
|
|
|
|
test('dom-bind', function() {
|
|
assertThrows(function() {
|
|
document.getElementById('target').innerHTML =
|
|
'<dom-bind>' +
|
|
' <template>' +
|
|
' <div id="injected"></div>'+
|
|
' </template>`' +
|
|
'</dom-bind>';
|
|
}, /dom-bind not allowed/);
|
|
assert.notOk(document.getElementById('injected'));
|
|
});
|
|
|
|
test('dom-if', function() {
|
|
assertThrows(function() {
|
|
document.getElementById('target').innerHTML =
|
|
'<dom-if if>' +
|
|
' <template>' +
|
|
' <div id="injected"></div>'+
|
|
' </template>' +
|
|
'</dom-if>';
|
|
}, /template owner not trusted/);
|
|
assert.notOk(document.getElementById('injected'));
|
|
});
|
|
|
|
test('dom-repeat', function() {
|
|
assertThrows(function() {
|
|
document.getElementById('target').innerHTML =
|
|
'<dom-repeat items="[0]">' +
|
|
' <template>' +
|
|
' <div id="injected"></div>'+
|
|
' </template>`' +
|
|
'</dom-repeat>';
|
|
}, /template owner not trusted/);
|
|
assert.notOk(document.getElementById('injected'));
|
|
});
|
|
|
|
test('dom-module never used', function() {
|
|
var el = document.createElement('trusted-element');
|
|
document.getElementById('target').appendChild(el);
|
|
assert.notOk(el.shadowRoot);
|
|
});
|
|
|
|
test('dom-module never used (legacy)', function() {
|
|
var el = document.createElement('trusted-element-legacy');
|
|
document.getElementById('target').appendChild(el);
|
|
assert.notOk(el.shadowRoot);
|
|
});
|
|
|
|
test('dom-module re-registration throws', function() {
|
|
assertThrows(function() {
|
|
document.getElementById('target').innerHTML =
|
|
'<dom-module id="trusted-element">' +
|
|
' <template>' +
|
|
' <div id="injected"></div>'+
|
|
' </template>`' +
|
|
'</dom-module>';
|
|
}, /trusted-element registered twice/);
|
|
});
|
|
|
|
});
|
|
</script>
|
|
|
|
</body>
|
|
</html> |