forked from mirrors/gecko-dev
MIDI ports will be kept alive even without direct JS references to it under the following conditions: * They've not been explicitly closed (they're open or waiting to be) * A statechange listener is present * A midimessage listener is present for input ports only * They've not been disconnected from their owner, when they are we implicitly close them MIDI access objects will be kept alive even without direct JS references to it under the following conditions: * A statechange listener is present * They've not been disconnected from their owner Finally whenever a MIDI port is in use we disable the bfcache on the document. Differential Revision: https://phabricator.services.mozilla.com/D131352
54 lines
1.6 KiB
C++
54 lines
1.6 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/. */
|
|
|
|
#ifndef mozilla_dom_MIDIInput_h
|
|
#define mozilla_dom_MIDIInput_h
|
|
|
|
#include "mozilla/dom/MIDIPort.h"
|
|
|
|
struct JSContext;
|
|
|
|
namespace mozilla::dom {
|
|
|
|
class MIDIPortInfo;
|
|
|
|
/**
|
|
* Represents a MIDI Input Port, handles generating incoming message events.
|
|
*
|
|
*/
|
|
class MIDIInput final : public MIDIPort {
|
|
public:
|
|
static MIDIInput* Create(nsPIDOMWindowInner* aWindow,
|
|
MIDIAccess* aMIDIAccessParent,
|
|
const MIDIPortInfo& aPortInfo,
|
|
const bool aSysexEnabled);
|
|
~MIDIInput() = default;
|
|
|
|
JSObject* WrapObject(JSContext* aCx,
|
|
JS::Handle<JSObject*> aGivenProto) override;
|
|
|
|
IMPL_EVENT_HANDLER(midimessage);
|
|
|
|
void StateChange() override;
|
|
void EventListenerAdded(nsAtom* aType) override;
|
|
void DisconnectFromOwner() override;
|
|
|
|
private:
|
|
MIDIInput(nsPIDOMWindowInner* aWindow, MIDIAccess* aMIDIAccessParent);
|
|
// Takes an array of IPC MIDIMessage objects and turns them into
|
|
// MIDIMessageEvents, which it then fires.
|
|
void Receive(const nsTArray<MIDIMessage>& aMsgs) override;
|
|
|
|
void KeepAliveOnMidimessage();
|
|
void DontKeepAliveOnMidimessage();
|
|
|
|
// If true this object will be kept alive even without direct JS references
|
|
bool mKeepAlive;
|
|
};
|
|
|
|
} // namespace mozilla::dom
|
|
|
|
#endif // mozilla_dom_MIDIInput_h
|