#pragma once
#if ENABLE(MEDIA_STREAM)
#include "ActiveDOMObject.h"
#include "EventNames.h"
#include "EventTarget.h"
#include "ExceptionOr.h"
#include "IDLTypes.h"
#include "MediaTrackConstraints.h"
#include "RealtimeMediaSourceCenter.h"
#include "Timer.h"
#include "UserMediaClient.h"
#include <wtf/WeakPtr.h>
namespace WebCore {
class Document;
class MediaDeviceInfo;
class MediaStream;
class UserGestureToken;
struct MediaTrackSupportedConstraints;
template<typename IDLType> class DOMPromiseDeferred;
class MediaDevices final : public RefCounted<MediaDevices>, public ActiveDOMObject, public EventTargetWithInlineData, public CanMakeWeakPtr<MediaDevices> {
WTF_MAKE_ISO_ALLOCATED(MediaDevices);
public:
static Ref<MediaDevices> create(Document&);
~MediaDevices();
Document* document() const;
using Promise = DOMPromiseDeferred<IDLInterface<MediaStream>>;
using EnumerateDevicesPromise = DOMPromiseDeferred<IDLSequence<IDLInterface<MediaDeviceInfo>>>;
enum class DisplayCaptureSurfaceType {
Monitor,
Window,
Application,
Browser,
};
struct StreamConstraints {
Variant<bool, MediaTrackConstraints> video;
Variant<bool, MediaTrackConstraints> audio;
};
void getUserMedia(const StreamConstraints&, Promise&&);
struct DisplayMediaStreamConstraints {
Variant<bool, MediaTrackConstraints> video;
Variant<bool, MediaTrackConstraints> audio;
};
void getDisplayMedia(const DisplayMediaStreamConstraints&, Promise&&);
void enumerateDevices(EnumerateDevicesPromise&&);
MediaTrackSupportedConstraints getSupportedConstraints();
String deviceIdToPersistentId(const String& deviceId) const { return m_audioOutputDeviceIdToPersistentId.get(deviceId); }
using RefCounted<MediaDevices>::ref;
using RefCounted<MediaDevices>::deref;
private:
explicit MediaDevices(Document&);
void scheduledEventTimerFired();
bool addEventListener(const AtomString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) override;
void exposeDevices(const Vector<CaptureDevice>&, const String&, EnumerateDevicesPromise&&);
void listenForDeviceChanges();
friend class JSMediaDevicesOwner;
const char* activeDOMObjectName() const final;
void stop() final;
bool virtualHasPendingActivity() const final;
EventTargetInterface eventTargetInterface() const final { return MediaDevicesEventTargetInterfaceType; }
ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
void refEventTarget() final { ref(); }
void derefEventTarget() final { deref(); }
enum class GestureAllowedRequest {
Microphone = 1 << 0,
Camera = 1 << 1,
Display = 1 << 2,
};
bool computeUserGesturePriviledge(GestureAllowedRequest);
Timer m_scheduledEventTimer;
UserMediaClient::DeviceChangeObserverToken m_deviceChangeToken;
const EventNames& m_eventNames; bool m_listeningForDeviceChanges { false };
String m_groupIdHashSalt;
OptionSet<GestureAllowedRequest> m_requestTypesForCurrentGesture;
WeakPtr<UserGestureToken> m_currentGestureToken;
HashMap<String, String> m_audioOutputDeviceIdToPersistentId;
String m_audioOutputDeviceId;
};
}
#endif // ENABLE(MEDIA_STREAM)