Skip to content

Commit

Permalink
fix: geolocation crashes electron on macOS (#29343) (#29912)
Browse files Browse the repository at this point in the history
  • Loading branch information
omarkilani committed Jun 29, 2021
1 parent 50b0750 commit b465ee7
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 1 deletion.
17 changes: 16 additions & 1 deletion shell/browser/electron_browser_client.cc
Expand Up @@ -1107,7 +1107,13 @@ ElectronBrowserClient::GetSystemNetworkContext() {
std::unique_ptr<content::BrowserMainParts>
ElectronBrowserClient::CreateBrowserMainParts(
const content::MainFunctionParams& params) {
return std::make_unique<ElectronBrowserMainParts>(params);
auto browser_main_parts = std::make_unique<ElectronBrowserMainParts>(params);

#if defined(OS_MAC)
browser_main_parts_ = browser_main_parts.get();
#endif

return browser_main_parts;
}

void ElectronBrowserClient::WebNotificationAllowed(
Expand Down Expand Up @@ -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
8 changes: 8 additions & 0 deletions shell/browser/electron_browser_client.h
Expand Up @@ -33,6 +33,7 @@ class SSLCertRequestInfo;

namespace electron {

class ElectronBrowserMainParts;
class NotificationPresenter;
class PlatformNotificationService;

Expand Down Expand Up @@ -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*
Expand Down Expand Up @@ -342,6 +346,10 @@ class ElectronBrowserClient : public content::ContentBrowserClient,
std::unique_ptr<ElectronSerialDelegate> serial_delegate_;
std::unique_ptr<ElectronBluetoothDelegate> bluetooth_delegate_;

#if defined(OS_MAC)
ElectronBrowserMainParts* browser_main_parts_ = nullptr;
#endif

DISALLOW_COPY_AND_ASSIGN(ElectronBrowserClient);
};

Expand Down
8 changes: 8 additions & 0 deletions shell/browser/electron_browser_main_parts.cc
Expand Up @@ -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"
Expand Down Expand Up @@ -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())
Expand Down
13 changes: 13 additions & 0 deletions shell/browser/electron_browser_main_parts.h
Expand Up @@ -36,6 +36,10 @@ class GtkUiDelegate;
}
#endif

namespace device {
class GeolocationSystemPermissionManager;
} // namespace device

namespace electron {

class ElectronBrowserContext;
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -161,6 +169,11 @@ class ElectronBrowserMainParts : public content::BrowserMainParts {

mojo::Remote<device::mojom::GeolocationControl> geolocation_control_;

#if defined(OS_MAC)
std::unique_ptr<device::GeolocationSystemPermissionManager>
location_permission_manager_;
#endif

static ElectronBrowserMainParts* self_;

DISALLOW_COPY_AND_ASSIGN(ElectronBrowserMainParts);
Expand Down
4 changes: 4 additions & 0 deletions shell/browser/electron_browser_main_parts_mac.mm
Expand Up @@ -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"
Expand All @@ -27,6 +28,9 @@
[[NSUserDefaults standardUserDefaults]
setObject:@"NO"
forKey:@"NSTreatUnknownArgumentsAsOpen"];

location_permission_manager_ =
device::GeolocationSystemPermissionManager::Create();
}

void ElectronBrowserMainParts::FreeAppDelegate() {
Expand Down

0 comments on commit b465ee7

Please sign in to comment.