#ifndef CONTENT_BROWSER_MEDIA_CAPTURED_SURFACE_CONTROLLER_H_
#define CONTENT_BROWSER_MEDIA_CAPTURED_SURFACE_CONTROLLER_H_
#include <memory>
#include "base/callback_list.h"
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "content/browser/media/captured_surface_control_permission_manager.h"
#include "content/common/content_export.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/global_routing_id.h"
#include "content/public/browser/web_contents_media_capture_id.h"
#include "third_party/blink/public/mojom/mediastream/media_stream.mojom.h"
namespace content {
class WebContents;
class CONTENT_EXPORT CapturedSurfaceController {
public:
using CapturedSurfaceControlResult =
::blink::mojom::CapturedSurfaceControlResult;
inline static constexpr int32_t kMaxWheelDeltaMagnitude = 1000000;
static std::unique_ptr<CapturedSurfaceController> CreateForTesting(
GlobalRenderFrameHostId capturer_rfh_id,
WebContentsMediaCaptureId captured_wc_id,
std::unique_ptr<CapturedSurfaceControlPermissionManager>
permission_manager,
base::RepeatingCallback<void(int)> on_zoom_level_change_callback,
base::RepeatingCallback<void(base::WeakPtr<WebContents>)>
wc_resolution_callback);
CapturedSurfaceController(
GlobalRenderFrameHostId capturer_rfh_id,
WebContentsMediaCaptureId captured_wc_id,
base::RepeatingCallback<void(int)> on_zoom_level_change_callback);
virtual ~CapturedSurfaceController();
CapturedSurfaceController(const CapturedSurfaceController&) = delete;
CapturedSurfaceController& operator=(const CapturedSurfaceController&) =
delete;
virtual void UpdateCaptureTarget(WebContentsMediaCaptureId captured_wc_id);
virtual void SendWheel(
blink::mojom::CapturedWheelActionPtr action,
base::OnceCallback<void(CapturedSurfaceControlResult)> reply_callback);
virtual void UpdateZoomLevel(
blink::mojom::ZoomLevelAction action,
base::OnceCallback<void(CapturedSurfaceControlResult)> reply_callback);
virtual void RequestPermission(
base::OnceCallback<void(CapturedSurfaceControlResult)> reply_callback);
struct CapturedSurfaceInfo final {
CapturedSurfaceInfo(
base::WeakPtr<WebContents> captured_wc,
std::unique_ptr<base::CallbackListSubscription,
BrowserThread::DeleteOnUIThread> subscription,
int subscription_version,
int initial_zoom_level);
CapturedSurfaceInfo(CapturedSurfaceInfo&& other);
CapturedSurfaceInfo& operator=(CapturedSurfaceInfo&& other);
~CapturedSurfaceInfo();
base::WeakPtr<WebContents> captured_wc;
std::unique_ptr<base::CallbackListSubscription,
BrowserThread::DeleteOnUIThread>
subscription;
int subscription_version;
int initial_zoom_level;
};
private:
using CapturedSurfaceControlPermissionStatus =
CapturedSurfaceControlPermissionManager::
CapturedSurfaceControlPermissionStatus;
void OnZoomLevelChange(int subscription_version, int zoom_level);
CapturedSurfaceController(
GlobalRenderFrameHostId capturer_rfh_id,
WebContentsMediaCaptureId captured_wc_id,
std::unique_ptr<CapturedSurfaceControlPermissionManager>
permission_manager,
base::RepeatingCallback<void(int)> on_zoom_level_change_callback,
base::RepeatingCallback<void(base::WeakPtr<WebContents>)>
wc_resolution_callback);
void ResolveCapturedSurface(WebContentsMediaCaptureId captured_wc_id);
void OnCapturedSurfaceResolved(
std::optional<CapturedSurfaceInfo> captured_surface);
const GlobalRenderFrameHostId capturer_rfh_id_;
std::optional<base::WeakPtr<WebContents>> captured_wc_;
int pending_wc_resolutions_ = 0;
std::unique_ptr<CapturedSurfaceControlPermissionManager> permission_manager_;
const base::RepeatingCallback<void(base::WeakPtr<WebContents>)>
wc_resolution_callback_;
std::unique_ptr<base::CallbackListSubscription,
BrowserThread::DeleteOnUIThread>
zoom_level_subscription_;
int subscription_version_ = 0;
const base::RepeatingCallback<void(int)> on_zoom_level_change_callback_;
base::WeakPtrFactory<CapturedSurfaceController> weak_factory_{this};
};
}
#endif