1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116

content / browser / permissions / permission_service_impl.h [blame]

// 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 "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,
      mojo::PendingRemote<blink::mojom::EmbeddedPermissionControlClient> client)
      override;
  void RequestPageEmbeddedPermission(
      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,
      const std::vector<blink::mojom::PermissionDescriptorPtr>& permissions,
      PermissionRequestDescription request_description,
      RequestPermissionsCallback callback);

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

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

  blink::mojom::PermissionStatus GetPermissionStatus(
      const blink::mojom::PermissionDescriptorPtr& permission);
  blink::mojom::PermissionStatus GetPermissionStatusFromType(
      blink::PermissionType type);
  blink::mojom::PermissionStatus GetCombinedPermissionAndDeviceStatus(
      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_