From 111d04f119a2b2d0b1a1790a063b152c17787943 Mon Sep 17 00:00:00 2001 From: Hunter Date: Tue, 20 Oct 2020 08:45:48 +0800 Subject: [PATCH] fix(runtime-core): prevent self-injection (#2424) fix #2400 --- packages/runtime-core/__tests__/apiInject.spec.ts | 15 +++++++++++++++ packages/runtime-core/src/apiInject.ts | 11 +++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/__tests__/apiInject.spec.ts b/packages/runtime-core/__tests__/apiInject.spec.ts index 8498e4f848f..bb21524878a 100644 --- a/packages/runtime-core/__tests__/apiInject.spec.ts +++ b/packages/runtime-core/__tests__/apiInject.spec.ts @@ -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(`
`) + }) }) diff --git a/packages/runtime-core/src/apiInject.ts b/packages/runtime-core/src/apiInject.ts index c12b6490849..186b411b241 100644 --- a/packages/runtime-core/src/apiInject.ts +++ b/packages/runtime-core/src/apiInject.ts @@ -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) {