From b465ee721ec7610efda2471f22c6b9b40962c56c Mon Sep 17 00:00:00 2001 From: Omar Kilani Date: Mon, 28 Jun 2021 20:31:04 -0700 Subject: [PATCH] fix: geolocation crashes electron on macOS (#29343) (#29912) --- shell/browser/electron_browser_client.cc | 17 ++++++++++++++++- shell/browser/electron_browser_client.h | 8 ++++++++ shell/browser/electron_browser_main_parts.cc | 8 ++++++++ shell/browser/electron_browser_main_parts.h | 13 +++++++++++++ .../browser/electron_browser_main_parts_mac.mm | 4 ++++ 5 files changed, 49 insertions(+), 1 deletion(-) diff --git a/shell/browser/electron_browser_client.cc b/shell/browser/electron_browser_client.cc index ef596007fd47a..d6bfea57ecc94 100644 --- a/shell/browser/electron_browser_client.cc +++ b/shell/browser/electron_browser_client.cc @@ -1107,7 +1107,13 @@ ElectronBrowserClient::GetSystemNetworkContext() { std::unique_ptr ElectronBrowserClient::CreateBrowserMainParts( const content::MainFunctionParams& params) { - return std::make_unique(params); + auto browser_main_parts = std::make_unique(params); + +#if defined(OS_MAC) + browser_main_parts_ = browser_main_parts.get(); +#endif + + return browser_main_parts; } void ElectronBrowserClient::WebNotificationAllowed( @@ -1817,4 +1823,13 @@ content::BluetoothDelegate* ElectronBrowserClient::GetBluetoothDelegate() { return bluetooth_delegate_.get(); } +device::GeolocationSystemPermissionManager* +ElectronBrowserClient::GetLocationPermissionManager() { +#if defined(OS_MAC) + return browser_main_parts_->GetLocationPermissionManager(); +#else + return nullptr; +#endif +} + } // namespace electron diff --git a/shell/browser/electron_browser_client.h b/shell/browser/electron_browser_client.h index a4441d4e16274..8af157fd6dfdc 100644 --- a/shell/browser/electron_browser_client.h +++ b/shell/browser/electron_browser_client.h @@ -33,6 +33,7 @@ class SSLCertRequestInfo; namespace electron { +class ElectronBrowserMainParts; class NotificationPresenter; class PlatformNotificationService; @@ -89,6 +90,9 @@ class ElectronBrowserClient : public content::ContentBrowserClient, content::BluetoothDelegate* GetBluetoothDelegate() override; + device::GeolocationSystemPermissionManager* GetLocationPermissionManager() + override; + protected: void RenderProcessWillLaunch(content::RenderProcessHost* host) override; content::SpeechRecognitionManagerDelegate* @@ -342,6 +346,10 @@ class ElectronBrowserClient : public content::ContentBrowserClient, std::unique_ptr serial_delegate_; std::unique_ptr bluetooth_delegate_; +#if defined(OS_MAC) + ElectronBrowserMainParts* browser_main_parts_ = nullptr; +#endif + DISALLOW_COPY_AND_ASSIGN(ElectronBrowserClient); }; diff --git a/shell/browser/electron_browser_main_parts.cc b/shell/browser/electron_browser_main_parts.cc index a62f80161ae99..863912498ca08 100644 --- a/shell/browser/electron_browser_main_parts.cc +++ b/shell/browser/electron_browser_main_parts.cc @@ -95,6 +95,7 @@ #endif #if defined(OS_MAC) +#include "services/device/public/cpp/geolocation/geolocation_system_permission_mac.h" #include "shell/browser/ui/cocoa/views_delegate_mac.h" #else #include "shell/browser/ui/views/electron_views_delegate.h" @@ -569,6 +570,13 @@ ElectronBrowserMainParts::GetGeolocationControl() { return geolocation_control_.get(); } +#if defined(OS_MAC) +device::GeolocationSystemPermissionManager* +ElectronBrowserMainParts::GetLocationPermissionManager() { + return location_permission_manager_.get(); +} +#endif + IconManager* ElectronBrowserMainParts::GetIconManager() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (!icon_manager_.get()) diff --git a/shell/browser/electron_browser_main_parts.h b/shell/browser/electron_browser_main_parts.h index c83296df3d4b3..6ac537d9e838a 100644 --- a/shell/browser/electron_browser_main_parts.h +++ b/shell/browser/electron_browser_main_parts.h @@ -36,6 +36,10 @@ class GtkUiDelegate; } #endif +namespace device { +class GeolocationSystemPermissionManager; +} // namespace device + namespace electron { class ElectronBrowserContext; @@ -80,6 +84,10 @@ class ElectronBrowserMainParts : public content::BrowserMainParts { // used to enable the location services once per client. device::mojom::GeolocationControl* GetGeolocationControl(); +#if defined(OS_MAC) + device::GeolocationSystemPermissionManager* GetLocationPermissionManager(); +#endif + // Returns handle to the class responsible for extracting file icons. IconManager* GetIconManager(); @@ -161,6 +169,11 @@ class ElectronBrowserMainParts : public content::BrowserMainParts { mojo::Remote geolocation_control_; +#if defined(OS_MAC) + std::unique_ptr + location_permission_manager_; +#endif + static ElectronBrowserMainParts* self_; DISALLOW_COPY_AND_ASSIGN(ElectronBrowserMainParts); diff --git a/shell/browser/electron_browser_main_parts_mac.mm b/shell/browser/electron_browser_main_parts_mac.mm index 26834e65685f6..2aff4e41a253b 100644 --- a/shell/browser/electron_browser_main_parts_mac.mm +++ b/shell/browser/electron_browser_main_parts_mac.mm @@ -7,6 +7,7 @@ #include "base/mac/bundle_locations.h" #include "base/mac/foundation_util.h" #include "base/path_service.h" +#include "services/device/public/cpp/geolocation/geolocation_system_permission_mac.h" #import "shell/browser/mac/electron_application.h" #include "shell/browser/mac/electron_application_delegate.h" #include "shell/common/electron_paths.h" @@ -27,6 +28,9 @@ [[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"]; + + location_permission_manager_ = + device::GeolocationSystemPermissionManager::Create(); } void ElectronBrowserMainParts::FreeAppDelegate() {