diff --git a/shell/browser/api/electron_api_desktop_capturer.cc b/shell/browser/api/electron_api_desktop_capturer.cc index fc50e73ab842..6b4d39f557dc 100644 --- a/shell/browser/api/electron_api_desktop_capturer.cc +++ b/shell/browser/api/electron_api_desktop_capturer.cc @@ -41,6 +41,10 @@ #include "ui/gfx/x/randr.h" #endif +#if BUILDFLAG(IS_MAC) +#include "ui/base/cocoa/permissions_utils.h" +#endif + #if BUILDFLAG(IS_LINUX) // Private function in ui/base/x/x11_display_util.cc base::flat_map GetMonitors( @@ -294,6 +298,13 @@ void DesktopCapturer::StartHandling(bool capture_window, capture_window_ = capture_window; capture_screen_ = capture_screen; +#if BUILDFLAG(IS_MAC) + if (!ui::TryPromptUserForScreenCapture()) { + HandleFailure(); + return; + } +#endif + { // Initialize the source list. // Apply the new thumbnail size and restart capture. @@ -430,21 +441,25 @@ void DesktopCapturer::UpdateSourcesList(DesktopMediaList* list) { std::back_inserter(captured_sources_)); } - if (!capture_window_ && !capture_screen_) { - v8::Isolate* isolate = JavascriptEnvironment::GetIsolate(); - v8::HandleScope scope(isolate); - gin_helper::CallMethod(this, "_onfinished", captured_sources_); + if (!capture_window_ && !capture_screen_) + HandleSuccess(); +} - screen_capturer_.reset(); - window_capturer_.reset(); +void DesktopCapturer::HandleSuccess() { + v8::Isolate* isolate = JavascriptEnvironment::GetIsolate(); + v8::HandleScope scope(isolate); + gin_helper::CallMethod(this, "_onfinished", captured_sources_); - Unpin(); - } + screen_capturer_.reset(); + window_capturer_.reset(); + + Unpin(); } void DesktopCapturer::HandleFailure() { v8::Isolate* isolate = JavascriptEnvironment::GetIsolate(); v8::HandleScope scope(isolate); + gin_helper::CallMethod(this, "_onerror", "Failed to get sources."); screen_capturer_.reset(); diff --git a/shell/browser/api/electron_api_desktop_capturer.h b/shell/browser/api/electron_api_desktop_capturer.h index 65285086a158..4f8bc7771f84 100644 --- a/shell/browser/api/electron_api_desktop_capturer.h +++ b/shell/browser/api/electron_api_desktop_capturer.h @@ -90,6 +90,7 @@ class DesktopCapturer : public gin::Wrappable, void UpdateSourcesList(DesktopMediaList* list); void HandleFailure(); + void HandleSuccess(); std::unique_ptr window_listener_; std::unique_ptr screen_listener_;