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; }