Bug 1197461 - e10s support for Permissions.revoke. r=poiru

This commit is contained in:
Marco Castelluccio 2016-03-02 21:09:48 +00:00
parent ff693ea459
commit 991a1d63b2
6 changed files with 46 additions and 1 deletions

View File

@ -67,6 +67,7 @@
#include "mozilla/dom/mobileconnection/MobileConnectionParent.h"
#include "mozilla/dom/mobilemessage/SmsParent.h"
#include "mozilla/dom/power/PowerManagerService.h"
#include "mozilla/dom/Permissions.h"
#include "mozilla/dom/PresentationParent.h"
#include "mozilla/dom/PPresentationParent.h"
#include "mozilla/dom/quota/QuotaManagerService.h"
@ -1053,6 +1054,14 @@ ContentParent::RecvUngrabPointer(const uint32_t& aTime)
#endif
}
bool
ContentParent::RecvRemovePermission(const IPC::Principal& aPrincipal,
const nsCString& aPermissionType,
nsresult* aRv) {
*aRv = Permissions::RemovePermission(aPrincipal, aPermissionType.get());
return true;
}
bool
ContentParent::RecvConnectPluginBridge(const uint32_t& aPluginId, nsresult* aRv)
{

View File

@ -213,6 +213,10 @@ public:
virtual bool RecvUngrabPointer(const uint32_t& aTime) override;
virtual bool RecvRemovePermission(const IPC::Principal& aPrincipal,
const nsCString& aPermissionType,
nsresult* aRv) override;
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(ContentParent, nsIObserver)
NS_DECL_CYCLE_COLLECTING_ISUPPORTS

View File

@ -1190,6 +1190,8 @@ parent:
* chrome process as that's the process that receives the pointer event.
*/
sync UngrabPointer(uint32_t time);
sync RemovePermission(Principal principal, nsCString permissionType) returns (nsresult rv);
both:
async AsyncMessage(nsString aMessage, ClonedMessageData aData,
CpowEntry[] aCpows, Principal aPrincipal);

View File

@ -6,6 +6,7 @@
#include "mozilla/dom/Permissions.h"
#include "mozilla/dom/ContentChild.h"
#include "mozilla/dom/PermissionsBinding.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/Services.h"
@ -121,6 +122,19 @@ Permissions::Query(JSContext* aCx,
return promise.forget();
}
/* static */ nsresult
Permissions::RemovePermission(nsIPrincipal* aPrincipal, const char* aPermissionType)
{
MOZ_ASSERT(XRE_IsParentProcess());
nsCOMPtr<nsIPermissionManager> permMgr = services::GetPermissionManager();
if (NS_WARN_IF(!permMgr)) {
return NS_ERROR_FAILURE;
}
return permMgr->RemoveFromPrincipal(aPrincipal, aPermissionType);
}
already_AddRefed<Promise>
Permissions::Revoke(JSContext* aCx,
JS::Handle<JSObject*> aPermission,
@ -156,7 +170,19 @@ Permissions::Revoke(JSContext* aCx,
return promise.forget();
}
nsresult rv = permMgr->RemoveFromPrincipal(document->NodePrincipal(), PermissionNameToType(permission.mName));
const char* permissionType = PermissionNameToType(permission.mName);
nsresult rv;
if (XRE_IsParentProcess()) {
rv = RemovePermission(document->NodePrincipal(), permissionType);
} else {
// Permissions can't be removed from the content process. Send a message
// to the parent; `ContentParent::RecvRemovePermission` will call
// `RemovePermission`.
ContentChild::GetSingleton()->SendRemovePermission(
IPC::Principal(document->NodePrincipal()), nsDependentCString(permissionType), &rv);
}
if (NS_WARN_IF(NS_FAILED(rv))) {
promise->MaybeReject(rv);
return promise.forget();

View File

@ -38,6 +38,8 @@ public:
JS::Handle<JSObject*> aPermission,
ErrorResult& aRv);
static nsresult RemovePermission(nsIPrincipal* aPrincipal, const char* aPermissionType);
already_AddRefed<Promise> Revoke(JSContext* aCx,
JS::Handle<JSObject*> aPermission,
ErrorResult& aRv);

View File

@ -50,3 +50,5 @@ FINAL_LIBRARY = 'xul'
if CONFIG['GNU_CXX']:
CXXFLAGS += ['-Wshadow']
include('/ipc/chromium/chromium-config.mozbuild')