#ifndef CONTENT_RENDERER_MEDIA_RENDERER_WEB_MEDIA_PLAYER_DELEGATE_H_
#define CONTENT_RENDERER_MEDIA_RENDERER_WEB_MEDIA_PLAYER_DELEGATE_H_
#include <map>
#include <memory>
#include <set>
#include "base/containers/flat_set.h"
#include "base/containers/id_map.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/default_tick_clock.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "content/common/content_export.h"
#include "content/public/renderer/render_frame_observer.h"
#include "third_party/blink/public/platform/media/web_media_player_delegate.h"
#include "third_party/blink/public/web/web_view_observer.h"
namespace blink {
enum class WebFullscreenVideoStatus;
}
namespace media {
enum class MediaContentType;
class CONTENT_EXPORT RendererWebMediaPlayerDelegate final
: public content::RenderFrameObserver,
public blink::WebViewObserver,
public blink::WebMediaPlayerDelegate {
public:
explicit RendererWebMediaPlayerDelegate(content::RenderFrame* render_frame);
RendererWebMediaPlayerDelegate(const RendererWebMediaPlayerDelegate&) =
delete;
RendererWebMediaPlayerDelegate& operator=(
const RendererWebMediaPlayerDelegate&) = delete;
~RendererWebMediaPlayerDelegate() override;
bool has_played_media() const { return has_played_media_; }
bool IsPageHidden() override;
bool IsFrameHidden() override;
int AddObserver(Observer* observer) override;
void RemoveObserver(int player_id) override;
void DidMediaMetadataChange(int player_id,
bool has_audio,
bool has_video,
MediaContentType media_content_type) override;
void DidPlay(int player_id) override;
void DidPause(int player_id, bool reached_end_of_stream) override;
void PlayerGone(int player_id) override;
void SetIdle(int player_id, bool is_idle) override;
bool IsIdle(int player_id) override;
void ClearStaleFlag(int player_id) override;
bool IsStale(int player_id) override;
void OnDestruct() override;
void OnFrameVisibilityChanged(
blink::mojom::FrameVisibility render_status) override;
void OnPageVisibilityChanged(
#if !BUILDFLAG(ARKWEB_CUSTOM_VIDEO_PLAYER)
blink::mojom::PageVisibilityState visibility_state) override;
#else
blink::mojom::PageVisibilityState visibility_state,
bool storing_in_bfcache) override;
#endif
size_t web_media_player_count() const { return id_map_.size(); }
void SetIdleCleanupParamsForTesting(base::TimeDelta idle_timeout,
base::TimeDelta idle_cleanup_interval,
const base::TickClock* tick_clock,
bool is_low_end);
bool IsIdleCleanupTimerRunningForTesting() const;
void SetFrameHiddenForTesting(bool is_frame_hidden);
friend class RendererWebMediaPlayerDelegateTest;
private:
void ScheduleUpdateTask();
void UpdateTask();
void CleanUpIdlePlayers(base::TimeDelta timeout);
bool has_played_media_ = false;
bool has_played_video_ = false;
bool pending_update_task_ = false;
base::IDMap<Observer*> id_map_;
bool allow_idle_cleanup_ = true;
std::map<int, base::TimeTicks> idle_player_map_;
std::set<int> stale_players_;
base::OneShotTimer idle_cleanup_timer_;
base::TimeDelta idle_timeout_;
base::TimeDelta idle_cleanup_interval_;
raw_ptr<const base::TickClock> tick_clock_;
base::flat_set<int> players_with_video_;
base::flat_set<int> playing_videos_;
bool is_low_end_;
std::optional<bool> is_shown_;
bool is_frame_hidden_ = false;
base::WeakPtrFactory<RendererWebMediaPlayerDelegate> weak_ptr_factory_{this};
};
}
#endif