blob: 84307c4bffaff7c267bca9a86ac31f04924eb044 [file]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_HOST_LINUX_FAKE_CAPTURE_STREAM_H_
#define REMOTING_HOST_LINUX_FAKE_CAPTURE_STREAM_H_
#include <memory>
#include <optional>
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "remoting/host/linux/capture_stream.h"
#include "remoting/host/linux/capture_stream_manager.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h"
#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
namespace remoting {
class FakeCaptureStream : public CaptureStream {
public:
FakeCaptureStream();
~FakeCaptureStream() override;
MOCK_METHOD(void,
SetPipeWireStream,
(std::uint32_t pipewire_node,
const webrtc::DesktopSize& initial_resolution,
std::string_view mapping_id,
int pipewire_fd),
(override));
MOCK_METHOD(void, StartVideoCapture, (), (override));
MOCK_METHOD(void, StopVideoCapture, (), (override));
MOCK_METHOD(void,
SetCallback,
(base::WeakPtr<webrtc::DesktopCapturer::Callback> callback),
(override));
MOCK_METHOD(void, SetUseDamageRegion, (bool use_damage_region), (override));
MOCK_METHOD(void, SetMaxFrameRate, (std::uint32_t frame_rate), (override));
MOCK_METHOD(
void,
SetSharedMemoryFactory,
(std::unique_ptr<webrtc::SharedMemoryFactory> shared_memory_factory),
(override));
MOCK_METHOD(std::unique_ptr<webrtc::MouseCursor>,
CaptureCursor,
(),
(override));
MOCK_METHOD(std::optional<webrtc::DesktopVector>,
CaptureCursorPosition,
(),
(override));
MOCK_METHOD(std::string_view, mapping_id, (), (const, override));
CursorObserver::Subscription AddCursorObserver(
CursorObserver* observer) override;
void SetResolution(const webrtc::DesktopSize& new_resolution) override;
const webrtc::DesktopSize& resolution() const override;
void set_screen_id(webrtc::ScreenId screen_id) override;
webrtc::ScreenId screen_id() const override;
base::WeakPtr<CaptureStream> GetWeakPtr() override;
template <typename Method, typename... Args>
requires std::
invocable<Method, CursorObserver*, CaptureStream*, const Args&...>
void NotifyCursorObservers(Method method, const Args&... args) {
cursor_observers.Notify(method, this, args...);
}
base::ObserverList<CursorObserver> cursor_observers;
private:
void RemoveCursorObserver(CursorObserver* observer);
webrtc::DesktopSize resolution_;
webrtc::ScreenId screen_id_;
base::WeakPtrFactory<FakeCaptureStream> weak_ptr_factory_{this};
};
class FakeCaptureStreamManager : public CaptureStreamManager {
public:
FakeCaptureStreamManager();
~FakeCaptureStreamManager() override;
Observer::Subscription AddObserver(Observer* observer) override;
void AddVirtualStream(const ScreenResolution& initial_resolution,
AddStreamCallback callback) override;
base::WeakPtr<CaptureStream> AddVirtualStream(
webrtc::ScreenId screen_id,
const webrtc::DesktopSize& resolution);
void RemoveVirtualStream(webrtc::ScreenId screen_id) override;
base::WeakPtr<CaptureStream> GetStream(webrtc::ScreenId screen_id) override;
FakeCaptureStream* GetFakeStream(webrtc::ScreenId screen_id);
base::flat_map<webrtc::ScreenId, base::WeakPtr<CaptureStream>>
GetActiveStreams() override;
base::WeakPtr<CaptureStreamManager> GetWeakPtr();
// The screen ID to be assigned for the new stream added via the overridden
// AddStream method.
std::optional<webrtc::ScreenId> next_screen_id;
base::ObserverList<Observer> observers;
private:
void RemoveObserver(Observer* observer);
base::flat_map<webrtc::ScreenId, std::unique_ptr<FakeCaptureStream>> streams_;
base::WeakPtrFactory<FakeCaptureStreamManager> weak_ptr_factory_{this};
};
} // namespace remoting
#endif // REMOTING_HOST_LINUX_FAKE_CAPTURE_STREAM_H_