mirror of https://github.com/electron/electron
32 lines
2.5 KiB
Diff
32 lines
2.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Samuel Attard <sattard@salesforce.com>
|
|
Date: Thu, 26 May 2022 15:38:32 -0700
|
|
Subject: feat: filter out non-shareable windows in the current application in
|
|
ScreenCaptureKitDevice
|
|
|
|
This patch ensures that windows protected via win.setContentProtection(true) do not appear in full display captures via desktopCapturer. This patch could be upstreamed but as the check is limited to in-process windows it doesn't make a lot of sense for Chromium itself. This patch currently has a limitation that it only function for windows created / protected BEFORE the stream is started. There is theoretical future work we can do via polling / observers to automatically update the SCContentFilter when new windows are made but for now this will solve 99+% of the problem and folks can re-order their logic a bit to get it working for their use cases.
|
|
|
|
diff --git a/content/browser/media/capture/screen_capture_kit_device_mac.mm b/content/browser/media/capture/screen_capture_kit_device_mac.mm
|
|
index afe8c03799f61f722a276b3d0f5090c22d8b6a1e..4fb3e8eb5f34a7ee9e8b0f22a7c842129cdc31eb 100644
|
|
--- a/content/browser/media/capture/screen_capture_kit_device_mac.mm
|
|
+++ b/content/browser/media/capture/screen_capture_kit_device_mac.mm
|
|
@@ -171,8 +171,17 @@ void OnShareableContentCreated(SCShareableContent* content) {
|
|
case DesktopMediaID::TYPE_SCREEN:
|
|
for (SCDisplay* display in content.displays) {
|
|
if (source_.id == display.displayID) {
|
|
+ NSArray<NSWindow*>* exclude_ns_windows = [[[NSApplication sharedApplication] windows] filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSWindow* win, NSDictionary *bindings) {
|
|
+ return [win sharingType] == NSWindowSharingNone;
|
|
+ }]];
|
|
+ NSArray<SCWindow*>* exclude_windows = [[content windows] filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(SCWindow* win, NSDictionary *bindings) {
|
|
+ for (NSWindow* excluded : exclude_ns_windows) {
|
|
+ if ((CGWindowID)[excluded windowNumber] == [win windowID]) return true;
|
|
+ }
|
|
+ return false;
|
|
+ }]];
|
|
filter = [[SCContentFilter alloc] initWithDisplay:display
|
|
- excludingWindows:@[]];
|
|
+ excludingWindows:exclude_windows];
|
|
stream_config_content_size_ =
|
|
gfx::Size(display.width, display.height);
|
|
break;
|