frame_permission_controller.h 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright 2020 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 FUCHSIA_WEB_WEBENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_
  5. #define FUCHSIA_WEB_WEBENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_
  6. #include <array>
  7. #include <vector>
  8. #include "base/callback_forward.h"
  9. #include "base/containers/flat_map.h"
  10. #include "third_party/blink/public/common/permissions/permission_utils.h"
  11. #include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
  12. namespace url {
  13. class Origin;
  14. } // namespace url
  15. namespace content {
  16. class WebContents;
  17. } // namespace content
  18. // FramePermissionController is responsible for web permissions state for a
  19. // fuchsia.web.Frame instance.
  20. class FramePermissionController {
  21. public:
  22. // |web_contents| must outlive FramePermissionController.
  23. explicit FramePermissionController(content::WebContents* web_contents);
  24. ~FramePermissionController();
  25. FramePermissionController(FramePermissionController&) = delete;
  26. FramePermissionController& operator=(FramePermissionController&) = delete;
  27. // Sets the |state| for the specified |permission| and |origin|.
  28. void SetPermissionState(blink::PermissionType permission,
  29. const url::Origin& origin,
  30. blink::mojom::PermissionStatus state);
  31. // Sets the default |state| for the specified |permission|. Setting |state| to
  32. // ASK causes the |default_permissions_| state to be used for |permission| for
  33. // this origin.
  34. // TODO(crbug.com/1063094): Allow ASK to be the default state, to indicate
  35. // that the user should be prompted.
  36. void SetDefaultPermissionState(blink::PermissionType permission,
  37. blink::mojom::PermissionStatus state);
  38. // Returns current permission state of the specified |permission| and
  39. // |requesting_origin|.
  40. blink::mojom::PermissionStatus GetPermissionState(
  41. blink::PermissionType permission,
  42. const url::Origin& requesting_origin);
  43. // Requests permission state for the specified |permissions|. When the request
  44. // is resolved, the |callback| is called with a list of status values, one for
  45. // each value in |permissions|, in the same order.
  46. //
  47. // TODO(crbug.com/1063094): Current implementation doesn't actually prompt the
  48. // user: all permissions in the ASK state are denied silently. Define
  49. // fuchsia.web.PermissionManager protocol and use it to request permissions.
  50. void RequestPermissions(
  51. const std::vector<blink::PermissionType>& permissions,
  52. const url::Origin& requesting_origin,
  53. bool user_gesture,
  54. base::OnceCallback<
  55. void(const std::vector<blink::mojom::PermissionStatus>&)> callback);
  56. private:
  57. struct PermissionSet {
  58. // Initializes all permissions with |initial_state|.
  59. explicit PermissionSet(blink::mojom::PermissionStatus initial_state);
  60. PermissionSet(const PermissionSet& other);
  61. PermissionSet& operator=(const PermissionSet& other);
  62. std::array<blink::mojom::PermissionStatus,
  63. static_cast<int>(blink::PermissionType::NUM)>
  64. permission_states;
  65. };
  66. // Returns the effective PermissionStatus for |origin|. If the per-|origin|
  67. // state is ASK, or there are no specific permissions set for |origin|, then
  68. // the default permission status takes effect. This means that it is not
  69. // currently possible to set a default of GRANTED/DENIED, and to override that
  70. // to ASK for specific origins.
  71. PermissionSet GetEffectivePermissionsForOrigin(const url::Origin& origin);
  72. content::WebContents* const web_contents_;
  73. base::flat_map<url::Origin, PermissionSet> per_origin_permissions_;
  74. PermissionSet default_permissions_{blink::mojom::PermissionStatus::DENIED};
  75. };
  76. #endif // FUCHSIA_WEB_WEBENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_