blob: bc7e0406f875793d7595f14bc956f43f5f0a0806 [file] [log] [blame]
mlamouri4e372022015-03-29 14:51:061// Copyright 2015 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 CHROME_BROWSER_PERMISSIONS_PERMISSION_MANAGER_H_
6#define CHROME_BROWSER_PERMISSIONS_PERMISSION_MANAGER_H_
7
raymese3afee6b2016-04-18 02:00:508#include <unordered_map>
9
mlamouri4e372022015-03-29 14:51:0610#include "base/callback_forward.h"
mlamouri23957a22015-04-01 10:37:5611#include "base/id_map.h"
mlamouri4e372022015-03-29 14:51:0612#include "base/macros.h"
lalitm27583e92015-10-02 11:34:1713#include "base/memory/weak_ptr.h"
raymes7c1c35a22016-06-23 00:20:5314#include "chrome/browser/permissions/permission_util.h"
mlamouri23957a22015-04-01 10:37:5615#include "components/content_settings/core/browser/content_settings_observer.h"
lalitm27583e92015-10-02 11:34:1716#include "components/content_settings/core/common/content_settings.h"
mlamouri4e372022015-03-29 14:51:0617#include "components/keyed_service/core/keyed_service.h"
18#include "content/public/browser/permission_manager.h"
19
raymese3afee6b2016-04-18 02:00:5020class PermissionContextBase;
mlamouri4e372022015-03-29 14:51:0621class Profile;
22
23namespace content {
24enum class PermissionType;
mlamouri4e372022015-03-29 14:51:0625}; // namespace content
26
27class PermissionManager : public KeyedService,
mlamouri23957a22015-04-01 10:37:5628 public content::PermissionManager,
29 public content_settings::Observer {
mlamouri4e372022015-03-29 14:51:0630 public:
raymese3afee6b2016-04-18 02:00:5031 static PermissionManager* Get(Profile* profile);
32
mlamouri4e372022015-03-29 14:51:0633 explicit PermissionManager(Profile* profile);
34 ~PermissionManager() override;
35
36 // content::PermissionManager implementation.
lalitm27583e92015-10-02 11:34:1737 int RequestPermission(
mlamouri4e372022015-03-29 14:51:0638 content::PermissionType permission,
mlamouri5fc460f2015-06-03 17:30:2839 content::RenderFrameHost* render_frame_host,
mlamouri4e372022015-03-29 14:51:0640 const GURL& requesting_origin,
benwellsfd2b1552016-07-05 04:26:5341 bool user_gesture,
mathpcc29ae52016-05-04 15:22:1742 const base::Callback<void(blink::mojom::PermissionStatus)>& callback)
43 override;
mlamouri8b5ec902015-10-24 00:52:0344 int RequestPermissions(
45 const std::vector<content::PermissionType>& permissions,
46 content::RenderFrameHost* render_frame_host,
47 const GURL& requesting_origin,
benwellsfd2b1552016-07-05 04:26:5348 bool user_gesture,
mathpcc29ae52016-05-04 15:22:1749 const base::Callback<
50 void(const std::vector<blink::mojom::PermissionStatus>&)>& callback)
leon.han06e55662016-03-26 17:19:4251 override;
lalitm5bd7eb042015-10-02 16:00:2952 void CancelPermissionRequest(int request_id) override;
mlamouri4e372022015-03-29 14:51:0653 void ResetPermission(content::PermissionType permission,
54 const GURL& requesting_origin,
55 const GURL& embedding_origin) override;
mathpcc29ae52016-05-04 15:22:1756 blink::mojom::PermissionStatus GetPermissionStatus(
mlamouri4e372022015-03-29 14:51:0657 content::PermissionType permission,
58 const GURL& requesting_origin,
59 const GURL& embedding_origin) override;
mlamouri4e372022015-03-29 14:51:0660 void RegisterPermissionUsage(content::PermissionType permission,
61 const GURL& requesting_origin,
62 const GURL& embedding_origin) override;
mlamouri23957a22015-04-01 10:37:5663 int SubscribePermissionStatusChange(
64 content::PermissionType permission,
65 const GURL& requesting_origin,
66 const GURL& embedding_origin,
mathpcc29ae52016-05-04 15:22:1767 const base::Callback<void(blink::mojom::PermissionStatus)>& callback)
68 override;
mlamouri23957a22015-04-01 10:37:5669 void UnsubscribePermissionStatusChange(int subscription_id) override;
mlamouri4e372022015-03-29 14:51:0670
raymes893dbdd602016-12-19 22:49:2971 // TODO(raymes): Rather than exposing this, expose a denial reason from
72 // GetPermissionStatus so that callers can determine whether a permission is
73 // denied due to the kill switch.
74 bool IsPermissionKillSwitchOn(content::PermissionType permission);
75
mlamouri4e372022015-03-29 14:51:0676 private:
raymese3afee6b2016-04-18 02:00:5077 friend class GeolocationPermissionContextTests;
raymese3afee6b2016-04-18 02:00:5078
mlamouri8b5ec902015-10-24 00:52:0379 class PendingRequest;
rlandayde24c6d2016-12-01 03:05:4080 using PendingRequestsMap = IDMap<std::unique_ptr<PendingRequest>>;
lalitm27583e92015-10-02 11:34:1781
mlamouri23957a22015-04-01 10:37:5682 struct Subscription;
rlandayde24c6d2016-12-01 03:05:4083 using SubscriptionsMap = IDMap<std::unique_ptr<Subscription>>;
mlamouri23957a22015-04-01 10:37:5684
raymese3afee6b2016-04-18 02:00:5085 PermissionContextBase* GetPermissionContext(content::PermissionType type);
86
mlamouri8b5ec902015-10-24 00:52:0387 // Called when a permission was decided for a given PendingRequest. The
88 // PendingRequest is identified by its |request_id| and the permission is
89 // identified by its |permission_id|. If the PendingRequest contains more than
90 // one permission, it will wait for the remaining permissions to be resolved.
91 // When all the permissions have been resolved, the PendingRequest's callback
92 // is run.
93 void OnPermissionsRequestResponseStatus(
lalitm27583e92015-10-02 11:34:1794 int request_id,
mlamouri8b5ec902015-10-24 00:52:0395 int permission_id,
mathpcc29ae52016-05-04 15:22:1796 blink::mojom::PermissionStatus status);
lalitm27583e92015-10-02 11:34:1797
mlamouri23957a22015-04-01 10:37:5698 // content_settings::Observer implementation.
99 void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern,
100 const ContentSettingsPattern& secondary_pattern,
101 ContentSettingsType content_type,
102 std::string resource_identifier) override;
103
raymes893dbdd602016-12-19 22:49:29104 ContentSetting GetPermissionStatusInternal(content::PermissionType permission,
105 const GURL& requesting_origin,
106 const GURL& embedding_origin);
107
mlamouri4e372022015-03-29 14:51:06108 Profile* profile_;
lalitm27583e92015-10-02 11:34:17109 PendingRequestsMap pending_requests_;
mlamouri23957a22015-04-01 10:37:56110 SubscriptionsMap subscriptions_;
mlamouri4e372022015-03-29 14:51:06111
raymese3afee6b2016-04-18 02:00:50112 std::unordered_map<content::PermissionType,
dcheng4af48582016-04-19 00:29:35113 std::unique_ptr<PermissionContextBase>,
raymese3afee6b2016-04-18 02:00:50114 PermissionTypeHash>
115 permission_contexts_;
116
lalitm27583e92015-10-02 11:34:17117 base::WeakPtrFactory<PermissionManager> weak_ptr_factory_;
118
mlamouri4e372022015-03-29 14:51:06119 DISALLOW_COPY_AND_ASSIGN(PermissionManager);
120};
121
122#endif // CHROME_BROWSER_PERMISSIONS_PERMISSION_MANAGER_H_