]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(devtools): avoid open handle in non-browser env
authorEvan You <yyx990803@gmail.com>
Tue, 2 Nov 2021 03:45:28 +0000 (11:45 +0800)
committerEvan You <yyx990803@gmail.com>
Tue, 2 Nov 2021 03:45:41 +0000 (11:45 +0800)
fix #4815

packages/runtime-core/src/devtools.ts

index 2e09a2e24a13d31f4083e97b5bd85c27c8ccd0ef..878bb68bfeac4195dc13c3071b3987a339873187 100644 (file)
@@ -49,7 +49,14 @@ export function setDevtoolsHook(hook: DevtoolsHook, target: any) {
     devtools.enabled = true
     buffer.forEach(({ event, args }) => devtools.emit(event, ...args))
     buffer = []
-  } else {
+  } else if (
+    // handle late devtools injection - only do this if we are in an actual
+    // browser environment to avoid the timer handle stalling test runner exit
+    // (#4815)
+    // eslint-disable-next-line no-restricted-globals
+    typeof window !== 'undefined' &&
+    !navigator.userAgent.includes('jsdom')
+  ) {
     const replay = (target.__VUE_DEVTOOLS_HOOK_REPLAY__ =
       target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [])
     replay.push((newHook: DevtoolsHook) => {
@@ -59,10 +66,15 @@ export function setDevtoolsHook(hook: DevtoolsHook, target: any) {
     // at all, and keeping the buffer will cause memory leaks (#4738)
     setTimeout(() => {
       if (!devtools) {
+        target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null
         devtoolsNotInstalled = true
         buffer = []
       }
     }, 3000)
+  } else {
+    // non-browser env, assume not installed
+    devtoolsNotInstalled = true
+    buffer = []
   }
 }