]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): ensure that errors in slot function execution do not affect block...
author似水微寒 <lhpmails@163.com>
Fri, 14 Oct 2022 08:08:32 +0000 (16:08 +0800)
committerGitHub <noreply@github.com>
Fri, 14 Oct 2022 08:08:32 +0000 (04:08 -0400)
fix #5657

packages/runtime-core/__tests__/vnode.spec.ts
packages/runtime-core/src/componentRenderContext.ts

index fdd23797b101b21d63421d556687106a2033a486..54cdc725b4d2270c4ca86a6ec93e43ca8bde425f 100644 (file)
@@ -8,11 +8,12 @@ import {
   cloneVNode,
   mergeProps,
   normalizeVNode,
-  transformVNodeArgs
+  transformVNodeArgs,
+  isBlockTreeEnabled
 } from '../src/vnode'
 import { Data } from '../src/component'
 import { ShapeFlags, PatchFlags } from '@vue/shared'
-import { h, reactive, isReactive, setBlockTracking, ref } from '../src'
+import { h, reactive, isReactive, setBlockTracking, ref, withCtx } from '../src'
 import { createApp, nodeOps, serializeInner } from '@vue/runtime-test'
 import { setCurrentRenderingInstance } from '../src/componentRenderContext'
 
@@ -614,6 +615,29 @@ describe('vnode', () => {
         ]))
       expect(vnode.dynamicChildren).toStrictEqual([])
     })
+    // #5657
+    test('error of slot function execution should not affect block tracking', () => {
+      expect(isBlockTreeEnabled).toStrictEqual(1)
+      const slotFn = withCtx(
+        () => {
+          throw new Error('slot execution error')
+        },
+        { type: {}, appContext: {} } as any
+      )
+      const Parent = {
+        setup(_: any, { slots }: any) {
+          return () => {
+            try {
+              slots.default()
+            } catch (e) {}
+          }
+        }
+      }
+      const vnode =
+        (openBlock(), createBlock(Parent, null, { default: slotFn }))
+      createApp(vnode).mount(nodeOps.createElement('div'))
+      expect(isBlockTreeEnabled).toStrictEqual(1)
+    })
   })
 
   describe('transformVNodeArgs', () => {
index 8f49ec251d5963eada2b46dacf135475df4e82ea..8097dc5fe2b89622298f30c72abfdfafc572e06a 100644 (file)
@@ -89,10 +89,14 @@ export function withCtx(
       setBlockTracking(-1)
     }
     const prevInstance = setCurrentRenderingInstance(ctx)
-    const res = fn(...args)
-    setCurrentRenderingInstance(prevInstance)
-    if (renderFnWithContext._d) {
-      setBlockTracking(1)
+    let res
+    try {
+      res = fn(...args)
+    } finally {
+      setCurrentRenderingInstance(prevInstance)
+      if (renderFnWithContext._d) {
+        setBlockTracking(1)
+      }
     }
 
     if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {