| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FUCHSIA_WEB_WEBENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_ |
| #define FUCHSIA_WEB_WEBENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_ |
| |
| #include <array> |
| #include <vector> |
| |
| #include "base/containers/flat_map.h" |
| #include "base/functional/callback_forward.h" |
| #include "third_party/blink/public/common/permissions/permission_utils.h" |
| #include "third_party/blink/public/mojom/permissions/permission_status.mojom.h" |
| |
| namespace url { |
| class Origin; |
| } // namespace url |
| |
| namespace content { |
| class WebContents; |
| } // namespace content |
| |
| // FramePermissionController is responsible for web permissions state for a |
| // fuchsia.web.Frame instance. |
| class FramePermissionController { |
| public: |
| // |web_contents| must outlive FramePermissionController. |
| explicit FramePermissionController(content::WebContents* web_contents); |
| ~FramePermissionController(); |
| |
| FramePermissionController(FramePermissionController&) = delete; |
| FramePermissionController& operator=(FramePermissionController&) = delete; |
| |
| // Sets the |state| for the specified |permission| and |origin|. |
| void SetPermissionState(blink::PermissionType permission, |
| const url::Origin& origin, |
| blink::mojom::PermissionStatus state); |
| |
| // Sets the default |state| for the specified |permission|. Setting |state| to |
| // ASK causes the |default_permissions_| state to be used for |permission| for |
| // this origin. |
| // TODO(crbug.com/1063094): Allow ASK to be the default state, to indicate |
| // that the user should be prompted. |
| void SetDefaultPermissionState(blink::PermissionType permission, |
| blink::mojom::PermissionStatus state); |
| |
| // Returns current permission state of the specified |permission| and |
| // |requesting_origin|. |
| blink::mojom::PermissionStatus GetPermissionState( |
| blink::PermissionType permission, |
| const url::Origin& requesting_origin); |
| |
| // Requests permission state for the specified |permissions|. When the request |
| // is resolved, the |callback| is called with a list of status values, one for |
| // each value in |permissions|, in the same order. |
| // |
| // TODO(crbug.com/1063094): Current implementation doesn't actually prompt the |
| // user: all permissions in the ASK state are denied silently. Define |
| // fuchsia.web.PermissionManager protocol and use it to request permissions. |
| void RequestPermissions( |
| const std::vector<blink::PermissionType>& permissions, |
| const url::Origin& requesting_origin, |
| bool user_gesture, |
| base::OnceCallback< |
| void(const std::vector<blink::mojom::PermissionStatus>&)> callback); |
| |
| private: |
| struct PermissionSet { |
| // Initializes all permissions with |initial_state|. |
| explicit PermissionSet(blink::mojom::PermissionStatus initial_state); |
| |
| PermissionSet(const PermissionSet& other); |
| PermissionSet& operator=(const PermissionSet& other); |
| |
| std::array<blink::mojom::PermissionStatus, |
| static_cast<int>(blink::PermissionType::NUM)> |
| permission_states; |
| }; |
| |
| // Returns the effective PermissionStatus for |origin|. If the per-|origin| |
| // state is ASK, or there are no specific permissions set for |origin|, then |
| // the default permission status takes effect. This means that it is not |
| // currently possible to set a default of GRANTED/DENIED, and to override that |
| // to ASK for specific origins. |
| PermissionSet GetEffectivePermissionsForOrigin(const url::Origin& origin); |
| |
| content::WebContents* const web_contents_; |
| |
| base::flat_map<url::Origin, PermissionSet> per_origin_permissions_; |
| PermissionSet default_permissions_{blink::mojom::PermissionStatus::DENIED}; |
| }; |
| |
| #endif // FUCHSIA_WEB_WEBENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_ |