#ifndef CONTENT_BROWSER_LOCKS_LOCK_MANAGER_H_
#define CONTENT_BROWSER_LOCKS_LOCK_MANAGER_H_
#include <cstdint>
#include <map>
#include <memory>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "components/services/storage/public/cpp/buckets/bucket_id.h"
#include "components/services/storage/public/cpp/buckets/constants.h"
#include "content/common/content_export.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "third_party/blink/public/mojom/locks/lock_manager.mojom.h"
#include "url/origin.h"
namespace content {
class CONTENT_EXPORT LockManager : public blink::mojom::LockManager {
public:
LockManager();
~LockManager() override;
LockManager(const LockManager&) = delete;
LockManager& operator=(const LockManager&) = delete;
void BindReceiver(storage::BucketId bucket_id,
mojo::PendingReceiver<blink::mojom::LockManager> receiver);
void RequestLock(const std::string& name,
blink::mojom::LockMode mode,
WaitMode wait,
mojo::PendingAssociatedRemote<blink::mojom::LockRequest>
request) override;
void ReleaseLock(storage::BucketId bucket_id, int64_t lock_id);
void QueryState(QueryStateCallback callback) override;
private:
class Lock;
class BucketState;
struct ReceiverState {
ReceiverState(std::string client_id, storage::BucketId bucket_id);
ReceiverState();
ReceiverState(const ReceiverState& other);
~ReceiverState();
std::string client_id;
storage::BucketId bucket_id;
};
int64_t NextLockId();
mojo::ReceiverSet<blink::mojom::LockManager, ReceiverState> receivers_;
int64_t next_lock_id_ = 0;
std::map<storage::BucketId, BucketState> buckets_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<LockManager> weak_ptr_factory_{this};
};
}
#endif