From 83c142df91eedbbf82e928bde6398fcc89e3ab62 Mon Sep 17 00:00:00 2001 From: Omar Kilani Date: Sun, 27 Jun 2021 19:24:01 -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 42399914dd7f5..6ef87068ba7db 100644 --- a/shell/browser/electron_browser_client.cc +++ b/shell/browser/electron_browser_client.cc @@ -882,7 +882,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( @@ -1618,4 +1624,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 682ed5630e32e..f14339cc1a771 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* @@ -299,6 +302,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 8b4cc4cdac9f9..07b2bd9bff670 100644 --- a/shell/browser/electron_browser_main_parts.cc +++ b/shell/browser/electron_browser_main_parts.cc @@ -93,6 +93,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" @@ -553,6 +554,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 0f9f12320820a..1da21556fbd3c 100644 --- a/shell/browser/electron_browser_main_parts.h +++ b/shell/browser/electron_browser_main_parts.h @@ -39,6 +39,10 @@ class GtkUiPlatform; } #endif +namespace device { +class GeolocationManager; +} // namespace device + namespace electron { class ElectronBrowserContext; @@ -83,6 +87,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(); @@ -161,6 +169,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() {