Skip to content

Commit

Permalink
fix(runtime-core): prevent self-injection (vuejs#2400)
Browse files Browse the repository at this point in the history
  • Loading branch information
69hunter committed Oct 19, 2020
1 parent 2d5784c commit 549a4b4
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
15 changes: 15 additions & 0 deletions packages/runtime-core/__tests__/apiInject.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -303,4 +303,19 @@ describe('api: provide/inject', () => {
render(h(Provider), root)
expect(`injection "foo" not found.`).not.toHaveBeenWarned()
})

// #2400
it('should not self-inject', () => {
const Comp = {
setup() {
provide('foo', 'foo')
const injection = inject('foo', null)
return () => injection
}
}

const root = nodeOps.createElement('div')
render(h(Comp), root)
expect(serialize(root)).toBe(`<div><!----></div>`)
})
})
11 changes: 9 additions & 2 deletions packages/runtime-core/src/apiInject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,15 @@ export function inject(
// a functional component
const instance = currentInstance || currentRenderingInstance
if (instance) {
const provides = instance.provides
if ((key as string | symbol) in provides) {
// #2400
// to support `app.use` plugins,
// fallback to appContext's `provides` if the intance is at root
const provides =
instance.parent == null
? instance.vnode.appContext && instance.vnode.appContext.provides
: instance.parent.provides

if (provides && (key as string | symbol) in provides) {
// TS doesn't allow symbol as index type
return provides[key as string]
} else if (arguments.length > 1) {
Expand Down

0 comments on commit 549a4b4

Please sign in to comment.