diff --git a/dom/media/MediaRecorder.cpp b/dom/media/MediaRecorder.cpp index f616a69fa06..d2725d914c4 100644 --- a/dom/media/MediaRecorder.cpp +++ b/dom/media/MediaRecorder.cpp @@ -20,6 +20,7 @@ #include "mozilla/dom/VideoStreamTrack.h" #include "nsError.h" #include "nsIDocument.h" +#include "nsIPermissionManager.h" #include "nsIPrincipal.h" #include "nsMimeTypes.h" #include "nsProxyRelease.h" @@ -545,6 +546,33 @@ private: } } + bool Check3gppPermission() + { + nsCOMPtr doc = mRecorder->GetOwner()->GetExtantDoc(); + if (!doc) { + return false; + } + + uint16_t appStatus = nsIPrincipal::APP_STATUS_NOT_INSTALLED; + doc->NodePrincipal()->GetAppStatus(&appStatus); + + // Certified applications can always assign AUDIO_3GPP + if (appStatus == nsIPrincipal::APP_STATUS_CERTIFIED) { + return true; + } + + nsCOMPtr pm = + do_GetService(NS_PERMISSIONMANAGER_CONTRACTID); + + if (!pm) { + return false; + } + + uint32_t perm = nsIPermissionManager::DENY_ACTION; + pm->TestExactPermissionFromPrincipal(doc->NodePrincipal(), "audio-capture:3gpp", &perm); + return perm == nsIPermissionManager::ALLOW_ACTION; + } + void InitEncoder(uint8_t aTrackTypes) { LOG(PR_LOG_DEBUG, ("Session.InitEncoder %p", this)); @@ -553,14 +581,8 @@ private: // Allocate encoder and bind with union stream. // At this stage, the API doesn't allow UA to choose the output mimeType format. - nsCOMPtr doc = mRecorder->GetOwner()->GetExtantDoc(); - uint16_t appStatus = nsIPrincipal::APP_STATUS_NOT_INSTALLED; - if (doc) { - doc->NodePrincipal()->GetAppStatus(&appStatus); - } - // Only allow certificated application can assign AUDIO_3GPP - if (appStatus == nsIPrincipal::APP_STATUS_CERTIFIED && - mRecorder->mMimeType.EqualsLiteral(AUDIO_3GPP)) { + // Make sure the application has permission to assign AUDIO_3GPP + if (mRecorder->mMimeType.EqualsLiteral(AUDIO_3GPP) && Check3gppPermission()) { mEncoder = MediaEncoder::CreateEncoder(NS_LITERAL_STRING(AUDIO_3GPP), aTrackTypes); } else { mEncoder = MediaEncoder::CreateEncoder(NS_LITERAL_STRING(""), aTrackTypes); diff --git a/dom/media/MediaRecorder.h b/dom/media/MediaRecorder.h index fbfb3595a5f..dad6fdfe306 100644 --- a/dom/media/MediaRecorder.h +++ b/dom/media/MediaRecorder.h @@ -148,6 +148,8 @@ private: // Register MediaRecorder into Document to listen the activity changes. void RegisterActivityObserver(); void UnRegisterActivityObserver(); + + bool Check3gppPermission(); }; }