From 8565ed8855fb65dd2db08f7cd901addce2a5ffe2 Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Fri, 3 Dec 2021 12:11:06 +0100 Subject: Fix crash with disabled geolocation on macOS QtWebEngine uses custom LocationProvider for geolocation. If geolocation is disabled, Chromium fallbacks to NetworkLocationProvider. NetworkLocationProvider uses GeolocationSystemPermissionManager and tThere is no nullptr check for the manager instance so QtWebEngine has to provide it. This fix implements a FakeSystemGeolocationPermissionManager what is meant to be used only on macOS if geolocation is disabled. LocationSystemPermissionStatus is always set to denied by the fake manager. Change-Id: I25d51c9ce8911b95ff69cc72bc6aae7023e7edbe Reviewed-by: Allan Sandfeld Jensen (cherry picked from commit ca1074f7d0b91ccb9290acbfe51ecab54ad2efb9) --- src/core/browser_main_parts_qt.cpp | 26 ++++++++++++++++++++++++++ src/core/browser_main_parts_qt.h | 11 +++++++++++ src/core/content_browser_client_qt.cpp | 15 ++++++++++++++- src/core/content_browser_client_qt.h | 10 +++++++++- 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/core/browser_main_parts_qt.cpp b/src/core/browser_main_parts_qt.cpp index 46d472abb..6facacc00 100644 --- a/src/core/browser_main_parts_qt.cpp +++ b/src/core/browser_main_parts_qt.cpp @@ -81,6 +81,7 @@ #if defined(OS_MAC) #include "base/message_loop/message_pump_mac.h" +#include "services/device/public/cpp/geolocation/geolocation_system_permission_mac.h" #include "ui/base/idle/idle.h" #endif @@ -219,6 +220,21 @@ private: QWebEngineMessagePumpScheduler m_scheduler; }; +#if defined(OS_MAC) +class FakeSystemGeolocationPermissionManager : public device::GeolocationSystemPermissionManager +{ +public: + FakeSystemGeolocationPermissionManager() = default; + ~FakeSystemGeolocationPermissionManager() override = default; + + // GeolocationSystemPermissionManager implementation: + device::LocationSystemPermissionStatus GetSystemPermission() override + { + return device::LocationSystemPermissionStatus::kDenied; + } +}; +#endif // defined(OS_MAC) + std::unique_ptr messagePumpFactory() { static bool madePrimaryPump = false; @@ -243,6 +259,9 @@ int BrowserMainPartsQt::PreEarlyInitialization() void BrowserMainPartsQt::PreMainMessageLoopStart() { +#if defined(OS_MAC) + m_locationPermissionManager = std::make_unique(); +#endif } void BrowserMainPartsQt::PreMainMessageLoopRun() @@ -300,4 +319,11 @@ void BrowserMainPartsQt::PostCreateThreads() performance_manager_registry_ = performance_manager::PerformanceManagerRegistry::Create(); } +#if defined(OS_MAC) +device::GeolocationSystemPermissionManager *BrowserMainPartsQt::GetLocationPermissionManager() +{ + return m_locationPermissionManager.get(); +} +#endif + } // namespace QtWebEngineCore diff --git a/src/core/browser_main_parts_qt.h b/src/core/browser_main_parts_qt.h index 9d0967612..5261207fc 100644 --- a/src/core/browser_main_parts_qt.h +++ b/src/core/browser_main_parts_qt.h @@ -50,6 +50,10 @@ namespace content { class ServiceManagerConnection; } +namespace device { +class GeolocationSystemPermissionManager; +} + namespace performance_manager { class PerformanceManager; class PerformanceManagerRegistry; @@ -72,10 +76,17 @@ public: int PreCreateThreads() override; void PostCreateThreads() override; +#if defined(OS_MAC) + device::GeolocationSystemPermissionManager *GetLocationPermissionManager(); +#endif + private: DISALLOW_COPY_AND_ASSIGN(BrowserMainPartsQt); std::unique_ptr performance_manager_; std::unique_ptr performance_manager_registry_; +#if defined(OS_MAC) + std::unique_ptr m_locationPermissionManager; +#endif }; } // namespace QtWebEngineCore diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index f8d1afe10..9c6787340 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -73,6 +73,7 @@ #include "mojo/public/cpp/bindings/self_owned_associated_receiver.h" #include "net/ssl/client_cert_identity.h" #include "net/ssl/client_cert_store.h" +#include "services/device/public/cpp/geolocation/geolocation_system_permission_mac.h" #include "services/network/network_service.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" #include "third_party/blink/public/common/loader/url_loader_throttle.h" @@ -229,7 +230,10 @@ ContentBrowserClientQt::~ContentBrowserClientQt() std::unique_ptr ContentBrowserClientQt::CreateBrowserMainParts(const content::MainFunctionParams&) { - return std::make_unique(); + Q_ASSERT(!m_browserMainParts); + auto browserMainParts = std::make_unique(); + m_browserMainParts = browserMainParts.get(); + return browserMainParts; } void ContentBrowserClientQt::RenderProcessWillLaunch(content::RenderProcessHost *host) @@ -594,6 +598,15 @@ std::unique_ptr ContentBrowserClientQt::OverrideSystem } #endif +device::GeolocationSystemPermissionManager *ContentBrowserClientQt::GetLocationPermissionManager() +{ +#if defined(OS_MAC) + return m_browserMainParts->GetLocationPermissionManager(); +#else + return nullptr; +#endif +} + bool ContentBrowserClientQt::ShouldEnableStrictSiteIsolation() { // mirroring AwContentBrowserClient, CastContentBrowserClient and diff --git a/src/core/content_browser_client_qt.h b/src/core/content_browser_client_qt.h index 94ee69bf1..b6e78e852 100644 --- a/src/core/content_browser_client_qt.h +++ b/src/core/content_browser_client_qt.h @@ -58,7 +58,11 @@ class ResourceContext; class WebContents; struct MainFunctionParams; struct Referrer; -} +} // namespace content + +namespace device { +class GeolocationSystemPermissionManager; +} // namespace device namespace gl { class GLShareGroup; @@ -66,6 +70,7 @@ class GLShareGroup; namespace QtWebEngineCore { +class BrowserMainPartsQt; class ShareGroupQt; class ContentBrowserClientQt : public content::ContentBrowserClient @@ -164,6 +169,8 @@ public: #if QT_CONFIG(webengine_geolocation) std::unique_ptr OverrideSystemLocationProvider() override; #endif + device::GeolocationSystemPermissionManager *GetLocationPermissionManager() override; + bool ShouldIsolateErrorPage(bool in_main_frame) override; bool ShouldUseProcessPerSite(content::BrowserContext *browser_context, const GURL &effective_url) override; bool DoesSiteRequireDedicatedProcess(content::BrowserContext *browser_context, @@ -262,6 +269,7 @@ public: private: scoped_refptr m_shareGroupQt; + BrowserMainPartsQt *m_browserMainParts = nullptr; }; } // namespace QtWebEngineCore -- cgit v1.2.3