blob: 75c032660fd716d56b689525dc51b2cc9929d2b3 [file] [log] [blame]
// 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/supports_user_data.h"
#include "base/types/id_type.h"
#include "content/common/content_export.h"
#include "content/public/browser/permission_result.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/1312212): Use url::Origin instead of GURL.
class CONTENT_EXPORT PermissionController
: public base::SupportsUserData::Data {
public:
// Identifier for an active subscription. This is intentionally a distinct
// type from PermissionControllerDelegate::SubscriptionId as the concrete
// identifier values may be different.
using SubscriptionId = base::IdType64<PermissionController>;
~PermissionController() override {}
// Returns the status of the given |permission| for a worker on
// |worker_origin| running in the renderer corresponding to
// |render_process_host|.
virtual blink::mojom::PermissionStatus GetPermissionStatusForWorker(
blink::PermissionType permission,
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 blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument(
blink::PermissionType permission,
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(
blink::PermissionType permission,
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(
blink::PermissionType permission,
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.
virtual blink::mojom::PermissionStatus
GetPermissionStatusForOriginWithoutContext(
blink::PermissionType permission,
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.
virtual void RequestPermissionFromCurrentDocument(
blink::PermissionType permission,
RenderFrameHost* render_frame_host,
bool user_gesture,
base::OnceCallback<void(blink::mojom::PermissionStatus)> callback) = 0;
// Requests permissions 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.
// WARNING: Permission requests order is not guaranteed.
// TODO(crbug.com/1363094): Migrate to `std::set`.
virtual void RequestPermissionsFromCurrentDocument(
const std::vector<blink::PermissionType>& permission,
RenderFrameHost* render_frame_host,
bool user_gesture,
base::OnceCallback<void(
const std::vector<blink::mojom::PermissionStatus>&)> callback) = 0;
// Sets the permission back to its default for the `origin`.
virtual void ResetPermission(blink::PermissionType permission,
const url::Origin& origin) = 0;
virtual SubscriptionId SubscribePermissionStatusChange(
blink::PermissionType permission,
RenderProcessHost* render_process_host,
const url::Origin& requesting_origin,
const base::RepeatingCallback<void(blink::mojom::PermissionStatus)>&
callback) = 0;
virtual void UnsubscribePermissionStatusChange(
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
namespace std {
template <>
struct hash<content::PermissionController::SubscriptionId> {
std::size_t operator()(
const content::PermissionController::SubscriptionId& v) const {
content::PermissionController::SubscriptionId::Hasher hasher;
return hasher(v);
}
};
} // namespace std
#endif // CONTENT_PUBLIC_BROWSER_PERMISSION_CONTROLLER_H_