mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-08 12:19:05 +02:00
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
95 lines
3.3 KiB
C++
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;
|
|
}
|