Browse Source

fix(devtools): avoid open handle in non-browser env

fix #4815
Evan You 4 years ago
parent
commit
6916d725a0
1 changed files with 13 additions and 1 deletions
  1. 13 1
      packages/runtime-core/src/devtools.ts

+ 13 - 1
packages/runtime-core/src/devtools.ts

@@ -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 = []
   }
 }