mirror of https://github.com/vuejs/core.git
fix(custom-element): prevent injecting child styles if shadowRoot is false (#12769)
close #12630
This commit is contained in:
parent
4aa7a4aba3
commit
73055d8d95
|
@ -86,6 +86,7 @@ import { isAsyncWrapper } from './apiAsyncComponent'
|
||||||
import { isCompatEnabled } from './compat/compatConfig'
|
import { isCompatEnabled } from './compat/compatConfig'
|
||||||
import { DeprecationTypes } from './compat/compatConfig'
|
import { DeprecationTypes } from './compat/compatConfig'
|
||||||
import type { TransitionHooks } from './components/BaseTransition'
|
import type { TransitionHooks } from './components/BaseTransition'
|
||||||
|
import type { VueElement } from '@vue/runtime-dom'
|
||||||
|
|
||||||
export interface Renderer<HostElement = RendererElement> {
|
export interface Renderer<HostElement = RendererElement> {
|
||||||
render: RootRenderFunction<HostElement>
|
render: RootRenderFunction<HostElement>
|
||||||
|
@ -1348,7 +1349,11 @@ function baseCreateRenderer(
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// custom element style injection
|
// custom element style injection
|
||||||
if (root.ce) {
|
if (
|
||||||
|
root.ce &&
|
||||||
|
// @ts-expect-error _def is private
|
||||||
|
(root.ce as VueElement)._def.shadowRoot !== false
|
||||||
|
) {
|
||||||
root.ce._injectChildStyle(type)
|
root.ce._injectChildStyle(type)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -916,6 +916,30 @@ describe('defineCustomElement', () => {
|
||||||
assertStyles(el, [`div { color: blue; }`, `div { color: red; }`])
|
assertStyles(el, [`div { color: blue; }`, `div { color: red; }`])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("child components should not inject styles to root element's shadow root w/ shadowRoot false", async () => {
|
||||||
|
const Bar = defineComponent({
|
||||||
|
styles: [`div { color: green; }`],
|
||||||
|
render() {
|
||||||
|
return 'bar'
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const Baz = () => h(Bar)
|
||||||
|
const Foo = defineCustomElement(
|
||||||
|
{
|
||||||
|
render() {
|
||||||
|
return [h(Baz)]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ shadowRoot: false },
|
||||||
|
)
|
||||||
|
|
||||||
|
customElements.define('my-foo-with-shadowroot-false', Foo)
|
||||||
|
container.innerHTML = `<my-foo-with-shadowroot-false></my-foo-with-shadowroot-false>`
|
||||||
|
const el = container.childNodes[0] as VueElement
|
||||||
|
const style = el.shadowRoot?.querySelector('style')
|
||||||
|
expect(style).toBeUndefined()
|
||||||
|
})
|
||||||
|
|
||||||
test('with nonce', () => {
|
test('with nonce', () => {
|
||||||
const Foo = defineCustomElement(
|
const Foo = defineCustomElement(
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue