#ifndef FUCHSIA_WEB_WEBENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_
#define FUCHSIA_WEB_WEBENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_
#include <array>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "content/public/browser/permission_result.h"
#include "third_party/blink/public/common/permissions/permission_utils.h"
#include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
namespace url {
class Origin;
}
namespace content {
class WebContents;
}
class FramePermissionController {
public:
explicit FramePermissionController(content::WebContents* web_contents);
~FramePermissionController();
FramePermissionController(FramePermissionController&) = delete;
FramePermissionController& operator=(FramePermissionController&) = delete;
void SetPermissionState(blink::PermissionType permission,
const url::Origin& origin,
blink::mojom::PermissionStatus state);
void SetDefaultPermissionState(blink::PermissionType permission,
blink::mojom::PermissionStatus state);
blink::mojom::PermissionStatus GetPermissionState(
blink::PermissionType permission,
const url::Origin& requesting_origin);
void RequestPermissions(
const std::vector<blink::PermissionType>& permissions,
const url::Origin& requesting_origin,
base::OnceCallback<void(const std::vector<content::PermissionResult>&)>
callback);
private:
struct PermissionSet {
explicit PermissionSet(blink::mojom::PermissionStatus initial_state);
PermissionSet(const PermissionSet& other);
PermissionSet& operator=(const PermissionSet& other);
std::array<blink::mojom::PermissionStatus,
static_cast<int>(blink::PermissionType::NUM)>
permission_states;
};
PermissionSet GetEffectivePermissionsForOrigin(const url::Origin& origin);
const raw_ptr<content::WebContents> web_contents_;
base::flat_map<url::Origin, PermissionSet> per_origin_permissions_;
PermissionSet default_permissions_{blink::mojom::PermissionStatus::DENIED};
};
#endif