#ifndef CONTENT_RENDERER_MEDIA_MEDIA_PERMISSION_DISPATCHER_H_
#define CONTENT_RENDERER_MEDIA_MEDIA_PERMISSION_DISPATCHER_H_
#include <stdint.h>
#include <map>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "content/renderer/render_frame_impl.h"
#include "media/base/media_permission.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/mojom/permissions/permission.mojom.h"
#if BUILDFLAG(IS_WIN)
#include "media/mojo/mojom/media_foundation_preferences.mojom.h"
#endif
namespace base {
class SingleThreadTaskRunner;
}
namespace content {
class MediaPermissionDispatcher : public media::MediaPermission {
public:
explicit MediaPermissionDispatcher(RenderFrameImpl* render_frame);
MediaPermissionDispatcher(const MediaPermissionDispatcher&) = delete;
MediaPermissionDispatcher& operator=(const MediaPermissionDispatcher&) =
delete;
~MediaPermissionDispatcher() override;
void OnNavigation();
void HasPermission(Type type,
PermissionStatusCB permission_status_cb) override;
void RequestPermission(Type type,
PermissionStatusCB permission_status_cb) override;
bool IsEncryptedMediaEnabled() override;
#if BUILDFLAG(IS_WIN)
void IsHardwareSecureDecryptionAllowed(
IsHardwareSecureDecryptionAllowedCB cb) override;
#endif
private:
typedef std::map<uint32_t, PermissionStatusCB> RequestMap;
uint32_t RegisterCallback(PermissionStatusCB permission_status_cb);
blink::mojom::PermissionService* GetPermissionService();
#if BUILDFLAG(IS_WIN)
media::mojom::MediaFoundationPreferences* GetMediaFoundationPreferences();
void OnMediaFoundationPreferencesConnectionError();
void OnIsHardwareSecureDecryptionAllowed(bool allowed);
#endif
void OnPermissionStatus(uint32_t request_id,
blink::mojom::PermissionStatus status);
void OnPermissionServiceConnectionError();
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
uint32_t next_request_id_;
RequestMap requests_;
mojo::Remote<blink::mojom::PermissionService> permission_service_;
#if BUILDFLAG(IS_WIN)
mojo::Remote<media::mojom::MediaFoundationPreferences> mf_preferences_;
#endif
const raw_ptr<RenderFrameImpl> render_frame_;
base::WeakPtr<MediaPermissionDispatcher> weak_ptr_;
base::WeakPtrFactory<MediaPermissionDispatcher> weak_factory_{this};
};
}
#endif