#pragma once
#if ENABLE(MEDIA_STREAM)
#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 ContextDestructionObserver, public EventTargetWithInlineData {
public:
static Ref<MediaDevices> create(Document&);
~MediaDevices();
Document* document() const;
using Promise = DOMPromiseDeferred<IDLInterface<MediaStream>>;
using EnumerateDevicesPromise = DOMPromiseDeferred<IDLSequence<IDLInterface<MediaDeviceInfo>>>;
struct StreamConstraints {
Variant<bool, MediaTrackConstraints> video;
Variant<bool, MediaTrackConstraints> audio;
};
ExceptionOr<void> getUserMedia(const StreamConstraints&, Promise&&) const;
void enumerateDevices(EnumerateDevicesPromise&&) const;
MediaTrackSupportedConstraints getSupportedConstraints();
using RefCounted<MediaDevices>::ref;
using RefCounted<MediaDevices>::deref;
private:
explicit MediaDevices(Document&);
void scheduledEventTimerFired();
EventTargetInterface eventTargetInterface() const override { return MediaDevicesEventTargetInterfaceType; }
ScriptExecutionContext* scriptExecutionContext() const final { return m_scriptExecutionContext; }
void refEventTarget() override { ref(); }
void derefEventTarget() override { deref(); }
WeakPtr<MediaDevices> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
Timer m_scheduledEventTimer;
std::optional<RealtimeMediaSourceCenter::DevicesChangedObserverToken> m_deviceChangedToken;
WeakPtrFactory<MediaDevices> m_weakPtrFactory;
};
}
#endif // ENABLE(MEDIA_STREAM)