예제 #1
0
void
AudioDestinationNode::CreateAudioChannelAgent()
{
  if (mIsOffline || !UseAudioChannelService()) {
    return;
  }

  if (mAudioChannelAgent) {
    mAudioChannelAgent->NotifyStoppedPlaying();
  }

  mAudioChannelAgent = new AudioChannelAgent();
  mAudioChannelAgent->InitWithWeakCallback(GetOwner(),
                                           static_cast<int32_t>(mAudioChannel),
                                           this);

  // The AudioChannelAgent must start playing immediately in order to avoid
  // race conditions with mozinterruptbegin/end events.
  InputMuted(false);
}
bool
AudioDestinationNode::CheckAudioChannelPermissions(AudioChannel aValue)
{
    if (!UseAudioChannelService()) {
        return true;
    }

    // Only normal channel doesn't need permission.
    if (aValue == AudioChannel::Normal) {
        return true;
    }

    // Maybe this audio channel is equal to the default one.
    if (aValue == AudioChannelService::GetDefaultAudioChannel()) {
        return true;
    }

    nsCOMPtr<nsIPermissionManager> permissionManager =
        services::GetPermissionManager();
    if (!permissionManager) {
        return false;
    }

    nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(GetOwner());
    NS_ASSERTION(sop, "Window didn't QI to nsIScriptObjectPrincipal!");
    nsCOMPtr<nsIPrincipal> principal = sop->GetPrincipal();

    uint32_t perm = nsIPermissionManager::UNKNOWN_ACTION;

    nsCString channel;
    channel.AssignASCII(AudioChannelValues::strings[uint32_t(aValue)].value,
                        AudioChannelValues::strings[uint32_t(aValue)].length);
    permissionManager->TestExactPermissionFromPrincipal(principal,
            nsCString(NS_LITERAL_CSTRING("audio-channel-") + channel).get(),
            &perm);

    return perm == nsIPermissionManager::ALLOW_ACTION;
}