blob: 75b1b583d40365bb80733e4a0e51c8935dd94ade [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_SAFETY_HUB_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_SAFETY_HUB_HANDLER_H_
#include <set>
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "base/time/clock.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/safety_hub/extensions_result.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "components/content_settings/core/common/content_settings_constraints.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "extensions/browser/extension_prefs_observer.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/common/extension_id.h"
#include "url/origin.h"
namespace extensions {
class ExtensionPrefs;
class ExtensionRegistry;
} // namespace extensions
// The state of Safe Browsing settings.
enum class SafeBrowsingState {
kEnabledEnhanced = 0,
kEnabledStandard = 1,
kDisabledByAdmin = 2,
kDisabledByExtension = 3,
kDisabledByUser = 4,
// New enum values must go above here.
kMaxValue = kDisabledByUser,
};
/**
* This handler deals with the permission-related operations on the site
* settings page.
*/
class SafetyHubHandler : public settings::SettingsPageUIHandler,
public extensions::ExtensionPrefsObserver,
public extensions::ExtensionRegistryObserver {
public:
enum class SafetyHubModule {
kExtensions,
kNotifications,
kPasswords,
kSafeBrowsing,
kUnusedSitePermissions,
kVersion
};
explicit SafetyHubHandler(Profile* profile);
~SafetyHubHandler() override;
static std::unique_ptr<SafetyHubHandler> GetForProfile(Profile* profile);
// Testing functions to manipulate the handlers CWSInfoService and the
// triggering extension dictionary.
void SetTriggeringExtensionForTesting(std::string extension_id);
void ClearExtensionResultsForTesting();
private:
friend class SafetyHubHandlerTest;
friend class
SafetyHubHandlerEitherAbusiveOrUnusedPermissionRevocationDisabledTest;
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
PopulateUnusedSitePermissionsData);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
HandleAllowPermissionsAgainForUnusedSite);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
HandleAcknowledgeRevokedUnusedSitePermissionsList);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
PopulateAbusiveAndUnusedSitePermissionsData);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
HandleAllowPermissionsAgainForAbusiveSite);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
HandleAllowPermissionsAgainForAbusiveAndUnusedSite);
FRIEND_TEST_ALL_PREFIXES(
SafetyHubHandlerTest,
HandleAcknowledgeRevokedAbusiveAndUnusedSitePermissionsList);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
HandleIgnoreOriginsForNotificationPermissionReview);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
HandleBlockNotificationPermissionForOrigins);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
HandleAllowNotificationPermissionForOrigins);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
HandleResetNotificationPermissionForOrigins);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
PopulateNotificationPermissionReviewData);
FRIEND_TEST_ALL_PREFIXES(
SafetyHubHandlerTest,
HandleUndoIgnoreOriginsForNotificationPermissionReview);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
SendNotificationPermissionReviewList_FeatureEnabled);
FRIEND_TEST_ALL_PREFIXES(
SafetyHubHandlerTest,
SendNotificationPermissionReviewList_FeatureDisabled);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest, RevokeAllContentSettingTypes);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerParameterizedTest,
PasswordCardState);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest, PasswordCardCheckTime);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest, VersionCardUpToDate);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest, VersionCardOutOfDate);
FRIEND_TEST_ALL_PREFIXES(SafetyHubHandlerTest,
ExtensionPrefAndInitialization);
FRIEND_TEST_ALL_PREFIXES(
SafetyHubHandlerEitherAbusiveOrUnusedPermissionRevocationDisabledTest,
PopulateSitePermissionsData);
FRIEND_TEST_ALL_PREFIXES(
SafetyHubHandlerEitherAbusiveOrUnusedPermissionRevocationDisabledTest,
HandleAllowPermissionsAgainForSite);
FRIEND_TEST_ALL_PREFIXES(
SafetyHubHandlerEitherAbusiveOrUnusedPermissionRevocationDisabledTest,
HandleAcknowledgeRevokedSitePermissionsList);
// SettingsPageUIHandler implementation.
void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override;
// WebUIMessageHandler implementation.
void RegisterMessages() override;
// Returns the list of revoked permissions to be used in
// "Unused site permissions" module.
void HandleGetRevokedUnusedSitePermissionsList(const base::Value::List& args);
// Re-grant the revoked permissions and remove the given origin from the
// revoked permissions list.
void HandleAllowPermissionsAgainForUnusedSite(const base::Value::List& args);
// Reverse the changes made by |HandleAllowPermissionsAgainForUnusedSite| for
// the given |UnusedSitePermission| object.
void HandleUndoAllowPermissionsAgainForUnusedSite(
const base::Value::List& args);
// Clear the list of revoked permissions so they are not shown again.
// Permission settings themselves are not affected by this.
void HandleAcknowledgeRevokedUnusedSitePermissionsList(
const base::Value::List& args);
// Reverse the changes made by
// |HandleAcknowledgeRevokedUnusedSitePermissionsList| for the given list of
// |UnusedSitePermission| objects. List of revoked
// permissions is repopulated. Permission settings are not changed.
void HandleUndoAcknowledgeRevokedUnusedSitePermissionsList(
const base::Value::List& args);
// Returns the list of revoked permissions that belongs to origins which
// haven't been visited recently.
// TODO(crbug.com/40267370): Get list of revoked permissions from the unused
// site permission service instead.
base::Value::List PopulateUnusedSitePermissionsData();
// Sends the list of unused site permissions to review to the WebUI.
void SendUnusedSitePermissionsReviewList();
// Returns the list of notification permissions that needs to be reviewed.
void HandleGetNotificationPermissionReviewList(const base::Value::List& args);
// Handles ignoring origins for the review notification permissions feature.
void HandleIgnoreOriginsForNotificationPermissionReview(
const base::Value::List& args);
// Handles resetting a notification permission for given origins.
void HandleResetNotificationPermissionForOrigins(
const base::Value::List& args);
// Handles blocking notification permissions for multiple origins.
void HandleBlockNotificationPermissionForOrigins(
const base::Value::List& args);
// Handles allowing notification permissions for multiple origins.
void HandleAllowNotificationPermissionForOrigins(
const base::Value::List& args);
// Handles reverting the action of ignoring origins for review notification
// permissions feature by removing them from the notification permission
// verification blocklist.
void HandleUndoIgnoreOriginsForNotificationPermissionReview(
const base::Value::List& args);
// Handles dismissing the active menu notification for Safety Hub.
void HandleDismissActiveMenuNotification(const base::Value::List& args);
// Handles dismissing the menu notifications for the password module.
void HandleDismissPasswordMenuNotification(const base::Value::List& args);
// Handles dismissing the menu notifications for the extensions module.
void HandleDismissExtensionsMenuNotification(const base::Value::List& args);
// Returns the data for Safe Browsing card.
void HandleGetSafeBrowsingCardData(const base::Value::List& args);
// Returns the data for the password card.
void HandleGetPasswordCardData(const base::Value::List& args);
// Returns the data for the version card.
void HandleGetVersionCardData(const base::Value::List& args);
// Fetches data for the version card to return data to the UI.
base::Value::Dict GetVersionCardData();
// Returns the data for Safety Hub entry point.
void HandleGetSafetyHubEntryPointData(const base::Value::List& args);
// Returns true if Safety Hub has recommendations.
void HandleGetSafetyHubHasRecommendations(const base::Value::List& args);
// Returns the subheader for Safety Hub entry point in settings.
void HandleGetSafetyHubEntryPointSubheader(const base::Value::List& args);
// Sends the list of notification permissions to review to the WebUI.
void SendNotificationPermissionReviewList();
// Creates the safety hub results object which tracks triggering
// extensions.
void InitSafetyHubExtensionResults();
// Returns the set of Safety Hub modules which require the user's attention.
std::set<SafetyHubModule> GetSafetyHubModulesWithRecommendations();
// Calculate the number of extensions that need to be reviewed by the
// user.
void HandleGetNumberOfExtensionsThatNeedReview(const base::Value::List& args);
// Return the number of extensions that should be reviewed by the user.
// There are currently three triggers the `SafetyHubHandler` tracks:
// -- Extension Malware Violation
// -- Extension Policy Violation
// -- Extension Unpublished by the developer
// -- Extension that is considerard unwanted
// -- Extension that is considerard offstore
// When first called it will create the `extension_sh_result_` object.
int GetNumberOfExtensionsThatNeedReview();
// Let listeners know that the number of extensions that need review may
// have changed.
void UpdateNumberOfExtensionsThatNeedReview(
int num_extension_need_review_before,
int num_extension_need_review_after);
// ExtensionPrefsObserver implementation to track changes to extensions.
void OnExtensionPrefsUpdated(const std::string& extension_id) override;
void OnExtensionPrefsWillBeDestroyed(
extensions::ExtensionPrefs* prefs) override;
// ExtensionRegistryObserver implementation to track changes to extensions.
void OnExtensionUninstalled(content::BrowserContext* browser_context,
const extensions::Extension* extension,
extensions::UninstallReason reason) override;
void OnShutdown(extensions::ExtensionRegistry* registry) override;
// Record a visit to the Safety Hub page.
void HandleRecordSafetyHubVisit(const base::Value::List& args);
// Record an interaction with one of the Safety Hub modules.
void HandleRecordSafetyHubInteraction(const base::Value::List& args);
// The `extension_sh_result_` contains the needed information about how
// many extensions should be reviewed by the user.
std::unique_ptr<SafetyHubExtensionsResult> extension_sh_result_;
const raw_ptr<Profile, DanglingUntriaged> profile_;
raw_ptr<base::Clock> clock_;
void SetClockForTesting(base::Clock* clock);
// Listen to the extension prefs and the extension registry for when
// prefs are unloaded or changed or an extension is removed.
base::ScopedObservation<extensions::ExtensionRegistry,
extensions::ExtensionRegistryObserver>
extension_registry_observation_{this};
base::ScopedObservation<extensions::ExtensionPrefs,
extensions::ExtensionPrefsObserver>
prefs_observation_{this};
base::WeakPtrFactory<SafetyHubHandler> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_SAFETY_HUB_HANDLER_H_