#ifndef UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_
#define UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/numerics/safe_conversions.h"
#include "base/time/time.h"
#include "cc/layers/deadline_policy.h"
#include "components/viz/client/frame_evictor.h"
#include "components/viz/common/frame_sinks/begin_frame_args.h"
#include "components/viz/common/frame_timing_details_map.h"
#include "components/viz/common/resources/release_callback.h"
#include "components/viz/common/resources/returned_resource.h"
#include "components/viz/common/surfaces/surface_id.h"
#include "components/viz/common/surfaces/surface_info.h"
#include "components/viz/host/host_frame_sink_client.h"
#include "third_party/blink/public/common/page/content_to_visible_time_reporter.h"
#include "third_party/blink/public/mojom/widget/record_content_to_visible_time_request.mojom.h"
#include "ui/android/browser_controls_offset_tag_definitions.h"
#include "ui/android/ui_android_export.h"
#include "ui/android/window_android_compositor.h"
namespace cc::slim {
class SurfaceLayer;
}
namespace gpu {
class ClientSharedImage;
}
namespace viz {
class CopyOutputRequest;
class HostFrameSinkManager;
class RasterContextProvider;
struct CopyOutputBitmapWithMetadata;
}
namespace ui {
class ViewAndroid;
class WindowAndroidCompositor;
class UI_ANDROID_EXPORT DelegatedFrameHostAndroid
: public viz::HostFrameSinkClient,
public viz::FrameEvictorClient {
public:
class Client : public WindowAndroidCompositor::FrameSubmissionObserver {
public:
~Client() override {}
virtual void OnFrameTokenChanged(uint32_t frame_token,
base::TimeTicks activation_time) = 0;
virtual void WasEvicted() = 0;
virtual void OnSurfaceIdChanged() = 0;
virtual std::vector<viz::SurfaceId> CollectSurfaceIdsForEviction()
const = 0;
};
DelegatedFrameHostAndroid(ViewAndroid* view,
viz::HostFrameSinkManager* host_frame_sink_manager,
Client* client,
const viz::FrameSinkId& frame_sink_id);
DelegatedFrameHostAndroid(const DelegatedFrameHostAndroid&) = delete;
DelegatedFrameHostAndroid& operator=(const DelegatedFrameHostAndroid&) =
delete;
~DelegatedFrameHostAndroid() override;
static int64_t TimeDeltaToFrames(base::TimeDelta delta) {
return base::ClampRound<int64_t>(delta /
viz::BeginFrameArgs::DefaultInterval());
}
static constexpr base::TimeDelta FirstFrameTimeout() {
return base::Seconds(5);
}
static int64_t FirstFrameTimeoutFrames() {
return TimeDeltaToFrames(FirstFrameTimeout());
}
static constexpr base::TimeDelta ResizeTimeout() {
return base::Milliseconds(175);
}
static int64_t ResizeTimeoutFrames() {
return TimeDeltaToFrames(ResizeTimeout());
}
void ClearFallbackSurfaceForCommitPending();
void ResetFallbackToFirstNavigationSurface();
bool HasDelegatedContent() const;
const cc::slim::SurfaceLayer* content_layer() const {
return content_layer_.get();
}
const viz::FrameSinkId& GetFrameSinkId() const;
void CopyFromCompositingSurface(
const gfx::Rect& src_subrect,
const gfx::Size& output_size,
base::OnceCallback<void(const viz::CopyOutputBitmapWithMetadata&)>
callback,
bool capture_exact_surface_id,
base::TimeDelta ipc_delay);
bool CanCopyFromCompositingSurface() const;
void CopySharedImageFromCompositingSurface(
scoped_refptr<viz::RasterContextProvider> context_provider,
const gfx::Rect& src_subrect,
const gfx::Size& output_size,
base::OnceCallback<void(scoped_refptr<gpu::ClientSharedImage>,
viz::ReleaseCallback release_callback)> callback,
bool capture_exact_surface_id);
void CompositorFrameSinkChanged();
void AttachToCompositor(WindowAndroidCompositor* compositor);
void DetachFromCompositor();
bool IsPrimarySurfaceEvicted() const;
bool HasSavedFrame() const;
void WasHidden();
void WasShown(const viz::LocalSurfaceId& local_surface_id,
const gfx::Size& size_in_pixels,
bool is_fullscreen,
blink::mojom::RecordContentToVisibleTimeRequestPtr
content_to_visible_time_request);
void EmbedSurface(const viz::LocalSurfaceId& new_local_surface_id,
const gfx::Size& new_size_in_pixels,
cc::DeadlinePolicy deadline_policy,
bool is_fullscreen);
void RequestSuccessfulPresentationTimeForNextFrame(
blink::mojom::RecordContentToVisibleTimeRequestPtr
content_to_visible_time_request);
void CancelSuccessfulPresentationTimeRequest();
viz::SurfaceId SurfaceId() const;
bool HasPrimarySurface() const;
bool HasFallbackSurface() const;
void TakeFallbackContentFrom(DelegatedFrameHostAndroid* other);
void DidNavigate();
void DidNavigateMainFramePreCommit();
void DidEnterBackForwardCache();
void ActivatedOrEvictedFromBackForwardCache();
viz::SurfaceId GetFallbackSurfaceIdForTesting() const;
viz::SurfaceId GetCurrentSurfaceIdForTesting() const;
viz::SurfaceId GetPreNavigationSurfaceIdForTesting() const {
return GetPreNavigationSurfaceId();
}
viz::SurfaceId GetFirstSurfaceIdAfterNavigationForTesting() const;
viz::SurfaceId GetBFCacheFallbackSurfaceIdForTesting() const;
void SetIsFrameSinkIdOwner(bool is_owner);
void RegisterOffsetTags(
const BrowserControlsOffsetTagDefinitions& tag_definitions);
void UnregisterOffsetTags(const cc::BrowserControlsOffsetTags& tags);
private:
void EvictDelegatedFrame(
const std::vector<viz::SurfaceId>& surface_ids) override;
viz::FrameEvictorClient::EvictIds CollectSurfaceIdsForEviction()
const override;
viz::SurfaceId GetCurrentSurfaceId() const override;
viz::SurfaceId GetPreNavigationSurfaceId() const override;
void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
void OnFrameTokenChanged(uint32_t frame_token,
base::TimeTicks activation_time) override;
void ProcessCopyOutputRequest(
std::unique_ptr<viz::CopyOutputRequest> request);
void SetLocalSurfaceId(const viz::LocalSurfaceId& local_surface_id);
void PostRequestSuccessfulPresentationTimeForNextFrame(
blink::mojom::RecordContentToVisibleTimeRequestPtr
content_to_visible_time_request);
void UpdateCaptureKeepAlive();
void ReleaseCaptureKeepAlive();
const viz::FrameSinkId frame_sink_id_;
raw_ptr<ViewAndroid> view_;
const raw_ptr<viz::HostFrameSinkManager> host_frame_sink_manager_;
raw_ptr<WindowAndroidCompositor> registered_parent_compositor_ = nullptr;
raw_ptr<Client> client_;
scoped_refptr<cc::slim::SurfaceLayer> content_layer_;
viz::LocalSurfaceId first_local_surface_id_after_navigation_;
viz::LocalSurfaceId pre_navigation_local_surface_id_;
viz::LocalSurfaceId bfcache_fallback_;
viz::LocalSurfaceId local_surface_id_;
gfx::Size surface_size_in_pixels_;
blink::mojom::RecordContentToVisibleTimeRequestPtr
content_to_visible_time_request_;
blink::ContentToVisibleTimeReporter content_to_visible_time_recorder_;
std::unique_ptr<viz::FrameEvictor> frame_evictor_;
ui::WindowAndroidCompositor::ScopedKeepSurfaceAliveCallback
capture_keep_alive_callback_;
bool owns_frame_sink_id_ = false;
};
}
#endif