feat(custom-element): support nonce option for injected style tags

close #6530
This commit is contained in:
Evan You 2024-08-06 15:41:43 +08:00
parent 60a88a2b12
commit bb4a02a70c
No known key found for this signature in database
GPG Key ID: 00E9AB7A6704CE0A
2 changed files with 20 additions and 0 deletions

View File

@ -718,6 +718,23 @@ describe('defineCustomElement', () => {
await nextTick()
assertStyles(el, [`div { color: blue; }`, `div { color: red; }`])
})
test('with nonce', () => {
const Foo = defineCustomElement(
{
styles: [`div { color: red; }`],
render() {
return h('div', 'hello')
},
},
{ nonce: 'xxx' },
)
customElements.define('my-el-with-nonce', Foo)
container.innerHTML = `<my-el-with-nonce></my-el-with-nonce>`
const el = container.childNodes[0] as VueElement
const style = el.shadowRoot?.querySelector('style')!
expect(style.getAttribute('nonce')).toBe('xxx')
})
})
describe('async', () => {

View File

@ -48,6 +48,7 @@ export type VueElementConstructor<P = {}> = {
export interface CustomElementOptions {
styles?: string[]
shadowRoot?: boolean
nonce?: string
}
// defineCustomElement provides the same type inference as defineComponent
@ -513,8 +514,10 @@ export class VueElement
}
this._styleChildren.add(owner)
}
const nonce = this._def.nonce
for (let i = styles.length - 1; i >= 0; i--) {
const s = document.createElement('style')
if (nonce) s.setAttribute('nonce', nonce)
s.textContent = styles[i]
this.shadowRoot!.prepend(s)
// record for HMR