blob: 6a59e2b1b10fcc872a455f7cee9eda3779f7845b [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ImageCapture_h
#define ImageCapture_h
#include <memory>
#include "bindings/core/v8/ActiveScriptWrappable.h"
#include "bindings/core/v8/ScriptPromise.h"
#include "core/dom/ContextLifecycleObserver.h"
#include "core/events/EventTarget.h"
#include "media/capture/mojo/image_capture.mojom-blink.h"
#include "modules/EventTargetModules.h"
#include "modules/ModulesExport.h"
#include "modules/mediastream/MediaTrackCapabilities.h"
#include "modules/mediastream/MediaTrackConstraintSet.h"
#include "modules/mediastream/MediaTrackSettings.h"
#include "platform/AsyncMethodRunner.h"
namespace blink {
class ExceptionState;
class MediaStreamTrack;
class PhotoSettings;
class ScriptPromiseResolver;
class WebImageCaptureFrameGrabber;
// TODO(mcasas): Consideradding a LayoutTest checking that this class is not
// garbage collected while it has event listeners.
class MODULES_EXPORT ImageCapture final
: public EventTargetWithInlineData,
public ActiveScriptWrappable<ImageCapture>,
public ContextLifecycleObserver {
USING_GARBAGE_COLLECTED_MIXIN(ImageCapture);
DEFINE_WRAPPERTYPEINFO();
public:
static ImageCapture* create(ExecutionContext*,
MediaStreamTrack*,
ExceptionState&);
~ImageCapture() override;
// EventTarget implementation.
const AtomicString& interfaceName() const override;
ExecutionContext* getExecutionContext() const override;
// ScriptWrappable implementation.
bool hasPendingActivity() const final;
// ContextLifecycleObserver
void contextDestroyed(ExecutionContext*) override;
MediaStreamTrack* videoStreamTrack() const { return m_streamTrack.get(); }
ScriptPromise getPhotoCapabilities(ScriptState*);
ScriptPromise setOptions(ScriptState*, const PhotoSettings&);
ScriptPromise takePhoto(ScriptState*);
ScriptPromise grabFrame(ScriptState*);
MediaTrackCapabilities& getMediaTrackCapabilities();
void setMediaTrackConstraints(ScriptPromiseResolver*,
const MediaTrackConstraintSet&);
const MediaTrackConstraintSet& getMediaTrackConstraints() const;
void getMediaTrackSettings(MediaTrackSettings&) const;
DECLARE_VIRTUAL_TRACE();
private:
ImageCapture(ExecutionContext*, MediaStreamTrack*);
void onPhotoCapabilities(ScriptPromiseResolver*,
media::mojom::blink::PhotoCapabilitiesPtr);
void onSetOptions(ScriptPromiseResolver*, bool);
void onTakePhoto(ScriptPromiseResolver*, media::mojom::blink::BlobPtr);
void onCapabilitiesUpdate(media::mojom::blink::PhotoCapabilitiesPtr);
void onCapabilitiesUpdateInternal(
const media::mojom::blink::PhotoCapabilities&);
void onServiceConnectionError();
Member<MediaStreamTrack> m_streamTrack;
std::unique_ptr<WebImageCaptureFrameGrabber> m_frameGrabber;
media::mojom::blink::ImageCapturePtr m_service;
MediaTrackCapabilities m_capabilities;
MediaTrackSettings m_settings;
MediaTrackConstraintSet m_currentConstraints;
HeapHashSet<Member<ScriptPromiseResolver>> m_serviceRequests;
};
} // namespace blink
#endif // ImageCapture_h