From 3d002b2baae10f98e9a2da661e831139f5b812c9 Mon Sep 17 00:00:00 2001 From: Omar Kilani Date: Sun, 27 Jun 2021 19:17:41 -0700 Subject: [PATCH] fix: geolocation crashes electron on macOS (#29343) --- shell/browser/electron_browser_client.cc | 16 +++++++++++++++- shell/browser/electron_browser_client.h | 7 +++++++ shell/browser/electron_browser_main_parts.cc | 7 +++++++ shell/browser/electron_browser_main_parts.h | 12 ++++++++++++ shell/browser/electron_browser_main_parts_mac.mm | 3 +++ 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/shell/browser/electron_browser_client.cc b/shell/browser/electron_browser_client.cc index bd19cbb807240..1d645e108f3df 100644 --- a/shell/browser/electron_browser_client.cc +++ b/shell/browser/electron_browser_client.cc @@ -867,7 +867,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( @@ -1603,4 +1609,12 @@ void ElectronBrowserClient::RegisterBrowserInterfaceBindersForServiceWorker( base::BindRepeating(&BindBadgeServiceForServiceWorker)); } +device::GeolocationManager* ElectronBrowserClient::GetGeolocationManager() { +#if defined(OS_MAC) + return browser_main_parts_->GetGeolocationManager(); +#else + return nullptr; +#endif +} + } // namespace electron diff --git a/shell/browser/electron_browser_client.h b/shell/browser/electron_browser_client.h index 6e4c8c8db4076..1c45bce0f1f26 100644 --- a/shell/browser/electron_browser_client.h +++ b/shell/browser/electron_browser_client.h @@ -34,6 +34,7 @@ class SSLCertRequestInfo; namespace electron { +class ElectronBrowserMainParts; class NotificationPresenter; class PlatformNotificationService; @@ -88,6 +89,8 @@ class ElectronBrowserClient : public content::ContentBrowserClient, content::BluetoothDelegate* GetBluetoothDelegate() override; + device::GeolocationManager* GetGeolocationManager() override; + protected: void RenderProcessWillLaunch(content::RenderProcessHost* host) override; content::SpeechRecognitionManagerDelegate* @@ -298,6 +301,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 c0fbf74176240..e1dc28349b048 100644 --- a/shell/browser/electron_browser_main_parts.cc +++ b/shell/browser/electron_browser_main_parts.cc @@ -92,6 +92,7 @@ #endif #if defined(OS_MAC) +#include "services/device/public/cpp/geolocation/geolocation_manager.h" #include "shell/browser/ui/cocoa/views_delegate_mac.h" #else #include "shell/browser/ui/views/electron_views_delegate.h" @@ -543,6 +544,12 @@ ElectronBrowserMainParts::GetGeolocationControl() { return geolocation_control_.get(); } +#if defined(OS_MAC) +device::GeolocationManager* ElectronBrowserMainParts::GetGeolocationManager() { + return geolocation_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 427229ea6dc08..2e4926ea1ec95 100644 --- a/shell/browser/electron_browser_main_parts.h +++ b/shell/browser/electron_browser_main_parts.h @@ -40,6 +40,10 @@ class GtkUiPlatform; } #endif +namespace device { +class GeolocationManager; +} // namespace device + namespace electron { class ElectronBrowserContext; @@ -84,6 +88,10 @@ class ElectronBrowserMainParts : public content::BrowserMainParts { // used to enable the location services once per client. device::mojom::GeolocationControl* GetGeolocationControl(); +#if defined(OS_MAC) + device::GeolocationManager* GetGeolocationManager(); +#endif + // Returns handle to the class responsible for extracting file icons. IconManager* GetIconManager(); @@ -162,6 +170,10 @@ class ElectronBrowserMainParts : public content::BrowserMainParts { mojo::Remote geolocation_control_; +#if defined(OS_MAC) + std::unique_ptr geolocation_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 1bc9651f71dfa..f280f66579f06 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_manager_impl_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,8 @@ [[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"]; + + geolocation_manager_ = device::GeolocationManagerImpl::Create(); } void ElectronBrowserMainParts::FreeAppDelegate() {