#ifndef CONTENT_BROWSER_PERMISSIONS_EMBEDDED_PERMISSION_CONTROL_CHECKER_H_
#define CONTENT_BROWSER_PERMISSIONS_EMBEDDED_PERMISSION_CONTROL_CHECKER_H_
#include <map>
#include <memory>
#include <set>
#include "base/containers/circular_deque.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "content/common/content_export.h"
#include "content/public/browser/page.h"
#include "content/public/browser/page_user_data.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/mojom/permissions/permission.mojom.h"
namespace content {
class CONTENT_EXPORT EmbeddedPermissionControlChecker
: public content::PageUserData<EmbeddedPermissionControlChecker> {
public:
enum class Source {
kPermissionElement,
kGeolocationElement,
};
using RegisterPageEmbeddedPermissionCallback = base::OnceCallback<void(
bool,
const mojo::Remote<blink::mojom::EmbeddedPermissionControlClient>&)>;
explicit EmbeddedPermissionControlChecker(Page& page);
~EmbeddedPermissionControlChecker() override;
EmbeddedPermissionControlChecker(const EmbeddedPermissionControlChecker&) =
delete;
EmbeddedPermissionControlChecker& operator=(
const EmbeddedPermissionControlChecker&) = delete;
void CheckPageEmbeddedPermission(
Source source,
std::set<blink::mojom::PermissionName> permissions,
mojo::PendingRemote<blink::mojom::EmbeddedPermissionControlClient>
pending_client,
RegisterPageEmbeddedPermissionCallback callback);
private:
friend class content::PageUserData<EmbeddedPermissionControlChecker>;
PAGE_USER_DATA_KEY_DECL();
class Client {
public:
Client(EmbeddedPermissionControlChecker* checker,
Source source,
std::set<blink::mojom::PermissionName> permissions,
mojo::PendingRemote<blink::mojom::EmbeddedPermissionControlClient>
client,
RegisterPageEmbeddedPermissionCallback callback);
~Client();
Client(const Client&) = delete;
Client& operator=(const Client&) = delete;
void OnMojoDisconnect();
const std::set<blink::mojom::PermissionName>& permissions() const {
return permissions_;
}
Source source() const { return source_; }
void OnEmbeddedPermissionControlRegistered(bool allow);
private:
const raw_ptr<EmbeddedPermissionControlChecker> checker_;
Source source_;
std::set<blink::mojom::PermissionName> permissions_;
mojo::Remote<blink::mojom::EmbeddedPermissionControlClient> client_;
RegisterPageEmbeddedPermissionCallback callback_;
};
void OnClientDisconnect(Client* client);
struct ClientKey {
ClientKey(Source source,
std::set<blink::mojom::PermissionName> permissions);
ClientKey(const ClientKey& other);
ClientKey(ClientKey&& other);
~ClientKey();
bool operator<(const ClientKey& other) const;
Source source;
std::set<blink::mojom::PermissionName> permissions;
};
std::map<ClientKey, base::circular_deque<std::unique_ptr<Client>>>
client_map_;
};
}
#endif