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

Side by Side Diff: chrome/browser/permissions/permission_decision_auto_blocker.cc

Issue 2651163002: Add UMA for autoblocking and embargoing. (Closed)
Patch Set: Review Created 3 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/permissions/permission_decision_auto_blocker.h" 5 #include "chrome/browser/permissions/permission_decision_auto_blocker.h"
6 6
7 #include <string.h>
8
7 #include <memory> 9 #include <memory>
8 10
9 #include "base/feature_list.h" 11 #include "base/feature_list.h"
10 #include "base/logging.h" 12 #include "base/logging.h"
11 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
12 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
13 #include "base/values.h" 15 #include "base/values.h"
14 #include "chrome/browser/browser_process.h" 16 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 17 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
16 #include "chrome/browser/permissions/permission_blacklist_client.h" 18 #include "chrome/browser/permissions/permission_blacklist_client.h"
19 #include "chrome/browser/permissions/permission_uma_util.h"
17 #include "chrome/browser/permissions/permission_util.h" 20 #include "chrome/browser/permissions/permission_util.h"
18 #include "chrome/browser/profiles/incognito_helpers.h" 21 #include "chrome/browser/profiles/incognito_helpers.h"
19 #include "chrome/browser/profiles/profile.h" 22 #include "chrome/browser/profiles/profile.h"
20 #include "chrome/browser/safe_browsing/safe_browsing_service.h" 23 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
21 #include "chrome/common/chrome_features.h" 24 #include "chrome/common/chrome_features.h"
22 #include "components/content_settings/core/browser/host_content_settings_map.h" 25 #include "components/content_settings/core/browser/host_content_settings_map.h"
23 #include "components/keyed_service/content/browser_context_dependency_manager.h" 26 #include "components/keyed_service/content/browser_context_dependency_manager.h"
24 #include "components/safe_browsing_db/database_manager.h" 27 #include "components/safe_browsing_db/database_manager.h"
25 #include "components/variations/variations_associated_data.h" 28 #include "components/variations/variations_associated_data.h"
26 #include "content/public/browser/permission_type.h" 29 #include "content/public/browser/permission_type.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 HostContentSettingsMapFactory::GetForProfile(profile); 109 HostContentSettingsMapFactory::GetForProfile(profile);
107 std::unique_ptr<base::DictionaryValue> dict = GetOriginDict(map, url); 110 std::unique_ptr<base::DictionaryValue> dict = GetOriginDict(map, url);
108 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict( 111 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
109 dict.get(), PermissionUtil::GetPermissionString(permission)); 112 dict.get(), PermissionUtil::GetPermissionString(permission));
110 113
111 int current_count = 0; 114 int current_count = 0;
112 permission_dict->GetInteger(key, &current_count); 115 permission_dict->GetInteger(key, &current_count);
113 return current_count; 116 return current_count;
114 } 117 }
115 118
119 // Returns true if |url| has been embargoed from requesting |permission| for the
120 // reason corresponding to |key|.
121 bool WasPreviouslyEmbargoed(Profile* profile,
122 const GURL& url,
123 content::PermissionType permission,
124 const char* key) {
125 HostContentSettingsMap* map =
126 HostContentSettingsMapFactory::GetForProfile(profile);
127 std::unique_ptr<base::DictionaryValue> dict = GetOriginDict(map, url);
128 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
129 dict.get(), PermissionUtil::GetPermissionString(permission));
130 return permission_dict->HasKey(key);
131 }
132
116 } // namespace 133 } // namespace
117 134
118 // PermissionDecisionAutoBlocker::Factory -------------------------------------- 135 // PermissionDecisionAutoBlocker::Factory --------------------------------------
119 136
120 // static 137 // static
121 PermissionDecisionAutoBlocker* 138 PermissionDecisionAutoBlocker*
122 PermissionDecisionAutoBlocker::Factory::GetForProfile(Profile* profile) { 139 PermissionDecisionAutoBlocker::Factory::GetForProfile(Profile* profile) {
123 return static_cast<PermissionDecisionAutoBlocker*>( 140 return static_cast<PermissionDecisionAutoBlocker*>(
124 GetInstance()->GetServiceForBrowserContext(profile, true)); 141 GetInstance()->GetServiceForBrowserContext(profile, true));
125 } 142 }
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 } 237 }
221 238
222 bool PermissionDecisionAutoBlocker::RecordDismissAndEmbargo( 239 bool PermissionDecisionAutoBlocker::RecordDismissAndEmbargo(
223 const GURL& url, 240 const GURL& url,
224 content::PermissionType permission) { 241 content::PermissionType permission) {
225 int current_dismissal_count = RecordActionInWebsiteSettings( 242 int current_dismissal_count = RecordActionInWebsiteSettings(
226 url, permission, kPromptDismissCountKey, profile_); 243 url, permission, kPromptDismissCountKey, profile_);
227 244
228 if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) && 245 if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) &&
229 current_dismissal_count >= g_prompt_dismissals_before_block) { 246 current_dismissal_count >= g_prompt_dismissals_before_block) {
247 if (WasPreviouslyEmbargoed(profile_, url, permission,
248 kPermissionDismissalEmbargoKey)) {
249 PermissionUmaUtil::RecordRepeatedEmbargo(
250 PermissionEmbargoReason::REPEATED_DISMISSALS);
251 }
252
230 PlaceUnderEmbargo(permission, url, kPermissionDismissalEmbargoKey); 253 PlaceUnderEmbargo(permission, url, kPermissionDismissalEmbargoKey);
231 return true; 254 return true;
232 } 255 }
233 return false; 256 return false;
234 } 257 }
235 258
236 int PermissionDecisionAutoBlocker::RecordIgnore( 259 int PermissionDecisionAutoBlocker::RecordIgnore(
237 const GURL& url, 260 const GURL& url,
238 content::PermissionType permission) { 261 content::PermissionType permission) {
239 return RecordActionInWebsiteSettings(url, permission, kPromptIgnoreCountKey, 262 return RecordActionInWebsiteSettings(url, permission, kPromptIgnoreCountKey,
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 return is_under_dismiss_embargo || is_under_blacklist_embargo; 357 return is_under_dismiss_embargo || is_under_blacklist_embargo;
335 } 358 }
336 359
337 // static 360 // static
338 void PermissionDecisionAutoBlocker::CheckSafeBrowsingResult( 361 void PermissionDecisionAutoBlocker::CheckSafeBrowsingResult(
339 content::PermissionType permission, 362 content::PermissionType permission,
340 const GURL& request_origin, 363 const GURL& request_origin,
341 base::Callback<void(bool)> callback, 364 base::Callback<void(bool)> callback,
342 bool should_be_embargoed) { 365 bool should_be_embargoed) {
343 if (should_be_embargoed) { 366 if (should_be_embargoed) {
344 // Requesting site is blacklisted for this permission, update the content 367 if (WasPreviouslyEmbargoed(profile_, request_origin, permission,
345 // setting to place it under embargo. 368 kPermissionBlacklistEmbargoKey)) {
369 PermissionUmaUtil::RecordRepeatedEmbargo(
370 PermissionEmbargoReason::PERMISSIONS_BLACKLISTING);
371 }
372
346 PlaceUnderEmbargo(permission, request_origin, 373 PlaceUnderEmbargo(permission, request_origin,
347 kPermissionBlacklistEmbargoKey); 374 kPermissionBlacklistEmbargoKey);
348 } 375 }
349 callback.Run(should_be_embargoed /* permission blocked */); 376
377 callback.Run(should_be_embargoed);
350 } 378 }
351 379
352 // static 380 // static
353 void PermissionDecisionAutoBlocker::PlaceUnderEmbargo( 381 void PermissionDecisionAutoBlocker::PlaceUnderEmbargo(
354 content::PermissionType permission, 382 content::PermissionType permission,
355 const GURL& request_origin, 383 const GURL& request_origin,
356 const char* key) { 384 const char* key) {
357 HostContentSettingsMap* map = 385 HostContentSettingsMap* map =
358 HostContentSettingsMapFactory::GetForProfile(profile_); 386 HostContentSettingsMapFactory::GetForProfile(profile_);
359 std::unique_ptr<base::DictionaryValue> dict = 387 std::unique_ptr<base::DictionaryValue> dict =
360 GetOriginDict(map, request_origin); 388 GetOriginDict(map, request_origin);
361 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict( 389 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
362 dict.get(), PermissionUtil::GetPermissionString(permission)); 390 dict.get(), PermissionUtil::GetPermissionString(permission));
363 permission_dict->SetDouble(key, clock_->Now().ToInternalValue()); 391 permission_dict->SetDouble(key, clock_->Now().ToInternalValue());
364 map->SetWebsiteSettingDefaultScope( 392 map->SetWebsiteSettingDefaultScope(
365 request_origin, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT, 393 request_origin, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT,
366 std::string(), std::move(dict)); 394 std::string(), std::move(dict));
395 PermissionEmbargoReason embargo_reason =
396 PermissionEmbargoReason::PERMISSIONS_BLACKLISTING;
397 if (std::strcmp(key, kPermissionDismissalEmbargoKey) == 0)
398 embargo_reason = PermissionEmbargoReason::REPEATED_DISMISSALS;
399 PermissionUmaUtil::RecordPermissionEmbargoReason(embargo_reason);
367 } 400 }
368 401
369 void PermissionDecisionAutoBlocker:: 402 void PermissionDecisionAutoBlocker::
370 SetSafeBrowsingDatabaseManagerAndTimeoutForTesting( 403 SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(
371 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager, 404 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
372 int timeout) { 405 int timeout) {
373 db_manager_ = db_manager; 406 db_manager_ = db_manager;
374 safe_browsing_timeout_ = timeout; 407 safe_browsing_timeout_ = timeout;
375 } 408 }
376 409
377 void PermissionDecisionAutoBlocker::SetClockForTesting( 410 void PermissionDecisionAutoBlocker::SetClockForTesting(
378 std::unique_ptr<base::Clock> clock) { 411 std::unique_ptr<base::Clock> clock) {
379 clock_ = std::move(clock); 412 clock_ = std::move(clock);
380 } 413 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698