Repository: electron/electron
Pull request: perf: don't wait for thumbnails if they were not requested on macOS

#### Description of Change

When using the SCK thumbnail capturer, the first refresh has the list of sources, and the second refresh has the thumbnails. If thumbnails are not needed, only wait for the first refresh.

Capturing the thumbnails is slow, so this typically saves several hundred milliseconds.

Context: #41328, #41340

#### Checklist

- [x] PR description included and stakeholders cc'd
- [x] `npm test` passes (except for some failures which appear to be ordinary flakes)
- [x] tests are [changed or added](https://github.com/electron/electron/blob/main/docs/development/testing.md)
- [x] [PR release notes](https://github.com/electron/clerk/blob/main/README.md) describe the change in a way relevant to app developers, and are [capitalized, punctuated, and past tense](https://github.com/electron/clerk/blob/main/README.md#examples).

#### Release Notes

Notes: Improved performance of desktopCapturer.getSources when not requesting thumbnails on macOS.


Changed files:
filename: shell/browser/api/electron_api_desktop_capturer.cc
patch: @@ -328,8 +328,9 @@ void DesktopCapturer::StartHandling(bool capture_window,
         window_capturer_->SetThumbnailSize(thumbnail_size);
 #if BUILDFLAG(IS_MAC)
         window_capturer_->skip_next_refresh_ =
-            ShouldUseThumbnailCapturerMac(DesktopMediaList::Type::kWindow) ? 2
-                                                                           : 0;
+            ShouldUseThumbnailCapturerMac(DesktopMediaList::Type::kWindow)
+                ? thumbnail_size.IsEmpty() ? 1 : 2
+                : 0;
 #endif
 
         OnceCallback update_callback = base::BindOnce(
@@ -358,8 +359,9 @@ void DesktopCapturer::StartHandling(bool capture_window,
         screen_capturer_->SetThumbnailSize(thumbnail_size);
 #if BUILDFLAG(IS_MAC)
         screen_capturer_->skip_next_refresh_ =
-            ShouldUseThumbnailCapturerMac(DesktopMediaList::Type::kScreen) ? 2
-                                                                           : 0;
+            ShouldUseThumbnailCapturerMac(DesktopMediaList::Type::kScreen)
+                ? thumbnail_size.IsEmpty() ? 1 : 2
+                : 0;
 #endif
 
         OnceCallback update_callback = base::BindOnce(

filename: spec/api-desktop-capturer-spec.ts
patch: @@ -67,6 +67,22 @@ ifdescribe(!process.arch.includes('arm') && process.platform !== 'win32')('deskt
     }
   });
 
+  it('enabling thumbnail should return non-empty images', async () => {
+    const w2 = new BrowserWindow({ show: false, width: 200, height: 200, webPreferences: { contextIsolation: false } });
+    const wShown = once(w2, 'show');
+    w2.show();
+    await wShown;
+
+    const isNonEmpties: boolean[] = (await desktopCapturer.getSources({
+      types: ['window', 'screen'],
+      thumbnailSize: { width: 100, height: 100 }
+    })).map(s => s.thumbnail.constructor.name === 'NativeImage' && !s.thumbnail.isEmpty());
+
+    w2.destroy();
+    expect(isNonEmpties).to.be.an('array').that.is.not.empty();
+    expect(isNonEmpties.every(e => e === true)).to.be.true();
+  });
+
   it('disabling thumbnail should return empty images', async () => {
     const w2 = new BrowserWindow({ show: false, width: 200, height: 200, webPreferences: { contextIsolation: false } });
     const wShown = once(w2, 'show');