diff --git a/dom/geolocation/nsGeolocation.cpp b/dom/geolocation/nsGeolocation.cpp index b2de06b0372c..bdafc228fbcf 100644 --- a/dom/geolocation/nsGeolocation.cpp +++ b/dom/geolocation/nsGeolocation.cpp @@ -30,6 +30,7 @@ #include "nsIObserverService.h" #include "nsIScriptError.h" #include "nsPIDOMWindow.h" +#include "nsIXULRuntime.h" #include "nsServiceManagerUtils.h" #include "nsThreadUtils.h" #include "nsXULAppAPI.h" @@ -1216,22 +1217,57 @@ void Geolocation::NotifyAllowedRequest(nsGeolocationRequest* aRequest) { } } -bool Geolocation::RegisterRequestWithPrompt(nsGeolocationRequest* request) { +bool Geolocation::RegisterRequestWithPromptImpl( + nsGeolocationRequest* aRequest) { nsIEventTarget* target = MainThreadTarget(this); - ContentPermissionRequestBase::PromptResult pr = request->CheckPromptPrefs(); + ContentPermissionRequestBase::PromptResult pr = aRequest->CheckPromptPrefs(); if (pr == ContentPermissionRequestBase::PromptResult::Granted) { - request->RequestDelayedTask(target, - nsGeolocationRequest::DelayedTaskType::Allow); + aRequest->RequestDelayedTask(target, + nsGeolocationRequest::DelayedTaskType::Allow); return true; } if (pr == ContentPermissionRequestBase::PromptResult::Denied) { - request->RequestDelayedTask(target, - nsGeolocationRequest::DelayedTaskType::Deny); + aRequest->RequestDelayedTask(target, + nsGeolocationRequest::DelayedTaskType::Deny); return true; } - request->RequestDelayedTask(target, - nsGeolocationRequest::DelayedTaskType::Request); + aRequest->RequestDelayedTask(target, + nsGeolocationRequest::DelayedTaskType::Request); + return true; +} + +bool Geolocation::RegisterRequestWithPrompt(nsGeolocationRequest* request) { + if (XRE_IsParentProcess()) { +#ifdef MOZ_WIDGET_COCOA + if (!isMacGeoSystemPermissionEnabled()) { + return false; + } +#endif + return RegisterRequestWithPromptImpl(request); + } + + RefPtr self = this; + RefPtr req = request; + nsCOMPtr serialTarget = + SystemGroup::EventTargetFor(TaskCategory::Other); + ContentChild* cpc = ContentChild::GetSingleton(); + cpc->SendGetGeoSysPermission()->Then( + serialTarget, __func__, + [req, self](bool aSysPermIsGranted) { + if (!aSysPermIsGranted) { + nsIEventTarget* target = MainThreadTarget(self); + req->RequestDelayedTask(target, + nsGeolocationRequest::DelayedTaskType::Deny); + } else { + self->RegisterRequestWithPromptImpl(req); + } + }, + [req, self](mozilla::ipc::ResponseRejectReason aReason) { + nsIEventTarget* target = MainThreadTarget(self); + req->RequestDelayedTask(target, + nsGeolocationRequest::DelayedTaskType::Deny); + }); return true; } diff --git a/dom/geolocation/nsGeolocation.h b/dom/geolocation/nsGeolocation.h index 5c991368a8a7..43f2a35340e8 100644 --- a/dom/geolocation/nsGeolocation.h +++ b/dom/geolocation/nsGeolocation.h @@ -197,6 +197,8 @@ class Geolocation final : public nsIGeolocationUpdate, public nsWrapperCache { bool RegisterRequestWithPrompt(nsGeolocationRequest* request); + bool RegisterRequestWithPromptImpl(nsGeolocationRequest* aRequest); + // Check if clearWatch is already called bool IsAlreadyCleared(nsGeolocationRequest* aRequest); diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp index 9af5030b0c18..b7952aa022bf 100644 --- a/dom/ipc/ContentParent.cpp +++ b/dom/ipc/ContentParent.cpp @@ -236,6 +236,7 @@ #if defined(XP_MACOSX) # include "nsMacUtilsImpl.h" +# include "CoreLocationLocationProvider.h" #endif #if defined(ANDROID) || defined(LINUX) @@ -4067,6 +4068,16 @@ mozilla::ipc::IPCResult ContentParent::RecvAddGeolocationListener( return IPC_OK(); } +mozilla::ipc::IPCResult ContentParent::RecvGetGeoSysPermission( + std::function&& aCallback) { +#ifdef MOZ_WIDGET_COCOA + aCallback(isMacGeoSystemPermissionEnabled()); +#else + aCallback(true); +#endif + return IPC_OK(); +} + mozilla::ipc::IPCResult ContentParent::RecvRemoveGeolocationListener() { if (mGeolocationWatchID != -1) { RefPtr geo = Geolocation::NonWindowSingleton(); diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h index 123c0ecca2ff..6f15ffb53f41 100644 --- a/dom/ipc/ContentParent.h +++ b/dom/ipc/ContentParent.h @@ -1000,6 +1000,9 @@ class ContentParent final : public PContentParent, const IPC::Principal& aPrincipal, const bool& aHighAccuracy); mozilla::ipc::IPCResult RecvRemoveGeolocationListener(); + mozilla::ipc::IPCResult RecvGetGeoSysPermission( + std::function&& aCallback); + // MOZ_CAN_RUN_SCRIPT_BOUNDARY because we don't have MOZ_CAN_RUN_SCRIPT bits // in IPC code yet. MOZ_CAN_RUN_SCRIPT_BOUNDARY diff --git a/dom/ipc/PContent.ipdl b/dom/ipc/PContent.ipdl index 4fbe31dd518e..f1dcc723cfd3 100644 --- a/dom/ipc/PContent.ipdl +++ b/dom/ipc/PContent.ipdl @@ -960,6 +960,8 @@ parent: async RemoveGeolocationListener(); async SetGeolocationHigherAccuracy(bool enable); + async GetGeoSysPermission() returns (bool isok); + async ConsoleMessage(nsString message); async ScriptError(nsString message, nsString sourceName, nsString sourceLine, uint32_t lineNumber, uint32_t colNumber, uint32_t flags, diff --git a/dom/system/mac/CoreLocationLocationProvider.h b/dom/system/mac/CoreLocationLocationProvider.h index 6f13c3cab92c..1e9137d9e252 100644 --- a/dom/system/mac/CoreLocationLocationProvider.h +++ b/dom/system/mac/CoreLocationLocationProvider.h @@ -25,6 +25,8 @@ class CoreLocationObjects; class MLSFallback; +bool isMacGeoSystemPermissionEnabled(); + class CoreLocationLocationProvider : public nsIGeolocationProvider { public: NS_DECL_ISUPPORTS diff --git a/dom/system/mac/CoreLocationLocationProvider.mm b/dom/system/mac/CoreLocationLocationProvider.mm index 5d56780682ad..d65b2054ddef 100644 --- a/dom/system/mac/CoreLocationLocationProvider.mm +++ b/dom/system/mac/CoreLocationLocationProvider.mm @@ -32,6 +32,8 @@ using namespace mozilla; static const CLLocationAccuracy kHIGH_ACCURACY = kCLLocationAccuracyBest; static const CLLocationAccuracy kDEFAULT_ACCURACY = kCLLocationAccuracyNearestTenMeters; +bool isMacGeoSystemPermissionEnabled() { return [CLLocationManager locationServicesEnabled]; } + @interface LocationDelegate : NSObject { CoreLocationLocationProvider* mProvider; } diff --git a/dom/system/mac/moz.build b/dom/system/mac/moz.build index 8fb85bbe309e..a9596053821d 100644 --- a/dom/system/mac/moz.build +++ b/dom/system/mac/moz.build @@ -10,6 +10,7 @@ SOURCES += [ ] EXPORTS += [ + 'CoreLocationLocationProvider.h', 'nsOSPermissionRequest.h', ]