]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): instance should not expose non-declared props
authorEvan You <yyx990803@gmail.com>
Mon, 27 Jan 2020 19:30:00 +0000 (14:30 -0500)
committerEvan You <yyx990803@gmail.com>
Mon, 27 Jan 2020 21:00:18 +0000 (16:00 -0500)
packages/runtime-core/__tests__/componentProxy.spec.ts
packages/runtime-core/src/componentProxy.ts

index 0790f2246e1c38523b4e2a4a0c0ff02907e3d0b1..8ea2ace2079e7171ef4d1fbebd6cb98609de7db8 100644 (file)
@@ -76,6 +76,20 @@ describe('component: proxy', () => {
     expect(`Attempting to mutate prop "foo"`).toHaveBeenWarned()
   })
 
+  test('should not expose non-declared props', () => {
+    let instanceProxy: any
+    const Comp = {
+      setup() {
+        return () => null
+      },
+      mounted() {
+        instanceProxy = this
+      }
+    }
+    render(h(Comp, { count: 1 }), nodeOps.createElement('div'))
+    expect('count' in instanceProxy).toBe(false)
+  })
+
   test('public properties', () => {
     let instance: ComponentInternalInstance
     let instanceProxy: any
index dbdbe894060a6192dd2d709f0c607c68bc13e698..1adad4aa056a149a511f47b6b5e297a68bd5b5e1 100644 (file)
@@ -69,7 +69,8 @@ const publicPropertiesMap: Record<
 const enum AccessTypes {
   DATA,
   CONTEXT,
-  PROPS
+  PROPS,
+  OTHER
 }
 
 export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
@@ -104,6 +105,7 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
             return renderContext[key]
           case AccessTypes.PROPS:
             return propsProxy![key]
+          // default: just fallthrough
         }
       } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
         accessCache![key] = AccessTypes.DATA
@@ -111,13 +113,16 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
       } else if (hasOwn(renderContext, key)) {
         accessCache![key] = AccessTypes.CONTEXT
         return renderContext[key]
-      } else if (hasOwn(props, key)) {
-        // only cache props access if component has declared (thus stable) props
-        if (type.props != null) {
+      } else if (type.props != null) {
+        // only cache other properties when instance has declared (this stable)
+        // props
+        if (hasOwn(props, key)) {
           accessCache![key] = AccessTypes.PROPS
+          // return the value from propsProxy for ref unwrapping and readonly
+          return propsProxy![key]
+        } else {
+          accessCache![key] = AccessTypes.OTHER
         }
-        // return the value from propsProxy for ref unwrapping and readonly
-        return propsProxy![key]
       }
     }