blob: 7fd38179854cb493dc259ca47331a11679e1c9ae [file] [log] [blame] [edit]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_PUBLIC_BROWSER_MEDIA_STREAM_REQUEST_H_
#define CONTENT_PUBLIC_BROWSER_MEDIA_STREAM_REQUEST_H_
#include <memory>
#include "base/functional/callback_forward.h"
#include "build/build_config.h"
#include "content/common/content_export.h"
#include "content/public/browser/desktop_media_id.h"
#include "third_party/blink/public/common/mediastream/media_stream_request.h"
#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/native_ui_types.h"
#include "url/gurl.h"
namespace content {
// Represents a request for media streams (audio/video).
// TODO(vrk,justinlin,wjia): Figure out a way to share this code cleanly between
// vanilla WebRTC, Tab Capture, and Pepper Video Capture. Right now there is
// Tab-only stuff and Pepper-only stuff being passed around to all clients,
// which is icky.
struct CONTENT_EXPORT MediaStreamRequest {
MediaStreamRequest(int render_process_id,
int render_frame_id,
int page_request_id,
const url::Origin& url_origin,
bool user_gesture,
blink::MediaStreamRequestType request_type,
const std::vector<std::string>& requested_audio_device_ids,
const std::vector<std::string>& requested_video_device_ids,
blink::mojom::MediaStreamType audio_type,
blink::mojom::MediaStreamType video_type,
bool disable_local_echo,
bool request_pan_tilt_zoom_permission,
bool captured_surface_control_active);
MediaStreamRequest(const MediaStreamRequest& other);
~MediaStreamRequest();
// This is the render process id for the renderer associated with generating
// frames for a MediaStream. Any indicators associated with a capture will be
// displayed for this renderer.
int render_process_id;
// This is the render frame id for the renderer associated with generating
// frames for a MediaStream. Any indicators associated with a capture will be
// displayed for this renderer.
int render_frame_id;
// The unique id combined with render_process_id and render_frame_id for
// identifying this request. This is used for cancelling request.
int page_request_id;
// TODO(crbug.com/40944449): Remove security_origin.
// The WebKit security origin for the current request (e.g. "html5rocks.com").
GURL security_origin;
// The Origin of the current request.
url::Origin url_origin;
// Set to true if the call was made in the context of a user gesture.
bool user_gesture;
// Stores the type of request that was made to the media controller. Right now
// this is only used to distinguish between WebRTC and Pepper requests, as the
// latter should not be subject to user approval but only to policy check.
// Pepper requests are signified by the |MEDIA_OPEN_DEVICE| value.
blink::MediaStreamRequestType request_type;
// Stores the requested raw device id for physical audio or video devices.
std::vector<std::string> requested_audio_device_ids;
std::vector<std::string> requested_video_device_ids;
// Flag to indicate if the request contains audio.
blink::mojom::MediaStreamType audio_type;
// Flag to indicate if the request contains video.
blink::mojom::MediaStreamType video_type;
// Flag for desktop or tab share to indicate whether to prevent the captured
// audio being played out locally.
bool disable_local_echo;
// Flag for desktop or tab share to indicate whether to prevent the captured
// audio being played out locally.
// This flag is distinct from |disable_local_echo|, because the former
// hooks into an old non-standard constraint that should be deprecated,
// whereas this flag hooks into a standardized option.
bool suppress_local_audio_playback = false;
// Flag for window or screen share to indicate if audio originating from the
// document that called getDisplayMedia should be removed from the
// captured system audio.
bool restrict_own_audio = false;
// If audio is requested, |exclude_system_audio| can indicate that
// system-audio should nevertheless not be offered to the user.
bool exclude_system_audio = false;
// If audio is requested, |window_audio_preference| can indicate that
// audio should be offered to the user when sharing a window surface.
blink::mojom::WindowAudioPreference window_audio_preference =
blink::mojom::WindowAudioPreference::kExclude;
// Flag to indicate that the current tab should be excluded from the list of
// tabs offered to the user.
bool exclude_self_browser_surface = false;
// Flag to indicate whether monitor type surfaces (screens) should be offered
// to the user.
bool exclude_monitor_type_surfaces = false;
// Flag to indicate a preference for which display surface type (screen,
// windows, or tabs) should be most prominently offered to the user.
blink::mojom::PreferredDisplaySurface preferred_display_surface =
blink::mojom::PreferredDisplaySurface::NO_PREFERENCE;
// Flag to indicate whether the request is for PTZ use.
bool request_pan_tilt_zoom_permission;
// Indicates whether Captured Surface Control APIs (sendWheel, setZoomLevel)
// have previously been used on the capture-session associated with this
// request. This is only relevant for tab-sharing sessions.
bool captured_surface_control_active;
};
// Interface used by the content layer to notify chrome about changes in the
// state of a media stream. Instances of this class are passed to content layer
// when MediaStream access is approved using MediaResponseCallback.
class MediaStreamUI {
public:
using SourceCallback =
base::RepeatingCallback<void(const DesktopMediaID& media_id,
bool captured_surface_control_active)>;
using StateChangeCallback = base::RepeatingCallback<void(
const DesktopMediaID& media_id,
blink::mojom::MediaStreamStateChange new_state)>;
virtual ~MediaStreamUI() = default;
// Called when MediaStream capturing is started. Chrome layer can call |stop|
// to stop the stream, or |source| to change the source of the stream, or
// |state_change| to pause/unpause the stream.
// |stop| is a callback that, once invoked, will stop the stream.
// Stopping a stream is irreversible, so only the first invocation
// will have an effect. |stop| is defined as RepeatingClosure so as
// to allow its duplication upstream, thereby enabling multiple
// potential sources for the stop invocation. (For example, allow
// multiple UX elements that would stop the capture.)
// Returns the platform-dependent window ID for the UI, or 0
// if not applicable.
virtual gfx::NativeViewId OnStarted(
base::RepeatingClosure stop,
SourceCallback source,
const std::string& label,
std::vector<DesktopMediaID> screen_capture_ids,
StateChangeCallback state_change) = 0;
// Called when the device is stopped because desktop capture identified by
// |label| source is about to be changed from |old_media_id| to
// |new_media_id|. Note that the switch is not necessarily completed.
virtual void OnDeviceStoppedForSourceChange(
const std::string& label,
const DesktopMediaID& old_media_id,
const DesktopMediaID& new_media_id,
bool captured_surface_control_active) = 0;
virtual void OnDeviceStopped(const std::string& label,
const DesktopMediaID& media_id) = 0;
// Called when Region Capture starts/stops, or when the cropped area changes.
// * A non-empty rect indicates the region which was cropped-to.
// * An empty rect indicates that Region Capture was employed,
// but the cropped-to region ended up having zero pixels.
// * Nullopt indicates that cropping stopped.
virtual void OnRegionCaptureRectChanged(
const std::optional<gfx::Rect>& region_capture_rect) {}
// Focuses the display surface represented by |media_id|.
//
// |is_from_microtask| and |is_from_timer| are used to distinguish:
// a. Explicit calls from the Web-application.
// b. Implicit calls resulting from the focusability-window-closing microtask.
// c. The browser-side timer.
// This distinction is reflected by UMA.
virtual void SetFocus(const DesktopMediaID& media_id,
bool focus,
bool is_from_microtask,
bool is_from_timer) {}
};
// Callback used return results of media access requests.
using MediaResponseCallback = base::OnceCallback<void(
const blink::mojom::StreamDevicesSet& stream_devices_set,
blink::mojom::MediaStreamRequestResult result,
std::unique_ptr<MediaStreamUI> ui)>;
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_MEDIA_STREAM_REQUEST_H_