-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdangerous.html
43 lines (38 loc) · 1.16 KB
/
dangerous.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<title> Open ShadowRoot </title>
<style> strong { color: red; } </style>
<script>
class DangerZoneElement extends HTMLElement {
constructor() {
super(); this.attachShadow({ mode:'open' });
this.shadowRoot.innerHTML = this.template;
}
get template() {
return `
<style>.passed{color:green}</style>
<div id="test">TEST A</div>
<slot></slot>
<script>
let a = this.shadowRoot.querySelector('#test');
let b = this.firstElementChild;
a && a.classList.add('passed');
b && (b.style.color = 'green');
<\/script>
`;
}
connectedCallback() {
const scopedEval = (script) => Function(script).bind(this)();
const scripts = this.shadowRoot.querySelectorAll('script');
scripts.forEach(s => scopedEval(s.innerHTML));
}
}
customElements.define('danger-zone', DangerZoneElement);
</script>
<danger-zone>
<p> TEST B </p>
</danger-zone>
<script>
let dz = document.querySelector('danger-zone');
dz.shadowRoot.innerHTML += `<script>document.body.innerHTML+='<strong>BREACHED!';`;
dz.remove(); document.body.append(dz)
</script>