#pragma once
#if ENABLE(MEDIA_STREAM)
#include "ActiveDOMObject.h"
#include "EventNames.h"
#include "EventTarget.h"
#include "ExceptionOr.h"
#include "JSDOMPromiseDeferred.h"
#include "MediaTrackConstraints.h"
#include "RealtimeMediaSourceCenter.h"
#include "Timer.h"
#include <wtf/WeakPtr.h>
namespace WebCore {
class Document;
class MediaDeviceInfo;
class MediaStream;
struct MediaTrackSupportedConstraints;
class MediaDevices : public RefCounted<MediaDevices>, public ActiveDOMObject, public EventTargetWithInlineData, public CanMakeWeakPtr<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;
};
ExceptionOr<void> getUserMedia(const StreamConstraints&, Promise&&) const;
ExceptionOr<void> getDisplayMedia(const StreamConstraints&, Promise&&) const;
void enumerateDevices(EnumerateDevicesPromise&&) const;
MediaTrackSupportedConstraints getSupportedConstraints();
using RefCounted<MediaDevices>::ref;
using RefCounted<MediaDevices>::deref;
private:
explicit MediaDevices(Document&);
void scheduledEventTimerFired();
friend class JSMediaDevicesOwner;
const char* activeDOMObjectName() const final;
bool canSuspendForDocumentSuspension() const final;
void stop() final;
bool hasPendingActivity() const final;
EventTargetInterface eventTargetInterface() const final { return MediaDevicesEventTargetInterfaceType; }
ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
void refEventTarget() final { ref(); }
void derefEventTarget() final { deref(); }
Timer m_scheduledEventTimer;
RealtimeMediaSourceCenter::DevicesChangedObserverToken m_deviceChangedToken;
const EventNames& m_eventNames; };
}
#endif // ENABLE(MEDIA_STREAM)