File: permission_request_queue.h

package info (click to toggle)
chromium 120.0.6099.224-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,112,112 kB
  • sloc: cpp: 32,907,025; ansic: 8,148,123; javascript: 3,679,536; python: 2,031,248; asm: 959,718; java: 804,675; xml: 617,256; sh: 111,417; objc: 100,835; perl: 88,443; cs: 53,032; makefile: 29,579; fortran: 24,137; php: 21,162; tcl: 21,147; sql: 20,809; ruby: 17,735; pascal: 12,864; yacc: 8,045; lisp: 3,388; lex: 1,323; ada: 727; awk: 329; jsp: 267; csh: 117; exp: 43; sed: 37
file content (101 lines) | stat: -rw-r--r-- 3,802 bytes parent folder | download | duplicates (3)
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
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_QUEUE_H_
#define COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_QUEUE_H_

#include <cstddef>
#include <vector>

#include "base/containers/circular_deque.h"
#include "components/permissions/permission_request.h"

namespace permissions {

// Provides a container for holding pending PermissionRequest objects and
// provides access methods respecting the currently applicable feature flag
// configuration.
// The queue of permission requests is always held in the order of:
// High Priority Requests > Normal Priority Requests > Low Priority Requests.
// Using the |PushFront| and |PushBack| functions will push the new request in
// the front or back of the section of the queue that corresponds to that
// request's priority.

// High Priority Requests are requests that come from an Page-Embedded
// Permission Control.
// Low Priority Requests are requests for non-urgent permission types
// (notifications, geolocation) if the current platform supports the permission
// chip. If the permission chip is not supported, there are no low priority
// requests.
// Normal Priority Requests are all other requests.
class PermissionRequestQueue {
 public:
  using const_iterator =
      std::vector<base::circular_deque<PermissionRequest*>>::const_iterator;

  // Not copyable or movable
  PermissionRequestQueue(const PermissionRequestQueue&) = delete;
  PermissionRequestQueue& operator=(const PermissionRequestQueue&) = delete;
  PermissionRequestQueue();
  ~PermissionRequestQueue();

  bool IsEmpty() const;
  size_t Count(PermissionRequest* request) const;
  size_t size() const { return size_; }

  // Push a new request into queue. This function will decide based on request
  // priority and platform whether to call |PushBack| or |PushFront|.
  void Push(permissions::PermissionRequest* request);

  // Push a new request into the front of the section of the queue that
  // corresponds to its priority. E.g.: calling this function on a normal
  // priority |request| will put it in front of any other normal priority
  // requests, but still behind any high priority requests.
  void PushFront(permissions::PermissionRequest* request);

  // Push a new request into the back of the section of the queue that
  // corresponds to its priority. E.g.: calling this function on a normal
  // priority |request| will put it behind any other normal priority requests,
  // but still in front of any low priority requests.
  void PushBack(permissions::PermissionRequest* request);

  PermissionRequest* Pop();
  PermissionRequest* Peek() const;

  // Searches queued_requests_ and returns the first matching request, or
  // nullptr if there is no match.
  PermissionRequest* FindDuplicate(PermissionRequest* request) const;

  const_iterator begin() const;
  const_iterator end() const;

 private:
  enum class Priority {
    kLow,
    kMedium,
    kHigh,

    // Used to set the correct size of the |queued_requests_| vector.
    kNum,
  };

  static Priority DetermineRequestPriority(
      permissions::PermissionRequest* request);

  void PushFrontInternal(permissions::PermissionRequest* request,
                         Priority priority);
  void PushBackInternal(permissions::PermissionRequest* request,
                        Priority priority);

  // Each priority has a separate deque. There is an assumption made that the
  // priorities have strictly ascending, contignous values from lowest to
  // highest.
  std::vector<base::circular_deque<PermissionRequest*>> queued_requests_;

  size_t size_{0};
};

}  // namespace permissions

#endif  // COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_QUEUE_H_