Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3142)

Unified Diff: chrome/browser/permissions/permission_decision_auto_blocker.cc

Issue 2640033006: Convert AutoBlocker static class to KeyedService. (Closed)
Patch Set: Remove ShouldChangeDismissalToBlock Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/permissions/permission_decision_auto_blocker.cc
diff --git a/chrome/browser/permissions/permission_decision_auto_blocker.cc b/chrome/browser/permissions/permission_decision_auto_blocker.cc
index b38ee5edd010edea28f76564337c263b2f75c207..59f50acdd0be55dd92d0955a346f0d7e9f9e1695 100644
--- a/chrome/browser/permissions/permission_decision_auto_blocker.cc
+++ b/chrome/browser/permissions/permission_decision_auto_blocker.cc
@@ -12,11 +12,16 @@
#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
#include "base/values.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/permissions/permission_blacklist_client.h"
#include "chrome/browser/permissions/permission_util.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/common/chrome_features.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/safe_browsing_db/database_manager.h"
#include "components/variations/variations_associated_data.h"
#include "content/public/browser/permission_type.h"
#include "content/public/browser/web_contents.h"
@@ -36,6 +41,8 @@ int g_blacklist_embargo_days = 7;
// permission due to repeated dismissals.
int g_dismissal_embargo_days = 7;
+// TODO(meredithl): Migrate to a new and more fitting type, once metrics have
+// been gathered, and deprecate CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT.
std::unique_ptr<base::DictionaryValue> GetOriginDict(
HostContentSettingsMap* settings,
const GURL& origin_url) {
@@ -102,6 +109,8 @@ int GetActionCount(const GURL& url,
} // namespace
+// PermissionDecisionAutoBlocker -----------------------------------------------
+
// static
const char PermissionDecisionAutoBlocker::kPromptDismissCountKey[] =
"dismiss_count";
@@ -118,12 +127,20 @@ const char PermissionDecisionAutoBlocker::kPermissionBlacklistEmbargoKey[] =
const char PermissionDecisionAutoBlocker::kPermissionDismissalEmbargoKey[] =
"dismissal_embargo_days";
-// static
+PermissionDecisionAutoBlocker::PermissionDecisionAutoBlocker(Profile* profile)
+ : profile_(profile) {}
dominickn 2017/01/20 04:03:47 Initialize safe_browsing_timeout_: move kCheckUrlT
meredithl 2017/01/20 04:21:33 Done.
+
+PermissionDecisionAutoBlocker::~PermissionDecisionAutoBlocker() {}
+
+PermissionDecisionAutoBlocker* PermissionDecisionAutoBlocker::GetForProfile(
+ Profile* profile) {
+ return PermissionDecisionAutoBlockerFactory::GetForProfile(profile);
+}
+
void PermissionDecisionAutoBlocker::RemoveCountsByUrl(
- Profile* profile,
base::Callback<bool(const GURL& url)> filter) {
HostContentSettingsMap* map =
- HostContentSettingsMapFactory::GetForProfile(profile);
+ HostContentSettingsMapFactory::GetForProfile(profile_);
std::unique_ptr<ContentSettingsForOneType> settings(
new ContentSettingsForOneType);
@@ -141,65 +158,42 @@ void PermissionDecisionAutoBlocker::RemoveCountsByUrl(
}
}
-// static
int PermissionDecisionAutoBlocker::GetDismissCount(
const GURL& url,
- content::PermissionType permission,
- Profile* profile) {
- return GetActionCount(url, permission, kPromptDismissCountKey, profile);
+ content::PermissionType permission) {
+ return GetActionCount(url, permission, kPromptDismissCountKey, profile_);
}
-// static
int PermissionDecisionAutoBlocker::GetIgnoreCount(
const GURL& url,
- content::PermissionType permission,
- Profile* profile) {
- return GetActionCount(url, permission, kPromptIgnoreCountKey, profile);
+ content::PermissionType permission) {
+ return GetActionCount(url, permission, kPromptIgnoreCountKey, profile_);
}
-// static
bool PermissionDecisionAutoBlocker::RecordDismissAndEmbargo(
const GURL& url,
content::PermissionType permission,
- Profile* profile,
base::Time current_time) {
int current_dismissal_count = RecordActionInWebsiteSettings(
- url, permission, kPromptDismissCountKey, profile);
+ url, permission, kPromptDismissCountKey, profile_);
+
if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) &&
current_dismissal_count >= g_prompt_dismissals_before_block) {
- HostContentSettingsMap* map =
- HostContentSettingsMapFactory::GetForProfile(profile);
- PlaceUnderEmbargo(permission, url, map, current_time,
- kPermissionDismissalEmbargoKey);
+ PlaceUnderEmbargo(permission, url,
+ HostContentSettingsMapFactory::GetForProfile(profile_),
+ current_time, kPermissionDismissalEmbargoKey);
return true;
}
return false;
}
-// static
int PermissionDecisionAutoBlocker::RecordIgnore(
const GURL& url,
- content::PermissionType permission,
- Profile* profile) {
+ content::PermissionType permission) {
return RecordActionInWebsiteSettings(url, permission, kPromptIgnoreCountKey,
- profile);
-}
-
-// static
-bool PermissionDecisionAutoBlocker::ShouldChangeDismissalToBlock(
- const GURL& url,
- content::PermissionType permission,
- Profile* profile) {
- int current_dismissal_count =
- RecordDismissAndEmbargo(url, permission, profile, base::Time::Now());
-
- if (!base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften))
- return false;
-
- return current_dismissal_count >= g_prompt_dismissals_before_block;
+ profile_);
}
-// static
void PermissionDecisionAutoBlocker::UpdateFromVariations() {
dominickn 2017/01/20 04:03:47 This method can actually stay static - there's no
meredithl 2017/01/20 04:21:33 Done.
int prompt_dismissals = -1;
int blacklist_embargo_days = -1;
@@ -228,30 +222,34 @@ void PermissionDecisionAutoBlocker::UpdateFromVariations() {
}
}
-// static
// TODO(meredithl): Have PermissionDecisionAutoBlocker handle the database
dominickn 2017/01/20 04:03:47 Remove the TODO!
meredithl 2017/01/20 04:21:33 Done. Ahhh, feelsgoodman.
// manager, rather than passing it in.
void PermissionDecisionAutoBlocker::UpdateEmbargoedStatus(
- scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
content::PermissionType permission,
const GURL& request_origin,
content::WebContents* web_contents,
- int timeout,
- Profile* profile,
base::Time current_time,
base::Callback<void(bool)> callback) {
// Check if origin is currently under embargo for the requested permission.
- if (IsUnderEmbargo(permission, profile, request_origin, current_time)) {
+ if (IsUnderEmbargo(permission, request_origin, current_time)) {
callback.Run(true /* permission_blocked */);
return;
}
+ if (!db_manager_) {
+ safe_browsing::SafeBrowsingService* sb_service =
+ g_browser_process->safe_browsing_service();
+ if (sb_service)
+ db_manager_ = sb_service->database_manager();
+ }
+
if (base::FeatureList::IsEnabled(features::kPermissionsBlacklist) &&
- db_manager) {
+ db_manager_) {
PermissionBlacklistClient::CheckSafeBrowsingBlacklist(
- db_manager, permission, request_origin, web_contents, timeout,
+ db_manager_, permission, request_origin, web_contents,
+ safe_browsing_timeout_,
base::Bind(&PermissionDecisionAutoBlocker::CheckSafeBrowsingResult,
- permission, profile, request_origin, current_time,
+ permission, profile_, request_origin, current_time,
callback));
return;
}
@@ -259,14 +257,12 @@ void PermissionDecisionAutoBlocker::UpdateEmbargoedStatus(
callback.Run(false /* permission blocked */);
}
-// static
bool PermissionDecisionAutoBlocker::IsUnderEmbargo(
content::PermissionType permission,
- Profile* profile,
const GURL& request_origin,
base::Time current_time) {
HostContentSettingsMap* map =
- HostContentSettingsMapFactory::GetForProfile(profile);
+ HostContentSettingsMapFactory::GetForProfile(profile_);
std::unique_ptr<base::DictionaryValue> dict =
GetOriginDict(map, request_origin);
base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
@@ -293,24 +289,17 @@ bool PermissionDecisionAutoBlocker::IsUnderEmbargo(
is_under_dismiss_embargo = true;
}
}
- // If either embargoes is still in effect, return true.
+
+ // If either embargo is still in effect, return true.
return is_under_dismiss_embargo || is_under_blacklist_embargo;
}
-void PermissionDecisionAutoBlocker::PlaceUnderEmbargo(
- content::PermissionType permission,
- const GURL& request_origin,
- HostContentSettingsMap* map,
- base::Time current_time,
- const char* key) {
- std::unique_ptr<base::DictionaryValue> dict =
- GetOriginDict(map, request_origin);
- base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
- dict.get(), PermissionUtil::GetPermissionString(permission));
- permission_dict->SetDouble(key, current_time.ToInternalValue());
- map->SetWebsiteSettingDefaultScope(
- request_origin, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT,
- std::string(), std::move(dict));
+void PermissionDecisionAutoBlocker::
+ SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(
+ scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
+ int timeout) {
+ db_manager_ = db_manager;
+ safe_browsing_timeout_ = timeout;
}
// static
@@ -330,3 +319,49 @@ void PermissionDecisionAutoBlocker::CheckSafeBrowsingResult(
}
callback.Run(should_be_embargoed /* permission blocked */);
}
+
+// static
+void PermissionDecisionAutoBlocker::PlaceUnderEmbargo(
+ content::PermissionType permission,
+ const GURL& request_origin,
+ HostContentSettingsMap* map,
+ base::Time current_time,
+ const char* key) {
+ std::unique_ptr<base::DictionaryValue> dict =
+ GetOriginDict(map, request_origin);
+ base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
+ dict.get(), PermissionUtil::GetPermissionString(permission));
+ permission_dict->SetDouble(key, current_time.ToInternalValue());
+ map->SetWebsiteSettingDefaultScope(
+ request_origin, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT,
+ std::string(), std::move(dict));
+}
+
+// PermissionDecisionAutoBlockerFactory ----------------------------------------
+
+// static
+PermissionDecisionAutoBlocker*
+PermissionDecisionAutoBlockerFactory::GetForProfile(Profile* profile) {
+ return static_cast<PermissionDecisionAutoBlocker*>(
+ GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+// static
+PermissionDecisionAutoBlockerFactory*
+PermissionDecisionAutoBlockerFactory::GetInstance() {
+ return base::Singleton<PermissionDecisionAutoBlockerFactory>::get();
+}
+
+PermissionDecisionAutoBlockerFactory::PermissionDecisionAutoBlockerFactory()
+ : BrowserContextKeyedServiceFactory(
+ "PermissionDecisionAutoBlocker",
+ BrowserContextDependencyManager::GetInstance()) {}
+
+PermissionDecisionAutoBlockerFactory::~PermissionDecisionAutoBlockerFactory() {}
+
+KeyedService* PermissionDecisionAutoBlockerFactory::BuildServiceInstanceFor(
+ content::BrowserContext* context) const {
+ Profile* profile = static_cast<Profile*>(context);
+ DCHECK(!profile->IsOffTheRecord());
+ return new PermissionDecisionAutoBlocker(profile);
+}

Powered by Google App Engine
This is Rietveld 408576698