permission_manager.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // 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. #ifndef COMPONENTS_PERMISSIONS_PERMISSION_MANAGER_H_
  5. #define COMPONENTS_PERMISSIONS_PERMISSION_MANAGER_H_
  6. #include <map>
  7. #include <unordered_map>
  8. #include "base/callback_forward.h"
  9. #include "base/containers/flat_map.h"
  10. #include "base/containers/id_map.h"
  11. #include "base/memory/raw_ptr.h"
  12. #include "components/content_settings/core/browser/content_settings_observer.h"
  13. #include "components/content_settings/core/common/content_settings.h"
  14. #include "components/keyed_service/core/keyed_service.h"
  15. #include "components/permissions/permission_context_base.h"
  16. #include "components/permissions/permission_request_id.h"
  17. #include "components/permissions/permission_util.h"
  18. #include "content/public/browser/permission_controller_delegate.h"
  19. #include "content/public/browser/permission_result.h"
  20. #include "url/origin.h"
  21. namespace blink {
  22. enum class PermissionType;
  23. }
  24. namespace content {
  25. class BrowserContext;
  26. class RenderFrameHost;
  27. class RenderProcessHost;
  28. }
  29. class GeolocationPermissionContextDelegateTests;
  30. class SubscriptionInterceptingPermissionManager;
  31. namespace permissions {
  32. class PermissionContextBase;
  33. struct PermissionResult;
  34. class PermissionManagerTest;
  35. class PermissionManager : public KeyedService,
  36. public content::PermissionControllerDelegate,
  37. public permissions::Observer {
  38. public:
  39. using PermissionContextMap =
  40. std::unordered_map<ContentSettingsType,
  41. std::unique_ptr<PermissionContextBase>,
  42. ContentSettingsTypeHash>;
  43. PermissionManager(content::BrowserContext* browser_context,
  44. PermissionContextMap permission_contexts);
  45. PermissionManager(const PermissionManager&) = delete;
  46. PermissionManager& operator=(const PermissionManager&) = delete;
  47. ~PermissionManager() override;
  48. // KeyedService implementation.
  49. void Shutdown() override;
  50. PermissionContextBase* GetPermissionContextForTesting(
  51. ContentSettingsType type);
  52. PermissionContextMap& PermissionContextsForTesting() {
  53. return permission_contexts_;
  54. }
  55. private:
  56. friend class PermissionManagerTest;
  57. friend class ::GeolocationPermissionContextDelegateTests;
  58. friend class ::SubscriptionInterceptingPermissionManager;
  59. // The `PendingRequestLocalId` will be unique within the `PermissionManager`
  60. // instance, thus within a `BrowserContext`, which overachieves the
  61. // requirement from `PermissionRequestID` that the `RequestLocalId` be unique
  62. // within each frame.
  63. class PendingRequest;
  64. using PendingRequestLocalId = PermissionRequestID::RequestLocalId;
  65. using PendingRequestsMap =
  66. base::IDMap<std::unique_ptr<PendingRequest>, PendingRequestLocalId>;
  67. class PermissionResponseCallback;
  68. struct Subscription;
  69. using SubscriptionsMap =
  70. base::IDMap<std::unique_ptr<Subscription>, SubscriptionId>;
  71. using SubscriptionTypeCounts = base::flat_map<ContentSettingsType, size_t>;
  72. PermissionContextBase* GetPermissionContext(ContentSettingsType type);
  73. // content::PermissionControllerDelegate implementation.
  74. void RequestPermission(
  75. blink::PermissionType permission,
  76. content::RenderFrameHost* render_frame_host,
  77. const GURL& requesting_origin,
  78. bool user_gesture,
  79. base::OnceCallback<void(blink::mojom::PermissionStatus)> callback)
  80. override;
  81. void RequestPermissions(
  82. const std::vector<blink::PermissionType>& permissions,
  83. content::RenderFrameHost* render_frame_host,
  84. const GURL& requesting_origin,
  85. bool user_gesture,
  86. base::OnceCallback<
  87. void(const std::vector<blink::mojom::PermissionStatus>&)> callback)
  88. override;
  89. void ResetPermission(blink::PermissionType permission,
  90. const GURL& requesting_origin,
  91. const GURL& embedding_origin) override;
  92. void RequestPermissionsFromCurrentDocument(
  93. const std::vector<blink::PermissionType>& permissions,
  94. content::RenderFrameHost* render_frame_host,
  95. bool user_gesture,
  96. base::OnceCallback<
  97. void(const std::vector<blink::mojom::PermissionStatus>&)> callback)
  98. override;
  99. blink::mojom::PermissionStatus GetPermissionStatus(
  100. blink::PermissionType permission,
  101. const GURL& requesting_origin,
  102. const GURL& embedding_origin) override;
  103. content::PermissionResult GetPermissionResultForOriginWithoutContext(
  104. blink::PermissionType permission,
  105. const url::Origin& origin) override;
  106. blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument(
  107. blink::PermissionType permission,
  108. content::RenderFrameHost* render_frame_host) override;
  109. content::PermissionResult GetPermissionResultForCurrentDocument(
  110. blink::PermissionType permission,
  111. content::RenderFrameHost* render_frame_host) override;
  112. blink::mojom::PermissionStatus GetPermissionStatusForWorker(
  113. blink::PermissionType permission,
  114. content::RenderProcessHost* render_process_host,
  115. const GURL& worker_origin) override;
  116. bool IsPermissionOverridableByDevTools(
  117. blink::PermissionType permission,
  118. const absl::optional<url::Origin>& origin) override;
  119. SubscriptionId SubscribePermissionStatusChange(
  120. blink::PermissionType permission,
  121. content::RenderProcessHost* render_process_host,
  122. content::RenderFrameHost* render_frame_host,
  123. const GURL& requesting_origin,
  124. base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback)
  125. override;
  126. void UnsubscribePermissionStatusChange(
  127. SubscriptionId subscription_id) override;
  128. // Called when a permission was decided for a given PendingRequest. The
  129. // PendingRequest is identified by its |request_local_id| and the permission
  130. // is identified by its |permission_id|. If the PendingRequest contains more
  131. // than one permission, it will wait for the remaining permissions to be
  132. // resolved. When all the permissions have been resolved, the PendingRequest's
  133. // callback is run.
  134. void OnPermissionsRequestResponseStatus(
  135. PendingRequestLocalId request_local_id,
  136. int permission_id,
  137. ContentSetting status);
  138. // permissions::Observer:
  139. void OnPermissionChanged(const ContentSettingsPattern& primary_pattern,
  140. const ContentSettingsPattern& secondary_pattern,
  141. ContentSettingsTypeSet content_type_set) override;
  142. // Only one of |render_process_host| and |render_frame_host| should be set,
  143. // or neither. RenderProcessHost will be inferred from |render_frame_host|.
  144. PermissionResult GetPermissionStatusInternal(
  145. ContentSettingsType permission,
  146. content::RenderProcessHost* render_process_host,
  147. content::RenderFrameHost* render_frame_host,
  148. const GURL& requesting_origin,
  149. const GURL& embedding_origin);
  150. ContentSetting GetPermissionOverrideForDevTools(
  151. const url::Origin& origin,
  152. ContentSettingsType permission);
  153. // content::PermissionControllerDelegate implementation.
  154. // For the given |origin|, overrides permissions that belong to |overrides|.
  155. // These permissions are in-sync with the PermissionController.
  156. void SetPermissionOverridesForDevTools(
  157. const absl::optional<url::Origin>& origin,
  158. const PermissionOverrides& overrides) override;
  159. void ResetPermissionOverridesForDevTools() override;
  160. raw_ptr<content::BrowserContext> browser_context_;
  161. PendingRequestsMap pending_requests_;
  162. PendingRequestLocalId::Generator request_local_id_generator_;
  163. SubscriptionsMap subscriptions_;
  164. SubscriptionId::Generator subscription_id_generator_;
  165. // Tracks the number of Subscriptions in |subscriptions_| which have a
  166. // certain ContentSettingsType. An entry for a given ContentSettingsType key
  167. // is added on first use and never removed. This is done to utilize the
  168. // flat_map's efficiency in accessing/editing items and minimize the use of
  169. // the unefficient addition/removal of items.
  170. SubscriptionTypeCounts subscription_type_counts_;
  171. PermissionContextMap permission_contexts_;
  172. using ContentSettingsTypeOverrides =
  173. base::flat_map<ContentSettingsType, ContentSetting>;
  174. std::map<url::Origin, ContentSettingsTypeOverrides>
  175. devtools_permission_overrides_;
  176. url::Origin devtools_global_overrides_origin_;
  177. bool is_shutting_down_ = false;
  178. };
  179. } // namespace permissions
  180. #endif // COMPONENTS_PERMISSIONS_PERMISSION_MANAGER_H_