#ifndef CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_SERVICE_IMPL_H_
#define CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_SERVICE_IMPL_H_
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "content/common/content_export.h"
#include "content/public/browser/permission_controller.h"
#include "content/public/browser/permission_result.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "services/device/public/mojom/geolocation.mojom.h"
#include "services/device/public/mojom/geolocation_context.mojom.h"
#include "third_party/blink/public/mojom/geolocation/geolocation_service.mojom.h"
#include "url/origin.h"
namespace blink {
namespace mojom {
enum class PermissionStatus;
}
}
namespace content {
class RenderFrameHost;
class GeolocationServiceImplContext {
public:
GeolocationServiceImplContext();
GeolocationServiceImplContext(const GeolocationServiceImplContext&) = delete;
GeolocationServiceImplContext& operator=(
const GeolocationServiceImplContext&) = delete;
~GeolocationServiceImplContext();
using PermissionCallback = base::OnceCallback<void(PermissionResult)>;
void RequestPermission(RenderFrameHost* render_frame_host,
bool user_gesture,
PermissionCallback callback);
private:
bool has_pending_permission_request_ = false;
void HandlePermissionResult(PermissionCallback callback,
PermissionResult permission_result);
base::WeakPtrFactory<GeolocationServiceImplContext> weak_factory_{this};
};
class CONTENT_EXPORT GeolocationServiceImpl
: public blink::mojom::GeolocationService {
public:
GeolocationServiceImpl(device::mojom::GeolocationContext* geolocation_context,
RenderFrameHost* render_frame_host);
GeolocationServiceImpl(const GeolocationServiceImpl&) = delete;
GeolocationServiceImpl& operator=(const GeolocationServiceImpl&) = delete;
~GeolocationServiceImpl() override;
void Bind(mojo::PendingReceiver<blink::mojom::GeolocationService> receiver);
void CreateGeolocation(
mojo::PendingReceiver<device::mojom::Geolocation> receiver,
bool user_gesture,
CreateGeolocationCallback callback) override;
void HandlePermissionResultChange(PermissionResult permission_result);
void OnDisconnected();
private:
void CreateGeolocationWithPermissionResult(
mojo::PendingReceiver<device::mojom::Geolocation> receiver,
CreateGeolocationCallback callback,
PermissionResult permission_result);
void IncrementActivityCount();
void DecrementActivityCount();
const raw_ptr<device::mojom::GeolocationContext, DanglingUntriaged>
geolocation_context_;
PermissionController::SubscriptionId subscription_id_;
url::Origin requesting_origin_;
const raw_ptr<RenderFrameHost, DanglingUntriaged> render_frame_host_;
mojo::ReceiverSet<blink::mojom::GeolocationService,
std::unique_ptr<GeolocationServiceImplContext>>
receiver_set_;
bool is_sending_updates_ = false;
base::WeakPtrFactory<GeolocationServiceImpl> weak_factory_{this};
};
}
#endif