1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CONTENT_PUBLIC_BROWSER_DEVTOOLS_PERMISSION_OVERRIDES_H_
6 #define CONTENT_PUBLIC_BROWSER_DEVTOOLS_PERMISSION_OVERRIDES_H_
7 
8 #include <vector>
9 
10 #include "base/containers/flat_map.h"
11 #include "base/optional.h"
12 #include "content/common/content_export.h"
13 #include "content/public/browser/permission_type.h"
14 #include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
15 #include "url/origin.h"
16 
17 namespace content {
18 
19 // Maintains permission overrides for each origin.
20 class CONTENT_EXPORT DevToolsPermissionOverrides {
21  public:
22   explicit DevToolsPermissionOverrides();
23   ~DevToolsPermissionOverrides();
24   DevToolsPermissionOverrides(DevToolsPermissionOverrides&& other);
25   DevToolsPermissionOverrides& operator=(DevToolsPermissionOverrides&& other);
26 
27   DevToolsPermissionOverrides(const DevToolsPermissionOverrides&) = delete;
28   DevToolsPermissionOverrides& operator=(const DevToolsPermissionOverrides&) =
29       delete;
30 
31   using PermissionOverrides =
32       base::flat_map<PermissionType, blink::mojom::PermissionStatus>;
33 
34   // Set permission override for |permission| at |origin| to |status|.
35   // Null |origin| specifies global overrides.
36   void Set(const base::Optional<url::Origin>& origin,
37            PermissionType permission,
38            const blink::mojom::PermissionStatus& status);
39 
40   // Get override for |origin| set for |permission|, if specified.
41   base::Optional<blink::mojom::PermissionStatus> Get(
42       const url::Origin& origin,
43       PermissionType permission) const;
44 
45   // Get all overrides for particular |origin|, stored in |overrides|
46   // if found. Will return empty overrides if none previously existed. Returns
47   // global overrides when |origin| is nullptr.
48   const PermissionOverrides& GetAll(
49       const base::Optional<url::Origin>& origin) const;
50 
51   // Resets overrides for |origin|.
52   // Null |origin| resets global overrides.
53   void Reset(const base::Optional<url::Origin>& origin);
54 
55   // Sets status for |permissions| to GRANTED in |origin|, and DENIED
56   // for all others.
57   // Null |origin| grants permissions globally for context.
58   void GrantPermissions(const base::Optional<url::Origin>& origin,
59                         const std::vector<PermissionType>& permissions);
60 
61  private:
62   url::Origin global_overrides_origin_;
63   base::flat_map<url::Origin, PermissionOverrides> overrides_;
64 };
65 
66 }  // namespace content
67 
68 #endif  // CONTENT_PUBLIC_BROWSER_DEVTOOLS_PERMISSION_OVERRIDES_H_
69