#ifndef COMPONENTS_PERMISSIONS_PERMISSIONS_CLIENT_H_
#define COMPONENTS_PERMISSIONS_PERMISSIONS_CLIENT_H_
#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "components/permissions/origin_keyed_permission_action_service.h"
#include "components/permissions/permission_prompt.h"
#include "components/permissions/permission_ui_selector.h"
#include "components/permissions/permission_uma_util.h"
#include "components/permissions/permission_util.h"
#include "components/permissions/request_type.h"
#include "content/public/browser/browser_context.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "url/origin.h"
#if BUILDFLAG(IS_ANDROID)
#include "components/messages/android/message_wrapper.h"
#endif
class GURL;
class HostContentSettingsMap;
namespace content {
class BrowserContext;
class WebContents;
}
namespace content_settings {
class CookieSettings;
}
namespace infobars {
class InfoBar;
class InfoBarManager;
}
namespace permissions {
class ObjectPermissionContextBase;
class PermissionActionsHistory;
class PermissionDecisionAutoBlocker;
class PermissionPromptAndroid;
class PermissionsClient {
public:
#if BUILDFLAG(IS_ANDROID)
class PermissionMessageDelegate {
public:
virtual ~PermissionMessageDelegate() = default;
};
#endif
PermissionsClient(const PermissionsClient&) = delete;
PermissionsClient& operator=(const PermissionsClient&) = delete;
PermissionsClient();
virtual ~PermissionsClient();
static PermissionsClient* Get();
virtual HostContentSettingsMap* GetSettingsMap(
content::BrowserContext* browser_context) = 0;
virtual scoped_refptr<content_settings::CookieSettings> GetCookieSettings(
content::BrowserContext* browser_context) = 0;
virtual bool IsSubresourceFilterActivated(
content::BrowserContext* browser_context,
const GURL& url) = 0;
virtual OriginKeyedPermissionActionService*
GetOriginKeyedPermissionActionService(
content::BrowserContext* browser_context) = 0;
virtual PermissionActionsHistory* GetPermissionActionsHistory(
content::BrowserContext* browser_context) = 0;
virtual PermissionDecisionAutoBlocker* GetPermissionDecisionAutoBlocker(
content::BrowserContext* browser_context) = 0;
virtual ObjectPermissionContextBase* GetChooserContext(
content::BrowserContext* browser_context,
ContentSettingsType type) = 0;
virtual double GetSiteEngagementScore(
content::BrowserContext* browser_context,
const GURL& origin);
virtual void AreSitesImportant(
content::BrowserContext* browser_context,
std::vector<std::pair<url::Origin, bool>>* origins);
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH)
virtual bool IsCookieDeletionDisabled(
content::BrowserContext* browser_context,
const GURL& origin);
#endif
using GetUkmSourceIdCallback =
base::OnceCallback<void(absl::optional<ukm::SourceId>)>;
virtual void GetUkmSourceId(content::BrowserContext* browser_context,
content::WebContents* web_contents,
const GURL& requesting_origin,
GetUkmSourceIdCallback callback);
virtual IconId GetOverrideIconId(RequestType request_type);
virtual std::vector<std::unique_ptr<PermissionUiSelector>>
CreatePermissionUiSelectors(content::BrowserContext* browser_context);
using QuietUiReason = PermissionUiSelector::QuietUiReason;
#if !BUILDFLAG(IS_ANDROID)
virtual void TriggerPromptHatsSurveyIfEnabled(
content::BrowserContext* context,
permissions::RequestType request_type,
absl::optional<permissions::PermissionAction> action,
permissions::PermissionPromptDisposition prompt_disposition,
permissions::PermissionPromptDispositionReason prompt_disposition_reason,
permissions::PermissionRequestGestureType gesture_type,
absl::optional<base::TimeDelta> prompt_display_duration,
bool is_post_prompt,
const GURL& gurl,
base::OnceCallback<void()> hats_shown_callback_);
#endif
virtual void OnPromptResolved(
RequestType request_type,
PermissionAction action,
const GURL& origin,
PermissionPromptDisposition prompt_disposition,
PermissionPromptDispositionReason prompt_disposition_reason,
PermissionRequestGestureType gesture_type,
absl::optional<QuietUiReason> quiet_ui_reason,
base::TimeDelta prompt_display_duration,
content::WebContents* web_contents);
virtual absl::optional<bool> HadThreeConsecutiveNotificationPermissionDenies(
content::BrowserContext* browser_context);
virtual absl::optional<bool> HasPreviouslyAutoRevokedPermission(
content::BrowserContext* browser_context,
const GURL& origin,
ContentSettingsType permission);
virtual absl::optional<url::Origin> GetAutoApprovalOrigin();
virtual bool CanBypassEmbeddingOriginCheck(const GURL& requesting_origin,
const GURL& embedding_origin);
virtual absl::optional<GURL> OverrideCanonicalOrigin(
const GURL& requesting_origin,
const GURL& embedding_origin);
virtual bool DoURLsMatchNewTabPage(const GURL& requesting_origin,
const GURL& embedding_origin);
virtual permissions::PermissionIgnoredReason DetermineIgnoreReason(
content::WebContents* web_contents);
#if BUILDFLAG(IS_ANDROID)
virtual bool IsDseOrigin(content::BrowserContext* browser_context,
const url::Origin& origin);
virtual infobars::InfoBarManager* GetInfoBarManager(
content::WebContents* web_contents);
virtual infobars::InfoBar* MaybeCreateInfoBar(
content::WebContents* web_contents,
ContentSettingsType type,
base::WeakPtr<PermissionPromptAndroid> prompt);
virtual std::unique_ptr<PermissionMessageDelegate> MaybeCreateMessageUI(
content::WebContents* web_contents,
ContentSettingsType type,
base::WeakPtr<PermissionPromptAndroid> prompt);
using PermissionsUpdatedCallback = base::OnceCallback<void(bool)>;
virtual void RepromptForAndroidPermissions(
content::WebContents* web_contents,
const std::vector<ContentSettingsType>& content_settings_types,
const std::vector<ContentSettingsType>& filtered_content_settings_types,
const std::vector<std::string>& required_permissions,
const std::vector<std::string>& optional_permissions,
PermissionsUpdatedCallback callback);
virtual int MapToJavaDrawableId(int resource_id);
#else
virtual std::unique_ptr<PermissionPrompt> CreatePrompt(
content::WebContents* web_contents,
PermissionPrompt::Delegate* delegate);
#endif
};
}
#endif