#include "content/browser/permissions/permission_controller_impl.h"
#include "base/functional/bind.h"
#include "content/browser/permissions/permission_service_context.h"
#include "content/browser/permissions/permission_util.h"
#include "content/browser/renderer_host/render_frame_host_impl.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/disallow_activation_reason.h"
#include "content/public/browser/permission_controller.h"
#include "content/public/browser/permission_controller_delegate.h"
#include "content/public/browser/permission_request_description.h"
#include "content/public/browser/permission_result.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h"
#include "third_party/blink/public/common/permissions/permission_utils.h"
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
#include "third_party/blink/public/mojom/devtools/console_message.mojom.h"
#include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
#include "url/origin.h"
#if !BUILDFLAG(IS_ANDROID)
#include "content/common/features.h"
#endif
namespace content {
namespace {
constexpr char kPermissionBlockedFencedFrameMessage[] = …;
#if !BUILDFLAG(IS_ANDROID)
const char kPermissionBlockedPermissionsPolicyMessage[] = …;
#endif
std::optional<blink::scheduler::WebSchedulerTrackedFeature>
PermissionToSchedulingFeature(PermissionType permission_name) { … }
void LogPermissionBlockedMessage(PermissionType permission,
RenderFrameHost* rfh,
const char* message) { … }
#if !BUILDFLAG(IS_ANDROID)
bool PermissionAllowedByPermissionsPolicy(PermissionType permission_type,
RenderFrameHost* rfh) { … }
#endif
PermissionResult VerifyContextOfCurrentDocument(
PermissionType permission,
RenderFrameHost* render_frame_host) { … }
bool IsRequestAllowed(
const std::vector<blink::PermissionType>& permissions,
RenderFrameHost* render_frame_host,
base::OnceCallback<void(const std::vector<PermissionStatus>&)>& callback) { … }
void NotifySchedulerAboutPermissionRequest(RenderFrameHost* render_frame_host,
PermissionType permission_name) { … }
void MergeOverriddenAndDelegatedResults(
base::OnceCallback<void(const std::vector<PermissionStatus>&)> original_cb,
std::vector<std::optional<PermissionStatus>> overridden_results,
const std::vector<PermissionStatus>& delegated_results) { … }
void PermissionStatusCallbackWrapper(
base::OnceCallback<void(PermissionStatus)> callback,
const std::vector<PermissionStatus>& vector) { … }
std::vector<std::optional<blink::mojom::PermissionStatus>> OverridePermissions(
PermissionRequestDescription& description,
RenderFrameHost* render_frame_host,
const PermissionOverrides& permission_overrides) { … }
}
PermissionControllerImpl::PermissionControllerImpl(
BrowserContext* browser_context)
: … { … }
PermissionControllerImpl* PermissionControllerImpl::FromBrowserContext(
BrowserContext* browser_context) { … }
PermissionControllerImpl::~PermissionControllerImpl() { … }
PermissionStatus PermissionControllerImpl::GetSubscriptionCurrentValue(
const PermissionStatusSubscription& subscription) { … }
PermissionControllerImpl::SubscriptionsStatusMap
PermissionControllerImpl::GetSubscriptionsStatuses(
const std::optional<GURL>& origin) { … }
void PermissionControllerImpl::NotifyChangedSubscriptions(
const SubscriptionsStatusMap& old_statuses) { … }
PermissionControllerImpl::OverrideStatus
PermissionControllerImpl::GrantOverridesForDevTools(
const std::optional<url::Origin>& origin,
const std::vector<PermissionType>& permissions) { … }
PermissionControllerImpl::OverrideStatus
PermissionControllerImpl::SetOverrideForDevTools(
const std::optional<url::Origin>& origin,
PermissionType permission,
const PermissionStatus& status) { … }
void PermissionControllerImpl::ResetOverridesForDevTools() { … }
PermissionControllerImpl::OverrideStatus
PermissionControllerImpl::SetPermissionOverride(
const std::optional<url::Origin>& origin,
PermissionType permission,
const PermissionStatus& status) { … }
PermissionControllerImpl::OverrideStatus
PermissionControllerImpl::GrantPermissionOverrides(
const std::optional<url::Origin>& origin,
const std::vector<PermissionType>& permissions) { … }
void PermissionControllerImpl::ResetPermissionOverrides() { … }
void PermissionControllerImpl::RequestPermissions(
RenderFrameHost* render_frame_host,
PermissionRequestDescription request_description,
base::OnceCallback<void(const std::vector<PermissionStatus>&)> callback) { … }
void PermissionControllerImpl::RequestPermissionFromCurrentDocument(
RenderFrameHost* render_frame_host,
PermissionRequestDescription request_description,
base::OnceCallback<void(PermissionStatus)> callback) { … }
void PermissionControllerImpl::RequestPermissionsFromCurrentDocument(
RenderFrameHost* render_frame_host,
PermissionRequestDescription request_description,
base::OnceCallback<void(const std::vector<PermissionStatus>&)> callback) { … }
void PermissionControllerImpl::ResetPermission(blink::PermissionType permission,
const url::Origin& origin) { … }
PermissionStatus PermissionControllerImpl::GetPermissionStatusInternal(
PermissionType permission,
const GURL& requesting_origin,
const GURL& embedding_origin) { … }
PermissionStatus
PermissionControllerImpl::GetPermissionStatusForCurrentDocumentInternal(
PermissionType permission,
RenderFrameHost* render_frame_host,
bool should_include_device_status) { … }
PermissionStatus PermissionControllerImpl::GetPermissionStatusForWorker(
PermissionType permission,
RenderProcessHost* render_process_host,
const url::Origin& worker_origin) { … }
PermissionStatus
PermissionControllerImpl::GetPermissionStatusForCurrentDocument(
PermissionType permission,
RenderFrameHost* render_frame_host) { … }
PermissionResult
PermissionControllerImpl::GetPermissionResultForCurrentDocument(
PermissionType permission,
RenderFrameHost* render_frame_host) { … }
PermissionResult
PermissionControllerImpl::GetPermissionResultForOriginWithoutContext(
PermissionType permission,
const url::Origin& origin) { … }
PermissionResult
PermissionControllerImpl::GetPermissionResultForOriginWithoutContext(
PermissionType permission,
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) { … }
PermissionStatus
PermissionControllerImpl::GetPermissionStatusForEmbeddedRequester(
blink::PermissionType permission,
RenderFrameHost* render_frame_host,
const url::Origin& requesting_origin) { … }
PermissionStatus PermissionControllerImpl::GetCombinedPermissionAndDeviceStatus(
PermissionType permission,
RenderFrameHost* render_frame_host) { … }
void PermissionControllerImpl::ResetPermission(PermissionType permission,
const GURL& requesting_origin,
const GURL& embedding_origin) { … }
void PermissionControllerImpl::PermissionStatusChange(
const base::RepeatingCallback<void(PermissionStatus)>& callback,
SubscriptionId subscription_id,
PermissionStatus status,
bool ignore_status_override) { … }
PermissionController::SubscriptionId
PermissionControllerImpl::SubscribeToPermissionStatusChange(
PermissionType permission,
RenderProcessHost* render_process_host,
RenderFrameHost* render_frame_host,
const GURL& requesting_origin,
bool should_include_device_status,
const base::RepeatingCallback<void(PermissionStatus)>& callback) { … }
void PermissionControllerImpl::UnsubscribeFromPermissionStatusChange(
SubscriptionId subscription_id) { … }
bool PermissionControllerImpl::IsSubscribedToPermissionChangeEvent(
blink::PermissionType permission,
RenderFrameHost* render_frame_host) { … }
std::optional<gfx::Rect>
PermissionControllerImpl::GetExclusionAreaBoundsInScreen(
WebContents* web_contents) const { … }
void PermissionControllerImpl::NotifyEventListener() { … }
}