// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_BROWSER_PERMISSIONS_PERMISSION_SERVICE_IMPL_H_
#define CONTENT_BROWSER_PERMISSIONS_PERMISSION_SERVICE_IMPL_H_

#include "base/containers/id_map.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "content/browser/permissions/permission_service_context.h"
#include "content/public/browser/permission_request_description.h"
#include "content/public/browser/permission_result.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "third_party/blink/public/mojom/permissions/permission.mojom.h"
#include "url/origin.h"

namespace blink {
enum class PermissionType;
}

namespace content {

// Implements the PermissionService Mojo interface.
// This service can be created from a RenderFrameHost or a RenderProcessHost.
// It is owned by a PermissionServiceContext.
// It receives at PermissionServiceContext instance when created which allows it
// to have some information about the current context. That enables the service
// to know whether it can show UI and have knowledge of the associated
// WebContents for example.
// TODO(crbug.com/40220500): Use url::Origin instead of GURL.
class PermissionServiceImpl : public blink::mojom::PermissionService {
 public:
  PermissionServiceImpl(PermissionServiceContext* context,
                        const url::Origin& origin);

  PermissionServiceImpl(const PermissionServiceImpl&) = delete;
  PermissionServiceImpl& operator=(const PermissionServiceImpl&) = delete;

  ~PermissionServiceImpl() override;

 private:
  friend class PermissionServiceImplTest;

  using PermissionStatusCallback =
      base::OnceCallback<void(blink::mojom::PermissionStatus)>;

  class PendingRequest;
  using RequestsMap = base::IDMap<std::unique_ptr<PendingRequest>>;

  // blink::mojom::PermissionService.
  void HasPermission(blink::mojom::PermissionDescriptorPtr permission,
                     PermissionStatusCallback callback) override;
  void RegisterPageEmbeddedPermissionControl(
      std::vector<blink::mojom::PermissionDescriptorPtr> permissions,
      blink::mojom::EmbeddedPermissionRequestDescriptorPtr descriptor,
      mojo::PendingRemote<blink::mojom::EmbeddedPermissionControlClient> client)
      override;
  void RequestPageEmbeddedPermission(
      std::vector<blink::mojom::PermissionDescriptorPtr> permissions,
      blink::mojom::EmbeddedPermissionRequestDescriptorPtr descriptor,
      RequestPageEmbeddedPermissionCallback callback) override;
  void RequestPermission(blink::mojom::PermissionDescriptorPtr permission,
                         bool user_gesture,
                         PermissionStatusCallback callback) override;
  void RequestPermissions(
      std::vector<blink::mojom::PermissionDescriptorPtr> permissions,
      bool user_gesture,
      RequestPermissionsCallback callback) override;
  void RevokePermission(blink::mojom::PermissionDescriptorPtr permission,
                        PermissionStatusCallback callback) override;
  void AddPermissionObserver(
      blink::mojom::PermissionDescriptorPtr permission,
      blink::mojom::PermissionStatus last_known_status,
      mojo::PendingRemote<blink::mojom::PermissionObserver> observer) override;
  void AddPageEmbeddedPermissionObserver(
      blink::mojom::PermissionDescriptorPtr permission,
      blink::mojom::PermissionStatus last_known_status,
      mojo::PendingRemote<blink::mojom::PermissionObserver> observer) override;
  void NotifyEventListener(blink::mojom::PermissionDescriptorPtr permission,
                           const std::string& event_type,
                           bool is_added) override;

  void RequestPermissionsInternal(
      BrowserContext* browser_context,
      PermissionRequestDescription request_description,
      RequestPermissionsCallback callback);

  void OnRequestPermissionsResponse(
      int pending_request_id,
      const std::vector<PermissionResult>& result);

  void OnPageEmbeddedPermissionControlRegistered(
      std::vector<blink::mojom::PermissionDescriptorPtr> permissions,
      bool allow,
      const mojo::Remote<blink::mojom::EmbeddedPermissionControlClient>&
          client);

  PermissionResult GetPermissionResult(
      const blink::mojom::PermissionDescriptorPtr& permission);
  PermissionResult GetPermissionResultForCurrentContext(
      const blink::mojom::PermissionDescriptorPtr& permission);
  PermissionResult GetCombinedPermissionAndDeviceResult(
      const blink::mojom::PermissionDescriptorPtr& permission);
  void ResetPermissionStatus(blink::PermissionType type);
  void ReceivedBadMessage();

  RequestsMap pending_requests_;
  // context_ owns |this|.
  raw_ptr<PermissionServiceContext> context_;
  const url::Origin origin_;
  base::WeakPtrFactory<PermissionServiceImpl> weak_factory_{this};
};

}  // namespace content

#endif  // CONTENT_BROWSER_PERMISSIONS_PERMISSION_SERVICE_IMPL_H_
