gecko-dev/dom/midi/MIDIPermissionRequest.cpp
Ehsan Akhgari b5a2bda7ee Bug 1527505 - Part 9: Make nsIPermissionManager accept ACString arguments for permission types instead of raw C strings; r=nika
This will mean that in places like the tight loop in GetTypeIndex()
we would no longer require calling strlen() on the input type argument
once per loop iteration.

Depends on D20236

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

--HG--
extra : moz-landing-system : lando
2019-02-21 22:54:28 +00:00

95 lines
3.3 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/MIDIPermissionRequest.h"
#include "mozilla/dom/MIDIAccessManager.h"
#include "nsIGlobalObject.h"
#include "mozilla/Preferences.h"
#include "nsContentUtils.h"
//-------------------------------------------------
// MIDI Permission Requests
//-------------------------------------------------
NS_IMPL_CYCLE_COLLECTION_INHERITED(MIDIPermissionRequest,
ContentPermissionRequestBase, mPromise)
NS_IMPL_QUERY_INTERFACE_CYCLE_COLLECTION_INHERITED(MIDIPermissionRequest,
ContentPermissionRequestBase,
nsIRunnable)
NS_IMPL_ADDREF_INHERITED(MIDIPermissionRequest, ContentPermissionRequestBase)
NS_IMPL_RELEASE_INHERITED(MIDIPermissionRequest, ContentPermissionRequestBase)
MIDIPermissionRequest::MIDIPermissionRequest(nsPIDOMWindowInner* aWindow,
Promise* aPromise,
const MIDIOptions& aOptions)
: ContentPermissionRequestBase(
aWindow->GetDoc()->NodePrincipal(), aWindow,
NS_LITERAL_CSTRING(""), // We check prefs in a custom way here
NS_LITERAL_CSTRING("midi")),
mPromise(aPromise),
mNeedsSysex(aOptions.mSysex) {
MOZ_ASSERT(aWindow);
MOZ_ASSERT(aPromise, "aPromise should not be null!");
MOZ_ASSERT(aWindow->GetDoc());
mPrincipal = aWindow->GetDoc()->NodePrincipal();
MOZ_ASSERT(mPrincipal);
}
NS_IMETHODIMP
MIDIPermissionRequest::GetTypes(nsIArray** aTypes) {
NS_ENSURE_ARG_POINTER(aTypes);
nsTArray<nsString> options;
if (mNeedsSysex) {
options.AppendElement(NS_LITERAL_STRING("sysex"));
}
return nsContentPermissionUtils::CreatePermissionArray(mType, options,
aTypes);
}
NS_IMETHODIMP
MIDIPermissionRequest::Cancel() {
mPromise->MaybeReject(NS_ERROR_DOM_SECURITY_ERR);
return NS_OK;
}
NS_IMETHODIMP
MIDIPermissionRequest::Allow(JS::HandleValue aChoices) {
MOZ_ASSERT(aChoices.isUndefined());
MIDIAccessManager* mgr = MIDIAccessManager::Get();
mgr->CreateMIDIAccess(mWindow, mNeedsSysex, mPromise);
return NS_OK;
}
NS_IMETHODIMP
MIDIPermissionRequest::Run() {
// If the testing flag is true, skip dialog
if (Preferences::GetBool("midi.prompt.testing", false)) {
bool allow =
Preferences::GetBool("media.navigator.permission.disabled", false);
if (allow) {
Allow(JS::UndefinedHandleValue);
} else {
Cancel();
}
return NS_OK;
}
// If we already have sysex perms, allow.
if (nsContentUtils::IsExactSitePermAllow(mPrincipal,
NS_LITERAL_CSTRING("midi-sysex"))) {
Allow(JS::UndefinedHandleValue);
return NS_OK;
}
// If we have no perms, or only have midi and are asking for sysex, pop dialog
if (NS_FAILED(nsContentPermissionUtils::AskPermission(this, mWindow))) {
Cancel();
return NS_ERROR_FAILURE;
}
return NS_OK;
}