Browse Source

fix: free screen capturers after usage ends (#20280)

* fix: free screen and window capturers immediately after we're finished with them (#20156)

fix #17937, #19908

* fix: reset capturers at the very end (#20270)
Shelley Vohr 5 years ago
parent
commit
325bdfaf23
2 changed files with 17 additions and 8 deletions
  1. 7 7
      lib/browser/desktop-capturer.ts
  2. 10 1
      patches/chromium/desktop_media_list.patch

+ 7 - 7
lib/browser/desktop-capturer.ts

@@ -19,7 +19,13 @@ export const getSources = (event: Electron.IpcMainEvent, options: ElectronIntern
   }
 
   const getSources = new Promise<ElectronInternal.GetSourcesResult[]>((resolve, reject) => {
+    let capturer: ElectronInternal.DesktopCapturer | null = createDesktopCapturer()
+
     const stopRunning = () => {
+      if (capturer) {
+        capturer.emit = null
+        capturer = null
+      }
       // Remove from currentlyRunning once we resolve or reject
       currentlyRunning = currentlyRunning.filter(running => running.options !== options)
     }
@@ -42,19 +48,13 @@ export const getSources = (event: Electron.IpcMainEvent, options: ElectronIntern
       })))
     })
 
-    let capturer: ElectronInternal.DesktopCapturer | null = createDesktopCapturer()
-
     capturer.emit = emitter.emit.bind(emitter)
     capturer.startHandling(options.captureWindow, options.captureScreen, options.thumbnailSize, options.fetchWindowIcons)
 
     // If the WebContents is destroyed before receiving result, just remove the
     // reference to emit and the capturer itself so that it never dispatches
     // back to the renderer
-    event.sender.once('destroyed', () => {
-      capturer!.emit = null
-      capturer = null
-      stopRunning()
-    })
+    event.sender.once('destroyed', () => stopRunning())
   })
 
   currentlyRunning.push({

+ 10 - 1
patches/chromium/desktop_media_list.patch

@@ -133,7 +133,7 @@ index 47401abc984e6fe26c7f4c5399aa565c687060b0..ca6a527ffac877c27aac94337ec5a7b5
   protected:
    virtual ~DesktopMediaListObserver() {}
 diff --git a/chrome/browser/media/webrtc/native_desktop_media_list.cc b/chrome/browser/media/webrtc/native_desktop_media_list.cc
-index b2005c70acbc1c05c59bb2059b190ab78fb63a68..1a7188e2df76672d66da3206d4448df35a065754 100644
+index b2005c70acbc1c05c59bb2059b190ab78fb63a68..6cfc3007549b2e7992334b708e4e71a00974c2a3 100644
 --- a/chrome/browser/media/webrtc/native_desktop_media_list.cc
 +++ b/chrome/browser/media/webrtc/native_desktop_media_list.cc
 @@ -8,14 +8,15 @@
@@ -153,3 +153,12 @@ index b2005c70acbc1c05c59bb2059b190ab78fb63a68..1a7188e2df76672d66da3206d4448df3
  #include "media/base/video_util.h"
  #include "third_party/libyuv/include/libyuv/scale_argb.h"
  #include "third_party/skia/include/core/SkBitmap.h"
+@@ -218,6 +219,8 @@ void NativeDesktopMediaList::Worker::RefreshThumbnails(
+       FROM_HERE, {BrowserThread::UI},
+       base::BindOnce(&NativeDesktopMediaList::UpdateNativeThumbnailsFinished,
+                      media_list_));
++
++  capturer_.reset();
+ }
+ 
+ void NativeDesktopMediaList::Worker::OnCaptureResult(