blob: 54996fdb9c450bc78de78dc4e2b5ce57e1cfee3f [file] [log] [blame] [edit]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_PUBLIC_BROWSER_PERMISSION_CONTROLLER_H_
#define CONTENT_PUBLIC_BROWSER_PERMISSION_CONTROLLER_H_
#include "base/containers/id_map.h"
#include "base/supports_user_data.h"
#include "base/types/id_type.h"
#include "content/common/content_export.h"
#include "content/public/browser/permission_request_description.h"
#include "content/public/browser/permission_result.h"
#include "content/public/browser/permission_status_subscription.h"
#include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
class GURL;
namespace blink {
enum class PermissionType;
}
namespace url {
class Origin;
}
namespace content {
class RenderFrameHost;
class RenderProcessHost;
// This class allows the content layer to manipulate permissions. It's behavior
// is defined by the embedder via PermissionControllerDelegate implementation.
// TODO(crbug.com/40220500): Use url::Origin instead of GURL.
class CONTENT_EXPORT PermissionController
: public base::SupportsUserData::Data {
public:
// Identifier for an active PermissionResultSubscription. This is
// intentionally a distinct type from
// PermissionControllerDelegate::SubscriptionId as the concrete identifier
// values may be different.
using SubscriptionId = base::IdType64<PermissionController>;
using SubscriptionsMap =
base::IDMap<std::unique_ptr<PermissionResultSubscription>,
SubscriptionId>;
~PermissionController() override = default;
// Returns the status of the given |permission| for a worker on
// |worker_origin| running in the renderer corresponding to
// |render_process_host|.
// TODO(crbug.com/443991476):
virtual PermissionStatus GetPermissionStatusForWorker(
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
RenderProcessHost* render_process_host,
const url::Origin& worker_origin) = 0;
// Returns the permission result of the given |permission| for a worker on
// |worker_origin| running in the renderer corresponding to
// |render_process_host|.
virtual PermissionResult GetPermissionResultForWorker(
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
RenderProcessHost* render_process_host,
const url::Origin& worker_origin) = 0;
// Returns the permission status for the current document in the given
// RenderFrameHost. This API takes into account the lifecycle state of a given
// document (i.e. whether it's in back-forward cache or being prerendered) in
// addition to its origin.
virtual PermissionStatus GetPermissionStatusForCurrentDocument(
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
RenderFrameHost* render_frame_host) = 0;
// The method does the same as `GetPermissionStatusForCurrentDocument` but
// additionally returns a source or reason for the permission status.
virtual PermissionResult GetPermissionResultForCurrentDocument(
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
RenderFrameHost* render_frame_host) = 0;
// The method does the same as `GetPermissionStatusForCurrentDocument` but it
// also takes into account the device's status (OS permission status).
// Currently, this function is only used for Page Embedded Permission Control.
virtual PermissionStatus GetCombinedPermissionAndDeviceStatus(
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
RenderFrameHost* render_frame_host) = 0;
// Returns the permission status for a given origin. Use this API only if
// there is no document and it is not a ServiceWorker.
virtual PermissionResult GetPermissionResultForOriginWithoutContext(
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
const url::Origin& origin) = 0;
// The method does the same as `GetPermissionResultForOriginWithoutContext`
// but it can be used for `PermissionType` that are keyed on a combination of
// requesting and embedding origins, e.g., Notifications or StorageAccess.
virtual PermissionResult GetPermissionResultForOriginWithoutContext(
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) = 0;
// Requests the permission from the current document in the given
// RenderFrameHost. This API takes into account the lifecycle state of a given
// document (i.e. whether it's in back-forward cache or being prerendered) in
// addition to its origin.
// TODO(crbug.com/40275129): Remove this function because it doesn't make
// sense to have a single `PermissionStatus` as the callback. Related code
// should be refactored and use the function following this one which is using
// a vector of PermissionStatus for callbacks.
virtual void RequestPermissionFromCurrentDocument(
RenderFrameHost* render_frame_host,
PermissionRequestDescription request_description,
base::OnceCallback<void(PermissionResult)> callback) = 0;
// RenderFrameHost. This API takes into account the lifecycle state of a given
// document (i.e. whether it's in back-forward cache or being prerendered) in
// addition to its origin.
// WARNING: Permission requests order is not guaranteed.
// TODO(crbug.com/40864728): Migrate to `std::set`.
virtual void RequestPermissionsFromCurrentDocument(
RenderFrameHost* render_frame_host,
PermissionRequestDescription request_description,
base::OnceCallback<void(const std::vector<PermissionResult>&)>
callback) = 0;
// Sets the permission back to its default for the `origin`.
virtual void ResetPermission(blink::PermissionType permission,
const url::Origin& origin) = 0;
// Create a new subscription for permission result changes and call the
// permission_controller_delegate.
// Only one of |render_process_host| and |render_frame_host| should be set,
// or neither. RenderProcessHost will be inferred from |render_frame_host|.
virtual SubscriptionId SubscribeToPermissionResultChange(
blink::mojom::PermissionDescriptorPtr permission_descriptor,
RenderProcessHost* render_process_host,
RenderFrameHost* render_frame_host,
const GURL& requesting_origin,
bool should_include_device_status,
const base::RepeatingCallback<void(PermissionResult)>& callback) = 0;
// Unsubscribe permission status result. This function will remove
// subscription from subscriptions list and call
// permission_controller_delegate to remove related data in the delegate.
virtual void UnsubscribeFromPermissionResultChange(
SubscriptionId subscription_id) = 0;
// Returns `true` if a document subscribed to
// `PermissionStatus.onchange` listener or `PermissionStatus.AddEventListener`
// with a type `change` was added. Returns `false` otherwise.
virtual bool IsSubscribedToPermissionChangeEvent(
blink::PermissionType permission,
RenderFrameHost* render_frame_host) = 0;
};
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_PERMISSION_CONTROLLER_H_