Browse Source

fix: crash when failed to get devices in desktopCapturer (#17557)

* fix: crash when failed to get devices in desktopCapturer

* return after emit
Shelley Vohr 6 years ago
parent
commit
c2c3a04628
2 changed files with 14 additions and 3 deletions
  1. 6 2
      atom/browser/api/atom_api_desktop_capturer.cc
  2. 8 1
      lib/browser/desktop-capturer.js

+ 6 - 2
atom/browser/api/atom_api_desktop_capturer.cc

@@ -165,8 +165,12 @@ void DesktopCapturer::UpdateSourcesList(DesktopMediaList* list) {
       std::vector<std::string> device_names;
       // Crucially, this list of device names will be in the same order as
       // |media_list_sources|.
-      webrtc::DxgiDuplicatorController::Instance()->GetDeviceNames(
-          &device_names);
+      if (!webrtc::DxgiDuplicatorController::Instance()->GetDeviceNames(
+              &device_names)) {
+        Emit("error", "Failed to get sources.");
+        return;
+      }
+
       int device_name_index = 0;
       for (auto& source : screen_sources) {
         const auto& device_name = device_names[device_name_index++];

+ 8 - 1
lib/browser/desktop-capturer.js

@@ -26,7 +26,8 @@ ipcMainUtils.handle('ELECTRON_BROWSER_DESKTOP_CAPTURER_GET_SOURCES', (event, cap
         thumbnailSize,
         fetchWindowIcons
       },
-      resolve
+      resolve,
+      reject
     }
     requestsQueue.push(request)
     if (requestsQueue.length === 1) {
@@ -46,6 +47,12 @@ desktopCapturer.emit = (event, name, sources, fetchWindowIcons) => {
   const handledRequest = requestsQueue.shift()
   const unhandledRequestsQueue = []
 
+  if (name === 'error') {
+    const error = sources
+    handledRequest.reject(error)
+    return
+  }
+
   const result = sources.map(source => {
     return {
       id: source.id,