Bug 1529591 - Check Mac system geo permission prior to showing request permission dialog. Differential Revision: https://phabricator.services.mozilla.com/D44881 r=jdm

Differential Revision: https://phabricator.services.mozilla.com/D45052

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Garvan Keeley 2019-09-06 22:35:59 +00:00
parent 5fbdc1ea98
commit 6036e744d1
8 changed files with 73 additions and 8 deletions

View File

@ -1216,22 +1216,65 @@ 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) {
bool isCoreLocationProvider =
#ifdef MOZ_WIDGET_COCOA
!Preferences::GetBool("geo.provider.use_mls", false) &&
!Preferences::GetBool("geo.provider.testing", false);
#else
false;
#endif
if (!isCoreLocationProvider) {
return RegisterRequestWithPromptImpl(request);
}
if (XRE_IsParentProcess()) { // non e10s mode
if (!isMacGeoSystemPermissionEnabled()) {
return false;
}
return RegisterRequestWithPromptImpl(request);
}
nsCOMPtr<nsISerialEventTarget> serialTarget =
SystemGroup::EventTargetFor(TaskCategory::Other);
ContentChild* cpc = ContentChild::GetSingleton();
cpc->SendGetGeoSysPermission()->Then(
serialTarget, __func__,
[request, this](bool aSysPermIsGranted) {
if (!aSysPermIsGranted) {
nsIEventTarget* target = MainThreadTarget(this);
request->RequestDelayedTask(
target, nsGeolocationRequest::DelayedTaskType::Deny);
} else {
RegisterRequestWithPromptImpl(request);
}
},
[request, this](mozilla::ipc::ResponseRejectReason aReason) {
nsIEventTarget* target = MainThreadTarget(this);
request->RequestDelayedTask(
target, nsGeolocationRequest::DelayedTaskType::Deny);
});
return true;
}

View File

@ -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);

View File

@ -236,6 +236,7 @@
#if defined(XP_MACOSX)
# include "nsMacUtilsImpl.h"
# include "CoreLocationLocationProvider.h"
#endif
#if defined(ANDROID) || defined(LINUX)
@ -4064,6 +4065,15 @@ mozilla::ipc::IPCResult ContentParent::RecvAddGeolocationListener(
return IPC_OK();
}
mozilla::ipc::IPCResult ContentParent::RecvGetGeoSysPermission(
std::function<void(const bool)>&& aCallback) {
#ifdef MOZ_WIDGET_COCOA
// This is only called when using the CoreLocation location provider.
aCallback(isMacGeoSystemPermissionEnabled());
#endif
return IPC_OK();
}
mozilla::ipc::IPCResult ContentParent::RecvRemoveGeolocationListener() {
if (mGeolocationWatchID != -1) {
RefPtr<Geolocation> geo = Geolocation::NonWindowSingleton();

View File

@ -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<void(const bool)>&& 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

View File

@ -959,6 +959,8 @@ parent:
async RemoveGeolocationListener();
async SetGeolocationHigherAccuracy(bool enable);
async GetGeoSysPermission() returns (bool isok);
async ConsoleMessage(nsString message);
async ScriptErrorWithStack(nsString message, nsString sourceName, nsString sourceLine,
uint32_t lineNumber, uint32_t colNumber, uint32_t flags,

View File

@ -25,6 +25,8 @@
class CoreLocationObjects;
class MLSFallback;
bool isMacGeoSystemPermissionEnabled();
class CoreLocationLocationProvider : public nsIGeolocationProvider {
public:
NS_DECL_ISUPPORTS

View File

@ -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 <CLLocationManagerDelegate> {
CoreLocationLocationProvider* mProvider;
}

View File

@ -10,6 +10,7 @@ SOURCES += [
]
EXPORTS += [
'CoreLocationLocationProvider.h',
'nsOSPermissionRequest.h',
]