#ifndef CONTENT_BROWSER_ANDROID_SCOPED_SURFACE_REQUEST_MANAGER_H_
#define CONTENT_BROWSER_ANDROID_SCOPED_SURFACE_REQUEST_MANAGER_H_
#include <unordered_map>
#include "base/functional/callback.h"
#include "base/memory/singleton.h"
#include "base/unguessable_token.h"
#include "content/common/content_export.h"
#include "gpu/ipc/common/android/scoped_surface_request_conduit.h"
#include "ui/gl/android/scoped_java_surface.h"
namespace content {
class CONTENT_EXPORT ScopedSurfaceRequestManager
: public gpu::ScopedSurfaceRequestConduit {
public:
static ScopedSurfaceRequestManager* GetInstance();
ScopedSurfaceRequestManager(const ScopedSurfaceRequestManager&) = delete;
ScopedSurfaceRequestManager& operator=(const ScopedSurfaceRequestManager&) =
delete;
using ScopedSurfaceRequestCB =
base::OnceCallback<void(gl::ScopedJavaSurface)>;
base::UnguessableToken RegisterScopedSurfaceRequest(
ScopedSurfaceRequestCB request_cb);
void UnregisterScopedSurfaceRequest(
const base::UnguessableToken& request_token);
void FulfillScopedSurfaceRequest(const base::UnguessableToken& request_token,
gl::ScopedJavaSurface surface);
void ForwardSurfaceOwnerForSurfaceRequest(
const base::UnguessableToken& request_token,
const gpu::TextureOwner* texture_owner) override;
void clear_requests_for_testing() { request_callbacks_.clear(); }
int request_count_for_testing() { return request_callbacks_.size(); }
private:
friend struct base::DefaultSingletonTraits<ScopedSurfaceRequestManager>;
ScopedSurfaceRequestCB GetAndUnregisterInternal(
const base::UnguessableToken& request_token);
void CompleteRequestOnUiThread(const base::UnguessableToken& request_token,
gl::ScopedJavaSurface surface);
std::unordered_map<base::UnguessableToken,
ScopedSurfaceRequestCB,
base::UnguessableTokenHash>
request_callbacks_;
ScopedSurfaceRequestManager();
~ScopedSurfaceRequestManager() override;
};
}
#endif